From 19d855f17a955ba140a16ebef4142ec9db94af64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Lodeiros?= Date: Sat, 23 Oct 2021 19:33:20 +0200 Subject: [PATCH] [IMP]pms: improvements availability compute --- pms/models/pms_property.py | 28 +++++++++++++-- pms/models/pms_reservation.py | 36 ++++++++++++++----- pms/models/pms_reservation_line.py | 6 +++- pms/models/pms_room_type.py | 4 +++ pms/models/pms_room_type_class.py | 5 +++ pms/views/pms_room_type_class_views.xml | 1 + .../wizard_split_join_swap_reservation.py | 6 ++++ 7 files changed, 74 insertions(+), 12 deletions(-) diff --git a/pms/models/pms_property.py b/pms/models/pms_property.py index 27dcfcb56..9f031cec0 100644 --- a/pms/models/pms_property.py +++ b/pms/models/pms_property.py @@ -151,16 +151,20 @@ class PmsProperty(models.Model): @api.depends_context( "checkin", "checkout", + "real_avail", "room_type_id", "ubication_id", "capacity", "amenity_ids", "pricelist_id", + "class_id", + "overnight_rooms", "current_lines", ) def _compute_free_room_ids(self): checkin = self._context["checkin"] checkout = self._context["checkout"] + if isinstance(checkin, str): checkin = datetime.datetime.strptime( checkin, DEFAULT_SERVER_DATE_FORMAT @@ -175,11 +179,14 @@ class PmsProperty(models.Model): pricelist_id = self.env.context.get("pricelist_id", False) room_type_id = self.env.context.get("room_type_id", False) + class_id = self._context.get("class_id", False) + real_avail = self._context.get("real_avail", False) + overnight_rooms = self._context.get("overnight_rooms", False) for pms_property in self: free_rooms = pms_property.get_real_free_rooms( checkin, checkout, current_lines ) - if pricelist_id: + if pricelist_id and not real_avail: # TODO: only closed_departure take account checkout date! domain_rules = [ ("date", ">=", checkin), @@ -208,6 +215,14 @@ class PmsProperty(models.Model): free_rooms = free_rooms.filtered( lambda x: x.room_type_id.id not in room_types_to_remove ) + if class_id: + free_rooms = free_rooms.filtered( + lambda x: x.room_type_id.class_id.id == class_id + ) + if overnight_rooms: + free_rooms = free_rooms.filtered( + lambda x: x.room_type_id.overnight_room + ) if len(free_rooms) > 0: pms_property.free_room_ids = free_rooms.ids else: @@ -261,11 +276,14 @@ class PmsProperty(models.Model): @api.depends_context( "checkin", "checkout", + "real_avail", "room_type_id", "ubication_id", "capacity", "amenity_ids", "pricelist_id", + "class_id", + "overnight_rooms", "current_lines", ) def _compute_availability(self): @@ -283,12 +301,18 @@ class PmsProperty(models.Model): room_type_id = self.env.context.get("room_type_id", False) pricelist_id = self.env.context.get("pricelist_id", False) current_lines = self.env.context.get("current_lines", []) + class_id = self._context.get("class_id", False) + real_avail = self._context.get("real_avail", False) + overnight_rooms = self._context.get("overnight_rooms", False) pms_property = record.with_context( checkin=checkin, checkout=checkout, room_type_id=room_type_id, current_lines=current_lines, pricelist_id=pricelist_id, + class_id=class_id, + real_avail=real_avail, + overnight_rooms=overnight_rooms, ) count_free_rooms = len(pms_property.free_room_ids) if current_lines and not isinstance(current_lines, list): @@ -305,7 +329,7 @@ class PmsProperty(models.Model): pricelist = False if pricelist_id: pricelist = self.env["product.pricelist"].browse(pricelist_id) - if pricelist and pricelist.availability_plan_id: + if pricelist and pricelist.availability_plan_id and not real_avail: domain_rules.append( ("availability_plan_id", "=", pricelist.availability_plan_id.id) ) diff --git a/pms/models/pms_reservation.py b/pms/models/pms_reservation.py index afeefcf4e..40c3d116d 100644 --- a/pms/models/pms_reservation.py +++ b/pms/models/pms_reservation.py @@ -643,7 +643,6 @@ class PmsReservation(models.Model): comodel_name="res.partner", inverse_name="reservation_possible_customer_id", ) - is_mail_send = fields.Boolean(string="Mail Sent", default=False) is_modified_reservation = fields.Boolean( @@ -652,7 +651,10 @@ class PmsReservation(models.Model): readonly=False, store=True, ) - + overnight_room = fields.Boolean( + related="room_type_id.overnight_room", + store=True, + ) lang = fields.Many2one( string="Language", comodel_name="res.lang", compute="_compute_lang" ) @@ -804,6 +806,7 @@ class PmsReservation(models.Model): "reservation_line_ids.room_id", "reservation_line_ids.occupies_availability", "preferred_room_id", + "room_type_id", "pricelist_id", "pms_property_id", ) @@ -812,7 +815,9 @@ class PmsReservation(models.Model): if reservation.checkin and reservation.checkout: if reservation.overbooking or reservation.state in ("cancel"): reservation.allowed_room_ids = self.env["pms.room"].search( - [("active", "=", True)] + [ + ("active", "=", True), + ] ) return pms_property = reservation.pms_property_id @@ -822,9 +827,12 @@ class PmsReservation(models.Model): room_type_id=False, # Allows to choose any available room current_lines=reservation.reservation_line_ids.ids, pricelist_id=reservation.pricelist_id.id, + class_id=reservation.room_type_id.class_id + if reservation.room_type_id + else False, + real_avail=True, ) reservation.allowed_room_ids = pms_property.free_room_ids - else: reservation.allowed_room_ids = False @@ -1045,6 +1053,7 @@ class PmsReservation(models.Model): True if ( record.reservation_type != "out" + and record.overnight_room and record.state in ["draft", "confirm", "arrival_delayed"] and record.checkin <= fields.Date.today() ) @@ -1197,9 +1206,11 @@ class PmsReservation(models.Model): reservation.commission_amount = 0 # REVIEW: Dont run with set room_type_id -> room_id(compute)-> No set adults¿? - @api.depends("preferred_room_id", "reservation_type") + @api.depends("preferred_room_id", "reservation_type", "overnight_room") def _compute_adults(self): for reservation in self: + if not reservation.overnight_room: + reservation.adults = 0 if reservation.preferred_room_id and reservation.reservation_type != "out": if reservation.adults == 0: reservation.adults = reservation.preferred_room_id.capacity @@ -1384,7 +1395,7 @@ class PmsReservation(models.Model): def _compute_checkin_partner_count(self): for record in self: - if record.reservation_type != "out": + if record.reservation_type != "out" and record.overnight_room: record.checkin_partner_count = len(record.checkin_partner_ids) record.checkin_partner_pending_count = record.adults - len( record.checkin_partner_ids @@ -1488,6 +1499,7 @@ class PmsReservation(models.Model): return [ ("state", "in", ("draft", "confirm", "arrival_delayed")), ("checkin", "<=", today), + ("adults", ">", 0), ] def _search_allowed_checkout(self, operator, value): @@ -1505,6 +1517,7 @@ class PmsReservation(models.Model): return [ ("state", "in", ("onboard", "departure_delayed")), ("checkout", ">=", today), + ("adults", ">", 0), ] def _search_allowed_cancel(self, operator, value): @@ -2014,7 +2027,9 @@ class PmsReservation(models.Model): ("checkin", "<", fields.Date.today()), ] ) - arrival_delayed_reservations.state = "arrival_delayed" + for record in arrival_delayed_reservations: + if record.overnight_room: + record.state = "arrival_delayed" @api.model def auto_departure_delayed(self): @@ -2026,8 +2041,11 @@ class PmsReservation(models.Model): ] ) for reservation in reservations: - if reservation.checkout_datetime <= fields.Datetime.now(): - reservations.state = "departure_delayed" + if reservation.overnight_room: + if reservation.checkout_datetime <= fields.Datetime.now(): + reservations.state = "departure_delayed" + else: + reservation.state = "done" def preview_reservation(self): self.ensure_one() diff --git a/pms/models/pms_reservation_line.py b/pms/models/pms_reservation_line.py index f9152badb..4eae1780c 100644 --- a/pms/models/pms_reservation_line.py +++ b/pms/models/pms_reservation_line.py @@ -112,7 +112,10 @@ class PmsReservationLine(models.Model): store=True, compute="_compute_impacts_quota", ) - + overnight_room = fields.Boolean( + related="reservation_id.overnight_room", + store=True, + ) _sql_constraints = [ ( "rule_availability", @@ -184,6 +187,7 @@ class PmsReservationLine(models.Model): else False, current_lines=reservation.reservation_line_ids.ids, pricelist_id=reservation.pricelist_id.id, + real_avail=True, ) rooms_available = pms_property.free_room_ids diff --git a/pms/models/pms_room_type.py b/pms/models/pms_room_type.py index 116b00caa..b97cb1fa1 100644 --- a/pms/models/pms_room_type.py +++ b/pms/models/pms_room_type.py @@ -86,6 +86,10 @@ class PmsRoomType(models.Model): "Use `-1` for managing no quota.", default=-1, ) + overnight_room = fields.Boolean( + related="class_id.overnight", + store=True, + ) def name_get(self): result = [] diff --git a/pms/models/pms_room_type_class.py b/pms/models/pms_room_type_class.py index 179315ec7..6c4a07e65 100644 --- a/pms/models/pms_room_type_class.py +++ b/pms/models/pms_room_type_class.py @@ -57,6 +57,11 @@ class PmsRoomTypeClass(models.Model): help="Room type class identification code", required=True, ) + overnight = fields.Boolean( + string="Use for overnight stays", + help="Set False if if these types of spaces are not used for overnight stays", + default=True, + ) @api.model def get_unique_by_property_code(self, pms_property_id, default_code=None): diff --git a/pms/views/pms_room_type_class_views.xml b/pms/views/pms_room_type_class_views.xml index fc13f2bad..e5bcec16d 100644 --- a/pms/views/pms_room_type_class_views.xml +++ b/pms/views/pms_room_type_class_views.xml @@ -29,6 +29,7 @@ /> + diff --git a/pms/wizards/wizard_split_join_swap_reservation.py b/pms/wizards/wizard_split_join_swap_reservation.py index 77cce5867..d11220db6 100644 --- a/pms/wizards/wizard_split_join_swap_reservation.py +++ b/pms/wizards/wizard_split_join_swap_reservation.py @@ -179,6 +179,7 @@ class ReservationSplitJoinSwapWizard(models.TransientModel): room_type_id=False, # Allows to choose any available room current_lines=record.reservation_id.reservation_line_ids.ids, pricelist_id=record.reservation_id.pricelist_id.id, + real_avail=True, ) rooms_available = pms_property.free_room_ids @@ -224,6 +225,8 @@ class ReservationSplitJoinSwapWizard(models.TransientModel): ).date(), current_lines=reservation.reservation_line_ids.ids, pricelist_id=reservation.pricelist_id.id, + real_avail=True, + class_id=reservation.room_type_id.class_id, ) rooms_available = pms_property.free_room_ids @@ -242,6 +245,7 @@ class ReservationSplitJoinSwapWizard(models.TransientModel): checkout=reservation.checkout, current_lines=reservation.reservation_line_ids.ids, pricelist_id=reservation.pricelist_id.id, + real_avail=True, ) rooms_available = pms_property.free_room_ids @@ -360,6 +364,8 @@ class ReservationLinesToSplit(models.TransientModel): checkout=line.date + datetime.timedelta(days=1), room_type_id=False, # Allows to choose any available room pricelist_id=reservation.pricelist_id.id, + real_avail=True, + class_id=reservation.room_type_id.class_id, ) rooms_available = pms_property.free_room_ids rooms_available += line.room_id