Files
tryton/product.py
T
2014-12-02 12:55:52 +01:00

121 lines
4.2 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.
import datetime
from trytond.model import fields
from trytond.pyson import Eval
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
__all__ = ['Template', 'Product']
__metaclass__ = PoolMeta
class Template:
__name__ = 'product.template'
salable = fields.Boolean('Salable', states={
'readonly': ~Eval('active', True),
}, depends=['active'])
sale_uom = fields.Many2One('product.uom', 'Sale UOM', states={
'readonly': ~Eval('active', True),
'invisible': ~Eval('salable', False),
'required': Eval('salable', False),
},
domain=[
('category', '=', Eval('default_uom_category')),
],
depends=['active', 'salable', 'default_uom_category'])
delivery_time = fields.Integer('Delivery Time', states={
'readonly': ~Eval('active', True),
'invisible': ~Eval('salable', False),
'required': Eval('salable', False),
},
depends=['active', 'salable'],
help='In number of days')
@classmethod
def __setup__(cls):
super(Template, cls).__setup__()
required = ~Eval('account_category', False) & Eval('salable', False)
if not cls.account_revenue.states.get('required'):
cls.account_revenue.states['required'] = required
else:
cls.account_revenue.states['required'] = (
cls.account_revenue.states['required'] | required)
if 'account_category' not in cls.account_revenue.depends:
cls.account_revenue.depends.append('account_category')
if 'salable' not in cls.account_revenue.depends:
cls.account_revenue.depends.append('salable')
@staticmethod
def default_delivery_time():
return 0
@fields.depends('default_uom', 'sale_uom', 'salable')
def on_change_default_uom(self):
try:
super(Template, self).on_change_default_uom()
except AttributeError:
pass
if self.default_uom:
if self.sale_uom:
if self.default_uom.category != self.sale_uom.category:
self.sale_uom = self.default_uom
else:
self.sale_uom = self.default_uom
class Product:
__name__ = 'product.product'
@staticmethod
def get_sale_price(products, quantity=0):
'''
Return the sale price for products and quantity.
It uses if exists from the context:
uom: the unit of measure
currency: the currency id for the returned price
'''
pool = Pool()
Uom = pool.get('product.uom')
User = pool.get('res.user')
Currency = pool.get('currency.currency')
Date = pool.get('ir.date')
today = Date.today()
prices = {}
uom = None
if Transaction().context.get('uom'):
uom = Uom(Transaction().context.get('uom'))
currency = None
if Transaction().context.get('currency'):
currency = Currency(Transaction().context.get('currency'))
user = User(Transaction().user)
for product in products:
prices[product.id] = product.list_price
if uom:
prices[product.id] = Uom.compute_price(
product.default_uom, prices[product.id], uom)
if currency and user.company:
if user.company.currency != currency:
date = Transaction().context.get('sale_date') or today
with Transaction().set_context(date=date):
prices[product.id] = Currency.compute(
user.company.currency, prices[product.id],
currency, round=False)
return prices
def compute_delivery_date(self, date=None):
'''
Compute the delivery date a the given date
'''
Date = Pool().get('ir.date')
if not date:
date = Date.today()
return date + datetime.timedelta(self.delivery_time)