mirror of
https://github.com/OCA/bank-payment.git
synced 2025-02-02 10:37:31 +02:00
Mutualize more code between SCT and SDD.
This commit is contained in:
@@ -28,6 +28,7 @@ from unidecode import unidecode
|
||||
from lxml import etree
|
||||
from openerp import tools
|
||||
import logging
|
||||
import base64
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -47,8 +48,10 @@ class banking_export_pain(orm.AbstractModel):
|
||||
|
||||
def _prepare_field(
|
||||
self, cr, uid, field_name, field_value, eval_ctx, max_size=0,
|
||||
convert_to_ascii=False, context=None):
|
||||
gen_args=None, context=None):
|
||||
'''This function is designed to be inherited !'''
|
||||
if gen_args is None:
|
||||
gen_args = {}
|
||||
assert isinstance(eval_ctx, dict), 'eval_ctx must contain a dict'
|
||||
try:
|
||||
value = safe_eval(field_value, eval_ctx)
|
||||
@@ -57,7 +60,7 @@ class banking_export_pain(orm.AbstractModel):
|
||||
# and many banks don't want non-ASCCI characters !
|
||||
# cf section 1.4 "Character set" of the SEPA Credit Transfer
|
||||
# Scheme Customer-to-bank guidelines
|
||||
if convert_to_ascii:
|
||||
if gen_args.get('convert_to_ascii'):
|
||||
value = unidecode(value)
|
||||
except:
|
||||
line = eval_ctx.get('line')
|
||||
@@ -85,6 +88,20 @@ class banking_export_pain(orm.AbstractModel):
|
||||
value = value[0:max_size]
|
||||
return value
|
||||
|
||||
def _prepare_export_sepa(
|
||||
self, cr, uid, sepa_export, total_amount, transactions_count,
|
||||
xml_string, gen_args, context=None):
|
||||
return {
|
||||
'batch_booking': sepa_export.batch_booking,
|
||||
'charge_bearer': sepa_export.charge_bearer,
|
||||
'total_amount': total_amount,
|
||||
'nb_transactions': transactions_count,
|
||||
'file': base64.encodestring(xml_string),
|
||||
'payment_order_ids': [
|
||||
(6, 0, [x.id for x in sepa_export.payment_order_ids])
|
||||
],
|
||||
}
|
||||
|
||||
def _validate_xml(self, cr, uid, xml_string, pain_xsd_file):
|
||||
xsd_etree_obj = etree.parse(
|
||||
tools.file_open(pain_xsd_file))
|
||||
@@ -113,7 +130,7 @@ class banking_export_pain(orm.AbstractModel):
|
||||
cr, uid, 'Message Identification',
|
||||
'sepa_export.payment_order_ids[0].reference',
|
||||
{'sepa_export': sepa_export}, 35,
|
||||
convert_to_ascii=gen_args.get('convert_to_ascii'), context=context)
|
||||
gen_args=gen_args, context=context)
|
||||
creation_date_time_1_2 = etree.SubElement(group_header_1_0, 'CreDtTm')
|
||||
creation_date_time_1_2.text = datetime.strftime(
|
||||
datetime.today(), '%Y-%m-%dT%H:%M:%S')
|
||||
@@ -134,6 +151,61 @@ class banking_export_pain(orm.AbstractModel):
|
||||
context=context)
|
||||
return group_header_1_0, nb_of_transactions_1_6, control_sum_1_7
|
||||
|
||||
def generate_start_payment_info_block(
|
||||
self, cr, uid, parent_node, sepa_export, payment_info_ident,
|
||||
priority, local_instrument, sequence_type, requested_date,
|
||||
eval_ctx, gen_args, context=None):
|
||||
payment_info_2_0 = etree.SubElement(parent_node, 'PmtInf')
|
||||
payment_info_identification_2_1 = etree.SubElement(
|
||||
payment_info_2_0, 'PmtInfId')
|
||||
payment_info_identification_2_1.text = self._prepare_field(
|
||||
cr, uid, 'Payment Information Identification',
|
||||
payment_info_ident, eval_ctx, 35,
|
||||
gen_args=gen_args, context=context)
|
||||
payment_method_2_2 = etree.SubElement(payment_info_2_0, 'PmtMtd')
|
||||
if gen_args.get('pain_flavor').startswith('pain.008.'):
|
||||
payment_method_2_2.text = 'DD'
|
||||
request_date_tag = 'ReqdColltnDt'
|
||||
else:
|
||||
payment_method_2_2.text = 'TRF'
|
||||
request_date_tag = 'ReqdExctnDt'
|
||||
if gen_args.get('pain_flavor') != 'pain.001.001.02':
|
||||
batch_booking_2_3 = etree.SubElement(payment_info_2_0, 'BtchBookg')
|
||||
batch_booking_2_3.text = str(sepa_export.batch_booking).lower()
|
||||
# The "SEPA Customer-to-bank
|
||||
# Implementation guidelines" for SCT and SDD says that control sum
|
||||
# and nb_of_transactions should be present
|
||||
# at both "group header" level and "payment info" level
|
||||
nb_of_transactions_2_4 = etree.SubElement(
|
||||
payment_info_2_0, 'NbOfTxs')
|
||||
control_sum_2_5 = etree.SubElement(payment_info_2_0, 'CtrlSum')
|
||||
payment_type_info_2_6 = etree.SubElement(
|
||||
payment_info_2_0, 'PmtTpInf')
|
||||
if priority:
|
||||
instruction_priority_2_7 = etree.SubElement(
|
||||
payment_type_info_2_6, 'InstrPrty')
|
||||
instruction_priority_2_7.text = priority
|
||||
service_level_2_8 = etree.SubElement(
|
||||
payment_type_info_2_6, 'SvcLvl')
|
||||
service_level_code_2_9 = etree.SubElement(service_level_2_8, 'Cd')
|
||||
service_level_code_2_9.text = 'SEPA'
|
||||
if local_instrument:
|
||||
local_instrument_2_11 = etree.SubElement(
|
||||
payment_type_info_2_6, 'LclInstrm')
|
||||
local_instr_code_2_12 = etree.SubElement(
|
||||
local_instrument_2_11, 'Cd')
|
||||
local_instr_code_2_12.text = local_instrument
|
||||
if sequence_type:
|
||||
sequence_type_2_14 = etree.SubElement(
|
||||
payment_type_info_2_6, 'SeqTp')
|
||||
sequence_type_2_14.text = sequence_type
|
||||
|
||||
requested_date_2_17 = etree.SubElement(
|
||||
payment_info_2_0, request_date_tag)
|
||||
requested_date_2_17.text = requested_date
|
||||
return payment_info_2_0, nb_of_transactions_2_4, control_sum_2_5
|
||||
|
||||
|
||||
def generate_initiating_party_block(
|
||||
self, cr, uid, parent_node, sepa_export, gen_args,
|
||||
context=None):
|
||||
@@ -141,7 +213,7 @@ class banking_export_pain(orm.AbstractModel):
|
||||
cr, uid, 'Company Name',
|
||||
'sepa_export.payment_order_ids[0].mode.bank_id.partner_id.name',
|
||||
{'sepa_export': sepa_export}, gen_args.get('name_maxsize'),
|
||||
convert_to_ascii=gen_args.get('convert_to_ascii'), context=context)
|
||||
gen_args=gen_args, context=context)
|
||||
initiating_party_1_8 = etree.SubElement(parent_node, 'InitgPty')
|
||||
initiating_party_name = etree.SubElement(initiating_party_1_8, 'Nm')
|
||||
initiating_party_name.text = my_company_name
|
||||
@@ -174,7 +246,7 @@ class banking_export_pain(orm.AbstractModel):
|
||||
party_agent_institution, gen_args.get('bic_xml_tag'))
|
||||
party_agent_bic.text = self._prepare_field(
|
||||
cr, uid, '%s BIC' % party_type_label, bic, eval_ctx,
|
||||
convert_to_ascii=gen_args.get('convert_to_ascii'), context=context)
|
||||
gen_args=gen_args, context=context)
|
||||
return True
|
||||
|
||||
def generate_party_block(
|
||||
@@ -198,7 +270,7 @@ class banking_export_pain(orm.AbstractModel):
|
||||
party_name.text = self._prepare_field(
|
||||
cr, uid, '%s Name' % party_type_label, name, eval_ctx,
|
||||
gen_args.get('name_maxsize'),
|
||||
convert_to_ascii=gen_args.get('convert_to_ascii'), context=context)
|
||||
gen_args=gen_args, context=context)
|
||||
party_account = etree.SubElement(
|
||||
parent_node, '%sAcct' % party_type)
|
||||
party_account_id = etree.SubElement(party_account, 'Id')
|
||||
@@ -206,7 +278,7 @@ class banking_export_pain(orm.AbstractModel):
|
||||
party_account_id, 'IBAN')
|
||||
piban = self._prepare_field(
|
||||
cr, uid, '%s IBAN' % party_type_label, iban, eval_ctx,
|
||||
convert_to_ascii=gen_args.get('convert_to_ascii'),
|
||||
gen_args=gen_args,
|
||||
context=context)
|
||||
viban = self._validate_iban(cr, uid, piban, context=context)
|
||||
party_account_iban.text = viban
|
||||
@@ -228,7 +300,7 @@ class banking_export_pain(orm.AbstractModel):
|
||||
self._prepare_field(
|
||||
cr, uid, 'Remittance Unstructured Information',
|
||||
'line.communication', {'line': line}, 140,
|
||||
convert_to_ascii=gen_args.get('convert_to_ascii'),
|
||||
gen_args=gen_args,
|
||||
context=context)
|
||||
else:
|
||||
if not line.struct_communication_type:
|
||||
@@ -268,7 +340,7 @@ class banking_export_pain(orm.AbstractModel):
|
||||
self._prepare_field(
|
||||
cr, uid, 'Creditor Structured Reference',
|
||||
'line.communication', {'line': line}, 35,
|
||||
convert_to_ascii=gen_args.get('convert_to_ascii'),
|
||||
gen_args=gen_args,
|
||||
context=context)
|
||||
return True
|
||||
|
||||
@@ -282,7 +354,7 @@ class banking_export_pain(orm.AbstractModel):
|
||||
csi_other_id = etree.SubElement(csi_other, 'Id')
|
||||
csi_other_id.text = self._prepare_field(
|
||||
cr, uid, identification_label, identification, eval_ctx,
|
||||
convert_to_ascii=gen_args.get('convert_to_ascii'), context=context)
|
||||
gen_args=gen_args, context=context)
|
||||
csi_scheme_name = etree.SubElement(csi_other, 'SchmeNm')
|
||||
csi_scheme_name_proprietary = etree.SubElement(
|
||||
csi_scheme_name, 'Prtry')
|
||||
|
||||
@@ -22,9 +22,7 @@
|
||||
|
||||
|
||||
from openerp.osv import orm, fields
|
||||
import base64
|
||||
from openerp.tools.translate import _
|
||||
from openerp.tools.safe_eval import safe_eval
|
||||
from openerp import tools, netsvc
|
||||
from lxml import etree
|
||||
import logging
|
||||
@@ -83,20 +81,6 @@ class banking_export_sepa_wizard(orm.TransientModel):
|
||||
return super(banking_export_sepa_wizard, self).create(
|
||||
cr, uid, vals, context=context)
|
||||
|
||||
def _prepare_export_sepa(
|
||||
self, cr, uid, sepa_export, total_amount, transactions_count,
|
||||
xml_string, context=None):
|
||||
return {
|
||||
'batch_booking': sepa_export.batch_booking,
|
||||
'charge_bearer': sepa_export.charge_bearer,
|
||||
'total_amount': total_amount,
|
||||
'nb_transactions': transactions_count,
|
||||
'file': base64.encodestring(xml_string),
|
||||
'payment_order_ids': [
|
||||
(6, 0, [x.id for x in sepa_export.payment_order_ids])
|
||||
],
|
||||
}
|
||||
|
||||
def create_sepa(self, cr, uid, ids, context=None):
|
||||
'''
|
||||
Creates the SEPA Credit Transfer file. That's the important code !
|
||||
@@ -164,7 +148,7 @@ class banking_export_sepa_wizard(orm.TransientModel):
|
||||
total_amount = 0.0
|
||||
amount_control_sum_1_7 = 0.0
|
||||
lines_per_group = {}
|
||||
# key = (requested_exec_date, priority)
|
||||
# key = (requested_date, priority)
|
||||
# values = list of lines as object
|
||||
today = fields.date.context_today(self, cr, uid, context=context)
|
||||
for payment_order in sepa_export.payment_order_ids:
|
||||
@@ -172,65 +156,33 @@ class banking_export_sepa_wizard(orm.TransientModel):
|
||||
for line in payment_order.line_ids:
|
||||
priority = line.priority
|
||||
if payment_order.date_prefered == 'due':
|
||||
requested_exec_date = line.ml_maturity_date or today
|
||||
requested_date = line.ml_maturity_date or today
|
||||
elif payment_order.date_prefered == 'fixed':
|
||||
requested_exec_date = payment_order.date_scheduled or today
|
||||
requested_date = payment_order.date_scheduled or today
|
||||
else:
|
||||
requested_exec_date = today
|
||||
key = (requested_exec_date, priority)
|
||||
requested_date = today
|
||||
key = (requested_date, priority)
|
||||
if key in lines_per_group:
|
||||
lines_per_group[key].append(line)
|
||||
else:
|
||||
lines_per_group[key] = [line]
|
||||
# Write requested_exec_date on 'Payment date' of the pay line
|
||||
if requested_exec_date != line.date:
|
||||
# Write requested_date on 'Payment date' of the pay line
|
||||
if requested_date != line.date:
|
||||
self.pool['payment.line'].write(
|
||||
cr, uid, line.id,
|
||||
{'date': requested_exec_date}, context=context)
|
||||
{'date': requested_date}, context=context)
|
||||
|
||||
for (requested_exec_date, priority), lines in lines_per_group.items():
|
||||
for (requested_date, priority), lines in lines_per_group.items():
|
||||
# B. Payment info
|
||||
payment_info_2_0 = etree.SubElement(pain_root, 'PmtInf')
|
||||
payment_info_identification_2_1 = etree.SubElement(
|
||||
payment_info_2_0, 'PmtInfId')
|
||||
payment_info_identification_2_1.text = self._prepare_field(
|
||||
cr, uid, 'Payment Information Identification',
|
||||
"sepa_export.payment_order_ids[0].reference + '-' + requested_exec_date.replace('-', '') + '-' + priority", {
|
||||
payment_info_2_0, nb_of_transactions_2_4, control_sum_2_5 = \
|
||||
self.generate_start_payment_info_block(
|
||||
cr, uid, pain_root, sepa_export,
|
||||
"sepa_export.payment_order_ids[0].reference + '-' + requested_date.replace('-', '') + '-' + priority",
|
||||
priority, False, False, requested_date, {
|
||||
'sepa_export': sepa_export,
|
||||
'priority': priority,
|
||||
'requested_exec_date': requested_exec_date
|
||||
}, 35, convert_to_ascii=convert_to_ascii, context=context)
|
||||
payment_method_2_2 = etree.SubElement(payment_info_2_0, 'PmtMtd')
|
||||
payment_method_2_2.text = 'TRF'
|
||||
if pain_flavor in pain_03_to_05:
|
||||
# batch_booking is in "Group header" with pain.001.001.02
|
||||
# and in "Payment info" in pain.001.001.03/04
|
||||
batch_booking_2_3 = etree.SubElement(
|
||||
payment_info_2_0, 'BtchBookg')
|
||||
batch_booking_2_3.text = str(sepa_export.batch_booking).lower()
|
||||
# It may seem surprising, but the
|
||||
# "SEPA Credit Transfer Scheme Customer-to-bank Implementation
|
||||
# guidelines" v6.0 says that control sum and nb_of_transactions
|
||||
# should be present at both "group header" level and "payment info"
|
||||
# level. This seems to be confirmed by the tests carried out at
|
||||
# BNP Paribas in PAIN v001.001.03
|
||||
if pain_flavor in pain_03_to_05:
|
||||
nb_of_transactions_2_4 = etree.SubElement(
|
||||
payment_info_2_0, 'NbOfTxs')
|
||||
control_sum_2_5 = etree.SubElement(payment_info_2_0, 'CtrlSum')
|
||||
payment_type_info_2_6 = etree.SubElement(
|
||||
payment_info_2_0, 'PmtTpInf')
|
||||
if priority:
|
||||
instruction_priority_2_7 = etree.SubElement(
|
||||
payment_type_info_2_6, 'InstrPrty')
|
||||
instruction_priority_2_7.text = priority
|
||||
service_level_2_8 = etree.SubElement(
|
||||
payment_type_info_2_6, 'SvcLvl')
|
||||
service_level_code_2_9 = etree.SubElement(service_level_2_8, 'Cd')
|
||||
service_level_code_2_9.text = 'SEPA'
|
||||
requested_exec_date_2_17 = etree.SubElement(
|
||||
payment_info_2_0, 'ReqdExctnDt')
|
||||
requested_exec_date_2_17.text = requested_exec_date
|
||||
'requested_date': requested_date,
|
||||
}, gen_args, context=context)
|
||||
|
||||
self.generate_party_block(
|
||||
cr, uid, payment_info_2_0, 'Dbtr', 'B',
|
||||
@@ -256,11 +208,11 @@ class banking_export_sepa_wizard(orm.TransientModel):
|
||||
payment_identification_2_28, 'EndToEndId')
|
||||
end2end_identification_2_30.text = self._prepare_field(
|
||||
cr, uid, 'End to End Identification', 'line.name',
|
||||
{'line': line}, 35, convert_to_ascii=convert_to_ascii,
|
||||
{'line': line}, 35, gen_args=gen_args,
|
||||
context=context)
|
||||
currency_name = self._prepare_field(
|
||||
cr, uid, 'Currency Code', 'line.currency.name',
|
||||
{'line': line}, 3, convert_to_ascii=convert_to_ascii,
|
||||
{'line': line}, 3, gen_args=gen_args,
|
||||
context=context)
|
||||
amount_2_42 = etree.SubElement(
|
||||
credit_transfer_transaction_info_2_27, 'Amt')
|
||||
@@ -311,7 +263,7 @@ class banking_export_sepa_wizard(orm.TransientModel):
|
||||
file_id = self.pool.get('banking.export.sepa').create(
|
||||
cr, uid, self._prepare_export_sepa(
|
||||
cr, uid, sepa_export, total_amount, transactions_count_1_6,
|
||||
xml_string, context=context),
|
||||
xml_string, gen_args, context=context),
|
||||
context=context)
|
||||
|
||||
self.write(
|
||||
@@ -333,7 +285,7 @@ class banking_export_sepa_wizard(orm.TransientModel):
|
||||
|
||||
def cancel_sepa(self, cr, uid, ids, context=None):
|
||||
'''
|
||||
Cancel the SEPA PAIN: just drop the file
|
||||
Cancel the SEPA file: just drop the file
|
||||
'''
|
||||
sepa_export = self.browse(cr, uid, ids[0], context=context)
|
||||
self.pool.get('banking.export.sepa').unlink(
|
||||
@@ -342,7 +294,7 @@ class banking_export_sepa_wizard(orm.TransientModel):
|
||||
|
||||
def save_sepa(self, cr, uid, ids, context=None):
|
||||
'''
|
||||
Save the SEPA PAIN: send the done signal to all payment
|
||||
Save the SEPA file: send the done signal to all payment
|
||||
orders in the file. With the default workflow, they will
|
||||
transition to 'done', while with the advanced workflow in
|
||||
account_banking_payment they will transition to 'sent' waiting
|
||||
|
||||
@@ -23,10 +23,8 @@
|
||||
|
||||
from openerp.osv import orm, fields
|
||||
from openerp.tools.translate import _
|
||||
from openerp.tools.safe_eval import safe_eval
|
||||
from openerp import tools, netsvc
|
||||
import base64
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime
|
||||
from lxml import etree
|
||||
import logging
|
||||
|
||||
@@ -83,21 +81,6 @@ class banking_export_sdd_wizard(orm.TransientModel):
|
||||
return super(banking_export_sdd_wizard, self).create(
|
||||
cr, uid, vals, context=context)
|
||||
|
||||
def _prepare_export_sepa(
|
||||
self, cr, uid, sepa_export, total_amount, transactions_count,
|
||||
xml_string, context=None):
|
||||
return {
|
||||
'batch_booking': sepa_export.batch_booking,
|
||||
'charge_bearer': sepa_export.charge_bearer,
|
||||
'total_amount': total_amount,
|
||||
'nb_transactions': transactions_count,
|
||||
'file': base64.encodestring(xml_string),
|
||||
'payment_order_ids': [
|
||||
(6, 0, [x.id for x in sepa_export.payment_order_ids])
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
def _get_previous_bank(self, cr, uid, payline, context=None):
|
||||
payline_obj = self.pool['payment.line']
|
||||
previous_bank = False
|
||||
@@ -163,11 +146,6 @@ class banking_export_sdd_wizard(orm.TransientModel):
|
||||
root = etree.Element('Document', nsmap=pain_ns)
|
||||
pain_root = etree.SubElement(root, root_xml_tag)
|
||||
|
||||
my_company_name = self._prepare_field(
|
||||
cr, uid, 'Company Name',
|
||||
'sepa_export.payment_order_ids[0].company_id.partner_id.name',
|
||||
{'sepa_export': sepa_export}, name_maxsize, context=context)
|
||||
|
||||
# A. Group header
|
||||
group_header_1_0, nb_of_transactions_1_6, control_sum_1_7 = \
|
||||
self.generate_group_header_block(
|
||||
@@ -177,7 +155,7 @@ class banking_export_sdd_wizard(orm.TransientModel):
|
||||
total_amount = 0.0
|
||||
amount_control_sum_1_7 = 0.0
|
||||
lines_per_group = {}
|
||||
# key = (requested_collec_date, priority, sequence type)
|
||||
# key = (requested_date, priority, sequence type)
|
||||
# value = list of lines as objects
|
||||
# Iterate on payment orders
|
||||
today = fields.date.context_today(self, cr, uid, context=context)
|
||||
@@ -188,11 +166,11 @@ class banking_export_sdd_wizard(orm.TransientModel):
|
||||
transactions_count_1_6 += 1
|
||||
priority = line.priority
|
||||
if payment_order.date_prefered == 'due':
|
||||
requested_collec_date = line.ml_maturity_date or today
|
||||
requested_date = line.ml_maturity_date or today
|
||||
elif payment_order.date_prefered == 'fixed':
|
||||
requested_collec_date = payment_order.date_scheduled or today
|
||||
requested_date = payment_order.date_scheduled or today
|
||||
else:
|
||||
requested_collec_date = today
|
||||
requested_date = today
|
||||
if not line.sdd_mandate_id:
|
||||
raise orm.except_orm(
|
||||
_('Error:'),
|
||||
@@ -225,69 +203,29 @@ class banking_export_sdd_wizard(orm.TransientModel):
|
||||
assert seq_type_label is not False
|
||||
seq_type = seq_type_map[seq_type_label]
|
||||
|
||||
key = (requested_collec_date, priority, seq_type)
|
||||
key = (requested_date, priority, seq_type)
|
||||
if key in lines_per_group:
|
||||
lines_per_group[key].append(line)
|
||||
else:
|
||||
lines_per_group[key] = [line]
|
||||
# Write requested_exec_date on 'Payment date' of the pay line
|
||||
if requested_collec_date != line.date:
|
||||
if requested_date != line.date:
|
||||
self.pool['payment.line'].write(
|
||||
cr, uid, line.id,
|
||||
{'date': requested_collec_date}, context=context)
|
||||
{'date': requested_date}, context=context)
|
||||
|
||||
for (requested_collec_date, priority, sequence_type), lines in lines_per_group.items():
|
||||
for (requested_date, priority, sequence_type), lines in lines_per_group.items():
|
||||
# B. Payment info
|
||||
payment_info_2_0 = etree.SubElement(pain_root, 'PmtInf')
|
||||
payment_info_identification_2_1 = etree.SubElement(
|
||||
payment_info_2_0, 'PmtInfId')
|
||||
payment_info_identification_2_1.text = self._prepare_field(
|
||||
cr, uid, 'Payment Information Identification',
|
||||
"sepa_export.payment_order_ids[0].reference + '-' + sequence_type + '-' + requested_collec_date.replace('-', '') + '-' + priority",
|
||||
{
|
||||
payment_info_2_0, nb_of_transactions_2_4, control_sum_2_5 = \
|
||||
self.generate_start_payment_info_block(
|
||||
cr, uid, pain_root, sepa_export,
|
||||
"sepa_export.payment_order_ids[0].reference + '-' + sequence_type + '-' + requested_date.replace('-', '') + '-' + priority",
|
||||
priority, 'CORE', sequence_type, requested_date, {
|
||||
'sepa_export': sepa_export,
|
||||
'sequence_type': sequence_type,
|
||||
'priority': priority,
|
||||
'requested_collec_date': requested_collec_date,
|
||||
}, 35, convert_to_ascii=convert_to_ascii, context=context)
|
||||
payment_method_2_2 = etree.SubElement(payment_info_2_0, 'PmtMtd')
|
||||
payment_method_2_2.text = 'DD'
|
||||
# batch_booking is in "Payment Info" with pain.008.001.02/03
|
||||
batch_booking_2_3 = etree.SubElement(payment_info_2_0, 'BtchBookg')
|
||||
batch_booking_2_3.text = str(sepa_export.batch_booking).lower()
|
||||
# The "SEPA Core Direct Debit Scheme Customer-to-bank
|
||||
# Implementation guidelines" v6.0 says that control sum
|
||||
# and nb_of_transactions should be present
|
||||
# at both "group header" level and "payment info" level
|
||||
nb_of_transactions_2_4 = etree.SubElement(
|
||||
payment_info_2_0, 'NbOfTxs')
|
||||
control_sum_2_5 = etree.SubElement(payment_info_2_0, 'CtrlSum')
|
||||
payment_type_info_2_6 = etree.SubElement(
|
||||
payment_info_2_0, 'PmtTpInf')
|
||||
if priority:
|
||||
instruction_priority_2_7 = etree.SubElement(
|
||||
payment_type_info_2_6, 'InstrPrty')
|
||||
instruction_priority_2_7.text = priority
|
||||
service_level_2_8 = etree.SubElement(
|
||||
payment_type_info_2_6, 'SvcLvl')
|
||||
service_level_code_2_9 = etree.SubElement(service_level_2_8, 'Cd')
|
||||
service_level_code_2_9.text = 'SEPA'
|
||||
local_instrument_2_11 = etree.SubElement(
|
||||
payment_type_info_2_6, 'LclInstrm')
|
||||
local_instr_code_2_12 = etree.SubElement(
|
||||
local_instrument_2_11, 'Cd')
|
||||
local_instr_code_2_12.text = 'CORE'
|
||||
# 2.14 Sequence Type MANDATORY
|
||||
# this message element must indicate ‘FRST
|
||||
# 'FRST' = First ; 'OOFF' = One Off ; 'RCUR' : Recurring
|
||||
# 'FNAL' = Final
|
||||
sequence_type_2_14 = etree.SubElement(
|
||||
payment_type_info_2_6, 'SeqTp')
|
||||
sequence_type_2_14.text = sequence_type
|
||||
|
||||
requested_collec_date_2_18 = etree.SubElement(
|
||||
payment_info_2_0, 'ReqdColltnDt')
|
||||
requested_collec_date_2_18.text = requested_collec_date
|
||||
'requested_date': requested_date,
|
||||
}, gen_args, context=context)
|
||||
|
||||
self.generate_party_block(
|
||||
cr, uid, payment_info_2_0, 'Cdtr', 'B',
|
||||
@@ -322,10 +260,10 @@ class banking_export_sdd_wizard(orm.TransientModel):
|
||||
end2end_identification_2_31.text = self._prepare_field(
|
||||
cr, uid, 'End to End Identification', 'line.name',
|
||||
{'line': line}, 35,
|
||||
convert_to_ascii=convert_to_ascii, context=context)
|
||||
gen_args=gen_args, context=context)
|
||||
currency_name = self._prepare_field(
|
||||
cr, uid, 'Currency Code', 'line.currency.name',
|
||||
{'line': line}, 3, convert_to_ascii=convert_to_ascii,
|
||||
{'line': line}, 3, gen_args=gen_args,
|
||||
context=context)
|
||||
instructed_amount_2_44 = etree.SubElement(
|
||||
dd_transaction_info_2_28, 'InstdAmt', Ccy=currency_name)
|
||||
@@ -342,14 +280,14 @@ class banking_export_sdd_wizard(orm.TransientModel):
|
||||
cr, uid, 'Unique Mandate Reference',
|
||||
'line.sdd_mandate_id.unique_mandate_reference',
|
||||
{'line': line}, 35,
|
||||
convert_to_ascii=convert_to_ascii, context=context)
|
||||
gen_args=gen_args, context=context)
|
||||
mandate_signature_date_2_49 = etree.SubElement(
|
||||
mandate_related_info_2_47, 'DtOfSgntr')
|
||||
mandate_signature_date_2_49.text = self._prepare_field(
|
||||
cr, uid, 'Mandate Signature Date',
|
||||
'line.sdd_mandate_id.signature_date',
|
||||
{'line': line}, 10,
|
||||
convert_to_ascii=convert_to_ascii, context=context)
|
||||
gen_args=gen_args, context=context)
|
||||
if sequence_type == 'FRST' and (
|
||||
line.sdd_mandate_id.last_debit_date or
|
||||
not line.sdd_mandate_id.sepa_migrated):
|
||||
@@ -374,7 +312,7 @@ class banking_export_sdd_wizard(orm.TransientModel):
|
||||
cr, uid, 'Original Debtor Account',
|
||||
'previous_bank.acc_number',
|
||||
{'previous_bank': previous_bank},
|
||||
convert_to_ascii=convert_to_ascii,
|
||||
gen_args=gen_args,
|
||||
context=context),
|
||||
context=context)
|
||||
else:
|
||||
@@ -388,7 +326,7 @@ class banking_export_sdd_wizard(orm.TransientModel):
|
||||
cr, uid, 'Original Debtor Agent',
|
||||
'previous_bank.bank.bic',
|
||||
{'previous_bank': previous_bank},
|
||||
convert_to_ascii=convert_to_ascii,
|
||||
gen_args=gen_args,
|
||||
context=context)
|
||||
ori_debtor_agent_other = etree.SubElement(
|
||||
ori_debtor_agent_institution, 'Othr')
|
||||
@@ -404,7 +342,7 @@ class banking_export_sdd_wizard(orm.TransientModel):
|
||||
cr, uid, 'Original Mandate Identification',
|
||||
'line.sdd_mandate_id.original_mandate_identification',
|
||||
{'line': line},
|
||||
convert_to_ascii=convert_to_ascii,
|
||||
gen_args=gen_args,
|
||||
context=context)
|
||||
ori_creditor_scheme_id_2_53 = etree.SubElement(
|
||||
amendment_info_details_2_51, 'OrgnlCdtrSchmeId')
|
||||
@@ -444,7 +382,7 @@ class banking_export_sdd_wizard(orm.TransientModel):
|
||||
file_id = self.pool.get('banking.export.sdd').create(
|
||||
cr, uid, self._prepare_export_sepa(
|
||||
cr, uid, sepa_export, total_amount, transactions_count_1_6,
|
||||
xml_string, context=context),
|
||||
xml_string, gen_args, context=context),
|
||||
context=context)
|
||||
|
||||
self.write(
|
||||
@@ -466,7 +404,7 @@ class banking_export_sdd_wizard(orm.TransientModel):
|
||||
|
||||
def cancel_sepa(self, cr, uid, ids, context=None):
|
||||
'''
|
||||
Cancel the SEPA Direct Debit file: just drop the file
|
||||
Cancel the SEPA file: just drop the file
|
||||
'''
|
||||
sepa_export = self.browse(cr, uid, ids[0], context=context)
|
||||
self.pool.get('banking.export.sdd').unlink(
|
||||
|
||||
Reference in New Issue
Block a user