Add support for non-SEPA DD and CT without without IBANs

This commit is contained in:
Alexis de Lattre
2016-05-09 23:23:43 +02:00
parent edc793f2c4
commit b0c10a708d
3 changed files with 29 additions and 47 deletions

View File

@@ -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

View File

@@ -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:

View File

@@ -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)