SAFTCheck

header.dates

Datas do cabeçalho: StartDate, EndDate, FiscalYear, DateCreated

Invariantes temporais que a AT impõe no bloco Header do SAF-T.

O que a AT verifica

O bloco Header do ficheiro SAF-T descreve o período que o ficheiro cobre e quando foi gerado. A AT impõe algumas invariantes sobre estas datas:

CampoRestrição
StartDateA primeira data coberta pelo ficheiro.
EndDateNão pode ser anterior a StartDate (um período de um só dia é válido).
FiscalYearO ano de StartDate, ou o ano anterior quando o ano fiscal não coincide com o ano civil (por exemplo, de fevereiro a janeiro).
DateCreatedDeve ser igual ou posterior a EndDate: não se pode gerar um ficheiro antes do fim do período que cobre.

Um exemplo correto

O ficheiro mensal de faturação de setembro de 2026, gerado a 3 de outubro por uma empresa cujo ano fiscal coincide com o ano civil:

<Header>
  ...
  <FiscalYear>2026</FiscalYear>
  <StartDate>2026-09-01</StartDate>
  <EndDate>2026-09-30</EndDate>
  ...
  <DateCreated>2026-10-03</DateCreated>
  ...
</Header>

Todas as datas usam o formato YYYY-MM-DD. Para uma empresa cujo ano fiscal vai de abril a março, o ficheiro de janeiro de 2027 continuaria a indicar FiscalYear 2026, e o SAFTCheck assinala isso como informação e não como erro.

As datas do cabeçalho definem também o período em que todos os documentos do ficheiro se devem enquadrar: consulte documentos fora do período do cabeçalho.

Sub-regras que o SAFTCheck aplica

  • header.dates.range: dispara quando StartDate é posterior a EndDate.
  • header.dates.fiscal_year_previous: o FiscalYear é o ano anterior ao de StartDate: correto num ano fiscal que não coincide com o ano civil, um erro nos restantes casos (informação).
  • header.dates.fiscal_year_mismatch: o FiscalYear é qualquer outro ano (aviso).
  • header.dates.created_before_end: dispara quando DateCreated < EndDate (aviso; a AT ainda pode aceitar).
  • header.dates.future_end: dispara quando EndDate está no futuro (aviso).

Erros comuns

  • Mudança de ano. Um ficheiro de janeiro com FiscalYear=2025 mas StartDate=2026-01-01, de uma empresa cujo ano fiscal coincide com o ano civil. O ERP mudou o ano num campo mas não no outro.
  • Unidade de período errada. Submeter um trimestre quando a AT espera um mês, ou vice-versa. As datas declaram a unidade; o desencontro com a janela de submissão é uma verificação separada do lado da AT.
  • DateCreated definido em testes. Ficheiros exportados durante a configuração do ERP trazem por vezes uma DateCreated no passado ou no futuro em relação ao momento em que foram efetivamente gerados.

Como corrigir

  1. Verifique a seleção do período de exportação no ERP: a maioria dos problemas vem de escolher o mês de início/fim errado.
  2. Se as datas estão certas e só o FiscalYear está mal, edite a definição de ano fiscal da empresa no ERP e volte a exportar. Para submissões pontuais, o editor inline consegue corrigir FiscalYear diretamente na página do resultado da validação.
  3. Se DateCreated está no futuro ou antes de EndDate, corrija o relógio do sistema do ERP e volte a exportar, ou use o editor inline para o ficheiro imediato.

O aviso combinado header.dates.range (StartDate vs EndDate) não é editável como campo único: corrija StartDate ou EndDate individualmente com o editor inline, ou volte a exportar.

Relacionado

Outras regras