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,