mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[IMP]pms: improvement checkin parnet search by document number
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user