diff --git a/pms_api_rest/datamodels/__init__.py b/pms_api_rest/datamodels/__init__.py index 5f918af77..ddf81cb59 100644 --- a/pms_api_rest/datamodels/__init__.py +++ b/pms_api_rest/datamodels/__init__.py @@ -42,3 +42,5 @@ from . import pms_product from . import pms_sale_channel from . import pms_cancelation_rule from . import pms_agency +from . import pms_service +from . import pms_service_line diff --git a/pms_api_rest/datamodels/pms_reservation.py b/pms_api_rest/datamodels/pms_reservation.py index 3efc32ed7..15c31c6b5 100644 --- a/pms_api_rest/datamodels/pms_reservation.py +++ b/pms_api_rest/datamodels/pms_reservation.py @@ -18,6 +18,7 @@ class PmsReservationShortInfo(Datamodel): allowedCheckout = fields.Boolean(required=False, allow_none=True) isSplitted = fields.Boolean(required=False, allow_none=True) priceTotal = fields.Float(required=False, allow_none=True) + servicesCount = fields.Integer(required=False, allow_none=True) class PmsReservationInfo(Datamodel): diff --git a/pms_api_rest/datamodels/pms_service.py b/pms_api_rest/datamodels/pms_service.py new file mode 100644 index 000000000..6102a1bce --- /dev/null +++ b/pms_api_rest/datamodels/pms_service.py @@ -0,0 +1,14 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsServiceInfo(Datamodel): + _name = "pms.service.info" + id = fields.Integer(required=False, allow_none=True) + name = fields.String(required=False, allow_none=True) + quantity = fields.Integer(required=False, allow_none=True) + priceTotal = fields.Float(required=False, allow_none=True) + priceSubtotal = fields.Float(required=False, allow_none=True) + priceTaxes = fields.Float(required=False, allow_none=True) + discount = fields.Float(required=False, allow_none=True) diff --git a/pms_api_rest/datamodels/pms_service_line.py b/pms_api_rest/datamodels/pms_service_line.py new file mode 100644 index 000000000..5ce638164 --- /dev/null +++ b/pms_api_rest/datamodels/pms_service_line.py @@ -0,0 +1,14 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsServiceLineInfo(Datamodel): + _name = "pms.service.line.info" + id = fields.Integer(required=False, allow_none=True) + isBoardService = fields.Boolean(required=False, allow_none=True) + productId = fields.Integer(required=False,allow_none=True) + date = fields.String(required=False, allow_none=True) + priceUnit = fields.Float(required=False, allow_none=True) + priceTotal = fields.Float(required=False, allow_none=True) + discount = fields.Float(required=False, allow_none=True) diff --git a/pms_api_rest/services/__init__.py b/pms_api_rest/services/__init__.py index 78d071844..26be7c970 100644 --- a/pms_api_rest/services/__init__.py +++ b/pms_api_rest/services/__init__.py @@ -29,3 +29,4 @@ from . import pms_sale_channel_service from . import pms_cancelation_rule_service from . import pms_agency_service +from . import pms_service_line_service diff --git a/pms_api_rest/services/pms_folio_service.py b/pms_api_rest/services/pms_folio_service.py index a2c70a575..6edb69e39 100644 --- a/pms_api_rest/services/pms_folio_service.py +++ b/pms_api_rest/services/pms_folio_service.py @@ -254,6 +254,11 @@ class PmsFolioService(Component): allowedCheckout=reservation.allowed_checkout, isSplitted=reservation.splitted, priceTotal=reservation.price_room_services_set, + servicesCount=len( + reservation.service_ids.filtered( + lambda x: not x.is_board_service + ) + ), ) ) diff --git a/pms_api_rest/services/pms_reservation_service.py b/pms_api_rest/services/pms_reservation_service.py index b170ad51c..bb3c9fbe8 100644 --- a/pms_api_rest/services/pms_reservation_service.py +++ b/pms_api_rest/services/pms_reservation_service.py @@ -249,6 +249,38 @@ class PmsReservationService(Component): ) return result_lines + @restapi.method( + [ + ( + [ + "//services", + ], + "GET", + ) + ], + output_param=Datamodel("pms.service.info", is_list=True), + auth="jwt_api_pms", + ) + def get_reservation_services(self, reservation_id): + reservation = self.env["pms.reservation"].search([("id", "=", reservation_id)]) + if not reservation: + raise MissingError(_("Reservation not found")) + result_services = [] + PmsServiceInfo = self.env.datamodels["pms.service.info"] + for service in reservation.service_ids: + result_services.append( + PmsServiceInfo( + id=service.id, + name=service.name, + quantity=service.product_qty, + priceTotal=service.price_total, + priceSubtotal=service.price_subtotal, + priceTaxes=service.price_tax, + discount=service.discount, + ) + ) + return result_services + @restapi.method( [ ( diff --git a/pms_api_rest/services/pms_service_line_service.py b/pms_api_rest/services/pms_service_line_service.py new file mode 100644 index 000000000..7637a0044 --- /dev/null +++ b/pms_api_rest/services/pms_service_line_service.py @@ -0,0 +1,52 @@ +from datetime import datetime + +from odoo import _ +from odoo.exceptions import MissingError + +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_datamodel.restapi import Datamodel +from odoo.addons.component.core import Component + + +class PmsServiceService(Component): + _inherit = "base.rest.service" + _name = "pms.reservation.line.service" + _usage = "service" + _collection = "pms.services" + + @restapi.method( + [ + ( + [ + "//service-lines", + ], + "GET", + ) + ], + output_param=Datamodel("pms.service.line.info", is_list=True), + auth="jwt_api_pms", + ) + def get_service_lines(self, service_id): + service = self.env["pms.service"].search( + [("id", "=", service_id)] + ) + if not service: + raise MissingError(_("Service not found")) + result_service_lines = [] + PmsServiceLineInfo = self.env.datamodels["pms.service.line.info"] + for service_line in service.service_line_ids: + result_service_lines.append( + PmsServiceLineInfo( + id=service_line.id, + isBoardService=service_line.is_board_service, + productId=service_line.product_id.id, + date=datetime.combine( + service_line.date, datetime.min.time() + ).isoformat(), + priceUnit=service_line.price_unit, + priceTotal=service_line.price_day_total, + discount=service_line.discount, + ) + ) + return result_service_lines +