From ceb2f4ef9deabd4dadce5114bafadaafa62982a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Lodeiros?= Date: Sat, 23 Apr 2022 08:59:26 +0200 Subject: [PATCH 1/8] [IMP]pms: refact compute folio sale lines --- pms/models/folio_sale_line.py | 4 +- pms/models/pms_folio.py | 369 +++++++++++++++++++++------------- pms/views/pms_folio_views.xml | 9 +- 3 files changed, 232 insertions(+), 150 deletions(-) diff --git a/pms/models/folio_sale_line.py b/pms/models/folio_sale_line.py index 1965b0c63..28947f216 100644 --- a/pms/models/folio_sale_line.py +++ b/pms/models/folio_sale_line.py @@ -14,7 +14,9 @@ from odoo.tools.misc import get_lang class FolioSaleLine(models.Model): _name = "folio.sale.line" _description = "Folio Sale Line" - _order = "folio_id, sequence, reservation_order desc, service_order, date_order" + _order = ( + "folio_id, sequence, reservation_order desc, service_order, name, date_order" + ) _check_company_auto = True folio_id = fields.Many2one( diff --git a/pms/models/pms_folio.py b/pms/models/pms_folio.py index dafffc482..2f1a9f90e 100644 --- a/pms/models/pms_folio.py +++ b/pms/models/pms_folio.py @@ -809,20 +809,61 @@ class PmsFolio(models.Model): ) def _compute_sale_line_ids(self): for folio in self: + sale_lines_vals = [] if folio.reservation_type == "normal": + sale_lines_vals_to_drop = [] for reservation in folio.reservation_ids: # RESERVATION LINES - # res = self.env['pms.reservation'].browse(reservation.id) - self.generate_reservation_lines_sale_lines(folio, reservation) - + reservation_sale_lines = [] + reservation_sale_lines_to_drop = [] + if reservation.reservation_line_ids: + ( + reservation_sale_lines, + reservation_sale_lines_to_drop, + ) = self._get_reservation_sale_lines( + folio, reservation, sequence=reservation.folio_sequence + ) + if reservation_sale_lines: + sale_lines_vals.extend(reservation_sale_lines) + if reservation_sale_lines_to_drop: + sale_lines_vals_to_drop.extend(reservation_sale_lines_to_drop) # RESERVATION SERVICES - self.generate_reservation_services_sale_lines(folio, reservation) - + service_sale_lines = [] + service_sale_lines_to_drop = [] + if reservation.service_ids: + ( + service_sale_lines, + service_sale_lines_to_drop, + ) = self._get_service_sale_lines( + folio, + reservation, + sequence=reservation.folio_sequence + + len(reservation_sale_lines), + ) + if service_sale_lines: + sale_lines_vals.extend(service_sale_lines) + if service_sale_lines_to_drop: + sale_lines_vals_to_drop.extend(service_sale_lines_to_drop) # FOLIO SERVICES - self.generate_folio_services_sale_lines(folio) - else: - for reservation in folio.reservation_ids: - reservation.sale_line_ids = False + if folio.service_ids.filtered(lambda r: not r.reservation_id): + service_sale_lines = False + service_sale_lines_to_drop = False + ( + service_sale_lines, + service_sale_lines_to_drop, + ) = self._get_folio_services_sale_lines( + folio, sequence=len(sale_lines_vals) + ) + if service_sale_lines: + sale_lines_vals.extend(service_sale_lines) + if service_sale_lines_to_drop: + sale_lines_vals_to_drop.extend(service_sale_lines_to_drop) + if sale_lines_vals: + folio.sale_line_ids = sale_lines_vals + if sale_lines_vals_to_drop: + self.env["folio.sale.line"].browse(sale_lines_vals_to_drop).unlink() + if not sale_lines_vals: + folio.sale_line_ids = False @api.depends("pms_property_id") def _compute_company_id(self): @@ -2135,9 +2176,10 @@ class PmsFolio(models.Model): } @api.model - def generate_reservation_lines_sale_lines(self, folio, reservation): + def _get_reservation_sale_lines(self, folio, reservation, sequence): + sale_reservation_vals = [] if not reservation.sale_line_ids.filtered(lambda x: x.name == reservation.name): - reservation.sale_line_ids = [ + sale_reservation_vals.append( ( 0, 0, @@ -2150,9 +2192,23 @@ class PmsFolio(models.Model): "price_unit": 0, "tax_ids": False, "folio_id": folio.id, + "reservation_id": reservation.id, + "sequence": sequence, }, ) - ] + ) + else: + sale_reservation_vals.append( + ( + 1, + reservation.sale_line_ids.filtered( + lambda x: x.name == reservation.name + ).id, + { + "sequence": sequence, + }, + ) + ) expected_reservation_lines = self.env["pms.reservation.line"].read_group( [ ("reservation_id", "=", reservation.id), @@ -2169,15 +2225,22 @@ class PmsFolio(models.Model): ) for index, item in enumerate(expected_reservation_lines): + sequence += 1 lines_to = self.env["pms.reservation.line"].search(item["__domain"]) final_discount = self.concat_discounts( item["discount"], item["cancel_discount"] ) if current_sale_line_ids and index <= (len(current_sale_line_ids) - 1): - current_sale_line_ids[index].price_unit = item["price"] - current_sale_line_ids[index].discount = final_discount - current_sale_line_ids[index].reservation_line_ids = lines_to.ids + current = { + "price_unit": item["price"], + "discount": final_discount, + "reservation_line_ids": [(6, 0, lines_to.ids)], + "sequence": sequence, + } + sale_reservation_vals.append( + (1, current_sale_line_ids[index].id, current) + ) else: new = { "reservation_id": reservation.id, @@ -2187,16 +2250,162 @@ class PmsFolio(models.Model): "product_id": reservation.room_type_id.product_id.id, "tax_ids": [(6, 0, reservation.tax_ids.ids)], "reservation_line_ids": [(6, 0, lines_to.ids)], + "sequence": sequence, } - reservation.sale_line_ids = [(0, 0, new)] + sale_reservation_vals.append((0, 0, new)) + folio_sale_lines_to_remove = [] if len(expected_reservation_lines) < len(current_sale_line_ids): folio_sale_lines_to_remove = [ value.id for index, value in enumerate(current_sale_line_ids) if index > (len(expected_reservation_lines) - 1) ] - for fsl in folio_sale_lines_to_remove: - self.env["folio.sale.line"].browse(fsl).unlink() + return sale_reservation_vals, folio_sale_lines_to_remove + + @api.model + def _get_service_sale_lines(self, folio, reservation, sequence): + sale_service_vals = [] + folio_sale_lines_to_remove = [] + for service in reservation.service_ids: + expected_reservation_services = self.env["pms.service.line"].read_group( + [ + ("reservation_id", "=", reservation.id), + ("service_id", "=", service.id), + ("cancel_discount", "<", 100), + ], + ["price_unit", "discount", "cancel_discount"], + ["price_unit", "discount", "cancel_discount"], + lazy=False, + ) + current_sale_service_ids = reservation.sale_line_ids.filtered( + lambda x: x.reservation_id.id == reservation.id + and not x.display_type + and x.service_id.id == service.id + ) + + for index, item in enumerate(expected_reservation_services): + lines_to = self.env["pms.service.line"].search(item["__domain"]) + final_discount = self.concat_discounts( + item["discount"], item["cancel_discount"] + ) + + if current_sale_service_ids and index <= ( + len(current_sale_service_ids) - 1 + ): + current = { + "price_unit": item["price_unit"], + "discount": final_discount, + "service_line_ids": [(6, 0, lines_to.ids)], + "sequence": sequence, + } + sale_service_vals.append( + (1, current_sale_service_ids[index].id, current) + ) + else: + new = { + "service_id": service.id, + "price_unit": item["price_unit"], + "discount": final_discount, + "folio_id": folio.id, + "reservation_id": reservation.id, + "service_line_ids": [(6, 0, lines_to.ids)], + "product_id": service.product_id.id, + "tax_ids": [(6, 0, service.tax_ids.ids)], + "sequence": sequence, + } + sale_service_vals.append((0, 0, new)) + sequence = sequence + 1 + if len(expected_reservation_services) < len(current_sale_service_ids): + folio_sale_lines_to_remove = [ + value.id + for index, value in enumerate(current_sale_service_ids) + if index > (len(expected_reservation_services) - 1) + ] + return sale_service_vals, folio_sale_lines_to_remove + + @api.model + def _get_folio_services_sale_lines(self, folio, sequence): + folio_services = folio.service_ids.filtered(lambda x: not x.reservation_id) + sale_folio_lines = [] + sale_folio_lines_to_remove = [] + if folio_services: + if not folio.sale_line_ids.filtered(lambda x: x.name == _("Others")): + folio.sale_line_ids = [ + ( + 0, + False, + { + "display_type": "line_section", + "product_id": False, + "product_uom_qty": 0, + "discount": 0, + "price_unit": 0, + "tax_ids": False, + "name": _("Others"), + "sequence": sequence, + }, + ) + ] + for folio_service in folio_services: + sequence += 1 + expected_folio_services = self.env["pms.service.line"].read_group( + [ + ("service_id.folio_id", "=", folio.id), + ("service_id", "=", folio_service.id), + ("reservation_id", "=", False), + ("cancel_discount", "<", 100), + ], + ["price_unit", "discount", "cancel_discount"], + ["price_unit", "discount", "cancel_discount"], + lazy=False, + ) + current_folio_service_ids = folio.sale_line_ids.filtered( + lambda x: x.service_id.folio_id.id == folio.id + and not x.display_type + and not x.reservation_id + and x.service_id.id == folio_service.id + ) + + for index, item in enumerate(expected_folio_services): + lines_to = self.env["pms.service.line"].search(item["__domain"]) + final_discount = self.concat_discounts( + item["discount"], item["cancel_discount"] + ) + if current_folio_service_ids and index <= ( + len(current_folio_service_ids) - 1 + ): + current = { + "price_unit": item["price_unit"], + "discount": final_discount, + "reservation_line_ids": [(6, 0, lines_to.ids)], + "sequence": sequence, + } + sale_folio_lines.append( + (1, current_folio_service_ids[index].id, current) + ) + else: + new = { + "service_id": folio_service.id, + "price_unit": item["price_unit"], + "discount": final_discount, + "folio_id": folio.id, + "service_line_ids": [(6, 0, lines_to.ids)], + "product_id": folio_service.product_id.id, + "tax_ids": [(6, 0, folio_service.tax_ids.ids)], + "sequence": sequence, + } + sale_folio_lines.append((0, 0, new)) + if len(expected_folio_services) < len(current_folio_service_ids): + sale_folio_lines_to_remove = [ + value.id + for index, value in enumerate(current_folio_service_ids) + if index > (len(expected_folio_services) - 1) + ] + else: + sale_folio_lines_to_remove = folio.sale_line_ids.filtered( + lambda x: x.name == _("Others") + ) + return sale_folio_lines, sale_folio_lines_to_remove @api.model def _prepare_down_payment_section_line(self, **optional_values): @@ -2234,130 +2443,6 @@ class PmsFolio(models.Model): ) return UserError(msg) - @api.model - def generate_reservation_services_sale_lines(self, folio, reservation): - for service in reservation.service_ids: - expected_reservation_services = self.env["pms.service.line"].read_group( - [ - ("reservation_id", "=", reservation.id), - ("service_id", "=", service.id), - ("cancel_discount", "<", 100), - ], - ["price_unit", "discount", "cancel_discount"], - ["price_unit", "discount", "cancel_discount"], - lazy=False, - ) - current_sale_service_ids = reservation.sale_line_ids.filtered( - lambda x: x.reservation_id.id == reservation.id - and not x.display_type - and x.service_id.id == service.id - ) - - for index, item in enumerate(expected_reservation_services): - lines_to = self.env["pms.service.line"].search(item["__domain"]) - final_discount = self.concat_discounts( - item["discount"], item["cancel_discount"] - ) - - if current_sale_service_ids and index <= ( - len(current_sale_service_ids) - 1 - ): - current_sale_service_ids[index].price_unit = item["price_unit"] - current_sale_service_ids[index].discount = final_discount - current_sale_service_ids[index].service_line_ids = lines_to.ids - else: - new = { - "service_id": service.id, - "price_unit": item["price_unit"], - "discount": final_discount, - "folio_id": folio.id, - "service_line_ids": [(6, 0, lines_to.ids)], - "product_id": service.product_id.id, - "tax_ids": [(6, 0, service.tax_ids.ids)], - } - reservation.sale_line_ids = [(0, 0, new)] - if len(expected_reservation_services) < len(current_sale_service_ids): - folio_sale_lines_to_remove = [ - value.id - for index, value in enumerate(current_sale_service_ids) - if index > (len(expected_reservation_services) - 1) - ] - for fsl in folio_sale_lines_to_remove: - self.env["folio.sale.line"].browse(fsl).unlink() - - @api.model - def generate_folio_services_sale_lines(self, folio): - folio_services = folio.service_ids.filtered(lambda x: not x.reservation_id) - if folio_services: - if not folio.sale_line_ids.filtered(lambda x: x.name == _("Others")): - folio.sale_line_ids = [ - ( - 0, - False, - { - "display_type": "line_section", - "product_id": False, - "product_uom_qty": 0, - "discount": 0, - "price_unit": 0, - "tax_ids": False, - "name": _("Others"), - }, - ) - ] - for folio_service in folio_services: - expected_folio_services = self.env["pms.service.line"].read_group( - [ - ("service_id.folio_id", "=", folio.id), - ("service_id", "=", folio_service.id), - ("reservation_id", "=", False), - ("cancel_discount", "<", 100), - ], - ["price_unit", "discount", "cancel_discount"], - ["price_unit", "discount", "cancel_discount"], - lazy=False, - ) - current_folio_service_ids = folio.sale_line_ids.filtered( - lambda x: x.service_id.folio_id.id == folio.id - and not x.display_type - and not x.reservation_id - and x.service_id.id == folio_service.id - ) - - for index, item in enumerate(expected_folio_services): - lines_to = self.env["pms.service.line"].search(item["__domain"]) - final_discount = self.concat_discounts( - item["discount"], item["cancel_discount"] - ) - if current_folio_service_ids and index <= ( - len(current_folio_service_ids) - 1 - ): - current_folio_service_ids[index].price_unit = item["price_unit"] - current_folio_service_ids[index].discount = final_discount - current_folio_service_ids[index].service_line_ids = lines_to.ids - else: - new = { - "service_id": folio_service.id, - "price_unit": item["price_unit"], - "discount": final_discount, - "folio_id": folio.id, - "service_line_ids": [(6, 0, lines_to.ids)], - "product_id": folio_service.product_id.id, - "tax_ids": [(6, 0, folio_service.tax_ids.ids)], - } - folio.sale_line_ids = [(0, 0, new)] - if len(expected_folio_services) < len(current_folio_service_ids): - folio_sale_lines_to_remove = [ - value.id - for index, value in enumerate(current_folio_service_ids) - if index > (len(expected_folio_services) - 1) - ] - for fsl in folio_sale_lines_to_remove: - self.env["folio.sale.line"].browse(fsl).unlink() - else: - to_unlink = folio.sale_line_ids.filtered(lambda x: x.name == _("Others")) - to_unlink.unlink() - @api.model def concat_discounts(self, discount, cancel_discount): discount_factor = 1.0 diff --git a/pms/views/pms_folio_views.xml b/pms/views/pms_folio_views.xml index 4c271e244..41254ca2e 100644 --- a/pms/views/pms_folio_views.xml +++ b/pms/views/pms_folio_views.xml @@ -488,14 +488,9 @@ - + From 6bb3b7d38706c76132083d5526a894458314e475 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Lodeiros?= Date: Sat, 23 Apr 2022 10:15:16 +0200 Subject: [PATCH 2/8] [IMP]pms: test day_qty service line force flush compute --- pms/tests/test_product_template.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pms/tests/test_product_template.py b/pms/tests/test_product_template.py index b0f49aaf8..730d77e5f 100644 --- a/pms/tests/test_product_template.py +++ b/pms/tests/test_product_template.py @@ -164,6 +164,7 @@ class TestProductTemplate(TestPms): "board_service_room_id": board_service_room_type.id, } ) + reservation.flush() # ASSERT self.assertEqual( reservation.service_ids.service_line_ids.day_qty, @@ -212,6 +213,7 @@ class TestProductTemplate(TestPms): "board_service_room_id": board_service_room_type.id, } ) + reservation.flush() # ASSERT # self.assertTrue(reservation, "The reservation should have been created.") # ASSERT From 9beaac3a49ebd6e52dc2903bc471ed851543e1ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Lodeiros?= Date: Sat, 23 Apr 2022 10:54:09 +0200 Subject: [PATCH 3/8] [FIX]pms: compute folio sale line without reservation link fixed --- pms/models/pms_folio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pms/models/pms_folio.py b/pms/models/pms_folio.py index 2f1a9f90e..d6c1ea315 100644 --- a/pms/models/pms_folio.py +++ b/pms/models/pms_folio.py @@ -2377,7 +2377,7 @@ class PmsFolio(models.Model): current = { "price_unit": item["price_unit"], "discount": final_discount, - "reservation_line_ids": [(6, 0, lines_to.ids)], + "service_line_ids": [(6, 0, lines_to.ids)], "sequence": sequence, } sale_folio_lines.append( From ba8268c72748932eed2ac4c73c2781427d156e4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Lodeiros?= Date: Sat, 23 Apr 2022 11:18:26 +0200 Subject: [PATCH 4/8] [FIX]pms: force reservation flush in checkin partner create to make sure adults compute --- pms/models/pms_checkin_partner.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pms/models/pms_checkin_partner.py b/pms/models/pms_checkin_partner.py index 199488372..f6626bf68 100644 --- a/pms/models/pms_checkin_partner.py +++ b/pms/models/pms_checkin_partner.py @@ -688,6 +688,10 @@ class PmsCheckinPartner(models.Model): raise ValidationError( _("Is mandatory indicate the reservation on the checkin") ) + # If a checkin is manually created, we need make sure that + # the reservation adults are computed + if not reservation.checkin_partner_ids: + reservation.flush() draft_checkins = reservation.checkin_partner_ids.filtered( lambda c: c.state == "draft" ) From 1f7fec328885f72e8966e1c899a4bf7441dc95e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Lodeiros?= Date: Sat, 23 Apr 2022 13:02:13 +0200 Subject: [PATCH 5/8] [IMP]pms: improvement var name pricelist in test --- pms/tests/test_pms_availability_plan_rules.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pms/tests/test_pms_availability_plan_rules.py b/pms/tests/test_pms_availability_plan_rules.py index f3668bf70..d04cda41d 100644 --- a/pms/tests/test_pms_availability_plan_rules.py +++ b/pms/tests/test_pms_availability_plan_rules.py @@ -615,7 +615,7 @@ class TestPmsRoomTypeAvailabilityRules(TestPms): """ # ARRANGE test_quota = 2 - test_pricelist2 = self.env["product.pricelist"].create( + test_pricelist3 = self.env["product.pricelist"].create( { "name": "test pricelist 2", } @@ -647,7 +647,7 @@ class TestPmsRoomTypeAvailabilityRules(TestPms): ) # ACT - reservation.pricelist_id = test_pricelist2.id + reservation.pricelist_id = test_pricelist3.id reservation.flush() self.assertEqual( test_quota, From 3bae65b30784a0b8b30b27ddf57cded5d91ca8ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Lodeiros?= Date: Sat, 23 Apr 2022 13:03:05 +0200 Subject: [PATCH 6/8] [FIX]pms: impacts quota fix --- pms/models/pms_availability_plan.py | 4 ++-- pms/models/pms_reservation_line.py | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/pms/models/pms_availability_plan.py b/pms/models/pms_availability_plan.py index 20b3718a4..f51314127 100644 --- a/pms/models/pms_availability_plan.py +++ b/pms/models/pms_availability_plan.py @@ -87,7 +87,7 @@ class PmsAvailabilityPlan(models.Model): if pricelist_id and room_type_id and date: rule = self.env["pms.availability.plan.rule"].search( [ - ("availability_plan_id.pms_pricelist_ids", "=", pricelist_id), + ("availability_plan_id.pms_pricelist_ids", "in", pricelist_id), ("room_type_id", "=", room_type_id), ("date", "=", date), ("pms_property_id", "=", pms_property_id), @@ -126,7 +126,7 @@ class PmsAvailabilityPlan(models.Model): [("id", "=", impacts_quota_id)] ) # and restore quota in old rule item - if old_rule: + if old_rule and (not rule or rule.id != old_rule.id): old_rule.quota += 1 return False diff --git a/pms/models/pms_reservation_line.py b/pms/models/pms_reservation_line.py index 3c0238690..febbc741a 100644 --- a/pms/models/pms_reservation_line.py +++ b/pms/models/pms_reservation_line.py @@ -338,16 +338,13 @@ class PmsReservationLine(models.Model): def _compute_impacts_quota(self): for line in self: reservation = line.reservation_id - if isinstance(line.id, int): - impacts_quota = False - else: - impacts_quota = line.impacts_quota + impacts_quota_id = line.impacts_quota line.impacts_quota = self.env["pms.availability.plan"].update_quota( pricelist_id=reservation.pricelist_id.id, room_type_id=reservation.room_type_id.id, date=line.date, pms_property_id=reservation.pms_property_id.id, - impacts_quota_id=impacts_quota, + impacts_quota_id=impacts_quota_id, ) @api.depends( From 9163f3a61849d05c0fec5c90224ea979d3c391f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Lodeiros?= Date: Sat, 23 Apr 2022 13:34:18 +0200 Subject: [PATCH 7/8] [FIX]pms: demo data: avoid avail restrictions on folio demo data --- pms/demo/pms_master_data.xml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/pms/demo/pms_master_data.xml b/pms/demo/pms_master_data.xml index 253cd6c6e..23938da65 100644 --- a/pms/demo/pms_master_data.xml +++ b/pms/demo/pms_master_data.xml @@ -3751,13 +3751,14 @@ - + Public Pricelist Discount 10% + - + 3_global pricelist @@ -3765,9 +3766,6 @@ 10.00 - - - From e5fc07f50c9d0d2369caae3b320706161bb936a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Lodeiros?= Date: Sat, 23 Apr 2022 15:15:55 +0200 Subject: [PATCH 8/8] [FIX]pms: change check_adults constrain by manual check in create/write methods --- pms/models/pms_reservation.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/pms/models/pms_reservation.py b/pms/models/pms_reservation.py index 13d92c2ba..893f738f1 100644 --- a/pms/models/pms_reservation.py +++ b/pms/models/pms_reservation.py @@ -1624,6 +1624,13 @@ class PmsReservation(models.Model): ) ) + def _check_capacity(self): + for record in self: + if record.reservation_type != "out": + self.env["pms.room"]._check_adults( + record, record.service_ids.service_line_ids + ) + @api.constrains("reservation_line_ids") def checkin_checkout_consecutive_dates(self): """ @@ -1711,14 +1718,6 @@ class PmsReservation(models.Model): if record.agency_id and not record.agency_id.is_agency: raise ValidationError(_("booking agency with wrong configuration: ")) - @api.constrains("check_adults") - def _check_capacity(self): - for record in self: - if record.reservation_type != "out": - self.env["pms.room"]._check_adults( - record, record.service_ids.service_line_ids - ) - @api.constrains("closure_reason_id") def _check_closure_reason_id(self): for record in self: @@ -1917,8 +1916,8 @@ class PmsReservation(models.Model): vals["reservation_type"] = ( folio.reservation_type if folio.reservation_type else "normal" ) - record = super(PmsReservation, self).create(vals) + record._check_capacity() if record.preconfirm and record.state == "draft": record.confirm() @@ -1929,6 +1928,10 @@ class PmsReservation(models.Model): def write(self, vals): asset = super(PmsReservation, self).write(vals) self._check_services(vals) + # Only check if adult to avoid to check capacity in intermediate states (p.e. flush) + # that not take access to possible extra beds service in vals + if "adults" in vals: + self._check_capacity() return asset def _check_services(self, vals):