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.
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.declaration
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.
encoding.bom
Validar NIF português: verificador grátis e regras Mod-11
Verifique qualquer NIF português na hora: 9 dígitos, prefixo válido e dígito de controlo Mod-11. E como funciona o algoritmo e os erros mais comuns.
nif.mod11
Formato do ATCUD: verificador grátis e regras desde 2023
Código único de documento obrigatório: código de validação com pelo menos 8 caracteres, hífen e número do documento. Inclui um verificador de ATCUD grátis.
atcud.format
Datas do cabeçalho: StartDate, EndDate, FiscalYear, DateCreated
Invariantes temporais que a AT impõe no bloco Header do SAF-T.
header.dates
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.
feature.inline-editor
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.
nif.vies
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.
invoice.date.out_of_range
Totais de bloco reconciliam com os documentos filhos
O NumberOfEntries conta todos os documentos (incluindo anulados); o TotalDebit e o TotalCredit têm de igualar os valores das linhas sem IVA, sem os documentos anulados, com tolerância de 0,01.
totals.reconciliation
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.currency.exchange
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.
invoice.status
Procura artigos mais aprofundados? Consulte o blog para fluxos completos de correção.