diff --git a/pms_api_rest/datamodels/__init__.py b/pms_api_rest/datamodels/__init__.py index 4d649c170..52b777ba0 100644 --- a/pms_api_rest/datamodels/__init__.py +++ b/pms_api_rest/datamodels/__init__.py @@ -49,3 +49,5 @@ from . import pms_service_line from . import res_users from . import res_lang from . import pms_account_payment_term + +from . import pms_room_closure_reason diff --git a/pms_api_rest/datamodels/pms_folio.py b/pms_api_rest/datamodels/pms_folio.py index 8d20019ad..1e887cf1d 100644 --- a/pms_api_rest/datamodels/pms_folio.py +++ b/pms_api_rest/datamodels/pms_folio.py @@ -1,11 +1,11 @@ from marshmallow import fields from odoo.addons.datamodel.core import Datamodel +from odoo.addons.datamodel.fields import NestedModel class PmsFolioSearchParam(Datamodel): _name = "pms.folio.search.param" - pmsPropertyId = fields.Integer(required=True, allow_none=True) dateFrom = fields.String(required=False, allow_none=True) dateTo = fields.String(required=False, allow_none=True) @@ -24,6 +24,14 @@ class PmsFolioInfo(Datamodel): reservationType = fields.String(required=False, allow_none=True) pendingAmount = fields.Float(required=False, allow_none=True) lastCheckout = fields.String(required=False, allow_none=True) + pmsPropertyId = fields.Integer(required=False, allow_none=False) + partnerId = fields.Integer(required=False, allow_none=False) + reservations = fields.List(NestedModel("pms.reservation.info"), required=False, allow_none=False) + pricelistId = fields.Integer(required=False, allow_none=False) + saleChannelId = fields.Integer(required=False, allow_none=False) + agency = fields.Integer(required=False, allow_none=False) + externalReference = fields.String(required=False, allow_none=True) + closureReasonId = fields.Integer(required=False, allow_none=True) class PmsFolioShortInfo(Datamodel): diff --git a/pms_api_rest/datamodels/pms_reservation.py b/pms_api_rest/datamodels/pms_reservation.py index 2bf69abe3..1ffeadf20 100644 --- a/pms_api_rest/datamodels/pms_reservation.py +++ b/pms_api_rest/datamodels/pms_reservation.py @@ -67,6 +67,8 @@ class PmsReservationInfo(Datamodel): priceOnlyRoom = fields.Float(required=False, allow_none=True) reservationLines = fields.List(NestedModel("pms.reservation.line.info")) + services = fields.List(NestedModel("pms.service.info"), required=False, allow_none=True) + # TODO: Refact # messages = fields.List(fields.Dict(required=False, allow_none=True)) diff --git a/pms_api_rest/datamodels/pms_room_closure_reason.py b/pms_api_rest/datamodels/pms_room_closure_reason.py new file mode 100644 index 000000000..a93355d64 --- /dev/null +++ b/pms_api_rest/datamodels/pms_room_closure_reason.py @@ -0,0 +1,12 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + +class PmsRoomClosureReasonInfo(Datamodel): + _name = "pms.room.closure.reason.info" + id = fields.Integer(required=False, allow_none=True) + name = fields.String(required=False, allow_none=True) + description = fields.String(required=False, allow_none=True) + + + diff --git a/pms_api_rest/services/__init__.py b/pms_api_rest/services/__init__.py index 6017095d1..2aa929596 100644 --- a/pms_api_rest/services/__init__.py +++ b/pms_api_rest/services/__init__.py @@ -32,6 +32,7 @@ from . import pms_cancelation_rule_service from . import pms_agency_service from . import pms_service_service from . import pms_service_line_service +from . import pms_room_closure_reason_service from . import res_lang_service from . import pms_account_payment_terms_service diff --git a/pms_api_rest/services/pms_folio_service.py b/pms_api_rest/services/pms_folio_service.py index d50b00869..fd16c4bf9 100644 --- a/pms_api_rest/services/pms_folio_service.py +++ b/pms_api_rest/services/pms_folio_service.py @@ -327,29 +327,70 @@ class PmsFolioService(Component): 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 + @restapi.method( + [ + ( + [ + "/", + ], + "POST", + ) + ], + input_param=Datamodel("pms.folio.info", is_list=False), + auth="jwt_api_pms", + ) + def create_folio(self, pms_folio_info): + if pms_folio_info.reservationType == 'out': + vals = { + "pms_property_id": pms_folio_info.pmsPropertyId, + "reservation_type": pms_folio_info.reservationType, + "closure_reason_id": pms_folio_info.closureReasonId, + } + else: + vals = { + "pms_property_id": pms_folio_info.pmsPropertyId, + "partner_id": pms_folio_info.partnerId, + "channel_type_id": pms_folio_info.saleChannelId, + "agency_id": pms_folio_info.agency, + "reservation_type": pms_folio_info.reservationType, + } + folio = self.env["pms.folio"].create(vals) + for reservation in pms_folio_info.reservations: + vals = { + "folio_id": folio.id, + "room_type_id": reservation.roomTypeId, + "checkin": reservation.checkin, + "checkout": reservation.checkout, + "pms_property_id": pms_folio_info.pmsPropertyId, + "pricelist_id": pms_folio_info.pricelistId, + "external_reference": pms_folio_info.externalReference, + "board_service_room_id": reservation.boardServiceId, + "preferred_room_id": reservation.preferredRoomId, + "adults": reservation.adults, + "reservation_type": pms_folio_info.reservationType, + "children": reservation.children, + } + reservation_record = self.env['pms.reservation'].create(vals) + if reservation.services: + for service in reservation.services: + vals = { + "product_id": service.productId, + "reservation_id": reservation_record.id, + "is_board_service": False, + "service_line_ids": [ + ( + 0, + False, + { + "date": line.date, + "price_unit": line.priceUnit, + "discount": line.discount or 0, + "day_qty": line.quantity, + }, + ) + for line in service.serviceLines + ] + } + self.env["pms.service"].create(vals) + + return folio.id diff --git a/pms_api_rest/services/pms_room_closure_reason_service.py b/pms_api_rest/services/pms_room_closure_reason_service.py new file mode 100644 index 000000000..89ccd1a7b --- /dev/null +++ b/pms_api_rest/services/pms_room_closure_reason_service.py @@ -0,0 +1,42 @@ +from datetime import datetime, timedelta + +from odoo import _, fields +from odoo.exceptions import MissingError +from odoo.osv import expression + +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_datamodel.restapi import Datamodel +from odoo.addons.component.core import Component + + +class PmsClosureReasonService(Component): + _inherit = "base.rest.service" + _name = "pms.closure.reason.service" + _usage = "room-closure-reasons" + _collection = "pms.services" + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + output_param=Datamodel("pms.room.closure.reason.info", is_list=True), + auth="jwt_api_pms", + ) + def get_closure_reasons(self): + closure_reasons = [] + PmsRoomClosureReasonInfo = self.env.datamodels["pms.room.closure.reason.info"] + for cl in self.env['room.closure.reason'].search([]): + closure_reasons.append( + PmsRoomClosureReasonInfo( + id=cl.id, + name=cl.name, + description=cl.description + + ) + ) + return closure_reasons diff --git a/pms_api_rest/services/pms_room_service.py b/pms_api_rest/services/pms_room_service.py index 4237541f5..db40ff67e 100644 --- a/pms_api_rest/services/pms_room_service.py +++ b/pms_api_rest/services/pms_room_service.py @@ -37,7 +37,6 @@ class PmsRoomService(Component): room_search_param.availabilityFrom and room_search_param.availabilityTo and room_search_param.pmsPropertyId - and room_search_param.pricelistId ): date_from = datetime.strptime( room_search_param.availabilityFrom, "%Y-%m-%d" @@ -48,16 +47,27 @@ class PmsRoomService(Component): pms_property = self.env["pms.property"].browse( room_search_param.pmsPropertyId ) - pms_property = pms_property.with_context( - checkin=date_from, - checkout=date_to, - room_type_id=False, # Allows to choose any available room - current_lines=room_search_param.currentLines, - pricelist_id=room_search_param.pricelistId, - real_avail=True, - ) + if not room_search_param.pricelistId: + pms_property = self.env["pms.property"].browse( + room_search_param.pmsPropertyId + ) + pms_property = pms_property.with_context( + checkin=date_from, + checkout=date_to, + room_type_id=False, # Allows to choose any available room + current_lines=room_search_param.currentLines, + real_avail=True, + ) + else: + pms_property = pms_property.with_context( + checkin=date_from, + checkout=date_to, + room_type_id=False, # Allows to choose any available room + current_lines=room_search_param.currentLines, + pricelist_id=room_search_param.pricelistId, + real_avail=True, + ) domain.append(("id", "in", pms_property.free_room_ids.ids)) - result_rooms = [] PmsRoomInfo = self.env.datamodels["pms.room.info"] for room in (