From 7fd57e0b12f63771cf50949d5707ce41f07a0035 Mon Sep 17 00:00:00 2001
From: Carlos Dauden
Date: Fri, 9 Dec 2022 09:52:06 +0100
Subject: [PATCH 1/8] [ADD] account_banking_mandate_contact: new module
---
account_banking_mandate_contact/README.rst | 78 ++++++++++++
account_banking_mandate_contact/__init__.py | 2 +
.../__manifest__.py | 18 +++
.../i18n/account_banking_mandate_contact.pot | 30 +++++
account_banking_mandate_contact/i18n/es.po | 34 +++++
.../models/__init__.py | 3 +
.../models/account_move_line.py | 27 ++++
.../models/res_partner.py | 21 ++++
.../readme/CONTRIBUTORS.rst | 1 +
.../readme/DESCRIPTION.rst | 1 +
.../readme/USAGE.rst | 1 +
.../static/description/icon.png | Bin 0 -> 9455 bytes
.../tests/__init__.py | 4 +
.../tests/test_account_payment_order.py | 117 ++++++++++++++++++
.../views/res_partner.xml | 21 ++++
15 files changed, 358 insertions(+)
create mode 100644 account_banking_mandate_contact/README.rst
create mode 100644 account_banking_mandate_contact/__init__.py
create mode 100644 account_banking_mandate_contact/__manifest__.py
create mode 100644 account_banking_mandate_contact/i18n/account_banking_mandate_contact.pot
create mode 100644 account_banking_mandate_contact/i18n/es.po
create mode 100644 account_banking_mandate_contact/models/__init__.py
create mode 100644 account_banking_mandate_contact/models/account_move_line.py
create mode 100644 account_banking_mandate_contact/models/res_partner.py
create mode 100644 account_banking_mandate_contact/readme/CONTRIBUTORS.rst
create mode 100644 account_banking_mandate_contact/readme/DESCRIPTION.rst
create mode 100644 account_banking_mandate_contact/readme/USAGE.rst
create mode 100644 account_banking_mandate_contact/static/description/icon.png
create mode 100644 account_banking_mandate_contact/tests/__init__.py
create mode 100644 account_banking_mandate_contact/tests/test_account_payment_order.py
create mode 100644 account_banking_mandate_contact/views/res_partner.xml
diff --git a/account_banking_mandate_contact/README.rst b/account_banking_mandate_contact/README.rst
new file mode 100644
index 000000000..b858bc439
--- /dev/null
+++ b/account_banking_mandate_contact/README.rst
@@ -0,0 +1,78 @@
+===============================
+Account Banking Mandate Contact
+===============================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Production/Stable
+.. |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/12.0/account_banking_mandate_contact
+ :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-12-0/bank-payment-12-0-account_banking_mandate_contact
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/173/12.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+Manage specific banking mandate in contact level
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Usage
+=====
+
+To use this module you need to:
+
+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
+~~~~~~~
+
+* Tecnativa
+
+Contributors
+~~~~~~~~~~~~
+
+* Carlos Dauden
+
+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_banking_mandate_contact/__init__.py b/account_banking_mandate_contact/__init__.py
new file mode 100644
index 000000000..3275ac2ad
--- /dev/null
+++ b/account_banking_mandate_contact/__init__.py
@@ -0,0 +1,2 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from . import models
diff --git a/account_banking_mandate_contact/__manifest__.py b/account_banking_mandate_contact/__manifest__.py
new file mode 100644
index 000000000..b87ba80f8
--- /dev/null
+++ b/account_banking_mandate_contact/__manifest__.py
@@ -0,0 +1,18 @@
+# Copyright 2019 Tecnativa - Carlos Dauden
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+{
+ "name": "Account Banking Mandate Contact",
+ "summary": "Assign specific banking mandates in contact level",
+ "version": "13.0.1.0.0",
+ "development_status": "Production/Stable",
+ "category": "Banking addons",
+ "website": "https://github.com/OCA/bank-payment",
+ "author": "Tecnativa, Odoo Community Association (OCA)",
+ "license": "AGPL-3",
+ "application": False,
+ "installable": True,
+ "depends": ["account_banking_mandate", "sale"],
+ "data": [
+ "views/res_partner.xml",
+ ],
+}
diff --git a/account_banking_mandate_contact/i18n/account_banking_mandate_contact.pot b/account_banking_mandate_contact/i18n/account_banking_mandate_contact.pot
new file mode 100644
index 000000000..7a501e0b3
--- /dev/null
+++ b/account_banking_mandate_contact/i18n/account_banking_mandate_contact.pot
@@ -0,0 +1,30 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * account_banking_mandate_contact
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 13.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_banking_mandate_contact
+#: model:ir.model,name:account_banking_mandate_contact.model_res_partner
+msgid "Contact"
+msgstr ""
+
+#. module: account_banking_mandate_contact
+#: model:ir.model.fields,field_description:account_banking_mandate_contact.field_res_partner__contact_mandate_id
+#: model:ir.model.fields,field_description:account_banking_mandate_contact.field_res_users__contact_mandate_id
+msgid "Contact Mandate"
+msgstr ""
+
+#. module: account_banking_mandate_contact
+#: model:ir.model,name:account_banking_mandate_contact.model_account_move_line
+msgid "Journal Item"
+msgstr ""
diff --git a/account_banking_mandate_contact/i18n/es.po b/account_banking_mandate_contact/i18n/es.po
new file mode 100644
index 000000000..393756256
--- /dev/null
+++ b/account_banking_mandate_contact/i18n/es.po
@@ -0,0 +1,34 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * account_banking_mandate_contact
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 11.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-02-21 12:57+0100\n"
+"PO-Revision-Date: 2020-02-21 12:58+0100\n"
+"Last-Translator: Carlos Dauden \n"
+"Language-Team: \n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#. module: account_banking_mandate_contact
+#: model:ir.model,name:account_banking_mandate_contact.model_res_partner
+msgid "Contact"
+msgstr "Contacto"
+
+#. module: account_banking_mandate_contact
+#: model:ir.model.fields,field_description:account_banking_mandate_contact.field_res_partner__contact_mandate_id
+#: model:ir.model.fields,field_description:account_banking_mandate_contact.field_res_users__contact_mandate_id
+msgid "Contact Mandate"
+msgstr "Mandato del contacto"
+
+#. module: account_banking_mandate_contact
+#: model:ir.model,name:account_banking_mandate_contact.model_account_move_line
+msgid "Journal Item"
+msgstr "Apunte contable"
diff --git a/account_banking_mandate_contact/models/__init__.py b/account_banking_mandate_contact/models/__init__.py
new file mode 100644
index 000000000..a9f523dd9
--- /dev/null
+++ b/account_banking_mandate_contact/models/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from . import account_move_line
+from . import res_partner
diff --git a/account_banking_mandate_contact/models/account_move_line.py b/account_banking_mandate_contact/models/account_move_line.py
new file mode 100644
index 000000000..cf979797e
--- /dev/null
+++ b/account_banking_mandate_contact/models/account_move_line.py
@@ -0,0 +1,27 @@
+# Copyright 2019 Tecnativa - Carlos Dauden
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+
+from odoo import models
+
+
+class AccountMoveLine(models.Model):
+ _inherit = "account.move.line"
+
+ # Extended to use partner_shipping_id mandate if it have set
+ def _prepare_payment_line_vals(self, payment_order):
+ vals = super(AccountMoveLine, self)._prepare_payment_line_vals(payment_order)
+ if payment_order.payment_type != "inbound" or self.mandate_id:
+ return vals
+ mandate = (
+ self.move_id.partner_shipping_id.valid_mandate_id
+ or self.move_id.partner_id.valid_mandate_id
+ )
+ if mandate:
+ vals.update(
+ {
+ "mandate_id": mandate.id,
+ "partner_bank_id": mandate.partner_bank_id.id,
+ }
+ )
+ return vals
diff --git a/account_banking_mandate_contact/models/res_partner.py b/account_banking_mandate_contact/models/res_partner.py
new file mode 100644
index 000000000..d8906e70b
--- /dev/null
+++ b/account_banking_mandate_contact/models/res_partner.py
@@ -0,0 +1,21 @@
+# Copyright 2019 Tecnativa - Carlos Dauden
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from odoo import fields, models
+
+
+class ResPartner(models.Model):
+ _inherit = "res.partner"
+
+ contact_mandate_id = fields.Many2one(
+ comodel_name="account.banking.mandate",
+ string="Contact Mandate",
+ )
+
+ def _compute_valid_mandate_id(self):
+ procesed_partners = self.browse()
+ for partner in self:
+ if partner.contact_mandate_id.state == "valid":
+ partner.valid_mandate_id = partner.contact_mandate_id
+ procesed_partners |= partner
+ super(ResPartner, self - procesed_partners)._compute_valid_mandate_id()
diff --git a/account_banking_mandate_contact/readme/CONTRIBUTORS.rst b/account_banking_mandate_contact/readme/CONTRIBUTORS.rst
new file mode 100644
index 000000000..d4af61ff6
--- /dev/null
+++ b/account_banking_mandate_contact/readme/CONTRIBUTORS.rst
@@ -0,0 +1 @@
+* Carlos Dauden
diff --git a/account_banking_mandate_contact/readme/DESCRIPTION.rst b/account_banking_mandate_contact/readme/DESCRIPTION.rst
new file mode 100644
index 000000000..f53813c8c
--- /dev/null
+++ b/account_banking_mandate_contact/readme/DESCRIPTION.rst
@@ -0,0 +1 @@
+Manage specific banking mandate in contact level
diff --git a/account_banking_mandate_contact/readme/USAGE.rst b/account_banking_mandate_contact/readme/USAGE.rst
new file mode 100644
index 000000000..334d594cb
--- /dev/null
+++ b/account_banking_mandate_contact/readme/USAGE.rst
@@ -0,0 +1 @@
+To use this module you need to:
diff --git a/account_banking_mandate_contact/static/description/icon.png b/account_banking_mandate_contact/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
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
z
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
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
literal 0
HcmV?d00001
diff --git a/account_banking_mandate_contact/tests/__init__.py b/account_banking_mandate_contact/tests/__init__.py
new file mode 100644
index 000000000..46e0b61ff
--- /dev/null
+++ b/account_banking_mandate_contact/tests/__init__.py
@@ -0,0 +1,4 @@
+# Copyright 2021 Tecnativa - Víctor Martínez
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl
+
+from . import test_account_payment_order
diff --git a/account_banking_mandate_contact/tests/test_account_payment_order.py b/account_banking_mandate_contact/tests/test_account_payment_order.py
new file mode 100644
index 000000000..79da668f7
--- /dev/null
+++ b/account_banking_mandate_contact/tests/test_account_payment_order.py
@@ -0,0 +1,117 @@
+# Copyright 2021 Tecnativa - Víctor Martínez
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl
+from odoo import fields
+from odoo.tests.common import Form, TransactionCase
+
+
+class TestAccountPaymentOrder(TransactionCase):
+ def setUp(self):
+ super(TestAccountPaymentOrder, self).setUp()
+ self.partner = self.env["res.partner"].create({"name": "Test Partner"})
+ self.product = self.env["product.product"].create({"name": "Test product"})
+ self.partner_bank_core = self._create_res_partner_bank("N-CORE")
+ self.mandate_core = self._create_mandate(self.partner_bank_core, "CORE")
+ self.partner_bank_b2b = self._create_res_partner_bank("N-B2B")
+ self.mandate_b2b = self._create_mandate(self.partner_bank_b2b, "B2B")
+ self.method_sepa = self.env["account.payment.method"].create(
+ {
+ "name": "SEPA",
+ "code": "sepa_direct_debit",
+ "payment_type": "inbound",
+ "bank_account_required": True,
+ }
+ )
+ self.journal_bank = self.env["account.journal"].create(
+ {"name": "BANK", "type": "bank", "code": "bank"}
+ )
+ payment_form = Form(self.env["account.payment.mode"])
+ payment_form.name = "SEPA (CORE)"
+ payment_form.payment_method_id = self.method_sepa
+ payment_form.bank_account_link = "fixed"
+ payment_form.fixed_journal_id = self.journal_bank
+ payment_form.payment_order_ok = True
+ self.payment_core = payment_form.save()
+ self.payment_b2b = self.payment_core.copy({"name": "SEPA B2B"})
+ self.partner.customer_payment_mode_id = self.payment_core.id
+ self.env["account.journal"].create(
+ {"name": "SALE", "type": "sale", "code": "sale"}
+ )
+ self.invoice = self._create_invoice()
+ payment_order_form = Form(
+ self.env["account.payment.order"].with_context(
+ default_payment_type="inbound"
+ )
+ )
+ payment_order_form.payment_mode_id = self.payment_core
+ self.payment_order = payment_order_form.save()
+
+ def _create_res_partner_bank(self, acc_number):
+ res_partner_bank_form = Form(self.env["res.partner.bank"])
+ res_partner_bank_form.partner_id = self.partner
+ res_partner_bank_form.acc_number = acc_number
+ return res_partner_bank_form.save()
+
+ def _create_mandate(self, partner_bank, scheme):
+ mandate_form = Form(self.env["account.banking.mandate"])
+ mandate_form.partner_bank_id = partner_bank
+ mandate_form.signature_date = fields.Date.from_string("2021-01-01")
+ mandate = mandate_form.save()
+ mandate.validate()
+ return mandate
+
+ def _create_invoice(self):
+ invoice_form = Form(
+ self.env["account.move"].with_context(default_type="out_invoice")
+ )
+ invoice_form.partner_id = self.partner
+ invoice_form.invoice_date = fields.Date.from_string("2021-01-01")
+ with invoice_form.invoice_line_ids.new() as line_form:
+ line_form.product_id = self.product
+ line_form.quantity = 1
+ line_form.price_unit = 30
+ line_form.tax_ids.clear()
+ invoice = invoice_form.save()
+ invoice.action_post()
+ return invoice
+
+ def test_invoice_payment_mode(self):
+ self.assertEqual(self.invoice.state, "posted")
+ self.assertEqual(self.invoice.payment_mode_id, self.payment_core)
+ self.assertEqual(
+ self.invoice.invoice_date_due, fields.Date.from_string("2021-01-01")
+ )
+
+ def test_account_payment_order_core(self):
+ line_create_form = Form(
+ self.env["account.payment.line.create"].with_context(
+ active_model="account.payment.order", active_id=self.payment_order.id
+ )
+ )
+ line_create_form.date_type = "due"
+ line_create_form.due_date = fields.Date.from_string("2021-01-01")
+ line_create = line_create_form.save()
+ line_create.populate()
+ line_create.create_payment_lines()
+ self.assertAlmostEqual(len(self.payment_order.payment_line_ids), 1)
+ payment_line = self.payment_order.payment_line_ids.filtered(
+ lambda x: x.partner_id == self.partner
+ )
+ self.assertEqual(payment_line.partner_bank_id, self.partner_bank_core)
+
+ def test_account_payment_order_core_extra(self):
+ self.partner.contact_mandate_id = self.mandate_b2b
+ line_create_form = Form(
+ self.env["account.payment.line.create"].with_context(
+ active_model="account.payment.order", active_id=self.payment_order.id
+ )
+ )
+ line_create_form.date_type = "due"
+ line_create_form.due_date = fields.Date.from_string("2021-01-01")
+ line_create = line_create_form.save()
+ line_create.populate()
+ line_create.create_payment_lines()
+ self.assertAlmostEqual(len(self.payment_order.payment_line_ids), 1)
+ payment_line = self.payment_order.payment_line_ids.filtered(
+ lambda x: x.partner_id == self.partner
+ )
+ self.assertEqual(payment_line.partner_bank_id, self.partner_bank_b2b)
diff --git a/account_banking_mandate_contact/views/res_partner.xml b/account_banking_mandate_contact/views/res_partner.xml
new file mode 100644
index 000000000..abda1a955
--- /dev/null
+++ b/account_banking_mandate_contact/views/res_partner.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ res.partner
+
+
+
+
+
+
+
+
+
From 7775d105f4dcaf0996cf668c7aa80e76cb502933 Mon Sep 17 00:00:00 2001
From: Ernesto Tejeda
Date: Fri, 9 Dec 2022 09:55:37 +0100
Subject: [PATCH 2/8] [MIG] account_banking_mandate_contact: Migration to 15.0
---
account_banking_mandate_contact/README.rst | 46 +-
.../__manifest__.py | 2 +-
.../i18n/account_banking_mandate_contact.pot | 2 +-
.../models/account_move_line.py | 2 +-
.../models/res_partner.py | 2 +-
.../readme/CONTRIBUTORS.rst | 6 +-
.../readme/DESCRIPTION.rst | 4 +-
.../readme/USAGE.rst | 15 +-
.../static/description/index.html | 447 ++++++++++++++++++
.../tests/test_account_payment_order.py | 44 +-
10 files changed, 541 insertions(+), 29 deletions(-)
create mode 100644 account_banking_mandate_contact/static/description/index.html
diff --git a/account_banking_mandate_contact/README.rst b/account_banking_mandate_contact/README.rst
index b858bc439..b5390d6bd 100644
--- a/account_banking_mandate_contact/README.rst
+++ b/account_banking_mandate_contact/README.rst
@@ -2,10 +2,13 @@
Account Banking Mandate Contact
===============================
-.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:72ef0855d177fa6dd1f3596940a04f53c849846bbe4590ff8a273197d0eaea1e
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png
:target: https://odoo-community.org/page/development-status
@@ -14,18 +17,20 @@ Account Banking Mandate Contact
: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/12.0/account_banking_mandate_contact
+ :target: https://github.com/OCA/bank-payment/tree/15.0/account_banking_mandate_contact
: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-12-0/bank-payment-12-0-account_banking_mandate_contact
+ :target: https://translation.odoo-community.org/projects/bank-payment-15-0/bank-payment-15-0-account_banking_mandate_contact
:alt: Translate me on Weblate
-.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/173/12.0
- :alt: Try me on Runbot
+.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/bank-payment&target_branch=15.0
+ :alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
-Manage specific banking mandate in contact level
+This module allows to select a specific banking mandate
+(and thus, a specific bank account) at contact level, so that when doing
+a debit order, such mandate is used for the invoices issued to that contact.
**Table of contents**
@@ -35,15 +40,28 @@ Manage specific banking mandate in contact level
Usage
=====
-To use this module you need to:
+For selecting the mandate at contact level:
+
+#. Go to *Invoicing > Customers > Customers*.
+#. Open or create one contact that has a parent.
+#. On the "..." page, fill *Contact Mandate*.
+#. That mandate will be populated in the debit order.
+
+Then the normal flow will be:
+
+#. Go to Invoicing > Customers > Customer invoices.
+#. Create a new invoice for that contact.
+#. Post the invoice.
+#. Add it to a payment order, by any of the options that you can check on the *account_payment_order* module.
+#. The populated mandate will be the one on the contact.
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 `_.
+If you spotted it first, help us to smash it by providing a detailed and welcomed
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -58,7 +76,11 @@ Authors
Contributors
~~~~~~~~~~~~
-* Carlos Dauden
+* `Tecnativa `_:
+
+ * Carlos Dauden
+ * Ernesto Tejeda
+ * Pedro M. Baeza
Maintainers
~~~~~~~~~~~
@@ -73,6 +95,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_banking_mandate_contact/__manifest__.py b/account_banking_mandate_contact/__manifest__.py
index b87ba80f8..026a6a89c 100644
--- a/account_banking_mandate_contact/__manifest__.py
+++ b/account_banking_mandate_contact/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Account Banking Mandate Contact",
"summary": "Assign specific banking mandates in contact level",
- "version": "13.0.1.0.0",
+ "version": "15.0.1.0.0",
"development_status": "Production/Stable",
"category": "Banking addons",
"website": "https://github.com/OCA/bank-payment",
diff --git a/account_banking_mandate_contact/i18n/account_banking_mandate_contact.pot b/account_banking_mandate_contact/i18n/account_banking_mandate_contact.pot
index 7a501e0b3..f129f31cf 100644
--- a/account_banking_mandate_contact/i18n/account_banking_mandate_contact.pot
+++ b/account_banking_mandate_contact/i18n/account_banking_mandate_contact.pot
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 13.0\n"
+"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/account_banking_mandate_contact/models/account_move_line.py b/account_banking_mandate_contact/models/account_move_line.py
index cf979797e..3ff0fd57a 100644
--- a/account_banking_mandate_contact/models/account_move_line.py
+++ b/account_banking_mandate_contact/models/account_move_line.py
@@ -11,7 +11,7 @@ class AccountMoveLine(models.Model):
# Extended to use partner_shipping_id mandate if it have set
def _prepare_payment_line_vals(self, payment_order):
vals = super(AccountMoveLine, self)._prepare_payment_line_vals(payment_order)
- if payment_order.payment_type != "inbound" or self.mandate_id:
+ if payment_order.payment_type != "inbound" or self.move_id.mandate_id:
return vals
mandate = (
self.move_id.partner_shipping_id.valid_mandate_id
diff --git a/account_banking_mandate_contact/models/res_partner.py b/account_banking_mandate_contact/models/res_partner.py
index d8906e70b..4a397d3a3 100644
--- a/account_banking_mandate_contact/models/res_partner.py
+++ b/account_banking_mandate_contact/models/res_partner.py
@@ -18,4 +18,4 @@ class ResPartner(models.Model):
if partner.contact_mandate_id.state == "valid":
partner.valid_mandate_id = partner.contact_mandate_id
procesed_partners |= partner
- super(ResPartner, self - procesed_partners)._compute_valid_mandate_id()
+ return super(ResPartner, self - procesed_partners)._compute_valid_mandate_id()
diff --git a/account_banking_mandate_contact/readme/CONTRIBUTORS.rst b/account_banking_mandate_contact/readme/CONTRIBUTORS.rst
index d4af61ff6..35b76b8b0 100644
--- a/account_banking_mandate_contact/readme/CONTRIBUTORS.rst
+++ b/account_banking_mandate_contact/readme/CONTRIBUTORS.rst
@@ -1 +1,5 @@
-* Carlos Dauden
+* `Tecnativa `_:
+
+ * Carlos Dauden
+ * Ernesto Tejeda
+ * Pedro M. Baeza
diff --git a/account_banking_mandate_contact/readme/DESCRIPTION.rst b/account_banking_mandate_contact/readme/DESCRIPTION.rst
index f53813c8c..24fdda832 100644
--- a/account_banking_mandate_contact/readme/DESCRIPTION.rst
+++ b/account_banking_mandate_contact/readme/DESCRIPTION.rst
@@ -1 +1,3 @@
-Manage specific banking mandate in contact level
+This module allows to select a specific banking mandate
+(and thus, a specific bank account) at contact level, so that when doing
+a debit order, such mandate is used for the invoices issued to that contact.
diff --git a/account_banking_mandate_contact/readme/USAGE.rst b/account_banking_mandate_contact/readme/USAGE.rst
index 334d594cb..4a571f4fc 100644
--- a/account_banking_mandate_contact/readme/USAGE.rst
+++ b/account_banking_mandate_contact/readme/USAGE.rst
@@ -1 +1,14 @@
-To use this module you need to:
+For selecting the mandate at contact level:
+
+#. Go to *Invoicing > Customers > Customers*.
+#. Open or create one contact that has a parent.
+#. On the "..." page, fill *Contact Mandate*.
+#. That mandate will be populated in the debit order.
+
+Then the normal flow will be:
+
+#. Go to Invoicing > Customers > Customer invoices.
+#. Create a new invoice for that contact.
+#. Post the invoice.
+#. Add it to a payment order, by any of the options that you can check on the *account_payment_order* module.
+#. The populated mandate will be the one on the contact.
diff --git a/account_banking_mandate_contact/static/description/index.html b/account_banking_mandate_contact/static/description/index.html
new file mode 100644
index 000000000..af46009bb
--- /dev/null
+++ b/account_banking_mandate_contact/static/description/index.html
@@ -0,0 +1,447 @@
+
+
+
+
+
+
+Account Banking Mandate Contact
+
+
+
+
+
+
diff --git a/account_banking_mandate_contact/tests/test_account_payment_order.py b/account_banking_mandate_contact/tests/test_account_payment_order.py
index 79da668f7..30c6428ce 100644
--- a/account_banking_mandate_contact/tests/test_account_payment_order.py
+++ b/account_banking_mandate_contact/tests/test_account_payment_order.py
@@ -1,26 +1,30 @@
# Copyright 2021 Tecnativa - Víctor Martínez
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl
+
+from unittest.mock import patch
+
from odoo import fields
from odoo.tests.common import Form, TransactionCase
+from odoo.addons.account.models.account_payment_method import AccountPaymentMethod
+
class TestAccountPaymentOrder(TransactionCase):
def setUp(self):
- super(TestAccountPaymentOrder, self).setUp()
+ super().setUp()
self.partner = self.env["res.partner"].create({"name": "Test Partner"})
self.product = self.env["product.product"].create({"name": "Test product"})
self.partner_bank_core = self._create_res_partner_bank("N-CORE")
self.mandate_core = self._create_mandate(self.partner_bank_core, "CORE")
self.partner_bank_b2b = self._create_res_partner_bank("N-B2B")
self.mandate_b2b = self._create_mandate(self.partner_bank_b2b, "B2B")
- self.method_sepa = self.env["account.payment.method"].create(
- {
- "name": "SEPA",
- "code": "sepa_direct_debit",
- "payment_type": "inbound",
- "bank_account_required": True,
- }
- )
+ payment_method_vals = {
+ "name": "SEPA",
+ "code": "sepa_direct_debit",
+ "payment_type": "inbound",
+ "bank_account_required": True,
+ }
+ self.method_sepa = self._create_multi_bank_payment_method(payment_method_vals)
self.journal_bank = self.env["account.journal"].create(
{"name": "BANK", "type": "bank", "code": "bank"}
)
@@ -45,6 +49,26 @@ class TestAccountPaymentOrder(TransactionCase):
payment_order_form.payment_mode_id = self.payment_core
self.payment_order = payment_order_form.save()
+ def _create_multi_bank_payment_method(self, payment_method_vals):
+ method_get_payment_method_information = (
+ AccountPaymentMethod._get_payment_method_information
+ )
+
+ def _get_payment_method_information(self):
+ res = method_get_payment_method_information(self)
+ res[payment_method_vals["code"]] = {
+ "mode": "multi",
+ "domain": [("type", "=", "bank")],
+ }
+ return res
+
+ with patch.object(
+ AccountPaymentMethod,
+ "_get_payment_method_information",
+ _get_payment_method_information,
+ ):
+ return self.env["account.payment.method"].create(payment_method_vals)
+
def _create_res_partner_bank(self, acc_number):
res_partner_bank_form = Form(self.env["res.partner.bank"])
res_partner_bank_form.partner_id = self.partner
@@ -61,7 +85,7 @@ class TestAccountPaymentOrder(TransactionCase):
def _create_invoice(self):
invoice_form = Form(
- self.env["account.move"].with_context(default_type="out_invoice")
+ self.env["account.move"].with_context(default_move_type="out_invoice")
)
invoice_form.partner_id = self.partner
invoice_form.invoice_date = fields.Date.from_string("2021-01-01")
From cad5df2386635bc7e338816945e390795adfd353 Mon Sep 17 00:00:00 2001
From: josep-tecnativa
Date: Mon, 16 Oct 2023 12:18:30 +0200
Subject: [PATCH 3/8] [IMP] account_banking_mandate_contact: test performance
improvement - Switch to setUpClass for avoiding repeat the same setup for
each test. - Include context keys for avoiding mail operations overhead.
---
account_banking_mandate_contact/README.rst | 2 +-
.../__manifest__.py | 2 +-
.../static/description/index.html | 2 +-
.../tests/test_account_payment_order.py | 83 +++++++++++--------
4 files changed, 52 insertions(+), 37 deletions(-)
diff --git a/account_banking_mandate_contact/README.rst b/account_banking_mandate_contact/README.rst
index b5390d6bd..c1f73c485 100644
--- a/account_banking_mandate_contact/README.rst
+++ b/account_banking_mandate_contact/README.rst
@@ -7,7 +7,7 @@ Account Banking Mandate Contact
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !! source digest: sha256:72ef0855d177fa6dd1f3596940a04f53c849846bbe4590ff8a273197d0eaea1e
+ !! source digest: sha256:c037b632e64403ec6e4d61e7275eece4b909b3cdfe5199867e18ae8e362381bb
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png
diff --git a/account_banking_mandate_contact/__manifest__.py b/account_banking_mandate_contact/__manifest__.py
index 026a6a89c..16cca8aea 100644
--- a/account_banking_mandate_contact/__manifest__.py
+++ b/account_banking_mandate_contact/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Account Banking Mandate Contact",
"summary": "Assign specific banking mandates in contact level",
- "version": "15.0.1.0.0",
+ "version": "15.0.1.0.1",
"development_status": "Production/Stable",
"category": "Banking addons",
"website": "https://github.com/OCA/bank-payment",
diff --git a/account_banking_mandate_contact/static/description/index.html b/account_banking_mandate_contact/static/description/index.html
index af46009bb..633c4576d 100644
--- a/account_banking_mandate_contact/static/description/index.html
+++ b/account_banking_mandate_contact/static/description/index.html
@@ -367,7 +367,7 @@ ul.auto-toc {
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! source digest: sha256:72ef0855d177fa6dd1f3596940a04f53c849846bbe4590ff8a273197d0eaea1e
+!! source digest: sha256:c037b632e64403ec6e4d61e7275eece4b909b3cdfe5199867e18ae8e362381bb
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

This module allows to select a specific banking mandate
diff --git a/account_banking_mandate_contact/tests/test_account_payment_order.py b/account_banking_mandate_contact/tests/test_account_payment_order.py
index 30c6428ce..c40dd11d3 100644
--- a/account_banking_mandate_contact/tests/test_account_payment_order.py
+++ b/account_banking_mandate_contact/tests/test_account_payment_order.py
@@ -10,52 +10,64 @@ from odoo.addons.account.models.account_payment_method import AccountPaymentMeth
class TestAccountPaymentOrder(TransactionCase):
- def setUp(self):
- super().setUp()
- self.partner = self.env["res.partner"].create({"name": "Test Partner"})
- self.product = self.env["product.product"].create({"name": "Test product"})
- self.partner_bank_core = self._create_res_partner_bank("N-CORE")
- self.mandate_core = self._create_mandate(self.partner_bank_core, "CORE")
- self.partner_bank_b2b = self._create_res_partner_bank("N-B2B")
- self.mandate_b2b = self._create_mandate(self.partner_bank_b2b, "B2B")
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls.env = cls.env(
+ context=dict(
+ cls.env.context,
+ mail_create_nolog=True,
+ mail_create_nosubscribe=True,
+ mail_notrack=True,
+ no_reset_password=True,
+ tracking_disable=True,
+ )
+ )
+ cls.partner = cls.env["res.partner"].create({"name": "Test Partner"})
+ cls.product = cls.env["product.product"].create({"name": "Test product"})
+ cls.partner_bank_core = cls._create_res_partner_bank("N-CORE")
+ cls.mandate_core = cls._create_mandate(cls.partner_bank_core, "CORE")
+ cls.partner_bank_b2b = cls._create_res_partner_bank("N-B2B")
+ cls.mandate_b2b = cls._create_mandate(cls.partner_bank_b2b, "B2B")
payment_method_vals = {
"name": "SEPA",
"code": "sepa_direct_debit",
"payment_type": "inbound",
"bank_account_required": True,
}
- self.method_sepa = self._create_multi_bank_payment_method(payment_method_vals)
- self.journal_bank = self.env["account.journal"].create(
+ cls.method_sepa = cls._create_multi_bank_payment_method(payment_method_vals)
+ cls.journal_bank = cls.env["account.journal"].create(
{"name": "BANK", "type": "bank", "code": "bank"}
)
- payment_form = Form(self.env["account.payment.mode"])
+ payment_form = Form(cls.env["account.payment.mode"])
payment_form.name = "SEPA (CORE)"
- payment_form.payment_method_id = self.method_sepa
+ payment_form.payment_method_id = cls.method_sepa
payment_form.bank_account_link = "fixed"
- payment_form.fixed_journal_id = self.journal_bank
+ payment_form.fixed_journal_id = cls.journal_bank
payment_form.payment_order_ok = True
- self.payment_core = payment_form.save()
- self.payment_b2b = self.payment_core.copy({"name": "SEPA B2B"})
- self.partner.customer_payment_mode_id = self.payment_core.id
- self.env["account.journal"].create(
+ cls.payment_core = payment_form.save()
+ cls.payment_b2b = cls.payment_core.copy({"name": "SEPA B2B"})
+ cls.partner.customer_payment_mode_id = cls.payment_core.id
+ cls.env["account.journal"].create(
{"name": "SALE", "type": "sale", "code": "sale"}
)
- self.invoice = self._create_invoice()
+ cls.invoice = cls._create_invoice()
payment_order_form = Form(
- self.env["account.payment.order"].with_context(
+ cls.env["account.payment.order"].with_context(
default_payment_type="inbound"
)
)
- payment_order_form.payment_mode_id = self.payment_core
- self.payment_order = payment_order_form.save()
+ payment_order_form.payment_mode_id = cls.payment_core
+ cls.payment_order = payment_order_form.save()
- def _create_multi_bank_payment_method(self, payment_method_vals):
+ @classmethod
+ def _create_multi_bank_payment_method(cls, payment_method_vals):
method_get_payment_method_information = (
AccountPaymentMethod._get_payment_method_information
)
- def _get_payment_method_information(self):
- res = method_get_payment_method_information(self)
+ def _get_payment_method_information(cls):
+ res = method_get_payment_method_information(cls)
res[payment_method_vals["code"]] = {
"mode": "multi",
"domain": [("type", "=", "bank")],
@@ -67,30 +79,33 @@ class TestAccountPaymentOrder(TransactionCase):
"_get_payment_method_information",
_get_payment_method_information,
):
- return self.env["account.payment.method"].create(payment_method_vals)
+ return cls.env["account.payment.method"].create(payment_method_vals)
- def _create_res_partner_bank(self, acc_number):
- res_partner_bank_form = Form(self.env["res.partner.bank"])
- res_partner_bank_form.partner_id = self.partner
+ @classmethod
+ def _create_res_partner_bank(cls, acc_number):
+ res_partner_bank_form = Form(cls.env["res.partner.bank"])
+ res_partner_bank_form.partner_id = cls.partner
res_partner_bank_form.acc_number = acc_number
return res_partner_bank_form.save()
- def _create_mandate(self, partner_bank, scheme):
- mandate_form = Form(self.env["account.banking.mandate"])
+ @classmethod
+ def _create_mandate(cls, partner_bank, scheme):
+ mandate_form = Form(cls.env["account.banking.mandate"])
mandate_form.partner_bank_id = partner_bank
mandate_form.signature_date = fields.Date.from_string("2021-01-01")
mandate = mandate_form.save()
mandate.validate()
return mandate
- def _create_invoice(self):
+ @classmethod
+ def _create_invoice(cls):
invoice_form = Form(
- self.env["account.move"].with_context(default_move_type="out_invoice")
+ cls.env["account.move"].with_context(default_move_type="out_invoice")
)
- invoice_form.partner_id = self.partner
+ invoice_form.partner_id = cls.partner
invoice_form.invoice_date = fields.Date.from_string("2021-01-01")
with invoice_form.invoice_line_ids.new() as line_form:
- line_form.product_id = self.product
+ line_form.product_id = cls.product
line_form.quantity = 1
line_form.price_unit = 30
line_form.tax_ids.clear()
From bcf3ebaf06d2ba99d4bbf0acd7f5cd566b96ddac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alberto=20Mart=C3=ADnez?=
Date: Wed, 6 Mar 2024 13:51:11 +0100
Subject: [PATCH 4/8] [MIG] account_banking_mandate_contact: Migration to 16.0
---
account_banking_mandate_contact/README.rst | 16 ++++++++++------
account_banking_mandate_contact/__manifest__.py | 2 +-
.../i18n/account_banking_mandate_contact.pot | 2 +-
.../models/res_partner.py | 12 ++++++------
.../readme/CONTRIBUTORS.rst | 4 ++++
.../static/description/index.html | 12 ++++++++----
.../tests/test_account_payment_order.py | 10 +++++-----
7 files changed, 35 insertions(+), 23 deletions(-)
diff --git a/account_banking_mandate_contact/README.rst b/account_banking_mandate_contact/README.rst
index c1f73c485..cb6e51efd 100644
--- a/account_banking_mandate_contact/README.rst
+++ b/account_banking_mandate_contact/README.rst
@@ -7,7 +7,7 @@ Account Banking Mandate Contact
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !! source digest: sha256:c037b632e64403ec6e4d61e7275eece4b909b3cdfe5199867e18ae8e362381bb
+ !! source digest: sha256:e64a6ce44499395afe175300e7c9551d1ea8bdd1263b8fc251600675ee2e07c9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png
@@ -17,13 +17,13 @@ Account Banking Mandate Contact
: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/15.0/account_banking_mandate_contact
+ :target: https://github.com/OCA/bank-payment/tree/16.0/account_banking_mandate_contact
: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-15-0/bank-payment-15-0-account_banking_mandate_contact
+ :target: https://translation.odoo-community.org/projects/bank-payment-16-0/bank-payment-16-0-account_banking_mandate_contact
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
- :target: https://runboat.odoo-community.org/builds?repo=OCA/bank-payment&target_branch=15.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/bank-payment&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -61,7 +61,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 to smash it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -82,6 +82,10 @@ Contributors
* Ernesto Tejeda
* Pedro M. Baeza
+* `Sygel `__:
+
+ * Alberto Martínez
+
Maintainers
~~~~~~~~~~~
@@ -95,6 +99,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_banking_mandate_contact/__manifest__.py b/account_banking_mandate_contact/__manifest__.py
index 16cca8aea..e32d1020e 100644
--- a/account_banking_mandate_contact/__manifest__.py
+++ b/account_banking_mandate_contact/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Account Banking Mandate Contact",
"summary": "Assign specific banking mandates in contact level",
- "version": "15.0.1.0.1",
+ "version": "16.0.1.0.1",
"development_status": "Production/Stable",
"category": "Banking addons",
"website": "https://github.com/OCA/bank-payment",
diff --git a/account_banking_mandate_contact/i18n/account_banking_mandate_contact.pot b/account_banking_mandate_contact/i18n/account_banking_mandate_contact.pot
index f129f31cf..856a796d5 100644
--- a/account_banking_mandate_contact/i18n/account_banking_mandate_contact.pot
+++ b/account_banking_mandate_contact/i18n/account_banking_mandate_contact.pot
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 15.0\n"
+"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/account_banking_mandate_contact/models/res_partner.py b/account_banking_mandate_contact/models/res_partner.py
index 4a397d3a3..cc6cfd96c 100644
--- a/account_banking_mandate_contact/models/res_partner.py
+++ b/account_banking_mandate_contact/models/res_partner.py
@@ -13,9 +13,9 @@ class ResPartner(models.Model):
)
def _compute_valid_mandate_id(self):
- procesed_partners = self.browse()
- for partner in self:
- if partner.contact_mandate_id.state == "valid":
- partner.valid_mandate_id = partner.contact_mandate_id
- procesed_partners |= partner
- return super(ResPartner, self - procesed_partners)._compute_valid_mandate_id()
+ partners_to_process = self.filtered(
+ lambda x: x.contact_mandate_id.state == "valid"
+ )
+ for partner in partners_to_process:
+ partner.valid_mandate_id = partner.contact_mandate_id
+ return super(ResPartner, self - partners_to_process)._compute_valid_mandate_id()
diff --git a/account_banking_mandate_contact/readme/CONTRIBUTORS.rst b/account_banking_mandate_contact/readme/CONTRIBUTORS.rst
index 35b76b8b0..18e8db519 100644
--- a/account_banking_mandate_contact/readme/CONTRIBUTORS.rst
+++ b/account_banking_mandate_contact/readme/CONTRIBUTORS.rst
@@ -3,3 +3,7 @@
* Carlos Dauden
* Ernesto Tejeda
* Pedro M. Baeza
+
+* `Sygel `__:
+
+ * Alberto Martínez
\ No newline at end of file
diff --git a/account_banking_mandate_contact/static/description/index.html b/account_banking_mandate_contact/static/description/index.html
index 633c4576d..aa1224d5e 100644
--- a/account_banking_mandate_contact/static/description/index.html
+++ b/account_banking_mandate_contact/static/description/index.html
@@ -367,9 +367,9 @@ ul.auto-toc {
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! source digest: sha256:c037b632e64403ec6e4d61e7275eece4b909b3cdfe5199867e18ae8e362381bb
+!! source digest: sha256:e64a6ce44499395afe175300e7c9551d1ea8bdd1263b8fc251600675ee2e07c9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This module allows to select a specific banking mandate
(and thus, a specific bank account) at contact level, so that when doing
a debit order, such mandate is used for the invoices issued to that contact.
@@ -409,7 +409,7 @@ a debit order, such mandate is used for the invoices issued to that contact.
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 to smash it by providing a detailed and welcomed
-feedback.
+feedback.
Do not contact contributors directly about support or help with technical issues.
@@ -429,6 +429,10 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
Pedro M. Baeza
+
Sygel:
+
@@ -438,7 +442,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
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_banking_mandate_contact/tests/test_account_payment_order.py b/account_banking_mandate_contact/tests/test_account_payment_order.py
index c40dd11d3..34cc4259d 100644
--- a/account_banking_mandate_contact/tests/test_account_payment_order.py
+++ b/account_banking_mandate_contact/tests/test_account_payment_order.py
@@ -111,14 +111,13 @@ class TestAccountPaymentOrder(TransactionCase):
line_form.tax_ids.clear()
invoice = invoice_form.save()
invoice.action_post()
+
return invoice
def test_invoice_payment_mode(self):
self.assertEqual(self.invoice.state, "posted")
self.assertEqual(self.invoice.payment_mode_id, self.payment_core)
- self.assertEqual(
- self.invoice.invoice_date_due, fields.Date.from_string("2021-01-01")
- )
+ self.assertEqual(self.invoice.invoice_date_due, fields.Date.today())
def test_account_payment_order_core(self):
line_create_form = Form(
@@ -127,7 +126,7 @@ class TestAccountPaymentOrder(TransactionCase):
)
)
line_create_form.date_type = "due"
- line_create_form.due_date = fields.Date.from_string("2021-01-01")
+ line_create_form.due_date = fields.Date.today()
line_create = line_create_form.save()
line_create.populate()
line_create.create_payment_lines()
@@ -145,7 +144,7 @@ class TestAccountPaymentOrder(TransactionCase):
)
)
line_create_form.date_type = "due"
- line_create_form.due_date = fields.Date.from_string("2021-01-01")
+ line_create_form.due_date = fields.Date.today()
line_create = line_create_form.save()
line_create.populate()
line_create.create_payment_lines()
@@ -153,4 +152,5 @@ class TestAccountPaymentOrder(TransactionCase):
payment_line = self.payment_order.payment_line_ids.filtered(
lambda x: x.partner_id == self.partner
)
+ self.assertEqual(payment_line.mandate_id, self.mandate_b2b)
self.assertEqual(payment_line.partner_bank_id, self.partner_bank_b2b)
From 4be0e96104b97a7c87ce7b7616f73faaea72dae4 Mon Sep 17 00:00:00 2001
From: mymage
Date: Thu, 2 May 2024 15:08:19 +0000
Subject: [PATCH 5/8] Added translation using Weblate (Italian)
---
account_banking_mandate_contact/i18n/it.po | 33 ++++++++++++++++++++++
1 file changed, 33 insertions(+)
create mode 100644 account_banking_mandate_contact/i18n/it.po
diff --git a/account_banking_mandate_contact/i18n/it.po b/account_banking_mandate_contact/i18n/it.po
new file mode 100644
index 000000000..41464edac
--- /dev/null
+++ b/account_banking_mandate_contact/i18n/it.po
@@ -0,0 +1,33 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * account_banking_mandate_contact
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2024-05-03 14:37+0000\n"
+"Last-Translator: mymage \n"
+"Language-Team: none\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. module: account_banking_mandate_contact
+#: model:ir.model,name:account_banking_mandate_contact.model_res_partner
+msgid "Contact"
+msgstr "Contatto"
+
+#. module: account_banking_mandate_contact
+#: model:ir.model.fields,field_description:account_banking_mandate_contact.field_res_partner__contact_mandate_id
+#: model:ir.model.fields,field_description:account_banking_mandate_contact.field_res_users__contact_mandate_id
+msgid "Contact Mandate"
+msgstr "Mandato contatto"
+
+#. module: account_banking_mandate_contact
+#: model:ir.model,name:account_banking_mandate_contact.model_account_move_line
+msgid "Journal Item"
+msgstr "Movimento contabile"
From 4f93281bd6ea2d31d273191608221bf48d7ab962 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?=
Date: Wed, 8 May 2024 10:57:17 +0200
Subject: [PATCH 6/8] [IMP] account_banking_mandate_contact: Improve tests
(remove mock)
Changes done:
- Add _get_payment_method_information() compatibility from account_banking_mandate
- Remove mock from account_banking_mandate_contact tests
---
.../models/account_payment_method.py | 11 ++++++-
.../tests/test_account_payment_order.py | 33 ++++---------------
2 files changed, 16 insertions(+), 28 deletions(-)
diff --git a/account_banking_mandate/models/account_payment_method.py b/account_banking_mandate/models/account_payment_method.py
index de57f69ae..426195ea5 100644
--- a/account_banking_mandate/models/account_payment_method.py
+++ b/account_banking_mandate/models/account_payment_method.py
@@ -1,7 +1,7 @@
# Copyright 2016-2020 Akretion (Alexis de Lattre )
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
-from odoo import fields, models
+from odoo import api, fields, models
class AccountPaymentMethod(models.Model):
@@ -11,3 +11,12 @@ class AccountPaymentMethod(models.Model):
help="Activate this option if this payment method requires your "
"customer to sign a direct debit mandate with your company.",
)
+
+ @api.model
+ def _get_payment_method_information(self):
+ res = super()._get_payment_method_information()
+ res["sepa_direct_debit"] = {
+ "mode": "multi",
+ "domain": [("type", "=", "bank")],
+ }
+ return res
diff --git a/account_banking_mandate_contact/tests/test_account_payment_order.py b/account_banking_mandate_contact/tests/test_account_payment_order.py
index 34cc4259d..22768bc65 100644
--- a/account_banking_mandate_contact/tests/test_account_payment_order.py
+++ b/account_banking_mandate_contact/tests/test_account_payment_order.py
@@ -1,13 +1,9 @@
# Copyright 2021 Tecnativa - Víctor Martínez
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl
-from unittest.mock import patch
-
from odoo import fields
from odoo.tests.common import Form, TransactionCase
-from odoo.addons.account.models.account_payment_method import AccountPaymentMethod
-
class TestAccountPaymentOrder(TransactionCase):
@classmethod
@@ -35,9 +31,13 @@ class TestAccountPaymentOrder(TransactionCase):
"payment_type": "inbound",
"bank_account_required": True,
}
- cls.method_sepa = cls._create_multi_bank_payment_method(payment_method_vals)
+ cls.method_sepa = cls.env["account.payment.method"].create(payment_method_vals)
cls.journal_bank = cls.env["account.journal"].create(
- {"name": "BANK", "type": "bank", "code": "bank"}
+ {
+ "name": "BANK",
+ "type": "bank",
+ "code": "bank",
+ }
)
payment_form = Form(cls.env["account.payment.mode"])
payment_form.name = "SEPA (CORE)"
@@ -60,27 +60,6 @@ class TestAccountPaymentOrder(TransactionCase):
payment_order_form.payment_mode_id = cls.payment_core
cls.payment_order = payment_order_form.save()
- @classmethod
- def _create_multi_bank_payment_method(cls, payment_method_vals):
- method_get_payment_method_information = (
- AccountPaymentMethod._get_payment_method_information
- )
-
- def _get_payment_method_information(cls):
- res = method_get_payment_method_information(cls)
- res[payment_method_vals["code"]] = {
- "mode": "multi",
- "domain": [("type", "=", "bank")],
- }
- return res
-
- with patch.object(
- AccountPaymentMethod,
- "_get_payment_method_information",
- _get_payment_method_information,
- ):
- return cls.env["account.payment.method"].create(payment_method_vals)
-
@classmethod
def _create_res_partner_bank(cls, acc_number):
res_partner_bank_form = Form(cls.env["res.partner.bank"])
From ba4c0af0d4947ad5b4521ff314a4f019c47fea55 Mon Sep 17 00:00:00 2001
From: sygel
Date: Tue, 21 May 2024 15:35:33 +0200
Subject: [PATCH 7/8] [IMP] account_banking_mandate_contact: pre-commit auto
fixes
---
account_banking_mandate_contact/README.rst | 55 ++++++++++---------
.../pyproject.toml | 3 +
.../readme/CONTRIBUTORS.md | 6 ++
.../readme/CONTRIBUTORS.rst | 9 ---
.../readme/DESCRIPTION.md | 3 +
.../readme/DESCRIPTION.rst | 3 -
.../readme/USAGE.md | 15 +++++
.../readme/USAGE.rst | 14 -----
.../static/description/index.html | 27 +++++----
9 files changed, 70 insertions(+), 65 deletions(-)
create mode 100644 account_banking_mandate_contact/pyproject.toml
create mode 100644 account_banking_mandate_contact/readme/CONTRIBUTORS.md
delete mode 100644 account_banking_mandate_contact/readme/CONTRIBUTORS.rst
create mode 100644 account_banking_mandate_contact/readme/DESCRIPTION.md
delete mode 100644 account_banking_mandate_contact/readme/DESCRIPTION.rst
create mode 100644 account_banking_mandate_contact/readme/USAGE.md
delete mode 100644 account_banking_mandate_contact/readme/USAGE.rst
diff --git a/account_banking_mandate_contact/README.rst b/account_banking_mandate_contact/README.rst
index cb6e51efd..d48b22a12 100644
--- a/account_banking_mandate_contact/README.rst
+++ b/account_banking_mandate_contact/README.rst
@@ -17,20 +17,20 @@ Account Banking Mandate Contact
: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/16.0/account_banking_mandate_contact
+ :target: https://github.com/OCA/bank-payment/tree/17.0/account_banking_mandate_contact
: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-16-0/bank-payment-16-0-account_banking_mandate_contact
+ :target: https://translation.odoo-community.org/projects/bank-payment-17-0/bank-payment-17-0-account_banking_mandate_contact
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
- :target: https://runboat.odoo-community.org/builds?repo=OCA/bank-payment&target_branch=16.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/bank-payment&target_branch=17.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
-This module allows to select a specific banking mandate
-(and thus, a specific bank account) at contact level, so that when doing
-a debit order, such mandate is used for the invoices issued to that contact.
+This module allows to select a specific banking mandate (and thus, a
+specific bank account) at contact level, so that when doing a debit
+order, such mandate is used for the invoices issued to that contact.
**Table of contents**
@@ -42,18 +42,19 @@ Usage
For selecting the mandate at contact level:
-#. Go to *Invoicing > Customers > Customers*.
-#. Open or create one contact that has a parent.
-#. On the "..." page, fill *Contact Mandate*.
-#. That mandate will be populated in the debit order.
+1. Go to *Invoicing > Customers > Customers*.
+2. Open or create one contact that has a parent.
+3. On the "..." page, fill *Contact Mandate*.
+4. That mandate will be populated in the debit order.
Then the normal flow will be:
-#. Go to Invoicing > Customers > Customer invoices.
-#. Create a new invoice for that contact.
-#. Post the invoice.
-#. Add it to a payment order, by any of the options that you can check on the *account_payment_order* module.
-#. The populated mandate will be the one on the contact.
+1. Go to Invoicing > Customers > Customer invoices.
+2. Create a new invoice for that contact.
+3. Post the invoice.
+4. Add it to a payment order, by any of the options that you can check
+ on the *account_payment_order* module.
+5. The populated mandate will be the one on the contact.
Bug Tracker
===========
@@ -61,7 +62,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 to smash it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -69,25 +70,25 @@ Credits
=======
Authors
-~~~~~~~
+-------
* Tecnativa
Contributors
-~~~~~~~~~~~~
+------------
-* `Tecnativa `_:
+- `Tecnativa `__:
- * Carlos Dauden
- * Ernesto Tejeda
- * Pedro M. Baeza
+ - Carlos Dauden
+ - Ernesto Tejeda
+ - Pedro M. Baeza
-* `Sygel `__:
-
- * Alberto Martínez
+- `Sygel `__:
+
+ - Alberto Martínez
Maintainers
-~~~~~~~~~~~
+-----------
This module is maintained by the OCA.
@@ -99,6 +100,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_banking_mandate_contact/pyproject.toml b/account_banking_mandate_contact/pyproject.toml
new file mode 100644
index 000000000..4231d0ccc
--- /dev/null
+++ b/account_banking_mandate_contact/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/account_banking_mandate_contact/readme/CONTRIBUTORS.md b/account_banking_mandate_contact/readme/CONTRIBUTORS.md
new file mode 100644
index 000000000..235aed0af
--- /dev/null
+++ b/account_banking_mandate_contact/readme/CONTRIBUTORS.md
@@ -0,0 +1,6 @@
+- [Tecnativa](https://www.tecnativa.com):
+ - Carlos Dauden
+ - Ernesto Tejeda
+ - Pedro M. Baeza
+- [Sygel](https://www.sygel.es):
+ - Alberto Martínez
diff --git a/account_banking_mandate_contact/readme/CONTRIBUTORS.rst b/account_banking_mandate_contact/readme/CONTRIBUTORS.rst
deleted file mode 100644
index 18e8db519..000000000
--- a/account_banking_mandate_contact/readme/CONTRIBUTORS.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-* `Tecnativa `_:
-
- * Carlos Dauden
- * Ernesto Tejeda
- * Pedro M. Baeza
-
-* `Sygel `__:
-
- * Alberto Martínez
\ No newline at end of file
diff --git a/account_banking_mandate_contact/readme/DESCRIPTION.md b/account_banking_mandate_contact/readme/DESCRIPTION.md
new file mode 100644
index 000000000..1d4639015
--- /dev/null
+++ b/account_banking_mandate_contact/readme/DESCRIPTION.md
@@ -0,0 +1,3 @@
+This module allows to select a specific banking mandate (and thus, a
+specific bank account) at contact level, so that when doing a debit
+order, such mandate is used for the invoices issued to that contact.
diff --git a/account_banking_mandate_contact/readme/DESCRIPTION.rst b/account_banking_mandate_contact/readme/DESCRIPTION.rst
deleted file mode 100644
index 24fdda832..000000000
--- a/account_banking_mandate_contact/readme/DESCRIPTION.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-This module allows to select a specific banking mandate
-(and thus, a specific bank account) at contact level, so that when doing
-a debit order, such mandate is used for the invoices issued to that contact.
diff --git a/account_banking_mandate_contact/readme/USAGE.md b/account_banking_mandate_contact/readme/USAGE.md
new file mode 100644
index 000000000..c4dcf26a8
--- /dev/null
+++ b/account_banking_mandate_contact/readme/USAGE.md
@@ -0,0 +1,15 @@
+For selecting the mandate at contact level:
+
+1. Go to *Invoicing \> Customers \> Customers*.
+2. Open or create one contact that has a parent.
+3. On the "..." page, fill *Contact Mandate*.
+4. That mandate will be populated in the debit order.
+
+Then the normal flow will be:
+
+1. Go to Invoicing \> Customers \> Customer invoices.
+2. Create a new invoice for that contact.
+3. Post the invoice.
+4. Add it to a payment order, by any of the options that you can check
+ on the *account_payment_order* module.
+5. The populated mandate will be the one on the contact.
diff --git a/account_banking_mandate_contact/readme/USAGE.rst b/account_banking_mandate_contact/readme/USAGE.rst
deleted file mode 100644
index 4a571f4fc..000000000
--- a/account_banking_mandate_contact/readme/USAGE.rst
+++ /dev/null
@@ -1,14 +0,0 @@
-For selecting the mandate at contact level:
-
-#. Go to *Invoicing > Customers > Customers*.
-#. Open or create one contact that has a parent.
-#. On the "..." page, fill *Contact Mandate*.
-#. That mandate will be populated in the debit order.
-
-Then the normal flow will be:
-
-#. Go to Invoicing > Customers > Customer invoices.
-#. Create a new invoice for that contact.
-#. Post the invoice.
-#. Add it to a payment order, by any of the options that you can check on the *account_payment_order* module.
-#. The populated mandate will be the one on the contact.
diff --git a/account_banking_mandate_contact/static/description/index.html b/account_banking_mandate_contact/static/description/index.html
index aa1224d5e..764e1bf7d 100644
--- a/account_banking_mandate_contact/static/description/index.html
+++ b/account_banking_mandate_contact/static/description/index.html
@@ -1,4 +1,3 @@
-
@@ -9,10 +8,11 @@
/*
:Author: David Goodger (goodger@python.org)
-:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
+:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
+Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
@@ -275,7 +275,7 @@ pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
-pre.code .ln { color: grey; } /* line numbers */
+pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
@@ -301,7 +301,7 @@ span.option {
span.pre {
white-space: pre }
-span.problematic {
+span.problematic, pre.problematic {
color: red }
span.section-subtitle {
@@ -369,10 +369,10 @@ ul.auto-toc {
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e64a6ce44499395afe175300e7c9551d1ea8bdd1263b8fc251600675ee2e07c9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

-This module allows to select a specific banking mandate
-(and thus, a specific bank account) at contact level, so that when doing
-a debit order, such mandate is used for the invoices issued to that contact.
+

+This module allows to select a specific banking mandate (and thus, a
+specific bank account) at contact level, so that when doing a debit
+order, such mandate is used for the invoices issued to that contact.
Table of contents
@@ -400,7 +400,8 @@ a debit order, such mandate is used for the invoices issued to that contact.
- Go to Invoicing > Customers > Customer invoices.
- Create a new invoice for that contact.
- Post the invoice.
-- Add it to a payment order, by any of the options that you can check on the account_payment_order module.
+- Add it to a payment order, by any of the options that you can check
+on the account_payment_order module.
- The populated mandate will be the one on the contact.
@@ -409,7 +410,7 @@ a debit order, such mandate is used for the invoices issued to that contact.
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 to smash it by providing a detailed and welcomed
-feedback.
+feedback.
Do not contact contributors directly about support or help with technical issues.
@@ -438,11 +439,13 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
This module is maintained by the OCA.
-

+
+
+
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.
From 0c9ffc32fabc2fbe3970d581fe619ab7abd0282a Mon Sep 17 00:00:00 2001
From: sygel
Date: Tue, 21 May 2024 15:35:45 +0200
Subject: [PATCH 8/8] [MIG] account_banking_mandate_contact: Migration to 17.0
---
account_banking_mandate_contact/__manifest__.py | 2 +-
account_banking_mandate_contact/models/account_move_line.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/account_banking_mandate_contact/__manifest__.py b/account_banking_mandate_contact/__manifest__.py
index e32d1020e..8a57f0785 100644
--- a/account_banking_mandate_contact/__manifest__.py
+++ b/account_banking_mandate_contact/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Account Banking Mandate Contact",
"summary": "Assign specific banking mandates in contact level",
- "version": "16.0.1.0.1",
+ "version": "17.0.1.0.1",
"development_status": "Production/Stable",
"category": "Banking addons",
"website": "https://github.com/OCA/bank-payment",
diff --git a/account_banking_mandate_contact/models/account_move_line.py b/account_banking_mandate_contact/models/account_move_line.py
index 3ff0fd57a..d726b7e0a 100644
--- a/account_banking_mandate_contact/models/account_move_line.py
+++ b/account_banking_mandate_contact/models/account_move_line.py
@@ -10,7 +10,7 @@ class AccountMoveLine(models.Model):
# Extended to use partner_shipping_id mandate if it have set
def _prepare_payment_line_vals(self, payment_order):
- vals = super(AccountMoveLine, self)._prepare_payment_line_vals(payment_order)
+ vals = super()._prepare_payment_line_vals(payment_order)
if payment_order.payment_type != "inbound" or self.move_id.mandate_id:
return vals
mandate = (