[IMP]pms_api_rest: added post and patch in partner service

This commit is contained in:
braisab
2022-08-31 19:12:12 +02:00
committed by Darío Lodeiros
parent f7121bd604
commit 84af645cab
2 changed files with 195 additions and 11 deletions

View File

@@ -3,7 +3,39 @@ from marshmallow import fields
from odoo.addons.datamodel.core import Datamodel
class PmsPartnerSearchParam(Datamodel):
_name = "pms.partner.search.param"
id = fields.Integer(required=False, allow_none=True)
vat = fields.String(required=False, allow_none=True)
class PmsPartnerInfo(Datamodel):
_name = "pms.partner.info"
id = fields.Integer(required=False, allow_none=True)
name = fields.String(required=False, allow_none=True)
firstname = fields.String(required=False, allow_none=True)
lastname = fields.String(required=False, allow_none=True)
lastname2 = fields.String(required=False, allow_none=True)
email = fields.String(required=False, allow_none=True)
mobile = fields.String(required=False, allow_none=True)
phone = fields.String(required=False, allow_none=True)
vat = fields.String(required=False, allow_none=True)
documentType = fields.Integer(required=False, allow_none=True)
documentNumber = fields.String(required=False, allow_none=True)
documentExpeditionDate = fields.String(required=False, allow_none=True)
documentSupportNumber = fields.String(required=False, allow_none=True)
gender = fields.String(required=False, allow_none=True)
birthdate = fields.String(required=False, allow_none=True)
residenceStreet = fields.String(required=False, allow_none=True)
zip = fields.String(required=False, allow_none=True)
residenceCity = fields.String(required=False, allow_none=True)
nationality = fields.Integer(required=False, allow_none=True)
countryState = fields.Integer(required=False, allow_none=True)
isAgency = fields.Boolean(required=False, allow_none=True)
countryChar = fields.String(required=False, allow_none=True)
countryId = fields.Integer(required=False, allow_none=True)
countryName = fields.String(required=False, allow_none=True)
tagIds = fields.List(fields.Integer(required=False, allow_none=True))
documentNumbers = fields.List(fields.Integer(required=False, allow_none=True))
lastStay = fields.String(required=False, allow_none=True)
website = fields.String(required=False, allow_none=True)

View File

@@ -1,3 +1,5 @@
from datetime import datetime
from odoo.addons.base_rest import restapi
from odoo.addons.base_rest_datamodel.restapi import Datamodel
from odoo.addons.component.core import Component
@@ -18,25 +20,150 @@ class PmsPartnerService(Component):
"GET",
)
],
input_param=Datamodel("pms.partner.search.param", is_list=False),
output_param=Datamodel("pms.partner.info", is_list=True),
auth="jwt_api_pms",
)
def get_partners(self):
domain = []
def get_partners(self, pms_partner_search_params):
result_partners = []
domain = []
dni = ""
if pms_partner_search_params.vat:
domain.append(("vat", "=", pms_partner_search_params.vat))
PmsPartnerInfo = self.env.datamodels["pms.partner.info"]
for partner in self.env["res.partner"].search(
domain,
):
for partner in self.env["res.partner"].search(domain):
if partner.id_numbers:
doc_type_id = (
self.env["res.partner.id_category"]
.search([("name", "=", "DNI")])
.id
)
dni = (
self.env["res.partner.id_number"]
.search(
[
("partner_id", "=", partner.id),
("category_id", "=", doc_type_id),
]
)
.name
)
result_partners.append(
PmsPartnerInfo(
id=partner.id,
name=partner.name if partner.name else None,
firstname=partner.firstname if partner.firstname else None,
lastname=partner.lastname if partner.lastname else None,
lastname2=partner.lastname2 if partner.lastname2 else None,
email=partner.email if partner.email else None,
mobile=partner.mobile if partner.mobile else None,
phone=partner.phone if partner.phone else None,
birthdate=datetime.combine(
partner.birthdate_date, datetime.min.time()
).isoformat()
if partner.birthdate_date
else None,
residenceStreet=partner.residence_street
if partner.residence_street
else None,
zip=partner.residence_zip if partner.residence_zip else None,
residenceCity=partner.residence_city
if partner.residence_city
else None,
nationality=partner.nationality_id.id
if partner.nationality_id
else None,
countryState=partner.residence_state_id.id
if partner.residence_state_id
else None,
isAgency=partner.is_agency,
countryId=partner.residence_country_id.id
if partner.residence_country_id
else None,
countryChar=partner.residence_country_id.code_alpha3
if partner.residence_country_id
else None,
countryName=partner.residence_country_id.name
if partner.residence_country_id
else None,
tagIds=partner.category_id.ids if partner.category_id else [],
documentNumber=dni if dni else None,
documentNumbers=partner.id_numbers if partner.id_numbers else [],
vat=partner.vat if partner.vat else None,
website=partner.website if partner.website else None,
)
)
return result_partners
@restapi.method(
[
(
[
"/",
],
"POST",
)
],
input_param=Datamodel("pms.partner.info", is_list=False),
auth="jwt_api_pms",
)
def create_partner(self, partner_info):
vals = self.mapping_partner_values(partner_info)
partner = self.env["res.partner"].create(vals)
if partner_info.documentNumber:
doc_type_id = (
self.env["res.partner.id_category"].search([("name", "=", "DNI")]).id
)
self.env["res.partner.id_number"].create(
{
"partner_id": partner.id,
"category_id": doc_type_id,
"name": partner_info.documentNumber,
}
)
@restapi.method(
[
(
[
"/<int:partner_id>",
],
"PATCH",
)
],
input_param=Datamodel("pms.partner.info", is_list=False),
auth="jwt_api_pms",
)
def write_partner(self, partner_id, partner_info):
partner = self.env["res.partner"].browse(partner_id)
if partner:
partner.write(self.mapping_partner_values(partner_info))
if partner_info.documentNumber:
doc_type_id = (
self.env["res.partner.id_category"].search([("name", "=", "DNI")]).id
)
doc_number = self.env["res.partner.id_number"].search(
[
("partner_id", "=", partner_id),
("name", "=", partner_info.documentNumber),
("category_id", "=", doc_type_id),
]
)
if not doc_number:
self.env["res.partner.id_number"].create(
{
"category_id": doc_type_id,
"name": partner_info.documentNumber,
}
)
else:
doc_number.write(
{
"name": partner_info.documentNumber,
}
)
# REVIEW: analyze in which service file this method should be
@restapi.method(
[
(
@@ -50,11 +177,8 @@ class PmsPartnerService(Component):
auth="jwt_api_pms",
)
def get_partner_by_doc_number(self, document_type, document_number):
doc_type = self.env["res.partner.id_category"].search(
[("id", "=", document_type)]
)
doc_number = self.env["res.partner.id_number"].search(
[("name", "=", document_number), ("category_id", "=", doc_type.id)]
[("name", "=", document_number), ("category_id", "=", int(document_type))]
)
partners = []
PmsCheckinPartnerInfo = self.env.datamodels["pms.checkin.partner.info"]
@@ -88,7 +212,7 @@ class PmsPartnerService(Component):
mobile=doc_number.partner_id.mobile
if doc_number.partner_id.mobile
else None,
documentType=doc_type.id,
documentType=int(document_type),
documentNumber=doc_number.name,
documentExpeditionDate=document_expedition_date
if doc_number.valid_from
@@ -120,3 +244,31 @@ class PmsPartnerService(Component):
)
)
return partners
def mapping_partner_values(self, pms_partner_info):
vals = dict()
partner_fields = {
"firstname": pms_partner_info.firstname,
"lastname": pms_partner_info.lastname,
"email": pms_partner_info.email,
"mobile": pms_partner_info.mobile,
"phone": pms_partner_info.phone,
"gender": pms_partner_info.gender,
"residence_street": pms_partner_info.residenceStreet,
"nationality_id": pms_partner_info.nationality,
"residence_zip": pms_partner_info.zip,
"residence_city": pms_partner_info.residenceCity,
"residence_state_id": pms_partner_info.countryState,
"residence_country_id": pms_partner_info.nationality,
"is_agency": pms_partner_info.isAgency,
"vat": pms_partner_info.vat,
"website": pms_partner_info.website,
}
if pms_partner_info.birthdate:
birthdate = datetime.strptime(pms_partner_info.birthdate, "%d/%m/%Y")
birthdate = birthdate.strftime("%Y-%m-%d")
vals.update({"birthdate_date": birthdate})
for k, v in partner_fields.items():
if v:
vals.update({k: v})
return vals