From 839b510dc90ab594631c39686052ecafbe3c5ddc Mon Sep 17 00:00:00 2001 From: miguelpadin Date: Wed, 26 Oct 2022 10:24:53 +0200 Subject: [PATCH] [IMP] pms-api-rest: change swap behaviour, now swap force splitteds if required --- pms_api_rest/datamodels/pms_calendar.py | 10 ++-- pms_api_rest/services/pms_calendar_service.py | 52 ++++++++++--------- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/pms_api_rest/datamodels/pms_calendar.py b/pms_api_rest/datamodels/pms_calendar.py index e840d639c..ba4e336d9 100644 --- a/pms_api_rest/datamodels/pms_calendar.py +++ b/pms_api_rest/datamodels/pms_calendar.py @@ -1,6 +1,7 @@ from marshmallow import fields from odoo.addons.datamodel.core import Datamodel +from odoo.addons.datamodel.fields import NestedModel class PmsReservationUpdates(Datamodel): @@ -16,11 +17,10 @@ class PmsReservationUpdates(Datamodel): class PmsCalendarSwapInfo(Datamodel): _name = "pms.calendar.swap.info" - swapFrom = fields.String(required=True, allow_none=False) - swapTo = fields.String(required=True, allow_none=False) - roomIdA = fields.Integer(required=True, allow_none=False) - roomIdB = fields.Integer(required=True, allow_none=False) - pmsPropertyId = fields.Integer(required=False, allow_none=True) + pmsPropertyId = fields.Integer(required=True, allow_none=False) + roomId = fields.Integer(required=True, allow_none=False) + date = fields.String(required=True, allow_none=False) + reservationLineIds = fields.List(fields.Integer(required=True, allow_none=False)) class PmsCalendarSearchParam(Datamodel): diff --git a/pms_api_rest/services/pms_calendar_service.py b/pms_api_rest/services/pms_calendar_service.py index 097d26ae9..ccd1271fc 100644 --- a/pms_api_rest/services/pms_calendar_service.py +++ b/pms_api_rest/services/pms_calendar_service.py @@ -158,35 +158,37 @@ class PmsCalendarService(Component): auth="jwt_api_pms", ) def swap_reservation_slices(self, swap_info): - room_id_a = swap_info.roomIdA - room_id_b = swap_info.roomIdB - - lines_room_a = self.env["pms.reservation.line"].search( + reservation_lines_target = self.env['pms.reservation.line'].search( [ - ("room_id", "=", room_id_a), - ("date", ">=", swap_info.swapFrom), - ("date", "<=", swap_info.swapTo), - ("pms_property_id", "=", swap_info.pmsPropertyId), + ("id", "in", swap_info.reservationLineIds) ] - ) + ).sorted(key=lambda l: l.date) + + for reservation_line in reservation_lines_target: + old_room_id = reservation_line.room_id + affected_line = self.env["pms.reservation.line"].search( + [ + ("date", "=", reservation_line.date), + ("room_id", "=", swap_info.roomId), + ] + ) + reservation_line.occupies_availability = False + affected_line.occupies_availability = False + + reservation_line.flush() + affected_line.flush() + + reservation_line.room_id = swap_info.roomId + affected_line.room_id = old_room_id + + reservation_line.occupies_availability = True + affected_line.occupies_availability = True + + reservation_line._compute_occupies_availability() + affected_line._compute_occupies_availability() + - lines_room_b = self.env["pms.reservation.line"].search( - [ - ("room_id", "=", room_id_b), - ("date", ">=", swap_info.swapFrom), - ("date", "<=", swap_info.swapTo), - ("pms_property_id", "=", swap_info.pmsPropertyId), - ] - ) - lines_room_a.occupies_availability = False - lines_room_b.occupies_availability = False - lines_room_a.flush() - lines_room_b.flush() - lines_room_a.room_id = room_id_b - lines_room_b.room_id = room_id_a - lines_room_a._compute_occupies_availability() - lines_room_b._compute_occupies_availability() @restapi.method( [