diff --git a/hotel/__manifest__.py b/hotel/__manifest__.py index ba6a25e45..40d54dee0 100644 --- a/hotel/__manifest__.py +++ b/hotel/__manifest__.py @@ -15,6 +15,7 @@ 'depends': [ 'sale_stock', 'account_payment_return', + 'partner_firstname', ], 'license': "AGPL-3", 'demo': ['data/hotel_demo.xml'], diff --git a/hotel/models/hotel_checkin_partner.py b/hotel/models/hotel_checkin_partner.py index 6b5cbf3ff..5fe511faa 100644 --- a/hotel/models/hotel_checkin_partner.py +++ b/hotel/models/hotel_checkin_partner.py @@ -17,6 +17,14 @@ class HotelCheckinPartner(models.Model): return reservation return False + def _default_folio_id(self): + if 'folio_id' in self.env.context: + folio = self.env['hotel.folio'].browse([ + self.env.context['folio_id'] + ]) + return folio + return False + def _default_enter_date(self): if 'reservation_id' in self.env.context: reservation = self.env['hotel.reservation'].browse([ @@ -45,10 +53,18 @@ class HotelCheckinPartner(models.Model): partner_id = fields.Many2one('res.partner', default=_default_partner_id, required=True) reservation_id = fields.Many2one( - 'hotel.reservation', - default=_default_reservation_id, readonly=True) + 'hotel.reservation', default=_default_reservation_id) + folio_id = fields.Many2one('hotel.reservation', + default=_default_folio_id, readonly=True) enter_date = fields.Date(default=_default_enter_date, required=True) exit_date = fields.Date(default=_default_exit_date, required=True) + state = fields.Selection([('draft', 'Pending Entry'), + ('booking', 'On Board'), + ('done', 'Out'), + ('cancelled', 'Cancelled')], + 'State', readonly=True, + default=lambda *a: 'draft', + track_visibility='onchange') # Validation for Departure date is after arrival date. @api.multi @@ -72,3 +88,13 @@ class HotelCheckinPartner(models.Model): raise ValidationError( _('Departure date, is prior to arrival. Check it now. %s') % date_out) + + @api.multi + def action_on_board(self): + for record in self: + record.state = 'booking' + + @api.multi + def action_done(self): + for record in self: + record.state = 'done' diff --git a/hotel/models/hotel_folio.py b/hotel/models/hotel_folio.py index 5049dd8e4..60fab830d 100644 --- a/hotel/models/hotel_folio.py +++ b/hotel/models/hotel_folio.py @@ -188,6 +188,7 @@ class HotelFolio(models.Model): compute='_amount_all', track_visibility='always') #Checkin Fields----------------------------------------------------- + checkin_partner_ids = fields.One2many('hotel.checkin.partner', 'reservation_id') booking_pending = fields.Integer('Booking pending', compute='_compute_checkin_partner_count') checkin_partner_count = fields.Integer('Checkin counter', @@ -567,7 +568,6 @@ class HotelFolio(models.Model): @api.multi def _compute_checkin_partner_count(self): - _logger.info('_compute_checkin_partner_amount') for record in self: if record.reservation_type == 'normal' and record.room_lines: write_vals = {} diff --git a/hotel/models/hotel_reservation.py b/hotel/models/hotel_reservation.py index 1863c09e7..8eedba68f 100644 --- a/hotel/models/hotel_reservation.py +++ b/hotel/models/hotel_reservation.py @@ -572,6 +572,13 @@ class HotelReservation(models.Model): if self.reservation_type == 'out': self.update({'partner_id': self.env.user.company_id.partner_id.id}) + @api.multi + @api.onchange('checkin_partner_ids') + def onchange_checkin_partner_ids(self): + for record in self: + if len(record.checkin_partner_ids) > record.adults + record.children: + raise models.ValidationError(_('The room already is completed')) + # When we need to overwrite the prices even if they were already established @api.onchange('room_type_id', 'pricelist_id', 'reservation_type') def onchange_overwrite_price_by_day(self): @@ -953,6 +960,13 @@ class HotelReservation(models.Model): CHECKIN/OUT PROCESS ------------------------------------------------ """ + @api.multi + @api.constrains('checkin_partner_ids') + def _max_checkin_partner_ids(self): + for record in self: + if len(record.checkin_partner_ids) > record.adults + record.children: + raise models.ValidationError(_('The room already is completed')) + @api.multi def _compute_checkin_partner_count(self): _logger.info('_compute_checkin_partner_count') @@ -972,6 +986,7 @@ class HotelReservation(models.Model): def action_reservation_checkout(self): for record in self: record.state = 'done' + record.checkin_partner_ids.action_done() @api.multi def action_checks(self): diff --git a/hotel/views/hotel_checkin_partner_views.xml b/hotel/views/hotel_checkin_partner_views.xml index 74dc7384a..b19c5ce48 100644 --- a/hotel/views/hotel_checkin_partner_views.xml +++ b/hotel/views/hotel_checkin_partner_views.xml @@ -1,18 +1,11 @@ - - - Checkin Form hotel.checkin.partner - + @@ -42,17 +35,92 @@ - - Checkin Tree + + hotel.checkin.partner.reservation.view.tree hotel.checkin.partner + 20 - - + + + + + + hotel.checkin.partner.view.tree + hotel.checkin.partner + 10 + + + + + + + + + + + + + + hotel.checkin.partner.search + hotel.checkin.partner + + + + + + + + + + + + + + + + + + + diff --git a/hotel/views/hotel_reservation_views.xml b/hotel/views/hotel_reservation_views.xml index 3cda84a48..43acee8c1 100644 --- a/hotel/views/hotel_reservation_views.xml +++ b/hotel/views/hotel_reservation_views.xml @@ -82,7 +82,6 @@ @@ -90,7 +89,6 @@ Books + + + + + + Pending Payment + + @@ -109,7 +120,6 @@ @@ -120,7 +130,6 @@ @@ -266,7 +274,7 @@ @@ -295,6 +303,15 @@ + + + bottom false - {'no_open': True} Rooms diff --git a/hotel/views/hotel_service_views.xml b/hotel/views/hotel_service_views.xml index 6429d99a1..78e104af8 100644 --- a/hotel/views/hotel_service_views.xml +++ b/hotel/views/hotel_service_views.xml @@ -50,7 +50,7 @@ decoration-success="is_board_service == True"> @@ -63,7 +63,7 @@ @@ -102,6 +102,7 @@ + Hotel Services diff --git a/hotel_calendar/models/inherited_hotel_reservation.py b/hotel_calendar/models/inherited_hotel_reservation.py index 2885d3f58..0bea4cc0b 100644 --- a/hotel_calendar/models/inherited_hotel_reservation.py +++ b/hotel_calendar/models/inherited_hotel_reservation.py @@ -483,25 +483,7 @@ class HotelReservation(models.Model): def write(self, vals): _logger.info("RESERV WRITE") ret = super(HotelReservation, self).write(vals) - - if 'partner_id' in vals or 'checkin' in vals or \ - 'checkout' in vals or 'product_id' in vals or \ - 'adults' in vals or 'children' in vals or \ - 'state' in vals or 'splitted' in vals or \ - 'closure_reason_id' in vals or 'out_service_description' in vals or \ - 'reservation_type' in vals or \ - 'price_total' in vals or \ - 'parent_reservation' in vals or 'overbooking' in vals or \ - 'room_type_id' in vals: - for record in self: - record.send_bus_notification( - 'write', - (record.state == 'cancelled') and 'warn' or 'notify', - (record.state == 'cancelled') - and _("Reservation Cancelled") or _("Reservation Changed") - ) - elif not any(vals) or 'to_read' in vals or 'to_assign' in vals: - self.send_bus_notification('write', 'noshow') + self.send_bus_notification('write', 'noshow') return ret @api.multi diff --git a/hotel_calendar/static/src/js/views/calendar/hotel_calendar_renderer.js b/hotel_calendar/static/src/js/views/calendar/hotel_calendar_renderer.js index b3b70e51d..2c0278af7 100644 --- a/hotel_calendar/static/src/js/views/calendar/hotel_calendar_renderer.js +++ b/hotel_calendar/static/src/js/views/calendar/hotel_calendar_renderer.js @@ -256,9 +256,8 @@ var HotelCalendarView = AbstractRenderer.extend({ model = 'hotel.reservation'; title = _t('Reservations'); } else if (type === 'checkin') { - model = 'hotel.reservation'; + model = 'hotel.checkin.partner'; title = _t('Checkins'); - domain.splice(0, 0, ['checkin', '=', moment().format(HotelConstants.ODOO_DATETIME_MOMENT_FORMAT)]); } else if (type === 'invoice') { model = 'sale.order'; title = _t('Invoices'); diff --git a/hotel_l10n_es/models/__init__.py b/hotel_l10n_es/models/__init__.py index 427c6733c..9b8d5b74c 100644 --- a/hotel_l10n_es/models/__init__.py +++ b/hotel_l10n_es/models/__init__.py @@ -24,3 +24,4 @@ from . import category_type from . import code_ine from . import inherit_res_company from . import inherit_res_partner +from . import inherit_hotel_checkin_partner diff --git a/hotel_l10n_es/models/inherit_hotel_checkin_partner.py b/hotel_l10n_es/models/inherit_hotel_checkin_partner.py new file mode 100644 index 000000000..3ecdc8600 --- /dev/null +++ b/hotel_l10n_es/models/inherit_hotel_checkin_partner.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2017 Alda Hotels +# Jose Luis Algara +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## +from openerp import models, fields, api, _ +from odoo.osv.expression import get_unaccent_wrapper + + +class HotelCheckinPartner(models.Model): + _inherit = 'hotel.checkin.partner' + + document_type = fields.Selection(related='partner_id.document_type') + document_number = fields.Char(related='partner_id.document_number') + document_expedition_date = fields.Date(related='partner_id.document_expedition_date') + + code_ine_id = fields.Many2one(related="partner_id.code_ine_id") + + #TMP_FIX VAT Validation + @api.constrains("vat") + def check_vat(self): + return diff --git a/hotel_l10n_es/models/inherit_res_partner.py b/hotel_l10n_es/models/inherit_res_partner.py index da6679cfc..a8dd5b5ca 100644 --- a/hotel_l10n_es/models/inherit_res_partner.py +++ b/hotel_l10n_es/models/inherit_res_partner.py @@ -68,12 +68,12 @@ class ResPartner(models.Model): query = """SELECT id FROM res_partner - {where} ({poldocument} {operator} {percent}) + {where} ({document_number} {operator} {percent}) ORDER BY {display_name} {operator} {percent} desc, {display_name} """.format(where=where_str, operator=operator, - poldocument=unaccent('poldocument'), + document_number=unaccent('document_number'), display_name=unaccent('display_name'), percent=unaccent('%s'),) @@ -94,7 +94,7 @@ class ResPartner(models.Model): #TODO: Review better VAT & DocumentNumber integration @api.onchange('document_number') - def onchange_poldocument(self): + def onchange_document_number(self): for partner in self: if partner.document_number and partner.document_type == 'D': - partner.vat = 'ES' + partner.poldocument + partner.vat = 'ES' + partner.document_number diff --git a/hotel_l10n_es/views/inherit_hotel_checkin_partner_views.xml b/hotel_l10n_es/views/inherit_hotel_checkin_partner_views.xml index 712b3d350..1293a2c32 100644 --- a/hotel_l10n_es/views/inherit_hotel_checkin_partner_views.xml +++ b/hotel_l10n_es/views/inherit_hotel_checkin_partner_views.xml @@ -8,7 +8,6 @@ + hotel.checkin.partner.view.tree + hotel.checkin.partner + + + + + + + + + + + + + + + + hotel.checkin.partner.view.tree + hotel.checkin.partner + + + + + + + + + + + + +