[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: for record in self:
if not record.partner_id: if not record.partner_id:
if record.document_number and record.document_type: if record.document_number and record.document_type:
number = ( partner = self._get_partner_by_document(
self.sudo() record.document_number, record.document_type
.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)])
) )
if not partner: if not partner:
if record.firstname or record.lastname or record.lastname2: if record.firstname or record.lastname or record.lastname2:
@@ -533,6 +521,22 @@ class PmsCheckinPartner(models.Model):
) )
record.partner_id = partner 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") @api.depends("email", "mobile")
def _compute_possible_existing_customer_ids(self): def _compute_possible_existing_customer_ids(self):
for record in 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 = super(PmsCheckinPartner, self)._checkin_manual_fields(depends)
manual_fields.extend(["support_number"]) manual_fields.extend(["support_number"])
return manual_fields 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) res = super(ResPartner, self).write(vals)
# REVIEW: Force Contrain vat # REVIEW: Force Contrain vat
# https://github.com/odoo/odoo/issues/23242 # https://github.com/odoo/odoo/issues/23242
if vals.get("vat") or vals.get("country_id"): for partner in self:
country = self.env["res.country"].browse(vals.get("country_id")) if vals.get("vat") or vals.get("country_id"):
if country.code == "ES": country = (
self.check_vat() self.env["res.country"].browse(vals.get("country_id"))
self._pms_check_unique_vat() or partner.country_id
)
if country.code == "ES":
self.check_vat()
self._pms_check_unique_vat()
return res return res
@api.model @api.model
@@ -71,43 +75,45 @@ class ResPartner(models.Model):
# This function is a candidate to be moved to the module # This function is a candidate to be moved to the module
# partner_vat_unique # partner_vat_unique
def _pms_check_unique_vat(self): 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") europe = self.env.ref("base.europe")
if not europe: if not europe:
europe = self.env["res.country.group"].search( europe = self.env["res.country.group"].search(
[("name", "=", "Europe")], limit=1 [("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
partner_country_code = partner.commercial_partner_id.country_id.code vat_country, vat_number = self._split_vat(partner.vat)
vat_country, vat_number = self._split_vat(partner.vat) if europe and partner.country_id.id in europe.country_ids.ids:
if europe and partner.country_id.id in europe.country_ids.ids: vat_country = _eu_country_vat.get(vat_country, vat_country).upper()
vat_country = _eu_country_vat.get(vat_country, vat_country).upper() vat_with_code = (
vat_with_code = ( partner.vat
partner.vat if partner_country_code.upper() == vat_country.upper()
if partner_country_code.upper() == vat_country.upper() else partner_country_code.upper() + partner.vat
else partner_country_code.upper() + partner.vat )
) vat_without_code = (
vat_without_code = ( partner.vat
partner.vat if partner_country_code.upper() != vat_country.upper()
if partner_country_code.upper() != vat_country.upper() else vat_number
else vat_number )
) domain = [
domain = [ ("company_id", "in", [False, partner.company_id.id]),
("company_id", "in", [False, partner.company_id.id]), "|",
"|", ("vat", "=", vat_with_code),
("vat", "=", vat_with_code), ("vat", "=", vat_without_code),
("vat", "=", vat_without_code), ]
] domain += [("id", "!=", partner.id), "!", ("id", "child_of", partner.id)]
domain += [("id", "!=", partner.id), "!", ("id", "child_of", partner.id)] return self.with_context(active_test=False).search(domain, limit=1)
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,
)
)
def _missing_document(self, vals, partners=False): def _missing_document(self, vals, partners=False):
res = super(ResPartner, self)._missing_document(vals) res = super(ResPartner, self)._missing_document(vals)