mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[IMP]pms_api_rest: added check vat service and ref get partner by doc service
This commit is contained in:
@@ -6,6 +6,7 @@ from odoo.addons.datamodel.core import Datamodel
|
|||||||
class PmsCheckinPartnerInfo(Datamodel):
|
class PmsCheckinPartnerInfo(Datamodel):
|
||||||
_name = "pms.checkin.partner.info"
|
_name = "pms.checkin.partner.info"
|
||||||
id = fields.Integer(required=False, allow_none=True)
|
id = fields.Integer(required=False, allow_none=True)
|
||||||
|
partnerId = fields.Integer(required=False, allow_none=True)
|
||||||
reservationId = fields.Integer(required=False, allow_none=True)
|
reservationId = fields.Integer(required=False, allow_none=True)
|
||||||
name = fields.String(required=False, allow_none=True)
|
name = fields.String(required=False, allow_none=True)
|
||||||
firstname = fields.String(required=False, allow_none=True)
|
firstname = fields.String(required=False, allow_none=True)
|
||||||
|
|||||||
@@ -6,8 +6,61 @@ from odoo.osv import expression
|
|||||||
from odoo.addons.base_rest import restapi
|
from odoo.addons.base_rest import restapi
|
||||||
from odoo.addons.base_rest_datamodel.restapi import Datamodel
|
from odoo.addons.base_rest_datamodel.restapi import Datamodel
|
||||||
from odoo.addons.component.core import Component
|
from odoo.addons.component.core import Component
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
from odoo import _
|
||||||
|
|
||||||
|
_ref_vat = {
|
||||||
|
'al': 'J91402501L',
|
||||||
|
'ar': '200-5536168-2 or 20055361682',
|
||||||
|
'at': 'U12345675',
|
||||||
|
'au': '83 914 571 673',
|
||||||
|
'be': '0477472701',
|
||||||
|
'bg': '1234567892',
|
||||||
|
'ch': 'CHE-123.456.788 TVA or CHE-123.456.788 MWST or CHE-123.456.788 IVA',
|
||||||
|
'cl': '76086428-5',
|
||||||
|
'co': '213123432-1 or 213.123.432-1',
|
||||||
|
'cy': '10259033P',
|
||||||
|
'cz': '12345679',
|
||||||
|
'de': '123456788',
|
||||||
|
'dk': '12345674',
|
||||||
|
'do': '1-01-85004-3 or 101850043',
|
||||||
|
'ec': '1792060346-001',
|
||||||
|
'ee': '123456780',
|
||||||
|
'el': '12345670',
|
||||||
|
'es': '12345674A',
|
||||||
|
'fi': '12345671',
|
||||||
|
'fr': '23334175221',
|
||||||
|
'gb': '123456782 or 123456782',
|
||||||
|
'gr': '12345670',
|
||||||
|
'hu': '12345676',
|
||||||
|
'hr': '01234567896',
|
||||||
|
'ie': '1234567FA',
|
||||||
|
'in': "12AAAAA1234AAZA",
|
||||||
|
'is': '062199',
|
||||||
|
'it': '12345670017',
|
||||||
|
'lt': '123456715',
|
||||||
|
'lu': '12345613',
|
||||||
|
'lv': '41234567891',
|
||||||
|
'mc': '53000004605',
|
||||||
|
'mt': '12345634',
|
||||||
|
'mx': 'GODE561231GR8',
|
||||||
|
'nl': '123456782B90',
|
||||||
|
'no': '123456785',
|
||||||
|
'pe': '10XXXXXXXXY or 20XXXXXXXXY or 15XXXXXXXXY or 16XXXXXXXXY or 17XXXXXXXXY',
|
||||||
|
'ph': '123-456-789-123',
|
||||||
|
'pl': '1234567883',
|
||||||
|
'pt': '123456789',
|
||||||
|
'ro': '1234567897',
|
||||||
|
'rs': '101134702',
|
||||||
|
'ru': '123456789047',
|
||||||
|
'se': '123456789701',
|
||||||
|
'si': '12345679',
|
||||||
|
'sk': '2022749619',
|
||||||
|
'sm': '24165',
|
||||||
|
'tr': '1234567890 (VERGINO) or 17291716060 (TCKIMLIKNO)',
|
||||||
|
've': 'V-12345678-1, V123456781, V-12.345.678-1',
|
||||||
|
'xi': '123456782',
|
||||||
|
}
|
||||||
class PmsPartnerService(Component):
|
class PmsPartnerService(Component):
|
||||||
_inherit = "base.rest.service"
|
_inherit = "base.rest.service"
|
||||||
_name = "pms.partner.service"
|
_name = "pms.partner.service"
|
||||||
@@ -308,82 +361,89 @@ class PmsPartnerService(Component):
|
|||||||
[("id", "=", document_type)]
|
[("id", "=", document_type)]
|
||||||
)
|
)
|
||||||
# Clean Document number
|
# Clean Document number
|
||||||
doc_number = False
|
|
||||||
document_number = re.sub(r"[^a-zA-Z0-9]", "", document_number).upper()
|
document_number = re.sub(r"[^a-zA-Z0-9]", "", document_number).upper()
|
||||||
partner = self.env["pms.checkin.partner"]._get_partner_by_document(
|
partner = self.env["pms.checkin.partner"]._get_partner_by_document(
|
||||||
document_number, doc_type
|
document_number, doc_type
|
||||||
)
|
)
|
||||||
if partner.id_numbers:
|
|
||||||
doc_number = partner.id_numbers[0]
|
|
||||||
|
|
||||||
partners = []
|
partners = []
|
||||||
PmsCheckinPartnerInfo = self.env.datamodels["pms.checkin.partner.info"]
|
if partner:
|
||||||
if not doc_number:
|
doc_number = partner.id_numbers.filtered(
|
||||||
pass
|
lambda doc: doc.category_id.id == doc_type.id
|
||||||
else:
|
)
|
||||||
|
|
||||||
|
|
||||||
|
PmsCheckinPartnerInfo = self.env.datamodels["pms.checkin.partner.info"]
|
||||||
|
|
||||||
|
document_expedition_date = False
|
||||||
if doc_number.valid_from:
|
if doc_number.valid_from:
|
||||||
document_expedition_date = doc_number.valid_from.strftime("%d/%m/%Y")
|
document_expedition_date = doc_number.valid_from.strftime("%d/%m/%Y")
|
||||||
if doc_number.partner_id.birthdate_date:
|
birthdate_date = False
|
||||||
birthdate_date = doc_number.partner_id.birthdate_date.strftime(
|
if partner.birthdate_date:
|
||||||
|
birthdate_date = partner.birthdate_date.strftime(
|
||||||
"%d/%m/%Y"
|
"%d/%m/%Y"
|
||||||
)
|
)
|
||||||
partners.append(
|
partners.append(
|
||||||
PmsCheckinPartnerInfo(
|
PmsCheckinPartnerInfo(
|
||||||
id=doc_number.partner_id.id,
|
partnerId=partner.id or None,
|
||||||
name=doc_number.partner_id.name
|
name=partner.name or None,
|
||||||
if doc_number.partner_id.name
|
firstname=partner.firstname or None,
|
||||||
else None,
|
lastname=partner.lastname or None,
|
||||||
firstname=doc_number.partner_id.firstname
|
lastname2=partner.lastname2 or None,
|
||||||
if doc_number.partner_id.firstname
|
email=partner.email or None,
|
||||||
else None,
|
mobile=partner.mobile or None,
|
||||||
lastname=doc_number.partner_id.lastname
|
documentType=doc_type.id or None,
|
||||||
if doc_number.partner_id.lastname
|
documentNumber=doc_number.name or None,
|
||||||
else None,
|
documentExpeditionDate=document_expedition_date or None,
|
||||||
lastname2=doc_number.partner_id.lastname2
|
documentSupportNumber=doc_number.support_number or None,
|
||||||
if doc_number.partner_id.lastname2
|
gender=partner.gender or None,
|
||||||
else None,
|
birthdate=birthdate_date or None,
|
||||||
email=doc_number.partner_id.email
|
residenceStreet=partner.residence_street or None,
|
||||||
if doc_number.partner_id.email
|
zip=partner.residence_zip or None,
|
||||||
else None,
|
residenceCity=partner.residence_city or None,
|
||||||
mobile=doc_number.partner_id.mobile
|
nationality=partner.nationality_id.id or None,
|
||||||
if doc_number.partner_id.mobile
|
countryId=partner.residence_country_id or None,
|
||||||
else None,
|
countryState=partner.residence_state_id.id or None,
|
||||||
documentType=doc_type.id,
|
|
||||||
documentNumber=doc_number.name,
|
|
||||||
documentExpeditionDate=document_expedition_date
|
|
||||||
if doc_number.valid_from and doc_number.category_id == doc_type
|
|
||||||
else None,
|
|
||||||
documentSupportNumber=doc_number.support_number
|
|
||||||
if doc_number.support_number and doc_number.category_id == doc_type
|
|
||||||
else None,
|
|
||||||
gender=doc_number.partner_id.gender
|
|
||||||
if doc_number.partner_id.gender
|
|
||||||
else None,
|
|
||||||
birthdate=birthdate_date
|
|
||||||
if doc_number.partner_id.birthdate_date
|
|
||||||
else None,
|
|
||||||
residenceStreet=doc_number.partner_id.residence_street
|
|
||||||
if doc_number.partner_id.residence_street
|
|
||||||
else None,
|
|
||||||
zip=doc_number.partner_id.residence_zip
|
|
||||||
if doc_number.partner_id.residence_zip
|
|
||||||
else None,
|
|
||||||
residenceCity=doc_number.partner_id.residence_city
|
|
||||||
if doc_number.partner_id.residence_city
|
|
||||||
else None,
|
|
||||||
nationality=doc_number.partner_id.nationality_id.id
|
|
||||||
if doc_number.partner_id.nationality_id
|
|
||||||
else None,
|
|
||||||
countryId=doc_number.partner_id.residence_country_id
|
|
||||||
if doc_number.partner_id.residence_country_id
|
|
||||||
else None,
|
|
||||||
countryState=doc_number.partner_id.residence_state_id.id
|
|
||||||
if doc_number.partner_id.residence_state_id
|
|
||||||
else None,
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return partners
|
return partners
|
||||||
|
|
||||||
|
@restapi.method(
|
||||||
|
[
|
||||||
|
(
|
||||||
|
[
|
||||||
|
"/check-doc-number/<string:document_number>/<int:document_type_id>/<int:country_id>",
|
||||||
|
],
|
||||||
|
"GET",
|
||||||
|
)
|
||||||
|
],
|
||||||
|
auth="jwt_api_pms",
|
||||||
|
)
|
||||||
|
# REVIEW: create a new datamodel and service for documents?
|
||||||
|
def check_document_number(self, document_number, document_type_id, country_id):
|
||||||
|
error_mens = False
|
||||||
|
country = self.env['res.country'].browse(country_id)
|
||||||
|
document_type = self.env['res.partner.id_category'].browse(document_type_id)
|
||||||
|
id_number = self.env["res.partner.id_number"].new(
|
||||||
|
{
|
||||||
|
"name": document_number,
|
||||||
|
"category_id": document_type,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
document_type.validate_id_number(id_number)
|
||||||
|
except ValidationError as e:
|
||||||
|
error_mens = str(e)
|
||||||
|
if document_type.aeat_identification_type in ["02", "04"]:
|
||||||
|
Partner = self.env["res.partner"]
|
||||||
|
error = not Partner.simple_vat_check(
|
||||||
|
country_code=country.code,
|
||||||
|
vat_number=document_number,
|
||||||
|
)
|
||||||
|
if error:
|
||||||
|
error_mens = self._construct_check_vat_error_msg(vat_number=document_number, country_code=country.code)
|
||||||
|
if error_mens:
|
||||||
|
raise ValidationError(error_mens)
|
||||||
|
|
||||||
@restapi.method(
|
@restapi.method(
|
||||||
[
|
[
|
||||||
(
|
(
|
||||||
@@ -581,3 +641,23 @@ class PmsPartnerService(Component):
|
|||||||
if v is not None:
|
if v is not None:
|
||||||
vals.update({k: v})
|
vals.update({k: v})
|
||||||
return vals
|
return vals
|
||||||
|
|
||||||
|
def _construct_check_vat_error_msg(self, vat_number, country_code):
|
||||||
|
country_code = country_code.lower()
|
||||||
|
vat_no = "(##=VAT Number)"
|
||||||
|
vat_no = _ref_vat.get(country_code) or vat_no
|
||||||
|
if self.env.context.get('company_id'):
|
||||||
|
company = self.env['res.company'].browse(self.env.context['company_id'])
|
||||||
|
else:
|
||||||
|
company = self.env.company
|
||||||
|
if company.vat_check_vies:
|
||||||
|
return '\n' + _(
|
||||||
|
'The VAT number [%(vat)s] either failed the VIES VAT validation check or did not respect the expected format %(format)s.',
|
||||||
|
vat=vat_number,
|
||||||
|
format=vat_no
|
||||||
|
)
|
||||||
|
return '\n' + _(
|
||||||
|
'The VAT number [%(vat)s] does not seem to be valid. \nNote: the expected format is %(format)s',
|
||||||
|
vat=vat_number,
|
||||||
|
format=vat_no
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user