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

> - Swift for corporates

> - Rabobank MT940

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)

  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)

  Bases: `BalanceBase`

  id = 64
  logger = <Logger mt940.tags.AvailableBalance (WARNING)>
  name = 'AvailableBalance'
  slug = 'available_balance'

class mt940.tags.BalanceBase(*args, **kwargs)

  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)

  Bases: `BalanceBase`

  id = 62
  logger = <Logger mt940.tags.ClosingBalance (WARNING)>
  name = 'ClosingBalance'
  slug = 'closing_balance'

class mt940.tags.DateTimeIndication(*args, **kwargs)

  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)

  Bases: `ClosingBalance`

  id = '62F'
  logger = <Logger mt940.tags.FinalClosingBalance (WARNING)>
  name = 'FinalClosingBalance'
  slug = 'final_closing_balance'

class mt940.tags.FinalOpeningBalance(*args, **kwargs)

  Bases: `BalanceBase`

  id = '60F'
  logger = <Logger mt940.tags.FinalOpeningBalance (WARNING)>
  name = 'FinalOpeningBalance'
  slug = 'final_opening_balance'

class mt940.tags.FloorLimitIndicator(*args, **kwargs)

  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)

  Bases: `BalanceBase`

  id = 65
  logger = <Logger mt940.tags.ForwardAvailableBalance (WARNING)>
  name = 'ForwardAvailableBalance'
  slug = 'forward_available_balance'

class mt940.tags.IntermediateClosingBalance(*args, **kwargs)

  Bases: `ClosingBalance`

  id = '62M'
  logger = <Logger mt940.tags.IntermediateClosingBalance (WARNING)>
  name = 'IntermediateClosingBalance'
  slug = 'intermediate_closing_balance'

class mt940.tags.IntermediateOpeningBalance(*args, **kwargs)

  Bases: `BalanceBase`

  id = '60M'
  logger = <Logger mt940.tags.IntermediateOpeningBalance (WARNING)>
  name = 'IntermediateOpeningBalance'
  slug = 'intermediate_opening_balance'

class mt940.tags.NonSwift(*args, **kwargs)

  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)

    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)

  Bases: `BalanceBase`

  id = 60
  logger = <Logger mt940.tags.OpeningBalance (WARNING)>
  name = 'OpeningBalance'
  slug = 'opening_balance'

class mt940.tags.RelatedReference(*args, **kwargs)

  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)

  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)

  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)

  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)

  Bases: `SumEntries`

  id = '90C'
  logger = <Logger mt940.tags.SumCreditEntries (WARNING)>
  name = 'SumCreditEntries'
  slug = 'sum_credit_entries'
  status = 'C'

class mt940.tags.SumDebitEntries(*args, **kwargs)

  Bases: `SumEntries`

  id = '90D'
  logger = <Logger mt940.tags.SumDebitEntries (WARNING)>
  name = 'SumDebitEntries'
  slug = 'sum_debit_entries'
  status = 'D'

class mt940.tags.SumEntries(*args, **kwargs)

  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)

  Bases: `object`

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

    alias of `Transactions`

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

  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)

  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)

  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'