From 84af645cab9343e0e0851bd021f128c9448a5535 Mon Sep 17 00:00:00 2001 From: braisab Date: Wed, 31 Aug 2022 19:12:12 +0200 Subject: [PATCH] [IMP]pms_api_rest: added post and patch in partner service --- pms_api_rest/datamodels/pms_partner.py | 32 ++++ pms_api_rest/services/pms_partner_service.py | 174 +++++++++++++++++-- 2 files changed, 195 insertions(+), 11 deletions(-) diff --git a/pms_api_rest/datamodels/pms_partner.py b/pms_api_rest/datamodels/pms_partner.py index 03f4cb3a5..9e1fa30d6 100644 --- a/pms_api_rest/datamodels/pms_partner.py +++ b/pms_api_rest/datamodels/pms_partner.py @@ -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) diff --git a/pms_api_rest/services/pms_partner_service.py b/pms_api_rest/services/pms_partner_service.py index 815350736..0de293487 100644 --- a/pms_api_rest/services/pms_partner_service.py +++ b/pms_api_rest/services/pms_partner_service.py @@ -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( + [ + ( + [ + "/", + ], + "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