mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
@@ -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
|
||||
|
||||
90
pms/models/ir_pms_property.py
Normal file
90
pms/models/ir_pms_property.py
Normal file
@@ -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,
|
||||
}
|
||||
)
|
||||
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user