Skip to content

raphaelm/python-sepaxml

Folders and files

NameName
Last commit message
Last commit date

Latest commit

e38616e · Oct 4, 2024
Jul 24, 2018
Oct 4, 2024
Oct 4, 2024
Jul 24, 2018
May 31, 2024
Jan 8, 2021
Apr 8, 2023
Dec 5, 2021
Apr 8, 2023
Jan 20, 2017
Jan 20, 2017
Feb 21, 2019

Repository files navigation

SEPA XML Generator

https://travis-ci.org/raphaelm/python-sepaxml.svg?branch=master

This is a python implementation to generate SEPA XML files.

Limitations

Supported standards:

  • SEPA PAIN.001.001.03
  • SEPA PAIN.008.001.02

Usage

Direct debit

Example:

from sepaxml import SepaDD
import datetime, uuid

config = {
    "name": "Test von Testenstein",
    "IBAN": "NL50BANK1234567890",
    "BIC": "BANKNL2A",
    "batch": True,
    "creditor_id": "DE26ZZZ00000000000",  # supplied by your bank or financial authority
    "currency": "EUR",  # ISO 4217
    # "instrument": "B2B",  # - default is CORE (B2C)
    "address": {
        # The address and all of its fields are optional but in some countries they are required
        "address_type": "ADDR",  # valid: ADDR, PBOX, HOME, BIZZ, MLTO, DLVY
        "department": "Head Office",
        "subdepartment": None,
        "street_name": "Musterstr.",
        "building_number": "1",
        "postcode": "12345",
        "town": "Berlin",
        "country": "DE",
        "country_subdivision": None,
        "lines": ["Line 1", "Line 2"],
    },
}
sepa = SepaDD(config, schema="pain.008.001.02", clean=True)

payment = {
    "name": "Test von Testenstein",
    "IBAN": "NL50BANK1234567890",
    "BIC": "BANKNL2A",
    "amount": 5000,  # in cents
    "type": "RCUR",  # FRST,RCUR,OOFF,FNAL
    "collection_date": datetime.date.today(),
    "mandate_id": "1234",
    "mandate_date": datetime.date.today(),
    "description": "Test transaction",
    # "endtoend_id": str(uuid.uuid1()).replace("-", ""),  # autogenerated if obmitted
    "address": {
        # The address and all of its fields are optional but in some countries they are required
        "address_type": "ADDR",  # valid: ADDR, PBOX, HOME, BIZZ, MLTO, DLVY
        "department": "Head Office",
        "subdepartment": None,
        "street_name": "Musterstr.",
        "building_number": "1",
        "postcode": "12345",
        "town": "Berlin",
        "country": "DE",
        "country_subdivision": None,
        "lines": ["Line 1", "Line 2"],
    },
}
sepa.add_payment(payment)

print(sepa.export(validate=True))

Credit transfer

Example:

from sepaxml import SepaTransfer
import datetime, uuid

config = {
    "name": "Test von Testenstein",
    "IBAN": "NL50BANK1234567890",
    "BIC": "BANKNL2A",
    "batch": True,
    # For non-SEPA transfers, set "domestic" to True, necessary e.g. for CH/LI
    "currency": "EUR",  # ISO 4217
    "address": {
        # The address and all of its fields are optional but in some countries they are required
        "address_type": "ADDR",  # valid: ADDR, PBOX, HOME, BIZZ, MLTO, DLVY
        "department": "Head Office",
        "subdepartment": None,
        "street_name": "Musterstr.",
        "building_number": "1",
        "postcode": "12345",
        "town": "Berlin",
        "country": "DE",
        "country_subdivision": None,
        "lines": ["Line 1", "Line 2"],
    },
}
sepa = SepaTransfer(config, clean=True)

payment = {
    "name": "Test von Testenstein",
    "IBAN": "NL50BANK1234567890",
    "BIC": "BANKNL2A",
    "amount": 5000,  # in cents
    "execution_date": datetime.date.today() + datetime.timedelta(days=2),
    "description": "Test transaction",
    # "endtoend_id": str(uuid.uuid1()).replace("-", ""),  # optional
    "address": {
        # The address and all of its fields are optional but in some countries they are required
        "address_type": "ADDR",  # valid: ADDR, PBOX, HOME, BIZZ, MLTO, DLVY
        "department": "Head Office",
        "subdepartment": None,
        "street_name": "Musterstr.",
        "building_number": "1",
        "postcode": "12345",
        "town": "Berlin",
        "country": "DE",
        "country_subdivision": None,
        "lines": ["Line 1", "Line 2"],
    },
}
sepa.add_payment(payment)

print(sepa.export(validate=True))

Development

To run the included tests:

pip install -r requirements_dev.txt
py.test tests

To automatically sort your Imports as required by CI:

pip install isort
isort -rc .

Credits and License

Maintainer: Raphael Michel <[email protected]>

This basically started as a properly packaged, python 3 tested version of the PySepaDD implementation that was released by The Congressus under the MIT license. Thanks for your work!

The source code is released under MIT license.

Not part of the MIT-licensed project are the XML schemas in the sepaxml/schemas/ folder which are copyrighted by the ISO 20022 organization but allowed to be reproduced freely.