From 39ad8399200a35ae330842263b2cef6ea6bc57fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Lodeiros?= Date: Fri, 16 Oct 2020 13:38:11 +0200 Subject: [PATCH] [WIP] Sequence by property --- pms/__manifest__.py | 3 +- pms/data/pms_data.xml | 1 + pms/models/__init__.py | 1 + pms/models/ir_sequence.py | 9 ++++ pms/models/mail_compose_message.py | 13 +++--- pms/models/pms_folio.py | 27 +++++++----- pms/models/pms_property.py | 4 ++ pms/models/pms_reservation.py | 65 ++++++++++++++++------------- pms/models/pms_room.py | 12 +++++- pms/views/ir_sequence_views.xml | 29 +++++++++++++ pms/views/pms_folio_views.xml | 10 +++-- pms/views/pms_property_views.xml | 3 ++ pms/views/pms_reservation_views.xml | 28 ++++--------- 13 files changed, 135 insertions(+), 70 deletions(-) create mode 100644 pms/models/ir_sequence.py create mode 100644 pms/views/ir_sequence_views.xml diff --git a/pms/__manifest__.py b/pms/__manifest__.py index 3f74c7747..e54b053c7 100644 --- a/pms/__manifest__.py +++ b/pms/__manifest__.py @@ -28,8 +28,8 @@ "security/pms_security.xml", "security/ir.model.access.csv", "data/cron_jobs.xml", - "data/pms_data.xml", "data/pms_sequence.xml", + "data/pms_data.xml", "report/pms_folio.xml", "report/pms_folio_templates.xml", #"templates/pms_email_template.xml", @@ -61,6 +61,7 @@ "views/product_pricelist_views.xml", "views/product_template_views.xml", "views/webclient_templates.xml", + "views/ir_sequence_views.xml" ], "demo": ["demo/pms_master_data.xml", "demo/pms_reservation.xml"], "qweb": ["static/src/xml/pms_base_templates.xml",], diff --git a/pms/data/pms_data.xml b/pms/data/pms_data.xml index 438ae6ecb..687a7ec32 100644 --- a/pms/data/pms_data.xml +++ b/pms/data/pms_data.xml @@ -24,6 +24,7 @@ +34 123 456 879 commitsun@hootel.com https://www.commitsun.com + diff --git a/pms/models/__init__.py b/pms/models/__init__.py index fb8ec645e..28ee389de 100644 --- a/pms/models/__init__.py +++ b/pms/models/__init__.py @@ -3,6 +3,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from . import ir_http +from . import ir_sequence #from . import payment_return from . import pms_board_service_room_type from . import pms_property diff --git a/pms/models/ir_sequence.py b/pms/models/ir_sequence.py new file mode 100644 index 000000000..2749f4974 --- /dev/null +++ b/pms/models/ir_sequence.py @@ -0,0 +1,9 @@ +# Copyright 2017 Dario Lodeiros +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class IrSequence(models.Model): + _inherit = "ir.sequence" + + pms_property_id = fields.Many2one("pms.property", string="Property") diff --git a/pms/models/mail_compose_message.py b/pms/models/mail_compose_message.py index a617d61ca..c38b23ae5 100644 --- a/pms/models/mail_compose_message.py +++ b/pms/models/mail_compose_message.py @@ -14,10 +14,11 @@ class MailComposeMessage(models.TransientModel): and self._context.get("mark_so_as_sent") ): folio = self.env["pms.folio"].browse([self._context["default_res_id"]]) - if folio: - cmds = [ - (1, lid, {"to_send": False}) for lid in folio.reservation_ids.ids - ] - if any(cmds): - folio.reservation_ids = cmds + #TODO: WorkFlow Mails + # if folio: + # cmds = [ + # (1, lid, {"to_send": False}) for lid in folio.reservation_ids.ids + # ] + # if any(cmds): + # folio.reservation_ids = cmds return super(MailComposeMessage, self).send_mail(auto_commit=auto_commit) diff --git a/pms/models/pms_folio.py b/pms/models/pms_folio.py index 85da442aa..645ce705b 100644 --- a/pms/models/pms_folio.py +++ b/pms/models/pms_folio.py @@ -147,8 +147,9 @@ class PmsFolio(models.Model): ) channel_type = fields.Selection( [("direct", "Direct"), ("agency", "Agency"),], - "Sales Channel", - default="direct", + string="Sales Channel", + compute="_compute_channel_type", + store=True, ) date_order = fields.Datetime( string="Order Date", @@ -286,6 +287,14 @@ class PmsFolio(models.Model): addr = folio.partner_id.address_get(["invoice"]) folio.partner_invoice_id = addr["invoice"] + @api.depends("agency_id") + def _compute_channel_type(self): + for folio in self: + if folio.agency_id: + folio.channel_type = 'agency' + else: + folio.channel_type = 'direct' + @api.depends("partner_id") def _compute_payment_term_id(self): self.payment_term_id = False @@ -527,15 +536,13 @@ class PmsFolio(models.Model): # ORM Overrides @api.model def create(self, vals): + #TODO: Make sequence from property, not company if vals.get("name", _("New")) == _("New") or "name" not in vals: - if "company_id" in vals: - vals["name"] = self.env["ir.sequence"].with_context( - force_company=vals["company_id"] - ).next_by_code("pms.folio") or _("New") - else: - vals["name"] = self.env["ir.sequence"].next_by_code("pms.folio") or _( - "New" - ) + #TODO: change for property env variable + pms_property_id = self.env.user.pms_property_id.id if "pms_property_id" not in vals else vals["pms_property_id"] + vals["name"] = self.env["ir.sequence"].search([ + ('pms_property_id', '=', pms_property_id) + ]).next_by_code("pms.folio") or _("New") result = super(PmsFolio, self).create(vals) return result diff --git a/pms/models/pms_property.py b/pms/models/pms_property.py index 5a1994aea..07d28a870 100644 --- a/pms/models/pms_property.py +++ b/pms/models/pms_property.py @@ -12,6 +12,7 @@ class PmsProperty(models.Model): _name = "pms.property" _description = "Property" _inherits = {"res.partner": "partner_id"} + _check_company_auto = True # Fields declaration partner_id = fields.Many2one( @@ -51,6 +52,9 @@ class PmsProperty(models.Model): ) default_cancel_policy_days = fields.Integer("Cancellation Days") default_cancel_policy_percent = fields.Float("Percent to pay") + folio_sequence_id = fields.Many2one( + 'ir.sequence', 'Folio Sequence', + check_company=True, copy=False) # Constraints and onchanges @api.constrains("default_arrival_hour", "default_departure_hour") diff --git a/pms/models/pms_reservation.py b/pms/models/pms_reservation.py index f147d41c8..a85114b54 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 = "last_updated_res desc, name" + _order = "priority desc, name" _check_company_auto = True # Default Methods ang Gets @@ -43,6 +43,7 @@ class PmsReservation(models.Model): def _get_default_arrival_hour(self): folio = False + #TODO: Change by property env variable (like company) default_arrival_hour = self.env.user.pms_property_id.default_arrival_hour if "folio_id" in self._context: folio = self.env["pms.folio"].search( @@ -55,6 +56,7 @@ class PmsReservation(models.Model): def _get_default_departure_hour(self): folio = False + #TODO: Change by property env variable (like company) default_departure_hour = self.env.user.pms_property_id.default_departure_hour if "folio_id" in self._context: folio = self.env["pms.folio"].search( @@ -65,6 +67,11 @@ class PmsReservation(models.Model): else: return default_departure_hour + @api.model + def _get_default_pms_property(self): + #TODO: Change by property env variable (like company) + return self.env.user.pms_property_id + def _get_default_segmentation(self): folio = False segmentation_ids = False @@ -92,7 +99,11 @@ class PmsReservation(models.Model): # Fields declaration name = fields.Text( - "Reservation Description", compute="_compute_name", store=True, readonly=False, + "Reservation Description", + compute="_compute_name", + store=True, + readonly=False, + #required=True, ) priority = fields.Integer(compute="_compute_priority", store="True", index=True) room_id = fields.Many2one( @@ -103,13 +114,14 @@ class PmsReservation(models.Model): compute="_compute_room_id", store=True, readonly=False, + #required=True, domain="[('id', 'in', allowed_room_ids)]", ) allowed_room_ids = fields.Many2many( "pms.room", string="Allowed Rooms", compute="_compute_allowed_room_ids", ) folio_id = fields.Many2one( - "pms.folio", string="Folio", track_visibility="onchange", ondelete="cascade", + "pms.folio", string="Folio", track_visibility="onchange", ondelete="restrict", ) board_service_room_id = fields.Many2one( "pms.board.service.room.type", string="Board Service", @@ -118,6 +130,7 @@ class PmsReservation(models.Model): "pms.room.type", string="Room Type", track_visibility="onchange", + required=True, compute="_compute_room_type_id", store=True, readonly=False, @@ -144,7 +157,7 @@ class PmsReservation(models.Model): related="folio_id.company_id", string="Company", store=True, readonly=True ) pms_property_id = fields.Many2one( - "pms.property", store=True, readonly=True, related="folio_id.pms_property_id" + "pms.property", default=_get_default_pms_property, #required=True ) reservation_line_ids = fields.One2many( "pms.reservation.line", @@ -284,10 +297,6 @@ class PmsReservation(models.Model): detail_origin = fields.Char( "Detail Origin", compute="_compute_detail_origin", store=True ) - # TODO: Review functionality of last_update_res - last_updated_res = fields.Datetime( - "Last Updated", compute="_compute_last_updated_res", store=True, readonly=False, - ) folio_pending_amount = fields.Monetary(related="folio_id.pending_amount") shared_folio = fields.Boolean(compute="_computed_shared") # Used to notify is the reservation folio has other reservations/services @@ -371,6 +380,7 @@ class PmsReservation(models.Model): # Compute and Search methods @api.depends("checkin", "checkout", "room_type_id") def _compute_name(self): + _logger.info("CALCULO NOMBRE-------------------") for reservation in self: if ( reservation.room_type_id @@ -388,6 +398,8 @@ class PmsReservation(models.Model): ) else: reservation.name = "/" + _logger.info("RESERVA") + _logger.info(reservation.name) @api.depends("checkin") def _compute_priority(self): @@ -430,7 +442,7 @@ class PmsReservation(models.Model): def _compute_partner_id(self): for reservation in self: if reservation.reservation_type == "out": - reservation.partner_id = self.env.user.pms_property_id.partner_id.id + reservation.partner_id = reservation.pms_property_id.partner_id.id if reservation.folio_id: reservation.partner_id = reservation.folio_id.partner_id else: @@ -513,18 +525,6 @@ class PmsReservation(models.Model): elif reservation.adults == False: reservation.adults = 0 - @api.depends("checkin", "checkout", "state") - def _compute_to_send(self): - for reservation in self: - reservation.to_send = True - - @api.depends( - "checkin", "checkout", "discount", "state", "room_type_id", "to_assign" - ) - def _compute_last_updated_res(self): - for reservation in self: - reservation.last_updated_res = fields.Datetime.now() - @api.depends("reservation_line_ids", "reservation_line_ids.room_id") def _compute_splitted(self): for reservation in self: @@ -687,6 +687,20 @@ class PmsReservation(models.Model): if len(record.checkin_partner_ids) > record.adults + record.children: raise models.ValidationError(_("The room already is completed")) + @api.constrains("reservation_type", "partner_id") + def _check_partner_reservation(self): + for reservation in self: + if reservation.reservation_type == "out" and \ + reservation.partner_id != reservation.pms_property_id.partner_id.id: + raise models.ValidationError(_("The partner on out reservations must be a property partner")) + + @api.constrains("closure_reason_id", "reservation_type") + def _check_partner_reservation(self): + for reservation in self: + if reservation.closure_reason_id and \ + reservation.reservation_type != 'out': + raise models.ValidationError(_("Only the out reservations can has a clousure reason")) + # @api.onchange("checkin_partner_ids") # def onchange_checkin_partner_ids(self): # _logger.info("----------ONCHANGE2-----------") @@ -1010,15 +1024,6 @@ class PmsReservation(models.Model): # TODO return True - def send_reservation_mail(self): - return self.folio_id.send_reservation_mail() - - def send_exit_mail(self): - return self.folio_id.send_exit_mail() - - def send_cancel_mail(self): - return self.folio_id.send_cancel_mail() - def _compute_tax_ids(self): for record in self: # If company_id is set, always filter taxes by the company diff --git a/pms/models/pms_room.py b/pms/models/pms_room.py index 77ab1e2bf..374ebbc24 100644 --- a/pms/models/pms_room.py +++ b/pms/models/pms_room.py @@ -16,6 +16,16 @@ class PmsRoom(models.Model): _description = "Property Room" _order = "sequence, room_type_id, name" + # Defaults and Gets + def name_get(self): + result = [] + for room in self: + name = room.name + if room.room_type_id: + name += ' [%s]' % room.room_type_id.code_type + result.append((room.id, name)) + return result + # Fields declaration name = fields.Char("Room Name", required=True) pms_property_id = fields.Many2one( @@ -54,7 +64,7 @@ class PmsRoom(models.Model): raise ValidationError( _( "The capacity of the \ - room must be greater than 0." + room must be greater than 0." ) ) diff --git a/pms/views/ir_sequence_views.xml b/pms/views/ir_sequence_views.xml new file mode 100644 index 000000000..d0758b64e --- /dev/null +++ b/pms/views/ir_sequence_views.xml @@ -0,0 +1,29 @@ + + + + ir.sequence + + + + + + + + + + ir.sequence + + + + + + + + + diff --git a/pms/views/pms_folio_views.xml b/pms/views/pms_folio_views.xml index feb640d96..502778fde 100644 --- a/pms/views/pms_folio_views.xml +++ b/pms/views/pms_folio_views.xml @@ -150,14 +150,14 @@ colspan="4" string="Room Line" nolabel="1" - context="{'from_folio':True,'reservation_ids':reservation_ids,'folio_id': id,'tree_view_ref':'pms.pms_reservation_view_bottom_tree', 'form_view_ref':'pms.pms_reservation_view_form'}" + context="{'reservation_ids':reservation_ids,'folio_id': id,'tree_view_ref':'pms.pms_reservation_view_bottom_tree', 'form_view_ref':'pms.pms_reservation_view_form'}" /> @@ -249,7 +249,11 @@ - + diff --git a/pms/views/pms_property_views.xml b/pms/views/pms_property_views.xml index 50e5a403e..483a5dac2 100644 --- a/pms/views/pms_property_views.xml +++ b/pms/views/pms_property_views.xml @@ -28,6 +28,9 @@ + + + diff --git a/pms/views/pms_reservation_views.xml b/pms/views/pms_reservation_views.xml index 700b480e5..abd62e9f5 100644 --- a/pms/views/pms_reservation_views.xml +++ b/pms/views/pms_reservation_views.xml @@ -4,7 +4,6 @@ Reservation pms.reservation tree,form,graph,pivot - {'from_room': True} pms.reservation.form @@ -576,7 +575,7 @@ options="{'no_create': True,'no_open': True}" style="margin-right: 30px;" /> - + /> -->

From