103 lines
3.2 KiB
Python
103 lines
3.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.
|
|
|
|
from trytond.model import fields
|
|
from trytond.pool import Pool, PoolMeta
|
|
from trytond.pyson import Bool, Eval, If
|
|
|
|
|
|
def AccountTypeMixin(template=False):
|
|
|
|
class Mixin:
|
|
__slots__ = ()
|
|
unearned_revenue = fields.Boolean(
|
|
"Unearned Revenue",
|
|
domain=[
|
|
If(Eval('statement') != 'balance',
|
|
('unearned_revenue', '=', False), ()),
|
|
],
|
|
states={
|
|
'invisible': ((Eval('statement') != 'balance')
|
|
| Eval('assets', True)),
|
|
})
|
|
if not template:
|
|
for fname in dir(Mixin):
|
|
field = getattr(Mixin, fname)
|
|
if not isinstance(field, fields.Field):
|
|
continue
|
|
field.states['readonly'] = (
|
|
Bool(Eval('template', -1)) & ~Eval('template_override', False))
|
|
return Mixin
|
|
|
|
|
|
class AccountTypeTemplate(AccountTypeMixin(template=True), metaclass=PoolMeta):
|
|
__name__ = 'account.account.type.template'
|
|
|
|
def _get_type_value(self, type=None):
|
|
values = super()._get_type_value(type=type)
|
|
if not type or type.unearned_revenue != self.unearned_revenue:
|
|
values['unearned_revenue'] = self.unearned_revenue
|
|
return values
|
|
|
|
|
|
class AccountType(AccountTypeMixin(), metaclass=PoolMeta):
|
|
__name__ = 'account.account.type'
|
|
|
|
|
|
class Invoice(metaclass=PoolMeta):
|
|
__name__ = 'account.invoice'
|
|
|
|
def get_sales(self, name):
|
|
pool = Pool()
|
|
Line = pool.get('sale.advance_payment.line')
|
|
|
|
sales = set(super().get_sales(name))
|
|
for line in self.lines:
|
|
if isinstance(line.origin, Line):
|
|
sales.add(line.origin.sale.id)
|
|
return list(sales)
|
|
|
|
@classmethod
|
|
def search_sales(cls, name, clause):
|
|
domain = super().search_sales(name, clause)
|
|
return ['OR',
|
|
domain,
|
|
('lines.origin.sale' + clause[0][len(name):],
|
|
*clause[1:3], 'sale.advance_payment.line', *clause[3:]),
|
|
]
|
|
|
|
|
|
class InvoiceLine(metaclass=PoolMeta):
|
|
__name__ = 'account.invoice.line'
|
|
|
|
advance_payment_recalled_lines = fields.One2Many(
|
|
'account.invoice.line', 'origin', "Advance Payment Recalled Lines",
|
|
readonly=True)
|
|
|
|
@classmethod
|
|
def _account_domain(cls, type_):
|
|
domain = super()._account_domain(type_)
|
|
if type_ == 'out':
|
|
domain.append(('type.unearned_revenue', '=', True))
|
|
return domain
|
|
|
|
@property
|
|
def origin_name(self):
|
|
pool = Pool()
|
|
Line = pool.get('sale.advance_payment.line')
|
|
name = super().origin_name
|
|
if isinstance(self.origin, Line) and self.origin.id >= 0:
|
|
name = self.origin.sale.rec_name
|
|
return name
|
|
|
|
@classmethod
|
|
def _get_origin(cls):
|
|
return (super()._get_origin()
|
|
+ ['sale.advance_payment.line'])
|
|
|
|
@classmethod
|
|
def copy(cls, lines, default=None):
|
|
default = default.copy() if default is not None else {}
|
|
default.setdefault('advance_payment_recalled_lines')
|
|
return super().copy(lines, default=default)
|