Custom Python UBL 2.1 library with PEPPOL BIS Billing 3.0 support
Project description
python_ubl
A pure Python library for generating and parsing UBL 2.1 XML documents with full PEPPOL BIS Billing 3.0 compliance.
Status: Alpha (v0.1.3)
This library is in early development. The API is not yet stable and may change in future releases.
Features
- Pure Python: No Django dependency required (optional Django integration available)
- UBL 2.1 Support: Generate and parse invoices and credit notes
- PEPPOL Compliance: Full support for PEPPOL BIS Billing 3.0
- Dataclass-based: Type-safe, immutable-by-convention data structures
- Bidirectional: Generate UBL XML from Python objects, parse UBL XML into Python objects
- Automatic Identifier Generation: Auto-generate PEPPOL participant identifiers from VAT/registration numbers
- 100 PEPPOL Schemes: Supports all PEPPOL v9.4 participant identifier schemes
Installation
pip install python_ubl
Quick Start
from ubl.models import Invoice, Party, InvoiceLine, Amount, Quantity, PostalAddress
from datetime import date
# Create a simple invoice
invoice = Invoice(
id="INV-001",
issue_date=date.today(),
supplier=Party(
name="My Company",
vat="BE0123456789",
country_code="BE",
postal_address=PostalAddress(
street_name="Main Street 1",
city_name="Brussels",
postal_zone="1000",
country="BE" # Smart casting: string -> Country object
)
),
customer=Party(...),
lines=[
InvoiceLine(
id="1",
invoiced_quantity=Quantity(value=10, unitCode="EA"),
line_extension_amount=Amount(value=100.00),
item=Item(name="Product A"),
price=Price(price_amount=Amount(value=10.00))
)
]
)
# Export to XML
xml_bytes = invoice.to_xml()
# Parse from XML
invoice = Invoice.from_xml(xml_bytes)
PEPPOL Compliance Mode
For PEPPOL BIS 3.0 / CEN EN16931 compliance, use the peppol_context() context manager:
from ubl import peppol_context
from ubl.models import Invoice
# Generate PEPPOL-compliant UBL XML
with peppol_context():
invoice = Invoice(...)
xml = invoice.to_xml_string()
When active, PEPPOL mode automatically:
- Removes forbidden elements: LineCountNumeric, TaxSubtotal/Percent, InvoiceLine/TaxTotal, FinancialInstitution
- Removes forbidden attributes: listID, schemeName, listAgencyID, unitCodeListID
- Filters identifiers: Uses only CEN-approved codes (0002-0240) for PartyIdentification
- Normalizes financial IDs: IBAN/BIC values are prefixed without schemeID attribute
- Simplifies tax schemes: Removes schemeID from PartyTaxScheme CompanyID (UBL-CR-652)
This ensures generated XML passes all CEN EN16931 and PEPPOL BIS 3.0 validation rules without manual adjustments.
Requirements
- Python 3.11+
- lxml >= 4.9.0
- python-dateutil >= 2.8.0
Development Status
Currently implemented:
- ✅ Basic components (Amount, Quantity, Identifier, Code)
- ✅ Aggregate components (Party, Address, Tax, Payment)
- ✅ PEPPOL identifier generation (100 schemes)
- ✅ Document models (Invoice, CreditNote)
- ✅ Bidirectional XML serialization
- ✅ Official UBL 2.1 example validation
Coming soon:
- 🚧 XSD schema validation
- 🚧 Business rules validation
- 🚧 Django integration module
- 🚧 Comprehensive documentation
- 🚧 Public repository and issue tracker
License
MIT License - see LICENSE file for details.
About
This library is developed by LevIT SC as part of their PEPPOL e-invoicing integration project.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file python_ubl-0.1.5.tar.gz.
File metadata
- Download URL: python_ubl-0.1.5.tar.gz
- Upload date:
- Size: 52.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9e0e7d9c57039f2bc5bd7054e27fd385be9555d0ad0848ce4295ea3f57a1b35a
|
|
| MD5 |
63736fbb2e0d6dd391926eded20f5045
|
|
| BLAKE2b-256 |
9858ead93d3fc768281d9e389f626903c8a670394ea8fc3da406218a29fa5d9e
|
File details
Details for the file python_ubl-0.1.5-py3-none-any.whl.
File metadata
- Download URL: python_ubl-0.1.5-py3-none-any.whl
- Upload date:
- Size: 57.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7bd111d8aede6ab7216af222b585990a4e5c66e18a381685f0dba12e00ba87f3
|
|
| MD5 |
0e993d47e9e5e1505d47d3eec1b75623
|
|
| BLAKE2b-256 |
cce0e5280c5076ab58830f34090375e4c5813f72ac7e9bbab7a3454b16a4b4e1
|