sepapy 2.6.3
Python SEPA XML implementations
Keywords: banking, credit, debit, iso20022, sepa, xml, xsd

SEPAPython XML Generator
========================

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:

.. code:: python

    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:

.. code:: python

    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.

.. _PySepaDD: https://github.com/congressus/PySepaDD
.. _python-sepaxml: https://github.com/raphaelm/python-sepaxml
.. _allowed to be reproduced: https://www.iso20022.org/terms-use