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:
|
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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user