¿Qué significa que los registros sean inalterables?
No puedes borrar ni modificar facturas sin dejar rastro...
¿Qué son los registros inalterables?
Un registro inalterable es un apunte digital que documenta cada operación de facturación (creación, anulación, sustitución o envío de una factura) de tal forma que, una vez creado, es técnicamente imposible modificarlo sin que la modificación quede al descubierto.
La inalterabilidad no se consigue guardando un PDF en una carpeta. Se consigue mediante técnicas criptográficas: concretamente, mediante funciones de hash (resumen criptográfico) y el encadenamiento secuencial de esos hashes. El RD 1007/2023 exige explícitamente que los sistemas de facturación implementen estos mecanismos.
¿Qué es una función hash? Explicación sencilla
Una función hash criptográfica toma cualquier cantidad de datos (texto, números, un fichero completo) y produce una cadena de caracteres de longitud fija, llamada huella digital o simplemente hash. Las propiedades fundamentales son:
- Determinista: los mismos datos siempre producen exactamente el mismo hash.
- Avalancha: cambiar un solo carácter de los datos de entrada cambia completamente el hash resultante. No hay forma de predecir el nuevo hash a partir del anterior.
- Irreversible: a partir del hash no se pueden recuperar los datos originales.
- Resistente a colisiones: es computacionalmente inviable encontrar dos documentos distintos con el mismo hash.
El estándar exigido por la Orden HAC/1177/2024 es SHA-256 (Secure Hash Algorithm 256 bits), que produce hashes de 64 caracteres hexadecimales. Actualmente, SHA-256 no tiene colisiones conocidas y se considera criptográficamente seguro.
El hash encadenado: la clave de la inalterabilidad
Un solo hash por factura no sería suficiente: alguien podría borrar una factura y recalcular su hash sin que se note. La solución es el encadenamiento: el hash de cada registro incluye en su cálculo el hash del registro anterior. Esto crea una cadena de dependencias donde:
- El registro N depende del N-1.
- El registro N-1 depende del N-2.
- … y así hasta el primer registro.
Si alguien modifica o borra el registro 47, su hash cambia. Pero el registro 48 ya fue calculado incluyendo el hash del 47 original, por lo que el hash del 48 ahora no concuerda con el recalculado del 47. Toda la cadena posterior se invalida.
"Fecha": "2025-03-15",
"Total": "1452.00",
"HashPrevio": "0000000000000000", // primer registro
"Hash": "a3f8c2e1d7b94..."
"Fecha": "2025-03-17",
"Total": "890.50",
"HashPrevio": "a3f8c2e1d7b94...", // = Hash de F-001
"Hash": "9bc34f12a8e71..."
"Fecha": "2025-03-18",
"Total": "2100.00",
"HashPrevio": "9bc34f12a8e71...", // = Hash de F-002
"Hash": "e52a9d3c7f041..."
¿Qué contiene cada registro de facturación?
La Orden HAC/1177/2024 especifica exactamente los campos que debe contener cada registro. Winfac implementa todos ellos:
Tipos de eventos registrados en el log
El log de auditoría no solo recoge la emisión de facturas. Debe documentar todos los eventos relevantes sobre cada registro de facturación:
Creación de una nueva factura. Es el evento más frecuente. Genera el registro con todos sus campos y calcula el hash encadenado.
Anulación de una factura previamente emitida. La factura anulada sigue en el log; se añade un nuevo registro de anulación que referencia a la original. No se borra nada.
Rectificación de una factura (factura rectificativa). Se genera un nuevo registro que sustituye al anterior, dejando ambos en el log con su relación indicada.
(Solo modalidad Veri*Factu) Confirmación de que el registro fue enviado a la AEAT y el acuse de recibo fue recibido. Incluye fecha/hora y resultado del envío.
Formato del log: JSONL y base de datos
La norma permite que los registros se almacenen en base de datos o en ficheros estructurados. Winfac utiliza una doble capa de almacenamiento:
Base de datos interna (Access/BD local)
Cada registro de facturación se almacena en una tabla protegida de la base de datos del sistema, junto con su hash y el hash del registro anterior. Esta tabla no es editable desde el interfaz de usuario del programa. El acceso está restringido a nivel de aplicación.
Fichero JSONL de auditoría
Simultáneamente, cada evento queda registrado en un fichero de texto en formato JSONL (JSON Lines: un objeto JSON por línea). Este formato es legible por humanos, importable por cualquier herramienta de análisis y exportable en segundos para entregarlo a la inspección fiscal.
Conservación: 4 años mínimo
El RD 1007/2023 establece que los registros de facturación deben conservarse durante al menos 4 años contados desde la fecha de expedición de la factura correspondiente. Sin embargo, por coherencia con la normativa contable y fiscal general (que exige conservar la documentación durante 5 años o el período de prescripción), la recomendación práctica es conservarlos durante 5 años.
Winfac organiza los registros por ejercicio fiscal. Al cerrar cada año, el log del ejercicio queda sellado y puede exportarse a un fichero JSONL archivado. Los registros no se pueden eliminar desde la interfaz del programa.
El código QR tributario
El RD exige que toda factura entregada al cliente (en papel o en PDF) incluya un código QR que permita verificarla. El QR codifica una URL con los parámetros básicos de la factura:
- NIF del emisor
- Número y serie de la factura
- Fecha de expedición
- Importe total
- Cuota de IVA
- Indicador de si es Veri*Factu o no
Al escanear el QR, el receptor puede acceder al servicio de cotejo de la AEAT (si es Veri*Factu) o a una verificación local. Esto permite a cualquier persona comprobar que la factura existe y no ha sido manipulada.
Factura emitida
Usuario registra la venta
Registro generado
Software crea campos normalizados
Hash calculado
SHA-256 sobre datos + hash previo
Log guardado
BD + JSONL, inalterable
QR en factura
URL de cotejo con parámetros
Envío AEAT
(Solo Veri*Factu)
Exportación y entrega a la inspección
Si la Agencia Tributaria solicita los registros de facturación en una inspección o requerimiento, el sistema debe ser capaz de exportarlos en el formato especificado por la Orden HAC/1177/2024. Winfac permite exportar:
- Por ejercicio fiscal: todos los registros del año seleccionado.
- Por rango de fechas: para requerimientos específicos.
- Formato JSONL: legible, verificable y conforme a la norma.
- Formato XML normalizado: para entrega directa a la AEAT si se requiere.
La exportación incluye automáticamente los hashes de verificación, permitiendo a la AEAT comprobar la integridad de la cadena sin necesidad de acceder al software original.