diff --git a/pms_api_rest/datamodels/__init__.py b/pms_api_rest/datamodels/__init__.py index 248ce06e5..734e3fee0 100644 --- a/pms_api_rest/datamodels/__init__.py +++ b/pms_api_rest/datamodels/__init__.py @@ -22,3 +22,7 @@ from . import pms_account_journal_info from . import pms_payment_info from . import user_input from . import user_output + +from . import pms_pricelist_info +from . import pms_pricelist_item_search_param +from . import pms_pricelist_item_info diff --git a/pms_api_rest/datamodels/pms_pricelist_info.py b/pms_api_rest/datamodels/pms_pricelist_info.py new file mode 100644 index 000000000..6f2fd1d43 --- /dev/null +++ b/pms_api_rest/datamodels/pms_pricelist_info.py @@ -0,0 +1,10 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsPricelistInfo(Datamodel): + _name = "pms.pricelist.info" + id = fields.Integer(required=False, allow_none=True) + name = fields.String(required=False, allow_none=True) + pms_property_id = fields.Integer(required=False, allow_none=True) diff --git a/pms_api_rest/datamodels/pms_pricelist_item_info.py b/pms_api_rest/datamodels/pms_pricelist_item_info.py new file mode 100644 index 000000000..e52986bf8 --- /dev/null +++ b/pms_api_rest/datamodels/pms_pricelist_item_info.py @@ -0,0 +1,21 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsPricelistItemInfo(Datamodel): + _name = "pms.pricelist.item.info" + pricelist_item_id = fields.Integer(required=False, allow_none=True) + availability_rule_id = fields.Integer(required=False, allow_none=True) + fixed_price = fields.Float(required=False, allow_none=True) + min_stay = fields.Integer(required=False, allow_none=True) + min_stay_arrival = fields.Integer(required=False, allow_none=True) + max_stay = fields.Integer(required=False, allow_none=True) + max_stay_arrival = fields.Integer(required=False, allow_none=True) + closed = fields.Boolean(required=False, allow_none=True) + closed_departure = fields.Boolean(required=False, allow_none=True) + closed_arrival = fields.Boolean(required=False, allow_none=True) + quota = fields.Integer(required=False, allow_none=True) + max_avail = fields.Integer(required=False, allow_none=True) + room_type_id = fields.Integer(required=False, allow_none=True) + date = fields.String(required=False, allow_none=True) diff --git a/pms_api_rest/datamodels/pms_pricelist_item_search_param.py b/pms_api_rest/datamodels/pms_pricelist_item_search_param.py new file mode 100644 index 000000000..33b4bafcc --- /dev/null +++ b/pms_api_rest/datamodels/pms_pricelist_item_search_param.py @@ -0,0 +1,10 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsPricelistItemSearchParam(Datamodel): + _name = "pms.pricelist.item.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) diff --git a/pms_api_rest/services/__init__.py b/pms_api_rest/services/__init__.py index 064c89aae..706570938 100644 --- a/pms_api_rest/services/__init__.py +++ b/pms_api_rest/services/__init__.py @@ -5,8 +5,6 @@ from . import calendar_service from . import partner_services from . import reservation_services -<<<<<<< HEAD from . import property_services -======= from . import login_service ->>>>>>> a4394db3... [REF] pms-api-rest: add controller 4 login +from . import pricelist_service diff --git a/pms_api_rest/services/pricelist_service.py b/pms_api_rest/services/pricelist_service.py new file mode 100644 index 000000000..b0e4785b4 --- /dev/null +++ b/pms_api_rest/services/pricelist_service.py @@ -0,0 +1,142 @@ +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 PmsPricelistService(Component): + _inherit = "base.rest.service" + _name = "pms.pricelist.service" + _usage = "pricelists" + _collection = "pms.services" + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + input_param=Datamodel("pms.pricelist.info", is_list=False), + output_param=Datamodel("pms.pricelist.info", is_list=True), + auth="jwt_api_pms", + ) + def get_pricelists(self, pricelist_info_search_param, **args): + domain = [] + if pricelist_info_search_param.pms_property_id: + domain.append( + ( + "pms_property_ids", + "in", + [pricelist_info_search_param.pms_property_id], + ) + ) + PmsPricelistInfo = self.env.datamodels["pms.pricelist.info"] + result_pricelists = [] + for pricelist in self.env["product.pricelist"].sudo().search(domain): + result_pricelists.append( + PmsPricelistInfo( + id=pricelist.id, + name=pricelist.name, + ) + ) + return result_pricelists + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + input_param=Datamodel("pms.pricelist.item.search.param", is_list=False), + output_param=Datamodel("pms.pricelist.item.info", is_list=True), + auth="jwt_api_pms", + ) + def get_pricelists_items(self, pricelist_id, pricelist_item_search_param): + result = [] + record_pricelist_id = ( + self.env["product.pricelist"].sudo().search([("id", "=", pricelist_id)]) + ) + if not record_pricelist_id: + raise MissingError + PmsPricelistItemInfo = self.env.datamodels["pms.pricelist.item.info"] + rooms = ( + self.env["pms.room"] + .sudo() + .search( + [("pms_property_id", "=", pricelist_item_search_param.pms_property_id)] + ) + ) + for room_type in ( + self.env["pms.room.type"] + .sudo() + .search([("id", "in", rooms.mapped("room_type_id").ids)]) + ): + for item in ( + self.env["product.pricelist.item"] + .sudo() + .search( + [ + ("pricelist_id", "=", pricelist_id), + ("applied_on", "=", "0_product_variant"), + ("product_id", "=", room_type.product_id.id), + ( + "date_start_consumption", + ">=", + pricelist_item_search_param.date_from, + ), + ( + "date_end_consumption", + "<=", + pricelist_item_search_param.date_to, + ), + ] + ) + ): + rule = ( + self.env["pms.availability.plan.rule"] + .sudo() + .search( + [ + ( + "availability_plan_id", + "=", + record_pricelist_id.availability_plan_id.id, + ), + ("date", "=", item.date_start_consumption), + ("date", "=", item.date_end_consumption), + ("room_type_id", "=", room_type.id), + ( + "pms_property_id", + "=", + pricelist_item_search_param.pms_property_id, + ), + ] + ) + ) + rule.ensure_one() + result.append( + PmsPricelistItemInfo( + pricelist_item_id=item.id, + availability_rule_id=rule.id, + room_type_id=room_type.id, + fixed_price=item.fixed_price, + min_stay=rule.min_stay, + min_stay_arrival=rule.min_stay_arrival, + max_stay=rule.max_stay, + max_stay_arrival=rule.max_stay_arrival, + closed=rule.closed, + closed_departure=rule.closed_departure, + closed_arrival=rule.closed_arrival, + quota=rule.quota, + max_avail=rule.max_avail, + date=str(item.date_start_consumption), + ) + ) + return result