SAFTCheck
← Blog
2026-05-11 · 6 min di lettura

Come validare un SAF-T (PT) prima di inviarlo all'AT

Una checklist pre-invio: codifica, BOM, NIF, ATCUD, date dell'header, intervallo di date per documento, totali di blocco, valuta e stato del documento — cosa intercetta l'AT in ingresso e come correggerlo prima del giorno 5.

Perché preconvalidare

Il portale dell'AT accetta il tuo file SAF-T. Oppure lo rifiuta con "ficheiro inválido". Non c'è via di mezzo né feedback utile. Se invii il giorno 5 alle 23:50 e il file rimbalza, hai dieci minuti per trovare il bug e riesportare dall'ERP. È il momento peggiore per scoprire che la numerazione delle fatture è stata azzerata, che la cifra di controllo del NIF è sbagliata o che la codifica si è corrotta.

La preconvalida chiude questo buco. Carichi il file su un validatore che esegue lo stesso XSD più le euristiche che l'AT applica realmente in ingresso — codifica, BOM, NIF Mod-11, formato ATCUD, date dell'header, totali dei documenti, tassi di cambio, coerenza dello stato dei documenti — e vedi ogni anomalia con numero di riga prima dell'AT.

Cosa convalidare, in ordine

  1. Codifica. La causa di rifiuto silenzioso più comune. L'AT richiede Windows-1252; la maggior parte degli ERP esporta UTF-8. Al parser XSD va bene; alla pipeline d'ingresso dell'AT no. Vedi la regola di codifica.
  2. BOM. Se il tuo ERP antepone un byte-order-mark UTF-8 prima di <?xml ?>, l'AT rifiuta. Idem per BOM UTF-16.
  3. Schema. L'XSD valida la forma strutturale: elementi obbligatori, tipi di attributo, valori di enumerazione. È ciò che l'AT esegue per primo. schema 1.04_01 è la versione attuale del SAF-T (PT) per la fatturazione mensile.
  4. NIF Mod-11. Ogni TaxRegistrationNumber e CustomerTaxID / SupplierTaxID deve avere una cifra di controllo portoghese valida e un prefisso ammesso. Vedi la regola NIF.
  5. Formato ATCUD. Otto alfanumerici maiuscoli, trattino, sequenza ≥ 1. Obbligatorio dal 2023.
  6. Date dell'header. StartDate < EndDate, FiscalYear corrisponde all'anno di StartDate, DateCreated >= EndDate, EndDate non nel futuro.
  7. Intervallo di date per documento. Ogni data di Invoice, Payment, WorkDocument, StockMovement deve cadere dentro la finestra dell'header.
  8. Totali di blocco. SalesInvoices.NumberOfEntries corrisponde al conteggio dei figli; TotalDebit + TotalCredit corrisponde alla somma dei GrossTotal, entro 0,01 €.
  9. Valuta. I documenti in valuta estera richiedono CurrencyCode + CurrencyAmount + ExchangeRate > 0. Tasso mancante è invisibile all'XSD; l'AT rifiuta in ingresso.
  10. Stato del documento. InvoiceStatus in {N, S, A, R, F}; InvoiceStatusDate >= InvoiceDate.

Cosa la preconvalida NON intercetta

Sii onesto con te stesso: un validatore può confermare che il file sia ben formato e coerente. Non può garantire che l'AT lo accetti. Due cose che non vede:

  • Regole di business lato AT che cambiano senza preavviso. L'AT a volte irrigidisce le regole d'ingresso senza aggiornare l'XSD pubblico. Monitor di modifiche dello schema e segnalazioni della community aiutano — ma a volte nuovi pattern di rifiuto compaiono prima nei reali invii.
  • Vincoli a livello di account. Finestra di invio già usata, contribuente in sospensione, registro del software certificato disallineato — nessuno di questi è un problema del file; sono problemi del contribuente.

Per la prima classe, i loop post-rifiuto contano ancora. Per la seconda, il tuo commercialista o il supporto dell'AT è il canale giusto.

Flusso per la scadenza del giorno 5

  1. Esporta il SAF-T mensile dall'ERP un giorno prima — idealmente il giorno 3 del mese successivo.
  2. Passalo per un preconvalidatore. Correggi ogni errore segnalato. Se scatta la regola di codifica, esegui l'auto-fix e riconvalida.
  3. Riesporta solo quando viene segnalato un problema strutturale. Rieseguire la preconvalida sullo stesso file rotto due volte dà la stessa risposta.
  4. Invia all'AT non appena il validatore restituisce pulito. Conserva il report PDF nella cartella dell'invio.

Pronto?

Carica il tuo SAF-T XML e vedi cosa l'AT rifiuterà — prima di inviarlo. Convalida ora →

Altri articoli

Usiamo un cookie di sessione per l'accesso, un cookie locale per la preferenza linguistica e Tawk.to per il widget di chat (che imposta i propri cookie quando apri la chat). Google Analytics (GA4) si carica solo dopo la tua accettazione, con anonimizzazione dell'IP; nessun tracker pubblicitario. Vedi la nostra Informativa sulla privacy.