[IMP]pms: improvement checkin parnet search by document number

This commit is contained in:
Darío Lodeiros
2023-01-22 12:26:06 +01:00
parent dd03dce28e
commit 36b891b4dd
3 changed files with 80 additions and 51 deletions

View File

@@ -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:

View File

@@ -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

View File

@@ -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)