From 3a4b48901dbf0ec3d8e98bf97d8adcc5cdb0294e Mon Sep 17 00:00:00 2001 From: Dario Lodeiros Date: Mon, 28 Jun 2021 10:21:01 +0200 Subject: [PATCH] [IMP] reservation state cancel key, improvement views and refactoring --- pms/data/pms_sequence.xml | 15 +++---- pms/demo/pms_folio.xml | 4 +- pms/models/pms_checkin_partner.py | 27 +++---------- pms/models/pms_folio.py | 10 ++--- pms/models/pms_reservation.py | 38 +++++++++--------- pms/models/pms_reservation_line.py | 9 ++--- pms/models/pms_service_line.py | 4 +- pms/static/description/avatar.png | Bin 14873 -> 12502 bytes pms/tests/test_pms_folio_sale_line.py | 4 +- pms/tests/test_pms_reservation.py | 8 ++-- pms/views/pms_checkin_partner_views.xml | 10 ++--- pms/views/pms_folio_views.xml | 4 +- pms/views/pms_reservation_views.xml | 28 +++++-------- .../wizard_split_join_swap_reservation.py | 2 +- 14 files changed, 66 insertions(+), 97 deletions(-) diff --git a/pms/data/pms_sequence.xml b/pms/data/pms_sequence.xml index e0047bc4c..3af5fe1d4 100644 --- a/pms/data/pms_sequence.xml +++ b/pms/data/pms_sequence.xml @@ -4,25 +4,22 @@ PMS Folio pms.folio - F/%(y)s - %(sec)s - 4 + F%(y)s + 5 PMS Reservation pms.reservation - R/%(y)s - %(sec)s - 4 + R%(y)s + 6 PMS Checkin pms.checkin.partner - C/%(y)s - %(sec)s - 4 + %(y)s + 6 diff --git a/pms/demo/pms_folio.xml b/pms/demo/pms_folio.xml index 43231d71c..b8945aeb8 100644 --- a/pms/demo/pms_folio.xml +++ b/pms/demo/pms_folio.xml @@ -68,7 +68,7 @@ 'checkin': (DateTime.today() + timedelta(days=14)), 'checkout': (DateTime.today() + timedelta(days=16)), 'adults': 1, - 'state': 'cancelled', + 'state': 'cancel', })]" /> @@ -388,7 +388,7 @@ 'checkin': (DateTime.today() + timedelta(days=22)), 'checkout': (DateTime.today() + timedelta(days=23)), 'adults': 1, - 'state': 'cancelled', + 'state': 'cancel', })]" /> diff --git a/pms/models/pms_checkin_partner.py b/pms/models/pms_checkin_partner.py index 9f6228501..85b00926c 100644 --- a/pms/models/pms_checkin_partner.py +++ b/pms/models/pms_checkin_partner.py @@ -110,7 +110,7 @@ class PmsCheckinPartner(models.Model): ("precheckin", "Pending arrival"), ("onboard", "On Board"), ("done", "Out"), - ("cancelled", "Cancelled"), + ("cancel", "Cancelled"), ], compute="_compute_state", ) @@ -279,23 +279,6 @@ class PmsCheckinPartner(models.Model): elif not record.nationality_id: record.nationality_id = False - @api.depends("reservation_id", "folio_id", "reservation_id.preferred_room_id") - def _compute_identifier(self): - for record in self: - # TODO: Identifier - checkins = [] - if record.reservation_id.filtered("preferred_room_id"): - checkins = record.reservation_id.checkin_partner_ids - record.identifier = ( - record.reservation_id.preferred_room_id.name - + "-" - + str(len(checkins) - 1) - ) - elif record.folio_id: - record.identifier = record.folio_id.name + "-" + str(len(checkins) - 1) - else: - record.identifier = False - @api.depends("reservation_id", "reservation_id.folio_id") def _compute_folio_id(self): for record in self.filtered("reservation_id"): @@ -306,9 +289,9 @@ class PmsCheckinPartner(models.Model): for record in self: if not record.state: record.state = "draft" - if record.reservation_id.state == "cancelled": - record.state = "cancelled" - elif record.state in ("draft", "cancelled"): + if record.reservation_id.state == "cancel": + record.state = "cancel" + elif record.state in ("draft", "cancel"): if any( not getattr(record, field) for field in record._checkin_mandatory_fields() @@ -509,7 +492,7 @@ class PmsCheckinPartner(models.Model): else vals["pms_property_id"] ) pms_property = self.env["pms.property"].browse(pms_property_id) - vals["identifier"] = pms_property.folio_sequence_id._next_do() + vals["identifier"] = pms_property.checkin_sequence_id._next_do() return super(PmsCheckinPartner, self).create(vals) if len(draft_checkins) > 0: draft_checkins[0].write(vals) diff --git a/pms/models/pms_folio.py b/pms/models/pms_folio.py index 1e0d152c3..ff468283b 100644 --- a/pms/models/pms_folio.py +++ b/pms/models/pms_folio.py @@ -572,14 +572,14 @@ class PmsFolio(models.Model): def _compute_number_of_rooms(self): for folio in self: folio.number_of_rooms = len( - folio.reservation_ids.filtered(lambda a: a.state != "cancelled") + folio.reservation_ids.filtered(lambda a: a.state != "cancel") ) @api.depends("reservation_ids", "reservation_ids.state") def _compute_number_of_cancelled_rooms(self): for folio in self: folio.number_of_cancelled_rooms = len( - folio.reservation_ids.filtered(lambda a: a.state == "cancelled") + folio.reservation_ids.filtered(lambda a: a.state == "cancel") ) @api.depends("service_ids", "service_ids.product_qty") @@ -912,7 +912,7 @@ class PmsFolio(models.Model): total = record.amount_total # REVIEW: Must We ignored services in cancelled folios # pending amount? - if record.state == "cancelled": + if record.state == "cancel": total = total - sum(record.service_ids.mapped("price_total")) # Compute 'payment_state'. if total <= paid_out: @@ -938,7 +938,7 @@ class PmsFolio(models.Model): for record in self: if record.reservation_type == "normal" and record.reservation_ids: filtered_reservs = record.reservation_ids.filtered( - lambda x: x.state != "cancelled" + lambda x: x.state != "cancel" ) mapped_checkin_partner = filtered_reservs.mapped( "checkin_partner_ids.id" @@ -1122,7 +1122,7 @@ class PmsFolio(models.Model): def action_cancel(self): for folio in self: for reservation in folio.reservation_ids.filtered( - lambda res: res.state != "cancelled" + lambda res: res.state != "cancel" ): reservation.action_cancel() self.write( diff --git a/pms/models/pms_reservation.py b/pms/models/pms_reservation.py index f11df9899..760dabf71 100644 --- a/pms/models/pms_reservation.py +++ b/pms/models/pms_reservation.py @@ -236,8 +236,8 @@ class PmsReservation(models.Model): compute="_compute_pending_checkin_data", ) ratio_checkin_data = fields.Integer( - string="Pending Checkin Data", - help="Proportion of guest data pending at checkin", + string="Complete cardex", + help="Proportion of guest data complete at checkin", compute="_compute_ratio_checkin_data", ) ready_for_checkin = fields.Boolean( @@ -265,7 +265,7 @@ class PmsReservation(models.Model): allowed_cancel = fields.Boolean( string="Allowed cancel", help="Technical field, Indicates that reservation can be cancelled," - "that happened when state is 'cancelled', 'done', or 'departure_delayed'", + "that happened when state is 'cancel', 'done', or 'departure_delayed'", compute="_compute_allowed_cancel", search="_search_allowed_cancel", ) @@ -333,7 +333,7 @@ class PmsReservation(models.Model): ("confirm", "Pending arrival"), ("onboard", "On Board"), ("done", "Out"), - ("cancelled", "Cancelled"), + ("cancel", "Cancelled"), ("arrival_delayed", "Arrival Delayed"), ("departure_delayed", "Departure delayed"), ], @@ -609,8 +609,8 @@ class PmsReservation(models.Model): "departure_delayed", ): record.priority = 1 - elif record.state == "cancelled": - record.priority = record.cancelled_priority() + elif record.state == "cancel": + record.priority = record.cancel_priority() elif record.state == "onboard": record.priority = record.onboard_priority() elif record.state in ("draf", "confirm"): @@ -618,7 +618,7 @@ class PmsReservation(models.Model): elif record.state == "done": record.priority = record.reservations_past_priority() - def cancelled_priority(self): + def cancel_priority(self): self.ensure_one() if self.folio_pending_amount > 0: return 2 @@ -731,7 +731,7 @@ class PmsReservation(models.Model): def _compute_allowed_room_ids(self): for reservation in self: if reservation.checkin and reservation.checkout: - if reservation.overbooking or reservation.state in ("cancelled"): + if reservation.overbooking or reservation.state in ("cancel"): reservation.allowed_room_ids = self.env["pms.room"].search( [("active", "=", True)] ) @@ -930,7 +930,9 @@ class PmsReservation(models.Model): @api.depends("pending_checkin_data") def _compute_ratio_checkin_data(self): self.ratio_checkin_data = 0 - for reservation in self.filtered(lambda r: r.adults > 0): + for reservation in self.filtered( + lambda r: r.adults > 0 and r.state != "cancel" + ): reservation.ratio_checkin_data = ( (reservation.adults - reservation.pending_checkin_data) * 100 @@ -966,7 +968,7 @@ class PmsReservation(models.Model): for record in self: record.allowed_cancel = ( True - if (record.state not in ["cancelled", "done", "departure_delayed"]) + if (record.state not in ["cancel", "done", "departure_delayed"]) else False ) @@ -1341,7 +1343,7 @@ class PmsReservation(models.Model): _("Invalid domain right operand %s for left of cancel", value) ) return [ - ("state", "not in", ("cancelled", "done", "departure_delayed")), + ("state", "not in", ("cancel", "done", "departure_delayed")), ] def _search_checkin_partner_pending(self, operator, value): @@ -1573,7 +1575,7 @@ class PmsReservation(models.Model): raise ValidationError(_("Partner contact name is required")) vals.update(default_vals) elif "pms_property_id" in vals and ( - "partner_id" in vals or "agency_id" in vals + "partner_name" in vals or "partner_id" in vals or "agency_id" in vals ): folio_vals = { "pms_property_id": vals["pms_property_id"], @@ -1598,9 +1600,7 @@ class PmsReservation(models.Model): } ) else: - raise ValidationError( - _("The client and Property are mandatory in the reservation") - ) + raise ValidationError(_("The Property are mandatory in the reservation")) if vals.get("name", _("New")) == _("New") or "name" not in vals: pms_property_id = ( self.env.user.get_active_property_ids()[0] @@ -1632,7 +1632,7 @@ class PmsReservation(models.Model): def autocheckout(self): reservations = self.env["pms.reservation"].search( [ - ("state", "not in", ["done", "cancelled"]), + ("state", "not in", ["done", "cancel"]), ("checkout", "<", fields.Date.today()), ] ) @@ -1669,7 +1669,7 @@ class PmsReservation(models.Model): def action_cancel(self): for record in self: - # else state = cancelled + # else state = cancel if not record.allowed_cancel: raise UserError(_("This reservation cannot be cancelled")) else: @@ -1680,8 +1680,8 @@ class PmsReservation(models.Model): ) if self._context.get("no_penalty", False): _logger.info("Modified Reservation - No Penalty") - record.write({"state": "cancelled", "cancelled_reason": cancel_reason}) - # record._compute_cancelled_discount() + record.write({"state": "cancel", "cancelled_reason": cancel_reason}) + # record._compute_cancel_discount() record.folio_id._compute_amount() def action_assign(self): diff --git a/pms/models/pms_reservation_line.py b/pms/models/pms_reservation_line.py index cfdfa06f8..68e1ac346 100644 --- a/pms/models/pms_reservation_line.py +++ b/pms/models/pms_reservation_line.py @@ -367,10 +367,7 @@ class PmsReservationLine(models.Model): @api.depends("reservation_id.state", "reservation_id.overbooking") def _compute_occupies_availability(self): for line in self: - if ( - line.reservation_id.state == "cancelled" - or line.reservation_id.overbooking - ): + if line.reservation_id.state == "cancel" or line.reservation_id.overbooking: line.occupies_availability = False else: line.occupies_availability = True @@ -383,7 +380,7 @@ class PmsReservationLine(models.Model): # TODO: Review cancel logic # reservation = line.reservation_id # pricelist = reservation.pricelist_id - # if reservation.state == "cancelled": + # if reservation.state == "cancel": # if ( # reservation.cancelled_reason # and pricelist @@ -468,7 +465,7 @@ class PmsReservationLine(models.Model): @api.constrains("state") def constrains_service_cancel(self): for record in self: - if record.state == "cancelled": + if record.state == "cancel": room_services = record.reservation_id.service_ids for service in room_services: cancel_lines = service.service_line_ids.filtered( diff --git a/pms/models/pms_service_line.py b/pms/models/pms_service_line.py index d583d4c5f..5ba12f371 100644 --- a/pms/models/pms_service_line.py +++ b/pms/models/pms_service_line.py @@ -176,9 +176,9 @@ class PmsServiceLine(models.Model): # TODO: Review cancel logic # reservation = line.reservation_id.reservation_id # pricelist = reservation.pricelist_id - # if reservation.state == "cancelled": + # if reservation.state == "cancel": # if ( - # reservation.cancelled_reason + # reservation.cancel_reason # and pricelist # and pricelist.cancelation_rule_id # ): diff --git a/pms/static/description/avatar.png b/pms/static/description/avatar.png index 74861de3f0fc8a476ec3d295c7d842e32396cf34..c7a59373baf4ac7bd89586dc37e4226f1af9fd47 100644 GIT binary patch literal 12502 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 FmvYj~@j?}gjS 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 LNkvXXu0mjfq^Y