Skip to content

Commit

Permalink
Relax detail parsing to ignore malformed segments. thanks to @dr-duplo
Browse files Browse the repository at this point in the history
  • Loading branch information
wolph committed May 31, 2019
2 parents fa37168 + 34288fe commit 62066fe
Show file tree
Hide file tree
Showing 4 changed files with 190 additions and 2 deletions.
2 changes: 1 addition & 1 deletion mt940/__about__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
statistics and manipulation.
'''.strip().split())
__email__ = 'wolph@wol.ph'
__version__ = '4.16.0'
__version__ = '4.17.0'
__license__ = 'BSD'
__copyright__ = 'Copyright 2015 Rick van Hattem (wolph)'
__url__ = 'https://github.com/WoLpH/mt940'
5 changes: 4 additions & 1 deletion mt940/processors.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,11 @@ def _parse_mt940_details(detail_str):
for index, char in enumerate(detail_str):
if char != '?':
segment += char

continue

if index + 2 >= len(detail_str):
break

tmp[segment_type] = segment if not segment_type else segment[2:]
segment_type = detail_str[index + 1] + detail_str[index + 2]
segment = ''
Expand Down
16 changes: 16 additions & 0 deletions tests/self-provided/malformed_details.sta
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
:20:STARTUMS
:25:12345678/1020304050
:28C:0
:60F:C170914EUR12345,12
:61:170914D233,15NMSC
:86:105?00Basislastschrift?10931?20EREF+123/123/12345-----L110
?211234567890123 ?22MREF+BYA12345678901
?23CRED+DE99ZZZ00000012345 ?24SVWZ+STEUERNR 123/123/12345
?25 KOERPST 3VJ.17 233,15?26EUR EREF: 123/123/12345----
?27-L1112345678912345 MREF: BY?28A12345678901 CRED: DE99ZZZ0
?290000012345 IBAN: DE00700500?30BYLADEMM
?31DE99700500000000012345?32Finanzamt Muenchen Abteilun
?33g Erhebung?34992?60000000012345 BIC: BYLADEMM
?61ABWA: Finanzamt Muenchen ?62ABWA+Finanzamt Sentinel?
:62F:C170914EUR12345,98
-
169 changes: 169 additions & 0 deletions tests/self-provided/malformed_details.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
&id003 !!python/object:mt940.models.Transactions
data:
account_identification: 12345678/1020304050
final_closing_balance: !!python/object:mt940.models.Balance
amount: !!python/object:mt940.models.Amount
amount: !!python/object/apply:decimal.Decimal ['12345.98']
currency: EUR
date: !!python/object/apply:mt940.models.Date
- !!binary |
B+EJDg==
status: C
final_opening_balance: !!python/object:mt940.models.Balance
amount: !!python/object:mt940.models.Amount
amount: !!python/object/apply:decimal.Decimal ['12345.12']
currency: EUR
date: !!python/object/apply:mt940.models.Date
- !!binary |
B+EJDg==
status: C
sequence_number: null
statement_number: '0'
transaction_reference: STARTUMS
processors:
post_account_identification: []
post_available_balance: []
post_closing_balance: []
post_date_time_indication: []
post_final_closing_balance: []
post_final_opening_balance: []
post_floor_limit_indicator: []
post_forward_available_balance: []
post_intermediate_closing_balance: []
post_intermediate_opening_balance: []
post_non_swift: []
post_opening_balance: []
post_related_reference: []
post_statement: [!!python/name:mt940.processors.date_cleanup_post_processor '']
post_statement_number: []
post_sum_credit_entries: []
post_sum_debit_entries: []
post_transaction_details: [!!python/name:mt940.processors.transaction_details_post_processor '']
post_transaction_reference_number: []
pre_account_identification: []
pre_available_balance: []
pre_closing_balance: []
pre_date_time_indication: []
pre_final_closing_balance: []
pre_final_opening_balance: []
pre_floor_limit_indicator: []
pre_forward_available_balance: []
pre_intermediate_closing_balance: []
pre_intermediate_opening_balance: []
pre_non_swift: []
pre_opening_balance: []
pre_related_reference: []
pre_statement: [!!python/name:mt940.processors.date_fixup_pre_processor '']
pre_statement_number: []
pre_sum_credit_entries: []
pre_sum_debit_entries: []
pre_transaction_details: []
pre_transaction_reference_number: []
tags:
13: !!python/object:mt940.tags.DateTimeIndication
re: !!python/object/apply:re._compile ["^\n (?P<year>\\d{2})\n (?P<month>\\\
d{2})\n (?P<day>\\d{2})\n (?P<hour>\\d{2})\n (?P<minute>\\d{2})\n\
\ (\\+(?P<offset>\\d{4})|)\n ", 98]
20: !!python/object:mt940.tags.TransactionReferenceNumber
re: !!python/object/apply:re._compile ['(?P<transaction_reference>.{0,16})', 98]
21: !!python/object:mt940.tags.RelatedReference
re: !!python/object/apply:re._compile ['(?P<related_reference>.{0,16})', 98]
25: !!python/object:mt940.tags.AccountIdentification
re: !!python/object/apply:re._compile ['(?P<account_identification>.{0,35})',
98]
28: !!python/object:mt940.tags.StatementNumber
re: !!python/object/apply:re._compile ["\n (?P<statement_number>\\d{1,5}) \
\ # 5n\n (?:/?(?P<sequence_number>\\d{1,5}))? # [/5n]\n $", 98]
60: !!python/object:mt940.tags.OpeningBalance
re: &id001 !!python/object/apply:re._compile ["^\n (?P<status>[DC]) # 1!a\
\ Debit/Credit\n (?P<year>\\d{2}) # 6!n Value Date (YYMMDD)\n (?P<month>\\\
d{2})\n (?P<day>\\d{2})\n (?P<currency>.{3}) # 3!a Currency\n (?P<amount>[0-9,]{0,16})\
\ # 15d Amount (includes decimal sign, so 16)\n ", 98]
60M: !!python/object:mt940.tags.IntermediateOpeningBalance
re: *id001
60F: !!python/object:mt940.tags.FinalOpeningBalance
re: *id001
61: !!python/object:mt940.tags.Statement
re: !!python/object/apply:re._compile ["^\n (?P<year>\\d{2}) # 6!n Value Date\
\ (YYMMDD)\n (?P<month>\\d{2})\n (?P<day>\\d{2})\n (?P<entry_month>\\\
d{2})? # [4!n] Entry Date (MMDD)\n (?P<entry_day>\\d{2})?\n (?P<status>[A-Z]?[DC])\
\ # 2a Debit/Credit Mark\n (?P<funds_code>[A-Z])? # [1!a] Funds Code (3rd\
\ character of the currency\n # code, if needed)\n\
\ \\n? # apparently some banks (sparkassen) incorporate newlines here\n\
\ (?P<amount>[\\d,]{1,15}) # 15d Amount\n (?P<id>[A-Z][A-Z0-9 ]{3})?\
\ # 1!a3!c Transaction Type Identification Code\n (?P<customer_reference>.{0,16})\
\ # 16x Customer Reference\n (//(?P<bank_reference>.{0,16}))? # [//16x]\
\ Bank Reference\n (\\n?(?P<extra_details>.{0,34}))? # [34x] Supplementary\
\ Details\n $", 98]
62: !!python/object:mt940.tags.ClosingBalance
re: *id001
62M: !!python/object:mt940.tags.IntermediateClosingBalance
re: *id001
62F: !!python/object:mt940.tags.FinalClosingBalance
re: *id001
64: !!python/object:mt940.tags.AvailableBalance
re: *id001
65: !!python/object:mt940.tags.ForwardAvailableBalance
re: *id001
86: !!python/object:mt940.tags.TransactionDetails
re: !!python/object/apply:re._compile ["\n (?P<transaction_details>(([\\s\\\
S]{0,65}\\r?\\n?){0,8}[\\s\\S]{0,65}))\n ", 98]
34: !!python/object:mt940.tags.FloorLimitIndicator
re: !!python/object/apply:re._compile ["^\n (?P<currency>[A-Z]{3}) # 3!a Currency\n\
\ (?P<status>[DC ]?) # 2a Debit/Credit Mark\n (?P<amount>[0-9,]{0,16})\
\ # 15d Amount (includes decimal sign, so 16)\n $", 98]
NS: !!python/object:mt940.tags.NonSwift
re: !!python/object/apply:re._compile ["\n (?P<non_swift>\n (\\d{2}.{0,})\n\
\ (\\n\\d{2}.{0,})*\n )\n $", 98]
90: !!python/object:mt940.tags.SumEntries
re: &id002 !!python/object/apply:re._compile ["^\n (?P<number>\\d*)\n (?P<currency>.{3})\
\ # 3!a Currency\n (?P<amount>[\\d,]{1,15}) # 15d Amount\n ", 98]
90D: !!python/object:mt940.tags.SumDebitEntries
re: *id002
90C: !!python/object:mt940.tags.SumCreditEntries
re: *id002
transactions:
- !!python/object:mt940.models.Transaction
data:
FRST_ONE_OFF_RECC: null
additional_position_date: null
additional_position_reference: BYA12345678901
additional_purpose: '000000012345 BIC: BYLADEMMABWA: Finanzamt Muenchen ABWA+Finanzamt
Sentinel'
amount: !!python/object:mt940.models.Amount
amount: !!python/object/apply:decimal.Decimal ['-233.15']
currency: EUR
applicant_bin: BYLADEMM
applicant_creditor_id: 'DE99ZZZ00000012345 '
applicant_iban: DE99700500000000012345
applicant_name: Finanzamt Muenchen Abteilung Erhebung
bank_reference: null
compensation_amount: null
currency: EUR
customer_reference: null
date: !!python/object/apply:mt940.models.Date
- !!binary |
B+EJDg==
debitor_identifier: null
deviate_applicant: null
deviate_recipient: null
end_to_end_reference: '123/123/12345-----L1101234567890123 '
extra_details: ''
funds_code: null
gvc_applicant_bin: null
gvc_applicant_iban: null
id: NMSC
old_SEPA_CI: null
old_SEPA_additional_position_reference: null
original_amount: null
posting_text: Basislastschrift
prima_nota: '931'
purpose: 'STEUERNR 123/123/12345 KOERPST 3VJ.17 233,15EUR EREF: 123/123/12345-----L1112345678912345
MREF: BYA12345678901 CRED: DE99ZZZ00000012345 IBAN: DE00700500'
purpose_code: null
recipient_name: null
return_debit_notes: '992'
settlement_tag: null
status: D
transaction_code: '105'
transactions: *id003

0 comments on commit 62066fe

Please sign in to comment.