[IMP]pms_api_rest: Improvement in the handling of requests from external apps through the API

This commit is contained in:
Darío Lodeiros
2024-02-25 11:42:43 +01:00
parent a07aba7188
commit 72ef8c73f0
4 changed files with 55 additions and 42 deletions

View File

@@ -27,12 +27,6 @@ class ResUsers(models.Model):
help="PMS API Client", help="PMS API Client",
) )
pms_api_payment_journal_id = fields.Many2one(
string="Payment Journal",
help="Payment Journal",
comodel_name="account.journal",
)
def _get_default_avail_rule_fields(self): def _get_default_avail_rule_fields(self):
default_avail_rule_fields = self.env["ir.model.fields"].search( default_avail_rule_fields = self.env["ir.model.fields"].search(
[ [

View File

@@ -26,6 +26,7 @@ class PmsBoardServiceService(Component):
auth="jwt_api_pms", auth="jwt_api_pms",
) )
def get_board_services(self, board_services_search_param): def get_board_services(self, board_services_search_param):
external_app = self.env.user.pms_api_client
domain = [] domain = []
if board_services_search_param.name: if board_services_search_param.name:
domain.append(("name", "like", board_services_search_param.name)) domain.append(("name", "like", board_services_search_param.name))
@@ -57,6 +58,25 @@ class PmsBoardServiceService(Component):
), ),
) )
) )
if external_app:
room_type_ids = board_services_search_param.roomTypeId or self.env[
"pms.room"
].search(
[("pms_property_id", "=", board_services_search_param.pmsPropertyId)]
).mapped(
"room_type_id.id"
)
for room_type_id in room_type_ids:
result_board_services.append(
PmsBoardServiceInfo(
id=0,
name="Solo Alojamiento",
roomTypeId=room_type_id,
amount=0,
boardServiceId=0,
productIds=[],
)
)
return result_board_services return result_board_services
@restapi.method( @restapi.method(

View File

@@ -581,7 +581,7 @@ class PmsFolioService(Component):
) )
# flake8:noqa=C901 # flake8:noqa=C901
def create_folio(self, pms_folio_info): def create_folio(self, pms_folio_info):
call_type = self.get_api_client_type() external_app = self.env.user.pms_api_client
if pms_folio_info.reservationType == "out": if pms_folio_info.reservationType == "out":
vals = { vals = {
"pms_property_id": pms_folio_info.pmsPropertyId, "pms_property_id": pms_folio_info.pmsPropertyId,
@@ -652,6 +652,13 @@ class PmsFolioService(Component):
} }
if reservation.reservationLines: if reservation.reservationLines:
vals_lines = [] vals_lines = []
board_day_price = 0
# The service price is included in day price when it is a board service (external api)
if external_app and vals.get("board_service_room_id"):
board = self.env["pms.board.service.room.type"].browse(
vals["board_service_room_id"]
)
board_day_price = board.amount * reservation.adults
for reservationLine in reservation.reservationLines: for reservationLine in reservation.reservationLines:
vals_lines.append( vals_lines.append(
( (
@@ -659,7 +666,7 @@ class PmsFolioService(Component):
0, 0,
{ {
"date": reservationLine.date, "date": reservationLine.date,
"price": reservationLine.price, "price": reservationLine.price - board_day_price,
"discount": reservationLine.discount, "discount": reservationLine.discount,
}, },
) )
@@ -672,10 +679,8 @@ class PmsFolioService(Component):
reservation_record = ( reservation_record = (
self.env["pms.reservation"] self.env["pms.reservation"]
.with_context( .with_context(
skip_compute_service_ids=False skip_compute_service_ids=False if external_app else True,
if call_type == "external_app" force_overbooking=True if external_app else False,
else True,
force_overbooking=True if call_type == "external_app" else False,
) )
.create(vals) .create(vals)
) )
@@ -1423,29 +1428,16 @@ class PmsFolioService(Component):
) )
return message_body return message_body
def get_api_client_type(self):
"""
Returns the type of the call:
- Internal APP: The call is made from the internal vue app
- External APP: The call is made from an external app
"""
# TODO: Set the new roles in API Key users:
# - Channel Manager
# - Booking Engine
# - ...
if self.env.user.pms_api_client:
return "external_app"
return "internal_app"
def get_channel_origin_id(self, sale_channel_id, agency_id): def get_channel_origin_id(self, sale_channel_id, agency_id):
""" """
Returns the channel origin id for the given agency Returns the channel origin id for the given agency
or website channel if not agency is given or website channel if not agency is given
(TODO change by configuration user api in the future) (TODO change by configuration user api in the future)
""" """
external_app = self.env.user.pms_api_client
if sale_channel_id: if sale_channel_id:
return sale_channel_id return sale_channel_id
if not agency_id and self.get_api_client_type() == "external_app": if not agency_id and external_app:
# TODO change by configuration user api in the future # TODO change by configuration user api in the future
return ( return (
self.env["pms.sale.channel"] self.env["pms.sale.channel"]
@@ -1464,7 +1456,8 @@ class PmsFolioService(Component):
""" """
Returns the language for the given language code Returns the language for the given language code
""" """
if self.get_api_client_type() == "internal_app": external_app = self.env.user.pms_api_client
if not external_app:
return lang_code return lang_code
return self.env["res.lang"].search([("iso_code", "=", lang_code)], limit=1).code return self.env["res.lang"].search([("iso_code", "=", lang_code)], limit=1).code
@@ -1478,7 +1471,8 @@ class PmsFolioService(Component):
""" """
board_service = self.env["pms.board.service"].browse(board_service_id) board_service = self.env["pms.board.service"].browse(board_service_id)
room_type = self.env["pms.room.type"].browse(room_type_id) room_type = self.env["pms.room.type"].browse(room_type_id)
if self.get_api_client_type() == "internal_app": external_app = self.env.user.pms_api_client
if not external_app:
return board_service_id return board_service_id
if board_service and room_type: if board_service and room_type:
return ( return (
@@ -1541,7 +1535,7 @@ class PmsFolioService(Component):
return folio.id return folio.id
def update_folio_values(self, folio, pms_folio_info): def update_folio_values(self, folio, pms_folio_info):
call_type = self.get_api_client_type() external_app = self.env.user.pms_api_client
folio_vals = {} folio_vals = {}
if pms_folio_info.state == "cancel": if pms_folio_info.state == "cancel":
folio.action_cancel() folio.action_cancel()
@@ -1597,8 +1591,8 @@ class PmsFolioService(Component):
lambda r: r.state != "cancel" lambda r: r.state != "cancel"
).with_context(modified=True, force_write_blocked=True).action_cancel() ).with_context(modified=True, force_write_blocked=True).action_cancel()
folio.with_context( folio.with_context(
skip_compute_service_ids=True, skip_compute_service_ids=False if external_app else True,
force_overbooking=True if call_type == "external_app" else False, force_overbooking=True if external_app else False,
).write(folio_vals) ).write(folio_vals)
# Compute OTA transactions # Compute OTA transactions
pms_folio_info.transactions = self.normalize_payments_structure(pms_folio_info) pms_folio_info.transactions = self.normalize_payments_structure(pms_folio_info)
@@ -1621,6 +1615,9 @@ class PmsFolioService(Component):
and incorporate them in the transactions datamodel param and incorporate them in the transactions datamodel param
""" """
if pms_folio_info.transactions: if pms_folio_info.transactions:
# If the payment issuer is the API client, the payment will come in transactions
# if not, we will have to look in the payload for the
# payment identifier configured in the OTA
for transaction in pms_folio_info.transactions: for transaction in pms_folio_info.transactions:
if not transaction.journalId: if not transaction.journalId:
ota_conf = self.env["ota.property.settings"].search( ota_conf = self.env["ota.property.settings"].search(
@@ -1671,6 +1668,7 @@ class PmsFolioService(Component):
To find the reservation we compare the number of reservations and try To find the reservation we compare the number of reservations and try
To return a list of ids with resevations to cancel by modification To return a list of ids with resevations to cancel by modification
""" """
external_app = self.env.user.pms_api_client
cmds = [] cmds = []
for info_reservation in info_reservations: for info_reservation in info_reservations:
vals = {} vals = {}
@@ -1700,8 +1698,16 @@ class PmsFolioService(Component):
if info_reservation.children: if info_reservation.children:
vals.update({"children": info_reservation.children}) vals.update({"children": info_reservation.children})
if info_reservation.reservationLines: if info_reservation.reservationLines:
# The service price is included in day price when it is a board service (external api)
board_day_price = 0
if external_app and vals.get("board_service_room_id"):
board = self.env["pms.board.service.room.type"].browse(
vals["board_service_room_id"]
)
board_day_price = board.amount * info_reservation.adults
reservation_lines_cmds = self.wrapper_reservation_lines( reservation_lines_cmds = self.wrapper_reservation_lines(
info_reservation reservation=info_reservation,
board_day_price=board_day_price,
) )
if reservation_lines_cmds: if reservation_lines_cmds:
vals.update({"reservation_line_ids": reservation_lines_cmds}) vals.update({"reservation_line_ids": reservation_lines_cmds})
@@ -1717,7 +1723,7 @@ class PmsFolioService(Component):
cmds.append((0, False, vals)) cmds.append((0, False, vals))
return cmds return cmds
def wrapper_reservation_lines(self, reservation): def wrapper_reservation_lines(self, reservation, board_day_price=0):
cmds = [] cmds = []
for line in reservation.reservationLines: for line in reservation.reservationLines:
cmds.append( cmds.append(
@@ -1726,7 +1732,7 @@ class PmsFolioService(Component):
False, False,
{ {
"date": line.date, "date": line.date,
"price": line.price, "price": line.price - board_day_price,
"discount": line.discount or 0, "discount": line.discount or 0,
}, },
) )

View File

@@ -22,13 +22,6 @@
string="PMS API Client" string="PMS API Client"
help="This user is used to PMS API's client (channel managers, precheckin apps, booking engines, etc.)" help="This user is used to PMS API's client (channel managers, precheckin apps, booking engines, etc.)"
/> />
<field
name="pms_api_payment_journal_id"
string="PMS API Payment Journal"
domain="[('type', '=', 'bank')]"
help="This journal is used to PMS API's client (channel managers, precheckin apps, booking engines, etc.)"
attrs="{'invisible': [('pms_api_client', '=', False)]}"
/>
</group> </group>
</group> </group>
</xpath> </xpath>