Files
tradon/modules/sale_point/product.py
2026-03-14 09:42:12 +00:00

117 lines
4.0 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.model import ModelSQL, fields
from trytond.modules.company.model import CompanyValueMixin
from trytond.modules.product import price_digits, round_price
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
class _GrossPriceMixin:
__slots__ = ()
@fields.depends(
'gross_price', 'account_category', '_parent_account_category.id',
methods=['customer_taxes_used'])
def on_change_gross_price(self):
pool = Pool()
Date = pool.get('ir.date')
Tax = pool.get('account.tax')
if self.gross_price is None or not self.account_category:
return
today = Date.today()
self.list_price = round_price(Tax.reverse_compute(
self.gross_price,
self.customer_taxes_used,
today))
class Template(_GrossPriceMixin, metaclass=PoolMeta):
__name__ = 'product.template'
gross_price = fields.MultiValue(fields.Numeric(
"Gross Price", digits=price_digits,
states={
'invisible': ~Eval('salable', False),
},
help="The price with default taxes included."))
gross_prices = fields.One2Many(
'product.gross_price', 'template', "Gross Prices")
@classmethod
def multivalue_model(cls, field):
pool = Pool()
if field == 'gross_price':
return pool.get('product.gross_price')
return super().multivalue_model(field)
class Product(_GrossPriceMixin, metaclass=PoolMeta):
__name__ = 'product.product'
gross_price = fields.MultiValue(fields.Numeric(
"Gross Price", digits=price_digits,
states={
'invisible': ~Eval('salable', False),
},
help="The price with default taxes included.\n"
"Leave empty to use the gross price of the product."))
gross_prices = fields.One2Many(
'product.gross_price', 'product', "Gross Prices")
gross_price_used = fields.Function(fields.Numeric(
"Gross Price", digits=price_digits,
help="The price with default taxes included."),
'get_gross_price_used')
@classmethod
def multivalue_model(cls, field):
pool = Pool()
if field == 'gross_price':
return pool.get('product.gross_price')
return super().multivalue_model(field)
def set_multivalue(self, name, value, save=True, **pattern):
if name == 'gross_price':
pattern.setdefault('template', self.template.id)
return super().set_multivalue(name, value, save=save, **pattern)
def get_multivalue(self, name, **pattern):
if name == 'gross_price':
pattern.setdefault('template', self.template.id)
return super().get_multivalue(name, **pattern)
@fields.depends('_parent_template.id')
def on_change_gross_price(self):
return super().on_change_gross_price()
def get_gross_price_used(self, name):
gross_price = self.get_multivalue('gross_price')
if gross_price is None:
gross_price = self.template.get_multivalue('gross_price')
return gross_price
class GrossPrice(ModelSQL, CompanyValueMixin):
__name__ = 'product.gross_price'
template = fields.Many2One(
'product.template', "Template", ondelete='CASCADE', required=True,
context={
'company': Eval('company', -1),
},
depends=['company'])
product = fields.Many2One(
'product.product', "Product", ondelete='CASCADE',
domain=[
('template', '=', Eval('template', -1)),
],
context={
'company': Eval('company', -1),
},
depends=['company'])
gross_price = fields.Numeric("Gross Price", digits=price_digits)
@classmethod
def __setup__(cls):
super().__setup__()
cls.company.required = True