diff --git a/pms/models/__init__.py b/pms/models/__init__.py index cb2c8eb37..5f818c0e6 100644 --- a/pms/models/__init__.py +++ b/pms/models/__init__.py @@ -48,3 +48,4 @@ from . import pms_automated_mails from . import payment_transaction from . import res_partner_id_category from . import pms_team_member +from . import ir_pms_property diff --git a/pms/models/ir_pms_property.py b/pms/models/ir_pms_property.py new file mode 100644 index 000000000..b10901958 --- /dev/null +++ b/pms/models/ir_pms_property.py @@ -0,0 +1,90 @@ +from odoo import fields, models + + +class IrPmsProperty(models.Model): + _name = "ir.pms.property" + _description = "IrPmsProperty" + pms_property_id = fields.Many2one( + string="Properties", help="", comodel_name="pms.property" + ) + model_id = fields.Many2one(string="Model", comodel_name="ir.model") + field_id = fields.Many2one(string="Field", comodel_name="ir.model.fields") + record = fields.Integer(string="Record Id") + + value_integer = fields.Integer(string="Integer Field Value") + + value_float = fields.Float(string="Float Field Value") + + value_reference = fields.Text(string="Reference Field Value") + + def get_field_value( + self, pms_property_id, model_name, field_name, record_id, value_type + ): + model_id = self.env["ir.model"].browse(model_name).id + model = self.env["ir.model"].search([("model", "=", model_id)]) + if model: + field_id = self.env["ir.model.fields"].search( + [("name", "=", field_name), ("model_id", "=", model.id)] + ) + ir_pms_property = self.env["ir.pms.property"].search( + [ + ("pms_property_id", "=", pms_property_id), + ("field_id", "=", field_id[0].id), + ("record", "=", record_id), + ] + ) + if ir_pms_property: + if value_type == int: + value = ir_pms_property.value_integer + elif value_type == float: + value = ir_pms_property.value_float + else: + index_bracket = ir_pms_property.value_reference.index("(") + index_comma = ir_pms_property.value_reference.index(",") + model_name = ir_pms_property.value_reference[:index_bracket] + resource_id = ir_pms_property.value_reference[ + index_bracket + 1 : index_comma + ] + value = self.env[model_name].browse(int(resource_id)) + return value + return False + + def set_field_value( + self, pms_property_id, model_name, field_name, record_id, value + ): + model_id = self.env["ir.model"].browse(model_name).id + model = self.env["ir.model"].search([("model", "=", model_id)]) + if model: + field_id = self.env["ir.model.fields"].search( + [("name", "=", field_name), ("model_id", "=", model.id)] + ) + ir_pms_property = self.env["ir.pms.property"].search( + [ + ("pms_property_id", "=", pms_property_id), + ("field_id", "=", field_id[0].id), + ("record", "=", record_id), + ] + ) + if type(value) == int: + value_type = "value_integer" + elif type(value) == float: + value_type = "value_float" + else: + value_type = "value_reference" + value = str(value) + if ir_pms_property: + ir_pms_property.write( + { + value_type: value, + } + ) + else: + self.env["ir.pms.property"].create( + { + "pms_property_id": pms_property_id, + "model_id": model.id, + "field_id": field_id[0].id, + value_type: value, + "record": record_id, + } + ) diff --git a/pms/models/pms_board_service_line.py b/pms/models/pms_board_service_line.py index 9be0d7d3c..93b8ef45b 100644 --- a/pms/models/pms_board_service_line.py +++ b/pms/models/pms_board_service_line.py @@ -38,6 +38,8 @@ class PmsBoardServiceLine(models.Model): string="Amount", help="Price for this Board Service Line/Product", default=lambda self: self._get_default_price(), + compute="_compute_amount", + inverse="_inverse_amount", digits=("Product Price"), ) @@ -45,6 +47,35 @@ class PmsBoardServiceLine(models.Model): if self.product_id: return self.product_id.list_price + @api.depends_context("allowed_pms_property_ids") + def _compute_amount(self): + for record in self: + pms_property_id = ( + self.env.context.get("property") + or self.env.user.get_active_property_ids()[0] + ) + record.amount = self.env["ir.pms.property"].get_field_value( + pms_property_id, + self._name, + "amount", + record.id, + type(record.amount), + ) + + def _inverse_amount(self): + for record in self: + pms_property_id = ( + self.env.context.get("property") + or self.env.user.get_active_property_ids()[0] + ) + self.env["ir.pms.property"].set_field_value( + pms_property_id, + self._name, + "amount", + record.id, + record.amount, + ) + @api.onchange("product_id") def onchange_product_id(self): if self.product_id: diff --git a/pms/models/product_template.py b/pms/models/product_template.py index 0b5c7a538..a47fbfb54 100644 --- a/pms/models/product_template.py +++ b/pms/models/product_template.py @@ -1,7 +1,7 @@ # Copyright 2017 Alexandre Díaz # Copyright 2017 Dario Lodeiros # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import fields, models +from odoo import api, fields, models class ProductTemplate(models.Model): @@ -35,7 +35,14 @@ class ProductTemplate(models.Model): default="before", ) daily_limit = fields.Integer( - string="Daily limit", help="Indicates how much products can consumed in one day" + string="Daily limit", + help="Indicates how much products can consumed in one day", + compute="_compute_daily_limit", + inverse="_inverse_daily_limit", + ) + list_price = fields.Float( + compute="_compute_list_price", + inverse="_inverse_list_price", ) is_extra_bed = fields.Boolean( string="Is extra bed", @@ -47,3 +54,74 @@ class ProductTemplate(models.Model): help="Indicates if that product is a crib", default=False, ) + + @api.depends_context("allowed_pms_property_ids") + def _compute_daily_limit(self): + for record in self: + pms_property_id = ( + self.env.context.get("property") + or self.env.user.get_active_property_ids()[0] + ) + record.daily_limit = self.env["ir.pms.property"].get_field_value( + pms_property_id, + self._name, + "daily_limit", + record.id, + type(record.daily_limit), + ) + + @api.depends_context("allowed_pms_property_ids") + def _compute_list_price(self): + for record in self: + pms_property_id = ( + self.env.context.get("property") + or self.env.user.get_active_property_ids()[0] + ) + record.list_price = self.env["ir.pms.property"].get_field_value( + pms_property_id, + self._name, + "list_price", + record.id, + type(record.list_price), + ) + + def _inverse_daily_limit(self): + for record in self: + pms_property_id = ( + self.env.context.get("property") + or self.env.user.get_active_property_ids()[0] + ) + self.env["ir.pms.property"].set_field_value( + pms_property_id, + self._name, + "daily_limit", + record.id, + record.daily_limit, + ) + + def _inverse_list_price(self): + for record in self: + pms_property_id = ( + self.env.context.get("property") + or self.env.user.get_active_property_ids()[0] + ) + self.env["ir.pms.property"].set_field_value( + pms_property_id, self._name, "list_price", record.id, record.list_price + ) + # Set default value in other properties + other_properties = self.env["pms.property"].search([]) + for other_property in other_properties.ids: + if not self.env["ir.pms.property"].get_field_value( + other_property, + self._name, + "list_price", + record.id, + type(record.list_price), + ): + self.env["ir.pms.property"].set_field_value( + other_property, + self._name, + "list_price", + record.id, + record.list_price, + ) diff --git a/pms/security/ir.model.access.csv b/pms/security/ir.model.access.csv index 878e87523..65eebb843 100644 --- a/pms/security/ir.model.access.csv +++ b/pms/security/ir.model.access.csv @@ -68,3 +68,4 @@ user_access_res_partner_portal,user_access_res_partner_portal,model_res_partner, user_access_pms_precheckin_portal,user_access_pms_precheckin_portal,model_pms_checkin_partner,base.group_portal,1,1,1,1 user_access_pms_booking_duplicate,user_access_pms_booking_duplicate,model_pms_booking_duplicate,pms.group_pms_user,1,1,1,1 user_access_pms_reservation_duplicate,user_access_pms_reservation_duplicate,model_pms_reservation_duplicate,pms.group_pms_user,1,1,1,1 +user_access_ir_pms_property,user_access_ir_pms_property,model_ir_pms_property,pms.group_pms_user,1,1,1,1 diff --git a/pms/tests/test_pms_availability_plan_rules.py b/pms/tests/test_pms_availability_plan_rules.py index 58fc94ab6..664dc66ca 100644 --- a/pms/tests/test_pms_availability_plan_rules.py +++ b/pms/tests/test_pms_availability_plan_rules.py @@ -104,7 +104,9 @@ class TestPmsRoomTypeAvailabilityRules(TestPms): } ) # partner - self.partner1 = self.env["res.partner"].create({"name": "Charles"}) + self.partner1 = self.env["res.partner"].create( + {"name": "Charles", "property_product_pricelist": self.pricelist1} + ) def test_availability_rooms_all(self): """ diff --git a/pms/tests/test_pms_reservation.py b/pms/tests/test_pms_reservation.py index 4d736e28c..6f9348c50 100644 --- a/pms/tests/test_pms_reservation.py +++ b/pms/tests/test_pms_reservation.py @@ -4214,36 +4214,41 @@ class TestPmsReservations(TestPms): "sale_channel_origin of rservation", ) - @freeze_time("2000-12-10") - def test_check_sale_channel_origin_in_reservation_lines(self): - """ - Check that a reservation has at least one reservation_line woth the - same sale_channel_id as its sale_channel_origin_id - """ - # ARRANGE - sale_channel_phone = self.env["pms.sale.channel"].create( - { - "name": "phone", - "channel_type": "direct", - } - ) - reservation_vals = { - "checkin": datetime.datetime.now(), - "checkout": datetime.datetime.now() + datetime.timedelta(days=1), - "room_type_id": self.room_type_double.id, - "partner_id": self.partner1.id, - "pms_property_id": self.pms_property1.id, - "sale_channel_origin_id": self.sale_channel_direct.id, - } - reservation1 = self.env["pms.reservation"].create(reservation_vals) - - # ACT & ASSERT - with self.assertRaises( - ValidationError, - msg="Error, there cannot be a reservation in which at least one of its reservation" - "lines doesn't have as sale_channel_id the sale_channel_origin_id of reservation", - ): - reservation1.reservation_line_ids.write( - {"sale_channel_id": sale_channel_phone} - ) - reservation1.flush() + # TEMPORAL UNABLE (_check_lines_with_sale_channel_id in pms_reservation.py + # unable to allow updagrade version) + # @freeze_time("2000-12-10") + # def test_check_sale_channel_origin_in_reservation_lines(self): + # """ + # Check that a reservation has at least one reservation_line woth the + # same sale_channel_id as its sale_channel_origin_id + # """ + # # ARRANGE + # sale_channel_phone = self.env["pms.sale.channel"].create( + # { + # "name": "phone", + # "channel_type": "direct", + # } + # ) + # reservation_vals = { + # "checkin": datetime.datetime.now(), + # "checkout": datetime.datetime.now() + datetime.timedelta(days=1), + # "room_type_id": self.room_type_double.id, + # "partner_id": self.partner1.id, + # "pms_property_id": self.pms_property1.id, + # "sale_channel_origin_id": self.sale_channel_direct.id, + # } + # reservation1 = self.env["pms.reservation"].create(reservation_vals) + # reservation1.fetch() + # # ACT & ASSERT + # with self.assertRaises( + # ValidationError, + # msg=""" + # Error, there cannot be a reservation + # in which at least one of its reservation + # """ + # "lines doesn't have as sale_channel_id the sale_channel_origin_id of reservation", + # ): + # reservation1.reservation_line_ids.write( + # {"sale_channel_id": sale_channel_phone} + # ) + # reservation1.flush()