Skip to main content
LEFA implementa el sistema de registro de facturación exigido por la normativa española (Orden HAC/1177/2024 y Real Decreto de facturación) para los Sistemas Informáticos de Facturación (SIF). Cada factura emitida genera un registro encadenado mediante SHA-256, se almacena de forma inmutable en disco y lleva impreso un código QR tributario con la URL oficial de cotejo de la AEAT. Todo funciona de manera completamente local: no se envía ningún dato a la Agencia Tributaria salvo que se active expresamente el modo VeriFactu.

Módulos VeriFactu

El código de facturación se organiza en cuatro módulos dentro de lefa/verifactu/:

Cadena de hashes

La cadena VeriFactu es única e ininterrumpida para todo el sistema, independientemente de la serie de facturación. Una factura rectificativa (serie RECT) no enlaza con la rectificativa anterior, sino con la última factura emitida cronológicamente en el sistema, sea de la serie que sea. El orden de la cadena se determina por fecha de emisión y, ante igualdad de fecha, por ID de factura. No se filtra por serie en ningún momento. El payload que se firma con SHA-256 sigue este esquema estable:
Por ejemplo:
La emisión usa una transacción SQLite BEGIN IMMEDIATE que asigna el número correlativo y calcula el hash encadenado en el mismo commit, sin posibilidad de condiciones de carrera entre dos emisiones simultáneas.
El primer registro de la cadena (la primera factura emitida en el programa) tiene hash_anterior vacío (""). Esto es el comportamiento correcto: la cadena arranca desde cero.

QR tributario

Cada PDF de factura lleva impreso el código QR en la esquina inferior derecha a 35 × 35 mm, acompañado de la leyenda legal obligatoria.

URL de verificación

La URL sigue el formato oficial de la AEAT con los siguientes parámetros: En el modo actual (no VeriFactu) el endpoint es ValidarQRNoVerifactu. Cuando se active el modo VeriFactu, el endpoint pasa a ser ValidarQR y se añade el parámetro hash con los 64 caracteres hexadecimales en minúsculas. La constante VERIFACTU_URL_BASE en config.py almacena únicamente el dominio base:
El módulo qr.py añade el segmento de ruta /wlpl/TIKE-CONT/ y el nombre del endpoint al construir cada URL:

Modos de operación

La constante VERIFACTU_MODO_VERIFACTU en lefa/config.py controla el comportamiento del módulo:
LEFA opera actualmente en modalidad no VeriFactu. Esto es el comportamiento correcto y legal mientras la AEAT no haya habilitado el envío oficial obligatorio para todos los contribuyentes. El QR tributario, la cadena de hashes y los registros JSON se generan y conservan con independencia del modo activo.

Registros en disco

Cada factura emitida genera un fichero JSON en:
El nombre del fichero sigue el patrón {factura_id}_{numero_factura}.json, con las barras / sustituidas por guiones. Ejemplo:
El contenido recoge todos los campos del registro:
Las facturas rectificativas tienen "tipo": "rectificativa" y el campo factura_rectificada_id relleno con el ID de la factura original.
No elimine ni modifique los ficheros JSON de registros. La cadena de hashes es verificable: cualquier alteración o laguna en la secuencia rompe la integridad del registro y puede suponer un incumplimiento de la normativa de facturación. Si necesita liberar espacio o archivar registros, use siempre la función de exportación ZIP.

Exportar registros

Para generar un archivo ZIP con todos los registros (por ejemplo, para una auditoría o para conservar una copia en un soporte externo), use: Herramientas → Exportar registros VeriFactu… El ZIP resultante contiene:
  • Una carpeta registros/ con todos los ficheros JSON individuales.
  • Un fichero indice.json en la raíz con el array completo de todos los registros, para facilitar el procesamiento automatizado.
El nombre del ZIP por defecto es verifactu_export_YYYY-MM-DD.zip y se guarda en ~/.lefa/verifactu/.