From 3d6a561180123ca01a36a7a1192c90c00cabc86f Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Tue, 5 Sep 2023 14:58:35 +0200 Subject: [PATCH] [IMP] account_reconcile_oca: only store info on unreconciled items --- account_reconcile_oca/__manifest__.py | 2 +- .../migrations/16.0.1.2.0/pre-migration.py | 19 +++++ .../models/account_bank_statement_line.py | 70 +++++++++++-------- .../models/account_reconcile_abstract.py | 14 +++- 4 files changed, 75 insertions(+), 30 deletions(-) create mode 100644 account_reconcile_oca/migrations/16.0.1.2.0/pre-migration.py diff --git a/account_reconcile_oca/__manifest__.py b/account_reconcile_oca/__manifest__.py index 404bfc76..536ffe9f 100644 --- a/account_reconcile_oca/__manifest__.py +++ b/account_reconcile_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Account Reconcile Oca", "summary": """ Reconcile addons for Odoo CE accounting""", - "version": "16.0.1.1.0", + "version": "16.0.1.2.0", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "maintainers": ["etobella"], diff --git a/account_reconcile_oca/migrations/16.0.1.2.0/pre-migration.py b/account_reconcile_oca/migrations/16.0.1.2.0/pre-migration.py new file mode 100644 index 00000000..4150d2ac --- /dev/null +++ b/account_reconcile_oca/migrations/16.0.1.2.0/pre-migration.py @@ -0,0 +1,19 @@ +from openupgradelib import openupgrade + + +@openupgrade.migrate() +def migrate(env, version): + # Due to the big change we did, we need to loose how data is stored + openupgrade.logged_query( + env.cr, + """ + UPDATE account_bank_statement_line + SET reconcile_data = NULL + """, + ) + openupgrade.logged_query( + env.cr, + """ + DELETE FROM account_account_reconcile_data + """, + ) diff --git a/account_reconcile_oca/models/account_bank_statement_line.py b/account_reconcile_oca/models/account_bank_statement_line.py index 55a8a6b5..fb8276a7 100644 --- a/account_reconcile_oca/models/account_bank_statement_line.py +++ b/account_reconcile_oca/models/account_bank_statement_line.py @@ -323,7 +323,9 @@ class AccountBankStatementLine(models.Model): if record.reconcile_data: record.reconcile_data_info = record.reconcile_data else: - record.reconcile_data_info = record._default_reconcile_data() + record.reconcile_data_info = record._default_reconcile_data( + from_unreconcile=record.is_reconciled + ) record.can_reconcile = record.reconcile_data_info.get( "can_reconcile", False ) @@ -418,35 +420,44 @@ class AccountBankStatementLine(models.Model): reconcile_auxiliary_id += 1 return reconcile_auxiliary_id - def _default_reconcile_data(self): + def _default_reconcile_data(self, from_unreconcile=False): liquidity_lines, suspense_lines, other_lines = self._seek_for_lines() data = [self._get_reconcile_line(line, "liquidity") for line in liquidity_lines] reconcile_auxiliary_id = 1 - res = ( - self.env["account.reconcile.model"] - .search([("rule_type", "in", ["invoice_matching", "writeoff_suggestion"])]) - ._apply_rules(self, self._retrieve_partner()) - ) - if res and res.get("status", "") == "write_off": - return self._recompute_suspense_line( - *self._reconcile_data_by_model( - data, res["model"], reconcile_auxiliary_id - ), - self.manual_reference - ) - elif res and res.get("amls"): - amount = self.amount_total_signed - for line in res.get("amls", []): - line_data = self._get_reconcile_line( - line, "other", is_counterpart=True, max_amount=amount + if not from_unreconcile: + res = ( + self.env["account.reconcile.model"] + .search( + [("rule_type", "in", ["invoice_matching", "writeoff_suggestion"])] ) - amount -= line_data.get("amount") - data.append(line_data) - return self._recompute_suspense_line( - data, reconcile_auxiliary_id, self.manual_reference + ._apply_rules(self, self._retrieve_partner()) ) + if res and res.get("status", "") == "write_off": + return self._recompute_suspense_line( + *self._reconcile_data_by_model( + data, res["model"], reconcile_auxiliary_id + ), + self.manual_reference + ) + elif res and res.get("amls"): + amount = self.amount_total_signed + for line in res.get("amls", []): + line_data = self._get_reconcile_line( + line, "other", is_counterpart=True, max_amount=amount + ) + amount -= line_data.get("amount") + data.append(line_data) + return self._recompute_suspense_line( + data, reconcile_auxiliary_id, self.manual_reference + ) return self._recompute_suspense_line( - data + [self._get_reconcile_line(line, "other") for line in other_lines], + data + + [ + self._get_reconcile_line( + line, "other", from_unreconcile=from_unreconcile + ) + for line in other_lines + ], reconcile_auxiliary_id, self.manual_reference, ) @@ -458,9 +469,11 @@ class AccountBankStatementLine(models.Model): def reconcile_bank_line(self): self.ensure_one() self.reconcile_mode = self.journal_id.reconcile_mode - return getattr(self, "_reconcile_bank_line_%s" % self.reconcile_mode)( + result = getattr(self, "_reconcile_bank_line_%s" % self.reconcile_mode)( self.reconcile_data_info["data"] ) + self.reconcile_data_info = False + return result def _reconcile_bank_line_edit(self, data): _liquidity_lines, suspense_lines, other_lines = self._seek_for_lines() @@ -574,12 +587,13 @@ class AccountBankStatementLine(models.Model): self.ensure_one() return getattr( self, "_unreconcile_bank_line_%s" % (self.reconcile_mode or "edit") - )(self.reconcile_data_info["data"]) + )() - def _unreconcile_bank_line_edit(self, data): + def _unreconcile_bank_line_edit(self): + self.reconcile_data_info = self._default_reconcile_data(from_unreconcile=True) self.action_undo_reconciliation() - def _unreconcile_bank_line_keep(self, data): + def _unreconcile_bank_line_keep(self): raise UserError(_("Keep suspense move lines mode cannot be unreconciled")) def _reconcile_move_line_vals(self, line, move_id=False): diff --git a/account_reconcile_oca/models/account_reconcile_abstract.py b/account_reconcile_oca/models/account_reconcile_abstract.py index 719967f7..590d3a39 100644 --- a/account_reconcile_oca/models/account_reconcile_abstract.py +++ b/account_reconcile_oca/models/account_reconcile_abstract.py @@ -33,7 +33,9 @@ class AccountReconcileAbstract(models.AbstractModel): "res.currency", related="company_id.currency_id" ) - def _get_reconcile_line(self, line, kind, is_counterpart=False, max_amount=False): + def _get_reconcile_line( + self, line, kind, is_counterpart=False, max_amount=False, from_unreconcile=False + ): date = self.date if "date" in self._fields else line.date original_amount = amount = net_amount = line.debit - line.credit amount_currency = self.company_id.currency_id @@ -80,6 +82,16 @@ class AccountReconcileAbstract(models.AbstractModel): "analytic_distribution": line.analytic_distribution, "kind": kind, } + if from_unreconcile: + vals.update( + { + "id": False, + "counterpart_line_id": ( + line.matched_debit_ids.mapped("debit_move_id") + | line.matched_credit_ids.mapped("credit_move_id") + ).id, + } + ) if not float_is_zero( amount - original_amount, precision_digits=line.currency_id.decimal_places ):