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.4.tar.gz (52.0 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.4-py3-none-any.whl (57.1 kB view details)

Uploaded Python 3

File details

Details for the file python_ubl-0.1.4.tar.gz.

File metadata

  • Download URL: python_ubl-0.1.4.tar.gz
  • Upload date:
  • Size: 52.0 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.4.tar.gz
Algorithm Hash digest
SHA256 cf97365a09c895f81b502d8e2dc7685dca3ed34f09b64010bc4c77fae5f39d8c
MD5 d2adbb2474efb9f788a178997d84fa7c
BLAKE2b-256 b3c9310b6ea89f4cb3c2e7cce4d6c13abcf71c3b8b5d0af8fe9d5075bb1b8928

See more details on using hashes here.

File details

Details for the file python_ubl-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: python_ubl-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 57.1 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.4-py3-none-any.whl
Algorithm Hash digest
SHA256 d8f5a58f02d0a81545488c7b725a26c073be4547875ed33f722f13cdcde0d8cd
MD5 6c70bad1cea597c37776fdb735cf9857
BLAKE2b-256 582e396ce9fd1067960197e3ff29efbc3f8fc5e532581e6d0804bb7d3e779e61

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