mt940.tags module

The MT940 format is a standard for bank account statements. It is used by many banks in Europe and is based on the SWIFT MT940 format.

The MT940 tags are:

Tag

Description

:13:

Date/Time indication at which the report was created

:20:

Transaction Reference Number

:21:

Related Reference Number

:25:

Account Identification

:28:

Statement Number

:34:

The floor limit for debit and credit

:60F:

Opening Balance

:60M:

Intermediate Balance

:60E:

Closing Balance

:61:

Statement Line

:62:

Closing Balance

:62M:

Intermediate Closing Balance

:62F:

Final Closing Balance

:64:

Available Balance

:65:

Forward Available Balance

:86:

Transaction Information

:90:

Total number and amount of debit entries

:NS:

Bank specific Non-swift extensions containing extra information

Format

Sources:

The pattern for the tags use the following syntax:

[] = optional
! = fixed length
a = Text
x = Alphanumeric, seems more like text actually. Can include special
    characters (slashes) and whitespace as well as letters and numbers
d = Numeric separated by decimal (usually comma)
c = Code list value
n = Numeric
class mt940.tags.AccountIdentification(*args, **kwargs)[source]

Bases: Tag

Account identification

Pattern: 35x

id = 25
logger = <Logger mt940.tags.AccountIdentification (WARNING)>
name = 'AccountIdentification'
pattern = '(?P<account_identification>.{0,35})'
slug = 'account_identification'
class mt940.tags.AvailableBalance(*args, **kwargs)[source]

Bases: BalanceBase

id = 64
logger = <Logger mt940.tags.AvailableBalance (WARNING)>
name = 'AvailableBalance'
slug = 'available_balance'
class mt940.tags.BalanceBase(*args, **kwargs)[source]

Bases: Tag

Balance base

Pattern: 1!a6!n3!a15d

pattern = '^\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    '
class mt940.tags.ClosingBalance(*args, **kwargs)[source]

Bases: BalanceBase

id = 62
logger = <Logger mt940.tags.ClosingBalance (WARNING)>
name = 'ClosingBalance'
slug = 'closing_balance'
class mt940.tags.DateTimeIndication(*args, **kwargs)[source]

Bases: Tag

Date/Time indication at which the report was created

Pattern: 6!n4!n1! x4!n

id = 13
logger = <Logger mt940.tags.DateTimeIndication (WARNING)>
name = 'DateTimeIndication'
pattern = '^\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    '
slug = 'date_time_indication'
class mt940.tags.FinalClosingBalance(*args, **kwargs)[source]

Bases: ClosingBalance

id = '62F'
logger = <Logger mt940.tags.FinalClosingBalance (WARNING)>
name = 'FinalClosingBalance'
slug = 'final_closing_balance'
class mt940.tags.FinalOpeningBalance(*args, **kwargs)[source]

Bases: BalanceBase

id = '60F'
logger = <Logger mt940.tags.FinalOpeningBalance (WARNING)>
name = 'FinalOpeningBalance'
slug = 'final_opening_balance'
class mt940.tags.FloorLimitIndicator(*args, **kwargs)[source]

Bases: Tag

Floor limit indicator indicates the minimum value reported for debit and credit amounts

Pattern: :34F:GHSC0,00

id = 34
logger = <Logger mt940.tags.FloorLimitIndicator (WARNING)>
name = 'FloorLimitIndicator'
pattern = '^\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    $'
slug = 'floor_limit_indicator'
class mt940.tags.ForwardAvailableBalance(*args, **kwargs)[source]

Bases: BalanceBase

id = 65
logger = <Logger mt940.tags.ForwardAvailableBalance (WARNING)>
name = 'ForwardAvailableBalance'
slug = 'forward_available_balance'
class mt940.tags.IntermediateClosingBalance(*args, **kwargs)[source]

Bases: ClosingBalance

id = '62M'
logger = <Logger mt940.tags.IntermediateClosingBalance (WARNING)>
name = 'IntermediateClosingBalance'
slug = 'intermediate_closing_balance'
class mt940.tags.IntermediateOpeningBalance(*args, **kwargs)[source]

Bases: BalanceBase

id = '60M'
logger = <Logger mt940.tags.IntermediateOpeningBalance (WARNING)>
name = 'IntermediateOpeningBalance'
slug = 'intermediate_opening_balance'
class mt940.tags.NonSwift(*args, **kwargs)[source]

Bases: Tag

Non-swift extension for MT940 containing extra information. The actual definition is not consistent between banks so the current implementation is a tad limited. Feel free to extend the implementation and create a pull request with a better version :)

It seems this could be anything so we’ll have to be flexible about it.

Pattern: 2!n35x | *x

id = 'NS'
logger = <Logger mt940.tags.NonSwift (WARNING)>
name = 'NonSwift'
pattern = '\n    (?P<non_swift>\n        (\n            (\\d{2}.{0,})\n            (\\n\\d{2}.{0,})*\n        )|(\n            [^\\n]*\n        )\n    )\n    $'
class scope(transactions, data=None)[source]

Bases: Transaction, Transactions

slug = 'non_swift'
sub_pattern = '\n    (?P<ns_id>\\d{2})(?P<ns_data>.{0,})\n    '
sub_pattern_m = re.compile('\n    (?P<ns_id>\\d{2})(?P<ns_data>.{0,})\n    ', re.IGNORECASE|re.VERBOSE)
class mt940.tags.OpeningBalance(*args, **kwargs)[source]

Bases: BalanceBase

id = 60
logger = <Logger mt940.tags.OpeningBalance (WARNING)>
name = 'OpeningBalance'
slug = 'opening_balance'
class mt940.tags.RelatedReference(*args, **kwargs)[source]

Bases: Tag

Related reference

Pattern: 16x

id = 21
logger = <Logger mt940.tags.RelatedReference (WARNING)>
name = 'RelatedReference'
pattern = '(?P<related_reference>.{0,16})'
slug = 'related_reference'
class mt940.tags.Statement(*args, **kwargs)[source]

Bases: Tag

The MT940 Tag 61 provides information about a single transaction that has taken place on the account. Each transaction is identified by a unique transaction reference number (Tag 20) and is described in the Statement Line (Tag 61).

Pattern: 6!n[4!n]2a[1!a]15d1!a3!c23x[//16x]

The fields are:

  • value_date: transaction date (YYMMDD)

  • entry_date: Optional 4-digit month value and 2-digit day value of the entry date (MMDD)

  • funds_code: Optional 1-character code indicating the funds type ( the third character of the currency code if needed)

  • amount: 15-digit value of the transaction amount, including commas for decimal separation

  • transaction_type: Optional 4-character transaction type identification code starting with a letter followed by alphanumeric characters and spaces

  • customer_reference: Optional 16-character customer reference, excluding any bank reference

  • bank_reference: Optional 23-character bank reference starting with “//”

  • supplementary_details: Optional 34-character supplementary details about the transaction.

The Tag 61 can occur multiple times within an MT940 file, with each occurrence representing a different transaction.

id = 61
logger = <Logger mt940.tags.Statement (WARNING)>
name = 'Statement'
pattern = "^\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>R?[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    # cuscal can also send a space here as well\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    # We need the (slow) repeating negative lookahead to search for // so we\n    # don't acciddntly include the bank reference in the customer reference.\n    (?P<customer_reference>((?!//)[^\\n]){0,16})  # 16x Customer Reference\n    (//(?P<bank_reference>.{0,23}))?  # [//23x] Bank Reference\n    (\\n?(?P<extra_details>.{0,34}))?  # [34x] Supplementary Details\n    $"
scope

alias of Transaction

slug = 'statement'
class mt940.tags.StatementASNB(*args, **kwargs)[source]

Bases: Statement

From: https://www.sepaforcorporates.com/swift-for-corporates

Pattern: 6!n[4!n]2a[1!a]15d1!a3!c16x[//16x] [34x]

But ASN bank puts the IBAN in the customer reference, which is acording to Wikipedia at most 34 characters.

So this is the new pattern:

Pattern: 6!n[4!n]2a[1!a]15d1!a3!c34x[//16x] [34x]

pattern = '^\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,34})  # 34x Customer Reference\n    (//(?P<bank_reference>.{0,16}))?  # [//16x] Bank Reference\n    (\\n?(?P<extra_details>.{0,34}))?  # [34x] Supplementary Details\n    $'
class mt940.tags.StatementNumber(*args, **kwargs)[source]

Bases: Tag

Statement number / sequence number

Pattern: 5n[/5n]

id = 28
logger = <Logger mt940.tags.StatementNumber (WARNING)>
name = 'StatementNumber'
pattern = '\n    (?P<statement_number>\\d{1,5})  # 5n\n    (?:/?(?P<sequence_number>\\d{1,5}))?  # [/5n]\n    $'
slug = 'statement_number'
class mt940.tags.SumCreditEntries(*args, **kwargs)[source]

Bases: SumEntries

id = '90C'
logger = <Logger mt940.tags.SumCreditEntries (WARNING)>
name = 'SumCreditEntries'
slug = 'sum_credit_entries'
status = 'C'
class mt940.tags.SumDebitEntries(*args, **kwargs)[source]

Bases: SumEntries

id = '90D'
logger = <Logger mt940.tags.SumDebitEntries (WARNING)>
name = 'SumDebitEntries'
slug = 'sum_debit_entries'
status = 'D'
class mt940.tags.SumEntries(*args, **kwargs)[source]

Bases: Tag

Number and Sum of debit Entries

id = 90
logger = <Logger mt940.tags.SumEntries (WARNING)>
name = 'SumEntries'
pattern = '^\n    (?P<number>\\d*)\n    (?P<currency>.{3})  # 3!a Currency\n    (?P<amount>[\\d,]{1,15})  # 15d Amount\n    '
slug = 'sum_entries'
class mt940.tags.Tag(*args, **kwargs)[source]

Bases: object

RE_FLAGS = 98
id = 0
parse(transactions, value)[source]
scope

alias of Transactions

class mt940.tags.Tags(value, names=None, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]

Bases: Enum

ACCOUNT_IDENTIFICATION = <mt940.tags.AccountIdentification object>
AVAILABLE_BALANCE = <mt940.tags.AvailableBalance object>
CLOSING_BALANCE = <mt940.tags.ClosingBalance object>
DATE_TIME_INDICATION = <mt940.tags.DateTimeIndication object>
FINAL_CLOSING_BALANCE = <mt940.tags.FinalClosingBalance object>
FINAL_OPENING_BALANCE = <mt940.tags.FinalOpeningBalance object>
FLOOR_LIMIT_INDICATOR = <mt940.tags.FloorLimitIndicator object>
FORWARD_AVAILABLE_BALANCE = <mt940.tags.ForwardAvailableBalance object>
INTERMEDIATE_CLOSING_BALANCE = <mt940.tags.IntermediateClosingBalance object>
INTERMEDIATE_OPENING_BALANCE = <mt940.tags.IntermediateOpeningBalance object>
NON_SWIFT = <mt940.tags.NonSwift object>
OPENING_BALANCE = <mt940.tags.OpeningBalance object>
RELATED_REFERENCE = <mt940.tags.RelatedReference object>
STATEMENT = <mt940.tags.Statement object>
STATEMENT_NUMBER = <mt940.tags.StatementNumber object>
SUM_CREDIT_ENTRIES = <mt940.tags.SumCreditEntries object>
SUM_DEBIT_ENTRIES = <mt940.tags.SumDebitEntries object>
SUM_ENTRIES = <mt940.tags.SumEntries object>
TRANSACTION_DETAILS = <mt940.tags.TransactionDetails object>
TRANSACTION_REFERENCE_NUMBER = <mt940.tags.TransactionReferenceNumber object>
class mt940.tags.TransactionDetails(*args, **kwargs)[source]

Bases: Tag

Transaction details

Pattern: 6x65x

id = 86
logger = <Logger mt940.tags.TransactionDetails (WARNING)>
name = 'TransactionDetails'
pattern = '\n    (?P<transaction_details>(([\\s\\S]{0,65}\\r?\\n?){0,8}[\\s\\S]{0,65}))\n    '
scope

alias of Transaction

slug = 'transaction_details'
class mt940.tags.TransactionReferenceNumber(*args, **kwargs)[source]

Bases: Tag

Transaction reference number

Pattern: 16x

id = 20
logger = <Logger mt940.tags.TransactionReferenceNumber (WARNING)>
name = 'TransactionReferenceNumber'
pattern = '(?P<transaction_reference>.{0,16})'
slug = 'transaction_reference_number'