From d804461efefe5b7951f60eb7a71d85965f0123f0 Mon Sep 17 00:00:00 2001 From: braisab Date: Wed, 11 May 2022 17:23:35 +0200 Subject: [PATCH] [IMP]pms_api_rest: added availability plan service and datamodel --- pms_api_rest/datamodels/__init__.py | 3 +- .../datamodels/pms_availability_plan.py | 10 ++ .../datamodels/pms_availability_plan_rule.py | 25 +++ pms_api_rest/services/__init__.py | 1 + .../services/pms_availability_plan_service.py | 151 ++++++++++++++++++ 5 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 pms_api_rest/datamodels/pms_availability_plan.py create mode 100644 pms_api_rest/datamodels/pms_availability_plan_rule.py create mode 100644 pms_api_rest/services/pms_availability_plan_service.py diff --git a/pms_api_rest/datamodels/__init__.py b/pms_api_rest/datamodels/__init__.py index 9befd935e..ecb00454a 100644 --- a/pms_api_rest/datamodels/__init__.py +++ b/pms_api_rest/datamodels/__init__.py @@ -18,5 +18,6 @@ from . import pms_user from . import pms_pricelist from . import pms_pricelist_item - +from . import pms_availability_plan +from . import pms_availability_plan_rule from . import pms_search_param diff --git a/pms_api_rest/datamodels/pms_availability_plan.py b/pms_api_rest/datamodels/pms_availability_plan.py new file mode 100644 index 000000000..9e5cd2fb0 --- /dev/null +++ b/pms_api_rest/datamodels/pms_availability_plan.py @@ -0,0 +1,10 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsAvailabilityPlanInfo(Datamodel): + _name = "pms.availability.plan.info" + id = fields.Integer(required=False, allow_none=True) + name = fields.String(required=False, allow_none=True) + pms_property_ids = fields.List(fields.Integer(required=False, allow_none=True)) diff --git a/pms_api_rest/datamodels/pms_availability_plan_rule.py b/pms_api_rest/datamodels/pms_availability_plan_rule.py new file mode 100644 index 000000000..449693858 --- /dev/null +++ b/pms_api_rest/datamodels/pms_availability_plan_rule.py @@ -0,0 +1,25 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsAvailabilityPlanRuleSearchParam(Datamodel): + _name = "pms.availability.plan.rule.search.param" + date_from = fields.String(required=True, allow_none=False) + date_to = fields.String(required=True, allow_none=False) + pms_property_id = fields.Integer(required=True, allow_none=False) + + +class PmsAvailabilityPlanRuleInfo(Datamodel): + _name = "pms.availability.plan.rule.info" + availabilityRuleId = fields.Integer(required=False, allow_none=True) + minStay = fields.Integer(required=False, allow_none=True) + minStayArrival = fields.Integer(required=False, allow_none=True) + maxStay = fields.Integer(required=False, allow_none=True) + maxStayArrival = fields.Integer(required=False, allow_none=True) + closed = fields.Boolean(required=False, allow_none=True) + closedDeparture = fields.Boolean(required=False, allow_none=True) + closedArrival = fields.Boolean(required=False, allow_none=True) + roomTypeId = fields.Integer(required=False, allow_none=True) + date = fields.String(required=False, allow_none=True) + quota = fields.Integer(required=False, allow_none=True) diff --git a/pms_api_rest/services/__init__.py b/pms_api_rest/services/__init__.py index f6249f90a..2763228ea 100644 --- a/pms_api_rest/services/__init__.py +++ b/pms_api_rest/services/__init__.py @@ -8,3 +8,4 @@ from . import pms_reservation_service from . import pms_property_service from . import pms_login_service from . import pms_pricelist_service +from . import pms_availability_plan_service diff --git a/pms_api_rest/services/pms_availability_plan_service.py b/pms_api_rest/services/pms_availability_plan_service.py new file mode 100644 index 000000000..20d867939 --- /dev/null +++ b/pms_api_rest/services/pms_availability_plan_service.py @@ -0,0 +1,151 @@ +from datetime import datetime, timedelta + +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 PmsAvailabilityPlanService(Component): + _inherit = "base.rest.service" + _name = "pms.availability.plan.service" + _usage = "availability-plans" + _collection = "pms.services" + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + input_param=Datamodel("pms.search.param", is_list=False), + output_param=Datamodel("pms.availability.plan.info", is_list=True), + auth="jwt_api_pms", + ) + def get_availability_plans(self, pms_search_param, **args): + + availability_plans_all_properties = self.env["pms.availability.plan"].search( + [("pms_property_ids", "=", False)] + ) + availabilities = set() + if pms_search_param.pms_property_ids: + for index, prop in enumerate(pms_search_param.pms_property_ids): + availabilities_with_query_property = self.env[ + "pms.availability.plan" + ].search([("pms_property_ids", "=", prop)]) + if index == 0: + availabilities = set(availabilities_with_query_property.ids) + else: + availabilities = availabilities.intersection( + set(availabilities_with_query_property.ids) + ) + availabilities_total = list( + set(list(availabilities) + availability_plans_all_properties.ids) + ) + else: + availabilities_total = list(availability_plans_all_properties.ids) + domain = [ + ("id", "in", availabilities_total), + ] + + PmsAvialabilityPlanInfo = self.env.datamodels["pms.availability.plan.info"] + result_availabilities = [] + for availability in self.env["pms.availability.plan"].search(domain): + result_availabilities.append( + PmsAvialabilityPlanInfo( + id=availability.id, + name=availability.name, + pms_property_ids=availability.pms_property_ids.mapped("id"), + ) + ) + return result_availabilities + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + input_param=Datamodel("pms.availability.plan.rule.search.param", is_list=False), + output_param=Datamodel("pms.availability.plan.rule.info", is_list=True), + auth="jwt_api_pms", + ) + def get_availability_plan_rules( + self, availability_plan_id, availability_plan_rule_search_param + ): + result = [] + record_availability_plan_id = self.env["pms.availability.plan"].browse( + availability_plan_id + ) + if not record_availability_plan_id: + raise MissingError + PmsAvailabilityPlanInfo = self.env.datamodels["pms.availability.plan.rule.info"] + rooms = self.env["pms.room"].search( + [ + ( + "pms_property_id", + "=", + availability_plan_rule_search_param.pms_property_id, + ) + ] + ) + date_from = datetime.strptime( + availability_plan_rule_search_param.date_from, "%Y-%m-%d" + ).date() + date_to = datetime.strptime( + availability_plan_rule_search_param.date_to, "%Y-%m-%d" + ).date() + + for date in ( + date_from + timedelta(d) for d in range((date_to - date_from).days + 1) + ): + for room_type in self.env["pms.room.type"].search( + [("id", "in", rooms.mapped("room_type_id").ids)] + ): + rule = self.env["pms.availability.plan.rule"].search( + [ + ("date", "=", date), + ( + "availability_plan_id", + "=", + record_availability_plan_id.id, + ), + ("room_type_id", "=", room_type.id), + ] + ) + if rule: + availability_plan_rule_info = PmsAvailabilityPlanInfo( + roomTypeId=room_type.id, + date=str( + datetime.combine(date, datetime.min.time()).isoformat() + ), + ) + + if rule: + + availability_plan_rule_info.availabilityRuleId = rule.id + availability_plan_rule_info.minStay = rule.min_stay + availability_plan_rule_info.minStayArrival = ( + rule.min_stay_arrival + ) + availability_plan_rule_info.maxStay = rule.max_stay + availability_plan_rule_info.maxStayArrival = ( + rule.max_stay_arrival + ) + availability_plan_rule_info.closed = rule.closed + availability_plan_rule_info.closedDeparture = ( + rule.closed_departure + ) + availability_plan_rule_info.closedArrival = rule.closed_arrival + availability_plan_rule_info.quota = rule.quota + + result.append(availability_plan_rule_info) + + return result