delivery/models/delivery_price_rule.py

54 lines
2.4 KiB
Python
Raw Permalink Normal View History

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
from odoo.tools import format_amount
VARIABLE_SELECTION = [
('weight', "Weight"),
('volume', "Volume"),
('wv', "Weight * Volume"),
('price', "Price"),
('quantity', "Quantity"),
]
class PriceRule(models.Model):
_name = "delivery.price.rule"
_description = "Delivery Price Rules"
_order = 'sequence, list_price, id'
@api.depends('variable', 'operator', 'max_value', 'list_base_price', 'list_price', 'variable_factor', 'currency_id')
def _compute_name(self):
for rule in self:
name = 'if %s %s %.02f then' % (rule.variable, rule.operator, rule.max_value)
if rule.currency_id:
base_price = format_amount(self.env, rule.list_base_price, rule.currency_id)
price = format_amount(self.env, rule.list_price, rule.currency_id)
else:
base_price = "%.2f" % rule.list_base_price
price = "%.2f" % rule.list_price
if rule.list_base_price and not rule.list_price:
name = '%s fixed price %s' % (name, base_price)
elif rule.list_price and not rule.list_base_price:
name = '%s %s times %s' % (name, price, rule.variable_factor)
else:
name = '%s fixed price %s plus %s times %s' % (
name, base_price, price, rule.variable_factor
)
rule.name = name
name = fields.Char(compute='_compute_name')
sequence = fields.Integer(required=True, default=10)
carrier_id = fields.Many2one('delivery.carrier', 'Carrier', required=True, ondelete='cascade')
currency_id = fields.Many2one(related='carrier_id.currency_id')
variable = fields.Selection(selection=VARIABLE_SELECTION, required=True, default='quantity')
operator = fields.Selection([('==', '='), ('<=', '<='), ('<', '<'), ('>=', '>='), ('>', '>')], required=True, default='<=')
max_value = fields.Float('Maximum Value', required=True)
list_base_price = fields.Float(string='Sale Base Price', digits='Product Price', required=True, default=0.0)
list_price = fields.Float('Sale Price', digits='Product Price', required=True, default=0.0)
variable_factor = fields.Selection(
selection=VARIABLE_SELECTION, string="Variable Factor", required=True, default='weight'
)