diff --git a/pms/data/cron_jobs.xml b/pms/data/cron_jobs.xml index c780b2373..2cd3c2029 100644 --- a/pms/data/cron_jobs.xml +++ b/pms/data/cron_jobs.xml @@ -46,5 +46,20 @@ /> model.autocheckout() + + Recompute priority on reservations + 1 + + days + -1 + + code + + + model.update_daily_priority_reservation() + diff --git a/pms/demo/pms_folio.xml b/pms/demo/pms_folio.xml index 63d8651bc..43231d71c 100644 --- a/pms/demo/pms_folio.xml +++ b/pms/demo/pms_folio.xml @@ -567,6 +567,7 @@ }), (0, 0, { 'pricelist_id': ref('product.list0'), + 'room_type_id': ref('pms_room_type_2'), 'checkin': (DateTime.today() + timedelta(days=24)), 'checkout': (DateTime.today() + timedelta(days=25)), 'adults': 1, diff --git a/pms/models/pms_checkin_partner.py b/pms/models/pms_checkin_partner.py index e7278cb67..08af80e57 100644 --- a/pms/models/pms_checkin_partner.py +++ b/pms/models/pms_checkin_partner.py @@ -222,8 +222,9 @@ class PmsCheckinPartner(models.Model): ) def _compute_document_expedition_date(self): for record in self: - if record.partner_id and record.partner_id.id_numbers: - if not record.document_expedition_date: + if not record.document_expedition_date: + record.document_expedition_date = False + if record.partner_id and record.partner_id.id_numbers: record.document_expedition_date = record.partner_id.id_numbers[ 0 ].valid_from @@ -591,8 +592,7 @@ class PmsCheckinPartner(models.Model): "arrival": fields.Datetime.now(), } record.update(vals) - if record.reservation_id.allowed_checkin: - record.reservation_id.state = "onboard" + record.reservation_id.state = "onboard" def action_done(self): for record in self.filtered(lambda c: c.state == "onboard"): diff --git a/pms/models/pms_reservation.py b/pms/models/pms_reservation.py index 0ac07d9f1..6ad6ccb8a 100644 --- a/pms/models/pms_reservation.py +++ b/pms/models/pms_reservation.py @@ -15,7 +15,7 @@ class PmsReservation(models.Model): _name = "pms.reservation" _description = "Reservation" _inherit = ["mail.thread", "mail.activity.mixin", "portal.mixin"] - _order = "priority desc, create_date desc, write_date desc" + _order = "priority asc, create_date desc, write_date desc" # TODO: # consider near_to_checkin & pending_notifications to order _check_pms_properties_auto = True @@ -594,22 +594,70 @@ class PmsReservation(models.Model): for record in self: record.date_order = datetime.datetime.today() - # TODO: - # consider near_to_checkin & pending_notifications to order - @api.depends("checkin") + @api.depends( + "checkin", + "checkout", + "state", + "folio_payment_state", + "to_assign", + ) def _compute_priority(self): + # TODO: Notifications priority for record in self: - record.priority = 0 + if record.to_assign or record.state in ( + "arrival_delayed", + "departure_delayed", + ): + record.priority = 1 + elif record.state == "cancelled": + record.priority = record.cancelled_priority() + elif record.state == "onboard": + record.priority = record.onboard_priority() + elif record.state in ("draf", "confirm"): + record.priority = record.reservations_future_priority() + elif record.state == "done": + record.priority = record.reservations_past_priority() - # we can give weights for each condition - if not record.to_assign: - record.priority += 1 - if not record.allowed_checkin: - record.priority += 10 - if record.allowed_checkout: - record.priority += 100 - if record.state == "onboard" and record.folio_pending_amount > 0: - record.priority += 1000 + def cancelled_priority(self): + self.ensure_one() + if self.folio_pending_amount > 0: + return 2 + elif self.checkout >= fields.date.today(): + return 100 + else: + return 1000 * (fields.date.today() - self.checkout).days + + def onboard_priority(self): + self.ensure_one() + days_for_checkout = (self.checkout - fields.date.today()).days + if self.folio_pending_amount > 0: + return days_for_checkout + else: + return 3 * days_for_checkout + + def reservations_future_priority(self): + self.ensure_one() + days_for_checkin = (self.checkin - fields.date.today()).days + if days_for_checkin < 3: + return 2 * days_for_checkin + elif days_for_checkin < 20: + return 3 * days_for_checkin + else: + return 4 * days_for_checkin + + def reservations_past_priority(self): + self.ensure_one() + if self.folio_pending_amount > 0: + return 3 + days_from_checkout = (fields.date.today() - self.checkout).days + if days_from_checkout <= 1: + return 6 + elif days_from_checkout < 15: + return 5 * days_from_checkout + elif days_from_checkout <= 90: + return 10 * days_from_checkout + elif days_from_checkout > 90: + return 100 * days_from_checkout @api.depends("pricelist_id", "room_type_id") def _compute_board_service_room_id(self): @@ -1596,6 +1644,12 @@ class PmsReservation(models.Model): res.message_post(subject=_("No Checkins!"), subtype="mt_comment", body=msg) return True + @api.model + def update_daily_priority_reservation(self): + reservations = self.env["pms.reservation"].search([("priority", "<", 1000)]) + reservations._compute_priority() + return True + def overbooking_button(self): self.ensure_one() self.overbooking = not self.overbooking @@ -1721,7 +1775,7 @@ class PmsReservation(models.Model): reservations = self.env["pms.reservation"].search( [ ("state", "in", ("onboard",)), - ("checkout", "=", fields.Datetime.today()), + ("checkout", "<=", fields.Datetime.today()), ] ) for reservation in reservations: diff --git a/pms/tests/test_pms_reservation.py b/pms/tests/test_pms_reservation.py index a8cfcbf4e..f435acf3b 100644 --- a/pms/tests/test_pms_reservation.py +++ b/pms/tests/test_pms_reservation.py @@ -735,149 +735,833 @@ class TestPmsReservations(common.SavepointCase): } ) - @freeze_time("1981-11-01") - def test_order_priority_to_assign(self): - # ARRANGE - self.create_common_scenario() - r1 = 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, - } - ) - 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, - } - ) - r1.to_assign = False - # ACT - reservations = self.env["pms.reservation"].search( - [("pms_property_id", "=", self.property.id)] - ) - # ASSERT - self.assertEqual(r1, reservations[0]) + @freeze_time("1981-11-10") + def test_to_assign_priority_reservation(self): + """ + To assign reservation must have priority = 1 + ------ + Create a reservation with only room_type (to_assign = True), + regardless of the rest of the fields the priority must be 1 - @freeze_time("1981-11-01") - def test_order_priority_allowed_checkin(self): + NOTE: + WORK FLOW PRIORITY COMPUTE + Check reservation priority + -------- + 1 - TO ASSIGN, ARRIVAL DELAYED, DEPARTURE DELAYED (= 1) + 2 - CANCELLED with pending amount (= 2) + 3 - DONE with pending amount (= 3) + 4 - ONBOARD with pending amount (= days for checkout) + 5 - CONFIRM/DRAFT with arrival in less than 3 days (= 2 * days for checkin) + 6 - ONBOARD all paid (= 3 * days for checkout) + 7 - DONE with days from checkout < 1 (= 6) + 8 - CONFIRM/DRAFT with arrival between 3 and 20 days (= 3 * days for checkin) + 9 - CONFIRM/DRAFT with arrival in more than 20 days (= 4 * days for checkin) + 10 - DONE with days from checkout < 15 (= 5 * days from checkout) + 11 - DONE with days from checkout between 15 and 90 included (= 10 * days from checkout) + 12 - DONE with days from checkout > 90 (= 100 * days from checkout) + """ # ARRANGE + expected_priority = 1 self.create_common_scenario() - r1 = 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, - } - ) - 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, - } - ) - r1.allowed_checkin = False - # ACT - reservations = self.env["pms.reservation"].search( - [("pms_property_id", "=", self.property.id)] - ) - # ASSERT - self.assertEqual(r1, reservations[0]) - @freeze_time("1981-11-01") - def test_order_priority_allowed_checkout(self): - # ARRANGE - self.create_common_scenario() - r1 = 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, - } - ) - 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, - } - ) - r1.allowed_checkout = True # ACT - reservations = self.env["pms.reservation"].search( - [("pms_property_id", "=", self.property.id)] - ) - # ASSERT - self.assertEqual(r1, reservations[0]) - - @freeze_time("1981-11-01") - def test_order_priority_state_onboard_and_pending_amount(self): - # ARRANGE - self.create_common_scenario() - host = self.env["res.partner"].create( + res = self.env["pms.reservation"].create( { - "name": "Miguel", - "mobile": "654667733", - "email": "miguel@example.com", + "checkin": fields.date.today() + datetime.timedelta(days=30), + "checkout": fields.date.today() + datetime.timedelta(days=31), + "room_type_id": self.room_type_double.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + computed_priority = res.priority + + # ASSERT + error_msm = ( + ( + "The priority of a reservation to be assigned \ + should be %d and this is %d" + ) + % (expected_priority, computed_priority) + ) + + self.assertEqual( + computed_priority, + expected_priority, + error_msm, + ) + + @freeze_time("1981-11-10") + def test_arrival_delayed_priority_reservation(self): + """ + Arrival delayed reservation must have priority = 1 + ------ + Create a reservation with checkin date yesterday, and without checkin action, + regardless of the rest of the fields the priority must be 1 + """ + # ARRANGE + expected_priority = 1 + self.create_common_scenario() + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today() + datetime.timedelta(days=-1), + "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, + } + ) + + # ACT + res.auto_arrival_delayed() + computed_priority = res.priority + + # ASSERT + error_msm = ( + ( + "The priority of a arrival delayed reservation \ + should be %d and this is %d" + ) + % (expected_priority, computed_priority) + ) + + self.assertEqual( + computed_priority, + expected_priority, + error_msm, + ) + + @freeze_time("1981-11-10") + def test_departure_delayed_priority_reservation(self): + """ + To departure delayed reservation must have priority = 1 + ------ + Create a reservation and make the work flow to onboard state, + using jump dates, we make the reservation should have left yesterday, + regardless of the rest of the fields the priority must be 1 + """ + # ARRANGE + expected_priority = 1 + self.create_common_scenario() + freezer = freeze_time("1981-10-08") + freezer.start() + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today(), + "checkout": fields.date.today() + datetime.timedelta(days=1), + "preferred_room_id": self.room2.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + host1 = self.env["res.partner"].create( + { + "firstname": "Pepe", + "lastname": "Paz", + "email": "pepe@example.com", "birthdate_date": "1995-12-10", "gender": "male", } ) - self.env["res.partner.id_number"].create( + checkin1 = self.env["pms.checkin.partner"].create( { - "category_id": self.id_category.id, - "name": "30065089H", - "valid_from": datetime.date.today(), - "partner_id": host.id, + "partner_id": host1.id, + "reservation_id": res.id, + "document_type": self.id_category.id, + "document_number": "77156490T", + "document_expedition_date": fields.date.today() + + datetime.timedelta(days=665), } ) - r1 = 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": host.id, - "pms_property_id": self.property.id, - } + checkin1.action_on_board() + freezer.stop() + + # ACT + res.auto_departure_delayed() + computed_priority = res.priority + + # ASSERT + error_msm = ( + ( + "The priority of a departure delayed reservation \ + should be %d and this is %d" + ) + % (expected_priority, computed_priority) ) - r1.flush() - checkin = self.env["pms.checkin.partner"].create( - { - "partner_id": host.id, - "reservation_id": r1.id, - } + + self.assertEqual( + computed_priority, + expected_priority, + error_msm, ) - checkin.action_on_board() - self.env["pms.reservation"].create( + + @freeze_time("1981-11-10") + def test_cancelled_pending_amount_priority_reservation(self): + """ + Cancelled with pending payments reservation must have priority = 2 + ------ + create a reservation and cancel it ensuring that there are + pending payments in it, the priority must be 2 + """ + # ARRANGE + expected_priority = 2 + 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, + "checkin": fields.date.today() + datetime.timedelta(days=55), + "checkout": fields.date.today() + datetime.timedelta(days=56), + "preferred_room_id": self.room2.id, "partner_id": self.env.ref("base.res_partner_12").id, "pms_property_id": self.property.id, } ) + # ACT - reservations = self.env["pms.reservation"].search( - [("pms_property_id", "=", self.property.id)] - ) + res.action_cancel() + computed_priority = res.priority + # ASSERT - self.assertEqual(r1, reservations[0]) + error_msm = ( + ( + "The priority of a cancelled reservation with pending amount \ + should be %d and this is %d" + ) + % (expected_priority, computed_priority) + ) + + self.assertEqual( + computed_priority, + expected_priority, + error_msm, + ) + + @freeze_time("1981-11-10") + def test_done_with_pending_amountpriority_reservation(self): + """ + Done with pending amount reservation must have priority = 3 + ------ + Create a reservation and make the work flow to onboard - done state, + using jump dates, we make the checkout reservation with pending amount, + regardless of the rest of the fields the priority must be 3 + """ + # ARRANGE + self.create_common_scenario() + expected_priority = 3 + freezer = freeze_time("1981-10-08") + freezer.start() + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today(), + "checkout": fields.date.today() + datetime.timedelta(days=1), + "preferred_room_id": self.room2.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + host1 = self.env["res.partner"].create( + { + "firstname": "Pepe", + "lastname": "Paz", + "email": "pepe@example.com", + "birthdate_date": "1995-12-10", + "gender": "male", + } + ) + checkin1 = self.env["pms.checkin.partner"].create( + { + "partner_id": host1.id, + "reservation_id": res.id, + "document_type": self.id_category.id, + "document_number": "77156490T", + "document_expedition_date": fields.date.today() + + datetime.timedelta(days=665), + } + ) + checkin1.action_on_board() + + freezer.stop() + freezer = freeze_time("1981-10-09") + freezer.start() + + res.action_reservation_checkout() + + # ACT + res.auto_departure_delayed() + computed_priority = res.priority + freezer.stop() + + # ASSERT + error_msm = ( + ( + "The priority of a done reservation with pending amount\ + should be %d and this is %d" + ) + % (expected_priority, computed_priority) + ) + + self.assertEqual( + computed_priority, + expected_priority, + error_msm, + ) + + @freeze_time("1981-11-10") + def test_onboard_with_pending_amount_priority_reservation(self): + """ + Onboard with pending amount reservation must have priority = days for checkout + ------ + Create a reservation with 3 nights and make the work flow to onboard, + using jump dates, we set today in 2 nights before checkout, + regardless of the rest of the fields the priority must be 2 + """ + # ARRANGE + self.create_common_scenario() + expected_priority = 3 + freezer = freeze_time("1981-10-08") + freezer.start() + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today(), + "checkout": fields.date.today() + datetime.timedelta(days=3), + "preferred_room_id": self.room2.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + host1 = self.env["res.partner"].create( + { + "firstname": "Pepe", + "lastname": "Paz", + "email": "pepe@example.com", + "birthdate_date": "1995-12-10", + "gender": "male", + } + ) + checkin1 = self.env["pms.checkin.partner"].create( + { + "partner_id": host1.id, + "reservation_id": res.id, + "document_type": self.id_category.id, + "document_number": "77156490T", + "document_expedition_date": fields.date.today() + + datetime.timedelta(days=665), + } + ) + + # ACT + checkin1.action_on_board() + computed_priority = res.priority + freezer.stop() + + # ASSERT + error_msm = ( + ( + "The priority of a onboard with payment amount reservation \ + should be %d and this is %d" + ) + % (expected_priority, computed_priority) + ) + + self.assertEqual( + computed_priority, + expected_priority, + error_msm, + ) + + @freeze_time("1981-11-10") + def test_confirm_arriva_lt_3_days_priority_reservation(self): + """ + Confirm reservation with arrival in less than 3 days, priority = 2 * days for checkout + ------ + Create a reservation with checkin date on 2 days + regardless of the rest of the fields the priority must be 2 * 2 = 4 + """ + # ARRANGE + self.create_common_scenario() + expected_priority = 4 + + # ACT + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today() + datetime.timedelta(days=2), + "checkout": fields.date.today() + datetime.timedelta(days=5), + "preferred_room_id": self.room2.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + computed_priority = res.priority + + # ASSERT + error_msm = ( + ( + "The priority of a confirm with less than 3 days for arrival \ + reservation should be %d and this is %d" + ) + % (expected_priority, computed_priority) + ) + + self.assertEqual( + computed_priority, + expected_priority, + error_msm, + ) + + @freeze_time("1981-11-10") + def test_onboard_all_pay_priority_reservation(self): + """ + Onboard with all pay reservation must have priority = 3 * days for checkout + ------ + Create a reservation with 3 nights and make the work flow to onboard, + using jump dates, we set today in 2 nights before checkout, + regardless of the rest of the fields the priority must be 3 * 3 = 9 + """ + # ARRANGE + self.create_common_scenario() + expected_priority = 9 + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today(), + "checkout": fields.date.today() + datetime.timedelta(days=3), + "preferred_room_id": self.room2.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + host1 = self.env["res.partner"].create( + { + "firstname": "Pepe", + "lastname": "Paz", + "email": "pepe@example.com", + "birthdate_date": "1995-12-10", + "gender": "male", + } + ) + checkin1 = self.env["pms.checkin.partner"].create( + { + "partner_id": host1.id, + "reservation_id": res.id, + "document_type": self.id_category.id, + "document_number": "77156490T", + "document_expedition_date": fields.date.today() + + datetime.timedelta(days=665), + } + ) + + # ACT + checkin1.action_on_board() + # REVIEW: set to 0 the price to avoid make the payment + # (config account company issues in test) + res.reservation_line_ids.write({"price": 0}) + computed_priority = res.priority + + # ASSERT + error_msm = ( + ( + "The priority of onboard all pay reservation \ + should be %d and this is %d" + ) + % (expected_priority, computed_priority) + ) + + self.assertEqual( + computed_priority, + expected_priority, + error_msm, + ) + + @freeze_time("1981-11-10") + def test_done_yesterday_all_paid_amountpriority_reservation(self): + """ + Checkout yesterday without pending amount reservation must have priority = 6 + ------ + Create a reservation and make the work flow to onboard - done state, + using jump dates, we make the checkout reservation without pending amount, + and set today 1 day after, + regardless of the rest of the fields the priority must be 6 + """ + # ARRANGE + self.create_common_scenario() + expected_priority = 6 + freezer = freeze_time("1981-10-08") + freezer.start() + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today(), + "checkout": fields.date.today() + datetime.timedelta(days=1), + "preferred_room_id": self.room2.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + host1 = self.env["res.partner"].create( + { + "firstname": "Pepe", + "lastname": "Paz", + "email": "pepe@example.com", + "birthdate_date": "1995-12-10", + "gender": "male", + } + ) + checkin1 = self.env["pms.checkin.partner"].create( + { + "partner_id": host1.id, + "reservation_id": res.id, + "document_type": self.id_category.id, + "document_number": "77156490T", + "document_expedition_date": fields.date.today() + + datetime.timedelta(days=665), + } + ) + checkin1.action_on_board() + + freezer.stop() + freezer = freeze_time("1981-10-09") + freezer.start() + + res.action_reservation_checkout() + # REVIEW: set to 0 the price to avoid make the payment + # (config account company issues in test) + res.reservation_line_ids.write({"price": 0}) + + # ACT + freezer.stop() + freezer = freeze_time("1981-10-10") + freezer.start() + + res.update_daily_priority_reservation() + computed_priority = res.priority + freezer.stop() + + # ASSERT + error_msm = ( + ( + "The priority of a done reservation without pending amount\ + and checkout yesterday should be %d and this is %d" + ) + % (expected_priority, computed_priority) + ) + + self.assertEqual( + computed_priority, + expected_priority, + error_msm, + ) + + @freeze_time("1981-11-10") + def test_confirm_arriva_bt_3_and_20_days_priority_reservation(self): + """ + Confirm reservation with arrival between 3 and 20 days, priority = 3 * days for checkout + ------ + Create a reservation with checkin date on 15 days + regardless of the rest of the fields the priority must be 3 * 15 = 45 + """ + # ARRANGE + self.create_common_scenario() + expected_priority = 45 + + # ACT + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today() + datetime.timedelta(days=15), + "checkout": fields.date.today() + datetime.timedelta(days=20), + "preferred_room_id": self.room2.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + computed_priority = res.priority + + # ASSERT + error_msm = ( + ( + "The priority of a confirm with between 3 and 20 days for arrival \ + reservation should be %d and this is %d" + ) + % (expected_priority, computed_priority) + ) + + self.assertEqual( + computed_priority, + expected_priority, + error_msm, + ) + + @freeze_time("1981-11-10") + def test_confirm_arrival_more_than_20_days_priority_reservation(self): + """ + Confirm reservation with arrival more than 20 days, priority = 4 * days for checkout + ------ + Create a reservation with checkin date on 21 days + regardless of the rest of the fields the priority must be 4 * 21 = 84 + """ + # ARRANGE + self.create_common_scenario() + expected_priority = 84 + + # ACT + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today() + datetime.timedelta(days=21), + "checkout": fields.date.today() + datetime.timedelta(days=25), + "preferred_room_id": self.room2.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + computed_priority = res.priority + + # ASSERT + error_msm = ( + ( + "The priority of a confirm with more than 20 days for arrival \ + reservation should be %d and this is %d" + ) + % (expected_priority, computed_priority) + ) + + self.assertEqual( + computed_priority, + expected_priority, + error_msm, + ) + + @freeze_time("1981-11-10") + def test_done_checkout_lt_15_days_before_all_paid_priority_reservation(self): + """ + Checkout less than 15 days before without pending amount reservation + must have priority = 5 * days from checkout + ------ + Create a reservation and make the work flow to onboard - done state, + using jump dates, we make the checkout reservation without pending amount, + and set today 6 day after, + regardless of the rest of the fields the priority must be 6 * 5 = 30 + """ + # ARRANGE + self.create_common_scenario() + expected_priority = 30 + freezer = freeze_time("1981-10-09") + freezer.start() + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today(), + "checkout": fields.date.today() + datetime.timedelta(days=1), + "preferred_room_id": self.room2.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + host1 = self.env["res.partner"].create( + { + "firstname": "Pepe", + "lastname": "Paz", + "email": "pepe@example.com", + "birthdate_date": "1995-12-10", + "gender": "male", + } + ) + checkin1 = self.env["pms.checkin.partner"].create( + { + "partner_id": host1.id, + "reservation_id": res.id, + "document_type": self.id_category.id, + "document_number": "77156490T", + "document_expedition_date": fields.date.today() + + datetime.timedelta(days=665), + } + ) + checkin1.action_on_board() + + freezer.stop() + freezer = freeze_time("1981-10-10") + freezer.start() + + res.action_reservation_checkout() + # REVIEW: set to 0 the price to avoid make the payment + # (config account company issues in test) + res.reservation_line_ids.write({"price": 0}) + + # ACT + freezer.stop() + freezer = freeze_time("1981-10-16") + freezer.start() + + res.update_daily_priority_reservation() + computed_priority = res.priority + freezer.stop() + + # ASSERT + error_msm = ( + ( + "The priority of a done reservation without pending amount\ + and checkout less than 15 days before should be %d and this is %d" + ) + % (expected_priority, computed_priority) + ) + + self.assertEqual( + computed_priority, + expected_priority, + error_msm, + ) + + @freeze_time("1981-11-10") + def test_done_checkout_bt_30_and_90_days_before_all_paid_priority_reservation(self): + """ + Checkout between 30 and 90 days before without pending amount reservation + must have priority = 10 * days from checkout + ------ + Create a reservation and make the work flow to onboard - done state, + using jump dates, we make the checkout reservation without pending amount, + and set today 45 day after, + regardless of the rest of the fields the priority must be 10 * 45 = 450 + """ + # ARRANGE + self.create_common_scenario() + expected_priority = 450 + freezer = freeze_time("1981-10-09") + freezer.start() + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today(), + "checkout": fields.date.today() + datetime.timedelta(days=1), + "preferred_room_id": self.room2.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + host1 = self.env["res.partner"].create( + { + "firstname": "Pepe", + "lastname": "Paz", + "email": "pepe@example.com", + "birthdate_date": "1995-12-10", + "gender": "male", + } + ) + checkin1 = self.env["pms.checkin.partner"].create( + { + "partner_id": host1.id, + "reservation_id": res.id, + "document_type": self.id_category.id, + "document_number": "77156490T", + "document_expedition_date": fields.date.today() + + datetime.timedelta(days=665), + } + ) + checkin1.action_on_board() + + freezer.stop() + freezer = freeze_time("1981-10-10") + freezer.start() + + res.action_reservation_checkout() + # REVIEW: set to 0 the price to avoid make the payment + # (config account company issues in test) + res.reservation_line_ids.write({"price": 0}) + + # ACT + freezer.stop() + freezer = freeze_time("1981-11-24") + freezer.start() + + res.update_daily_priority_reservation() + computed_priority = res.priority + freezer.stop() + + # ASSERT + error_msm = ( + ( + "The priority of a done reservation without pending amount\ + and checkout between 30 and 90 days before should be %d and this is %d" + ) + % (expected_priority, computed_priority) + ) + + self.assertEqual( + computed_priority, + expected_priority, + error_msm, + ) + + @freeze_time("1981-11-10") + def test_done_checkout_mt_90_days_before_all_paid_priority_reservation(self): + """ + Checkout more than 90 days before without pending amount reservation + must have priority = 100 * days from checkout + ------ + Create a reservation and make the work flow to onboard - done state, + using jump dates, we make the checkout reservation without pending amount, + and set today 91 day after, + regardless of the rest of the fields the priority must be 100 * 91 = 9100 + """ + # ARRANGE + self.create_common_scenario() + expected_priority = 9100 + freezer = freeze_time("1981-10-09") + freezer.start() + res = self.env["pms.reservation"].create( + { + "checkin": fields.date.today(), + "checkout": fields.date.today() + datetime.timedelta(days=1), + "preferred_room_id": self.room2.id, + "partner_id": self.env.ref("base.res_partner_12").id, + "pms_property_id": self.property.id, + } + ) + host1 = self.env["res.partner"].create( + { + "firstname": "Pepe", + "lastname": "Paz", + "email": "pepe@example.com", + "birthdate_date": "1995-12-10", + "gender": "male", + } + ) + checkin1 = self.env["pms.checkin.partner"].create( + { + "partner_id": host1.id, + "reservation_id": res.id, + "document_type": self.id_category.id, + "document_number": "77156490T", + "document_expedition_date": fields.date.today() + + datetime.timedelta(days=665), + } + ) + checkin1.action_on_board() + + freezer.stop() + freezer = freeze_time("1981-10-10") + freezer.start() + + res.action_reservation_checkout() + # REVIEW: set to 0 the price to avoid make the payment + # (config account company issues in test) + res.reservation_line_ids.write({"price": 0}) + + # ACT + freezer.stop() + freezer = freeze_time("1982-01-09") + freezer.start() + + res.update_daily_priority_reservation() + computed_priority = res.priority + freezer.stop() + + # ASSERT + error_msm = ( + ( + "The priority of a done reservation without pending amount\ + and checkout more than 90 days before should be %d and this is %d" + ) + % (expected_priority, computed_priority) + ) + + self.assertEqual( + computed_priority, + expected_priority, + error_msm, + ) def test_reservation_action_assign(self): """