# The COPYRIGHT file at the top level of this repository contains the full # copyright notices and license terms. from trytond.exceptions import UserError from trytond.i18n import gettext from trytond.model import ModelSQL, ModelView, fields from trytond.modules.currency.fields import Monetary from trytond.pool import Pool from trytond.rpc import RPC from trytond.transaction import Transaction class AccountBankReconciliation(ModelView, ModelSQL): 'Account Bank Reconciliation' __name__ = 'account.bank.reconciliation' amount = Monetary('Amount', digits='currency', currency='currency', required=True) currency = fields.Function( fields.Many2One('currency.currency', 'Currency'), 'on_change_with_currency') move_line = fields.Many2One('account.move.line', 'Move Line', required=True, readonly=True, ondelete='CASCADE') move_date = fields.Function(fields.Date('Move date'), 'get_move_field', searcher='search_move_field') move_origin = fields.Function( fields.Reference('Move origin', selection='get_move_origin'), 'get_move_field', searcher='search_move_field') move_description = fields.Function( fields.Char('Move description'), 'get_move_field', searcher='search_move_field') bank_statement_line = fields.Many2One('account.bank.statement.line', 'Bank Statement Line', select=True) @classmethod def __setup__(cls): super(AccountBankReconciliation, cls).__setup__() cls.__rpc__.update({ 'get_move_origin': RPC(), }) @classmethod def write(cls, *args): super(AccountBankReconciliation, cls).write(*args) actions = iter(args) if not Transaction().context.get('from_account_bank_statement_line'): for lines, _ in zip(actions, actions): move_lines = set([x.move_line for x in lines]) for move_line in move_lines: move_line.check_bank_lines() @classmethod def delete(cls, lines): if not Transaction().context.get('from_account_bank_statement_line'): unallowed = [x for x in lines if x.bank_statement_line] if unallowed: line = unallowed[0] raise UserError(gettext( 'account_bank_statement.delete_reconciled', amount=line.amount, statement_line=line.bank_statement_line.rec_name)) super(AccountBankReconciliation, cls).delete(lines) @fields.depends('move_line', '_parent_move_line.account') def on_change_with_currency(self, name=None): if self.move_line and self.move_line.currency: return self.move_line.account.company.currency.id @classmethod def get_move_origin(cls): Move = Pool().get('account.move') return Move.get_origin() def get_move_field(self, name): field = getattr(self.__class__, name) if name.startswith('move_') and name != 'move_origin': name = name[5:] value = getattr(self.move_line, name) if isinstance(value, ModelSQL): if field._type == 'reference': return str(value) return value.id return value @classmethod def search_move_field(cls, name, clause): if name.startswith('move_') and name != 'move_origin': name = name[5:] return [('move_line.' + name,) + tuple(clause[1:])] def _order_move_field(name): def move_field(tables): pool = Pool() Move = pool.get('account.move.line') field = Move._fields[name] table, _ = tables[None] move_tables = tables.get('move') if move_tables is None: move = Move.__table__() move_tables = { None: (move, move.id == table.move_line), } tables['move'] = move_tables return field.convert_order(name, move_tables, Move) return staticmethod(move_field) order_move_date = _order_move_field('date') order_move_origin = _order_move_field('move_origin') order_move_description = _order_move_field('description')