mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[ADD] Pricelist item rules by property
This commit is contained in:
@@ -59,6 +59,7 @@
|
|||||||
"views/pms_shared_room_views.xml",
|
"views/pms_shared_room_views.xml",
|
||||||
"views/res_partner_views.xml",
|
"views/res_partner_views.xml",
|
||||||
"views/product_pricelist_views.xml",
|
"views/product_pricelist_views.xml",
|
||||||
|
"views/product_pricelist_item_views.xml",
|
||||||
"views/product_template_views.xml",
|
"views/product_template_views.xml",
|
||||||
"views/webclient_templates.xml",
|
"views/webclient_templates.xml",
|
||||||
"views/ir_sequence_views.xml",
|
"views/ir_sequence_views.xml",
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ from . import pms_room_type_restriction_item
|
|||||||
from . import pms_reservation_line
|
from . import pms_reservation_line
|
||||||
from . import pms_checkin_partner
|
from . import pms_checkin_partner
|
||||||
from . import product_pricelist
|
from . import product_pricelist
|
||||||
|
from . import product_pricelist_item
|
||||||
from . import res_partner
|
from . import res_partner
|
||||||
|
|
||||||
# from . import mail_compose_message
|
# from . import mail_compose_message
|
||||||
|
|||||||
@@ -128,11 +128,16 @@ class PmsReservationLine(models.Model):
|
|||||||
"reservation_id.pricelist_id",
|
"reservation_id.pricelist_id",
|
||||||
"reservation_id.room_type_id",
|
"reservation_id.room_type_id",
|
||||||
"reservation_id.reservation_type",
|
"reservation_id.reservation_type",
|
||||||
|
"reservation_id.pms_property_id",
|
||||||
)
|
)
|
||||||
def _compute_price(self):
|
def _compute_price(self):
|
||||||
for line in self:
|
for line in self:
|
||||||
reservation = line.reservation_id
|
reservation = line.reservation_id
|
||||||
if not reservation.room_type_id or not reservation.pricelist_id:
|
if (
|
||||||
|
not reservation.room_type_id
|
||||||
|
or not reservation.pricelist_id
|
||||||
|
or not reservation.pms_property_id
|
||||||
|
):
|
||||||
line.price = 0
|
line.price = 0
|
||||||
elif line._recompute_price():
|
elif line._recompute_price():
|
||||||
room_type_id = reservation.room_type_id.id
|
room_type_id = reservation.room_type_id.id
|
||||||
@@ -145,6 +150,7 @@ class PmsReservationLine(models.Model):
|
|||||||
date=line.date,
|
date=line.date,
|
||||||
pricelist=reservation.pricelist_id.id,
|
pricelist=reservation.pricelist_id.id,
|
||||||
uom=product.uom_id.id,
|
uom=product.uom_id.id,
|
||||||
|
property=reservation.pms_property_id.id,
|
||||||
)
|
)
|
||||||
line.price = self.env["account.tax"]._fix_tax_included_price_company(
|
line.price = self.env["account.tax"]._fix_tax_included_price_company(
|
||||||
line._get_display_price(product),
|
line._get_display_price(product),
|
||||||
@@ -174,7 +180,12 @@ class PmsReservationLine(models.Model):
|
|||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
origin = self._origin.reservation_id
|
origin = self._origin.reservation_id
|
||||||
new = self.reservation_id
|
new = self.reservation_id
|
||||||
price_fields = ["pricelist_id", "room_type_id", "reservation_type"]
|
price_fields = [
|
||||||
|
"pricelist_id",
|
||||||
|
"room_type_id",
|
||||||
|
"reservation_type",
|
||||||
|
"pms_property_id",
|
||||||
|
]
|
||||||
if (
|
if (
|
||||||
any(origin[field] != new[field] for field in price_fields)
|
any(origin[field] != new[field] for field in price_fields)
|
||||||
or self._origin.price == 0
|
or self._origin.price == 0
|
||||||
@@ -274,7 +285,6 @@ class PmsReservationLine(models.Model):
|
|||||||
date=self.date,
|
date=self.date,
|
||||||
uom=product.uom_id.id,
|
uom=product.uom_id.id,
|
||||||
)
|
)
|
||||||
|
|
||||||
final_price, rule_id = self.reservation_id.pricelist_id.with_context(
|
final_price, rule_id = self.reservation_id.pricelist_id.with_context(
|
||||||
product_context
|
product_context
|
||||||
).get_product_price_rule(product, 1.0, self.reservation_id.partner_id)
|
).get_product_price_rule(product, 1.0, self.reservation_id.partner_id)
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ class PmsRoom(models.Model):
|
|||||||
"pms.property",
|
"pms.property",
|
||||||
store=True,
|
store=True,
|
||||||
readonly=True,
|
readonly=True,
|
||||||
domain="[('id', 'in', room_type_id.pms_property_ids)]",
|
|
||||||
)
|
)
|
||||||
room_type_id = fields.Many2one(
|
room_type_id = fields.Many2one(
|
||||||
"pms.room.type", "Property Room Type", required=True, ondelete="restrict"
|
"pms.room.type", "Property Room Type", required=True, ondelete="restrict"
|
||||||
|
|||||||
@@ -51,3 +51,21 @@ class ProductPricelist(models.Model):
|
|||||||
# "different property."
|
# "different property."
|
||||||
# )
|
# )
|
||||||
# )
|
# )
|
||||||
|
|
||||||
|
def _compute_price_rule_get_items(
|
||||||
|
self, products_qty_partner, date, uom_id, prod_tmpl_ids, prod_ids, categ_ids
|
||||||
|
):
|
||||||
|
items = super(ProductPricelist, self)._compute_price_rule_get_items(
|
||||||
|
products_qty_partner, date, uom_id, prod_tmpl_ids, prod_ids, categ_ids
|
||||||
|
)
|
||||||
|
# Discard the rules with defined properties other than the context,
|
||||||
|
# and we reorder the rules to return the most concrete property rule first
|
||||||
|
if "property" in self._context:
|
||||||
|
return items.filtered(
|
||||||
|
lambda i: not i.pms_property_ids
|
||||||
|
or self._context["property"] in i.pms_property_ids.ids
|
||||||
|
).sorted(
|
||||||
|
key=lambda s: ((not s.pms_property_ids, s), len(s.pms_property_ids))
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return items
|
||||||
|
|||||||
11
pms/models/product_pricelist_item.py
Normal file
11
pms/models/product_pricelist_item.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Copyright 2017 Alexandre Díaz, Pablo Quesada, Darío Lodeiros
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class ProductPricelistItem(models.Model):
|
||||||
|
_inherit = "product.pricelist.item"
|
||||||
|
|
||||||
|
pms_property_ids = fields.Many2many(
|
||||||
|
"pms.property", string="Properties", required=False, ondelete="restrict"
|
||||||
|
)
|
||||||
26
pms/models/product_product.py
Normal file
26
pms/models/product_product.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# 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
|
||||||
|
|
||||||
|
|
||||||
|
class ProductTemplate(models.Model):
|
||||||
|
_inherit = "product.template"
|
||||||
|
|
||||||
|
pms_property_ids = fields.Many2many(
|
||||||
|
"pms.property", string="Properties", required=False, ondelete="restrict"
|
||||||
|
)
|
||||||
|
per_day = fields.Boolean("Unit increment per day")
|
||||||
|
per_person = fields.Boolean("Unit increment per person")
|
||||||
|
consumed_on = fields.Selection(
|
||||||
|
[("before", "Before night"), ("after", "After night")],
|
||||||
|
"Consumed",
|
||||||
|
default="before",
|
||||||
|
)
|
||||||
|
daily_limit = fields.Integer("Daily limit")
|
||||||
|
is_extra_bed = fields.Boolean("Is extra bed", default=False)
|
||||||
|
show_in_calendar = fields.Boolean(
|
||||||
|
"Show in Calendar",
|
||||||
|
default=False,
|
||||||
|
help="Specifies if the product is shown in the calendar information.",
|
||||||
|
)
|
||||||
16
pms/views/product_pricelist_item_views.xml
Normal file
16
pms/views/product_pricelist_item_views.xml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<odoo>
|
||||||
|
<record id="product_pricelist_item_view_form" model="ir.ui.view">
|
||||||
|
<field name="model">product.pricelist.item</field>
|
||||||
|
<field name="inherit_id" ref="product.product_pricelist_item_form_view" />
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='min_quantity']" position="before">
|
||||||
|
<field
|
||||||
|
name="pms_property_ids"
|
||||||
|
widget="many2many_tags"
|
||||||
|
options="{'no_create': True,'no_open': True}"
|
||||||
|
/>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
@@ -13,6 +13,16 @@
|
|||||||
<field name="pricelist_type" />
|
<field name="pricelist_type" />
|
||||||
<field name="cancelation_rule_id" />
|
<field name="cancelation_rule_id" />
|
||||||
</xpath>
|
</xpath>
|
||||||
|
<xpath
|
||||||
|
expr="//field[@name='item_ids']/tree/field[@name='base']"
|
||||||
|
position="after"
|
||||||
|
>
|
||||||
|
<field
|
||||||
|
name="pms_property_ids"
|
||||||
|
widget="many2many_tags"
|
||||||
|
options="{'no_create': True,'no_open': True}"
|
||||||
|
/>
|
||||||
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
<menuitem
|
<menuitem
|
||||||
|
|||||||
Reference in New Issue
Block a user