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.

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.