trytond-sale_unit_load/cost.py

103 lines
3.5 KiB
Python

# The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.pool import PoolMeta
from trytond.model import fields
from trytond.pyson import Eval
from trytond.modules.stock_unit_load import cases_digits
from decimal import Decimal
class CostMixin(object):
@classmethod
def __setup__(cls):
super(CostMixin, cls).__setup__()
cls.distribution_method.selection.extend([
('cases_quantity', 'Cases quantity'),
('ul_quantity', 'ULs quantity')])
def get_context_formula(self, cost):
res = super(CostMixin, self).get_context_formula(cost)
res['names'].update({
'cases_quantity': Decimal(
cost and cost.document_cases_quantity or 0),
'ul_quantity': Decimal(
cost and cost.document_ul_quantity or 0)})
return res
class CostType(CostMixin, metaclass=PoolMeta):
__name__ = 'sale.cost.type'
class CostTemplate(CostMixin, metaclass=PoolMeta):
__name__ = 'sale.cost.template'
class CostSale(CostMixin, metaclass=PoolMeta):
__name__ = 'sale.cost'
document_ul_quantity = fields.Function(
fields.Float('ULs', digits=(16, 0)),
'get_document_ul_quantity')
document_cases_quantity = fields.Function(
fields.Float('Cases', digits=cases_digits),
'get_document_cases_quantity')
@classmethod
def get_document_ul_quantity(cls, records, name=None):
values = {r.id: 0 for r in records}
document_lines = {}
for record in records:
document_lines.setdefault(record, []).extend(
record._get_sale_lines())
for record, lines in document_lines.items():
values[record.id] = sum(line.ul_quantity or 0 for line in lines)
return values
@classmethod
def get_document_cases_quantity(cls, records, name=None):
values = {r.id: 0 for r in records}
document_lines = {}
for record in records:
document_lines.setdefault(record, []).extend(
record._get_sale_lines())
for record, lines in document_lines.items():
values[record.id] = sum(l.cases_quantity or 0 for l in lines)
return values
@fields.depends(methods=['get_document_cases_quantity',
'get_document_ul_quantity'])
def _compute_document_values(self):
super()._compute_document_values()
self.document_cases_quantity = self.get_document_cases_quantity(
[self])[self.id]
self.document_ul_quantity = self.get_document_ul_quantity(
[self])[self.id]
class CostLineSale(metaclass=PoolMeta):
__name__ = 'sale.cost.line'
document_ul_quantity = fields.Function(
fields.Float('ULs', digits=(16, 0)),
'get_document_ul_quantity')
document_cases_quantity = fields.Function(
fields.Float('Cases', digits=cases_digits),
'get_document_cases_quantity')
def _compute_document_values(self):
super()._compute_document_values()
self.document_cases_quantity = self.get_document_cases_quantity(
[self])[self.id]
self.document_ul_quantity = self.get_document_ul_quantity(
[self])[self.id]
@classmethod
def get_document_ul_quantity(cls, records, name=None):
return {r.id: r.document_line.ul_quantity for r in records}
@classmethod
def get_document_cases_quantity(cls, records, name=None):
return {r.id: r.document_line.cases_quantity for r in records}