Package: sepaxml
This is a python implementation to generate SEPA XML files.LimitationsSupported standards:SEPA PAIN.001.001.03SEPA PAIN.001.003.03SEPA PAIN.008.001.02SEPA PAIN.008.002.02SEPA PAIN.008.003.02UsageDirect debitExample:fromsepaxmlimportSepaDDimportdatetime,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 transferExample:fromsepaxmlimportSepaTransferimportdatetime,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))DevelopmentTo 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 LicenseMaintainer: Raphael Michel <mail@raphaelmichel.de>This basically started as a properly packaged, python 3 tested version
of thePySepaDDimplementation that was released by The Congressus under the MIT license.
Thanks for your work!License: MIT