From 344153b7e8cc08e4318bb693f03f5677b27549da Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 6 Jan 2023 13:04:57 +0100 Subject: [PATCH 1/4] [ADD] account_payment_order_grouped_output: Generate grouped entries from payment orders This module adds an option to generate extra grouped moves for the payment orders since the refactoring done to use native Odoo payments. This serves for easing the reconciliation on bank statements of large payment orders, handling them as one or several journal entries according payment date. --- .../README.rst | 75 ++++ .../__init__.py | 1 + .../__manifest__.py | 18 + .../models/__init__.py | 3 + .../models/account_move.py | 16 + .../models/account_payment_mode.py | 12 + .../models/account_payment_order.py | 194 ++++++++ .../readme/DESCRIPTION.rst | 5 + .../static/description/index.html | 418 ++++++++++++++++++ .../tests/__init__.py | 1 + .../test_payment_order_inbound_grouped.py | 21 + .../views/account_payment_mode_views.xml | 25 ++ .../views/account_payment_order_views.xml | 26 ++ 13 files changed, 815 insertions(+) create mode 100644 account_payment_order_grouped_output/README.rst create mode 100644 account_payment_order_grouped_output/__init__.py create mode 100644 account_payment_order_grouped_output/__manifest__.py create mode 100644 account_payment_order_grouped_output/models/__init__.py create mode 100644 account_payment_order_grouped_output/models/account_move.py create mode 100644 account_payment_order_grouped_output/models/account_payment_mode.py create mode 100644 account_payment_order_grouped_output/models/account_payment_order.py create mode 100644 account_payment_order_grouped_output/readme/DESCRIPTION.rst create mode 100644 account_payment_order_grouped_output/static/description/index.html create mode 100644 account_payment_order_grouped_output/tests/__init__.py create mode 100644 account_payment_order_grouped_output/tests/test_payment_order_inbound_grouped.py create mode 100644 account_payment_order_grouped_output/views/account_payment_mode_views.xml create mode 100644 account_payment_order_grouped_output/views/account_payment_order_views.xml diff --git a/account_payment_order_grouped_output/README.rst b/account_payment_order_grouped_output/README.rst new file mode 100644 index 000000000..157587efd --- /dev/null +++ b/account_payment_order_grouped_output/README.rst @@ -0,0 +1,75 @@ +============================================== +Account Payment Order - Generate grouped moves +============================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fbank--payment-lightgray.png?logo=github + :target: https://github.com/OCA/bank-payment/tree/14.0/account_payment_order_grouped_output + :alt: OCA/bank-payment +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/bank-payment-14-0/bank-payment-14-0-account_payment_order_grouped_output + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/bank-payment&target_branch=14.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds an option to generate extra grouped moves for the payment +orders since the refactoring done to use native Odoo payments. + +This serves for easing the reconciliation on bank statements of large payment +orders, handling them as one or several journal entries according payment date. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* ACSONE SA/NV +* Therp BV +* Tecnativa +* Akretion + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/bank-payment `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_payment_order_grouped_output/__init__.py b/account_payment_order_grouped_output/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/account_payment_order_grouped_output/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/account_payment_order_grouped_output/__manifest__.py b/account_payment_order_grouped_output/__manifest__.py new file mode 100644 index 000000000..233548200 --- /dev/null +++ b/account_payment_order_grouped_output/__manifest__.py @@ -0,0 +1,18 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + "name": "Account Payment Order - Generate grouped moves", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "author": "ACSONE SA/NV, Therp BV, Tecnativa, Akretion, " + "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/bank-payment", + "category": "Banking addons", + "depends": ["account_payment_order"], + "data": [ + "views/account_payment_mode_views.xml", + "views/account_payment_order_views.xml", + ], + "demo": [], + "installable": True, +} diff --git a/account_payment_order_grouped_output/models/__init__.py b/account_payment_order_grouped_output/models/__init__.py new file mode 100644 index 000000000..b17a1af2e --- /dev/null +++ b/account_payment_order_grouped_output/models/__init__.py @@ -0,0 +1,3 @@ +from . import account_move +from . import account_payment_mode +from . import account_payment_order diff --git a/account_payment_order_grouped_output/models/account_move.py b/account_payment_order_grouped_output/models/account_move.py new file mode 100644 index 000000000..4dee19d00 --- /dev/null +++ b/account_payment_order_grouped_output/models/account_move.py @@ -0,0 +1,16 @@ +# Copyright 2022 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class AccountMove(models.Model): + _inherit = "account.move" + + grouped_payment_order_id = fields.Many2one( + comodel_name="account.payment.order", + string="Payment Order (Grouped)", + copy=False, + readonly=True, + check_company=True, + ) diff --git a/account_payment_order_grouped_output/models/account_payment_mode.py b/account_payment_order_grouped_output/models/account_payment_mode.py new file mode 100644 index 000000000..e0344efe4 --- /dev/null +++ b/account_payment_order_grouped_output/models/account_payment_mode.py @@ -0,0 +1,12 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class AccountPaymentMode(models.Model): + _inherit = "account.payment.mode" + + generate_move = fields.Boolean( + string="Generate Grouped Accounting Entries On File Upload", default=True + ) + post_move = fields.Boolean(default=True) diff --git a/account_payment_order_grouped_output/models/account_payment_order.py b/account_payment_order_grouped_output/models/account_payment_order.py new file mode 100644 index 000000000..d72835d29 --- /dev/null +++ b/account_payment_order_grouped_output/models/account_payment_order.py @@ -0,0 +1,194 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import _, api, fields, models + + +class AccountPaymentOrder(models.Model): + _inherit = "account.payment.order" + + grouped_move_ids = fields.One2many( + comodel_name="account.move", + inverse_name="grouped_payment_order_id", + string="Journal Entries (Grouped)", + readonly=True, + ) + grouped_move_count = fields.Integer( + compute="_compute_grouped_move_count", + string="Number of Grouped Journal Entries", + ) + + @api.depends("grouped_move_ids") + def _compute_grouped_move_count(self): + rg_res = self.env["account.move"].read_group( + [("grouped_payment_order_id", "in", self.ids)], + ["grouped_payment_order_id"], + ["grouped_payment_order_id"], + ) + mapped_data = { + x["grouped_payment_order_id"][0]: x["grouped_payment_order_id_count"] + for x in rg_res + } + for order in self: + order.grouped_move_count = mapped_data.get(order.id, 0) + + def action_uploaded_cancel(self): + """Unreconcile and remove grouped moves.""" + for move in self.grouped_move_ids: + move.button_cancel() + for move_line in move.line_ids: + move_line.remove_move_reconcile() + move.with_context(force_delete=True).unlink() + return super().action_uploaded_cancel() + + def generated2uploaded(self): + """Generate grouped moves if configured that way.""" + super().generated2uploaded() + for order in self: + if order.payment_mode_id.generate_move: + order.generate_move() + + def generate_move(self): + """Create the moves that pay off the move lines from the payment/debit order.""" + self.ensure_one() + trfmoves = self._prepare_trf_moves() + for hashcode, plines in trfmoves.items(): + self._create_reconcile_move(hashcode, plines) + + def _prepare_trf_moves(self): + """Prepare a dict "trfmoves" grouped by date.""" + self.ensure_one() + trfmoves = {} + for pline in self.payment_ids: + hashcode = fields.Date.to_string(pline.date) + trfmoves.setdefault(hashcode, self.env["account.payment"]) + trfmoves[hashcode] += pline + return trfmoves + + def _create_reconcile_move(self, hashcode, payments): + self.ensure_one() + post_move = self.payment_mode_id.post_move + am_obj = self.env["account.move"] + mvals = self._prepare_move(payments) + move = am_obj.create(mvals) + if post_move: + move.action_post() + self.reconcile_grouped_payments(move, payments) + + def reconcile_grouped_payments(self, move, payments): + lines_to_rec = move.line_ids[:-1] + for payment in payments: + lines_to_rec += payment.move_id.line_ids.filtered( + lambda x: x.account_id + in ( + payment.journal_id.payment_debit_account_id, + payment.journal_id.payment_credit_account_id, + ) + ) + lines_to_rec.reconcile() + + def _prepare_move(self, payments=None): + if self.payment_type == "outbound": + ref = _("Payment order %s") % self.name + else: + ref = _("Debit order %s") % self.name + if payments and len(payments) == 1: + ref += " - " + payments.name + vals = { + "date": payments[0].date, + "journal_id": self.journal_id.id, + "ref": ref, + "grouped_payment_order_id": self.id, + "line_ids": [], + } + total_company_currency = total_payment_currency = 0 + for pline in payments: + amount_company_currency = abs(pline.move_id.line_ids[0].balance) + total_company_currency += amount_company_currency + total_payment_currency += pline.amount + partner_ml_vals = self._prepare_move_line_partner_account(pline) + vals["line_ids"].append((0, 0, partner_ml_vals)) + trf_ml_vals = self._prepare_move_line_offsetting_account( + total_company_currency, total_payment_currency, payments + ) + vals["line_ids"].append((0, 0, trf_ml_vals)) + return vals + + def _prepare_move_line_partner_account(self, payment): + if self.payment_type == "inbound": + account = payment.journal_id.payment_debit_account_id + else: + account = payment.journal_id.payment_credit_account_id + if self.payment_type == "outbound": + name = _("Payment bank line %s") % payment.name + else: + name = _("Debit bank line %s") % payment.name + sign = self.payment_type == "inbound" and -1 or 1 + amount_company_currency = abs(payment.move_id.line_ids[0].balance) + vals = { + "name": name, + "partner_id": payment.partner_id.id, + "account_id": account.id, + "credit": ( + self.payment_type == "inbound" and amount_company_currency or 0.0 + ), + "debit": ( + self.payment_type == "outbound" and amount_company_currency or 0.0 + ), + "currency_id": payment.currency_id.id, + "amount_currency": payment.amount * sign, + } + return vals + + def _prepare_move_line_offsetting_account( + self, amount_company_currency, amount_payment_currency, payments + ): + if self.payment_type == "outbound": + name = _("Payment order %s") % self.name + account = self.journal_id.payment_credit_account_id + else: + name = _("Debit order %s") % self.name + account = self.journal_id.payment_debit_account_id + partner = self.env["res.partner"] + for index, payment in enumerate(payments): + if index == 0: + partner = payment.payment_line_ids[0].partner_id + elif payment.payment_line_ids[0].partner_id != partner: + # we have different partners in the grouped move + partner = self.env["res.partner"] + break + sign = self.payment_type == "outbound" and -1 or 1 + vals = { + "name": name, + "partner_id": partner.id, + "account_id": account.id, + "credit": ( + self.payment_type == "outbound" and amount_company_currency or 0.0 + ), + "debit": ( + self.payment_type == "inbound" and amount_company_currency or 0.0 + ), + "currency_id": payments[0].currency_id.id, + "amount_currency": amount_payment_currency * sign, + } + return vals + + def action_grouped_moves(self): + self.ensure_one() + action = self.env["ir.actions.act_window"]._for_xml_id( + "account.action_move_journal_line" + ) + if self.grouped_move_count == 1: + action.update( + { + "view_mode": "form,tree,kanban", + "views": False, + "view_id": False, + "res_id": self.grouped_move_ids.id, + } + ) + else: + action["domain"] = [("id", "in", self.grouped_move_ids.ids)] + ctx = self.env.context.copy() + ctx.update({"search_default_misc_filter": 0}) + action["context"] = ctx + return action diff --git a/account_payment_order_grouped_output/readme/DESCRIPTION.rst b/account_payment_order_grouped_output/readme/DESCRIPTION.rst new file mode 100644 index 000000000..5558dd233 --- /dev/null +++ b/account_payment_order_grouped_output/readme/DESCRIPTION.rst @@ -0,0 +1,5 @@ +This module adds an option to generate extra grouped moves for the payment +orders since the refactoring done to use native Odoo payments. + +This serves for easing the reconciliation on bank statements of large payment +orders, handling them as one or several journal entries according payment date. diff --git a/account_payment_order_grouped_output/static/description/index.html b/account_payment_order_grouped_output/static/description/index.html new file mode 100644 index 000000000..0ff14a5c9 --- /dev/null +++ b/account_payment_order_grouped_output/static/description/index.html @@ -0,0 +1,418 @@ + + + + + + +Account Payment Order - Generate grouped moves + + + +
+

Account Payment Order - Generate grouped moves

+ + +

Beta License: AGPL-3 OCA/bank-payment Translate me on Weblate Try me on Runboat

+

This module adds an option to generate extra grouped moves for the payment +orders since the refactoring done to use native Odoo payments.

+

This serves for easing the reconciliation on bank statements of large payment +orders, handling them as one or several journal entries according payment date.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • ACSONE SA/NV
  • +
  • Therp BV
  • +
  • Tecnativa
  • +
  • Akretion
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/bank-payment project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/account_payment_order_grouped_output/tests/__init__.py b/account_payment_order_grouped_output/tests/__init__.py new file mode 100644 index 000000000..31846c7eb --- /dev/null +++ b/account_payment_order_grouped_output/tests/__init__.py @@ -0,0 +1 @@ +from . import test_payment_order_inbound_grouped diff --git a/account_payment_order_grouped_output/tests/test_payment_order_inbound_grouped.py b/account_payment_order_grouped_output/tests/test_payment_order_inbound_grouped.py new file mode 100644 index 000000000..385ac39b7 --- /dev/null +++ b/account_payment_order_grouped_output/tests/test_payment_order_inbound_grouped.py @@ -0,0 +1,21 @@ +# Copyright 2022 Tecnativa - Pedro M. Baeza +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tests.common import tagged + +from odoo.addons.account_payment_order.tests.test_payment_order_inbound import ( + TestPaymentOrderInboundBase, +) + + +@tagged("post_install", "-at_install") +class TestPaymentOrderInbound(TestPaymentOrderInboundBase): + def test_grouped_output(self): + self.inbound_mode.generate_move = True + self.inbound_mode.post_move = True + self.inbound_order.draft2open() + self.inbound_order.open2generated() + self.inbound_order.generated2uploaded() + grouped_moves = self.inbound_order.grouped_move_ids + self.assertTrue(grouped_moves) + self.assertTrue(grouped_moves.line_ids[0].reconciled) diff --git a/account_payment_order_grouped_output/views/account_payment_mode_views.xml b/account_payment_order_grouped_output/views/account_payment_mode_views.xml new file mode 100644 index 000000000..3c555885d --- /dev/null +++ b/account_payment_order_grouped_output/views/account_payment_mode_views.xml @@ -0,0 +1,25 @@ + + + + account.payment.mode + + + + + + + + + + + diff --git a/account_payment_order_grouped_output/views/account_payment_order_views.xml b/account_payment_order_grouped_output/views/account_payment_order_views.xml new file mode 100644 index 000000000..a326fc1ed --- /dev/null +++ b/account_payment_order_grouped_output/views/account_payment_order_views.xml @@ -0,0 +1,26 @@ + + + + account.payment.order + + +
+ +
+
+
+
From 93991fd60ed427ed505100a129e892e2900304b3 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Sat, 4 Mar 2023 20:12:14 +0100 Subject: [PATCH 2/4] [MIG] account_payment_order_grouped_output: Migration to 15.0 --- .../README.rst | 14 +-- .../__manifest__.py | 2 +- .../account_payment_order_grouped_output.pot | 92 ++++++++++++++++++ .../models/account_payment_order.py | 30 ++++-- .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 8 +- 6 files changed, 125 insertions(+), 21 deletions(-) create mode 100644 account_payment_order_grouped_output/i18n/account_payment_order_grouped_output.pot create mode 100644 account_payment_order_grouped_output/static/description/icon.png diff --git a/account_payment_order_grouped_output/README.rst b/account_payment_order_grouped_output/README.rst index 157587efd..32b14f349 100644 --- a/account_payment_order_grouped_output/README.rst +++ b/account_payment_order_grouped_output/README.rst @@ -14,14 +14,14 @@ Account Payment Order - Generate grouped moves :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fbank--payment-lightgray.png?logo=github - :target: https://github.com/OCA/bank-payment/tree/14.0/account_payment_order_grouped_output + :target: https://github.com/OCA/bank-payment/tree/15.0/account_payment_order_grouped_output :alt: OCA/bank-payment .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/bank-payment-14-0/bank-payment-14-0-account_payment_order_grouped_output + :target: https://translation.odoo-community.org/projects/bank-payment-15-0/bank-payment-15-0-account_payment_order_grouped_output :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/bank-payment&target_branch=14.0 - :alt: Try me on Runboat +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/173/15.0 + :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -42,7 +42,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -70,6 +70,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/bank-payment `_ project on GitHub. +This module is part of the `OCA/bank-payment `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_payment_order_grouped_output/__manifest__.py b/account_payment_order_grouped_output/__manifest__.py index 233548200..81550fcca 100644 --- a/account_payment_order_grouped_output/__manifest__.py +++ b/account_payment_order_grouped_output/__manifest__.py @@ -2,7 +2,7 @@ { "name": "Account Payment Order - Generate grouped moves", - "version": "14.0.1.0.0", + "version": "15.0.1.0.0", "license": "AGPL-3", "author": "ACSONE SA/NV, Therp BV, Tecnativa, Akretion, " "Odoo Community Association (OCA)", diff --git a/account_payment_order_grouped_output/i18n/account_payment_order_grouped_output.pot b/account_payment_order_grouped_output/i18n/account_payment_order_grouped_output.pot new file mode 100644 index 000000000..3915de3d2 --- /dev/null +++ b/account_payment_order_grouped_output/i18n/account_payment_order_grouped_output.pot @@ -0,0 +1,92 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_payment_order_grouped_output +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_payment_order_grouped_output +#: code:addons/account_payment_order_grouped_output/models/account_payment_order.py:0 +#, python-format +msgid "Debit bank line %s" +msgstr "" + +#. module: account_payment_order_grouped_output +#: code:addons/account_payment_order_grouped_output/models/account_payment_order.py:0 +#: code:addons/account_payment_order_grouped_output/models/account_payment_order.py:0 +#, python-format +msgid "Debit order %s" +msgstr "" + +#. module: account_payment_order_grouped_output +#: model:ir.model.fields,field_description:account_payment_order_grouped_output.field_account_payment_mode__generate_move +msgid "Generate Grouped Accounting Entries On File Upload" +msgstr "" + +#. module: account_payment_order_grouped_output +#: model_terms:ir.ui.view,arch_db:account_payment_order_grouped_output.account_payment_mode_form +msgid "Grouped Accounting Entries Options" +msgstr "" + +#. module: account_payment_order_grouped_output +#: model_terms:ir.ui.view,arch_db:account_payment_order_grouped_output.account_payment_order_form +msgid "Grouped Entries" +msgstr "" + +#. module: account_payment_order_grouped_output +#: model:ir.model.fields,field_description:account_payment_order_grouped_output.field_account_payment_order__grouped_move_ids +msgid "Journal Entries (Grouped)" +msgstr "" + +#. module: account_payment_order_grouped_output +#: model:ir.model,name:account_payment_order_grouped_output.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: account_payment_order_grouped_output +#: model:ir.model.fields,field_description:account_payment_order_grouped_output.field_account_payment_order__grouped_move_count +msgid "Number of Grouped Journal Entries" +msgstr "" + +#. module: account_payment_order_grouped_output +#: model:ir.model,name:account_payment_order_grouped_output.model_account_payment_mode +msgid "Payment Modes" +msgstr "" + +#. module: account_payment_order_grouped_output +#: model:ir.model,name:account_payment_order_grouped_output.model_account_payment_order +msgid "Payment Order" +msgstr "" + +#. module: account_payment_order_grouped_output +#: model:ir.model.fields,field_description:account_payment_order_grouped_output.field_account_bank_statement_line__grouped_payment_order_id +#: model:ir.model.fields,field_description:account_payment_order_grouped_output.field_account_move__grouped_payment_order_id +#: model:ir.model.fields,field_description:account_payment_order_grouped_output.field_account_payment__grouped_payment_order_id +msgid "Payment Order (Grouped)" +msgstr "" + +#. module: account_payment_order_grouped_output +#: code:addons/account_payment_order_grouped_output/models/account_payment_order.py:0 +#, python-format +msgid "Payment bank line %s" +msgstr "" + +#. module: account_payment_order_grouped_output +#: code:addons/account_payment_order_grouped_output/models/account_payment_order.py:0 +#: code:addons/account_payment_order_grouped_output/models/account_payment_order.py:0 +#, python-format +msgid "Payment order %s" +msgstr "" + +#. module: account_payment_order_grouped_output +#: model:ir.model.fields,field_description:account_payment_order_grouped_output.field_account_payment_mode__post_move +msgid "Post Move" +msgstr "" diff --git a/account_payment_order_grouped_output/models/account_payment_order.py b/account_payment_order_grouped_output/models/account_payment_order.py index d72835d29..b3f384ce1 100644 --- a/account_payment_order_grouped_output/models/account_payment_order.py +++ b/account_payment_order_grouped_output/models/account_payment_order.py @@ -42,10 +42,11 @@ class AccountPaymentOrder(models.Model): def generated2uploaded(self): """Generate grouped moves if configured that way.""" - super().generated2uploaded() + res = super().generated2uploaded() for order in self: if order.payment_mode_id.generate_move: order.generate_move() + return res def generate_move(self): """Create the moves that pay off the move lines from the payment/debit order.""" @@ -77,11 +78,12 @@ class AccountPaymentOrder(models.Model): def reconcile_grouped_payments(self, move, payments): lines_to_rec = move.line_ids[:-1] for payment in payments: + journal = payment.journal_id lines_to_rec += payment.move_id.line_ids.filtered( lambda x: x.account_id in ( - payment.journal_id.payment_debit_account_id, - payment.journal_id.payment_credit_account_id, + journal._get_journal_inbound_outstanding_payment_accounts() + + journal._get_journal_inbound_outstanding_payment_accounts() ) ) lines_to_rec.reconcile() @@ -113,15 +115,26 @@ class AccountPaymentOrder(models.Model): vals["line_ids"].append((0, 0, trf_ml_vals)) return vals - def _prepare_move_line_partner_account(self, payment): - if self.payment_type == "inbound": - account = payment.journal_id.payment_debit_account_id + def _get_grouped_output_liquidity_account(self, payment): + domain = [ + ("journal_id", "=", self.journal_id.id), + ("payment_method_id", "=", payment.payment_method_id.id), + ("payment_type", "=", self.payment_type), + ] + apml = self.env["account.payment.method.line"].search(domain) + if apml.payment_account_id: + return apml.payment_account_id + elif self.payment_type == "inbound": + return payment.company_id.account_journal_payment_debit_account_id else: - account = payment.journal_id.payment_credit_account_id + return payment.company_id.account_journal_payment_credit_account_id + + def _prepare_move_line_partner_account(self, payment): if self.payment_type == "outbound": name = _("Payment bank line %s") % payment.name else: name = _("Debit bank line %s") % payment.name + account = self._get_grouped_output_liquidity_account(payment) sign = self.payment_type == "inbound" and -1 or 1 amount_company_currency = abs(payment.move_id.line_ids[0].balance) vals = { @@ -144,12 +157,11 @@ class AccountPaymentOrder(models.Model): ): if self.payment_type == "outbound": name = _("Payment order %s") % self.name - account = self.journal_id.payment_credit_account_id else: name = _("Debit order %s") % self.name - account = self.journal_id.payment_debit_account_id partner = self.env["res.partner"] for index, payment in enumerate(payments): + account = self._get_grouped_output_liquidity_account(payment) if index == 0: partner = payment.payment_line_ids[0].partner_id elif payment.payment_line_ids[0].partner_id != partner: diff --git a/account_payment_order_grouped_output/static/description/icon.png b/account_payment_order_grouped_output/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/account_payment_order_grouped_output/static/description/index.html b/account_payment_order_grouped_output/static/description/index.html index 0ff14a5c9..3fb9ea457 100644 --- a/account_payment_order_grouped_output/static/description/index.html +++ b/account_payment_order_grouped_output/static/description/index.html @@ -3,7 +3,7 @@ - + Account Payment Order - Generate grouped moves