From 4e7e893e79af400a4ca64e7989873beb091e3987 Mon Sep 17 00:00:00 2001 From: Dario Lodeiros Date: Fri, 25 Jan 2019 11:55:00 +0100 Subject: [PATCH 1/2] [WIP] Checkin Workflow --- hotel/__manifest__.py | 1 + hotel/models/hotel_checkin_partner.py | 30 +++++- hotel/models/hotel_folio.py | 2 +- hotel/models/hotel_reservation.py | 15 +++ hotel/views/hotel_checkin_partner_views.xml | 92 ++++++++++++++++--- hotel/views/hotel_reservation_views.xml | 20 ++-- hotel/views/hotel_service_views.xml | 5 +- .../views/calendar/hotel_calendar_renderer.js | 3 +- hotel_l10n_es/models/__init__.py | 1 + .../models/inherit_hotel_checkin_partner.py | 38 ++++++++ hotel_l10n_es/models/inherit_res_partner.py | 8 +- .../inherit_hotel_checkin_partner_views.xml | 45 ++++++++- 12 files changed, 227 insertions(+), 33 deletions(-) create mode 100644 hotel_l10n_es/models/inherit_hotel_checkin_partner.py 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..3e24f4f53 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['reservation_id'] + ]) + return folio + raise ValidationError(_('You only can create checkin from reservations or folios')) + 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 - - + + +