Referência de regras de validação
Cada regra que o SAFTCheck aplica ao seu SAF-T (PT) XML, em linguagem simples. Cada página explica o que a AT exige, as falhas mais comuns e como corrigir.
encoding.declaration
Declaração de codificação XML (Windows-1252)
A AT exige a codificação Windows-1252. Declarações UTF-8 são rejeitadas silenciosamente.
encoding.bom
Byte Order Mark (BOM) no início do ficheiro
A AT rejeita ficheiros SAF-T que começam com um BOM UTF-8 ou UTF-16.
nif.mod11
NIF português — algoritmo Mod-11 e prefixos
Número de identificação fiscal português de 9 dígitos; dígito de controlo calculado por Mod-11 com pesos 9..2.
atcud.format
Formato ATCUD — VALIDAÇÃO-SEQUÊNCIA desde 2023
Código único de documento obrigatório: 8 caracteres alfanuméricos maiúsculos, hífen, sequência ≥ 1.
header.dates
Datas do cabeçalho — StartDate, EndDate, FiscalYear, DateCreated
Invariantes temporais que a AT impõe no bloco Header do SAF-T.
feature.inline-editor
Editor inline — corrigir NIF, ATCUD e datas do cabeçalho no próprio sítio
Edite o valor problemático junto ao aviso, revalide de imediato, sem voltar a exportar do ERP.
nif.vies
Cruzamento VIES — NIF registado no sistema de IVA da UE
O NIF do cabeçalho é verificado contra o serviço VIES da UE e o nome registado é comparado com o CompanyName do SAF-T.
invoice.date.out_of_range
Data do documento dentro da janela de reporte do cabeçalho
Cada data de Invoice / Payment / WorkDocument / StockMovement deve cair dentro de Header.StartDate – Header.EndDate.
totals.reconciliation
Totais de bloco reconciliam com os documentos filhos
NumberOfEntries e TotalDebit+TotalCredit de cada secção devem corresponder aos documentos por baixo, dentro de 0,01 €.
invoice.currency.exchange
Documentos em moeda estrangeira precisam de um bloco <Currency> completo
Quando um documento declara uma moeda não-EUR, CurrencyCode + CurrencyAmount + ExchangeRate têm de estar todos presentes.
invoice.status
Consistência entre código de estado e data da fatura
InvoiceStatus tem de ser um de N/S/A/R/F e InvoiceStatusDate tem de ser >= InvoiceDate.
Procura artigos mais aprofundados? Consulte o blog para fluxos completos de correção.