Skip to main content

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

python_ubl-0.1.5.tar.gz (52.6 kB view details)

Uploaded Source

Built Distribution

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

python_ubl-0.1.5-py3-none-any.whl (57.8 kB view details)

Uploaded Python 3

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

Hashes for python_ubl-0.1.5.tar.gz
Algorithm Hash digest
SHA256 9e0e7d9c57039f2bc5bd7054e27fd385be9555d0ad0848ce4295ea3f57a1b35a
MD5 63736fbb2e0d6dd391926eded20f5045
BLAKE2b-256 9858ead93d3fc768281d9e389f626903c8a670394ea8fc3da406218a29fa5d9e

See more details on using hashes here.

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

Hashes for python_ubl-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 7bd111d8aede6ab7216af222b585990a4e5c66e18a381685f0dba12e00ba87f3
MD5 0e993d47e9e5e1505d47d3eec1b75623
BLAKE2b-256 cce0e5280c5076ab58830f34090375e4c5813f72ac7e9bbab7a3454b16a4b4e1

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