Parser della Fattura Elettronica italiana (FatturaPA v1.2) in sola standard library.
Project description
fatturapa
Parser della Fattura Elettronica italiana — tracciato FatturaPA v1.2, formati
FPR12 e FPA12. Zero dipendenze: solo standard library.
Parser for the Italian electronic invoice format (FatturaPA v1.2). Turns the XML into plain dataclasses. No dependencies.
Trasforma l'XML in dataclass già leggibili — codici decodificati, importi e date all'italiana — pronte da impaginare come preferisci. La libreria non genera PDF e non impone un motore di template: la resa grafica resta tua.
pip install fatturapa
from fatturapa import parse
for documento in parse(xml_bytes):
print(documento.tipo_documento, documento.numero, documento.data)
print(documento.cessionario.denominazione)
for linea in documento.linee:
print(" ", linea.descrizione, linea.quantita, linea.prezzo_totale)
print("Totale:", documento.importo_totale, documento.divisa)
Fattura 123 18/12/2014
DITTA BETA
DESCRIZIONE DELLA FORNITURA 5 5,00
Totale: 6,10 EUR
Cosa fa (e cosa no)
Legge il tracciato e te lo restituisce in una forma comoda da stampare:
- decodifica i codici —
TD01→ Fattura,RF19→ Forfettario,MP05→ Bonifico, e così per Natura, CondizioniPagamento, EsigibilitaIVA; - formatta all'italiana —
1234.56→1.234,56,2026-01-20→20/01/2026; - calcola i totali dai riepiloghi, e ricava il totale documento (imponibile +
imposta + bollo) quando
ImportoTotaleDocumentomanca, visto che è opzionale.
Non valida contro l'XSD, non verifica firme digitali, non estrae allegati. Se ti serve quello, guarda fattura-elettronica-reader.
Scelte di fondo
- Namespace-agnostico. L'XML del SdI mescola il namespace del tracciato,
figli con
xmlns=""e una firma XAdES innestata; la navigazione avviene per nome locale del tag, quindi funziona con o senza prefisso. - Nessuna eccezione sui campi opzionali. I tag mancanti diventano stringhe o
liste vuote: mai
None. Il codice che stampa non deve difendersi. - Le fatture in lotto sono la norma. Una
FatturaElettronicapuò contenere piùFatturaElettronicaBody:parse()restituisce sempre unalist[Documento].
parse() solleva ValueError solo se la radice non è <FatturaElettronica>, se
l'XML è malformato o se non c'è alcun corpo documento. Per un controllo
preventivo che non solleva mai c'è is_fattura(raw):
from fatturapa import is_fattura
if is_fattura(contenuto):
documenti = parse(contenuto)
Il modello
parse() restituisce una lista di Documento:
| campo | contenuto |
|---|---|
tipo_documento / tipo_documento_codice |
Fattura / TD01 |
numero, data, divisa, causali |
dati generali |
importo_totale, totale_imponibile, totale_imposta, bollo |
totali |
cedente, cessionario |
Soggetto (denominazione, partita_iva, sede, indirizzo_completo) |
linee |
list[Linea] (descrizione, quantità, prezzi, aliquota, codice_articolo) |
riepiloghi |
list[Riepilogo] (aliquota, natura, imponibile, imposta, riferimento normativo) |
pagamenti, condizioni_pagamento |
list[Pagamento] (modalità, scadenza, IBAN, istituto) |
trasporto |
Trasporto (causale, colli, peso, indirizzo_resa) |
ordini |
list[DatiOrdine] (DatiOrdineAcquisto) |
Tutti i valori sono stringhe già formattate per essere stampate. Se ti servono come numeri, riconvertili tu: la libreria non fa scelte al posto tuo su arrotondamenti e valuta.
Un .p7m firmato?
Le fatture arrivano spesso firmate (.xml.p7m). Estrai prima il contenuto, poi
passalo a parse():
openssl smime -verify -in fattura.xml.p7m -inform DER -noverify -out fattura.xml
Per farlo da interfaccia web c'è p7m-apri, che usa questa stessa libreria per visualizzare le fatture.
Sviluppo
poetry install
poetry run pytest
poetry run ruff check .
I test girano sui tracciati di esempio pubblicati dall'Agenzia delle Entrate
(in tests/tracciati/), più casi mirati costruiti a mano per trasporto, bollo,
natura e formattazione.
Licenza MIT.
Project details
Release history Release notifications | RSS feed
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 fatturapa-0.1.0.tar.gz.
File metadata
- Download URL: fatturapa-0.1.0.tar.gz
- Upload date:
- Size: 11.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c5c0fef5cc4cc6d9b5bbd2c523851d505a1fd5c28e80c0b95a1feae9b3a8a0d
|
|
| MD5 |
a52cd1d64a1811598e319fa343c395d8
|
|
| BLAKE2b-256 |
8a1089c29576c2e121ad9466aaecf07ebf36d7e831de488c0e3b7b7b1affda22
|
Provenance
The following attestation bundles were made for fatturapa-0.1.0.tar.gz:
Publisher:
publish.yml on azuki-beans/fatturapa
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fatturapa-0.1.0.tar.gz -
Subject digest:
0c5c0fef5cc4cc6d9b5bbd2c523851d505a1fd5c28e80c0b95a1feae9b3a8a0d - Sigstore transparency entry: 2255669827
- Sigstore integration time:
-
Permalink:
azuki-beans/fatturapa@31391cd4b208e32950c7057c4989ed06faeda840 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/azuki-beans
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@31391cd4b208e32950c7057c4989ed06faeda840 -
Trigger Event:
push
-
Statement type:
File details
Details for the file fatturapa-0.1.0-py3-none-any.whl.
File metadata
- Download URL: fatturapa-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
feccfca49f4cb4aad014419796e7a46bc682d6952978171a14203c2bbe8fd255
|
|
| MD5 |
4776f6d9f7cd33c0928c6328dbe648ba
|
|
| BLAKE2b-256 |
b4f871f398f89802a4015ae6aecd25c7a7b5901b6f10d8a22db6a2f8f941d948
|
Provenance
The following attestation bundles were made for fatturapa-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on azuki-beans/fatturapa
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fatturapa-0.1.0-py3-none-any.whl -
Subject digest:
feccfca49f4cb4aad014419796e7a46bc682d6952978171a14203c2bbe8fd255 - Sigstore transparency entry: 2255669843
- Sigstore integration time:
-
Permalink:
azuki-beans/fatturapa@31391cd4b208e32950c7057c4989ed06faeda840 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/azuki-beans
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@31391cd4b208e32950c7057c4989ed06faeda840 -
Trigger Event:
push
-
Statement type: