diff --git a/pms/models/pms_reservation.py b/pms/models/pms_reservation.py index f62d4d13b..827ea949f 100644 --- a/pms/models/pms_reservation.py +++ b/pms/models/pms_reservation.py @@ -87,6 +87,7 @@ class PmsReservation(models.Model): copy=False, store=True, comodel_name="pms.room.type", + ondelete="restrict", compute="_compute_room_type_id", tracking=True, check_pms_properties=True, @@ -313,9 +314,9 @@ class PmsReservation(models.Model): ) to_assign = fields.Boolean( string="To Assign", - help="Technical field", + help="It is True if the room of the reservation has been assigned " + "automatically, False if it was confirmed by a person in charge", default=True, - tracking=True, ) state = fields.Selection( string="State", @@ -615,6 +616,12 @@ class PmsReservation(models.Model): @api.depends("preferred_room_id") def _compute_room_type_id(self): + """ + This method set False to_assign when the user + directly chooses the preferred_room_id, + otherwise, action_assign will be used when the user manually confirms + or changes the preferred_room_id of the reservation + """ for reservation in self: if reservation.preferred_room_id and not reservation.room_type_id: reservation.room_type_id = reservation.preferred_room_id.room_type_id.id diff --git a/pms/models/pms_reservation_line.py b/pms/models/pms_reservation_line.py index 1719581e6..c5f4eaab0 100644 --- a/pms/models/pms_reservation_line.py +++ b/pms/models/pms_reservation_line.py @@ -173,6 +173,19 @@ class PmsReservationLine(models.Model): and not line.room_id ): free_room_select = True if reservation.preferred_room_id else False + + # Check if the room assigment is manual or automatic to set the + # to_assign value on reservation + # REVIEW: SRP Issue?¿ (set reservation to_assign value on + # compute_room_id in reservation_line) + if ( + free_room_select + and reservation.preferred_room_id.id + not in reservation.reservation_line_ids.room_id.ids + ): + # This case is a preferred_room_id manually assigned + reservation.to_assign = False + # we get the rooms available for the entire stay rooms_available = self.env["pms.availability.plan"].rooms_available( checkin=line.reservation_id.checkin, diff --git a/pms/tests/test_pms_reservation.py b/pms/tests/test_pms_reservation.py index c54c509da..0d6f181aa 100644 --- a/pms/tests/test_pms_reservation.py +++ b/pms/tests/test_pms_reservation.py @@ -788,8 +788,92 @@ class TestPmsReservations(common.SavepointCase): # ASSERT self.assertEqual(r1, reservations[0]) - @freeze_time("1981-11-01") def test_reservation_action_assign(self): + """ + Checks the correct operation of the assign method + --------------- + Create a new reservation with only room_type(autoassign -> to_assign = True), + and the we call to action_assign method to confirm the assignation + """ + self.create_common_scenario() + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today(), + "checkout": fields.date.today() + datetime.timedelta(days=1), + "room_type_id": self.room_type_double.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + # ACT + res.action_assign() + # ASSERT + self.assertFalse(res.to_assign, "The reservation should be marked as assigned") + + def test_reservation_auto_assign_on_create(self): + """ + When creating a reservation with a specific room, + it is not necessary to mark it as to be assigned + --------------- + Create a new reservation with specific preferred_room_id, + "to_assign" should be set to false automatically + """ + # ARRANGE + self.create_common_scenario() + + # ACT + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today(), + "checkout": fields.date.today() + datetime.timedelta(days=1), + "preferred_room_id": self.room1.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + + # ASSERT + self.assertFalse( + res.to_assign, "Reservation with preferred_room_id set to to_assign = True" + ) + + def test_reservation_auto_assign_after_create(self): + """ + When assigning a room manually to a reservation marked "to be assigned", + this field should be automatically unchecked + --------------- + Create a new reservation without preferred_room_id (only room_type), + "to_assign" is True, then set preferred_room_id and "to_assign" should + be set to false automatically + """ + # ARRANGE + self.create_common_scenario() + # set the priority of the rooms to control the room chosen by auto assign + self.room1.sequence = 1 + self.room2.sequence = 2 + + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today(), + "checkout": fields.date.today() + datetime.timedelta(days=1), + "room_type_id": self.room_type_double.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + + # ACT + # res shoul be room1 in preferred_room_id (minor sequence) + res.preferred_room_id = self.room2.id + + # ASSERT + self.assertFalse( + res.to_assign, + "The reservation should be marked as assigned automatically \ + when assigning the specific room", + ) + + def test_reservation_to_assign_on_create(self): # TEST CASE # the reservation action assign # change the reservation to 'to_assign' = False diff --git a/pms/views/pms_reservation_views.xml b/pms/views/pms_reservation_views.xml index c9599b969..6a7e18d52 100644 --- a/pms/views/pms_reservation_views.xml +++ b/pms/views/pms_reservation_views.xml @@ -15,6 +15,7 @@ +