Merge PR #109 into 14.0

Signed-off-by DarioLodeiros
This commit is contained in:
OCA-git-bot
2022-09-24 18:27:44 +00:00
7 changed files with 244 additions and 36 deletions

View File

@@ -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

View 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,
}
)

View File

@@ -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:

View File

@@ -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,
)

View File

@@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
68 user_access_pms_precheckin_portal user_access_pms_precheckin_portal model_pms_checkin_partner base.group_portal 1 1 1 1
69 user_access_pms_booking_duplicate user_access_pms_booking_duplicate model_pms_booking_duplicate pms.group_pms_user 1 1 1 1
70 user_access_pms_reservation_duplicate user_access_pms_reservation_duplicate model_pms_reservation_duplicate pms.group_pms_user 1 1 1 1
71 user_access_ir_pms_property user_access_ir_pms_property model_ir_pms_property pms.group_pms_user 1 1 1 1

View File

@@ -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):
"""

View File

@@ -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()