diff --git a/account_banking_pain_base/models/account_payment_method.py b/account_banking_pain_base/models/account_payment_method.py
index 9da1b3c66..80d57f45a 100644
--- a/account_banking_pain_base/models/account_payment_method.py
+++ b/account_banking_pain_base/models/account_payment_method.py
@@ -15,6 +15,14 @@ class AccountPaymentMethod(models.Model):
help="If active, Odoo will convert each accented character to "
"the corresponding unaccented character, so that only ASCII "
"characters are used in the generated PAIN file.")
+ pain_bank_address = fields.Boolean(
+ string='Bank Address in PAIN XML',
+ help="If enabled, the name and address of the bank will be set "
+ "in the appropriate XML tags (if the bank account is linked to a "
+ "bank and if the information is set on the related bank). "
+ "Some banks reject PAIN XML files that contain the name and "
+ "address of the bank, although the ISO 20022 "
+ "standard and the EPC guidelines specify this possibility.")
@api.multi
def get_xsd_file_path(self):
diff --git a/account_banking_pain_base/models/account_payment_order.py b/account_banking_pain_base/models/account_payment_order.py
index 40ff3f5a1..c53330f24 100644
--- a/account_banking_pain_base/models/account_payment_order.py
+++ b/account_banking_pain_base/models/account_payment_order.py
@@ -316,14 +316,42 @@ class AccountPaymentOrder(models.Model):
return True
@api.model
- def generate_fininst_postal_address(self, parent_node, bank):
+ def generate_fininst_postal_address(self, parent_node, bank, gen_args):
+ if not gen_args.get('pain_bank_address') or not bank:
+ return
+ # name is a required field on res.bank
+ name = etree.SubElement(parent_node, 'Nm')
+ name.text = self._prepare_field(
+ 'Bank Name', 'bank.name',
+ {'bank': bank}, 140, gen_args=gen_args)
if not (bank.country or bank.city):
return
postal_address = etree.SubElement(parent_node, 'PstlAdr')
+ if bank.zip:
+ bankzip = etree.SubElement(postal_address, 'PstCd')
+ bankzip.text = self._prepare_field(
+ 'Bank Zip', 'bank.zip',
+ {'bank': bank}, 16, gen_args=gen_args)
if bank.city:
- etree.SubElement(postal_address, 'TwnNm').text = bank.city
+ city = etree.SubElement(postal_address, 'TwnNm')
+ city.text = self._prepare_field(
+ 'Bank City', 'bank.city',
+ {'bank': bank}, 35, gen_args=gen_args)
if bank.country:
- etree.SubElement(postal_address, 'Ctry').text = bank.country.code
+ country_code = etree.SubElement(postal_address, 'Ctry')
+ country_code.text = self._prepare_field(
+ 'Bank Country Code', 'bank.country.code',
+ {'bank': bank}, 2, gen_args=gen_args)
+ if bank.street:
+ adrline1 = etree.SubElement(postal_address, 'AdrLine')
+ adrline1.text = self._prepare_field(
+ 'Bank Address Line1', 'bank.street',
+ {'bank': bank}, 70, gen_args=gen_args)
+ if bank.street2:
+ adrline2 = etree.SubElement(postal_address, 'AdrLine')
+ adrline2.text = self._prepare_field(
+ 'Bank Address Line2', 'bank.street2',
+ {'bank': bank}, 70, gen_args=gen_args)
@api.model
def generate_party_agent(
@@ -346,7 +374,7 @@ class AccountPaymentOrder(models.Model):
party_agent_institution, gen_args.get('bic_xml_tag'))
party_agent_bic.text = partner_bank.bank_bic
self.generate_fininst_postal_address(
- party_agent_institution, partner_bank.bank_id)
+ party_agent_institution, partner_bank.bank_id, gen_args)
else:
if order == 'B' or (
order == 'C' and gen_args['payment_method'] == 'DD'):
@@ -355,7 +383,7 @@ class AccountPaymentOrder(models.Model):
party_agent_institution = etree.SubElement(
party_agent, 'FinInstnId')
self.generate_fininst_postal_address(
- party_agent_institution, partner_bank.bank_id)
+ party_agent_institution, partner_bank.bank_id, gen_args)
party_agent_other = etree.SubElement(
party_agent_institution, 'Othr')
party_agent_other_identification = etree.SubElement(
@@ -445,7 +473,12 @@ class AccountPaymentOrder(models.Model):
if partner.street:
adrline1 = etree.SubElement(postal_address, 'AdrLine')
adrline1.text = self._prepare_field(
- 'Adress Line1', 'partner.street',
+ 'Address Line1', 'partner.street',
+ {'partner': partner}, 70, gen_args=gen_args)
+ if partner.street2:
+ adrline2 = etree.SubElement(postal_address, 'AdrLine')
+ adrline2.text = self._prepare_field(
+ 'Address Line2', 'partner.street2',
{'partner': partner}, 70, gen_args=gen_args)
self.generate_party_id(party, party_type, partner)
diff --git a/account_banking_pain_base/views/account_payment_method.xml b/account_banking_pain_base/views/account_payment_method.xml
index 00685f7d6..be0bd2864 100644
--- a/account_banking_pain_base/views/account_payment_method.xml
+++ b/account_banking_pain_base/views/account_payment_method.xml
@@ -11,6 +11,8 @@
+
diff --git a/account_banking_sepa_credit_transfer/models/account_payment_order.py b/account_banking_sepa_credit_transfer/models/account_payment_order.py
index 229f63b44..4140364b8 100644
--- a/account_banking_sepa_credit_transfer/models/account_payment_order.py
+++ b/account_banking_sepa_credit_transfer/models/account_payment_order.py
@@ -28,10 +28,11 @@ class AccountPaymentOrder(models.Model):
def generate_payment_file(self):
"""Creates the SEPA Credit Transfer file. That's the important code!"""
self.ensure_one()
- if self.payment_method_id.code != 'sepa_credit_transfer':
+ pay_method = self.payment_method_id
+ if pay_method.code != 'sepa_credit_transfer':
return super(AccountPaymentOrder, self).generate_payment_file()
- pain_flavor = self.payment_method_id.pain_version
+ pain_flavor = pay_method.pain_version
if not pain_flavor:
pain_flavor = 'pain.001.001.03'
# We use pain_flavor.startswith('pain.001.001.xx')
@@ -71,11 +72,12 @@ class AccountPaymentOrder(models.Model):
else:
raise UserError(
_("PAIN version '%s' is not supported.") % pain_flavor)
- xsd_file = self.payment_method_id.get_xsd_file_path()
+ xsd_file = pay_method.get_xsd_file_path()
gen_args = {
'bic_xml_tag': bic_xml_tag,
'name_maxsize': name_maxsize,
- 'convert_to_ascii': self.payment_method_id.convert_to_ascii,
+ 'convert_to_ascii': pay_method.convert_to_ascii,
+ 'pain_bank_address': pay_method.pain_bank_address,
'payment_method': 'TRF',
'file_prefix': 'sct_',
'pain_flavor': pain_flavor,
diff --git a/account_banking_sepa_direct_debit/models/account_payment_order.py b/account_banking_sepa_direct_debit/models/account_payment_order.py
index 747362529..e4e650ce5 100644
--- a/account_banking_sepa_direct_debit/models/account_payment_order.py
+++ b/account_banking_sepa_direct_debit/models/account_payment_order.py
@@ -14,9 +14,10 @@ class AccountPaymentOrder(models.Model):
def generate_payment_file(self):
"""Creates the SEPA Direct Debit file. That's the important code !"""
self.ensure_one()
- if self.payment_method_id.code != 'sepa_direct_debit':
+ pay_method = self.payment_method_id
+ if pay_method.code != 'sepa_direct_debit':
return super(AccountPaymentOrder, self).generate_payment_file()
- pain_flavor = self.payment_method_id.pain_version
+ pain_flavor = pay_method.pain_version
# We use pain_flavor.startswith('pain.008.001.xx')
# to support country-specific extensions such as
# pain.008.001.02.ch.01 (cf l10n_ch_sepa)
@@ -42,12 +43,12 @@ class AccountPaymentOrder(models.Model):
"Payment Type Code supported for SEPA Direct Debit are "
"'pain.008.001.02', 'pain.008.001.03' and "
"'pain.008.001.04'.") % pain_flavor)
- pay_method = self.payment_mode_id.payment_method_id
xsd_file = pay_method.get_xsd_file_path()
gen_args = {
'bic_xml_tag': bic_xml_tag,
'name_maxsize': name_maxsize,
'convert_to_ascii': pay_method.convert_to_ascii,
+ 'pain_bank_address': pay_method.pain_bank_address,
'payment_method': 'DD',
'file_prefix': 'sdd_',
'pain_flavor': pain_flavor,