mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[IMP] pms-api-rest: booking engine folio service & room closure reasons
This commit is contained in:
committed by
Darío Lodeiros
parent
046d26ade4
commit
73d1a6dc87
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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))
|
||||
|
||||
12
pms_api_rest/datamodels/pms_room_closure_reason.py
Normal file
12
pms_api_rest/datamodels/pms_room_closure_reason.py
Normal 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)
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
42
pms_api_rest/services/pms_room_closure_reason_service.py
Normal file
42
pms_api_rest/services/pms_room_closure_reason_service.py
Normal 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
|
||||
@@ -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 (
|
||||
|
||||
Reference in New Issue
Block a user