diff --git a/pms_api_rest/__manifest__.py b/pms_api_rest/__manifest__.py index f7af4d0ef..90e77815a 100644 --- a/pms_api_rest/__manifest__.py +++ b/pms_api_rest/__manifest__.py @@ -12,6 +12,7 @@ "web", "auth_signup", "auth_jwt_login", + "base_location", ], "external_dependencies": { "python": ["jwt", "simplejson", "marshmallow", "jose"], diff --git a/pms_api_rest/datamodels/__init__.py b/pms_api_rest/datamodels/__init__.py index 901486689..429799837 100644 --- a/pms_api_rest/datamodels/__init__.py +++ b/pms_api_rest/datamodels/__init__.py @@ -21,5 +21,11 @@ from . import pms_pricelist from . import pms_pricelist_item from . import pms_availability_plan from . import pms_availability_plan_rule + +from . import pms_id_categories +from . import res_country +from . import res_partner_category +from . import res_city_zip + from . import pms_search_param from . import pms_ubication diff --git a/pms_api_rest/datamodels/pms_checkin_partner.py b/pms_api_rest/datamodels/pms_checkin_partner.py index 74df84b0a..b34466e3e 100644 --- a/pms_api_rest/datamodels/pms_checkin_partner.py +++ b/pms_api_rest/datamodels/pms_checkin_partner.py @@ -6,13 +6,21 @@ from odoo.addons.datamodel.core import Datamodel class PmsCheckinPartnerInfo(Datamodel): _name = "pms.checkin.partner.info" id = fields.Integer(required=False, allow_none=True) - # partner = fields.String(required=False, allow_none=True) reservationId = 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) - nationality = fields.String(required=False, allow_none=True) documentType = fields.String(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) - state = 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.String(required=False, allow_none=True) + countryState = fields.String(required=False, allow_none=True) diff --git a/pms_api_rest/datamodels/pms_id_categories.py b/pms_api_rest/datamodels/pms_id_categories.py new file mode 100644 index 000000000..09dec38c1 --- /dev/null +++ b/pms_api_rest/datamodels/pms_id_categories.py @@ -0,0 +1,9 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsIdCategoriesInfo(Datamodel): + _name = "pms.id.categories.info" + id = fields.Integer(required=False, allow_none=True) + documentType = fields.String(required=False, allow_none=True) diff --git a/pms_api_rest/datamodels/res_city_zip.py b/pms_api_rest/datamodels/res_city_zip.py new file mode 100644 index 000000000..aca9f2d12 --- /dev/null +++ b/pms_api_rest/datamodels/res_city_zip.py @@ -0,0 +1,10 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class ResCityZipInfo(Datamodel): + _name = "res.city.zip.info" + cityId = fields.String(required=False, allow_none=True) + stateId = fields.String(required=False, allow_none=True) + countryId = fields.String(required=False, allow_none=True) diff --git a/pms_api_rest/datamodels/res_country.py b/pms_api_rest/datamodels/res_country.py new file mode 100644 index 000000000..d584be8c2 --- /dev/null +++ b/pms_api_rest/datamodels/res_country.py @@ -0,0 +1,15 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsResCountriesInfo(Datamodel): + _name = "res.country.info" + id = fields.Integer(required=False, allow_none=True) + name = fields.String(required=False, allow_none=True) + + +class PmsResCountryStatesInfo(Datamodel): + _name = "res.country_state.info" + id = fields.Integer(required=False, allow_none=True) + name = fields.String(required=False, allow_none=True) diff --git a/pms_api_rest/datamodels/res_partner_category.py b/pms_api_rest/datamodels/res_partner_category.py new file mode 100644 index 000000000..c41b39e4b --- /dev/null +++ b/pms_api_rest/datamodels/res_partner_category.py @@ -0,0 +1,10 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class ResPartnerCategoryInfo(Datamodel): + _name = "res.partner.category.info" + id = fields.Integer(required=False, allow_none=True) + name = fields.String(required=False, allow_none=True) + parentId = fields.Integer(required=False, allow_none=True) diff --git a/pms_api_rest/services/__init__.py b/pms_api_rest/services/__init__.py index f5b706756..694726f08 100644 --- a/pms_api_rest/services/__init__.py +++ b/pms_api_rest/services/__init__.py @@ -9,5 +9,9 @@ from . import pms_property_service from . import pms_login_service from . import pms_pricelist_service from . import pms_availability_plan_service +from . import pms_id_categories_service +from . import res_country_services +from . import res_partner_category_services +from . import res_city_zip_service from . import pms_room_type_class_service from . import pms_ubication_service diff --git a/pms_api_rest/services/pms_folio_service.py b/pms_api_rest/services/pms_folio_service.py index 8b01f9a5d..dbd99b828 100644 --- a/pms_api_rest/services/pms_folio_service.py +++ b/pms_api_rest/services/pms_folio_service.py @@ -106,7 +106,13 @@ class PmsFolioService(Component): "preferredRoomId": reservation.preferred_room_id.name if reservation.preferred_room_id else "", - "roomTypeId": reservation.room_type_id.name + "preferredRoomCapacity": reservation.preferred_room_id.capacity + if reservation.preferred_room_id + else "", + "roomTypeName": reservation.room_type_id.name + if reservation.room_type_id + else "", + "roomTypeId": reservation.room_type_id.id if reservation.room_type_id else "", "priceTotal": reservation.price_total, @@ -156,7 +162,9 @@ class PmsFolioService(Component): "departureHour": reservation.departure_hour, "pendingCheckinData": reservation.pending_checkin_data, "createDate": reservation.create_date, - "segmentations": segmentation_ids, + "segmentations": segmentation_ids[0] + if segmentation_ids + else "", "cancellationPolicy": reservation.pricelist_id.cancelation_rule_id.name if reservation.pricelist_id.cancelation_rule_id.name else "", diff --git a/pms_api_rest/services/pms_id_categories_service.py b/pms_api_rest/services/pms_id_categories_service.py new file mode 100644 index 000000000..1a7a13e15 --- /dev/null +++ b/pms_api_rest/services/pms_id_categories_service.py @@ -0,0 +1,34 @@ +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_datamodel.restapi import Datamodel +from odoo.addons.component.core import Component + + +class PmsIdCategoriesService(Component): + _inherit = "base.rest.service" + _name = "pms.id.categories.services" + _usage = "id_categories" + _collection = "pms.services" + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + output_param=Datamodel("pms.id.categories.info", is_list=True), + auth="jwt_api_pms", + ) + def get_id_categories(self): + result_id_categories = [] + PmsIdCategoriesInfo = self.env.datamodels["pms.id.categories.info"] + for id_category in self.env["res.partner.id_category"].search([]): + result_id_categories.append( + PmsIdCategoriesInfo( + id=id_category.id, + documentType=id_category.name, + ) + ) + return result_id_categories diff --git a/pms_api_rest/services/pms_partner_service.py b/pms_api_rest/services/pms_partner_service.py index 38f5eba88..db2b52691 100644 --- a/pms_api_rest/services/pms_partner_service.py +++ b/pms_api_rest/services/pms_partner_service.py @@ -36,3 +36,87 @@ class PmsPartnerService(Component): ) ) return result_partners + + @restapi.method( + [ + ( + [ + "//", + ], + "GET", + ) + ], + output_param=Datamodel("pms.partner.info", is_list=True), + auth="jwt_api_pms", + ) + def get_partner_by_doc_number(self, document_type, document_number): + doc_type = self.env["res.partner.id_category"].search( + [("name", "=", document_type)] + ) + doc_number = self.env["res.partner.id_number"].search( + [("name", "=", document_number), ("category_id", "=", doc_type.id)] + ) + partners = [] + PmsCheckinPartnerInfo = self.env.datamodels["pms.checkin.partner.info"] + if not doc_number: + pass + else: + if doc_number.valid_from: + document_expedition_date = doc_number.valid_from.strftime("%d/%m/%Y") + if doc_number.partner_id.birthdate_date: + birthdate_date = doc_number.partner_id.birthdate_date.strftime( + "%d/%m/%Y" + ) + partners.append( + PmsCheckinPartnerInfo( + # id=doc_number.partner_id.id, + name=doc_number.partner_id.name + if doc_number.partner_id.name + else "", + firstname=doc_number.partner_id.firstname + if doc_number.partner_id.firstname + else "", + lastname=doc_number.partner_id.lastname + if doc_number.partner_id.lastname + else "", + lastname2=doc_number.partner_id.lastname2 + if doc_number.partner_id.lastname2 + else "", + email=doc_number.partner_id.email + if doc_number.partner_id.email + else "", + mobile=doc_number.partner_id.mobile + if doc_number.partner_id.mobile + else "", + documentType=doc_type.name, + documentNumber=doc_number.name, + documentExpeditionDate=document_expedition_date + if doc_number.valid_from + else "", + documentSupportNumber=doc_number.support_number + if doc_number.support_number + else "", + gender=doc_number.partner_id.gender + if doc_number.partner_id.gender + else "", + birthdate=birthdate_date + if doc_number.partner_id.birthdate_date + else "", + residenceStreet=doc_number.partner_id.residence_street + if doc_number.partner_id.residence_street + else "", + zip=doc_number.partner_id.residence_zip + if doc_number.partner_id.residence_zip + else "", + residenceCity=doc_number.partner_id.residence_city + if doc_number.partner_id.residence_city + else "", + nationality=doc_number.partner_id.nationality_id.name + if doc_number.partner_id.nationality_id + else "", + countryState=doc_number.partner_id.residence_state_id.name + if doc_number.partner_id.residence_state_id + else "", + ) + ) + return partners diff --git a/pms_api_rest/services/pms_reservation_service.py b/pms_api_rest/services/pms_reservation_service.py index 4e7c11757..40543cda6 100644 --- a/pms_api_rest/services/pms_reservation_service.py +++ b/pms_api_rest/services/pms_reservation_service.py @@ -204,41 +204,204 @@ class PmsReservationService(Component): "GET", ) ], - input_param=Datamodel("pms.search.param"), output_param=Datamodel("pms.checkin.partner.info", is_list=True), auth="jwt_api_pms", ) - def get_checkin_partners(self, reservation_id, pms_search_param): - domain = list() - domain.append(("id", "=", reservation_id)) - domain.append(("pms_property_id", "=", pms_search_param.pms_property_id)) - reservation = self.env["pms.reservation"].search(domain) + def get_checkin_partners(self, reservation_id): + reservation = self.env["pms.reservation"].browse(reservation_id) checkin_partners = [] PmsCheckinPartnerInfo = self.env.datamodels["pms.checkin.partner.info"] if not reservation: pass else: for checkin_partner in reservation.checkin_partner_ids: + if checkin_partner.document_expedition_date: + document_expedition_date = ( + checkin_partner.document_expedition_date.strftime("%d/%m/%Y") + ) + if checkin_partner.birthdate_date: + birthdate_date = checkin_partner.birthdate_date.strftime("%d/%m/%Y") checkin_partners.append( PmsCheckinPartnerInfo( id=checkin_partner.id, reservationId=checkin_partner.reservation_id.id, name=checkin_partner.name if checkin_partner.name else "", + firstname=checkin_partner.firstname + if checkin_partner.firstname + else "", + lastname=checkin_partner.lastname + if checkin_partner.lastname + else "", + lastname2=checkin_partner.lastname2 + if checkin_partner.lastname2 + else "", email=checkin_partner.email if checkin_partner.email else "", mobile=checkin_partner.mobile if checkin_partner.mobile else "", - nationality=checkin_partner.nationality_id.name - if checkin_partner.nationality_id - else "", documentType=checkin_partner.document_type.name - if checkin_partner.document_type + if checkin_partner.document_type.name else "", documentNumber=checkin_partner.document_number if checkin_partner.document_number else "", + documentExpeditionDate=document_expedition_date + if checkin_partner.document_expedition_date + else "", + documentSupportNumber=checkin_partner.support_number + if checkin_partner.support_number + else "", gender=checkin_partner.gender if checkin_partner.gender else "", - state=dict( - checkin_partner.fields_get(["state"])["state"]["selection"] - )[checkin_partner.state], + birthdate=birthdate_date + if checkin_partner.birthdate_date + else "", + residenceStreet=checkin_partner.residence_street + if checkin_partner.residence_street + else "", + zip=checkin_partner.residence_zip + if checkin_partner.residence_zip + else "", + residenceCity=checkin_partner.residence_city + if checkin_partner.residence_city + else "", + nationality=checkin_partner.residence_country_id.name + if checkin_partner.residence_country_id + else "", + countryState=checkin_partner.residence_state_id.name + if checkin_partner.residence_state_id + else "", ) ) return checkin_partners + + @restapi.method( + [ + ( + [ + "//adults/", + ], + "PATCH", + ) + ], + auth="jwt_api_pms", + ) + def update_reservation_adults(self, reservation_id, adults): + reservation_id = self.env["pms.reservation"].browse(reservation_id) + reservation_id.write( + { + "adults": adults, + } + ) + + @restapi.method( + [ + ( + [ + "//children/", + ], + "PATCH", + ) + ], + auth="jwt_api_pms", + ) + def update_reservation_children(self, reservation_id, children): + reservation_id = self.env["pms.reservation"].browse(reservation_id) + reservation_id.write( + { + "children": children, + } + ) + + @restapi.method( + [ + ( + [ + "//segmentation/", + ], + "PATCH", + ) + ], + auth="jwt_api_pms", + ) + def update_segmentation_id(self, reservation_id, segmentation_id): + reservation_id = self.env["pms.reservation"].browse(reservation_id) + reservation_id.write( + { + "segmentation_ids": [segmentation_id], + } + ) + + @restapi.method( + [ + ( + [ + "//checkin_partner/", + ], + "PATCH", + ) + ], + input_param=Datamodel("pms.checkin.partner.info", is_list=False), + auth="jwt_api_pms", + ) + def write_reservation_checkin_partner( + self, reservation_id, checkin_partner_id, pms_checkin_partner_info + ): + checkin_partner = self.env["pms.checkin.partner"].search( + [("id", "=", checkin_partner_id), ("reservation_id", "=", reservation_id)] + ) + if checkin_partner: + vals = dict() + if pms_checkin_partner_info.firstname: + vals.update({"firstname": pms_checkin_partner_info.firstname}) + if pms_checkin_partner_info.lastname: + vals.update({"lastname": pms_checkin_partner_info.lastname}) + if pms_checkin_partner_info.lastname2: + vals.update({"lastname2": pms_checkin_partner_info.lastname2}) + if pms_checkin_partner_info.email: + vals.update({"email": pms_checkin_partner_info.email}) + if pms_checkin_partner_info.mobile: + vals.update({"mobile": pms_checkin_partner_info.mobile}) + if pms_checkin_partner_info.documentType: + document_type = self.env["res.partner.id_category"].search( + [("name", "=", pms_checkin_partner_info.documentType)] + ) + vals.update({"document_type": document_type}) + if pms_checkin_partner_info.documentNumber: + vals.update( + {"document_number": pms_checkin_partner_info.documentNumber} + ) + if pms_checkin_partner_info.documentExpeditionDate: + document_expedition_date = datetime.strptime( + pms_checkin_partner_info.documentExpeditionDate, "%d/%m/%Y" + ) + document_expedition_date = document_expedition_date.strftime("%Y-%m-%d") + vals.update({"document_expedition_date": document_expedition_date}) + if pms_checkin_partner_info.documentSupportNumber: + vals.update( + {"support_number": pms_checkin_partner_info.documentSupportNumber} + ) + if pms_checkin_partner_info.gender: + vals.update({"gender": pms_checkin_partner_info.gender}) + if pms_checkin_partner_info.birthdate: + birthdate = datetime.strptime( + pms_checkin_partner_info.birthdate, "%d/%m/%Y" + ) + birthdate = birthdate.strftime("%Y-%m-%d") + vals.update({"birthdate_date": birthdate}) + if pms_checkin_partner_info.residenceStreet: + vals.update( + {"residence_street": pms_checkin_partner_info.residenceStreet} + ) + if pms_checkin_partner_info.zip: + vals.update({"residence_zip": pms_checkin_partner_info.zip}) + if pms_checkin_partner_info.residenceCity: + vals.update({"residence_city": pms_checkin_partner_info.residenceCity}) + if pms_checkin_partner_info.nationality: + country_id = self.env["res.country"].search( + [("name", "=", pms_checkin_partner_info.nationality)] + ) + vals.update({"residence_country_id": country_id}) + if pms_checkin_partner_info.countryState: + country_state = self.env["res.country.state"].search( + [("name", "=", pms_checkin_partner_info.countryState)] + ) + vals.update({"residence_state_id": country_state}) + checkin_partner.write(vals) diff --git a/pms_api_rest/services/res_city_zip_service.py b/pms_api_rest/services/res_city_zip_service.py new file mode 100644 index 000000000..12efe97be --- /dev/null +++ b/pms_api_rest/services/res_city_zip_service.py @@ -0,0 +1,35 @@ +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_datamodel.restapi import Datamodel +from odoo.addons.component.core import Component + + +class PmsIdCategoriesService(Component): + _inherit = "base.rest.service" + _name = "res.city.zip.services" + _usage = "zip" + _collection = "pms.services" + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + output_param=Datamodel("res.city.zip.info", is_list=True), + auth="jwt_api_pms", + ) + def get_address_data_by_zip(self, res_city_zip): + result_zip_data = [] + ResCityZipInfo = self.env.datamodels["res.city.zip.info"] + for zip_code in self.env["res.city.zip"].search([("name", "=", res_city_zip)]): + result_zip_data.append( + ResCityZipInfo( + cityId=zip_code.city_id.name, + stateId=zip_code.state_id.name, + countryId=zip_code.country_id.name, + ) + ) + return result_zip_data diff --git a/pms_api_rest/services/res_country_services.py b/pms_api_rest/services/res_country_services.py new file mode 100644 index 000000000..6236bc9c8 --- /dev/null +++ b/pms_api_rest/services/res_country_services.py @@ -0,0 +1,60 @@ +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_datamodel.restapi import Datamodel +from odoo.addons.component.core import Component + + +class ResCountryService(Component): + _inherit = "base.rest.service" + _name = "res.country.services" + _usage = "countries" + _collection = "pms.services" + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + output_param=Datamodel("res.country.info", is_list=True), + auth="jwt_api_pms", + ) + def get_countries(self): + result_countries = [] + ResCountriesInfo = self.env.datamodels["res.country.info"] + for country in self.env["res.country"].search([]): + result_countries.append( + ResCountriesInfo( + id=country.id, + name=country.name, + ) + ) + return result_countries + + @restapi.method( + [ + ( + [ + "//country_states", + ], + "GET", + ) + ], + output_param=Datamodel("res.country_state.info", is_list=True), + auth="jwt_api_pms", + ) + def get_states(self, country_id): + result_country_states = [] + ResCountryStatesInfo = self.env.datamodels["res.country_state.info"] + for country_states in self.env["res.country.state"].search( + [("country_id", "=", country_id)] + ): + result_country_states.append( + ResCountryStatesInfo( + id=country_states.id, + name=country_states.name, + ) + ) + return result_country_states diff --git a/pms_api_rest/services/res_partner_category_services.py b/pms_api_rest/services/res_partner_category_services.py new file mode 100644 index 000000000..8b99521fd --- /dev/null +++ b/pms_api_rest/services/res_partner_category_services.py @@ -0,0 +1,37 @@ +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_datamodel.restapi import Datamodel +from odoo.addons.component.core import Component + + +class PmsIdCategoriesService(Component): + _inherit = "base.rest.service" + _name = "res.partner.category.services" + _usage = "segmentations" + _collection = "pms.services" + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + output_param=Datamodel("res.partner.category.info", is_list=True), + auth="jwt_api_pms", + ) + def get_parent_segmentation_ids(self): + result_segmentation_ids = [] + ResPartnerCategoryInfo = self.env.datamodels["res.partner.category.info"] + for segmentation_id in self.env["res.partner.category"].search([]): + result_segmentation_ids.append( + ResPartnerCategoryInfo( + id=segmentation_id.id, + name=segmentation_id.name, + parentId=segmentation_id.parent_id.id + if segmentation_id.parent_id.id + else 0, + ) + ) + return result_segmentation_ids