From 7cecf6e3d816c3a96047f89984aece0197ba73d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Lodeiros?= Date: Mon, 9 Nov 2020 14:43:14 +0100 Subject: [PATCH] [WIP] Checkin status indicators --- pms/models/pms_checkin_partner.py | 16 ++++++ pms/models/pms_reservation.py | 79 ++++++++++++++++++++++++++- pms/tests/test_pms_checkin_partner.py | 33 +++++++++++ pms/views/pms_reservation_views.xml | 39 ++++++++----- 4 files changed, 151 insertions(+), 16 deletions(-) diff --git a/pms/models/pms_checkin_partner.py b/pms/models/pms_checkin_partner.py index 63c008757..e404cdcac 100644 --- a/pms/models/pms_checkin_partner.py +++ b/pms/models/pms_checkin_partner.py @@ -31,10 +31,12 @@ class PmsCheckinPartner(models.Model): pms_property_id = fields.Many2one( "pms.property", default=_get_default_pms_property, required=True ) + name = fields.Char("E-mail", related="partner_id.name") email = fields.Char("E-mail", related="partner_id.email") mobile = fields.Char("Mobile", related="partner_id.mobile") arrival = fields.Datetime("Enter") departure = fields.Datetime("Exit") + completed_data = fields.Boolean(compute="_compute_completed_data", store=True) state = fields.Selection( selection=[ ("draft", "Pending arrival"), @@ -54,6 +56,20 @@ class PmsCheckinPartner(models.Model): for record in self: record.folio_id = record.reservation_id.folio_id + @api.depends(lambda self: self._checkin_mandatory_fields(), "state") + def _compute_completed_data(self): + self.completed_data = False + for record in self: + if any( + not getattr(self, field) for field in record._checkin_mandatory_fields() + ): + record.completed_data = False + break + record.completed_data = True + + def _checkin_mandatory_fields(self): + return ["name"] + # Constraints and onchanges @api.constrains("departure", "arrival") diff --git a/pms/models/pms_reservation.py b/pms/models/pms_reservation.py index 3ee218c74..a580c369f 100644 --- a/pms/models/pms_reservation.py +++ b/pms/models/pms_reservation.py @@ -5,7 +5,7 @@ import logging from datetime import timedelta from odoo import _, api, fields, models -from odoo.exceptions import ValidationError +from odoo.exceptions import UserError, ValidationError from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, float_compare, float_is_zero _logger = logging.getLogger(__name__) @@ -188,7 +188,7 @@ class PmsReservation(models.Model): # TODO: Warning Mens to update pricelist checkin_partner_ids = fields.One2many("pms.checkin.partner", "reservation_id") count_pending_arrival = fields.Integer( - "Reservation Description", + "Pending Arrival", compute="_compute_count_pending_arrival", store=True, ) @@ -196,6 +196,21 @@ class PmsReservation(models.Model): string="Pending Arrival Ratio", compute="_compute_checkins_ratio", ) + pending_checkin_data = fields.Integer( + "Pending Checkin Data", + compute="_compute_pending_checkin_data", + store=True, + ) + arrival_today = fields.Boolean( + compute="_compute_arrival_today", search="_search_arrival_today" + ) + departure_today = fields.Boolean( + compute="_compute_departure_today", search="_search_departure_today" + ) + ratio_checkin_data = fields.Integer( + string="Pending Checkin Data Ratio", + compute="_compute_ratio_checkin_data", + ) segmentation_ids = fields.Many2many( "res.partner.category", string="Segmentation", @@ -562,6 +577,66 @@ class PmsReservation(models.Model): / reservation.adults ) + @api.depends("checkin_partner_ids", "checkin_partner_ids.completed_data") + def _compute_pending_checkin_data(self): + for reservation in self: + reservation.pending_checkin_data = reservation.adults - len( + reservation.checkin_partner_ids.filtered( + lambda c: c.state != "cancelled" and c.completed_data + ) + ) + + @api.depends("pending_checkin_data") + def _compute_ratio_checkin_data(self): + self.ratio_checkin_data = 0 + for reservation in self.filtered(lambda r: r.adults > 0): + reservation.ratio_checkin_data = ( + (reservation.adults - reservation.pending_checkin_data) + * 100 + / reservation.adults + ) + + def _compute_arrival_today(self): + for record in self: + record.arrival_today = ( + True if record.checkin == fields.Date.today() else False + ) + # REVIEW: Late checkin?? (next day) + + def _search_arrival_today(self, operator, value): + if operator not in ("=", "!="): + raise UserError(_("Invalid domain operator %s", operator)) + + if value not in (False, True): + raise UserError(_("Invalid domain right operand %s", value)) + + searching_for_true = (operator == "=" and value) or ( + operator == "!=" and not value + ) + today = fields.Date.context_today(self) + + return [("checkin", searching_for_true, today)] + + def _compute_departure_today(self): + for record in self: + record.departure_today = ( + True if record.checkout == fields.Date.today() else False + ) + + def _search_departure_today(self, operator, value): + if operator not in ("=", "!="): + raise UserError(_("Invalid domain operator %s", operator)) + + if value not in (False, True): + raise UserError(_("Invalid domain right operand %s", value)) + + searching_for_true = (operator == "=" and value) or ( + operator == "!=" and not value + ) + today = fields.Date.context_today(self) + + return [("checkout", searching_for_true, today)] + # REVIEW: Dont run with set room_type_id -> room_id(compute)-> No set adults¿? @api.depends("preferred_room_id") def _compute_adults(self): diff --git a/pms/tests/test_pms_checkin_partner.py b/pms/tests/test_pms_checkin_partner.py index 89e63430b..e8346fdd5 100644 --- a/pms/tests/test_pms_checkin_partner.py +++ b/pms/tests/test_pms_checkin_partner.py @@ -267,3 +267,36 @@ class TestPmsCheckinPartner(TestHotel): int(2 * 100 / 3), "Fail the checkins ratio on reservation", ) + + def test_complete_checkin_data(self): + + # ARRANGE + self.arrange_folio_reservations() + + # ACT + self.checkin1 = self.env["pms.checkin.partner"].create( + { + "partner_id": self.host1.id, + "reservation_id": self.reservation_1.id, + } + ) + self.checkin2 = self.env["pms.checkin.partner"].create( + { + "partner_id": self.host2.id, + "reservation_id": self.reservation_1.id, + } + ) + pending_checkin_data = self.reservation_1.pending_checkin_data + ratio_checkin_data = self.reservation_1.ratio_checkin_data + + # ASSERT + self.assertEqual( + pending_checkin_data, + 1, + "Fail the count pending checkin data on reservation", + ) + self.assertEqual( + ratio_checkin_data, + int(2 * 100 / 3), + "Fail the checkins data ratio on reservation", + ) diff --git a/pms/views/pms_reservation_views.xml b/pms/views/pms_reservation_views.xml index 79a94840a..18a8cb251 100644 --- a/pms/views/pms_reservation_views.xml +++ b/pms/views/pms_reservation_views.xml @@ -14,6 +14,7 @@
+ - +