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.3.tar.gz (70.8 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.3-py3-none-any.whl (81.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: python_ubl-0.1.3.tar.gz
  • Upload date:
  • Size: 70.8 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.3.tar.gz
Algorithm Hash digest
SHA256 cdcf7f4997d427b65fb4e39cdcb9098ea3fbaacb5c8de84b0694c3990fa86b45
MD5 c0c4893747f0430119643345c78d5909
BLAKE2b-256 b71e7ba59191fcc0936f71ce409c46e0f392ad5e368462a8c09deb4117483c46

See more details on using hashes here.

File details

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

File metadata

  • Download URL: python_ubl-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 81.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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 1882baf11e2380a0091bd7dba58defa2d83024b83fc1e100179e4465139e1039
MD5 ffe682a35411e4ad6681f8cf4e214899
BLAKE2b-256 a5ed04b9d56195b995783e8c539c59048a74c857ca0db0cc9d9ba969b275bf9a

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