Salta ai contenuti

Italia — E-INVOICE IT (Unified API)

In Italia, fiskaly supporta l’invio di fatture elettroniche B2B e B2C e la ricezione di fatture elettroniche B2B. Attualmente supportiamo la Fattura standard (Fattura, TD01). Il supporto per la Fattura semplificata (Fattura semplificata, TD07) sarà presto disponibile.

La fatturazione elettronica è obbligatoria e disciplinata dall’Agenzia delle Entrate. Tutte le fatture B2B devono essere scambiate tramite l’SDI (Sistema di Interscambio) nel formato XML FatturaPA (Fattura elettronica) e sono obbligatorie per legge dal gennaio 2019. Le fatture devono inoltre essere conservate a lungo termine tramite archiviazione certificata (conservazione a norma).

Questa pagina illustra i requisiti specifici per l’Italia che completano la Guida all’integrazione generale passo dopo passo per l’onboarding di un Taxpayer ai fini della fatturazione elettronica.

fiskaly gestisce entrambe le direzioni dello scambio con l’SDI, che però funzionano in modo diverso:

Oltre a gestire entrambe le direzioni, fiskaly archivia automaticamente ogni fattura che invii e ricevi. Questo garantisce la conservazione certificata a lungo termine (conservazione a norma) per i 10 anni previsti dalla legge, senza alcuna configurazione da parte tua.

Questi requisiti si applicano a qualsiasi Taxpayer di cui esegui l’onboarding per la fatturazione elettronica in Italia — sia che tu invii, riceva o faccia entrambe le cose. Assicurati di avere a disposizione le seguenti informazioni sul Taxpayer prima di procedere.

Dati di registrazione specifici per l’Italia — trasmessi in content.fiscalization.registration:

  • company_idNumero Registro Imprese
  • office — sigla della provincia della Camera di Commercio che ha rilasciato il numero REA, es. MI, RM
  • entry — numero REA (6 o 7 cifre)
  • legal_form — forma giuridica dell’entità (es. LIMITED_LIABILITY_COMPANY, JOINT_STOCK_COMPANY)
  • capital — capitale sociale registrato in EUR (es. "10000.00")
  • shareholder_statusSOLE_SHAREHOLDER o MULTIPLE_SHAREHOLDERS
  • liquidation_statusIN_LIQUIDATION o NOT_IN_LIQUIDATION
  • tax_regime — facoltativo, ORDINARY (predefinito) o FLAT_RATE_SCHEME (Regime Forfettario)

Campi standard del Taxpayer — parte del Taxpayer stesso (condivisi con SIGN IT se lo utilizzi):

  • content.name — denominazione legale registrata dell’azienda o del soggetto
  • content.address — indirizzo legale registrato
  • content.address.regionProvincia (codice provincia, es. MI, RM); obbligatorio sul Taxpayer e validato al momento della messa in servizio

Invio di fatture elettroniche: requisiti del destinatario

Sezione intitolata “Invio di fatture elettroniche: requisiti del destinatario”

Per inviare una fattura elettronica indichi il destinatario e i suoi dati di routing direttamente nel Record della fattura. Quando crei la fattura (TRANSACTION::INVOICE) con createRecord, aggiungi il destinatario al suo array recipients. I campi da valorizzare dipendono da chi stai fatturando:

Ogni destinatario ha invoicing.type = SDI. Ciò che cambia tra i tre casi è l’identificazione, il codice destinatario e la presenza o meno di una PEC:

BusinessConsumatore in ItaliaConsumatore all’estero
typeBUSINESSCONSUMERCONSUMER
identificationVAT — validataTAXcodice fiscale, validatoqualsiasi tipo; non validato
invoicing.destination_codeil codice di 7 caratteri del destinatario, oppure "0000000" o "XXXXXXX""0000000""XXXXXXX"
invoicing.pecobbligatoria con "0000000"facoltativanon utilizzata
address.regionobbligatoria quando l’indirizzo è in Italiaobbligatorianon obbligatoria
nameragione socialegender, forename, surnamegender, forename, surname

Ogni destinatario business è di tipo BUSINESS con il blocco invoicing compilato, come spiega l’integrazione generale passo a passo. Oltre ai dati standard richiesti da ogni fattura elettronica (nome del destinatario, indirizzo, identificazione fiscale, righe della fattura e così via), l’Italia aggiunge i campi di routing SDI indicati sopra.

I valori che destination_code e pec assumono dipendono dal destinatario:

Scenariodestination_codepec
Il destinatario ha una casella SDI registratail suo codice di 7 caratteri (es. ABC1234)facoltativo
Il destinatario non è registrato all’SDI"0000000"obbligatorio
Il destinatario è fuori dall’Italia"XXXXXXX"non utilizzato

Quando il tuo cliente è una persona fisica e non un’azienda, imposta recipients[].type su CONSUMER. La fattura passa dall’SDI come documento FatturaPA (TD01), come una fattura B2B.

I consumatori non hanno una casella SDI, quindi il routing funziona in modo diverso. Il modo in cui identifichi il consumatore dipende dalla sua residenza in Italia:

  • Residente in Italia — identificato dal codice fiscale, instradato con il codice destinatario "0000000".
  • Fuori dall’Italia — non esiste alcun codice fiscale, quindi al suo posto subentra un identificativo estero e la fattura viene instradata con "XXXXXXX".

Oltre ai campi della tabella qui sopra, un destinatario consumatore riporta sempre name.gender, name.forename e name.surname, insieme al suo indirizzo.

Invia il codice fiscale come identificazione di tipo TAX (16 caratteri), l’indirizzo di residenza inclusa la region (Provincia) e il codice destinatario "0000000". Una pec può essere aggiunta, ma non è obbligatoria.

Un consumatore non residente in Italia non ha un codice fiscale: invia al suo posto un identificativo estero, di norma un numero fiscale o di partita IVA estero.

CampoValore
recipients[].identificationobbligatoria; VAT, TAX, PASSPORT, DOCUMENT o OTHER, a seconda dell’identificativo di cui disponi
recipients[].address.countryil Paese del consumatore come codice ISO 3166-1 alpha-2
recipients[].address.code"00000" — FatturaPA accetta solo un CAP di 5 cifre
recipients[].invoicing.destination_code"XXXXXXX"

L’identificativo viene trasmesso all’SDI come IdCodice; né fiskaly né l’SDI ne verificano la validità quando il Paese dell’indirizzo non è l’Italia. La region non è obbligatoria per un indirizzo non italiano.

Per un consumatore residente in Italia, l’SDI deposita la fattura originale nella sua area riservata sul portale AdE (Fatture e Corrispettivi).

Quando il cliente ha bisogno della fattura invece del documento commerciale

Sezione intitolata “Quando il cliente ha bisogno della fattura invece del documento commerciale”

L’Italia trasmette i due documenti su canali separati — il documento commerciale tramite i corrispettivi, la fattura tramite l’SDI — e nulla li collega automaticamente.

Raccogli la richiesta prima che la vendita venga chiusa. Quando il cliente ti comunica che ha bisogno di una fattura, emetti una TRANSACTION::INVOICE al posto di una TRANSACTION::RECEIPT. È il flusso che fiskaly supporta oggi da un capo all’altro, sia che il cliente lo chieda prima sia durante la vendita.

A differenza di una chiamata API sincrona, l’esito dell’SDI è asincrono. Dopo aver creato la fattura (TRANSACTION::INVOICE) con createRecord, interroga o resta in ascolto degli aggiornamenti sul Record E_INVOICE::TRANSMISSION per sapere se l’SDI l’ha accettata.

Tutti e tre i Record raggiungono il loro stato finale insieme:

RecordStato finale
E_INVOICE::TRANSMISSIONCOMPLETED o FAILED, mode=FINISHED
TRANSACTION::INVOICECOMPLETED o FAILED, mode=FINISHED
INTENTION::TRANSACTIONCOMPLETED o FAILED, mode=FINISHED

In caso di errore, il motivo del rifiuto dell’SDI è disponibile in logs[].message su tutti e tre i Record. Per maggiori dettagli, consulta How to check the status of an e-invoice sulla nostra pagina di supporto.

Gli errori possono verificarsi in tre fasi distinte, ciascuna con un comportamento diverso:

FaseQuandoComportamento
Validazione UAPI (sincrona)Payload non validoViene restituito immediatamente 4xx — nessun Record viene creato. Correggi il payload e riprova sullo stesso INTENTION::TRANSACTION.
Validazione pre-SDI (asincrona)La fattura viene rifiutata prima di raggiungere l’SDIL’intera catena raggiunge state=FAILED — è necessaria una nuova catena per riprovare.
Rifiuto dell’SDI (asincrono)L’SDI restituisce NSL’intera catena raggiunge state=FAILED — è necessaria una nuova catena per riprovare.

Se l’SDI restituisce NS (Notifica di Scarto), la fattura è giuridicamente inesistente:

  1. Leggi logs[].message su uno qualsiasi dei tre Record per ottenere il motivo del rifiuto dell’SDI
  2. Crea una nuova INTENTION::TRANSACTION e una nuova TRANSACTION::INVOICE con i dati corretti
  3. Lo stesso document.number può essere riutilizzato entro 5 giorni dal rifiuto NS
  4. La catena fallita rimane FAILED in modo permanente — viene conservata a fini di audit

Un System E_INVOICE_SERVICE può sia inviare che ricevere fatture elettroniche. La ricezione è facoltativa — un Taxpayer che si limita a inviare può saltare questa sezione.

Sono coinvolte due cose distinte e indipendenti:

  • Predisposizione alla ricezione — fiskaly la configura automaticamente quando metti in servizio il System.
  • Registrazione del codice destinatario SDI (manuale, a tua cura) — nel tuo portale dell’Agenzia delle Entrate (AdE), imposta il codice destinatario SDI di fiskaly JKKZDGR come destinazione SDI della tua azienda, in modo che l’SDI instradi le tue fatture in entrata verso fiskaly.

La risposta alla messa in servizio mostra compliance.state come TRANSMISSION_ONLY. Passa poi automaticamente a TRANSMISSION_RECEPTION una volta completata la registrazione del Taxpayer — cosa che normalmente avviene, indipendentemente dal fatto che tu abbia effettuato la registrazione presso l’AdE o intenda ricevere.

Chiama retrieveSystem in qualsiasi momento per leggere lo stato attuale di compliance.state, che riflette solo la predisposizione — non la registrazione presso l’AdE:

  • TRANSMISSION_RECEPTION — fiskaly ha configurato il System per la ricezione.
  • TRANSMISSION_ONLY — quella configurazione non è stata completata.

Non c’è nulla di aggiuntivo da configurare per l’instradamento: fiskaly abbina automaticamente ogni fattura in arrivo al Taxpayer corretto utilizzando il suo codice fiscale — motivo per cui ogni codice fiscale deve appartenere a un solo Taxpayer registrato. Non è necessario configurare o memorizzare un codice di instradamento separato.

Quando ti viene inviata una fattura tramite l’SDI, fiskaly la riceve automaticamente:

  • la consegna in entrata attiva un webhook
  • viene creato un record di ricezione per la fattura
  • l’XML firmato, il PDF e i metadati vengono archiviati insieme al record
  • le consegne duplicate vengono deduplicate

In pratica, la prima fattura che ti raggiunge in questo modo è anche la conferma che la ricezione è configurata correttamente.

La legge italiana richiede che le fatture elettroniche siano conservate a lungo termine tramite archiviazione digitale certificata (conservazione a norma): devono essere conservate per almeno 10 anni e memorizzate in modo che rimangano immutabili, autentiche e facilmente recuperabili, con firme digitali e marche temporali (marca temporale). Conservare una propria copia dell’XML non è sufficiente — fiskaly se ne occupa per te.

Per l’Italia, l’archiviazione è automatica e sempre attiva: ogni fattura che invii e ogni fattura che ricevi tramite l’SDI viene conservata legalmente, senza alcuna configurazione aggiuntiva o chiamata API da parte tua. Si basa unicamente sul codice fiscale italiano del Taxpayer, che fa già parte dell’onboarding. Ogni fattura conservata riceve una ricevuta di conservazione come prova della conservazione a norma. La conservazione si completa di solito in pochi secondi; la ricevuta stessa può richiedere alcuni minuti per essere emessa, dopodiché fiskaly la allega automaticamente — non è richiesto nulla da parte tua.

Recupera gli artefatti di una fattura elettronica dal suo record con retrieveRecord, selezionando l’artefatto tramite un parametro di query:

  • compliance-artifact — il documento con valore legale. Per l’Italia, l’XML FatturaPA validato dall’SDI.
  • archive-artifact — la ricevuta di conservazione che attesta la conservazione legale (conservazione a norma), disponibile come PDF leggibile e come XML firmato per uso di audit o legale.