Referencia de reglas de validación
Cada regla que SAFTCheck aplica a tu SAF-T (PT) XML, en lenguaje claro. Cada página cubre lo que la AT exige, los fallos más habituales y cómo corregirlo.
Declaración de codificación XML (Windows-1252)
La AT exige la codificación Windows-1252. Las declaraciones UTF-8 se rechazan silenciosamente.
encoding.declaration
Byte Order Mark (BOM) al inicio del fichero
La AT rechaza los ficheros SAF-T que empiezan por un BOM UTF-8 o UTF-16.
encoding.bom
Validar NIF portugués: comprobador gratuito y reglas Mod-11
Comprueba al instante cualquier NIF portugués: 9 dígitos, prefijo válido y dígito de control Mod-11. Además, cómo funciona el algoritmo y los errores más comunes.
nif.mod11
Formato del ATCUD: comprobador gratuito y reglas desde 2023
Código único de documento obligatorio: código de validación de al menos 8 caracteres, guion y número del documento. Incluye un comprobador de ATCUD gratuito.
atcud.format
Fechas de la cabecera: StartDate, EndDate, FiscalYear, DateCreated
Invariantes temporales que la AT impone sobre el bloque Header del SAF-T.
header.dates
Editor en línea: corrige NIF, ATCUD y fechas de la cabecera al vuelo
Edita el valor problemático junto al aviso, revalida al instante, sin volver a exportar desde el ERP.
feature.inline-editor
Comprobación VIES: NIF registrado en el sistema de IVA de la UE
El NIF de la cabecera se verifica contra el servicio VIES de la UE y el nombre registrado se compara con CompanyName del SAF-T.
nif.vies
Fecha del documento dentro de la ventana de reporte de la cabecera
Cada fecha de Invoice / Payment / WorkDocument / StockMovement debe estar dentro de Header.StartDate – Header.EndDate.
invoice.date.out_of_range
Los totales de bloque cuadran con los documentos hijos
NumberOfEntries cuenta todos los documentos (anulados incluidos); TotalDebit y TotalCredit deben igualar los importes de las líneas sin IVA, sin los documentos anulados, con tolerancia de 0,01.
totals.reconciliation
Los documentos en moneda extranjera necesitan un bloque <Currency> completo
Cuando un documento declara una moneda distinta del EUR, CurrencyCode + CurrencyAmount + ExchangeRate deben estar todos presentes.
invoice.currency.exchange
Coherencia entre código de estado y fecha de la factura
InvoiceStatus debe ser uno de N/S/A/R/F y InvoiceStatusDate debe ser >= InvoiceDate.
invoice.status
¿Buscas artículos más profundos? Consulta el blog para flujos completos de corrección.