SAFTCheck

header.dates

Fechas de la cabecera: StartDate, EndDate, FiscalYear, DateCreated

Invariantes temporales que la AT impone sobre el bloque Header del SAF-T.

Qué comprueba la AT

El bloque Header del fichero SAF-T describe el periodo que cubre el fichero y cuándo se generó. La AT impone unas cuantas invariantes sobre estas fechas:

CampoRestricción
StartDateLa primera fecha que cubre el fichero.
EndDateNo puede ser anterior a StartDate (un periodo de un solo día es válido).
FiscalYearEl año de StartDate, o el año anterior cuando el ejercicio no coincide con el año natural (por ejemplo, de febrero a enero).
DateCreatedDebe ser igual o posterior a EndDate: no se puede generar un fichero antes de que termine el periodo que cubre.

Un ejemplo correcto

El fichero mensual de facturación de septiembre de 2026, generado el 3 de octubre por una empresa cuyo ejercicio coincide con el año natural:

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

Todas las fechas usan el formato YYYY-MM-DD. En una empresa cuyo ejercicio va de abril a marzo, el fichero de enero de 2027 seguiría indicando FiscalYear 2026, y SAFTCheck lo señala como información, no como error.

Las fechas del Header también fijan el periodo en el que debe caer cada documento del fichero: consulta documentos fuera del periodo del Header.

Subreglas que aplica SAFTCheck

  • header.dates.range: se dispara cuando StartDate es posterior a EndDate.
  • header.dates.fiscal_year_previous: FiscalYear es el año anterior al de StartDate; correcto en un ejercicio que no coincide con el año natural, un error en los demás casos (información).
  • header.dates.fiscal_year_mismatch: FiscalYear es cualquier otro año (aviso).
  • header.dates.created_before_end: se dispara cuando DateCreated < EndDate (aviso; la AT todavía puede aceptarlo).
  • header.dates.future_end: se dispara cuando EndDate está en el futuro (aviso).

Errores comunes

  • Cambio de año. Un fichero de enero con FiscalYear=2025 pero StartDate=2026-01-01, de una empresa cuyo ejercicio coincide con el año natural. El ERP cambió el año en un campo pero no en el otro.
  • Unidad de periodo incorrecta. Enviar un trimestre cuando la AT espera un mes, o al revés. Las fechas declaran la unidad; la incoherencia con la ventana de envío es otra comprobación del lado de la AT.
  • DateCreated establecida en pruebas. Los ficheros exportados durante la configuración del ERP a veces traen una DateCreated en el pasado o en el futuro respecto al momento real de generación.

Cómo corregir

  1. Revisa la selección del periodo de exportación en el ERP: la mayoría de los problemas vienen de elegir el mes de inicio/fin equivocado.
  2. Si las fechas están bien y solo FiscalYear está mal, edita el ajuste de año fiscal de la empresa en el ERP y vuelve a exportar. Para envíos puntuales, el editor en línea puede corregir FiscalYear directamente en la página del resultado de la validación.
  3. Si DateCreated está en el futuro o antes de EndDate, ajusta el reloj del sistema del ERP y vuelve a exportar, o usa el editor en línea para el fichero inmediato.

El hallazgo combinado header.dates.range (StartDate frente a EndDate) no se puede editar como un único campo: corrige StartDate o EndDate por separado con el editor en línea, o vuelve a exportar.

Relacionado

Otras reglas