Add C57 file support

This commit is contained in:
Eduard Carreras 2015-10-19 09:32:33 +02:00
parent 4a169fe696
commit c29c7fd816
3 changed files with 149 additions and 0 deletions

136
retrofix/c57.py Normal file
View file

@ -0,0 +1,136 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from retrofix.record import Record
from retrofix.fields import *
FILE_HEADER = (
(1, 2, 'record_code', Const('01')),
(3, 2, 'operation_code', Const('70')),
(5, 6, 'free_C', Char),
(11, 8, 'sender_number', Number),
(19, 3, 'free_D2', Char),
(22, 1, 'free_D3', Char),
(23, 4, 'entity_number', Number),
(27, 10, 'free_E2', Char),
(37, 6, 'presentation_date', Date('%d%m%y')),
(43, 6, 'free_F2', Char),
(49, 6, 'free_G', Char),
(55, 20, 'free_H', Char),
(75, 1, 'free_I', Char),
(76, 14, 'free_J', Char),
(90, 11, 'free_K', Char)
)
SENDER_HEADER = (
(1, 2, 'record_code', Const('02')),
(3, 2, 'operation_code', Const('70')),
(5, 6, 'free_C', Char),
(11, 8, 'sender_number', Char),
(19, 3, 'sufix', Char),
(22, 1, 'free_D3', Char),
(23, 4, 'entity_number', Char),
(27, 10, 'free_E2', Char),
(37, 6, 'presentation_date', Date('%d%m%y')),
(43, 6, 'free_F2', Char),
(49, 6, 'free_G', Char),
(55, 20, 'free_H', Char),
(75, 1, 'free_I', Char),
(76, 14, 'free_J', Char),
(90, 11, 'free_K', Char)
)
INDIVIDUAL_RECORD = (
(1, 2, 'record_code', Const('60')),
(3, 2, 'operation_code', Const('70')),
(5, 6, 'free_C', Char),
(11, 8, 'sender_number', Char),
(19, 3, 'sufix', Char),
(22, 1, 'payment_channel', Selection([
('1', '1'),
('2', '2'),
('3', '3'),
('4', '4')
])),
(23, 4, 'entity_number', Char),
(27, 4, 'office_number', Char),
(31, 6, 'date', Date('%d%m%y')),
(37, 12, 'amount', Numeric),
(49, 6, 'payment_identification', Date('%d%m%y')),
(55, 4, 'bank_code', Char),
(59, 4, 'bank_office', Char),
(63, 2, 'bank_account_dc', Char),
(65, 10, 'bank_account', Char),
(75, 1, 'debit', Selection([
(' ', 'No recurrent'),
('D', 'Recurrent')
])),
(76, 1, 'cancel_code', Boolean(BOOLEAN_W1)),
(77, 13, 'reference', Char),
(90, 11, 'free_K', Char)
)
SENDER_FOOTER = (
(1, 2, 'record_code', Const('80')),
(3, 2, 'operation_code', Const('70')),
(5, 6, 'free_C', Char),
(11, 8, 'sender_number', Char),
(19, 3, 'sufix', Char),
(22, 1, 'free_D3', Char),
(23, 6, 'number_of_records', Numeric(decimals=0)),
(29, 8, 'free_E2', Char),
(37, 12, 'total_amount', Numeric),
(49, 6, 'free_G', Char),
(55, 20, 'free_H', Char),
(75, 1, 'free_I', Char),
(76, 1, 'negative', Boolean(BOOLEAN_W1)),
(77, 13, 'free_J2', Char),
(90, 11, 'free_K', Char)
)
FILE_FOOTER = (
(1, 2, 'record_code', Const('90')),
(3, 2, 'operation_code', Const('70')),
(5, 6, 'free_C', Char),
(11, 8, 'sender_number', Char),
(19, 3, 'free_D2', Char),
(22, 1, 'free_D3', Char),
(23, 6, 'number_of_records', Numeric(decimals=0)),
(29, 8, 'free_E2', Char),
(37, 12, 'total_amount', Numeric),
(49, 6, 'free_G', Char),
(55, 20, 'free_H', Char),
(75, 1, 'free_I', Char),
(76, 1, 'negative', Boolean(BOOLEAN_W1)),
(77, 13, 'free_J2', Char),
(90, 11, 'free_K', Char)
)
def read(data):
lines = data.splitlines()
records = []
current_line = lines.pop(0)
records.append(Record.extract(current_line, FILE_HEADER))
while len(lines) > 1:
current_line = lines.pop(0)
if Record.valid(current_line, SENDER_HEADER):
record = Record.extract(current_line, SENDER_HEADER)
elif Record.valid(current_line, INDIVIDUAL_RECORD):
record = Record.extract(current_line, INDIVIDUAL_RECORD)
elif Record.valid(current_line, SENDER_FOOTER):
record = Record.extract(current_line, SENDER_FOOTER)
else:
raise BaseException('Invalid record: "%s"' % current_line)
records.append(record)
current_line = lines.pop(0)
records.append(Record.extract(current_line, FILE_FOOTER))
return records

View file

13
retrofix/tests/c57.txt Normal file
View file

@ -0,0 +1,13 @@
017057013 22350466 0182 260615
0270 22350466501 0182 260615
6070 22350466501201820756260615000000002339290615 0000102109676
6070 22350466501201820083260615000000089583170815 0000100955833
6070 22350466501201820756260615000000002710290615 0000102035062
6070 22350466501201820756260615000000004200290615 0000100212812
6070 22350466501201820756260615000000005612290615 0000001083904
6070 22350466501201820756260615000000003759290615 0000001429254
6070 22350466501201820756260615000000005735010715 0000100667103
6070 22350466501201827032260615000000011552290615 0000100053080
6070 22350466501201820756260615000000003861010715 0000001204621
8070 22350466501 000011 000000129351
9070 22350466 000013 000000129351