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.1.0.tar.gz (11.8 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.1.0-py3-none-any.whl (11.2 kB view details)

Uploaded Python 3

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

Hashes for fatturapa-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0c5c0fef5cc4cc6d9b5bbd2c523851d505a1fd5c28e80c0b95a1feae9b3a8a0d
MD5 a52cd1d64a1811598e319fa343c395d8
BLAKE2b-256 8a1089c29576c2e121ad9466aaecf07ebf36d7e831de488c0e3b7b7b1affda22

See more details on using hashes here.

Provenance

The following attestation bundles were made for fatturapa-0.1.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.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

Hashes for fatturapa-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 feccfca49f4cb4aad014419796e7a46bc682d6952978171a14203c2bbe8fd255
MD5 4776f6d9f7cd33c0928c6328dbe648ba
BLAKE2b-256 b4f871f398f89802a4015ae6aecd25c7a7b5901b6f10d8a22db6a2f8f941d948

See more details on using hashes here.

Provenance

The following attestation bundles were made for fatturapa-0.1.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