From cc242ac4bab0cdfbf06c31564a9904f0097eb166 Mon Sep 17 00:00:00 2001 From: Florian da Costa Date: Tue, 1 Oct 2024 12:11:57 +0200 Subject: [PATCH] [IMP] account_reconcile_oca : improve tests around multi-currency --- .../models/account_bank_statement_line.py | 2 +- .../tests/test_bank_account_reconcile.py | 122 +++++++++++------- 2 files changed, 76 insertions(+), 48 deletions(-) diff --git a/account_reconcile_oca/models/account_bank_statement_line.py b/account_reconcile_oca/models/account_bank_statement_line.py index 4a7b3aba67..97a3583929 100644 --- a/account_reconcile_oca/models/account_bank_statement_line.py +++ b/account_reconcile_oca/models/account_bank_statement_line.py @@ -1048,7 +1048,7 @@ def _get_exchange_rate_amount(self, amount, currency_amount, currency, line): self.company_id, self.date, ) - return to_amount - amount + return self.company_id.currency_id.round(to_amount - amount) def _compute_exchange_rate( self, diff --git a/account_reconcile_oca/tests/test_bank_account_reconcile.py b/account_reconcile_oca/tests/test_bank_account_reconcile.py index d2b3290ce7..76fd638d18 100644 --- a/account_reconcile_oca/tests/test_bank_account_reconcile.py +++ b/account_reconcile_oca/tests/test_bank_account_reconcile.py @@ -74,7 +74,6 @@ def test_reconcile_invoice_currency(self): inv1 = self.create_invoice(currency_id=self.currency_usd_id, invoice_amount=100) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -102,6 +101,42 @@ def test_reconcile_invoice_currency(self): self.assertFalse(f.add_account_move_line_id) self.assertTrue(f.can_reconcile) + def test_manual_line_with_currency(self): + bank_stmt = self.acc_bank_stmt_model.create( + { + "journal_id": self.bank_journal_euro.id, + "date": time.strftime("%Y-07-15"), + "name": "test", + } + ) + bank_stmt_line = self.acc_bank_stmt_line_model.create( + { + "name": "testLine", + "journal_id": self.bank_journal_euro.id, + "statement_id": bank_stmt.id, + "amount": 50, + "amount_currency": 100, + "foreign_currency_id": self.currency_usd_id, + "date": time.strftime("%Y-07-15"), + } + ) + receivable_acc = self.company_data["default_account_receivable"] + with Form( + bank_stmt_line, + view="account_reconcile_oca.bank_statement_line_form_reconcile_view", + ) as f: + self.assertFalse(f.can_reconcile) + f.manual_reference = "reconcile_auxiliary;1" + f.manual_account_id = receivable_acc + self.assertTrue(f.can_reconcile) + bank_stmt_line.reconcile_bank_line() + receivable_line = bank_stmt_line.line_ids.filtered( + lambda line: line.account_id == receivable_acc + ) + self.assertEqual(receivable_line.currency_id.id, self.currency_usd_id) + self.assertEqual(receivable_line.amount_currency, -100) + self.assertEqual(receivable_line.balance, -50) + def test_reconcile_invoice_reconcile_full(self): """ We want to test the reconcile widget for bank statements on invoices. @@ -113,7 +148,6 @@ def test_reconcile_invoice_reconcile_full(self): ) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -162,7 +196,6 @@ def test_reconcile_invoice_unreconcile(self): ) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -225,7 +258,6 @@ def test_reconcile_invoice_partial(self): ) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -289,7 +321,6 @@ def test_reconcile_invoice_partial_supplier(self): ) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -343,7 +374,6 @@ def test_reconcile_model(self): """ bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -387,7 +417,6 @@ def test_reconcile_model_tax_included(self): ) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -442,7 +471,6 @@ def test_reconcile_invoice_model(self): ) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -502,7 +530,6 @@ def test_reconcile_rule_on_create(self): bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -532,7 +559,6 @@ def test_reconcile_invoice_keep(self): ) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -590,7 +616,6 @@ def test_reconcile_invoice_to_check_reconciled(self): ) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -632,7 +657,6 @@ def test_reconcile_invoice_to_check_not_reconciled(self): """ bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -667,7 +691,6 @@ def test_widget_invoice_clean(self): ) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -705,7 +728,6 @@ def test_widget_invoice_delete(self): ) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -746,7 +768,6 @@ def test_widget_invoice_unselect(self): ) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -787,7 +808,6 @@ def test_widget_invoice_change_partner(self): ) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -823,7 +843,6 @@ def test_widget_model_clean(self): """ bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -874,7 +893,6 @@ def test_bank_statement_line_actions(self): """ bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -917,7 +935,6 @@ def test_filter_partner(self): bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -981,7 +998,6 @@ def test_partner_name_with_parent(self): bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_euro.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -1013,7 +1029,6 @@ def test_journal_foreign_currency(self): inv1 = self.create_invoice(currency_id=self.currency_usd_id, invoice_amount=100) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_usd.id, "date": time.strftime("%Y-07-15"), "name": "test", @@ -1052,45 +1067,50 @@ def test_journal_foreign_currency(self): ) def test_journal_foreign_currency_change(self): + cny = self.env.ref("base.CNY") + cny.write({"active": True}) + cny_journal = self.env["account.journal"].create( + { + "name": "Bank CNY", + "type": "bank", + "currency_id": cny.id, + } + ) self.env["res.currency.rate"].create( { - "currency_id": self.env.ref("base.EUR").id, - "name": time.strftime("%Y-07-14"), - "rate": 1.15, + "name": time.strftime("%Y-09-10"), + "currency_id": cny.id, + "inverse_company_rate": 0.125989013758, + } + ) + self.env["res.currency.rate"].create( + { + "name": time.strftime("%Y-09-09"), + "currency_id": cny.id, + "inverse_company_rate": 0.126225969731, } ) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, - "journal_id": self.bank_journal_usd.id, - "date": time.strftime("%Y-07-15"), + "journal_id": cny_journal.id, + "date": time.strftime("%Y-09-10"), "name": "test", } ) bank_stmt_line = self.acc_bank_stmt_line_model.create( { "name": "testLine", - "journal_id": self.bank_journal_usd.id, + "journal_id": cny_journal.id, "statement_id": bank_stmt.id, - "amount": 100, - "date": time.strftime("%Y-07-15"), + "amount": 259200, + "date": time.strftime("%Y-09-10"), } ) - with Form( - bank_stmt_line, - view="account_reconcile_oca.bank_statement_line_form_reconcile_view", - ) as f: - line = f.reconcile_data_info["data"][0] - self.assertEqual( - line["currency_amount"], - 100, - ) - self.env["res.currency.rate"].create( - { - "currency_id": self.env.ref("base.EUR").id, - "name": time.strftime("%Y-07-15"), - "rate": 1.2, - } + inv1 = self._create_invoice( + currency_id=cny.id, + invoice_amount=259200, + date_invoice=time.strftime("%Y-09-09"), + auto_validate=True, ) with Form( bank_stmt_line, @@ -1099,8 +1119,17 @@ def test_journal_foreign_currency_change(self): line = f.reconcile_data_info["data"][0] self.assertEqual( line["currency_amount"], - 100, + 259200, + ) + f.add_account_move_line_id = inv1.line_ids.filtered( + lambda l: l.account_id.account_type == "asset_receivable" ) + self.assertTrue(f.can_reconcile) + self.assertEqual(len(bank_stmt_line.reconcile_data_info["data"]), 3) + exchange_line = bank_stmt_line.reconcile_data_info["data"][-1] + self.assertEqual(exchange_line["amount"], 61.42) + bank_stmt_line.reconcile_bank_line() + self.assertEqual(inv1.payment_state, "paid") def test_invoice_foreign_currency_change(self): self.env["res.currency.rate"].create( @@ -1125,7 +1154,6 @@ def test_invoice_foreign_currency_change(self): ) bank_stmt = self.acc_bank_stmt_model.create( { - "company_id": self.env.ref("base.main_company").id, "journal_id": self.bank_journal_usd.id, "date": time.strftime("%Y-07-15"), "name": "test",