From b67c9a617e9cf8da5d9024736200ae748d8f3618 Mon Sep 17 00:00:00 2001 From: braisab Date: Tue, 17 Jun 2025 11:06:52 +0200 Subject: [PATCH] [IMP]pms: includes board services in cancelation penalty --- pms/models/pms_reservation.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/pms/models/pms_reservation.py b/pms/models/pms_reservation.py index 5cd20fc40a..369338a810 100644 --- a/pms/models/pms_reservation.py +++ b/pms/models/pms_reservation.py @@ -2311,6 +2311,26 @@ def action_assign(self): for record in self: record.to_assign = False + def _get_board_services_penalty_amount(self, record, dates, penalty_percent): + # Check if there are board services to add to the penalty + # Only services with 'consumed_on' set to 'before' or + # 'after' are considered. + # Services consumed only on the first or last day are excluded. + amount_board_service = 0 + board_services = record.service_ids.filtered("is_board_service") + for board_service in board_services: + consumed_on = board_service.product_id.consumed_on + for service_line in board_service.service_line_ids: + service_date = fields.Date.from_string(service_line.date) + if (consumed_on == "before" and service_date in dates) or ( + consumed_on == "after" + and service_date in [d + datetime.timedelta(days=1) for d in dates] + ): + amount_board_service += ( + service_line.price_unit * service_line.day_qty + ) + return amount_board_service * penalty_percent / 100 + def _check_cancel_penalty(self): for record in self: # self.ensure_one() @@ -2368,6 +2388,10 @@ def _check_cancel_penalty(self): * penalty_percent / 100 ) + if record.service_ids: + amount_penalty += self._get_board_services_penalty_amount( + record, dates, penalty_percent + ) if not amount_penalty: return if not record.company_id.cancel_penalty_product_id: