Skip to main content

Parser della Fattura Elettronica italiana (FatturaPA v1.2) in sola standard library.

Project description

fatturapa

PyPI Python Licenza MIT

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 codiciTD01Fattura, RF19Forfettario, MP05Bonifico, e così per Natura, CondizioniPagamento, EsigibilitaIVA;
  • formatta all'italiana1234.561.234,56, 2026-01-2020/01/2026;
  • calcola i totali dai riepiloghi, e ricava il totale documento (imponibile + imposta + bollo) quando ImportoTotaleDocumento manca, 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 FatturaElettronica può contenere più FatturaElettronicaBody: parse() restituisce sempre una list[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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fatturapa-0.2.0.tar.gz (12.0 kB view details)

Uploaded Source

Built Distribution

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

fatturapa-0.2.0-py3-none-any.whl (11.4 kB view details)

Uploaded Python 3

File details

Details for the file fatturapa-0.2.0.tar.gz.

File metadata

  • Download URL: fatturapa-0.2.0.tar.gz
  • Upload date:
  • Size: 12.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for fatturapa-0.2.0.tar.gz
Algorithm Hash digest
SHA256 5507d6e6f96799067f09864f5e139246498570586ce4a7b4e1f70480bc600db8
MD5 f9b74d3de0316cc3c2cc18d35f5081a3
BLAKE2b-256 7fed8889456cd119c8a7d6208603079d9c40cfdd9da341536c2131a5a129f69c

See more details on using hashes here.

Provenance

The following attestation bundles were made for fatturapa-0.2.0.tar.gz:

Publisher: publish.yml on azuki-beans/fatturapa

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fatturapa-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: fatturapa-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 11.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for fatturapa-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7ad63dd1f7a8d0c7e362699ee99019fd00c3917de74e237c6a70515efea820cb
MD5 1072dc6438edd2dc24b715cb274b7bde
BLAKE2b-256 801dbc8dd45abbad1374cffbe7755280c4c7b7f4e8cef8440cf46cc407896e55

See more details on using hashes here.

Provenance

The following attestation bundles were made for fatturapa-0.2.0-py3-none-any.whl:

Publisher: publish.yml on azuki-beans/fatturapa

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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