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.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/entreunosyceros/lefa/llms.txt
Use this file to discover all available pages before exploring further.
Módulos VeriFactu
El código de facturación se organiza en cuatro módulos dentro delefa/verifactu/:
| Módulo | Responsabilidad |
|---|---|
hash.py | Cálculo del hash SHA-256 encadenado. La cadena es única e ininterrumpida para todas las series del programa (FACT, RECT, WEB, etc.). |
registro.py | Creación del registro inmutable al emitir la factura. Persiste un fichero JSON en disco y actualiza los campos verifactu_hash y verifactu_hash_anterior en la base de datos. |
qr.py | Construcción de la URL de cotejo AEAT, selección de la leyenda legal obligatoria y generación del PNG del QR (35 × 35 mm en el PDF). |
export.py | Exportación en ZIP de todos los registros JSON para auditoría o envío futuro a la AEAT. |
Cadena de hashes
La cadena VeriFactu es única e ininterrumpida para todo el sistema, independientemente de la serie de facturación. Una factura rectificativa (serieRECT) 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:
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:| Parámetro | Contenido | Ejemplo |
|---|---|---|
nif | NIF del emisor, en mayúsculas | B12345678 |
numserie | Número completo de la factura | FACT-2026-0042 |
fecha | Fecha de emisión en formato DD-MM-AAAA | 15-07-2026 |
importe | Importe total con punto decimal (dos decimales) | 1210.00 |
hash | Hash SHA-256 completo en minúsculas (solo en modo VeriFactu) | a3f8c2d1… |
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:
qr.py añade el segmento de ruta /wlpl/TIKE-CONT/ y el nombre del endpoint al construir cada URL:
Leyenda legal
| Modo | Leyenda impresa junto al QR |
|---|---|
| No VeriFactu (actual) | SISTEMA INFORMÁTICO NO VERIFICADO |
| VeriFactu (cuando se active) | VERI*FACTU |
Modos de operación
La constanteVERIFACTU_MODO_VERIFACTU en lefa/config.py controla el comportamiento del módulo:
| Valor | Modo | Leyenda QR | Endpoint AEAT |
|---|---|---|---|
False (predeterminado) | Sistema informático no verificado | SISTEMA INFORMÁTICO NO VERIFICADO | ValidarQRNoVerifactu |
True | VeriFactu (envío a AEAT) | VERI*FACTU | ValidarQR + parámetro hash |
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:{factura_id}_{numero_factura}.json, con las barras / sustituidas por guiones. Ejemplo:
"tipo": "rectificativa" y el campo factura_rectificada_id relleno con el ID de la factura original.
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.jsonen la raíz con el array completo de todos los registros, para facilitar el procesamiento automatizado.
verifactu_export_YYYY-MM-DD.zip y se guarda en ~/.lefa/verifactu/.