From d68df1a8e6a2614af40f944b03dd6f3e94f206b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Mon, 24 Mar 2025 23:10:42 +0100 Subject: [PATCH] Store payable bank account number on SEPA payment This allows the user to select the bank account to use for the payment instead of the first IBAN. Also it stores the bank account that was selected by default on processing. Closes #13938 --- modules/account_payment_sepa/CHANGELOG | 1 + modules/account_payment_sepa/payment.py | 19 +++++++++++++++++++ .../account_payment_sepa/tests/test_module.py | 10 +++++++++- .../view/payment_form.xml | 8 +++++++- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/modules/account_payment_sepa/CHANGELOG b/modules/account_payment_sepa/CHANGELOG index ee9e23051d..ab080e03f0 100644 --- a/modules/account_payment_sepa/CHANGELOG +++ b/modules/account_payment_sepa/CHANGELOG @@ -1,3 +1,4 @@ +* Store payable bank account number * Remove support for Python 3.8 * Add support for Python 3.13 * Allow messages to be downloaded at once diff --git a/modules/account_payment_sepa/payment.py b/modules/account_payment_sepa/payment.py index 3ef74aaea4..05a1cd368e 100644 --- a/modules/account_payment_sepa/payment.py +++ b/modules/account_payment_sepa/payment.py @@ -232,6 +232,12 @@ class Group(metaclass=PoolMeta): payment.sepa_mandate = mandate payment.sepa_mandate_sequence_type = sequence_type Payment.save(payments) + elif self.kind == 'payable': + for payment in self.payments: + if not payment.sepa_payable_bank_account_number: + payment.sepa_payable_bank_account_number = ( + payment.sepa_bank_account_number) + Payment.save(self.payments) for payment in self.payments: if not payment.sepa_bank_account_number: raise ProcessError( @@ -329,6 +335,17 @@ class Group(metaclass=PoolMeta): class Payment(metaclass=PoolMeta): __name__ = 'account.payment' + sepa_payable_bank_account_number = fields.Many2One( + 'bank.account.number', "Bank Account Number", + states={ + 'invisible': ( + (Eval('process_method') != 'sepa') + | (Eval('kind') != 'payable')), + }, + domain=[ + ('type', '=', 'iban'), + ('account.owners', '=', Eval('party', -1)), + ]) sepa_mandate = fields.Many2One('account.payment.sepa.mandate', 'Mandate', ondelete='RESTRICT', states={ @@ -427,6 +444,8 @@ class Payment(metaclass=PoolMeta): if self.kind == 'receivable': if self.sepa_mandate: return self.sepa_mandate.account_number + elif self.sepa_payable_bank_account_number: + return self.sepa_payable_bank_account_number else: for account in self.party.bank_accounts_used: for number in account.numbers: diff --git a/modules/account_payment_sepa/tests/test_module.py b/modules/account_payment_sepa/tests/test_module.py index 4162bdebd9..e01593b97a 100644 --- a/modules/account_payment_sepa/tests/test_module.py +++ b/modules/account_payment_sepa/tests/test_module.py @@ -275,11 +275,19 @@ class AccountPaymentSepaTestCase(CompanyTestMixin, ModuleTestCase): numbers=[other_account_number, iban_account_number]) party = Party( bank_accounts_used=[bank_account]) - payment = Payment(kind='payable', party=party) + payment = Payment( + kind='payable', party=party, + sepa_payable_bank_account_number=None) self.assertEqual(id(payment.sepa_bank_account_number), id(iban_account_number)) + payment.sepa_payable_bank_account_number = iban_account_number + party.bank_accounts_used = [] + self.assertEqual( + payment.sepa_bank_account_number, + iban_account_number) + @with_transaction() def test_payment_sequence_type(self): 'Test payment sequence type' diff --git a/modules/account_payment_sepa/view/payment_form.xml b/modules/account_payment_sepa/view/payment_form.xml index 629f49dbba..ba78603119 100644 --- a/modules/account_payment_sepa/view/payment_form.xml +++ b/modules/account_payment_sepa/view/payment_form.xml @@ -6,8 +6,14 @@ this repository contains the full copyright notices and license terms. -->