From 5349f793a76f2edfbaa76c26d0d2dc99950714fe Mon Sep 17 00:00:00 2001 From: JordiMForgeFlow Date: Thu, 30 May 2024 13:39:14 +0200 Subject: [PATCH] [IMP] account_reconcile_oca: reverse reconcile entry when resetting reconciliation in keep mode --- .../models/account_bank_statement_line.py | 20 ++++++++++++++++++- .../tests/test_bank_account_reconcile.py | 14 +++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/account_reconcile_oca/models/account_bank_statement_line.py b/account_reconcile_oca/models/account_bank_statement_line.py index f3584b35..8042180e 100644 --- a/account_reconcile_oca/models/account_bank_statement_line.py +++ b/account_reconcile_oca/models/account_bank_statement_line.py @@ -615,7 +615,25 @@ class AccountBankStatementLine(models.Model): self.action_undo_reconciliation() def _unreconcile_bank_line_keep(self): - raise UserError(_("Keep suspense move lines mode cannot be unreconciled")) + self.reconcile_data_info = self._default_reconcile_data(from_unreconcile=True) + # Reverse reconciled journal entry + to_reverse = ( + self.line_ids._all_reconciled_lines() + .filtered( + lambda line: line.move_id != self.move_id + and (line.matched_debit_ids or line.matched_credit_ids) + ) + .mapped("move_id") + ) + if to_reverse: + default_values_list = [ + { + "date": move.date, + "ref": _("Reversal of: %s", move.name), + } + for move in to_reverse + ] + to_reverse._reverse_moves(default_values_list, cancel=True) def _reconcile_move_line_vals(self, line, move_id=False): return { diff --git a/account_reconcile_oca/tests/test_bank_account_reconcile.py b/account_reconcile_oca/tests/test_bank_account_reconcile.py index f7470193..723da2fb 100644 --- a/account_reconcile_oca/tests/test_bank_account_reconcile.py +++ b/account_reconcile_oca/tests/test_bank_account_reconcile.py @@ -1,6 +1,5 @@ import time -from odoo.exceptions import UserError from odoo.tests import Form, tagged from odoo.addons.account.tests.common import TestAccountReconciliationCommon @@ -500,7 +499,7 @@ class TestReconciliationWidget(TestAccountReconciliationCommon): def test_reconcile_invoice_keep(self): """ We want to test how the keep mode works, keeping the original move lines. - However, the unreconcile will not work properly + When unreconciling, the entry created for the reconciliation is reversed. """ self.bank_journal_euro.reconcile_mode = "keep" self.bank_journal_euro.suspense_account_id.reconcile = True @@ -540,8 +539,15 @@ class TestReconciliationWidget(TestAccountReconciliationCommon): self.bank_journal_euro.suspense_account_id, bank_stmt_line.mapped("move_id.line_ids.account_id"), ) - with self.assertRaises(UserError): - bank_stmt_line.unreconcile_bank_line() + # Reset reconciliation + reconcile_move = ( + bank_stmt_line.line_ids._all_reconciled_lines() + .filtered(lambda line: line.move_id != bank_stmt_line.move_id) + .move_id + ) + bank_stmt_line.unreconcile_bank_line() + self.assertTrue(reconcile_move.reversal_move_id) + self.assertFalse(bank_stmt_line.is_reconciled) # Testing to check functionality