diff --git a/pms_api_rest/datamodels/__init__.py b/pms_api_rest/datamodels/__init__.py index 34616fd3f..199a2eab6 100644 --- a/pms_api_rest/datamodels/__init__.py +++ b/pms_api_rest/datamodels/__init__.py @@ -7,6 +7,7 @@ from . import pms_room_type from . import pms_room_type_class from . import pms_reservation +from . import pms_reservation_line from . import pms_checkin_partner from . import pms_partner diff --git a/pms_api_rest/datamodels/pms_reservation_line.py b/pms_api_rest/datamodels/pms_reservation_line.py new file mode 100644 index 000000000..22f770e01 --- /dev/null +++ b/pms_api_rest/datamodels/pms_reservation_line.py @@ -0,0 +1,23 @@ +from marshmallow import fields + +from odoo.addons.datamodel.core import Datamodel + + +class PmsReservationLineSearchParam(Datamodel): + _name = "pms.reservation.line.search.param" + id = fields.Integer(required=False, allow_none=True) + date = fields.String(required=False, allow_none=True) + reservationId = fields.Integer(required=False, allow_none=True) + pmsPropertyId = fields.Integer(required=False, allow_none=True) + + +class PmsReservationLineInfo(Datamodel): + _name = "pms.reservation.line.info" + id = fields.Integer(required=False, allow_none=False) + date = fields.String(required=False, allow_none=False) + price = fields.Float(required=False, allow_none=False) + discount = fields.Float(required=False, allow_none=True) + cancelDiscount = fields.Float(required=False, allow_none=True) + roomId = fields.Integer(required=False, allow_none=False) + reservationId = fields.Integer(required=False, allow_none=False) + pmsPropertyId = fields.Integer(required=False, allow_none=False) diff --git a/pms_api_rest/services/__init__.py b/pms_api_rest/services/__init__.py index cff288066..fc97b6bb8 100644 --- a/pms_api_rest/services/__init__.py +++ b/pms_api_rest/services/__init__.py @@ -5,6 +5,7 @@ from . import pms_calendar_service from . import pms_partner_service from . import pms_reservation_service +from . import pms_reservation_line_service from . import pms_property_service from . import pms_login_service from . import pms_pricelist_service diff --git a/pms_api_rest/services/pms_reservation_line_service.py b/pms_api_rest/services/pms_reservation_line_service.py new file mode 100644 index 000000000..56c51e37f --- /dev/null +++ b/pms_api_rest/services/pms_reservation_line_service.py @@ -0,0 +1,133 @@ +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 PmsReservationLineService(Component): + _inherit = "base.rest.service" + _name = "pms.reservation.line.service" + _usage = "reservation-lines" + _collection = "pms.services" + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + output_param=Datamodel("pms.reservation.line.info", is_list=False), + auth="jwt_api_pms", + ) + def get_reservation_line(self, reservation_line_id): + reservation_line = self.env["pms.reservation.line"].search( + [("id", "=", reservation_line_id)] + ) + if reservation_line: + PmsReservationLineInfo = self.env.datamodels["pms.reservation.line.info"] + return PmsReservationLineInfo( + id=reservation_line.id, + date=datetime.combine( + reservation_line.date, datetime.min.time() + ).isoformat(), + price=reservation_line.price, + discount=reservation_line.discount, + cancelDiscount=reservation_line.cancel_discount, + roomId=reservation_line.room_id.id, + reservationId=reservation_line.reservation_id.id, + pmsPropertyId=reservation_line.pms_property_id.id, + ) + else: + raise MissingError(_("Reservation Line not found")) + + @restapi.method( + [ + ( + [ + "/", + ], + "GET", + ) + ], + input_param=Datamodel("pms.reservation.line.search.param"), + output_param=Datamodel("pms.reservation.line.info", is_list=True), + auth="jwt_api_pms", + ) + def get_reservation_lines(self, reservation_lines_search_param): + domain = [] + if reservation_lines_search_param.date: + domain.append(("date", "=", reservation_lines_search_param.date)) + if reservation_lines_search_param.id: + domain.append(("id", "=", reservation_lines_search_param.id)) + if reservation_lines_search_param.reservationId: + domain.append( + ("reservation_id", "=", reservation_lines_search_param.reservationId) + ) + if reservation_lines_search_param.pmsPropertyId: + domain.extend( + [ + ( + "pms_property_id", + "=", + reservation_lines_search_param.pmsPropertyId, + ), + ] + ) + + result_lines = [] + PmsReservationLineInfo = self.env.datamodels["pms.reservation.line.info"] + for reservation_line in self.env["pms.reservation.line"].search( + domain, + ): + result_lines.append( + PmsReservationLineInfo( + id=reservation_line.id, + date=datetime.combine( + reservation_line.date, datetime.min.time() + ).isoformat(), + price=reservation_line.price, + discount=reservation_line.discount, + cancelDiscount=reservation_line.cancel_discount, + roomId=reservation_line.room_id.id, + reservationId=reservation_line.reservation_id.id, + pmsPropertyId=reservation_line.pms_property_id.id, + ) + ) + return result_lines + + @restapi.method( + [ + ( + [ + "/", + ], + "PATCH", + ) + ], + input_param=Datamodel("pms.reservation.line.info"), + auth="jwt_api_pms", + ) + def update_reservation_line(self, reservation_line_id, reservation_line_info): + reservation_line = self.env["pms.reservation.line"].search( + [("id", "=", reservation_line_id)] + ) + vals = dict() + if reservation_line: + if reservation_line_info.price: + vals["price"] = reservation_line_info.price + if reservation_line_info.discount: + vals["discount"] = reservation_line_info.discount + if reservation_line_info.cancelDiscount: + vals["cancel_discount"] = reservation_line_info.cancelDiscount + if reservation_line_info.roomId: + vals["room_id"] = reservation_line_info.roomId + reservation_line.write(vals) + else: + raise MissingError(_("Reservation Line not found"))