Files
tryton/statement.py
T

164 lines
6.2 KiB
Python
Raw Normal View History

2014-09-17 21:54:48 +02:00
# 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.pool import PoolMeta, Pool
from trytond.model import fields
from trytond.pyson import Eval, If, Bool
from trytond.transaction import Transaction
__all__ = ['Statement', 'StatementLine']
2014-09-17 21:54:48 +02:00
class Statement:
2016-03-08 12:19:16 +01:00
__metaclass__ = PoolMeta
__name__ = 'account.statement'
@classmethod
def create_move(cls, statements):
pool = Pool()
MoveLine = pool.get('account.move.line')
Payment = pool.get('account.payment')
moves = super(Statement, cls).create_move(statements)
to_success = []
to_fail = []
for move, statement, lines in moves:
for line in lines:
if line.payment:
payments = [line.payment]
kind = line.payment.kind
elif line.payment_group:
payments = line.payment_group.payments
kind = line.payment_group.kind
else:
continue
if (kind == 'receivable') == (line.amount >= 0):
to_success.extend(payments)
else:
to_fail.extend(payments)
# The failing should be done last because success is usually not a
# definitive state
if to_success:
Payment.succeed(to_success)
if to_fail:
Payment.fail(to_fail)
for move, statement, lines in moves:
assert len({l.payment for l in lines}) == 1
line = lines[0]
if line.payment and line.payment.clearing_move:
clearing_account = line.payment.journal.clearing_account
if clearing_account.reconcile:
to_reconcile = []
for line in move.lines + line.payment.clearing_move.lines:
if (line.account == clearing_account
and not line.reconciliation):
to_reconcile.append(line)
if not sum((l.debit - l.credit) for l in to_reconcile):
MoveLine.reconcile(to_reconcile)
return moves
def _group_key(self, line):
key = super(Statement, self)._group_key(line)
return key + (('payment', line.payment),)
2014-09-17 21:54:48 +02:00
class StatementLine:
2016-03-08 12:19:16 +01:00
__metaclass__ = PoolMeta
2014-09-17 21:54:48 +02:00
__name__ = 'account.statement.line'
payment = fields.Many2One('account.payment', 'Payment',
domain=[
If(Bool(Eval('party')), [('party', '=', Eval('party'))], []),
('state', 'in', ['processing', 'succeeded', 'failed']),
2014-09-17 21:54:48 +02:00
],
states={
'invisible': Bool(Eval('payment_group')) | Bool(Eval('invoice')),
'readonly': Eval('statement_state') != 'draft',
},
depends=['party', 'statement_state'])
payment_group = fields.Many2One(
'account.payment.group', "Payment Group",
domain=[
('company', '=', Eval('_parent_statement', {}).get('company', -1)),
],
states={
'invisible': Bool(Eval('payment')) | Bool(Eval('invoice')),
'readonly': Eval('statement_state') != 'draft',
},
depends=['statement_state'])
@classmethod
def __setup__(cls):
super(StatementLine, cls).__setup__()
invoice_invisible = Bool(Eval('payment')) | Bool(Eval('payment_group'))
if 'invisible' in cls.invoice.states:
cls.invoice.states['invisible'] |= invoice_invisible
else:
cls.invoice.states['invisible'] = invoice_invisible
2014-09-17 21:54:48 +02:00
@classmethod
def copy(cls, lines, default=None):
if default is None:
default = {}
else:
default = default.copy()
2014-09-17 21:54:48 +02:00
default.setdefault('payment', None)
default.setdefault('payment_group')
2014-09-17 21:54:48 +02:00
return super(StatementLine, cls).copy(lines, default=default)
@fields.depends('payment', 'party', 'account', '_parent_statement.journal')
def on_change_payment(self):
pool = Pool()
Currency = pool.get('currency.currency')
if self.payment:
if not self.party:
2014-10-29 20:39:19 +01:00
self.party = self.payment.party
2014-09-17 21:54:48 +02:00
clearing_account = self.payment.journal.clearing_account
if not self.account and clearing_account:
2014-10-29 20:39:19 +01:00
self.account = clearing_account
2014-09-17 21:54:48 +02:00
if self.statement and self.statement.journal:
with Transaction().set_context(date=self.payment.date):
amount = Currency.compute(self.payment.currency,
self.payment.amount, self.statement.journal.currency)
2014-10-29 20:39:19 +01:00
self.amount = amount
2014-09-17 21:54:48 +02:00
if self.payment.kind == 'payable':
2014-10-29 20:39:19 +01:00
self.amount *= -1
2014-09-17 21:54:48 +02:00
@fields.depends('payment_group', 'account')
def on_change_payment_group(self):
if self.payment_group:
self.party = None
clearing_account = self.payment_group.journal.clearing_account
if not self.account and clearing_account:
self.account = clearing_account
2014-09-17 21:54:48 +02:00
@fields.depends('party', 'payment')
def on_change_party(self):
2014-10-29 20:39:19 +01:00
super(StatementLine, self).on_change_party()
2014-09-17 21:54:48 +02:00
if self.payment:
if self.payment.party != self.party:
2014-10-29 20:39:19 +01:00
self.payment = None
self.payment_group = None
2014-09-17 21:54:48 +02:00
@fields.depends('account', 'payment', 'payment_group')
2014-09-17 21:54:48 +02:00
def on_change_account(self):
2014-10-29 20:39:19 +01:00
super(StatementLine, self).on_change_account()
2014-09-17 21:54:48 +02:00
if self.payment:
clearing_account = self.payment.journal.clearing_account
elif self.payment_group:
clearing_account = self.payment_group.journal.clearing_account
else:
return
if self.account != clearing_account:
self.payment = None
2014-09-17 21:54:48 +02:00
@classmethod
def post_move(cls, lines):
pool = Pool()
Move = pool.get('account.move')
super(StatementLine, cls).post_move(lines)
Move.post([l.payment.clearing_move for l in lines
if l.payment
and l.payment.clearing_move
and l.payment.clearing_move.state == 'draft'])