From b0c10a708d630255d7f1444d9f732336499ff06b Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 9 May 2016 23:23:43 +0200 Subject: [PATCH] Add support for non-SEPA DD and CT without without IBANs --- .../models/banking_export_pain.py | 56 +++++++++---------- .../models/account_payment_order.py | 10 +--- .../models/account_payment_order.py | 10 +--- 3 files changed, 29 insertions(+), 47 deletions(-) diff --git a/account_banking_pain_base/models/banking_export_pain.py b/account_banking_pain_base/models/banking_export_pain.py index ab3a05383..db24b2f44 100644 --- a/account_banking_pain_base/models/banking_export_pain.py +++ b/account_banking_pain_base/models/banking_export_pain.py @@ -228,28 +228,22 @@ class AccountPaymentOrder(models.Model): @api.model def generate_party_agent( - self, parent_node, party_type, party_type_label, - order, party_name, iban, bic, eval_ctx, gen_args): + self, parent_node, party_type, order, partner_bank, gen_args): """Generate the piece of the XML file corresponding to BIC - This code is mutualized between TRF and DD""" + This code is mutualized between TRF and DD + Starting from Feb 1st 2016, we should be able to do + cross-border SEPA transfers without BIC, cf + http://www.europeanpaymentscouncil.eu/index.cfm/ + sepa-credit-transfer/iban-and-bic/""" assert order in ('B', 'C'), "Order can be 'B' or 'C'" - try: - bic = self._prepare_field( - '%s BIC' % party_type_label, bic, eval_ctx, gen_args=gen_args) + if partner_bank.bank_bic: party_agent = etree.SubElement(parent_node, '%sAgt' % party_type) party_agent_institution = etree.SubElement( party_agent, 'FinInstnId') party_agent_bic = etree.SubElement( party_agent_institution, gen_args.get('bic_xml_tag')) - party_agent_bic.text = bic - except UserError: - if order == 'C': - if iban[0:2] != gen_args['initiating_party_country_code']: - raise UserError( - _("The bank account with IBAN '%s' of partner '%s' " - "must have an associated BIC because it is a " - "cross-border SEPA operation.") - % (iban, party_name)) + party_agent_bic.text = partner_bank.bank_bic + else: if order == 'B' or ( order == 'C' and gen_args['payment_method'] == 'DD'): party_agent = etree.SubElement( @@ -268,8 +262,7 @@ class AccountPaymentOrder(models.Model): @api.model def generate_party_block( - self, parent_node, party_type, order, name, iban, bic, - eval_ctx, gen_args): + self, parent_node, party_type, order, partner_bank, gen_args): """Generate the piece of the XML file corresponding to Name+IBAN+BIC This code is mutualized between TRF and DD""" assert order in ('B', 'C'), "Order can be 'B' or 'C'" @@ -277,34 +270,35 @@ class AccountPaymentOrder(models.Model): party_type_label = 'Creditor' elif party_type == 'Dbtr': party_type_label = 'Debtor' + name = 'partner_bank.partner_id.name' + eval_ctx = {'partner_bank': partner_bank} party_name = self._prepare_field( '%s Name' % party_type_label, name, eval_ctx, gen_args.get('name_maxsize'), gen_args=gen_args) - viban = self._prepare_field( - '%s IBAN' % party_type_label, iban, eval_ctx, gen_args=gen_args) - # TODO : add support for bank accounts other than IBAN - # viban = self._validate_iban(piban) # At C level, the order is : BIC, Name, IBAN # At B level, the order is : Name, IBAN, BIC - if order == 'B': - gen_args['initiating_party_country_code'] = viban[0:2] - elif order == 'C': + if order == 'C': self.generate_party_agent( - parent_node, party_type, party_type_label, - order, party_name, viban, bic, eval_ctx, gen_args) + parent_node, party_type, order, partner_bank, gen_args) party = etree.SubElement(parent_node, party_type) party_nm = etree.SubElement(party, 'Nm') party_nm.text = party_name party_account = etree.SubElement( parent_node, '%sAcct' % party_type) party_account_id = etree.SubElement(party_account, 'Id') - party_account_iban = etree.SubElement( - party_account_id, 'IBAN') - party_account_iban.text = viban + if partner_bank.acc_type == 'iban': + party_account_iban = etree.SubElement( + party_account_id, 'IBAN') + party_account_iban.text = partner_bank.sanitized_acc_number + else: + party_account_other = etree.SubElement( + party_account_id, 'Othr') + party_account_other_id = etree.SubElement( + party_account_other, 'Id') + party_account_other_id.text = partner_bank.sanitized_acc_number if order == 'B': self.generate_party_agent( - parent_node, party_type, party_type_label, - order, party_name, viban, bic, eval_ctx, gen_args) + parent_node, party_type, order, partner_bank, gen_args) return True @api.model 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 4babb602f..57b7b0602 100644 --- a/account_banking_sepa_credit_transfer/models/account_payment_order.py +++ b/account_banking_sepa_credit_transfer/models/account_payment_order.py @@ -113,11 +113,7 @@ class AccountPaymentOrder(models.Model): }, gen_args) self.generate_party_block( payment_info_2_0, 'Dbtr', 'B', - 'self.company_partner_bank_id.partner_id.name', - 'self.company_partner_bank_id.sanitized_acc_number', - 'self.company_partner_bank_id.bank_bic', - {'self': self}, - gen_args) + self.company_partner_bank_id, gen_args) charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') if self.sepa: charge_bearer = 'SLEV' @@ -156,9 +152,7 @@ class AccountPaymentOrder(models.Model): % (line.partner_id.name, line.name)) self.generate_party_block( credit_transfer_transaction_info_2_27, 'Cdtr', - 'C', 'line.partner_id.name', - 'line.partner_bank_id.sanitized_acc_number', - 'line.partner_bank_id.bank_bic', {'line': line}, gen_args) + 'C', line.partner_bank_id, gen_args) self.generate_remittance_info_block( credit_transfer_transaction_info_2_27, line, gen_args) if pain_flavor in pain_03_to_05: 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 fdea2b052..047ab1f12 100644 --- a/account_banking_sepa_direct_debit/models/account_payment_order.py +++ b/account_banking_sepa_direct_debit/models/account_payment_order.py @@ -151,10 +151,7 @@ class AccountPaymentOrder(models.Model): self.generate_party_block( payment_info_2_0, 'Cdtr', 'B', - 'self.company_partner_bank_id.partner_id.name', - 'self.company_partner_bank_id.sanitized_acc_number', - 'self.company_partner_bank_id.bank_bic', - {'self': self}, gen_args) + self.company_partner_bank_id, gen_args) charge_bearer_2_24 = etree.SubElement(payment_info_2_0, 'ChrgBr') if self.sepa: charge_bearer = 'SLEV' @@ -250,10 +247,7 @@ class AccountPaymentOrder(models.Model): self.generate_party_block( dd_transaction_info_2_28, 'Dbtr', 'C', - 'line.partner_id.name', - 'line.partner_bank_id.sanitized_acc_number', - 'line.partner_bank_id.bank_bic', - {'line': line}, gen_args) + line.partner_bank_id, gen_args) self.generate_remittance_info_block( dd_transaction_info_2_28, line, gen_args)