https://github.com/raphaelm/python-sepaxml
SEPA Direct Debit XML generation in python
https://github.com/raphaelm/python-sepaxml
debit python sepa xml
Last synced: about 2 months ago
JSON representation
SEPA Direct Debit XML generation in python
- Host: GitHub
- URL: https://github.com/raphaelm/python-sepaxml
- Owner: raphaelm
- License: mit
- Created: 2017-01-20T12:54:58.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2024-10-04T13:02:29.000Z (8 months ago)
- Last Synced: 2025-04-06T08:08:21.344Z (2 months ago)
- Topics: debit, python, sepa, xml
- Language: Python
- Size: 135 KB
- Stars: 116
- Watchers: 12
- Forks: 43
- Open Issues: 16
-
Metadata Files:
- Readme: README.rst
- License: LICENSE
Awesome Lists containing this project
README
SEPA XML Generator
==================.. image:: https://travis-ci.org/raphaelm/python-sepaxml.svg?branch=master
:target: https://travis-ci.org/raphaelm/python-sepaxml.. image:: https://codecov.io/gh/raphaelm/python-sepaxml/branch/master/graph/badge.svg
:target: https://codecov.io/gh/raphaelm/python-sepaxml.. image:: http://img.shields.io/pypi/v/sepaxml.svg
:target: https://pypi.python.org/pypi/sepaxmlThis is a python implementation to generate SEPA XML files.
Limitations
-----------Supported standards:
* SEPA PAIN.001.001.03
* SEPA PAIN.008.001.02Usage
-----Direct debit
""""""""""""Example:
.. code:: python
from sepaxml import SepaDD
import datetime, uuidconfig = {
"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:
.. code:: python
from sepaxml import SepaTransfer
import datetime, uuidconfig = {
"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 testsTo automatically sort your Imports as required by CI::
pip install isort
isort -rc .Credits and License
-------------------Maintainer: Raphael Michel
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... _PySepaDD: https://github.com/congressus/PySepaDD
.. _allowed to be reproduced: https://www.iso20022.org/terms-use