[IMP] pms-api-rest: booking engine folio service & room closure reasons

This commit is contained in:
miguelpadin
2022-10-06 10:40:21 +02:00
committed by Darío Lodeiros
parent 046d26ade4
commit 73d1a6dc87
8 changed files with 155 additions and 37 deletions

View File

@@ -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

View File

@@ -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):

View File

@@ -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))

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 (