Skip to main content

Python SEPA XML implementations

Project description

This is a python implementation to generate SEPA XML files.

Limitations

Supported standards:

  • SEPA PAIN.001.001.03 (v2009)

  • SEPA PAIN.001.001.09 (v2019)

  • SEPA PAIN.001.001.10

  • SEPA PAIN.001.001.11

  • SEPA PAIN.008.001.02 (v2009)

  • SEPA PAIN.008.001.08 (v2019)

  • SEPA PAIN.008.001.09

  • SEPA PAIN.008.001.10

Usage

Direct debit (SDD)

Example:

from sepapy import SepaDebit
import datetime, uuid

config = {
    "msg_id": "EXAMPLE-SDD-PAIN88-TEST",
    "name": "Musée du SEPA",
    "IBAN": "FR7610071750000012345678944",
    "BIC": "TRPUFRP1",
    "batch": True,
    "creditor_id": "FR82ZZZ00000000000",  # Identifier Creditor SEPA (ICS), 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
        "department": "Bureau de la conservation",
        "subdepartment": None,
        "street_name": "rue de la Banque",
        "building_number": "666",
        "postcode": "75002",
        "town": "Paris",
        "country": "FR",
        "country_subdivision": None,
    },
}
sepa = SepaDebit(config, schema="pain.008.001.08", clean=True)

payment1 = {
    "name": "Client Lambda",
    "IBAN": "FR7610107012340012345678952",
    "BIC": "BREDFRPPXXX",
    "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": "AC12345678-DFT-SDD-25001-001", #str(uuid.uuid1()).replace("-", ""),  # autogenerated if obmitted
    "address": {
        # The address and all of its fields are optional but in some countries they are required
        "lines": ["1 rue du Client", "59000 Lille"],
    },
}

payment2 = {
    "name": "SARL Lambda",
    "IBAN": "FR7620041010059876543210065",
    "BIC": "PSSTFRPPXXX",
    "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": "AC12345678-DFT-SDD-25001-002", #str(uuid.uuid1()).replace("-", ""),  # autogenerated if obmitted
    "address": {
        # The address and all of its fields are optional but in some countries they are required
        "department": "Comptabilite",
        "subdepartment": None,
        "street_name": "rue des Immeubles-Industriels",
        "building_number": "123",
        "postcode": "75011",
        "town": "Paris",
        "country": "FR",
        "country_subdivision": None,
    },
}

sepa.add_payment(payment1)
sepa.add_payment(payment2)

print(sepa.export(validate=True, pretty_print=True))

Credit transfer (SCT)

Example:

from sepapy import SepaCredit
import datetime, uuid

config = {
    "msg_id": "EXAMPLE-SCT-PAIN19-TEST",
    "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 = SepaCredit(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, pretty_print=True))

Development

To run the included tests:

pip install -r requirements_dev.txt
py.test tests

Credits and License

Maintainer: Philippe-Alexandre PIERRE <pap@httpap.dev>

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!

This basically continued as a properly packaged, python 3 tested version of the python-sepaxml implementation that was released by aphael Michel 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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sepapy-2.6.3.tar.gz (52.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sepapy-2.6.3-py3-none-any.whl (61.2 kB view details)

Uploaded Python 3

File details

Details for the file sepapy-2.6.3.tar.gz.

File metadata

  • Download URL: sepapy-2.6.3.tar.gz
  • Upload date:
  • Size: 52.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.6

File hashes

Hashes for sepapy-2.6.3.tar.gz
Algorithm Hash digest
SHA256 63e9c1d178d509f59f9c69172a1af9ec11eadb2bce17f1452937b0357de2e688
MD5 f76828bd4e7b7d1100fac5d9840db3ce
BLAKE2b-256 29e1c2d85e38e2387dcf180211750a7065d8f31b8cc2dc4948a8210f1b5a032c

See more details on using hashes here.

File details

Details for the file sepapy-2.6.3-py3-none-any.whl.

File metadata

  • Download URL: sepapy-2.6.3-py3-none-any.whl
  • Upload date:
  • Size: 61.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.6

File hashes

Hashes for sepapy-2.6.3-py3-none-any.whl
Algorithm Hash digest
SHA256 0fd00bc467c803c7cf819876fc75d2843cc26607ce65df72b062b1049544c226
MD5 9037de920bbb04475f67bba86d5cb160
BLAKE2b-256 83609b33e63a8587d40979baf8a8668f7751561183f82031387be9af805960e5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page