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 @@
+
+