From 7370d174f0de64da886e0bf8a2a585946d62780c Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Fri, 3 Jun 2016 22:58:07 +0200 Subject: [PATCH] Adds flexibility to support direct debit direct debit for switzerland (pain.008.001.02.ch.01) Implement SEPA Core recommandations for postal address --- .../models/account_payment_order.py | 33 ++++++------------- .../models/account_payment_method.py | 4 +-- .../models/account_payment_method.py | 4 +-- .../models/account_payment_order.py | 17 +++++++--- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/account_banking_pain_base/models/account_payment_order.py b/account_banking_pain_base/models/account_payment_order.py index d3611ba54..ae419320a 100644 --- a/account_banking_pain_base/models/account_payment_order.py +++ b/account_banking_pain_base/models/account_payment_order.py @@ -282,15 +282,18 @@ class AccountPaymentOrder(models.Model): initiating_party_issuer = ( self.payment_mode_id.initiating_party_issuer or self.payment_mode_id.company_id.initiating_party_issuer) - if initiating_party_identifier and initiating_party_issuer: + # in pain.008.001.02.ch.01.xsd files they use + # initiating_party_identifier but not initiating_party_issuer + if initiating_party_identifier: iniparty_id = etree.SubElement(initiating_party_1_8, 'Id') iniparty_org_id = etree.SubElement(iniparty_id, 'OrgId') iniparty_org_other = etree.SubElement(iniparty_org_id, 'Othr') iniparty_org_other_id = etree.SubElement(iniparty_org_other, 'Id') iniparty_org_other_id.text = initiating_party_identifier - iniparty_org_other_issuer = etree.SubElement( - iniparty_org_other, 'Issr') - iniparty_org_other_issuer.text = initiating_party_issuer + if initiating_party_issuer: + iniparty_org_other_issuer = etree.SubElement( + iniparty_org_other, 'Issr') + iniparty_org_other_issuer.text = initiating_party_issuer elif self._must_have_initiating_party(gen_args): raise UserError( _("Missing 'Initiating Party Issuer' and/or " @@ -359,22 +362,6 @@ class AccountPaymentOrder(models.Model): partner = partner_bank.partner_id if partner.country_id: postal_address = etree.SubElement(party, 'PstlAdr') - if partner.zip: - post_code = etree.SubElement(postal_address, 'PstCd') - post_code.text = self._prepare_field( - 'Postal Code', 'partner.zip', - {'partner': partner}, 16, gen_args=gen_args) - if partner.city: - town = etree.SubElement(postal_address, 'TwnNm') - town.text = self._prepare_field( - 'Town Name', 'partner.city', - {'partner': partner}, 35, gen_args=gen_args) - if partner.state_id: - country_subdiv = etree.SubElement( - postal_address, 'CtrySubDvsn') - country_subdiv.text = self._prepare_field( - 'Country SubDivision', 'partner.state_id.name', - {'partner': partner}, 35, gen_args=gen_args) country = etree.SubElement(postal_address, 'Ctry') country.text = self._prepare_field( 'Country', 'partner.country_id.code', @@ -382,12 +369,12 @@ class AccountPaymentOrder(models.Model): if partner.street: adrline1 = etree.SubElement(postal_address, 'AdrLine') adrline1.text = self._prepare_field( - 'Street', 'partner.street', + 'Adress Line1', 'partner.street', {'partner': partner}, 70, gen_args=gen_args) - if partner.street2: + if partner.city and partner.zip: adrline2 = etree.SubElement(postal_address, 'AdrLine') adrline2.text = self._prepare_field( - 'Street2', 'partner.street2', + 'Address Line2', "partner.zip + ' ' + partner.city", {'partner': partner}, 70, gen_args=gen_args) party_account = etree.SubElement( diff --git a/account_banking_sepa_credit_transfer/models/account_payment_method.py b/account_banking_sepa_credit_transfer/models/account_payment_method.py index d29411049..e4e0a63c5 100644 --- a/account_banking_sepa_credit_transfer/models/account_payment_method.py +++ b/account_banking_sepa_credit_transfer/models/account_payment_method.py @@ -10,10 +10,10 @@ class AccountPaymentMethod(models.Model): pain_version = fields.Selection(selection_add=[ ('pain.001.001.02', 'pain.001.001.02'), - ('pain.001.001.03', 'pain.001.001.03 (recommended)'), + ('pain.001.001.03', 'pain.001.001.03 (recommended for credit transfer)'), ('pain.001.001.04', 'pain.001.001.04'), ('pain.001.001.05', 'pain.001.001.05'), - ('pain.001.003.03', 'pain.001.003.03 (used in Germany)'), + ('pain.001.003.03', 'pain.001.003.03 (credit transfer in Germany)'), ]) @api.multi diff --git a/account_banking_sepa_direct_debit/models/account_payment_method.py b/account_banking_sepa_direct_debit/models/account_payment_method.py index 5a9327b19..c6781cc4f 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_method.py +++ b/account_banking_sepa_direct_debit/models/account_payment_method.py @@ -9,10 +9,10 @@ class AccountPaymentMethod(models.Model): _inherit = 'account.payment.method' pain_version = fields.Selection(selection_add=[ - ('pain.008.001.02', 'pain.008.001.02 (recommended)'), + ('pain.008.001.02', 'pain.008.001.02 (recommended for direct debit)'), ('pain.008.001.03', 'pain.008.001.03'), ('pain.008.001.04', 'pain.008.001.04'), - ('pain.008.003.02', 'pain.008.003.02 (used in Germany)'), + ('pain.008.003.02', 'pain.008.003.02 (direct debit in Germany)'), ]) @api.multi 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 64337db72..e90ffba8e 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_order.py +++ b/account_banking_sepa_direct_debit/models/account_payment_order.py @@ -40,19 +40,22 @@ class AccountPaymentOrder(models.Model): 'sepa_direct_debit'): return super(AccountPaymentOrder, self).generate_payment_file() pain_flavor = self.payment_mode_id.payment_method_id.pain_version - if pain_flavor == 'pain.008.001.02': + # 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) + if pain_flavor.startswith('pain.008.001.02'): bic_xml_tag = 'BIC' name_maxsize = 70 root_xml_tag = 'CstmrDrctDbtInitn' - elif pain_flavor == 'pain.008.003.02': + elif pain_flavor.startswith('pain.008.003.02'): bic_xml_tag = 'BIC' name_maxsize = 70 root_xml_tag = 'CstmrDrctDbtInitn' - elif pain_flavor == 'pain.008.001.03': + elif pain_flavor.startswith('pain.008.001.03'): bic_xml_tag = 'BICFI' name_maxsize = 140 root_xml_tag = 'CstmrDrctDbtInitn' - elif pain_flavor == 'pain.008.001.04': + elif pain_flavor.startswith('pain.008.001.04'): bic_xml_tag = 'BICFI' name_maxsize = 140 root_xml_tag = 'CstmrDrctDbtInitn' @@ -173,6 +176,12 @@ class AccountPaymentOrder(models.Model): payment_info_2_0, 'DrctDbtTxInf') payment_identification_2_29 = etree.SubElement( dd_transaction_info_2_28, 'PmtId') + if pain_flavor == 'pain.008.001.02.ch.01': + instruction_identification = etree.SubElement( + payment_identification_2_29, 'InstrId') + instruction_identification.text = self._prepare_field( + 'Intruction Identification', 'line.name', + {'line': line}, 35, gen_args=gen_args) end2end_identification_2_31 = etree.SubElement( payment_identification_2_29, 'EndToEndId') end2end_identification_2_31.text = self._prepare_field(