From b9fa00b4a90e4313b003fd3af3741c43ccd7ce78 Mon Sep 17 00:00:00 2001 From: Laurent Smet Date: Tue, 30 Jun 2020 09:19:56 +0000 Subject: [PATCH] [FIX] account: Fix 'test_account_bank_statement' in l10n runbot builds X-original-commit: bbf8f9c6b30cb5c0978057efe5f78b5c1492435e --- .../tests/test_account_bank_statement.py | 500 +++++++++--------- 1 file changed, 249 insertions(+), 251 deletions(-) diff --git a/addons/account/tests/test_account_bank_statement.py b/addons/account/tests/test_account_bank_statement.py index e9a5bc82abd..3c080d85b44 100644 --- a/addons/account/tests/test_account_bank_statement.py +++ b/addons/account/tests/test_account_bank_statement.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- from odoo.addons.account.tests.common import AccountTestInvoicingCommon -from odoo.addons.account.tests.common import AccountTestCommon from odoo.tests import tagged from odoo.tests.common import Form from odoo.exceptions import ValidationError, UserError @@ -9,248 +8,6 @@ from odoo import fields from unittest.mock import patch -@tagged('post_install', '-at_install') -class TestBankStatement(AccountTestCommon): - - def setUp(self): - super(TestBankStatement, self).setUp() - self.bs_model = self.env['account.bank.statement'] - self.bsl_model = self.env['account.bank.statement.line'] - self.partner = self.env['res.partner'].create({'name': 'test'}) - self.journal = self.env['account.journal'].create({ - 'name': 'BnkJournal', - 'type': 'bank' - }) - self.journal2 = self.env['account.journal'].create({ - 'name': 'BnkJournal2', - 'type': 'bank' - }) - self.cashjournal = self.env['account.journal'].create({ - 'name': 'CashJournal', - 'type': 'cash' - }) - self.number = 1 - - def create_bank_statement(self, date, line_amount, balance_end_real=False, journal=False): - vals = { - 'name': 'BNK' + str(self.number), - 'date': date, - 'line_ids': [(0, 0, { - 'payment_ref': '_', - 'amount': line_amount, - })], - 'journal_id': journal or self.journal.id - } - if balance_end_real: - vals['balance_end_real'] = balance_end_real - self.number += 1 - return self.bs_model.create(vals) - - def test_compute_balance_end_real_with_lines(self): - bnk1 = self.create_bank_statement('2019-01-02', 100) - self.assertEqual(bnk1.balance_start, 0) - # Balance is automatically computed when creating statement with the lines - self.assertEqual(bnk1.balance_end_real, 100) - self.assertEqual(bnk1.balance_end, 100) - - def test_compute_balance_end_real_without_lines(self): - vals = { - 'name': 'BNK' + str(self.number), - 'date': '2019-01-01', - 'journal_id': self.journal.id - } - bnk1 = self.bs_model.create(vals) - self.assertEqual(bnk1.balance_start, 0) - self.assertEqual(bnk1.balance_end_real, 0) - self.assertEqual(bnk1.balance_end, 0) - # Add a line - self.bsl_model.create({ - 'payment_ref': '_', - 'amount': 10, - 'statement_id': bnk1.id - }) - self.assertEqual(bnk1.balance_start, 0) - # balance_end_real should not have changed - self.assertEqual(bnk1.balance_end_real, 0) - # Compute balance should have been computed - self.assertEqual(bnk1.balance_end, 10) - - def test_create_new_statement(self): - # Create first statement on 1/1/2019 - bnk1 = self.create_bank_statement('2019-01-02', 100) - self.assertEqual(bnk1.balance_start, 0) - # Balance is automatically computed when creating statement with the lines - self.assertEqual(bnk1.balance_end_real, 100) - self.assertEqual(bnk1.balance_end, 100) - self.assertEqual(bnk1.previous_statement_id.id, False) - - # Create a new statement after that one - bnk2 = self.create_bank_statement('2019-01-10', 50) - self.assertEqual(bnk2.balance_start, 100) - self.assertEqual(bnk2.balance_end_real, 150) - self.assertEqual(bnk2.balance_end, 150) - self.assertEqual(bnk2.previous_statement_id.id, bnk1.id) - - # Create new statement with given ending balance - bnk3 = self.create_bank_statement('2019-01-15', 25, 200) - self.assertEqual(bnk3.balance_end_real, 200) - self.assertEqual(bnk3.balance_start, 150) - self.assertEqual(bnk3.balance_end, 175) - self.assertEqual(bnk3.previous_statement_id.id, bnk2.id) - - bnk4 = self.create_bank_statement('2019-01-03', 100) - self.assertEqual(bnk4.balance_start, 100) - self.assertEqual(bnk4.balance_end_real, 200) - self.assertEqual(bnk4.balance_end, 200) - self.assertEqual(bnk4.previous_statement_id.id, bnk1.id) - # Bnk2 should have changed its previous statement - self.assertEqual(bnk2.previous_statement_id.id, bnk4.id) - # The starting balance and balance_end_real should have been recomputed - self.assertEqual(bnk2.balance_start, 200) - self.assertEqual(bnk2.balance_end_real, 250) - self.assertEqual(bnk2.balance_end, 250) - # The starting balance and balance_end_real of next entries should also have been recomputed - # and since we are propagating an update, the balance_end_real should have been recomputed to - # the correct value - self.assertEqual(bnk3.balance_start, 250) - self.assertEqual(bnk3.balance_end_real, 200) # This should not have been recomputed as this is the last of the chain - self.assertEqual(bnk3.balance_end, 275) - bnk3.balance_end_real = 275 # Correct ending balance - - # Change date of bank stmt4 to be the last - self.assertEqual(bnk4.balance_end_real, 200) #Check balance before moving it to the last - bnk4.date = '2019-01-20' - self.assertEqual(bnk1.previous_statement_id.id, False) - self.assertEqual(bnk2.previous_statement_id.id, bnk1.id) - self.assertEqual(bnk3.previous_statement_id.id, bnk2.id) - self.assertEqual(bnk4.previous_statement_id.id, bnk3.id) - self.assertEqual(bnk1.balance_start, 0) - self.assertEqual(bnk2.balance_start, 100) - self.assertEqual(bnk3.balance_start, 150) - self.assertEqual(bnk4.balance_start, 175) - self.assertEqual(bnk1.balance_end_real, 100) - self.assertEqual(bnk2.balance_end_real, 150) - self.assertEqual(bnk3.balance_end_real, 175) - self.assertEqual(bnk4.balance_end_real, 200) # This should not have change - bnk4.balance_end_real = 275 # Correct ending balance - - # Move bnk3 to first position - bnk3.date = '2019-01-01' - self.assertEqual(bnk3.previous_statement_id.id, False) - self.assertEqual(bnk1.previous_statement_id.id, bnk3.id) - self.assertEqual(bnk2.previous_statement_id.id, bnk1.id) - self.assertEqual(bnk4.previous_statement_id.id, bnk2.id) - self.assertEqual(bnk3.balance_start, 0) - self.assertEqual(bnk1.balance_start, 25) - self.assertEqual(bnk2.balance_start, 125) - self.assertEqual(bnk4.balance_start, 175) - self.assertEqual(bnk3.balance_end_real, 25) - self.assertEqual(bnk1.balance_end_real, 125) - self.assertEqual(bnk2.balance_end_real, 175) - self.assertEqual(bnk4.balance_end_real, 275) - - # Change bnk1 and bnk2 - bnk1.date = '2019-01-11' - self.assertEqual(bnk3.previous_statement_id.id, False) - self.assertEqual(bnk2.previous_statement_id.id, bnk3.id) - self.assertEqual(bnk1.previous_statement_id.id, bnk2.id) - self.assertEqual(bnk4.previous_statement_id.id, bnk1.id) - self.assertEqual(bnk3.balance_start, 0) - self.assertEqual(bnk2.balance_start, 25) - self.assertEqual(bnk1.balance_start, 75) - self.assertEqual(bnk4.balance_start, 175) - self.assertEqual(bnk3.balance_end_real, 25) - self.assertEqual(bnk2.balance_end_real, 75) - self.assertEqual(bnk1.balance_end_real, 175) - self.assertEqual(bnk4.balance_end_real, 275) - - def test_create_statements_in_different_journal(self): - # Bank statement create in two different journal should not link with each other - bnk1 = self.create_bank_statement('2019-01-01', 100, 100) - bnk2 = self.create_bank_statement('2019-01-10', 50) - - bnk1other = self.create_bank_statement('2019-01-02', 20, 20, self.journal2.id) - bnk2other = self.create_bank_statement('2019-01-12', 10, False, self.journal2.id) - - self.assertEqual(bnk1.previous_statement_id.id, False) - self.assertEqual(bnk2.previous_statement_id.id, bnk1.id) - self.assertEqual(bnk1.balance_start, 0) - self.assertEqual(bnk2.balance_start, 100) - self.assertEqual(bnk2.balance_end_real, 150) - - self.assertEqual(bnk1other.previous_statement_id.id, False) - self.assertEqual(bnk2other.previous_statement_id.id, bnk1other.id) - self.assertEqual(bnk1other.balance_start, 0) - self.assertEqual(bnk2other.balance_start, 20) - self.assertEqual(bnk2other.balance_end_real, 30) - - def test_statement_cash_journal(self): - # Entry in cash journal should not recompute the balance_end_real - cash1 = self.create_bank_statement('2019-01-01', 100, 100, self.cashjournal.id) - cash2 = self.create_bank_statement('2019-01-03', 100, False, self.cashjournal.id) - self.assertEqual(cash1.balance_start, 0) - self.assertEqual(cash1.balance_end_real, 100) - self.assertEqual(cash2.balance_start, 100) - self.assertEqual(cash2.balance_end_real, 0) - cash2.balance_end_real = 1000 - self.assertEqual(cash2.balance_end_real, 1000) - # add cash entry in between, should recompute starting balance of cash2 entry but not ending balance - cash3 = self.create_bank_statement('2019-01-02', 100, 200, self.cashjournal.id) - self.assertEqual(cash3.balance_start, 100) - self.assertEqual(cash3.balance_end_real, 200) - self.assertEqual(cash2.balance_start, 200) - self.assertEqual(cash2.balance_end_real, 1000) - - def test_is_valid_balance_start(self): - bnk1 = self.create_bank_statement('2019-01-01', 100, 100.0000001) - bnk2 = self.create_bank_statement('2019-01-10', 50) - bnk2.write({'balance_start': 100}) - self.assertTrue(bnk2.is_valid_balance_start) - bnk2.write({'balance_start': 100.01}) - self.assertFalse(bnk2.is_valid_balance_start) - - def test_unlink_bank_statement(self): - bnk1 = self.create_bank_statement('2019-01-02', 100) - bnk2 = self.create_bank_statement('2019-01-10', 50) - bnk3 = self.create_bank_statement('2019-01-15', 25) - bnk4 = self.create_bank_statement('2019-01-21', 100) - bnk5 = self.create_bank_statement('2019-01-22', 100) - self.assertEqual(bnk1.previous_statement_id.id, False) - self.assertEqual(bnk2.previous_statement_id.id, bnk1.id) - self.assertEqual(bnk3.previous_statement_id.id, bnk2.id) - self.assertEqual(bnk4.previous_statement_id.id, bnk3.id) - self.assertEqual(bnk5.previous_statement_id.id, bnk4.id) - self.assertEqual(bnk1.balance_start, 0) - self.assertEqual(bnk1.balance_end_real, 100) - self.assertEqual(bnk2.balance_start, 100) - self.assertEqual(bnk2.balance_end_real, 150) - self.assertEqual(bnk3.balance_start, 150) - self.assertEqual(bnk3.balance_end_real, 175) - self.assertEqual(bnk4.balance_start, 175) - self.assertEqual(bnk4.balance_end_real, 275) - self.assertEqual(bnk5.balance_start, 275) - self.assertEqual(bnk5.balance_end_real, 375) - - # Delete bnk2 and check that previous_statement_id and balance are correct - bnk2.unlink() - self.assertEqual(bnk1.previous_statement_id.id, False) - self.assertEqual(bnk3.previous_statement_id.id, bnk1.id) - self.assertEqual(bnk4.previous_statement_id.id, bnk3.id) - self.assertEqual(bnk5.previous_statement_id.id, bnk4.id) - self.assertEqual(bnk3.balance_start, 100) - self.assertEqual(bnk3.balance_end_real, 125) - self.assertEqual(bnk4.balance_start, 125) - self.assertEqual(bnk4.balance_end_real, 225) - self.assertEqual(bnk5.balance_start, 225) - self.assertEqual(bnk5.balance_end_real, 375) # Ending balance of last statement should not have changed - - # Delete bnk1 bnk3 and bnk4 at the same time and check that balance are correct - (bnk1 + bnk3 + bnk4).unlink() - self.assertEqual(bnk5.previous_statement_id.id, False) - self.assertEqual(bnk5.balance_start, 0) - self.assertEqual(bnk5.balance_end_real, 375) # Ending balance of last statement should not have changed - - class TestAccountBankStatementCommon(AccountTestInvoicingCommon): @classmethod @@ -279,6 +36,255 @@ class TestAccountBankStatementCommon(AccountTestInvoicingCommon): cls.currency_3 = cls.currency_data_2['currency'] cls.currency_4 = cls.currency_data_3['currency'] + def assertBankStatementLine(self, statement_line, expected_statement_line_vals, expected_move_line_vals): + self.assertRecordValues(statement_line, [expected_statement_line_vals]) + self.assertRecordValues(statement_line.line_ids.sorted('balance'), expected_move_line_vals) + + +@tagged('post_install', '-at_install') +class TestAccountBankStatement(TestAccountBankStatementCommon): + + # ------------------------------------------------------------------------- + # TESTS about the statement model. + # ------------------------------------------------------------------------- + + def test_starting_ending_balance_chaining(self): + # Create first statement on 2019-01-02. + bnk1 = self.env['account.bank.statement'].create({ + 'name': 'BNK1', + 'date': '2019-01-02', + 'journal_id': self.company_data['default_journal_bank'].id, + 'line_ids': [(0, 0, {'payment_ref': '/', 'amount': 100.0})], + }) + self.assertRecordValues(bnk1, [{ + 'balance_start': 0.0, + 'balance_end_real': 100.0, + 'balance_end': 100.0, + 'previous_statement_id': False, + }]) + + # Create a new statement after that one. + bnk2 = self.env['account.bank.statement'].create({ + 'name': 'BNK2', + 'date': '2019-01-10', + 'journal_id': self.company_data['default_journal_bank'].id, + 'line_ids': [(0, 0, {'payment_ref': '/', 'amount': 50.0})], + }) + self.assertRecordValues(bnk2, [{ + 'balance_start': 100.0, + 'balance_end_real': 150.0, + 'balance_end': 150.0, + 'previous_statement_id': bnk1.id, + }]) + + # Create new statement with given ending balance. + bnk3 = self.env['account.bank.statement'].create({ + 'name': 'BNK3', + 'date': '2019-01-15', + 'journal_id': self.company_data['default_journal_bank'].id, + 'line_ids': [(0, 0, {'payment_ref': '/', 'amount': 25.0})], + 'balance_end_real': 200.0, + }) + self.assertRecordValues(bnk3, [{ + 'balance_start': 150.0, + 'balance_end_real': 200.0, + 'balance_end': 175.0, + 'previous_statement_id': bnk2.id, + }]) + + # Create new statement with a date right after BNK1. + bnk4 = self.env['account.bank.statement'].create({ + 'name': 'BNK4', + 'date': '2019-01-03', + 'journal_id': self.company_data['default_journal_bank'].id, + 'line_ids': [(0, 0, {'payment_ref': '/', 'amount': 100.0})], + }) + self.assertRecordValues(bnk4, [{ + 'balance_start': 100.0, + 'balance_end_real': 200.0, + 'balance_end': 200.0, + 'previous_statement_id': bnk1.id, + }]) + + # BNK2/BNK3 should have changed their previous statements. + self.assertRecordValues(bnk2, [{ + 'balance_start': 200.0, + 'balance_end_real': 250.0, + 'balance_end': 250.0, + 'previous_statement_id': bnk4.id, + }]) + self.assertRecordValues(bnk3, [{ + 'balance_start': 250.0, + 'balance_end_real': 200.0, + 'balance_end': 275.0, + 'previous_statement_id': bnk2.id, + }]) + + # Correct the ending balance of BNK3. + bnk3.balance_end_real = 275 + + # Change date of BNK4 to be the last. + bnk4.date = '2019-01-20' + self.assertRecordValues(bnk1, [{ + 'balance_start': 0.0, + 'balance_end_real': 100.0, + 'balance_end': 100.0, + 'previous_statement_id': False, + }]) + self.assertRecordValues(bnk2, [{ + 'balance_start': 100.0, + 'balance_end_real': 150.0, + 'balance_end': 150.0, + 'previous_statement_id': bnk1.id, + }]) + self.assertRecordValues(bnk3, [{ + 'balance_start': 150.0, + 'balance_end_real': 175.0, + 'balance_end': 175.0, + 'previous_statement_id': bnk2.id, + }]) + self.assertRecordValues(bnk4, [{ + 'balance_start': 175.0, + 'balance_end_real': 200.0, + 'balance_end': 275.0, + 'previous_statement_id': bnk3.id, + }]) + + # Correct the ending balance of BNK4. + bnk4.balance_end_real = 275 + + # Move BNK3 to first position. + bnk3.date = '2019-01-01' + self.assertRecordValues(bnk3, [{ + 'balance_start': 0.0, + 'balance_end_real': 25.0, + 'balance_end': 25.0, + 'previous_statement_id': False, + }]) + self.assertRecordValues(bnk1, [{ + 'balance_start': 25.0, + 'balance_end_real': 125.0, + 'balance_end': 125.0, + 'previous_statement_id': bnk3.id, + }]) + self.assertRecordValues(bnk2, [{ + 'balance_start': 125.0, + 'balance_end_real': 175.0, + 'balance_end': 175.0, + 'previous_statement_id': bnk1.id, + }]) + self.assertRecordValues(bnk4, [{ + 'balance_start': 175.0, + 'balance_end_real': 275.0, + 'balance_end': 275.0, + 'previous_statement_id': bnk2.id, + }]) + + # Move BNK1 to the third position. + bnk1.date = '2019-01-11' + self.assertRecordValues(bnk3, [{ + 'balance_start': 0.0, + 'balance_end_real': 25.0, + 'balance_end': 25.0, + 'previous_statement_id': False, + }]) + self.assertRecordValues(bnk2, [{ + 'balance_start': 25.0, + 'balance_end_real': 75.0, + 'balance_end': 75.0, + 'previous_statement_id': bnk3.id, + }]) + self.assertRecordValues(bnk1, [{ + 'balance_start': 75.0, + 'balance_end_real': 175.0, + 'balance_end': 175.0, + 'previous_statement_id': bnk2.id, + }]) + self.assertRecordValues(bnk4, [{ + 'balance_start': 175.0, + 'balance_end_real': 275.0, + 'balance_end': 275.0, + 'previous_statement_id': bnk1.id, + }]) + + # Delete BNK3 and BNK1. + (bnk3 + bnk1).unlink() + self.assertRecordValues(bnk2, [{ + 'balance_start': 0.0, + 'balance_end_real': 50.0, + 'balance_end': 50.0, + 'previous_statement_id': False, + }]) + self.assertRecordValues(bnk4, [{ + 'balance_start': 50.0, + 'balance_end_real': 275.0, + 'balance_end': 150.0, + 'previous_statement_id': bnk2.id, + }]) + + def test_statements_different_journal(self): + # Create statements in bank journal. + bnk1_1 = self.env['account.bank.statement'].create({ + 'name': 'BNK1_1', + 'date': '2019-01-01', + 'journal_id': self.company_data['default_journal_bank'].id, + 'line_ids': [(0, 0, {'payment_ref': '/', 'amount': 100.0})], + 'balance_end_real': 100.0, + }) + bnk1_2 = self.env['account.bank.statement'].create({ + 'name': 'BNK1_2', + 'date': '2019-01-10', + 'journal_id': self.company_data['default_journal_bank'].id, + 'line_ids': [(0, 0, {'payment_ref': '/', 'amount': 50.0})], + }) + + # Create statements in cash journal. + bnk2_1 = self.env['account.bank.statement'].create({ + 'name': 'BNK2_1', + 'date': '2019-01-02', + 'journal_id': self.company_data['default_journal_cash'].id, + 'line_ids': [(0, 0, {'payment_ref': '/', 'amount': 20.0})], + 'balance_end_real': 20.0, + }) + bnk2_2 = self.env['account.bank.statement'].create({ + 'name': 'BNK2_2', + 'date': '2019-01-12', + 'journal_id': self.company_data['default_journal_cash'].id, + 'line_ids': [(0, 0, {'payment_ref': '/', 'amount': 10.0})], + }) + self.assertRecordValues(bnk1_1, [{ + 'balance_start': 0.0, + 'balance_end_real': 100.0, + 'balance_end': 100.0, + 'previous_statement_id': False, + }]) + self.assertRecordValues(bnk1_2, [{ + 'balance_start': 100.0, + 'balance_end_real': 150.0, + 'balance_end': 150.0, + 'previous_statement_id': bnk1_1.id, + }]) + self.assertRecordValues(bnk2_1, [{ + 'balance_start': 0.0, + 'balance_end_real': 20.0, + 'balance_end': 20.0, + 'previous_statement_id': False, + }]) + self.assertRecordValues(bnk2_2, [{ + 'balance_start': 20.0, + 'balance_end_real': 0.0, + 'balance_end': 30.0, + 'previous_statement_id': bnk2_1.id, + }]) + + +@tagged('post_install', '-at_install') +class TestAccountBankStatementLine(TestAccountBankStatementCommon): + + @classmethod + def setUpClass(cls, chart_template_ref=None): + super().setUpClass(chart_template_ref=chart_template_ref) + cls.statement = cls.env['account.bank.statement'].create({ 'name': 'test_statement', 'date': '2019-01-01', @@ -328,14 +334,6 @@ class TestAccountBankStatementCommon(AccountTestInvoicingCommon): 'amount_currency': -2500.0, } - def assertBankStatementLine(self, statement_line, expected_statement_line_vals, expected_move_line_vals): - self.assertRecordValues(statement_line, [expected_statement_line_vals]) - self.assertRecordValues(statement_line.line_ids.sorted('balance'), expected_move_line_vals) - - -@tagged('post_install', '-at_install') -class TestAccountBankStatement(TestAccountBankStatementCommon): - # ------------------------------------------------------------------------- # TESTS about the statement line model. # -------------------------------------------------------------------------