Skip to main content
https://travis-ci.org/invinet/python-en16931.svg?branch=master https://codecov.io/gh/invinet/python-en16931/branch/master/graph/badge.svg

Python 3 package to read, write and manage the new EN16931 Invoice format.

This European Standard establishes a semantic data model of the core elements of an electronic invoice. The semantic model includes only the essential information elements that an electronic invoice needs to ensure legal (including fiscal) compliance and to enable interoperability for cross-border, cross sector and for domestic trade.

Features

This library allows you to:

  1. De-serialize an XML in EN16931 format to a python Invoice object.

  2. Serialize a python Invoice object to a valid XML representation.

  3. Validate an Invoice using validex.

  4. Import an Invoice to B2BRouter.

Installation

You can use pip to install this package:

$ pip install en16931

Usage

You can import an invoice from an XML file:

>>> from en16931 import Invoice
>>> invoice = Invoice.from_xml('en16931/tests/files/invoice.xml')

And use the API to access its internal values and entities:

>>> invoice.issue_date
datetime.datetime(2018, 6, 11, 0, 0)
>>> invoice.seller_party
<en16931.entity.Entity at 0x7f2b7c12b860>
>>> invoice.buyer_party
<en16931.entity.Entity at 0x7f2b7c0fd160>
>>> invoice.unique_taxes
{ Tax S: 0.21  , Tax S: 0.1  }
>>> invoice.lines
[<en16931.invoice_line.InvoiceLine at 0x7f2b7c0fd400>,
 <en16931.invoice_line.InvoiceLine at 0x7f2b7c0fd518>,
 <en16931.invoice_line.InvoiceLine at 0x7f2b7c0fd748>]
>>> invoice.tax_exclusive_amount
87.00
>>> invoice.tax_amount()
16.62
>>> invoice.tax_inclusive_amount
103.62
>>> invoice.payable_amount
103.62

If you import an XML file, all relevant quantities are not computed; we use the ones defined on the XML. You can check that the computed and imported quantities match by calling the relevant methods:

>>> assert invoice.tax_exclusive_amount == invoice.subtotal()
True
>>> assert invoice.tax_inclusive_amount == invoice.total()
True
>>> assert invoice.payable_amount == invoice.total()
True

Or you can also build, step by step, an invoice:

>>> from en16931 import Invoice, Entity, InvoiceLine
>>> invoice = Invoice(invoice_id="2018-01", currency="EUR")
>>> seller = Entity(name="Acme Inc.", tax_scheme="VAT",
...                 tax_scheme_id="ES34626691F", country="ES",
...                 party_legal_entity_id="ES34626691F",
...                 registration_name="Acme INc.", mail="acme@acme.io",
...                 endpoint="ES76281415Y", endpoint_scheme="ES:VAT",
...                 address="easy street", postalzone="08080",
...                 city="Barcelona", province="Barcelona")
>>> buyer = Entity(name="Corp Inc.", tax_scheme="VAT",
...                tax_scheme_id="ES76281415Y", country="ES",
...                party_legal_entity_id="ES76281415Y",
...                registration_name="Corp INc.", mail="corp@corp.io",
...                endpoint="ES76281415Y", endpoint_scheme="ES:VAT",
...                address="busy street", postalzone="08080",
...                city="Barcelona", province="Barcelona")
>>> invoice.buyer_party = buyer
>>> invoice.seller_party = seller
>>> invoice.due_date = "2018-09-11"
>>> invoice.issue_date = "2018-06-11"
>>> # lines
>>> il1 = InvoiceLine(quantity=11, unit_code="EA", price=2,
...                   item_name='test 1', currency="EUR",
...                   tax_percent=0.21, tax_category="S")
>>> il2 = InvoiceLine(quantity=2, unit_code="EA", price=25,
...                   item_name='test 2', currency="EUR",
...                   tax_percent=0.21, tax_category="S")
>>> il3 = InvoiceLine(quantity=5, unit_code="EA", price=3,
...                   item_name='test 3', currency="EUR",
...                   tax_percent=0.1, tax_category="S")
>>> invoice.add_lines_from([il1, il2, il3])

And serialize it to XML:

>>> # As a string
>>> xml = invoice.to_xml()
>>> # Or save it directly to a file
>>> invoice.save('example_invoice.xml')

Limitations

This is a proof of concept implementation and not all features defined in the EN16931 standard are implemented. But it is easy, in some cases trivial, to implement them. The main not implemented features are:

  • CreditNotes are not supported.

  • File attachments are not supported.

  • Delivery information is not supported.

  • Only global charges and discounts are supported. Line discounts and charges are not supported.

  • Other potentially useful attributes (such as InvoicePeriod, BuyerReference, OrderReference, BillingReference, ContractDocumentReference, among others) are not implemented.

If you need a particular feature implemented, see the following section for feature requests.

Bugs and Feature Requests

Please report any bugs that you find here. Or, even better, fork the repository on GitHub and create a pull request (PR). We welcome all changes, big or small.

License

Released under the Apache License Version 2.0 (see LICENSE.txt):

Copyright (C) 2018 Invinet Sistemes

Release files for en16931 0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for en16931 0.2
File Size Uploaded
en16931-0.2.tar.gz 29.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for en16931 0.2
File Interpreter ABI Platform
en16931-0.2-py3-none-any.whl Python 3 none any Details

Total release size:62.5 kB

Release files / en16931-0.2.tar.gz

Download URL en16931-0.2.tar.gz
Size 29.0 kB
Tags Source
SHA-256 checksum
How to use checksums
de663c840c3c35f1e4ed368739dde1223f736e2f6532060c62af414cade0546a
BLAKE2b-256 checksum
How to use checksums
f580212c74195615bfca9e1beeb5c8e65fc50d2cacd68ea4be225bd6ece94db5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.10.12

Release files / en16931-0.2-py3-none-any.whl

Download URL en16931-0.2-py3-none-any.whl
Size 33.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bdb15faa732d2bc709bc2b66d3cca9ac9cb2aceb9d4207ce93f7372eca68cc34
BLAKE2b-256 checksum
How to use checksums
442677da499a639416a62d8184c5adf07bdba5fe271f181bd03c58103ceef262
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.10.12

Release history Release notifications | RSS feed

This release

0.2 This release

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page