From 1f0587baada7f4f064cd6c78d3ea66f3399af1e4 Mon Sep 17 00:00:00 2001 From: Dario Lodeiros Date: Tue, 29 Jan 2019 10:37:29 +0100 Subject: [PATCH] [WIP] Checkin WorkFlow --- hotel/models/hotel_checkin_partner.py | 41 +++++++++++++++++-- hotel/models/hotel_reservation.py | 12 +++++- hotel/views/hotel_checkin_partner_views.xml | 16 ++++++-- hotel/views/hotel_reservation_views.xml | 6 ++- hotel/wizard/checkinwizard.py | 4 +- .../inherit_hotel_checkin_partner_views.xml | 8 ++-- 6 files changed, 70 insertions(+), 17 deletions(-) diff --git a/hotel/models/hotel_checkin_partner.py b/hotel/models/hotel_checkin_partner.py index 5fe511faa..cc27b8dbe 100644 --- a/hotel/models/hotel_checkin_partner.py +++ b/hotel/models/hotel_checkin_partner.py @@ -23,6 +23,11 @@ class HotelCheckinPartner(models.Model): self.env.context['folio_id'] ]) return folio + if 'reservation_id' in self.env.context: + folio = self.env['hotel.reservation'].browse([ + self.env.context['reservation_id'] + ]).folio_id + return folio return False def _default_enter_date(self): @@ -46,16 +51,21 @@ class HotelCheckinPartner(models.Model): reservation = self.env['hotel.reservation'].browse([ self.env.context['reservation_id'] ]) - return reservation.partner_id + if reservation.partner_id.id not in reservation.mapped( + 'checkin_partner_ids.partner_id.id'): + return reservation.partner_id return False partner_id = fields.Many2one('res.partner', default=_default_partner_id, required=True) + email = fields.Char('E-mail', related='partner_id.email') + mobile = fields.Char('Mobile', related='partner_id.mobile') + gender = fields.Selection('Gender', related='partner_id.gender') reservation_id = fields.Many2one( 'hotel.reservation', default=_default_reservation_id) - folio_id = fields.Many2one('hotel.reservation', - default=_default_folio_id, readonly=True) + folio_id = fields.Many2one('hotel.folio', + default=_default_folio_id, readonly=True, required=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'), @@ -65,6 +75,7 @@ class HotelCheckinPartner(models.Model): 'State', readonly=True, default=lambda *a: 'draft', track_visibility='onchange') + # Validation for Departure date is after arrival date. @api.multi @@ -89,6 +100,30 @@ class HotelCheckinPartner(models.Model): _('Departure date, is prior to arrival. Check it now. %s') % date_out) + @api.multi + @api.onchange('partner_id') + def _check_partner_id(self): + for record in self: + checkins = self.env['hotel.checkin.partner'].search([ + ('id','!=', record.id), + ('reservation_id','=', record.reservation_id.id) + ]) + if record.partner_id.id in checkins.mapped('partner_id.id'): + raise models.ValidationError( + _('This guest is already registered in the room')) + + @api.multi + @api.constrains('partner_id') + def _check_partner_id(self): + for record in self: + checkins = self.env['hotel.checkin.partner'].search([ + ('id','!=', record.id), + ('reservation_id','=', record.reservation_id.id) + ]) + if record.partner_id.id in checkins.mapped('partner_id.id'): + raise models.ValidationError( + _('This guest is already registered in the room')) + @api.multi def action_on_board(self): for record in self: diff --git a/hotel/models/hotel_reservation.py b/hotel/models/hotel_reservation.py index 8eedba68f..220f30056 100644 --- a/hotel/models/hotel_reservation.py +++ b/hotel/models/hotel_reservation.py @@ -991,12 +991,20 @@ class HotelReservation(models.Model): @api.multi def action_checks(self): self.ensure_one() - return { + partner = self.partner_id.id + reservation_id = self.id + view_id = self.env.ref('hotel.hotel_checkin_partner_reservation_view_tree').id + return{ 'name': _('Checkins'), 'view_type': 'form', - 'view_mode': 'tree,form', + 'view_mode': 'tree', 'res_model': 'hotel.checkin.partner', 'type': 'ir.actions.act_window', + 'view_id': view_id, + 'context': { + 'reservation_id': reservation_id, + }, + 'flags': {'initial_mode': 'edit'}, 'domain': [('reservation_id', '=', self.id)], 'target': 'new', } diff --git a/hotel/views/hotel_checkin_partner_views.xml b/hotel/views/hotel_checkin_partner_views.xml index b19c5ce48..004788d37 100644 --- a/hotel/views/hotel_checkin_partner_views.xml +++ b/hotel/views/hotel_checkin_partner_views.xml @@ -40,7 +40,7 @@ hotel.checkin.partner 20 - @@ -51,10 +51,14 @@ help="Get in" /> + + + - - + + + @@ -75,10 +79,14 @@ help="Get in" /> + + + - + + diff --git a/hotel/views/hotel_reservation_views.xml b/hotel/views/hotel_reservation_views.xml index 43acee8c1..9721c8c98 100644 --- a/hotel/views/hotel_reservation_views.xml +++ b/hotel/views/hotel_reservation_views.xml @@ -304,6 +304,10 @@ + + + - diff --git a/hotel/wizard/checkinwizard.py b/hotel/wizard/checkinwizard.py index 2ce8cce0b..8bb5b669e 100644 --- a/hotel/wizard/checkinwizard.py +++ b/hotel/wizard/checkinwizard.py @@ -115,8 +115,8 @@ class Wizard(models.TransientModel): mobile_checkin_partner = fields.Char('Mobile') - segmentation_id = fields.Many2many( - related='reservation_id.folio_id.segmentation_ids') + segmentation_ids = fields.Many2many( + related='reservation_id.segmentation_ids') ''' TODO: clean-up - list of checkins on smart button clean is not used anymore 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 1293a2c32..0130d1a14 100644 --- a/hotel_l10n_es/views/inherit_hotel_checkin_partner_views.xml +++ b/hotel_l10n_es/views/inherit_hotel_checkin_partner_views.xml @@ -32,8 +32,8 @@ - - + + @@ -54,8 +54,8 @@ - - + +