From ec375c749bd8121ad6917bde8b563c7d652beeef Mon Sep 17 00:00:00 2001 From: Sara Lago Date: Wed, 2 Jun 2021 17:12:46 +0200 Subject: [PATCH 01/17] [REF] pms and pms_l10n_es: refactor checkin_partner/res_partner fields --- pms/__manifest__.py | 7 +- pms/data/pms_data.xml | 21 +++ pms/models/pms_checkin_partner.py | 126 +++++++++++++++- pms/models/res_partner.py | 4 +- pms/views/pms_checkin_partner_views.xml | 57 +++++++- pms_l10n_es/__manifest__.py | 3 +- pms_l10n_es/data/pms_data.xml | 9 ++ pms_l10n_es/models/__init__.py | 2 +- pms_l10n_es/models/pms_checkin_partner.py | 136 +----------------- pms_l10n_es/models/res_partner.py | 44 ------ .../views/pms_checkin_partner_views.xml | 100 ------------- pms_l10n_es/views/res_partner_views.xml | 36 ++--- 12 files changed, 235 insertions(+), 310 deletions(-) create mode 100644 pms_l10n_es/data/pms_data.xml delete mode 100644 pms_l10n_es/views/pms_checkin_partner_views.xml diff --git a/pms/__manifest__.py b/pms/__manifest__.py index ae7707947..6258e2f22 100644 --- a/pms/__manifest__.py +++ b/pms/__manifest__.py @@ -16,10 +16,15 @@ "base", "mail", # "account_payment_return", - # "partner_firstname", # "email_template_qweb", "sale", "multi_pms_properties", + "partner_identification", + "partner_firstname", + "partner_second_lastname", + "partner_contact_gender", + "partner_contact_birthdate", + "partner_contact_nationality", ], "data": [ "security/pms_security.xml", diff --git a/pms/data/pms_data.xml b/pms/data/pms_data.xml index 685754758..bd434e6d6 100644 --- a/pms/data/pms_data.xml +++ b/pms/data/pms_data.xml @@ -52,5 +52,26 @@ Agency indirect + + + Passport + P + + + Driving License + C + + + Identification Document + I + + + Spanish Residence permit + N + + + European Residence permit + X + diff --git a/pms/models/pms_checkin_partner.py b/pms/models/pms_checkin_partner.py index 8d1a846cf..ab9030b0c 100644 --- a/pms/models/pms_checkin_partner.py +++ b/pms/models/pms_checkin_partner.py @@ -116,7 +116,122 @@ class PmsCheckinPartner(models.Model): compute="_compute_state", ) + gender = fields.Selection( + [("male", "Male"), ("female", "Female"), ("other", "Other")], + string="Gender", + compute="_compute_gender", + store=True, + readonly=False, + ) + nationality_id = fields.Many2one( + string="Nationality ID", + compute="_compute_nationality", + comodel_name="res.country", + store=True, + readonly=False, + ) + firstname = fields.Char( + "First Name", + compute="_compute_firstname", + store=True, + readonly=False, + ) + lastname = fields.Char( + "Last Name", + compute="_compute_lastname", + store=True, + readonly=False, + ) + lastname2 = fields.Char( + "Second Last Name", + compute="_compute_lastname2", + store=True, + readonly=False, + ) + birthdate_date = fields.Date( + "Birthdate", + compute="_compute_birth_date", + store=True, + readonly=False, + ) + document_number = fields.Char( + "Document Number", + #compute="_compute_document_number", + store=True, + readonly=False, + ) + document_type = fields.Many2one( + string="Document Type", + comodel_name="res.partner.id_category", + help="Select a valid document type", + #compute="_compute_document_type", + store=True, + readonly=False, + ) + document_expedition_date = fields.Date( + "Expedition Date", + #compute="_compute_document_expedition_date", + store=True, + readonly=False, + ) # Compute + # **************************************************** + # @api.depends("partner_id", "partner_id.document_number") + # def _compute_document_number(self): + # for record in self: + # if not record.document_number: + # record.document_number = record.partner_id.document_number + # + # @api.depends("partner_id", "partner_id.document_type") + # def _compute_document_type(self): + # for record in self: + # if not record.document_type: + # record.document_type = record.partner_id.document_type + # + # @api.depends("partner_id", "partner_id.document_expedition_date") + # def _compute_document_expedition_date(self): + # for record in self: + # if not record.document_expedition_date: + # record.document_expedition_date = ( + # record.partner_id.document_expedition_date + # ) + + @api.depends("partner_id", "partner_id.firstname") + def _compute_firstname(self): + for record in self: + if not record.firstname: + record.firstname = record.partner_id.firstname + + @api.depends("partner_id", "partner_id.lastname") + def _compute_lastname(self): + for record in self: + if not record.lastname: + record.lastname = record.partner_id.lastname + + @api.depends("partner_id", "partner_id.lastname2") + def _compute_lastname2(self): + for record in self: + if not record.lastname2: + record.lastname2 = record.partner_id.lastname2 + + @api.depends("partner_id", "partner_id.birthdate_date") + def _compute_birth_date(self): + for record in self: + if not record.birthdate_date: + record.birthdate_date = record.partner_id.birthdate_date + + @api.depends("partner_id", "partner_id.gender") + def _compute_gender(self): + for record in self: + if not record.gender: + record.gender = record.partner_id.gender + + @api.depends("partner_id", "partner_id.lastname") + def _compute_nationality(self): + for record in self: + if not record.nationality_id: + record.nationality_id = record.partner_id.nationality_id + @api.depends("reservation_id", "folio_id", "reservation_id.preferred_room_id") def _compute_identifier(self): for record in self: @@ -303,7 +418,16 @@ class PmsCheckinPartner(models.Model): # api.depends need "reservation_id.state" in the lambda function if depends: return ["reservation_id.state", "name"] - return ["name"] + mandatory_fields = [ + "birthdate_date", + "document_number", + "document_type", + "document_expedition_date", + "gender", + "name" + ] + + return mandatory_fields @api.model def _checkin_partner_fields(self): diff --git a/pms/models/res_partner.py b/pms/models/res_partner.py index d92865fe6..d971a0917 100644 --- a/pms/models/res_partner.py +++ b/pms/models/res_partner.py @@ -149,4 +149,6 @@ class ResPartner(models.Model): @api.model def _get_key_fields(self): - return [] + key_fields = super(ResPartner, self)._get_key_fields() + key_fields.extend(["document_number"]) + return key_fields diff --git a/pms/views/pms_checkin_partner_views.xml b/pms/views/pms_checkin_partner_views.xml index 0ae652ec4..62b082a15 100644 --- a/pms/views/pms_checkin_partner_views.xml +++ b/pms/views/pms_checkin_partner_views.xml @@ -29,10 +29,17 @@ - + + + + + + + + + @@ -70,7 +77,15 @@ /> - + + + + + + + + + @@ -107,7 +122,15 @@ - + + + + + + + + + @@ -139,7 +162,17 @@ /> - + + + + + + + + + + + @@ -167,11 +200,21 @@ > - - + + + + + + + + + + + + diff --git a/pms_l10n_es/__manifest__.py b/pms_l10n_es/__manifest__.py index 1ff4d1fc9..68419783f 100644 --- a/pms_l10n_es/__manifest__.py +++ b/pms_l10n_es/__manifest__.py @@ -28,9 +28,8 @@ "data/queue_data.xml", "data/queue_job_function_data.xml", "security/ir.model.access.csv", - "views/pms_checkin_partner_views.xml", "views/pms_property_views.xml", - "views/res_partner_views.xml", + #"views/res_partner_views.xml", "wizards/traveller_report.xml", ], "installable": True, diff --git a/pms_l10n_es/data/pms_data.xml b/pms_l10n_es/data/pms_data.xml new file mode 100644 index 000000000..a0c645281 --- /dev/null +++ b/pms_l10n_es/data/pms_data.xml @@ -0,0 +1,9 @@ + + + + + DNI + D + + + diff --git a/pms_l10n_es/models/__init__.py b/pms_l10n_es/models/__init__.py index ebd8614e3..96f0208e9 100644 --- a/pms_l10n_es/models/__init__.py +++ b/pms_l10n_es/models/__init__.py @@ -1,3 +1,3 @@ -from . import res_partner +#from . import res_partner from . import pms_checkin_partner from . import pms_property diff --git a/pms_l10n_es/models/pms_checkin_partner.py b/pms_l10n_es/models/pms_checkin_partner.py index 1daf65134..015a43cba 100644 --- a/pms_l10n_es/models/pms_checkin_partner.py +++ b/pms_l10n_es/models/pms_checkin_partner.py @@ -4,140 +4,6 @@ from odoo import api, fields, models class PmsCheckinPartner(models.Model): _inherit = "pms.checkin.partner" - firstname = fields.Char( - "First Name", - compute="_compute_firstname", - store=True, - readonly=False, - ) - lastname = fields.Char( - "Last Name", - compute="_compute_lastname", - store=True, - readonly=False, - ) lastname2 = fields.Char( - "Second Last Name", - compute="_compute_lastname2", - store=True, - readonly=False, + required=True, ) - birthdate_date = fields.Date( - "Birthdate", - compute="_compute_birth_date", - store=True, - readonly=False, - ) - document_number = fields.Char( - "Document Number", - compute="_compute_document_number", - store=True, - readonly=False, - ) - document_type = fields.Selection( - [ - ("D", "DNI"), - ("P", "Passport"), - ("C", "Driving License"), - ("I", "Identification Document"), - ("N", "Spanish residence permit"), - ("X", "European residence permit"), - ], - string="Document Type", - help="Select a valid document type", - compute="_compute_document_type", - store=True, - readonly=False, - ) - document_expedition_date = fields.Date( - "Expedition Date", - compute="_compute_document_expedition_date", - store=True, - readonly=False, - ) - gender = fields.Selection( - [("male", "Male"), ("female", "Female"), ("other", "Other")], - string="Gender", - compute="_compute_gender", - store=True, - readonly=False, - ) - nationality_id = fields.Many2one( - string="Nationality ID", - compute="_compute_nationality", - comodel_name="res.country", - store=True, - readonly=False, - ) - - @api.depends("partner_id", "partner_id.firstname") - def _compute_firstname(self): - for record in self: - if not record.firstname: - record.firstname = record.partner_id.firstname - - @api.depends("partner_id", "partner_id.lastname") - def _compute_lastname(self): - for record in self: - if not record.lastname: - record.lastname = record.partner_id.lastname - - @api.depends("partner_id", "partner_id.lastname2") - def _compute_lastname2(self): - for record in self: - if not record.lastname2: - record.lastname2 = record.partner_id.lastname2 - - @api.depends("partner_id", "partner_id.birthdate_date") - def _compute_birth_date(self): - for record in self: - if not record.birthdate_date: - record.birthdate_date = record.partner_id.birthdate_date - - @api.depends("partner_id", "partner_id.document_number") - def _compute_document_number(self): - for record in self: - if not record.document_number: - record.document_number = record.partner_id.document_number - - @api.depends("partner_id", "partner_id.document_type") - def _compute_document_type(self): - for record in self: - if not record.document_type: - record.document_type = record.partner_id.document_type - - @api.depends("partner_id", "partner_id.document_expedition_date") - def _compute_document_expedition_date(self): - for record in self: - if not record.document_expedition_date: - record.document_expedition_date = ( - record.partner_id.document_expedition_date - ) - - @api.depends("partner_id", "partner_id.gender") - def _compute_gender(self): - for record in self: - if not record.gender: - record.gender = record.partner_id.gender - - @api.depends("partner_id", "partner_id.lastname") - def _compute_nationality(self): - for record in self: - if not record.nationality_id: - record.nationality_id = record.partner_id.nationality_id - - @api.model - def _checkin_mandatory_fields(self, depends=False): - mandatory_fields = super(PmsCheckinPartner, self)._checkin_mandatory_fields( - depends - ) - mandatory_fields.extend( - [ - "birthdate_date", - "document_number", - "document_type", - "document_expedition_date", - "gender", - ] - ) - return mandatory_fields diff --git a/pms_l10n_es/models/res_partner.py b/pms_l10n_es/models/res_partner.py index 4dfe8fad0..829ae8e41 100644 --- a/pms_l10n_es/models/res_partner.py +++ b/pms_l10n_es/models/res_partner.py @@ -3,47 +3,3 @@ from odoo import _, api, fields, models class ResPartner(models.Model): _inherit = "res.partner" - - document_type = fields.Selection( - [ - ("D", "DNI"), - ("P", "Passport"), - ("C", "Driving License"), - ("I", "Identification Document"), - ("N", "Spanish residence permit"), - ("X", "European residence permit"), - ], - help="Select a valid document type", - string="Doc. type", - ) - document_number = fields.Char( - string="Document number", - ) - document_expedition_date = fields.Date(string="Document expedition date") - - @api.constrains("document_number", "document_type") - def _check_document(self): - for record in self.filtered("document_number"): - if not record.document_type: - raise models.ValidationError(_("Document Type field are mandatory")) - partner = self.search( - [ - ("document_number", "=", record.document_number), - ("document_type", "=", record.document_type), - ("id", "!=", record.id), - ] - ) - if partner: - raise models.ValidationError( - _( - "Document Number Partner %s already exist (%s)", - record.document_number, - partner.name, - ) - ) - - @api.model - def _get_key_fields(self): - key_fields = super(ResPartner, self)._get_key_fields() - key_fields.extend(["document_number"]) - return key_fields diff --git a/pms_l10n_es/views/pms_checkin_partner_views.xml b/pms_l10n_es/views/pms_checkin_partner_views.xml deleted file mode 100644 index 96a1f4de6..000000000 --- a/pms_l10n_es/views/pms_checkin_partner_views.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - Checkin partner view form Spain - pms.checkin.partner - - - - - - - - - - - - - - - - - - - Checkin partner view reservation tree Spain - pms.checkin.partner - - - - - - - - - - - - - - - - - - - Checkin partner view reservation tree Spain - pms.checkin.partner - - - - - - - - - - - - - - - - - - - Checkin partner view tree Spain - pms.checkin.partner - - - - - - - - - - - - - - - - - - Checkin partner view tree Spain - pms.checkin.partner - - - - - - - - - - - - - - - - diff --git a/pms_l10n_es/views/res_partner_views.xml b/pms_l10n_es/views/res_partner_views.xml index 2f2c75775..21e9dc562 100644 --- a/pms_l10n_es/views/res_partner_views.xml +++ b/pms_l10n_es/views/res_partner_views.xml @@ -1,19 +1,19 @@ - - - - Legal Spanish information - res.partner - - - - - - - - - + + + + + + + + + + + + + + + + + - + From 753155479d9110f8097a781a330080e0e1131df7 Mon Sep 17 00:00:00 2001 From: Sara Lago Date: Thu, 3 Jun 2021 18:17:18 +0200 Subject: [PATCH 02/17] [WIP] pms: working on partner creation in checkin flow --- pms/data/pms_data.xml | 5 +- pms/models/pms_checkin_partner.py | 211 ++++++++++++++-------- pms/tests/test_pms_checkin_partner.py | 2 +- pms/views/pms_checkin_partner_views.xml | 16 +- pms_l10n_es/__manifest__.py | 2 +- pms_l10n_es/data/pms_data.xml | 2 +- pms_l10n_es/models/__init__.py | 4 +- pms_l10n_es/models/pms_checkin_partner.py | 6 +- pms_l10n_es/models/res_partner.py | 2 +- pms_l10n_es/views/res_partner_views.xml | 19 -- 10 files changed, 150 insertions(+), 119 deletions(-) delete mode 100644 pms_l10n_es/views/res_partner_views.xml diff --git a/pms/data/pms_data.xml b/pms/data/pms_data.xml index bd434e6d6..cd852159b 100644 --- a/pms/data/pms_data.xml +++ b/pms/data/pms_data.xml @@ -61,7 +61,10 @@ Driving License C - + Identification Document I diff --git a/pms/models/pms_checkin_partner.py b/pms/models/pms_checkin_partner.py index ab9030b0c..1bb42ffc5 100644 --- a/pms/models/pms_checkin_partner.py +++ b/pms/models/pms_checkin_partner.py @@ -27,6 +27,9 @@ class PmsCheckinPartner(models.Model): help="Partner associated with checkin partner", comodel_name="res.partner", domain="[('is_company', '=', False)]", + compute="_compute_partner_id", + store=True, + readonly=False, ) reservation_id = fields.Many2one( string="Reservation", @@ -52,11 +55,7 @@ class PmsCheckinPartner(models.Model): check_pms_properties=True, ) name = fields.Char( - string="Name", - help="Checkin partner name", - readonly=False, - store=True, - compute="_compute_name", + string="Name", help="Checkin partner name", related="partner_id.name" ) email = fields.Char( string="E-mail", @@ -131,32 +130,32 @@ class PmsCheckinPartner(models.Model): readonly=False, ) firstname = fields.Char( - "First Name", + string="First Name", compute="_compute_firstname", store=True, readonly=False, ) lastname = fields.Char( - "Last Name", + string="Last Name", compute="_compute_lastname", store=True, readonly=False, ) lastname2 = fields.Char( - "Second Last Name", + string="Second Last Name", compute="_compute_lastname2", store=True, readonly=False, ) birthdate_date = fields.Date( - "Birthdate", + string="Birthdate", compute="_compute_birth_date", store=True, readonly=False, ) document_number = fields.Char( - "Document Number", - #compute="_compute_document_number", + string="Document Number", + compute="_compute_document_number", store=True, readonly=False, ) @@ -164,73 +163,105 @@ class PmsCheckinPartner(models.Model): string="Document Type", comodel_name="res.partner.id_category", help="Select a valid document type", - #compute="_compute_document_type", + compute="_compute_document_type", store=True, readonly=False, ) document_expedition_date = fields.Date( - "Expedition Date", - #compute="_compute_document_expedition_date", + string="Expedition Date", + help="Date on which document_type was issued", + compute="_compute_document_expedition_date", store=True, readonly=False, ) - # Compute - # **************************************************** - # @api.depends("partner_id", "partner_id.document_number") - # def _compute_document_number(self): - # for record in self: - # if not record.document_number: - # record.document_number = record.partner_id.document_number - # - # @api.depends("partner_id", "partner_id.document_type") - # def _compute_document_type(self): - # for record in self: - # if not record.document_type: - # record.document_type = record.partner_id.document_type - # - # @api.depends("partner_id", "partner_id.document_expedition_date") - # def _compute_document_expedition_date(self): - # for record in self: - # if not record.document_expedition_date: - # record.document_expedition_date = ( - # record.partner_id.document_expedition_date - # ) + + document_id = fields.Many2one( + string="Document", + help="Select a valid document type", + comodel_name="res.partner.id_number", + compute="_compute_document_id", + ) + + @api.depends("partner_id", "partner_id.id_numbers") + def _compute_document_number(self): + for record in self: + if not record.document_number: + if record.partner_id.id_numbers: + record.document_number = record.partner_id.id_numbers[0].name + + @api.depends("partner_id", "partner_id.id_numbers", "document_type") + def _compute_document_type(self): + for record in self: + if record.partner_id and record.partner_id.id_numbers: + if not record.document_type: + if record.partner_id.id_numbers: + record.document_type = record.partner_id.id_numbers[ + 0 + ].category_id + else: + for number in record.partner_id.id_numbers: + if record.document_number == number.name: + if record.document_type != number.category_id: + raise ValidationError( + _("Document_type e document_number not match(DT)") + ) + + @api.depends("partner_id", "partner_id.id_numbers", "document_expedition_date") + 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: + record.document_expedition_date = record.partner_id.id_numbers[ + 0 + ].valid_from @api.depends("partner_id", "partner_id.firstname") def _compute_firstname(self): for record in self: if not record.firstname: record.firstname = record.partner_id.firstname + elif not record.partner_id.firstname: + record.partner_id.write({"firstname": record.firstname}) @api.depends("partner_id", "partner_id.lastname") def _compute_lastname(self): for record in self: if not record.lastname: record.lastname = record.partner_id.lastname + elif not record.partner_id.lastname: + record.partner_id.write({"lastname": record.lastname}) @api.depends("partner_id", "partner_id.lastname2") def _compute_lastname2(self): for record in self: if not record.lastname2: record.lastname2 = record.partner_id.lastname2 + elif not record.partner_id.lastname2: + record.partner_id.write({"lastname2": record.lastname2}) @api.depends("partner_id", "partner_id.birthdate_date") def _compute_birth_date(self): for record in self: if not record.birthdate_date: record.birthdate_date = record.partner_id.birthdate_date + elif not record.partner_id.birthdate_date: + record.partner_id.write({"birthdate_date": record.birthdate_date}) @api.depends("partner_id", "partner_id.gender") def _compute_gender(self): for record in self: if not record.gender: record.gender = record.partner_id.gender + elif not record.partner_id.gender: + record.partner_id.write({"gender": record.gender}) @api.depends("partner_id", "partner_id.lastname") def _compute_nationality(self): for record in self: if not record.nationality_id: record.nationality_id = record.partner_id.nationality_id + elif not record.partner_id.nationality_id: + record.partner_id.write({"nationality_id": record.nationality_id}) @api.depends("reservation_id", "folio_id", "reservation_id.preferred_room_id") def _compute_identifier(self): @@ -286,12 +317,65 @@ class PmsCheckinPartner(models.Model): for record in self: if not record.email: record.email = record.partner_id.email + elif not record.partner_id.email: + record.partner_id.write({"email": record.email}) @api.depends("partner_id", "partner_id.mobile") def _compute_mobile(self): for record in self: if not record.mobile: record.mobile = record.partner_id.mobile + elif not record.partner_id.mobile: + record.partner_id.write({"mobile": record.mobile}) + + @api.depends( + "document_number", "document_type", "document_expedition_date", "firstname" + ) + def _compute_partner_id(self): + for record in self: + if not record.partner_id: + if ( + record.document_number + and record.document_type + and record.document_expedition_date + ): + number = self.env["res.partner.id_number"].search( + [ + ("name", "=", record.document_number), + ("category_id", "=", record.document_type.id), + ("valid_from", "=", record.document_expedition_date), + ] + ) + partner = self.env["res.partner"].search( + [("id", "=", number.partner_id.id)] + ) + if not partner: + if record.firstname or record.lastname or record.lastname2: + partner_values = { + "firstname": record.firstname, + "lastname": record.lastname, + "lastname2": record.lastname2, + "gender": record.gender, + "birthdate_date": record.birthdate_date, + "nationality_id": record.nationality_id.id, + } + partner = self.env["res.partner"].create(partner_values) + record.partner_id = partner + + @api.depends("partner_id") + def _compute_document_id(self): + for record in self: + id_number_id = self.env["res.partner.id_number"].create( + { + "partner_id": record.partner_id, + "name": record.document_number, + "category_id": record.document_type.id, + "valid_from": record.document_expedition_date, + } + ) + partner = self.env["res.partner"].browse(record.partner_id) + partner.update({"id_numbers": [(4, [id_number_id.id])]}) + record.document_id = id_number_id @api.constrains("departure", "arrival") def _check_departure(self): @@ -339,6 +423,17 @@ class PmsCheckinPartner(models.Model): ): raise ValidationError(_("'%s' is not a valid phone", record.mobile)) + @api.constrains("document_number") + def check_document_number(self): + for record in self: + if record.partner_id: + for number in record.partner_id.id_numbers: + if record.document_type == number.category_id: + if record.document_number != number.name: + raise ValidationError( + _("Document_type e document_number not match(DN)") + ) + @api.model def create(self, vals): # The checkin records are created automatically from adult depends @@ -370,43 +465,6 @@ class PmsCheckinPartner(models.Model): _("Is not possible to create the proposed check-in in this reservation") ) - def write(self, vals): - res = super(PmsCheckinPartner, self).write(vals) - ResPartner = self.env["res.partner"] - if any(field in vals for field in ResPartner._get_key_fields()): - # Create Partner if get key field in the checkin - for record in self: - key = False - partner = False - if not record.partner_id: - partner_vals = {} - for field in self._checkin_partner_fields(): - if getattr(record, field): - partner_vals[field] = getattr(record, field) - if field in ResPartner._get_key_fields() and partner_vals.get( - field - ): - key = True - # REVIEW: if partner exist, we can merge? - partner = ResPartner.search( - [(field, "=", getattr(record, field))] - ) - if key: - if not partner: - partner = ResPartner.create(partner_vals) - record.partner_id = partner - - if any(field in vals for field in self._checkin_partner_fields()): - # Update partner when the checkin partner field is not set on the partner - for record in self: - if record.partner_id: - partner_vals = {} - for field in self._checkin_partner_fields(): - if not getattr(record.partner_id, field): - partner_vals[field] = getattr(record, field) - record.partner_id.write(partner_vals) - return res - def unlink(self): reservations = self.mapped("reservation_id") res = super().unlink() @@ -419,13 +477,8 @@ class PmsCheckinPartner(models.Model): if depends: return ["reservation_id.state", "name"] mandatory_fields = [ - "birthdate_date", - "document_number", - "document_type", - "document_expedition_date", - "gender", - "name" - ] + "name", + ] return mandatory_fields diff --git a/pms/tests/test_pms_checkin_partner.py b/pms/tests/test_pms_checkin_partner.py index d9b893c44..898b8c56a 100644 --- a/pms/tests/test_pms_checkin_partner.py +++ b/pms/tests/test_pms_checkin_partner.py @@ -16,7 +16,7 @@ class TestPmsCheckinPartner(common.SavepointCase): # Arrange for one checkin on one reservation cls.host1 = cls.env["res.partner"].create( { - "name": "Miguel", + "name": "Miguel Lopez", "phone": "654667733", "email": "miguel@example.com", } diff --git a/pms/views/pms_checkin_partner_views.xml b/pms/views/pms_checkin_partner_views.xml index 62b082a15..d7e1e0c15 100644 --- a/pms/views/pms_checkin_partner_views.xml +++ b/pms/views/pms_checkin_partner_views.xml @@ -31,7 +31,7 @@ name="partner_id" domain="[('is_company','=', False)]" /> - + @@ -40,6 +40,8 @@ + + @@ -77,7 +79,7 @@ /> - + @@ -122,7 +124,7 @@ - + @@ -164,7 +166,7 @@ - + @@ -177,8 +179,6 @@ - - @@ -202,11 +202,9 @@ - - - + diff --git a/pms_l10n_es/__manifest__.py b/pms_l10n_es/__manifest__.py index 68419783f..978999c71 100644 --- a/pms_l10n_es/__manifest__.py +++ b/pms_l10n_es/__manifest__.py @@ -25,11 +25,11 @@ }, "data": [ "data/cron_jobs.xml", + "data/pms_data.xml", "data/queue_data.xml", "data/queue_job_function_data.xml", "security/ir.model.access.csv", "views/pms_property_views.xml", - #"views/res_partner_views.xml", "wizards/traveller_report.xml", ], "installable": True, diff --git a/pms_l10n_es/data/pms_data.xml b/pms_l10n_es/data/pms_data.xml index a0c645281..b609ca96f 100644 --- a/pms_l10n_es/data/pms_data.xml +++ b/pms_l10n_es/data/pms_data.xml @@ -1,4 +1,4 @@ - + diff --git a/pms_l10n_es/models/__init__.py b/pms_l10n_es/models/__init__.py index 96f0208e9..94a36dd6a 100644 --- a/pms_l10n_es/models/__init__.py +++ b/pms_l10n_es/models/__init__.py @@ -1,3 +1,3 @@ -#from . import res_partner -from . import pms_checkin_partner +# from . import res_partner +# from . import pms_checkin_partner from . import pms_property diff --git a/pms_l10n_es/models/pms_checkin_partner.py b/pms_l10n_es/models/pms_checkin_partner.py index 015a43cba..195d4b744 100644 --- a/pms_l10n_es/models/pms_checkin_partner.py +++ b/pms_l10n_es/models/pms_checkin_partner.py @@ -1,9 +1,5 @@ -from odoo import api, fields, models +from odoo import models class PmsCheckinPartner(models.Model): _inherit = "pms.checkin.partner" - - lastname2 = fields.Char( - required=True, - ) diff --git a/pms_l10n_es/models/res_partner.py b/pms_l10n_es/models/res_partner.py index 829ae8e41..10c9c65fd 100644 --- a/pms_l10n_es/models/res_partner.py +++ b/pms_l10n_es/models/res_partner.py @@ -1,4 +1,4 @@ -from odoo import _, api, fields, models +from odoo import models class ResPartner(models.Model): diff --git a/pms_l10n_es/views/res_partner_views.xml b/pms_l10n_es/views/res_partner_views.xml deleted file mode 100644 index 21e9dc562..000000000 --- a/pms_l10n_es/views/res_partner_views.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - From 69379e2cb2fb6e4c066fa4987b1c7cdea8058820 Mon Sep 17 00:00:00 2001 From: Sara Lago Date: Fri, 4 Jun 2021 13:46:01 +0200 Subject: [PATCH 03/17] [WIP] pms: working on partner creation in checkin flow v2 --- pms/models/pms_checkin_partner.py | 80 +++++++++++++++---------- pms/models/res_partner.py | 23 +++++++ pms/tests/test_pms_checkin_partner.py | 2 +- pms/views/pms_checkin_partner_views.xml | 1 + 4 files changed, 73 insertions(+), 33 deletions(-) diff --git a/pms/models/pms_checkin_partner.py b/pms/models/pms_checkin_partner.py index 1bb42ffc5..5b8826a14 100644 --- a/pms/models/pms_checkin_partner.py +++ b/pms/models/pms_checkin_partner.py @@ -137,9 +137,9 @@ class PmsCheckinPartner(models.Model): ) lastname = fields.Char( string="Last Name", - compute="_compute_lastname", - store=True, readonly=False, + store=True, + compute="_compute_lastname", ) lastname2 = fields.Char( string="Second Last Name", @@ -206,7 +206,10 @@ class PmsCheckinPartner(models.Model): _("Document_type e document_number not match(DT)") ) - @api.depends("partner_id", "partner_id.id_numbers", "document_expedition_date") + @api.depends( + "partner_id", + "partner_id.id_numbers", + ) def _compute_document_expedition_date(self): for record in self: if record.partner_id and record.partner_id.id_numbers: @@ -214,14 +217,22 @@ class PmsCheckinPartner(models.Model): record.document_expedition_date = record.partner_id.id_numbers[ 0 ].valid_from + else: + id_number = self.env["res.partner.id_number"].search( + [ + ("partner_id", "=", record.partner_id.id), + ("category_id", "=", record.document_type), + ("name", "=", record.document_number), + ] + ) + if not id_number.valid_from: + id_number.write({"valid_from": record.document_expedition_date}) @api.depends("partner_id", "partner_id.firstname") def _compute_firstname(self): for record in self: if not record.firstname: record.firstname = record.partner_id.firstname - elif not record.partner_id.firstname: - record.partner_id.write({"firstname": record.firstname}) @api.depends("partner_id", "partner_id.lastname") def _compute_lastname(self): @@ -247,7 +258,10 @@ class PmsCheckinPartner(models.Model): elif not record.partner_id.birthdate_date: record.partner_id.write({"birthdate_date": record.birthdate_date}) - @api.depends("partner_id", "partner_id.gender") + @api.depends( + "partner_id", + "partner_id.gender", + ) def _compute_gender(self): for record in self: if not record.gender: @@ -328,22 +342,31 @@ class PmsCheckinPartner(models.Model): elif not record.partner_id.mobile: record.partner_id.write({"mobile": record.mobile}) - @api.depends( - "document_number", "document_type", "document_expedition_date", "firstname" - ) + @api.depends("partner_id") + def _compute_document_id(self): + for record in self: + if record.partner_id: + id_number_id = self.env["res.partner.id_number"].create( + { + "partner_id": record.partner_id.id, + "name": record.document_number, + "category_id": record.document_type.id, + "valid_from": record.document_expedition_date, + } + ) + record.document_id = id_number_id + else: + record.document_id = False + + @api.depends("document_number", "document_type", "firstname") def _compute_partner_id(self): for record in self: if not record.partner_id: - if ( - record.document_number - and record.document_type - and record.document_expedition_date - ): + if record.document_number and record.document_type: number = self.env["res.partner.id_number"].search( [ ("name", "=", record.document_number), ("category_id", "=", record.document_type.id), - ("valid_from", "=", record.document_expedition_date), ] ) partner = self.env["res.partner"].search( @@ -362,21 +385,6 @@ class PmsCheckinPartner(models.Model): partner = self.env["res.partner"].create(partner_values) record.partner_id = partner - @api.depends("partner_id") - def _compute_document_id(self): - for record in self: - id_number_id = self.env["res.partner.id_number"].create( - { - "partner_id": record.partner_id, - "name": record.document_number, - "category_id": record.document_type.id, - "valid_from": record.document_expedition_date, - } - ) - partner = self.env["res.partner"].browse(record.partner_id) - partner.update({"id_numbers": [(4, [id_number_id.id])]}) - record.document_id = id_number_id - @api.constrains("departure", "arrival") def _check_departure(self): for record in self: @@ -485,8 +493,16 @@ class PmsCheckinPartner(models.Model): @api.model def _checkin_partner_fields(self): # api.depends need "reservation_id.state" in the lambda function - checkin_fields = self._checkin_mandatory_fields() - checkin_fields.extend(["mobile", "email"]) + checkin_fields = [ + "firstname", + "lastname", + "lastname2", + "mobile", + "email", + "gender", + "nationality_id", + "birthdate_date", + ] return checkin_fields @api.model diff --git a/pms/models/res_partner.py b/pms/models/res_partner.py index d971a0917..88c1bc57f 100644 --- a/pms/models/res_partner.py +++ b/pms/models/res_partner.py @@ -56,6 +56,29 @@ class ResPartner(models.Model): check_pms_properties=True, ) + pms_checkin_partner_ids = fields.One2many( + string="Checkin Partners", + help="Associated checkin partners", + comodel_name="pms.checkin.partner", + inverse_name="partner_id", + ) + + firstname = fields.Char( + readonly=False, + store=True, + compute="_compute_firstname", + ) + + @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.firstname") + def _compute_firstname(self): + if hasattr(super(), "_compute_firstname"): + super()._compute_field() + + # for record in self: + # if not record.firstname: + # print(record.pms_checkin_partner_ids.mapped("firstname")) + # #record.firstname = + def _compute_reservations_count(self): # TODO: recuperar las reservas de los folios del partner pms_reservation_obj = self.env["pms.reservation"] diff --git a/pms/tests/test_pms_checkin_partner.py b/pms/tests/test_pms_checkin_partner.py index 898b8c56a..d9b893c44 100644 --- a/pms/tests/test_pms_checkin_partner.py +++ b/pms/tests/test_pms_checkin_partner.py @@ -16,7 +16,7 @@ class TestPmsCheckinPartner(common.SavepointCase): # Arrange for one checkin on one reservation cls.host1 = cls.env["res.partner"].create( { - "name": "Miguel Lopez", + "name": "Miguel", "phone": "654667733", "email": "miguel@example.com", } diff --git a/pms/views/pms_checkin_partner_views.xml b/pms/views/pms_checkin_partner_views.xml index d7e1e0c15..9ca85a29a 100644 --- a/pms/views/pms_checkin_partner_views.xml +++ b/pms/views/pms_checkin_partner_views.xml @@ -42,6 +42,7 @@ + From 259a72a87eec405de51414be7fdb3e84d3cf5ccd Mon Sep 17 00:00:00 2001 From: Sara Lago Date: Mon, 7 Jun 2021 12:17:31 +0200 Subject: [PATCH 04/17] [IMP] pms: partner creation and modification in checkin flow --- pms/models/__init__.py | 1 + pms/models/pms_checkin_partner.py | 113 ++++++++++++---------------- pms/models/res_partner.py | 111 ++++++++++++++++++++++++++- pms/models/res_partner_id_number.py | 34 +++++++++ 4 files changed, 190 insertions(+), 69 deletions(-) create mode 100644 pms/models/res_partner_id_number.py diff --git a/pms/models/__init__.py b/pms/models/__init__.py index 5cb804757..2a7be0cf8 100644 --- a/pms/models/__init__.py +++ b/pms/models/__init__.py @@ -46,3 +46,4 @@ from . import account_bank_statement_line from . import account_bank_statement from . import account_journal from . import pms_availability +from . import res_partner_id_number diff --git a/pms/models/pms_checkin_partner.py b/pms/models/pms_checkin_partner.py index 5b8826a14..7216b053c 100644 --- a/pms/models/pms_checkin_partner.py +++ b/pms/models/pms_checkin_partner.py @@ -25,11 +25,11 @@ class PmsCheckinPartner(models.Model): partner_id = fields.Many2one( string="Partner", help="Partner associated with checkin partner", + readonly=False, + store=True, comodel_name="res.partner", domain="[('is_company', '=', False)]", compute="_compute_partner_id", - store=True, - readonly=False, ) reservation_id = fields.Many2one( string="Reservation", @@ -67,9 +67,9 @@ class PmsCheckinPartner(models.Model): mobile = fields.Char( string="Mobile", help="Checkin Partner Mobile", - compute="_compute_mobile", - store=True, readonly=False, + store=True, + compute="_compute_mobile", ) image_128 = fields.Image( string="Image", @@ -79,8 +79,8 @@ class PmsCheckinPartner(models.Model): segmentation_ids = fields.Many2many( string="Segmentation", help="Segmentation tags to classify checkin partners", - related="reservation_id.segmentation_ids", readonly=True, + related="reservation_id.segmentation_ids", ) checkin = fields.Date( string="Checkin", @@ -116,68 +116,77 @@ class PmsCheckinPartner(models.Model): ) gender = fields.Selection( - [("male", "Male"), ("female", "Female"), ("other", "Other")], string="Gender", - compute="_compute_gender", - store=True, + help="host gender", readonly=False, + store=True, + compute="_compute_gender", + selection=[("male", "Male"), ("female", "Female"), ("other", "Other")], ) nationality_id = fields.Many2one( string="Nationality ID", + help="host nationality", + readonly=False, + store=True, compute="_compute_nationality", comodel_name="res.country", - store=True, - readonly=False, ) firstname = fields.Char( string="First Name", - compute="_compute_firstname", - store=True, + help="host firstname", readonly=False, + store=True, + compute="_compute_firstname", ) lastname = fields.Char( string="Last Name", + help="host lastname", readonly=False, store=True, compute="_compute_lastname", ) lastname2 = fields.Char( string="Second Last Name", - compute="_compute_lastname2", - store=True, + help="host second lastname", readonly=False, + store=True, + compute="_compute_lastname2", ) birthdate_date = fields.Date( string="Birthdate", - compute="_compute_birth_date", - store=True, + help="host birthdate", readonly=False, + store=True, + compute="_compute_birth_date", ) document_number = fields.Char( string="Document Number", - compute="_compute_document_number", - store=True, + help="Host document number", readonly=False, + store=True, + compute="_compute_document_number", ) document_type = fields.Many2one( string="Document Type", - comodel_name="res.partner.id_category", help="Select a valid document type", - compute="_compute_document_type", - store=True, readonly=False, + store=True, + comodel_name="res.partner.id_category", + compute="_compute_document_type", ) document_expedition_date = fields.Date( string="Expedition Date", help="Date on which document_type was issued", - compute="_compute_document_expedition_date", - store=True, readonly=False, + store=True, + compute="_compute_document_expedition_date", ) document_id = fields.Many2one( string="Document", - help="Select a valid document type", + help="Technical field", + readonly=False, + store=True, comodel_name="res.partner.id_number", compute="_compute_document_id", ) @@ -198,13 +207,6 @@ class PmsCheckinPartner(models.Model): record.document_type = record.partner_id.id_numbers[ 0 ].category_id - else: - for number in record.partner_id.id_numbers: - if record.document_number == number.name: - if record.document_type != number.category_id: - raise ValidationError( - _("Document_type e document_number not match(DT)") - ) @api.depends( "partner_id", @@ -217,16 +219,6 @@ class PmsCheckinPartner(models.Model): record.document_expedition_date = record.partner_id.id_numbers[ 0 ].valid_from - else: - id_number = self.env["res.partner.id_number"].search( - [ - ("partner_id", "=", record.partner_id.id), - ("category_id", "=", record.document_type), - ("name", "=", record.document_number), - ] - ) - if not id_number.valid_from: - id_number.write({"valid_from": record.document_expedition_date}) @api.depends("partner_id", "partner_id.firstname") def _compute_firstname(self): @@ -239,24 +231,18 @@ class PmsCheckinPartner(models.Model): for record in self: if not record.lastname: record.lastname = record.partner_id.lastname - elif not record.partner_id.lastname: - record.partner_id.write({"lastname": record.lastname}) @api.depends("partner_id", "partner_id.lastname2") def _compute_lastname2(self): for record in self: if not record.lastname2: record.lastname2 = record.partner_id.lastname2 - elif not record.partner_id.lastname2: - record.partner_id.write({"lastname2": record.lastname2}) @api.depends("partner_id", "partner_id.birthdate_date") def _compute_birth_date(self): for record in self: if not record.birthdate_date: record.birthdate_date = record.partner_id.birthdate_date - elif not record.partner_id.birthdate_date: - record.partner_id.write({"birthdate_date": record.birthdate_date}) @api.depends( "partner_id", @@ -264,18 +250,14 @@ class PmsCheckinPartner(models.Model): ) def _compute_gender(self): for record in self: - if not record.gender: + if not record.gender and record.partner_id.gender: record.gender = record.partner_id.gender - elif not record.partner_id.gender: - record.partner_id.write({"gender": record.gender}) @api.depends("partner_id", "partner_id.lastname") def _compute_nationality(self): for record in self: if not record.nationality_id: record.nationality_id = record.partner_id.nationality_id - elif not record.partner_id.nationality_id: - record.partner_id.write({"nationality_id": record.nationality_id}) @api.depends("reservation_id", "folio_id", "reservation_id.preferred_room_id") def _compute_identifier(self): @@ -331,30 +313,31 @@ class PmsCheckinPartner(models.Model): for record in self: if not record.email: record.email = record.partner_id.email - elif not record.partner_id.email: - record.partner_id.write({"email": record.email}) @api.depends("partner_id", "partner_id.mobile") def _compute_mobile(self): for record in self: if not record.mobile: record.mobile = record.partner_id.mobile - elif not record.partner_id.mobile: - record.partner_id.write({"mobile": record.mobile}) @api.depends("partner_id") def _compute_document_id(self): for record in self: if record.partner_id: - id_number_id = self.env["res.partner.id_number"].create( - { - "partner_id": record.partner_id.id, - "name": record.document_number, - "category_id": record.document_type.id, - "valid_from": record.document_expedition_date, - } - ) - record.document_id = id_number_id + if ( + not record.document_id + and record.document_number + and record.document_type + ): + id_number_id = self.env["res.partner.id_number"].create( + { + "partner_id": record.partner_id.id, + "name": record.document_number, + "category_id": record.document_type.id, + "valid_from": record.document_expedition_date, + } + ) + record.document_id = id_number_id else: record.document_id = False diff --git a/pms/models/res_partner.py b/pms/models/res_partner.py index 88c1bc57f..8523e1d0c 100644 --- a/pms/models/res_partner.py +++ b/pms/models/res_partner.py @@ -63,21 +63,124 @@ class ResPartner(models.Model): inverse_name="partner_id", ) + gender = fields.Selection( + readonly=False, + store=True, + compute="_compute_gender", + ) + + birthdate_date = fields.Date( + readonly=False, + store=True, + compute="_compute_birthdate_date", + ) + + nationality_id = fields.Many2one( + readonly=False, + store=True, + compute="_compute_nationality_id", + ) + + email = fields.Char( + readonly=False, + store=True, + compute="_compute_email", + ) + mobile = fields.Char( + readonly=False, + store=True, + compute="_compute_mobile", + ) + firstname = fields.Char( readonly=False, store=True, compute="_compute_firstname", ) + lastname = fields.Char( + readonly=False, + store=True, + compute="_compute_lastname", + ) + + lastname2 = fields.Char( + readonly=False, + store=True, + compute="_compute_lastname2", + ) + + @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.gender") + def _compute_gender(self): + if hasattr(super(), "_compute_gender"): + super()._compute_field() + for record in self: + gender = record.pms_checkin_partner_ids.mapped("gender") + if not record.gender and gender: + record.gender = gender[0] + + @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.birthdate_date") + def _compute_birthdate_date(self): + if hasattr(super(), "_compute_birthdate_date"): + super()._compute_field() + for record in self: + birthdate = record.pms_checkin_partner_ids.mapped("birthdate_date") + if not record.birthdate_date and birthdate: + record.birthdate_date = birthdate[0] + + @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.nationality_id") + def _compute_nationality_id(self): + if hasattr(super(), "_compute_nationality_id"): + super()._compute_field() + for record in self: + nationality = record.pms_checkin_partner_ids.nationality_id + if not record.nationality_id and nationality: + record.nationality_id = nationality[0] + + @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.email") + def _compute_email(self): + if hasattr(super(), "_compute_email"): + super()._compute_field() + for record in self: + email = record.pms_checkin_partner_ids.mapped("email") + if not record.email and email: + record.email = email[0] + + @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.mobile") + def _compute_mobile(self): + if hasattr(super(), "_compute_mobile"): + super()._compute_field() + for record in self: + mobile = record.pms_checkin_partner_ids.mapped("mobile") + if not record.mobile and mobile: + record.mobile = mobile[0] + @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.firstname") def _compute_firstname(self): if hasattr(super(), "_compute_firstname"): super()._compute_field() + for record in self: + firstname = record.pms_checkin_partner_ids.mapped("firstname") + if not record.firstname and firstname: + record.firstname = firstname[0] - # for record in self: - # if not record.firstname: - # print(record.pms_checkin_partner_ids.mapped("firstname")) - # #record.firstname = + @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.lastname") + def _compute_lastname(self): + if hasattr(super(), "_compute_lastname"): + super()._compute_field() + for record in self: + lastname = record.pms_checkin_partner_ids.mapped("lastname") + if not record.lastname and lastname: + record.lastname = lastname[0] + + @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.lastname2") + def _compute_lastname2(self): + if hasattr(super(), "_compute_lastname2"): + super()._compute_field() + for record in self: + lastname2 = record.pms_checkin_partner_ids.mapped("lastname2") + if not record.lastname2 and lastname2: + record.lastname2 = lastname2[0] def _compute_reservations_count(self): # TODO: recuperar las reservas de los folios del partner diff --git a/pms/models/res_partner_id_number.py b/pms/models/res_partner_id_number.py new file mode 100644 index 000000000..6601bcc94 --- /dev/null +++ b/pms/models/res_partner_id_number.py @@ -0,0 +1,34 @@ +# Copyright 2004-2010 Tiny SPRL http://tiny.be +# Copyright 2010-2012 ChriCar Beteiligungs- und Beratungs- GmbH +# http://www.camptocamp.at +# Copyright 2015 Antiun Ingenieria, SL (Madrid, Spain) +# http://www.antiun.com +# Antonio Espinosa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + + +from odoo import api, fields, models + + +class ResPartnerIdNumber(models.Model): + _inherit = "res.partner.id_number" + + valid_from = fields.Date( + readonly=False, + store=True, + compute="_compute_valid_from", + ) + + @api.depends( + "partner_id", "partner_id.pms_checkin_partner_ids.document_expedition_date" + ) + def _compute_valid_from(self): + if hasattr(super(), "_compute_valid_from"): + super()._compute_field() + for record in self: + expedition_date = record.partner_id.pms_checkin_partner_ids.mapped( + "document_expedition_date" + ) + if expedition_date: + if not record.valid_from and expedition_date[0]: + record.valid_from = expedition_date[0] From ac8274d8bdbae86d5dc0e2c92bdbc8e4dcbb2855 Mon Sep 17 00:00:00 2001 From: braisab Date: Mon, 7 Jun 2021 21:34:50 +0200 Subject: [PATCH 05/17] [WIP]pms: Added warning in inconsistencies before saving res.partner if it already exists --- pms/models/pms_checkin_partner.py | 35 +++++++++++++++++++++++++ pms/models/res_partner.py | 2 +- pms/views/pms_checkin_partner_views.xml | 10 ++++++- 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/pms/models/pms_checkin_partner.py b/pms/models/pms_checkin_partner.py index 7216b053c..be266b564 100644 --- a/pms/models/pms_checkin_partner.py +++ b/pms/models/pms_checkin_partner.py @@ -191,6 +191,12 @@ class PmsCheckinPartner(models.Model): compute="_compute_document_id", ) + incongruences = fields.Char( + string="Incongruences", + help="Technical field", + compute="_compute_incongruences", + ) + @api.depends("partner_id", "partner_id.id_numbers") def _compute_document_number(self): for record in self: @@ -368,6 +374,35 @@ class PmsCheckinPartner(models.Model): partner = self.env["res.partner"].create(partner_values) record.partner_id = partner + @api.depends( + "firstname", + "lastname", + "lastname2", + "gender", + "birthdate_date", + "nationality_id", + "email", + "mobile", + ) + def _compute_incongruences(self): + for record in self: + incongruous_fields = "" + if record.partner_id: + for field in record._checkin_partner_fields(): + if ( + record.partner_id[field] + and record.partner_id[field] != record[field] + ): + incongruous_fields += record._fields[field].string + ", " + if incongruous_fields: + record.incongruences = ( + incongruous_fields + "field/s don't correspond to saved host" + ) + else: + record.incongruences = False + else: + record.incongruences = False + @api.constrains("departure", "arrival") def _check_departure(self): for record in self: diff --git a/pms/models/res_partner.py b/pms/models/res_partner.py index 8523e1d0c..ca20dcd2a 100644 --- a/pms/models/res_partner.py +++ b/pms/models/res_partner.py @@ -125,7 +125,7 @@ class ResPartner(models.Model): super()._compute_field() for record in self: birthdate = record.pms_checkin_partner_ids.mapped("birthdate_date") - if not record.birthdate_date and birthdate: + if birthdate: record.birthdate_date = birthdate[0] @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.nationality_id") diff --git a/pms/views/pms_checkin_partner_views.xml b/pms/views/pms_checkin_partner_views.xml index 9ca85a29a..e88534b5b 100644 --- a/pms/views/pms_checkin_partner_views.xml +++ b/pms/views/pms_checkin_partner_views.xml @@ -25,6 +25,14 @@ +
+ +
- + From fb027d42d313afe71da1301fb32e7872d6d600d0 Mon Sep 17 00:00:00 2001 From: Sara Lago Date: Tue, 8 Jun 2021 12:13:34 +0200 Subject: [PATCH 06/17] [FIX] pms: computed fields and duplicate document_id solved --- pms/models/pms_checkin_partner.py | 43 +++++++++++++++++++------------ pms/models/res_partner.py | 14 +++++----- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/pms/models/pms_checkin_partner.py b/pms/models/pms_checkin_partner.py index be266b564..647f8e9f9 100644 --- a/pms/models/pms_checkin_partner.py +++ b/pms/models/pms_checkin_partner.py @@ -204,7 +204,7 @@ class PmsCheckinPartner(models.Model): if record.partner_id.id_numbers: record.document_number = record.partner_id.id_numbers[0].name - @api.depends("partner_id", "partner_id.id_numbers", "document_type") + @api.depends("partner_id", "partner_id.id_numbers") def _compute_document_type(self): for record in self: if record.partner_id and record.partner_id.id_numbers: @@ -229,25 +229,25 @@ class PmsCheckinPartner(models.Model): @api.depends("partner_id", "partner_id.firstname") def _compute_firstname(self): for record in self: - if not record.firstname: + if not record.firstname or record.partner_id.firstname: record.firstname = record.partner_id.firstname @api.depends("partner_id", "partner_id.lastname") def _compute_lastname(self): for record in self: - if not record.lastname: + if not record.lastname or record.partner_id.lastname: record.lastname = record.partner_id.lastname @api.depends("partner_id", "partner_id.lastname2") def _compute_lastname2(self): for record in self: - if not record.lastname2: + if not record.lastname2 or record.partner_id.lastname2: record.lastname2 = record.partner_id.lastname2 @api.depends("partner_id", "partner_id.birthdate_date") def _compute_birth_date(self): for record in self: - if not record.birthdate_date: + if not record.birthdate_date or record.partner_id.birthdate_date: record.birthdate_date = record.partner_id.birthdate_date @api.depends( @@ -256,13 +256,13 @@ class PmsCheckinPartner(models.Model): ) def _compute_gender(self): for record in self: - if not record.gender and record.partner_id.gender: + if not record.gender or record.partner_id.gender: record.gender = record.partner_id.gender @api.depends("partner_id", "partner_id.lastname") def _compute_nationality(self): for record in self: - if not record.nationality_id: + if not record.nationality_id or record.partner_id.nationality_id: record.nationality_id = record.partner_id.nationality_id @api.depends("reservation_id", "folio_id", "reservation_id.preferred_room_id") @@ -311,19 +311,19 @@ class PmsCheckinPartner(models.Model): ) def _compute_name(self): for record in self: - if not record.name: + if not record.name or record.partner_id.name: record.name = record.partner_id.name @api.depends("partner_id", "partner_id.email") def _compute_email(self): for record in self: - if not record.email: + if not record.email or record.partner_id.email: record.email = record.partner_id.email @api.depends("partner_id", "partner_id.mobile") def _compute_mobile(self): for record in self: - if not record.mobile: + if not record.mobile or record.partner_id.mobile: record.mobile = record.partner_id.mobile @api.depends("partner_id") @@ -335,14 +335,23 @@ class PmsCheckinPartner(models.Model): and record.document_number and record.document_type ): - id_number_id = self.env["res.partner.id_number"].create( - { - "partner_id": record.partner_id.id, - "name": record.document_number, - "category_id": record.document_type.id, - "valid_from": record.document_expedition_date, - } + id_number_id = self.env["res.partner.id_number"].search( + [ + ("partner_id", "=", record.partner_id.id), + ("name", "=", record.document_number), + ("category_id", "=", record.document_type.id), + ] ) + if not id_number_id: + id_number_id = self.env["res.partner.id_number"].create( + { + "partner_id": record.partner_id.id, + "name": record.document_number, + "category_id": record.document_type.id, + "valid_from": record.document_expedition_date, + } + ) + record.document_id = id_number_id else: record.document_id = False diff --git a/pms/models/res_partner.py b/pms/models/res_partner.py index ca20dcd2a..04045a6e9 100644 --- a/pms/models/res_partner.py +++ b/pms/models/res_partner.py @@ -116,7 +116,7 @@ class ResPartner(models.Model): super()._compute_field() for record in self: gender = record.pms_checkin_partner_ids.mapped("gender") - if not record.gender and gender: + if gender: record.gender = gender[0] @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.birthdate_date") @@ -134,7 +134,7 @@ class ResPartner(models.Model): super()._compute_field() for record in self: nationality = record.pms_checkin_partner_ids.nationality_id - if not record.nationality_id and nationality: + if nationality: record.nationality_id = nationality[0] @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.email") @@ -143,7 +143,7 @@ class ResPartner(models.Model): super()._compute_field() for record in self: email = record.pms_checkin_partner_ids.mapped("email") - if not record.email and email: + if email: record.email = email[0] @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.mobile") @@ -152,7 +152,7 @@ class ResPartner(models.Model): super()._compute_field() for record in self: mobile = record.pms_checkin_partner_ids.mapped("mobile") - if not record.mobile and mobile: + if mobile: record.mobile = mobile[0] @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.firstname") @@ -161,7 +161,7 @@ class ResPartner(models.Model): super()._compute_field() for record in self: firstname = record.pms_checkin_partner_ids.mapped("firstname") - if not record.firstname and firstname: + if firstname: record.firstname = firstname[0] @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.lastname") @@ -170,7 +170,7 @@ class ResPartner(models.Model): super()._compute_field() for record in self: lastname = record.pms_checkin_partner_ids.mapped("lastname") - if not record.lastname and lastname: + if lastname: record.lastname = lastname[0] @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.lastname2") @@ -179,7 +179,7 @@ class ResPartner(models.Model): super()._compute_field() for record in self: lastname2 = record.pms_checkin_partner_ids.mapped("lastname2") - if not record.lastname2 and lastname2: + if lastname2: record.lastname2 = lastname2[0] def _compute_reservations_count(self): From 2855b6a439eb423d2b315c454f264191d7305f78 Mon Sep 17 00:00:00 2001 From: Sara Lago Date: Tue, 8 Jun 2021 12:16:45 +0200 Subject: [PATCH 07/17] [IMP] pms: added constrains to not repeat document_type in partners --- pms/models/res_partner_id_number.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/pms/models/res_partner_id_number.py b/pms/models/res_partner_id_number.py index 6601bcc94..02075742f 100644 --- a/pms/models/res_partner_id_number.py +++ b/pms/models/res_partner_id_number.py @@ -7,7 +7,8 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import api, fields, models +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError class ResPartnerIdNumber(models.Model): @@ -30,5 +31,16 @@ class ResPartnerIdNumber(models.Model): "document_expedition_date" ) if expedition_date: - if not record.valid_from and expedition_date[0]: - record.valid_from = expedition_date[0] + record.valid_from = expedition_date[0] + + @api.constrains("partner_id", "category_id") + def _check_category_id_unique(self): + for record in self: + id_number = self.env["res.partner.id_number"].search( + [ + ("partner_id", "=", record.partner_id.id), + ("category_id", "=", record.category_id.id), + ] + ) + if id_number: + raise ValidationError(_("Partner already has this document type")) From 784e631b9a000f30a5966dcbf6459bdd0780d6bd Mon Sep 17 00:00:00 2001 From: braisab Date: Thu, 10 Jun 2021 08:33:41 +0200 Subject: [PATCH 08/17] [FIX]pms: fix constrain unique by document type --- pms/models/res_partner_id_number.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pms/models/res_partner_id_number.py b/pms/models/res_partner_id_number.py index 02075742f..174a21680 100644 --- a/pms/models/res_partner_id_number.py +++ b/pms/models/res_partner_id_number.py @@ -42,5 +42,5 @@ class ResPartnerIdNumber(models.Model): ("category_id", "=", record.category_id.id), ] ) - if id_number: + if len(id_number) > 1: raise ValidationError(_("Partner already has this document type")) From 93f813f3dc91637e7b947b34f9219e0e9a91378a Mon Sep 17 00:00:00 2001 From: braisab Date: Thu, 10 Jun 2021 08:36:28 +0200 Subject: [PATCH 09/17] [IMP]pms: added check unique by category and number in doc category --- pms/__manifest__.py | 1 + pms/data/pms_data.xml | 5 + pms/models/pms_checkin_partner.py | 9 +- pms_l10n_es/data/pms_data.xml | 1 + pms_l10n_es/tests/test_partner.py | 149 ------------------------------ 5 files changed, 12 insertions(+), 153 deletions(-) delete mode 100644 pms_l10n_es/tests/test_partner.py diff --git a/pms/__manifest__.py b/pms/__manifest__.py index 6258e2f22..e29bbbed2 100644 --- a/pms/__manifest__.py +++ b/pms/__manifest__.py @@ -25,6 +25,7 @@ "partner_contact_gender", "partner_contact_birthdate", "partner_contact_nationality", + "partner_identification_unique_by_category", ], "data": [ "security/pms_security.xml", diff --git a/pms/data/pms_data.xml b/pms/data/pms_data.xml index cd852159b..093e75332 100644 --- a/pms/data/pms_data.xml +++ b/pms/data/pms_data.xml @@ -56,10 +56,12 @@ Passport P + True Driving License C + True Identification Document I + True Spanish Residence permit N + True European Residence permit X + True
diff --git a/pms/models/pms_checkin_partner.py b/pms/models/pms_checkin_partner.py index 647f8e9f9..da35d241b 100644 --- a/pms/models/pms_checkin_partner.py +++ b/pms/models/pms_checkin_partner.py @@ -189,6 +189,7 @@ class PmsCheckinPartner(models.Model): store=True, comodel_name="res.partner.id_number", compute="_compute_document_id", + ondelete="restrict", ) incongruences = fields.Char( @@ -356,7 +357,9 @@ class PmsCheckinPartner(models.Model): else: record.document_id = False - @api.depends("document_number", "document_type", "firstname") + @api.depends( + "document_number", "document_type", "firstname", "lastname", "lastname2" + ) def _compute_partner_id(self): for record in self: if not record.partner_id: @@ -465,9 +468,7 @@ class PmsCheckinPartner(models.Model): for number in record.partner_id.id_numbers: if record.document_type == number.category_id: if record.document_number != number.name: - raise ValidationError( - _("Document_type e document_number not match(DN)") - ) + raise ValidationError(_("Document_type has already exists")) @api.model def create(self, vals): diff --git a/pms_l10n_es/data/pms_data.xml b/pms_l10n_es/data/pms_data.xml index b609ca96f..69347bd45 100644 --- a/pms_l10n_es/data/pms_data.xml +++ b/pms_l10n_es/data/pms_data.xml @@ -4,6 +4,7 @@ DNI D + True diff --git a/pms_l10n_es/tests/test_partner.py b/pms_l10n_es/tests/test_partner.py deleted file mode 100644 index 5e526ff35..000000000 --- a/pms_l10n_es/tests/test_partner.py +++ /dev/null @@ -1,149 +0,0 @@ -import datetime - -from freezegun import freeze_time - -from odoo import fields -from odoo.exceptions import ValidationError -from odoo.tests import common - - -@freeze_time("2011-03-16") -class TestResPartner(common.SavepointCase): - def create_common_scenario(self): - self.folio_sequence = self.env["ir.sequence"].create( - { - "name": "PMS Folio", - "code": "pms.folio", - "padding": 4, - "company_id": self.env.ref("base.main_company").id, - } - ) - self.reservation_sequence = self.env["ir.sequence"].create( - { - "name": "PMS Reservation", - "code": "pms.reservation", - "padding": 4, - "company_id": self.env.ref("base.main_company").id, - } - ) - self.checkin_sequence = self.env["ir.sequence"].create( - { - "name": "PMS Checkin", - "code": "pms.checkin.partner", - "padding": 4, - "company_id": self.env.ref("base.main_company").id, - } - ) - self.property_test = self.property = self.env["pms.property"].create( - { - "name": "My property test", - "company_id": self.env.ref("base.main_company").id, - "default_pricelist_id": self.env.ref("product.list0").id, - "folio_sequence_id": self.folio_sequence.id, - "reservation_sequence_id": self.reservation_sequence.id, - "checkin_sequence_id": self.checkin_sequence.id, - } - ) - - def test_check_precheckin_state(self): - # arrange - self.create_common_scenario() - today = fields.date.today() - partner = self.env["res.partner"].create( - { - "name": "name1", - # "lastname": "lastname1", - "lastname2": "secondlastname", - "document_expedition_date": "2011-02-20", - "birthdate_date": "1995-12-10", - "gender": "male", - "document_type": "D", - "document_number": "30065089H", - } - ) - reservation_vals = { - "checkin": today, - "checkout": today + datetime.timedelta(days=3), - "partner_id": partner.id, - "adults": 1, - "pms_property_id": self.property_test.id, - } - # action - reservation = self.env["pms.reservation"].create(reservation_vals) - checkin = self.env["pms.checkin.partner"].create( - { - "partner_id": partner.id, - "reservation_id": reservation.id, - } - ) - - # assert - - self.assertEqual( - checkin.state, "precheckin", "partner's fields weren't checked" - ) - - def test_error_action_on_board(self): - # arrange - self.create_common_scenario() - today = fields.date.today() - partner = self.env["res.partner"].create( - { - "name": "partner1", - } - ) - reservation_vals = { - "checkin": today, - "checkout": today + datetime.timedelta(days=3), - "partner_id": partner.id, - "adults": 1, - "pms_property_id": self.property_test.id, - } - # action - reservation = self.env["pms.reservation"].create(reservation_vals) - checkin = self.env["pms.checkin.partner"].create( - { - "partner_id": partner.id, - "reservation_id": reservation.id, - } - ) - - # arrange - with self.assertRaises(ValidationError): - checkin.action_on_board() - - def test_right_action_on_board(self): - # arrange - self.create_common_scenario() - today = fields.date.today() - partner = self.env["res.partner"].create( - { - "name": "name1", - # "lastname": "lastname1", - "lastname2": "secondlastname", - "document_expedition_date": "2011-02-20", - "birthdate_date": "1995-12-10", - "gender": "male", - "document_type": "D", - "document_number": "30065089H", - } - ) - reservation_vals = { - "checkin": today, - "checkout": today + datetime.timedelta(days=3), - "partner_id": partner.id, - "adults": 1, - "pms_property_id": self.property_test.id, - } - # action - reservation = self.env["pms.reservation"].create(reservation_vals) - checkin = self.env["pms.checkin.partner"].create( - { - "partner_id": partner.id, - "reservation_id": reservation.id, - } - ) - checkin.action_on_board() - # arrange - self.assertEqual(reservation.state, "onboard", "reservation's state is wrong") - self.assertEqual(checkin.state, "onboard", "checkin's state is wrong") From bf12df706ee938ca97e09bab4d0e8a1ee2eb0fe9 Mon Sep 17 00:00:00 2001 From: braisab Date: Tue, 15 Jun 2021 18:56:35 +0200 Subject: [PATCH 10/17] [FIX]pms: fixed computes so that res.partner fields are not overwritten --- pms/models/pms_checkin_partner.py | 46 ++++++++---- pms/models/res_partner.py | 108 ++++++++++++++++++++-------- pms/models/res_partner_id_number.py | 19 +++-- 3 files changed, 124 insertions(+), 49 deletions(-) diff --git a/pms/models/pms_checkin_partner.py b/pms/models/pms_checkin_partner.py index da35d241b..a966d3a88 100644 --- a/pms/models/pms_checkin_partner.py +++ b/pms/models/pms_checkin_partner.py @@ -198,14 +198,14 @@ class PmsCheckinPartner(models.Model): compute="_compute_incongruences", ) - @api.depends("partner_id", "partner_id.id_numbers") + @api.depends("partner_id") def _compute_document_number(self): for record in self: if not record.document_number: if record.partner_id.id_numbers: record.document_number = record.partner_id.id_numbers[0].name - @api.depends("partner_id", "partner_id.id_numbers") + @api.depends("partner_id") def _compute_document_type(self): for record in self: if record.partner_id and record.partner_id.id_numbers: @@ -217,7 +217,6 @@ class PmsCheckinPartner(models.Model): @api.depends( "partner_id", - "partner_id.id_numbers", ) def _compute_document_expedition_date(self): for record in self: @@ -227,44 +226,55 @@ class PmsCheckinPartner(models.Model): 0 ].valid_from - @api.depends("partner_id", "partner_id.firstname") + @api.depends("partner_id") def _compute_firstname(self): for record in self: - if not record.firstname or record.partner_id.firstname: + if not record.firstname and record.partner_id.firstname: record.firstname = record.partner_id.firstname + elif not record.firstname: + record.firstname = False - @api.depends("partner_id", "partner_id.lastname") + @api.depends("partner_id") def _compute_lastname(self): for record in self: - if not record.lastname or record.partner_id.lastname: + if not record.lastname and record.partner_id.lastname: record.lastname = record.partner_id.lastname + elif not record.lastname: + record.lastname = False - @api.depends("partner_id", "partner_id.lastname2") + @api.depends("partner_id") def _compute_lastname2(self): for record in self: - if not record.lastname2 or record.partner_id.lastname2: + if not record.lastname2 and record.partner_id.lastname2: record.lastname2 = record.partner_id.lastname2 + elif not record.lastname2: + record.lastname2 = False - @api.depends("partner_id", "partner_id.birthdate_date") + @api.depends("partner_id") def _compute_birth_date(self): for record in self: - if not record.birthdate_date or record.partner_id.birthdate_date: + if not record.birthdate_date and record.partner_id.birthdate_date: record.birthdate_date = record.partner_id.birthdate_date + elif not record.birthdate_date: + record.birthdate_date = False @api.depends( "partner_id", - "partner_id.gender", ) def _compute_gender(self): for record in self: - if not record.gender or record.partner_id.gender: + if not record.gender and record.partner_id.gender: record.gender = record.partner_id.gender + elif not record.gender: + record.gender = False - @api.depends("partner_id", "partner_id.lastname") + @api.depends("partner_id") def _compute_nationality(self): for record in self: - if not record.nationality_id or record.partner_id.nationality_id: + if not record.nationality_id and record.partner_id.nationality_id: record.nationality_id = record.partner_id.nationality_id + elif not record.nationality_id: + record.nationality_id = False @api.depends("reservation_id", "folio_id", "reservation_id.preferred_room_id") def _compute_identifier(self): @@ -514,6 +524,11 @@ class PmsCheckinPartner(models.Model): return ["reservation_id.state", "name"] mandatory_fields = [ "name", + "birthdate_date", + "gender", + "document_number", + "document_type", + "document_expedition_date", ] return mandatory_fields @@ -560,6 +575,7 @@ class PmsCheckinPartner(models.Model): raise ValidationError(_("It is not yet checkin day!")) if record.reservation_id.checkout <= fields.Date.today(): raise ValidationError(_("Its too late to checkin")) + if any( not getattr(record, field) for field in self._checkin_mandatory_fields() ): diff --git a/pms/models/res_partner.py b/pms/models/res_partner.py index 04045a6e9..d3328d1ad 100644 --- a/pms/models/res_partner.py +++ b/pms/models/res_partner.py @@ -115,72 +115,122 @@ class ResPartner(models.Model): if hasattr(super(), "_compute_gender"): super()._compute_field() for record in self: - gender = record.pms_checkin_partner_ids.mapped("gender") - if gender: - record.gender = gender[0] + if not record.gender and record.pms_checkin_partner_ids: + gender = list(set(record.pms_checkin_partner_ids.mapped("gender"))) + if len(gender) == 1: + record.gender = gender[0] + else: + record.gender = False + elif not record.gender: + record.gender = False @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.birthdate_date") def _compute_birthdate_date(self): if hasattr(super(), "_compute_birthdate_date"): super()._compute_field() for record in self: - birthdate = record.pms_checkin_partner_ids.mapped("birthdate_date") - if birthdate: - record.birthdate_date = birthdate[0] + if not record.birthdate_date and record.pms_checkin_partner_ids: + birthdate = list( + set(record.pms_checkin_partner_ids.mapped("birthdate_date")) + ) + if len(birthdate) == 1: + record.birthdate_date = birthdate[0] + else: + record.birthdate_date = False + elif not record.birthdate_date: + record.birthdate_date = False @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.nationality_id") def _compute_nationality_id(self): if hasattr(super(), "_compute_nationality_id"): super()._compute_field() for record in self: - nationality = record.pms_checkin_partner_ids.nationality_id - if nationality: - record.nationality_id = nationality[0] + if not record.nationality_id and record.pms_checkin_partner_ids: + nationality_id = list( + set(record.pms_checkin_partner_ids.mapped("nationality_id")) + ) + if len(nationality_id) == 1: + record.nationality_id = nationality_id[0] + else: + record.nationality_id = False + elif not record.nationality_id: + record.nationality_id = False @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.email") def _compute_email(self): if hasattr(super(), "_compute_email"): super()._compute_field() - for record in self: - email = record.pms_checkin_partner_ids.mapped("email") - if email: - record.email = email[0] + for record in self: + if not record.email and record.pms_checkin_partner_ids: + email = list(set(record.pms_checkin_partner_ids.mapped("email"))) + if len(email) == 1: + record.email = email[0] + else: + record.email = False + elif not record.email: + record.email = False @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.mobile") def _compute_mobile(self): if hasattr(super(), "_compute_mobile"): super()._compute_field() - for record in self: - mobile = record.pms_checkin_partner_ids.mapped("mobile") - if mobile: - record.mobile = mobile[0] + for record in self: + if not record.mobile and record.pms_checkin_partner_ids: + mobile = list(set(record.pms_checkin_partner_ids.mapped("mobile"))) + if len(mobile) == 1: + record.mobile = mobile[0] + else: + record.mobile = False + elif not record.mobile: + record.mobile = False @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.firstname") def _compute_firstname(self): if hasattr(super(), "_compute_firstname"): super()._compute_field() - for record in self: - firstname = record.pms_checkin_partner_ids.mapped("firstname") - if firstname: - record.firstname = firstname[0] + for record in self: + if not record.firstname and record.pms_checkin_partner_ids: + firstname = list( + set(record.pms_checkin_partner_ids.mapped("firstname")) + ) + if len(firstname) == 1: + record.firstname = firstname[0] + else: + record.firstname = False + elif not record.firstname: + record.firstname = False @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.lastname") def _compute_lastname(self): if hasattr(super(), "_compute_lastname"): super()._compute_field() - for record in self: - lastname = record.pms_checkin_partner_ids.mapped("lastname") - if lastname: - record.lastname = lastname[0] + for record in self: + if not record.lastname and record.pms_checkin_partner_ids: + lastname = list( + set(record.pms_checkin_partner_ids.mapped("lastname")) + ) + if len(lastname) == 1: + record.lastname = lastname[0] + else: + record.lastname = False + elif not record.lastname: + record.lastname = False @api.depends("pms_checkin_partner_ids", "pms_checkin_partner_ids.lastname2") def _compute_lastname2(self): if hasattr(super(), "_compute_lastname2"): super()._compute_field() - for record in self: - lastname2 = record.pms_checkin_partner_ids.mapped("lastname2") - if lastname2: - record.lastname2 = lastname2[0] + for record in self: + if not record.lastname2 and record.pms_checkin_partner_ids: + lastname2 = list( + set(record.pms_checkin_partner_ids.mapped("lastname2")) + ) + if len(lastname2) == 1: + record.lastname2 = lastname2[0] + else: + record.lastname2 = False + elif not record.lastname2: + record.lastname2 = False def _compute_reservations_count(self): # TODO: recuperar las reservas de los folios del partner diff --git a/pms/models/res_partner_id_number.py b/pms/models/res_partner_id_number.py index 174a21680..707426860 100644 --- a/pms/models/res_partner_id_number.py +++ b/pms/models/res_partner_id_number.py @@ -27,11 +27,20 @@ class ResPartnerIdNumber(models.Model): if hasattr(super(), "_compute_valid_from"): super()._compute_field() for record in self: - expedition_date = record.partner_id.pms_checkin_partner_ids.mapped( - "document_expedition_date" - ) - if expedition_date: - record.valid_from = expedition_date[0] + if not record.valid_from and record.pms_checkin_partner_ids: + document_expedition_date = list( + set( + record.pms_checkin_partner_ids.mapped( + "document_expedition_date" + ) + ) + ) + if len(document_expedition_date) == 1: + record.valid_from = document_expedition_date[0] + else: + record.valid_from = False + elif not record.valid_from: + record.valid_from = False @api.constrains("partner_id", "category_id") def _check_category_id_unique(self): From 12aa3ddb31335e1dfefa4635d6bcc6bbfbd51e0a Mon Sep 17 00:00:00 2001 From: braisab Date: Wed, 16 Jun 2021 13:55:43 +0200 Subject: [PATCH 11/17] [IMP] added traveller report of checkin partners --- pms/__manifest__.py | 4 + pms/data/traveller_report_paperformat.xml | 20 +++ pms/models/pms_property.py | 9 ++ pms/models/res_company.py | 5 + pms/report/traveller_report_action.xml | 14 ++ pms/views/pms_checkin_partner_views.xml | 10 ++ pms/views/pms_property_views.xml | 3 + pms/views/res_company_views.xml | 16 +++ pms/views/traveller_report_template.xml | 154 ++++++++++++++++++++++ 9 files changed, 235 insertions(+) create mode 100644 pms/data/traveller_report_paperformat.xml create mode 100644 pms/report/traveller_report_action.xml create mode 100644 pms/views/res_company_views.xml create mode 100644 pms/views/traveller_report_template.xml diff --git a/pms/__manifest__.py b/pms/__manifest__.py index e29bbbed2..9fa1e57d7 100644 --- a/pms/__manifest__.py +++ b/pms/__manifest__.py @@ -33,8 +33,10 @@ "data/cron_jobs.xml", "data/pms_sequence.xml", "data/pms_data.xml", + "data/traveller_report_paperformat.xml", "report/pms_folio.xml", "report/pms_folio_templates.xml", + "report/traveller_report_action.xml", # "templates/pms_email_template.xml", "data/menus.xml", "wizards/wizard_payment_folio.xml", @@ -73,6 +75,8 @@ "views/account_journal_views.xml", "views/folio_portal_templates.xml", "views/reservation_portal_templates.xml", + "views/res_company_views.xml", + "views/traveller_report_template.xml", "wizards/wizard_split_join_swap_reservation.xml", "wizards/wizard_massive_changes.xml", "wizards/wizard_advanced_filters.xml", diff --git a/pms/data/traveller_report_paperformat.xml b/pms/data/traveller_report_paperformat.xml new file mode 100644 index 000000000..b5f8b56ef --- /dev/null +++ b/pms/data/traveller_report_paperformat.xml @@ -0,0 +1,20 @@ + + + + + Traveller Report PaperFormat + + custom + 200 + 75 + Portrait + 1 + 3 + 0 + 0 + + 1 + 201 + + + diff --git a/pms/models/pms_property.py b/pms/models/pms_property.py index 36f7c4257..e6609ee31 100644 --- a/pms/models/pms_property.py +++ b/pms/models/pms_property.py @@ -89,6 +89,15 @@ class PmsProperty(models.Model): selection=_tz_get, ) + cardex_warning = fields.Text( + string="Warning in Cardex", + default="Time to access rooms: 14: 00h. " + "Departure time: 12: 00h. If the accommodation " + "is not left at that time, the establishment will " + "charge a day's stay according to current rate that day", + help="Notice under the signature on the traveler's ticket.", + ) + @api.constrains("default_arrival_hour") def _check_arrival_hour(self): for record in self: diff --git a/pms/models/res_company.py b/pms/models/res_company.py index 79135d45a..341d20f80 100644 --- a/pms/models/res_company.py +++ b/pms/models/res_company.py @@ -13,3 +13,8 @@ class ResCompany(models.Model): comodel_name="pms.property", inverse_name="company_id", ) + + privacy_policy = fields.Text( + string="Privacy Policy", + help="Authorization by the user for the" "manage of their personal data", + ) diff --git a/pms/report/traveller_report_action.xml b/pms/report/traveller_report_action.xml new file mode 100644 index 000000000..e36b78184 --- /dev/null +++ b/pms/report/traveller_report_action.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/pms/views/pms_checkin_partner_views.xml b/pms/views/pms_checkin_partner_views.xml index e88534b5b..87724331c 100644 --- a/pms/views/pms_checkin_partner_views.xml +++ b/pms/views/pms_checkin_partner_views.xml @@ -59,6 +59,16 @@ +