SAFTCheck

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.

Usamos um cookie de sessão para autenticação, um cookie de idioma para a preferência linguística e o Tawk.to para o widget de chat ao vivo (que define os seus próprios cookies quando abre o chat). O Google Analytics (GA4) só é carregado depois de aceitar, com anonimização de IP; sem rastreadores publicitários. Consulte a nossa Política de Privacidade.