diff --git a/pms_api_rest/datamodels/__init__.py b/pms_api_rest/datamodels/__init__.py index b0bec9988..334acc6b8 100644 --- a/pms_api_rest/datamodels/__init__.py +++ b/pms_api_rest/datamodels/__init__.py @@ -39,3 +39,5 @@ from . import pms_board_service from . import pms_board_service_line from . import pms_product +from . import pms_sale_channel +from . import pms_cancelation_rule diff --git a/pms_api_rest/datamodels/pms_cancelation_rule.py b/pms_api_rest/datamodels/pms_cancelation_rule.py new file mode 100644 index 000000000..48e4b364a --- /dev/null +++ b/pms_api_rest/datamodels/pms_cancelation_rule.py @@ -0,0 +1,14 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsCancelationRuleSearchParam(Datamodel): + _name = "pms.cancelation.rule.search.param" + pricelistId = fields.Integer(required=False, allow_none=True) + pmsPropertyId = fields.String(required=False, allow_none=True) + +class PmsCancelationRuleInfo(Datamodel): + _name = "pms.cancelation.rule.info" + id = fields.Integer(required=True, allow_none=False) + name = fields.String(required=True, allow_none=False) diff --git a/pms_api_rest/datamodels/pms_reservation.py b/pms_api_rest/datamodels/pms_reservation.py index d305f62ef..5a0903abf 100644 --- a/pms_api_rest/datamodels/pms_reservation.py +++ b/pms_api_rest/datamodels/pms_reservation.py @@ -1,4 +1,3 @@ -from sre_parse import State from marshmallow import fields from odoo.addons.datamodel.core import Datamodel @@ -48,5 +47,5 @@ class PmsReservationInfo(Datamodel): pendingAmount = fields.Float(required=False, allow_none=True) # TODO: Refact - #services = fields.List(fields.Dict(required=False, allow_none=True)) - #messages = fields.List(fields.Dict(required=False, allow_none=True)) + # services = fields.List(fields.Dict(required=False, allow_none=True)) + # messages = fields.List(fields.Dict(required=False, allow_none=True)) diff --git a/pms_api_rest/datamodels/pms_sale_channel.py b/pms_api_rest/datamodels/pms_sale_channel.py new file mode 100644 index 000000000..304a27104 --- /dev/null +++ b/pms_api_rest/datamodels/pms_sale_channel.py @@ -0,0 +1,15 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsSaleChannelSearchParam(Datamodel): + _name = "pms.sale.channel.search.param" + id = fields.Integer(required=False, allow_none=True) + pmsPropertyIds = fields.List(fields.Integer(), required=False) + + +class PmsSaleChannelInfo(Datamodel): + _name = "pms.sale.channel.info" + id = fields.Integer(required=True, allow_none=False) + name = fields.String(required=True, allow_none=False) diff --git a/pms_api_rest/services/__init__.py b/pms_api_rest/services/__init__.py index 5fe03c63f..b85ed8f6b 100644 --- a/pms_api_rest/services/__init__.py +++ b/pms_api_rest/services/__init__.py @@ -25,3 +25,5 @@ from . import pms_board_service_line_service from . import pms_board_service_service from . import pms_product_service +from . import pms_sale_channel_service +from . import pms_cancelation_rule_service diff --git a/pms_api_rest/services/pms_board_service_service.py b/pms_api_rest/services/pms_board_service_service.py index 51a4e5730..9f261e0aa 100644 --- a/pms_api_rest/services/pms_board_service_service.py +++ b/pms_api_rest/services/pms_board_service_service.py @@ -88,7 +88,7 @@ class PmsBoardServiceService(Component): amount=board_service.amount, ) else: - raise MissingError(_("Amenity Type not found")) + raise MissingError(_("Board Service not found")) @restapi.method( [ diff --git a/pms_api_rest/services/pms_calendar_service.py b/pms_api_rest/services/pms_calendar_service.py index 2b44deeec..c0014d627 100644 --- a/pms_api_rest/services/pms_calendar_service.py +++ b/pms_api_rest/services/pms_calendar_service.py @@ -162,9 +162,7 @@ class PmsCalendarService(Component): date_from = datetime.strptime( pms_calendar_search_param.dateFrom, "%Y-%m-%d" ).date() - date_to = datetime.strptime( - pms_calendar_search_param.dateTo, "%Y-%m-%d" - ).date() + date_to = datetime.strptime(pms_calendar_search_param.dateTo, "%Y-%m-%d").date() result = [] PmsCalendarDailyInvoicing = self.env.datamodels["pms.calendar.daily.invoicing"] @@ -203,9 +201,7 @@ class PmsCalendarService(Component): date_from = datetime.strptime( pms_calendar_search_param.dateFrom, "%Y-%m-%d" ).date() - date_to = datetime.strptime( - pms_calendar_search_param.dateTo, "%Y-%m-%d" - ).date() + date_to = datetime.strptime(pms_calendar_search_param.dateTo, "%Y-%m-%d").date() result = [] PmsCalendarFreeDailyRoomsByType = self.env.datamodels[ "pms.calendar.free.daily.rooms.by.type" @@ -276,9 +272,7 @@ class PmsCalendarService(Component): date_from = datetime.strptime( pms_calendar_search_param.dateFrom, "%Y-%m-%d" ).date() - date_to = datetime.strptime( - pms_calendar_search_param.dateTo, "%Y-%m-%d" - ).date() + date_to = datetime.strptime(pms_calendar_search_param.dateTo, "%Y-%m-%d").date() result = [] for day in ( date_from + timedelta(d) for d in range((date_to - date_from).days + 1) diff --git a/pms_api_rest/services/pms_cancelation_rule_service.py b/pms_api_rest/services/pms_cancelation_rule_service.py new file mode 100644 index 000000000..234b79a87 --- /dev/null +++ b/pms_api_rest/services/pms_cancelation_rule_service.py @@ -0,0 +1,73 @@ +from odoo import _ +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 PmsCancelationRuleService(Component): + _inherit = "base.rest.service" + _name = "pms.cancelation.rule.service" + _usage = "cancelation-rule" + _collection = "pms.services" + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + input_param=Datamodel("pms.cancelation.rule.search.param"), + output_param=Datamodel("pms.cancelation.rule.info", is_list=True), + auth="jwt_api_pms", + ) + def get_cancelation_rules(self, cancelation_rule_search_param): + domain = [] + + if cancelation_rule_search_param.pricelistId: + domain.append(("pricelist_ids", "in", cancelation_rule_search_param.pricelistId)) + if cancelation_rule_search_param.pmsPropertyId: + domain.append(("pms_property_ids", "in", cancelation_rule_search_param.pmsPropertyId)) + + result_cancelation_rules = [] + PmsCancelationRuleInfo = self.env.datamodels["pms.cancelation.rule.info"] + for cancelation_rule in self.env["pms.cancelation.rule"].search( + domain, + ): + result_cancelation_rules.append( + PmsCancelationRuleInfo( + id=cancelation_rule.id, + name=cancelation_rule.name, + ) + ) + return result_cancelation_rules + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + output_param=Datamodel("pms.cancelation.rule.info", is_list=False), + auth="jwt_api_pms", + ) + def get_cancelation_rule(self, cancelation_rule_id): + cancelation_rule = self.env["pms.cancelation.rule"].search( + [("id", "=", cancelation_rule_id)] + ) + if cancelation_rule: + PmsCancelationRuleInfo = self.env.datamodels["pms.cancelation.rule.info"] + return PmsCancelationRuleInfo( + id=cancelation_rule.id, + name=cancelation_rule.name, + ) + else: + raise MissingError(_("Cancelation Rule not found")) + diff --git a/pms_api_rest/services/pms_folio_service.py b/pms_api_rest/services/pms_folio_service.py index d3d0eae71..06e0cedbc 100644 --- a/pms_api_rest/services/pms_folio_service.py +++ b/pms_api_rest/services/pms_folio_service.py @@ -29,9 +29,7 @@ class PmsFolioService(Component): def get_folios(self, folio_search_param): domain_fields = list() - domain_fields.append( - ("pms_property_id", "=", folio_search_param.pmsPropertyId) - ) + domain_fields.append(("pms_property_id", "=", folio_search_param.pmsPropertyId)) if folio_search_param.dateTo and folio_search_param.dateFrom: reservation_lines = ( @@ -75,7 +73,6 @@ class PmsFolioService(Component): for folio in self.env["pms.folio"].search( [("id", "in", reservations_result)], ): - reservations = [] for reservation in folio.reservation_ids: reservation_lines = [] for reservation_line in reservation.reservation_line_ids: @@ -90,8 +87,6 @@ class PmsFolioService(Component): } ) - - result_folios.append( PmsFolioInfo( id=folio.id, @@ -205,8 +200,12 @@ class PmsFolioService(Component): boardServiceId=reservation.board_service_room_id.id or None, saleChannelId=reservation.channel_type_id.id or None, agencyId=reservation.agency_id.id or None, - checkin=datetime.combine(reservation.checkin, datetime.min.time()).isoformat(), - checkout=datetime.combine(reservation.checkout, datetime.min.time()).isoformat(), + checkin=datetime.combine( + reservation.checkin, datetime.min.time() + ).isoformat(), + checkout=datetime.combine( + reservation.checkout, datetime.min.time() + ).isoformat(), arrivalHour=reservation.arrival_hour, departureHour=reservation.departure_hour, roomTypeId=reservation.room_type_id.id or None, @@ -221,9 +220,14 @@ class PmsFolioService(Component): allowedCheckout=reservation.allowed_checkout, isSplitted=reservation.splitted, pendingCheckinData=reservation.pending_checkin_data, - createDate=datetime.combine(reservation.create_date , datetime.min.time()).isoformat(), - segmentationId=reservation.segmentation_ids[0].id if reservation.segmentation_ids else None, - cancellationPolicyId=reservation.pricelist_id.cancelation_rule_id.id or None, + createDate=datetime.combine( + reservation.create_date, datetime.min.time() + ).isoformat(), + segmentationId=reservation.segmentation_ids[0].id + if reservation.segmentation_ids + else None, + cancellationPolicyId=reservation.pricelist_id.cancelation_rule_id.id + or None, toAssign=reservation.to_assign, reservationType=reservation.reservation_type, priceTotal=reservation.price_room_services_set, @@ -238,7 +242,6 @@ class PmsFolioService(Component): return reservations - # @restapi.method( # [ # ( diff --git a/pms_api_rest/services/pms_sale_channel_service.py b/pms_api_rest/services/pms_sale_channel_service.py new file mode 100644 index 000000000..73ba38b18 --- /dev/null +++ b/pms_api_rest/services/pms_sale_channel_service.py @@ -0,0 +1,89 @@ +from odoo import _ +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 PmsSaleChannelService(Component): + _inherit = "base.rest.service" + _name = "pms.sale.channel.service" + _usage = "sale-channel" + _collection = "pms.services" + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + input_param=Datamodel("pms.sale.channel.search.param"), + output_param=Datamodel("pms.sale.channel.info", is_list=True), + auth="jwt_api_pms", + ) + def get_sale_channels(self, sale_channel_search_param): + sale_channels_all_properties = self.env["pms.sale.channel"].search( + [("pms_property_ids", "=", False)] + ) + if sale_channel_search_param.pmsPropertyIds: + sale_channels = set() + for index, prop in enumerate(sale_channel_search_param.pmsPropertyIds): + sale_channels_with_query_property = self.env["pms.sale.channel"].search( + [("pms_property_ids", "=", prop)] + ) + if index == 0: + sale_channels = set(sale_channels_with_query_property.ids) + else: + sale_channels = sale_channels.intersection( + set(sale_channels_with_query_property.ids) + ) + sale_channels_total = list( + set(list(sale_channels) + sale_channels_all_properties.ids) + ) + else: + sale_channels_total = list(sale_channels_all_properties.ids) + domain = [ + ("id", "in", sale_channels_total), + ] + + result_sale_channels = [] + PmsSaleChannelInfo = self.env.datamodels["pms.sale.channel.info"] + for sale_channel in self.env["pms.sale.channel"].search( + domain, + ): + result_sale_channels.append( + PmsSaleChannelInfo( + id=sale_channel.id, + name=sale_channel.name, + ) + ) + return result_sale_channels + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + output_param=Datamodel("pms.sale.channel.info", is_list=False), + auth="jwt_api_pms", + ) + def get_sale_channel(self, sale_channel_id): + sale_channel = self.env["pms.sale.channel"].search( + [("id", "=", sale_channel_id)] + ) + if sale_channel: + PmsSaleChannelInfo = self.env.datamodels["pms.sale.channel.info"] + return PmsSaleChannelInfo( + id=sale_channel.id, + name=sale_channel.name, + ) + else: + raise MissingError(_("Sale Channel not found"))