From 7074bb129d52c87b2ec7bd9098663dfe96b0892f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Lodeiros?= Date: Sat, 24 Dec 2022 16:27:44 +0100 Subject: [PATCH] [ADD]pms_api_rest: avails service and datamodel --- pms_api_rest/datamodels/pms_avail.py | 20 +++++++ pms_api_rest/services/pms_avail_service.py | 65 ++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 pms_api_rest/datamodels/pms_avail.py create mode 100644 pms_api_rest/services/pms_avail_service.py diff --git a/pms_api_rest/datamodels/pms_avail.py b/pms_api_rest/datamodels/pms_avail.py new file mode 100644 index 000000000..433740050 --- /dev/null +++ b/pms_api_rest/datamodels/pms_avail.py @@ -0,0 +1,20 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsAvailSearchParam(Datamodel): + _name = "pms.avail.search.param" + availabilityFrom = fields.String(required=True, allow_none=True) + availabilityTo = fields.String(required=True, allow_none=True) + pmsPropertyId = fields.Integer(required=True, allow_none=True) + pricelistId = fields.Integer(required=False, allow_none=True) + roomTypeId = fields.Integer(required=False, allow_none=True) + realAvail = fields.Boolean(required=False, allow_none=True) + currentLines = fields.List(fields.Integer(), required=False, allow_none=False) + + +class PmsAvailInfo(Datamodel): + _name = "pms.avail.info" + date = fields.String(required=True, allow_none=False) + roomIds = fields.List(fields.Integer, required=False, allow_none=True) diff --git a/pms_api_rest/services/pms_avail_service.py b/pms_api_rest/services/pms_avail_service.py new file mode 100644 index 000000000..ec10ca4e1 --- /dev/null +++ b/pms_api_rest/services/pms_avail_service.py @@ -0,0 +1,65 @@ +from datetime import datetime, timedelta + +from odoo import _, fields +from odoo.exceptions import MissingError + +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_datamodel.restapi import Datamodel +from odoo.addons.component.core import Component + + +class PmsAvailService(Component): + _inherit = "base.rest.service" + _name = "pms.avail.service" + _usage = "avails" + _collection = "pms.services" + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + input_param=Datamodel("pms.avail.search.param"), + output_param=Datamodel("pms.avail.info", is_list=True), + auth="jwt_api_pms", + ) + def get_avails(self, avails_search_param): + if not ( + avails_search_param.availabilityFrom + and avails_search_param.availabilityTo + and avails_search_param.pmsPropertyId + ): + raise MissingError(_("Missing required parameters")) + pricelist_id = avails_search_param.pricelistId or False + room_type_id = avails_search_param.roomTypeId or False + pms_property = self.env["pms.property"].browse( + avails_search_param.pmsPropertyId + ) + PmsAvailInfo = self.env.datamodels["pms.avail.info"] + result_avails = [] + date_from = fields.Date.from_string(avails_search_param.availabilityFrom) + date_to = fields.Date.from_string(avails_search_param.availabilityTo) + dates = [ + date_from + timedelta(days=x) + for x in range(0, (date_to - date_from).days + 1) + ] + for item_date in dates: + pms_property = pms_property.with_context( + checkin=item_date, + checkout=item_date + timedelta(days=1), + room_type_id=room_type_id, + current_lines=avails_search_param.currentLines or False, + pricelist_id=pricelist_id, + real_avail=True, + ) + result_avails.append( + PmsAvailInfo( + date=datetime.combine(item_date, datetime.min.time()).isoformat(), + roomIds=pms_property.free_room_ids.ids, + ) + ) + return result_avails