83 lines
3.0 KiB
Python
83 lines
3.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 Unique, fields
|
|
from trytond.pool import Pool, PoolMeta
|
|
from trytond.pyson import Eval
|
|
from trytond.transaction import Transaction
|
|
|
|
|
|
class InvoiceLine(metaclass=PoolMeta):
|
|
__name__ = 'account.invoice.line'
|
|
asset = fields.Many2One('account.asset', 'Asset', domain=[
|
|
('state', '=', 'running'),
|
|
('product', '=', Eval('product', -1)),
|
|
],
|
|
states={
|
|
'invisible': (~Eval('is_assets_depreciable', False)
|
|
| (Eval('invoice_type') != 'out')),
|
|
'readonly': Eval('invoice_state') != 'draft',
|
|
})
|
|
is_assets_depreciable = fields.Function(fields.Boolean(
|
|
'Is Assets depreciable'),
|
|
'on_change_with_is_assets_depreciable')
|
|
|
|
@classmethod
|
|
def __setup__(cls):
|
|
super().__setup__()
|
|
table = cls.__table__()
|
|
cls._sql_constraints += [
|
|
('asset_uniq', Unique(table, table.asset),
|
|
'account_asset.msg_invoice_line_asset_unique'),
|
|
]
|
|
|
|
@classmethod
|
|
def _account_domain(cls, type_):
|
|
domain = super()._account_domain(type_)
|
|
if type_ == 'in':
|
|
domain.append(('type.fixed_asset', '=', True))
|
|
return domain
|
|
|
|
@fields.depends('product', 'invoice', 'invoice_type',
|
|
'_parent_invoice.invoice_date', '_parent_invoice.accounting_date')
|
|
def on_change_product(self):
|
|
super().on_change_product()
|
|
if self.invoice and self.invoice.type:
|
|
type_ = self.invoice.type
|
|
else:
|
|
type_ = self.invoice_type
|
|
|
|
if (self.product and type_ == 'in'
|
|
and self.product.type == 'assets'
|
|
and self.product.depreciable):
|
|
date = (self.invoice.accounting_date or self.invoice.invoice_date
|
|
if self.invoice else None)
|
|
with Transaction().set_context(date=date):
|
|
self.account = self.product.account_asset_used
|
|
|
|
@fields.depends('asset', 'unit')
|
|
def on_change_asset(self):
|
|
Uom = Pool().get('product.uom')
|
|
|
|
if self.asset:
|
|
quantity = self.asset.quantity
|
|
if self.unit:
|
|
quantity = Uom.compute_qty(self.asset.unit, quantity,
|
|
self.unit)
|
|
self.quantity = quantity
|
|
else:
|
|
self.quantity = quantity
|
|
self.unit = self.unit
|
|
|
|
@fields.depends('product')
|
|
def on_change_with_is_assets_depreciable(self, name=None):
|
|
if self.product:
|
|
return self.product.type == 'assets' and self.product.depreciable
|
|
return False
|
|
|
|
def get_move_lines(self):
|
|
Asset = Pool().get('account.asset')
|
|
if self.asset:
|
|
date = self.invoice.accounting_date or self.invoice.invoice_date
|
|
Asset.close([self.asset], account=self.account, date=date)
|
|
return super().get_move_lines()
|