diff --git a/pms_api_rest/datamodels/pms_folio.py b/pms_api_rest/datamodels/pms_folio.py index be173c558..d1de818ac 100644 --- a/pms_api_rest/datamodels/pms_folio.py +++ b/pms_api_rest/datamodels/pms_folio.py @@ -23,7 +23,6 @@ class PmsFolioInfo(Datamodel): agency = fields.String(required=False, allow_none=True) state = fields.String(required=False, allow_none=True) pendingAmount = fields.Float(required=False, allow_none=True) - reservations = fields.List(fields.Dict(required=False, allow_none=True)) salesPerson = fields.String(required=False, allow_none=True) paymentState = fields.String(required=False, allow_none=True) propertyId = fields.Integer(required=False, allow_none=True) diff --git a/pms_api_rest/datamodels/pms_reservation.py b/pms_api_rest/datamodels/pms_reservation.py index 098daf57c..d305f62ef 100644 --- a/pms_api_rest/datamodels/pms_reservation.py +++ b/pms_api_rest/datamodels/pms_reservation.py @@ -1,3 +1,4 @@ +from sre_parse import State from marshmallow import fields from odoo.addons.datamodel.core import Datamodel @@ -6,24 +7,46 @@ from odoo.addons.datamodel.core import Datamodel class PmsReservationInfo(Datamodel): _name = "pms.reservation.info" id = fields.Integer(required=False, allow_none=True) - partner = fields.String(required=False, allow_none=True) name = fields.String(required=False, allow_none=True) - checkin = fields.String(required=False, allow_none=True) - checkout = fields.String(required=False, allow_none=True) - roomTypeId = fields.Integer(required=False, allow_none=True) - roomTypeName = fields.String(required=False, allow_none=True) - preferredRoomName = fields.String(required=False, allow_none=True) - preferredRoomId = fields.Integer(required=False, allow_none=True) - priceTotal = fields.Float(required=False, allow_none=True) - priceOnlyServices = fields.Float(required=False, allow_none=True) - priceOnlyRoom = fields.Float(required=False, allow_none=True) - pricelistName = fields.String(required=False, allow_none=True) - pricelistId = fields.Integer(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)) + folioId = fields.Integer(required=False, allow_none=True) + folioSequence = fields.Integer(required=False, allow_none=True) + partnerName = fields.String(required=False, allow_none=True) pmsPropertyId = fields.Integer(required=False, allow_none=True) boardServiceId = fields.Integer(required=False, allow_none=True) - boardServiceName = fields.String(required=False, allow_none=True) - channelTypeId = fields.Integer(required=False, allow_none=True) + saleChannelId = fields.Integer(required=False, allow_none=True) + agencyId = fields.Integer(required=False, allow_none=True) + + checkin = fields.String(required=False, allow_none=True) + checkout = fields.String(required=False, allow_none=True) + arrivalHour = fields.String(required=False, allow_none=True) + departureHour = fields.String(required=False, allow_none=True) + roomTypeId = fields.Integer(required=False, allow_none=True) + preferredRoomId = fields.Integer(required=False, allow_none=True) + pricelistId = fields.Integer(required=False, allow_none=True) + adults = fields.Integer(required=False, allow_none=True) overbooking = fields.Boolean(required=False, allow_none=True) + externalReference = fields.String(required=False, allow_none=True) + state = fields.String(required=False, allow_none=True) + children = fields.Integer(required=False, allow_none=True) + readyForCheckin = fields.Boolean(required=False, allow_none=True) + allowedCheckout = fields.Boolean(required=False, allow_none=True) + isSplitted = fields.Boolean(required=False, allow_none=True) + pendingCheckinData = fields.Integer(required=False, allow_none=True) + createDate = fields.String(required=False, allow_none=True) + segmentationId = fields.Integer(required=False, allow_none=True) + cancellationPolicyId = fields.Integer(required=False, allow_none=True) + toAssign = fields.Boolean(required=False, allow_none=True) + reservationType = fields.String(required=False, allow_none=True) + + priceTotal = fields.Float(required=False, allow_none=True) + discount = fields.Float(required=False, allow_none=True) + commissionAmount = fields.Float(required=False, allow_none=True) + commissionPercent = fields.Float(required=False, allow_none=True) + priceOnlyServices = fields.Float(required=False, allow_none=True) + priceOnlyRoom = fields.Float(required=False, allow_none=True) + 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)) diff --git a/pms_api_rest/services/pms_folio_service.py b/pms_api_rest/services/pms_folio_service.py index ed6d27d70..d3d0eae71 100644 --- a/pms_api_rest/services/pms_folio_service.py +++ b/pms_api_rest/services/pms_folio_service.py @@ -89,90 +89,9 @@ class PmsFolioService(Component): "roomName": reservation_line.room_id.name, } ) - segmentation_ids = [] - if reservation.segmentation_ids: - for segmentation in reservation.segmentation_ids: - segmentation_ids.append(segmentation.id) - reservations.append( - { - "id": reservation.id, - "name": reservation.name, - "folioSequence": reservation.folio_sequence, - "checkin": datetime.combine( - reservation.checkin, datetime.min.time() - ).isoformat(), - "checkout": datetime.combine( - reservation.checkout, datetime.min.time() - ).isoformat(), - "preferredRoomId": reservation.preferred_room_id.id - if reservation.preferred_room_id - else 0, - "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, - "priceRoomServicesSet": reservation.price_room_services_set, - "discount": reservation.discount, - "commission": reservation.agency_id.default_commission, - "partnerName": reservation.partner_name, - "adults": reservation.adults, - "pricelist": reservation.pricelist_id.name, - "boardService": ( - reservation.board_service_room_id.pms_board_service_id.name - ) - if reservation.board_service_room_id - else "", - "reservationLines": [] - if not reservation_lines - else reservation_lines, - "folioId": reservation.folio_id.id - if reservation.folio_id - else "", - "saleChannel": reservation.channel_type_id.name - if reservation.channel_type_id - else "", - "externalReference": reservation.external_reference - if reservation.external_reference - else "", - "agency": reservation.agency_id.name - if reservation.agency_id - else "", - "agencyImage": reservation.agency_id.image_1024.decode("utf-8") - if reservation.agency_id - else "", - "state": reservation.state if reservation.state else "", - "roomTypeCode": reservation.room_type_id.default_code - if reservation.room_type_id - else "", - "children": reservation.children if reservation.children else 0, - "countServices": len(reservation.service_ids) - if reservation.service_ids - else 0, - "readyForCheckin": reservation.ready_for_checkin, - "allowedCheckout": reservation.allowed_checkout, - "isSplitted": reservation.splitted, - "arrivalHour": reservation.arrival_hour, - "departureHour": reservation.departure_hour, - "pendingCheckinData": reservation.pending_checkin_data, - "createDate": reservation.create_date, - "segmentationId": segmentation_ids[0] - if segmentation_ids - else 0, - "cancellationPolicy": reservation.pricelist_id.cancelation_rule_id.name - if reservation.pricelist_id.cancelation_rule_id.name - else "", - "pendingAmount": reservation.folio_id.pending_amount, - "toAssign": reservation.to_assign, - "reservationType": reservation.reservation_type, - } - ) + + result_folios.append( PmsFolioInfo( id=folio.id, @@ -188,7 +107,6 @@ class PmsFolioService(Component): folio.state ], pendingAmount=folio.pending_amount, - reservations=[] if not reservations else reservations, salesPerson=folio.user_id.name if folio.user_id else "", paymentState=dict( folio.fields_get(["payment_state"])["payment_state"][ @@ -259,25 +177,91 @@ class PmsFolioService(Component): [ ( [ - "/", + "//reservations", ], - "POST", + "GET", ) ], - input_param=Datamodel("pms.reservation.info", is_list=False), + output_param=Datamodel("pms.reservation.info", is_list=True), auth="jwt_api_pms", ) - def create_reservation(self, pms_reservation_info): - reservation = self.env["pms.reservation"].create( - { - "partner_name": pms_reservation_info.partner, - "pms_property_id": pms_reservation_info.pmsPropertyId, - "room_type_id": pms_reservation_info.roomTypeId, - "pricelist_id": pms_reservation_info.pricelistId, - "checkin": pms_reservation_info.checkin, - "checkout": pms_reservation_info.checkout, - "board_service_room_id": pms_reservation_info.boardServiceId, - "channel_type_id": pms_reservation_info.channelTypeId, - } - ) - return reservation.id + def get_folio_reservations(self, folio_id): + folio = self.env["pms.folio"].browse(folio_id) + reservations = [] + PmsReservationInfo = self.env.datamodels["pms.reservation.info"] + if not folio: + pass + else: + if folio.reservation_ids: + for reservation in folio.reservation_ids: + reservations.append( + PmsReservationInfo( + id=reservation.id, + name=reservation.name, + folioId=reservation.folio_id.id, + folioSequence=reservation.folio_sequence, + partnerName=reservation.partner_name, + pmsPropertyId=reservation.pms_property_id.id, + 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(), + arrivalHour=reservation.arrival_hour, + departureHour=reservation.departure_hour, + roomTypeId=reservation.room_type_id.id or None, + preferredRoomId=reservation.preferred_room_id.id or None, + pricelistId=reservation.pricelist_id.id, + adults=reservation.adults, + overbooking=reservation.overbooking, + externalReference=reservation.external_reference or None, + state=reservation.state, + children=reservation.children or None, + readyForCheckin=reservation.ready_for_checkin, + 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, + toAssign=reservation.to_assign, + reservationType=reservation.reservation_type, + priceTotal=reservation.price_room_services_set, + discount=reservation.discount, + commissionAmount=reservation.commission_amount or None, + commissionPercent=reservation.commission_percent or None, + priceOnlyServices=reservation.price_services, + priceOnlyRoom=reservation.price_total, + pendingAmount=reservation.folio_pending_amount, + ) + ) + + return reservations + + + # @restapi.method( + # [ + # ( + # [ + # "/", + # ], + # "POST", + # ) + # ], + # input_param=Datamodel("pms.reservation.info", is_list=False), + # auth="jwt_api_pms", + # ) + # def create_reservation(self, pms_reservation_info): + # reservation = self.env["pms.reservation"].create( + # { + # "partner_name": pms_reservation_info.partner, + # "pms_property_id": pms_reservation_info.pmsPropertyId, + # "room_type_id": pms_reservation_info.roomTypeId, + # "pricelist_id": pms_reservation_info.pricelistId, + # "checkin": pms_reservation_info.checkin, + # "checkout": pms_reservation_info.checkout, + # "board_service_room_id": pms_reservation_info.boardServiceId, + # "channel_type_id": pms_reservation_info.channelTypeId, + # } + # ) + # return reservation.id