Files
tryton/invoice.py
T
Cédric Krier 4d36cf78d7 Include running asset fully amortized in depreciation report
We use the purchase or start date and the closing move date to filter the
assets in the report.
The closing move date is set to the accounting date of the invoice.

issue10041
review330911002
2021-05-02 10:54:50 +02:00

84 lines
3.1 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 fields, Unique
from trytond.pyson import Eval
from trytond.pool import Pool, PoolMeta
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')),
],
states={
'invisible': (~Eval('is_assets_depreciable', False)
| (Eval('_parent_invoice', {}).get('type',
Eval('invoice_type')) != 'out')),
},
depends=['product', 'is_assets_depreciable'])
is_assets_depreciable = fields.Function(fields.Boolean(
'Is Assets depreciable'),
'on_change_with_is_assets_depreciable')
@classmethod
def __setup__(cls):
super(InvoiceLine, cls).__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(InvoiceLine, self).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(InvoiceLine, self).get_move_lines()