diff --git a/pms/models/pms_checkin_partner.py b/pms/models/pms_checkin_partner.py index 8fc913339..9f21d92a7 100644 --- a/pms/models/pms_checkin_partner.py +++ b/pms/models/pms_checkin_partner.py @@ -501,20 +501,8 @@ class PmsCheckinPartner(models.Model): for record in self: if not record.partner_id: if record.document_number and record.document_type: - number = ( - self.sudo() - .env["res.partner.id_number"] - .search( - [ - ("name", "=", record.document_number), - ("category_id", "=", record.document_type.id), - ] - ) - ) - partner = ( - self.sudo() - .env["res.partner"] - .search([("id", "=", number.partner_id.id)]) + partner = self._get_partner_by_document( + record.document_number, record.document_type ) if not partner: if record.firstname or record.lastname or record.lastname2: @@ -533,6 +521,22 @@ class PmsCheckinPartner(models.Model): ) record.partner_id = partner + @api.model + def _get_partner_by_document(self, document_number, document_type): + number = ( + self.sudo() + .env["res.partner.id_number"] + .search( + [ + ("name", "=", self.document_number), + ("category_id", "=", self.document_type.id), + ] + ) + ) + return ( + self.sudo().env["res.partner"].search([("id", "=", number.partner_id.id)]) + ) + @api.depends("email", "mobile") def _compute_possible_existing_customer_ids(self): for record in self: diff --git a/pms_l10n_es/models/pms_checkin_partner.py b/pms_l10n_es/models/pms_checkin_partner.py index 0119f7faa..ce522adda 100644 --- a/pms_l10n_es/models/pms_checkin_partner.py +++ b/pms_l10n_es/models/pms_checkin_partner.py @@ -63,3 +63,22 @@ class PmsCheckinPartner(models.Model): manual_fields = super(PmsCheckinPartner, self)._checkin_manual_fields(depends) manual_fields.extend(["support_number"]) return manual_fields + + def _get_partner_by_document(self, document_number, document_type): + # if not find partner by documents (super method) then search by + # partner fields, VAT, or aeat_identification equivalent + partner = super(PmsCheckinPartner, self)._get_partner_by_document( + document_number, document_type + ) + if not partner and document_number and document_type: + if document_type.aeat_identification_type in ["03", "05", "06"]: + search_field_name = "aeat_identification" + search_comparison = "=" + elif document_type.aeat_identification_type in ["02", "04"]: + search_field_name = "vat" + search_comparison = "ilike" + if search_field_name: + partner = self.env["res.partner"].search( + [(search_field_name, search_comparison, document_number)], limit=1 + ) + return partner diff --git a/pms_l10n_es/models/res_partner.py b/pms_l10n_es/models/res_partner.py index 00008c4ce..959f4a038 100644 --- a/pms_l10n_es/models/res_partner.py +++ b/pms_l10n_es/models/res_partner.py @@ -49,11 +49,15 @@ class ResPartner(models.Model): res = super(ResPartner, self).write(vals) # REVIEW: Force Contrain vat # https://github.com/odoo/odoo/issues/23242 - if vals.get("vat") or vals.get("country_id"): - country = self.env["res.country"].browse(vals.get("country_id")) - if country.code == "ES": - self.check_vat() - self._pms_check_unique_vat() + for partner in self: + if vals.get("vat") or vals.get("country_id"): + country = ( + self.env["res.country"].browse(vals.get("country_id")) + or partner.country_id + ) + if country.code == "ES": + self.check_vat() + self._pms_check_unique_vat() return res @api.model @@ -71,43 +75,45 @@ class ResPartner(models.Model): # This function is a candidate to be moved to the module # partner_vat_unique def _pms_check_unique_vat(self): - Partner = self.with_context(active_test=False).sudo() + for partner in self.filtered(lambda p: p.vat and p.country_id): + repeat_partner = self._get_repeat_partner(partner) + if bool(partner.vat) and not partner.parent_id and repeat_partner: + raise UserError( + _("The VAT number %s already exists in other contacts: %s") + % ( + repeat_partner.vat, + repeat_partner.name, + ) + ) + + def _get_repeat_partner(self, partner): europe = self.env.ref("base.europe") if not europe: europe = self.env["res.country.group"].search( [("name", "=", "Europe")], limit=1 ) - for partner in self.filtered(lambda p: p.vat and p.country_id): - partner_country_code = partner.commercial_partner_id.country_id.code - vat_country, vat_number = self._split_vat(partner.vat) - if europe and partner.country_id.id in europe.country_ids.ids: - vat_country = _eu_country_vat.get(vat_country, vat_country).upper() - vat_with_code = ( - partner.vat - if partner_country_code.upper() == vat_country.upper() - else partner_country_code.upper() + partner.vat - ) - vat_without_code = ( - partner.vat - if partner_country_code.upper() != vat_country.upper() - else vat_number - ) - domain = [ - ("company_id", "in", [False, partner.company_id.id]), - "|", - ("vat", "=", vat_with_code), - ("vat", "=", vat_without_code), - ] - domain += [("id", "!=", partner.id), "!", ("id", "child_of", partner.id)] - repeat_partner = Partner.search(domain, limit=1) - if bool(partner.vat) and not partner.parent_id and repeat_partner: - raise UserError( - _("The VAT number %s already exists in other contacts: %s") - % ( - vat_without_code, - repeat_partner.name, - ) - ) + partner_country_code = partner.commercial_partner_id.country_id.code + vat_country, vat_number = self._split_vat(partner.vat) + if europe and partner.country_id.id in europe.country_ids.ids: + vat_country = _eu_country_vat.get(vat_country, vat_country).upper() + vat_with_code = ( + partner.vat + if partner_country_code.upper() == vat_country.upper() + else partner_country_code.upper() + partner.vat + ) + vat_without_code = ( + partner.vat + if partner_country_code.upper() != vat_country.upper() + else vat_number + ) + domain = [ + ("company_id", "in", [False, partner.company_id.id]), + "|", + ("vat", "=", vat_with_code), + ("vat", "=", vat_without_code), + ] + domain += [("id", "!=", partner.id), "!", ("id", "child_of", partner.id)] + return self.with_context(active_test=False).search(domain, limit=1) def _missing_document(self, vals, partners=False): res = super(ResPartner, self)._missing_document(vals)