This is needed in order to support use cases where we have several account.move.line on an account_id of internal_type 'bank' inside a single account.move. Indeed, each journal item should be linked to a bank statement line in order to disappear from the bank reconciliation widget and, previously, setting the reference to the second bank statement line was removing the first as both info had to be filled in a single m2o. OPW: 696842
91 lines
3.4 KiB
Python
91 lines
3.4 KiB
Python
from odoo.addons.account.tests.account_test_classes import AccountingTestCase
|
|
|
|
class TestBankStatementReconciliation(AccountingTestCase):
|
|
|
|
def setUp(self):
|
|
super(TestBankStatementReconciliation, self).setUp()
|
|
self.i_model = self.env['account.invoice']
|
|
self.il_model = self.env['account.invoice.line']
|
|
self.bs_model = self.env['account.bank.statement']
|
|
self.bsl_model = self.env['account.bank.statement.line']
|
|
self.partner_agrolait = self.env.ref("base.res_partner_2")
|
|
|
|
def test_reconciliation_proposition(self):
|
|
rcv_mv_line = self.create_invoice(100)
|
|
st_line = self.create_statement_line(100)
|
|
|
|
# exact amount match
|
|
rec_prop = st_line.get_reconciliation_proposition()
|
|
self.assertEqual(len(rec_prop), 1)
|
|
self.assertEqual(rec_prop[0].id, rcv_mv_line.id)
|
|
|
|
def test_full_reconcile(self):
|
|
rcv_mv_line = self.create_invoice(100)
|
|
st_line = self.create_statement_line(100)
|
|
# reconcile
|
|
st_line.process_reconciliation(counterpart_aml_dicts=[{
|
|
'move_line': rcv_mv_line,
|
|
'credit': 100,
|
|
'debit': 0,
|
|
'name': rcv_mv_line.name,
|
|
}])
|
|
|
|
# check everything went as expected
|
|
self.assertTrue(st_line.journal_entry_ids)
|
|
counterpart_mv_line = None
|
|
for l in st_line.journal_entry_ids:
|
|
if l.account_id.user_type_id.type == 'receivable':
|
|
counterpart_mv_line = l
|
|
break
|
|
self.assertIsNotNone(counterpart_mv_line)
|
|
self.assertTrue(rcv_mv_line.reconciled)
|
|
self.assertTrue(counterpart_mv_line.reconciled)
|
|
self.assertEqual(counterpart_mv_line.matched_credit_ids, rcv_mv_line.matched_debit_ids)
|
|
|
|
def test_reconcile_with_write_off(self):
|
|
pass
|
|
|
|
def create_invoice(self, amount):
|
|
""" Return the move line that gets to be reconciled (the one in the receivable account) """
|
|
vals = {'partner_id': self.partner_agrolait.id,
|
|
'type': 'out_invoice',
|
|
'name': '-',
|
|
'currency_id': self.env.user.company_id.currency_id.id,
|
|
}
|
|
# new creates a temporary record to apply the on_change afterwards
|
|
invoice = self.i_model.new(vals)
|
|
invoice._onchange_partner_id()
|
|
vals.update({'account_id': invoice.account_id.id})
|
|
invoice = self.i_model.create(vals)
|
|
|
|
self.il_model.create({
|
|
'quantity': 1,
|
|
'price_unit': amount,
|
|
'invoice_id': invoice.id,
|
|
'name': '.',
|
|
'account_id': self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id)], limit=1).id,
|
|
})
|
|
invoice.action_invoice_open()
|
|
|
|
mv_line = None
|
|
for l in invoice.move_id.line_ids:
|
|
if l.account_id.id == vals['account_id']:
|
|
mv_line = l
|
|
self.assertIsNotNone(mv_line)
|
|
|
|
return mv_line
|
|
|
|
def create_statement_line(self, st_line_amount):
|
|
journal = self.bs_model.with_context(journal_type='bank')._default_journal()
|
|
#journal = self.env.ref('l10n_be.bank_journal')
|
|
bank_stmt = self.bs_model.create({'journal_id': journal.id})
|
|
|
|
bank_stmt_line = self.bsl_model.create({
|
|
'name': '_',
|
|
'statement_id': bank_stmt.id,
|
|
'partner_id': self.partner_agrolait.id,
|
|
'amount': st_line_amount,
|
|
})
|
|
|
|
return bank_stmt_line
|