From bb6c40f523a37f4b5685ff47285c7a9a596a514f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Lodeiros?= Date: Sat, 19 Mar 2022 12:06:52 +0100 Subject: [PATCH] [IMP]pms: document_numbers and vat sync --- pms/models/res_partner.py | 63 +++++++++++++++++++++++++++++ pms/models/res_partner_id_number.py | 17 ++++++++ pms/views/res_partner_views.xml | 6 +++ 3 files changed, 86 insertions(+) diff --git a/pms/models/res_partner.py b/pms/models/res_partner.py index 5e599fd9c..e165317c9 100644 --- a/pms/models/res_partner.py +++ b/pms/models/res_partner.py @@ -4,6 +4,7 @@ import logging from odoo import _, api, fields, models +from odoo.exceptions import ValidationError _logger = logging.getLogger(__name__) @@ -120,6 +121,11 @@ class ResPartner(models.Model): store=True, compute="_compute_lastname2", ) + vat = fields.Char( + readonly=False, + store=True, + compute="_compute_vat", + ) comment = fields.Text( tracking=True, ) @@ -178,6 +184,24 @@ class ResPartner(models.Model): readonly=False, store=True, ) + vat_document_type = fields.Selection( + string="Document Type", + help="""The vat document type of the partner, + set if is a fiscal document, passport, etc...""", + selection=lambda self: self._selection_vat_document_type(), + compute="_compute_vat_document_type", + store=True, + ) + + @api.model + def _selection_vat_document_type(self): + vat_document_types = [ + ("vat", _("VAT")), + ] + document_categories = self.env["res.partner.id_category"].search([]) + for doc_type in document_categories: + vat_document_types.append((doc_type.name, doc_type.name)) + return vat_document_types @api.depends("vat", "id_numbers", "id_numbers.name") def _compute_document_number_to_invoice(self): @@ -382,6 +406,17 @@ class ResPartner(models.Model): elif not record.lastname2: record.lastname2 = False + @api.depends("id_numbers", "id_numbers.name") + def _compute_vat(self): + if hasattr(super(), "_compute_vat"): + super()._compute_vat() + for record in self: + if not record.vat and record.id_numbers: + vat = list(filter(None, set(record.id_numbers.mapped("name")))) + record.vat = vat[0] + elif not record.vat: + record.vat = False + def _compute_reservations_count(self): # Return reservation with partner included in reservation and/or checkin pms_reservation_obj = self.env["pms.reservation"] @@ -403,6 +438,22 @@ class ResPartner(models.Model): ] ) + @api.depends( + "vat", "id_numbers", "id_numbers.category_id", "id_numbers.vat_syncronized" + ) + def _compute_vat_document_type(self): + self.vat_document_type = False + for record in self.filtered("vat"): + record.vat_document_type = "vat" + document = record.id_numbers.filtered("vat_syncronized") + if document: + if len(document) > 1: + raise ValidationError( + _("There is more than one document with vat syncronized") + ) + if record.vat: + record.vat_document_type = document.category_id.name + def action_partner_reservations(self): self.ensure_one() checkin_reservation_ids = ( @@ -565,3 +616,15 @@ class ResPartner(models.Model): ): return True return False + + @api.constrains("vat_document_type") + def check_vat(self): + """ + Inherit constrain to allow set vat in + document ids like passport, etc... + """ + for partner in self: + if partner.vat_document_type and partner.vat_document_type != "vat": + continue + else: + super(ResPartner, partner).check_vat() diff --git a/pms/models/res_partner_id_number.py b/pms/models/res_partner_id_number.py index 9f43b045e..89e2e07de 100644 --- a/pms/models/res_partner_id_number.py +++ b/pms/models/res_partner_id_number.py @@ -19,6 +19,11 @@ class ResPartnerIdNumber(models.Model): store=True, compute="_compute_valid_from", ) + vat_syncronized = fields.Boolean( + help="Technical field to know if vat partner is syncronized with this document", + compute="_compute_vat_syncronized", + store=True, + ) @api.depends( "partner_id", "partner_id.pms_checkin_partner_ids.document_expedition_date" @@ -53,3 +58,15 @@ class ResPartnerIdNumber(models.Model): ) if len(id_number) > 1: raise ValidationError(_("Partner already has this document type")) + + @api.depends("partner_id", "partner_id.vat", "name") + def _compute_vat_syncronized(self): + self.vat_syncronized = False + for record in self: + if record.partner_id and record.partner_id.vat and record.name: + if record.name.upper() == record.partner_id.vat.upper(): + record.vat_syncronized = True + elif not record.partner_id.vat and record.name: + record.vat_syncronized = True + else: + record.vat_syncronized = False diff --git a/pms/views/res_partner_views.xml b/pms/views/res_partner_views.xml index ab7bfc8f0..d8e00e5fa 100644 --- a/pms/views/res_partner_views.xml +++ b/pms/views/res_partner_views.xml @@ -64,6 +64,12 @@ + + +