trytond-carrier_load/sale.py

154 lines
4.9 KiB
Python

# The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from decimal import Decimal
from trytond.model import fields
from trytond.pool import PoolMeta, Pool
from trytond.pyson import Eval
from trytond.transaction import Transaction
class Sale(metaclass=PoolMeta):
__name__ = 'sale.sale'
loads = fields.One2Many('carrier.load.order', 'sale', 'Load orders')
@classmethod
def __setup__(cls):
super(Sale, cls).__setup__()
cls._error_messages.update({
'has_load': 'Cannot delete Sale "%s" due to it has load orders.'
})
@classmethod
def _get_origin(cls):
res = super(Sale, cls)._get_origin()
res.append('carrier.load.order')
return res
@classmethod
def delete(cls, records):
for record in records:
if record.loads and not record.origin:
cls.raise_user_error('has_load', record.rec_name)
super(Sale, cls).delete(records)
@classmethod
def copy(cls, records, default=None):
if default is None:
default = {}
else:
default = default.copy()
default['loads'] = None
return super().copy(records, default=default)
class SaleCreditLimit(metaclass=PoolMeta):
__name__ = 'sale.sale'
@classmethod
def proceed(cls, sales):
for sale in sales:
if sale.state == 'confirmed' and \
sale.shipment_method == 'manual' and \
sale.loads:
sale.party.check_credit_limit(sale.untaxed_amount,
origin=str(sale))
return super(Sale, cls).proceed(sales)
class CostMixin(object):
@classmethod
def __setup__(cls):
super(CostMixin, cls).__setup__()
def get_context_formula(self, cost):
res = super(CostMixin, self).get_context_formula(cost)
res['names'].update({'carrier_amount': Decimal(
cost.document_carrier_amount if cost and
cost.document_carrier_amount else 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_carrier_amount = fields.Function(
fields.Numeric('Sale carrier amount',
digits=(16, Eval('currency_digits', 2)),
depends=['currency_digits']),
'get_document_carrier_amount')
def _compute_document_values(self):
super(CostSale, self)._compute_document_values()
self.document_carrier_amount = self.get_document_carrier_amount()
def get_document_carrier_amount(self, name=None):
pool = Pool()
LoadOrder = pool.get('carrier.load.order')
if not self.document:
return 0
orders = LoadOrder.search([('sale', '=', self.document)])
if not orders:
return 0
amount = sum(order.carrier_amount for order in orders)
if self.currency and orders[0].load.currency != self.currency:
with Transaction().set_context(date=self.document.sale_date):
amount = self.currency.compute(
orders[0].load.currency, amount, self.currency)
return amount
def _must_update_carrier_amount(self):
return self.type_.apply_method == 'none'
class CostSale2(metaclass=PoolMeta):
__name__ = 'sale.cost'
@fields.depends('formula', 'document', 'invoice_party', 'apply_method')
def _load_invoice_party(self):
if (self.formula and 'carrier_amount' in self.formula and
self.document and self.document.loads and
self.apply_method == 'invoice_in' and
not self.invoice_party and
self.document.loads[0].load.carrier):
self.invoice_party = self.document.loads[0].load.carrier.party
@fields.depends(methods=['_load_invoice_party'])
def on_change_template(self):
super().on_change_template()
self._load_invoice_party()
@fields.depends(methods=['_load_invoice_party'])
def on_change_type_(self):
super().on_change_type_()
self._load_invoice_party()
class CostSaleLine(metaclass=PoolMeta):
__name__ = 'sale.cost.line'
document_carrier_amount = fields.Function(
fields.Numeric('Sale carrier amount',
digits=(16, Eval('currency_digits', 2)),
depends=['currency_digits']),
'get_document_carrier_amount')
def get_document_carrier_amount(self, name=None):
if self.cost and self.cost.document_carrier_amount:
if self.cost.document_quantity:
return (self.currency.round(self.document_quantity /
self.cost.document_quantity
) * self.cost.document_carrier_amount)
return 0