From 42b756b22c8d2bb3ee652701a2a22eff755ca5a6 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Tue, 11 Feb 2025 23:05:41 +0100 Subject: [PATCH] [IMP] account_reconcile_oca: Allow to select all lines at once --- .../i18n/account_reconcile_oca.pot | 7 ++ account_reconcile_oca/i18n/es.po | 9 ++- .../models/account_account_reconcile.py | 24 ++++--- .../models/account_bank_statement_line.py | 66 +++++++++++-------- .../models/account_reconcile_abstract.py | 3 + .../reconcile_move_line_controller.esm.js | 9 +++ .../reconcile_move_line_view.esm.js | 1 + .../widgets/reconcile_move_line_widget.esm.js | 3 +- .../static/src/xml/reconcile.xml | 3 + 9 files changed, 87 insertions(+), 38 deletions(-) diff --git a/account_reconcile_oca/i18n/account_reconcile_oca.pot b/account_reconcile_oca/i18n/account_reconcile_oca.pot index 043c4ab4b2..db14d242fd 100644 --- a/account_reconcile_oca/i18n/account_reconcile_oca.pot +++ b/account_reconcile_oca/i18n/account_reconcile_oca.pot @@ -52,6 +52,13 @@ msgstr "" msgid "Add Bank Statement Line" msgstr "" +#. module: account_reconcile_oca +#. odoo-javascript +#: code:addons/account_reconcile_oca/static/src/xml/reconcile.xml:0 +#, python-format +msgid "Add all" +msgstr "" + #. module: account_reconcile_oca #: model:ir.model.fields,field_description:account_reconcile_oca.field_account_bank_statement_line__aggregate_id msgid "Aggregate" diff --git a/account_reconcile_oca/i18n/es.po b/account_reconcile_oca/i18n/es.po index 92f6a9a730..eda81ee4f7 100644 --- a/account_reconcile_oca/i18n/es.po +++ b/account_reconcile_oca/i18n/es.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-01-29 18:52+0000\n" +"PO-Revision-Date: 2025-02-12 08:24+0000\n" "Last-Translator: \"Pedro M. Baeza\" \n" "Language-Team: none\n" "Language: es\n" @@ -58,6 +58,13 @@ msgstr "Añadir apunte contable" msgid "Add Bank Statement Line" msgstr "Añadir línea de extracto bancario" +#. module: account_reconcile_oca +#. odoo-javascript +#: code:addons/account_reconcile_oca/static/src/xml/reconcile.xml:0 +#, python-format +msgid "Add all" +msgstr "Añadir todo" + #. module: account_reconcile_oca #: model:ir.model.fields,field_description:account_reconcile_oca.field_account_bank_statement_line__aggregate_id msgid "Aggregate" diff --git a/account_reconcile_oca/models/account_account_reconcile.py b/account_reconcile_oca/models/account_account_reconcile.py index ff8313d659..ea8285f004 100644 --- a/account_reconcile_oca/models/account_account_reconcile.py +++ b/account_reconcile_oca/models/account_account_reconcile.py @@ -132,16 +132,17 @@ def _inverse_reconcile_data_info(self): @api.onchange("add_account_move_line_id") def _onchange_add_account_move_line(self): if self.add_account_move_line_id: - data = self.reconcile_data_info - if self.add_account_move_line_id.id not in data["counterparts"]: - data["counterparts"].append(self.add_account_move_line_id.id) - else: - del data["counterparts"][ - data["counterparts"].index(self.add_account_move_line_id.id) - ] - self.reconcile_data_info = self._recompute_data(data) + self._add_account_move_line(self.add_account_move_line_id) self.add_account_move_line_id = False + def _add_account_move_line(self, move_line, keep_current=False): + data = self.reconcile_data_info + if move_line.id not in data["counterparts"]: + data["counterparts"].append(move_line.id) + elif not keep_current: + del data["counterparts"][data["counterparts"].index(move_line.id)] + self.reconcile_data_info = self._recompute_data(data) + @api.onchange("manual_reference", "manual_delete") def _onchange_manual_reconcile_reference(self): self.ensure_one() @@ -187,6 +188,13 @@ def reconcile(self): ) data_record.unlink() + def add_multiple_lines(self, domain): + res = super().add_multiple_lines(domain) + lines = self.env["account.move.line"].search(domain) + for line in lines: + self._add_account_move_line(line, keep_current=True) + return res + class AccountAccountReconcileData(models.TransientModel): _name = "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 49ee366212..ffb78029e4 100644 --- a/account_reconcile_oca/models/account_bank_statement_line.py +++ b/account_reconcile_oca/models/account_bank_statement_line.py @@ -194,36 +194,39 @@ def _get_amount_currency(self, line, dest_curr): @api.onchange("add_account_move_line_id") def _onchange_add_account_move_line_id(self): if self.add_account_move_line_id: - data = self.reconcile_data_info["data"] - new_data = [] - is_new_line = True - pending_amount = 0.0 - currency = self._get_reconcile_currency() - for line in data: - if line["kind"] != "suspense": - pending_amount += self._get_amount_currency(line, currency) - if self.add_account_move_line_id.id in line.get( - "counterpart_line_ids", [] - ): - is_new_line = False - else: + self._add_account_move_line(self.add_account_move_line_id) + self.add_account_move_line_id = False + + def _add_account_move_line(self, move_line, keep_current=False): + data = self.reconcile_data_info["data"] + new_data = [] + is_new_line = True + pending_amount = 0.0 + currency = self._get_reconcile_currency() + for line in data: + if line["kind"] != "suspense": + pending_amount += self._get_amount_currency(line, currency) + if move_line.id in line.get("counterpart_line_ids", []): + is_new_line = False + if keep_current: new_data.append(line) - if is_new_line: - reconcile_auxiliary_id, lines = self._get_reconcile_line( - self.add_account_move_line_id, - "other", - is_counterpart=True, - max_amount=currency.round(pending_amount), - move=True, - ) - new_data += lines - self.reconcile_data_info = self._recompute_suspense_line( - new_data, - self.reconcile_data_info["reconcile_auxiliary_id"], - self.manual_reference, + else: + new_data.append(line) + if is_new_line: + reconcile_auxiliary_id, lines = self._get_reconcile_line( + move_line, + "other", + is_counterpart=True, + max_amount=currency.round(pending_amount), + move=True, ) - self.can_reconcile = self.reconcile_data_info.get("can_reconcile", False) - self.add_account_move_line_id = False + new_data += lines + self.reconcile_data_info = self._recompute_suspense_line( + new_data, + self.reconcile_data_info["reconcile_auxiliary_id"], + self.manual_reference, + ) + self.can_reconcile = self.reconcile_data_info.get("can_reconcile", False) def _recompute_suspense_line(self, data, reconcile_auxiliary_id, manual_reference): can_reconcile = True @@ -1260,3 +1263,10 @@ def _get_reconcile_currency(self): or self.journal_id.currency_id or self.company_id.currency_id ) + + def add_multiple_lines(self, domain): + res = super().add_multiple_lines(domain) + lines = self.env["account.move.line"].search(domain) + for line in lines: + self._add_account_move_line(line, keep_current=True) + return res diff --git a/account_reconcile_oca/models/account_reconcile_abstract.py b/account_reconcile_oca/models/account_reconcile_abstract.py index fa0e812abe..47c4e9be99 100644 --- a/account_reconcile_oca/models/account_reconcile_abstract.py +++ b/account_reconcile_oca/models/account_reconcile_abstract.py @@ -124,3 +124,6 @@ def _get_reconcile_line( if is_counterpart: vals["counterpart_line_ids"] = line.ids return [vals] + + def add_multiple_lines(self, domain): + self.ensure_one() diff --git a/account_reconcile_oca/static/src/js/reconcile_move_line/reconcile_move_line_controller.esm.js b/account_reconcile_oca/static/src/js/reconcile_move_line/reconcile_move_line_controller.esm.js index af500eb958..82ab8cb510 100644 --- a/account_reconcile_oca/static/src/js/reconcile_move_line/reconcile_move_line_controller.esm.js +++ b/account_reconcile_oca/static/src/js/reconcile_move_line/reconcile_move_line_controller.esm.js @@ -8,6 +8,15 @@ export class ReconcileMoveLineController extends ListController { data[this.props.parentField] = [record.resId, record.display_name]; this.props.parentRecord.update(data); } + async clickAddAll() { + await this.props.parentRecord.save(); + await this.orm.call(this.props.parentRecord.resModel, "add_multiple_lines", [ + this.props.parentRecord.resIds, + this.model.root.domain, + ]); + await this.props.parentRecord.load(); + this.props.parentRecord.model.notify(); + } } ReconcileMoveLineController.template = `account_reconcile_oca.ReconcileMoveLineController`; diff --git a/account_reconcile_oca/static/src/js/reconcile_move_line/reconcile_move_line_view.esm.js b/account_reconcile_oca/static/src/js/reconcile_move_line/reconcile_move_line_view.esm.js index aebe7684c2..979570ba93 100644 --- a/account_reconcile_oca/static/src/js/reconcile_move_line/reconcile_move_line_view.esm.js +++ b/account_reconcile_oca/static/src/js/reconcile_move_line/reconcile_move_line_view.esm.js @@ -10,6 +10,7 @@ export const ReconcileMoveLineView = { ...listView, Controller: ReconcileMoveLineController, Renderer: ReconcileMoveLineRenderer, + buttonTemplate: "reconcile_move_line.ListView.Buttons", }; registry.category("views").add("reconcile_move_line", ReconcileMoveLineView); diff --git a/account_reconcile_oca/static/src/js/widgets/reconcile_move_line_widget.esm.js b/account_reconcile_oca/static/src/js/widgets/reconcile_move_line_widget.esm.js index 05a6207697..ca8e1ca596 100644 --- a/account_reconcile_oca/static/src/js/widgets/reconcile_move_line_widget.esm.js +++ b/account_reconcile_oca/static/src/js/widgets/reconcile_move_line_widget.esm.js @@ -31,7 +31,7 @@ export class AccountReconcileMatchWidget extends Component { controlPanel: { // Hiding the control panel buttons "top-left": false, - "bottom-left": false, + "bottom-left": true, layoutActions: false, }, }, @@ -49,6 +49,7 @@ export class AccountReconcileMatchWidget extends Component { searchViewId: false, parentRecord: this.props.record, parentField: this.props.name, + showButtons: false, }; } } diff --git a/account_reconcile_oca/static/src/xml/reconcile.xml b/account_reconcile_oca/static/src/xml/reconcile.xml index 10411c7179..d0972c9c36 100644 --- a/account_reconcile_oca/static/src/xml/reconcile.xml +++ b/account_reconcile_oca/static/src/xml/reconcile.xml @@ -200,4 +200,7 @@ props.parentField + + +