Huella VeriFactu

La cadena de huellas SHA-256 que exige VeriFactu, calculada en Python y sin una sola dependencia.

Librerías de código abierto · Python · Código publicado

El problema

Cada registro de facturación tiene que llevar la huella del anterior, de forma que alterar una factura vieja rompa todas las que vinieron después. Es un requisito corto y de él depende que un sistema entero sea conforme o no lo sea: si el orden de los campos o el formato de un importe no coinciden con lo que espera la Agencia, la huella sale distinta y no salta ningún error en ninguna parte.

Qué hace

  • Calcula la huella SHA-256 de un registro de facturación y mantiene la cadena que lo une al anterior.
  • Valida el registro contra la especificación de la Agencia Tributaria, versión 0.1.2.
  • Reproduce el vector de prueba oficial que publica la propia Agencia.
  • Trae una orden de consola para encadenar registros y para verificar una cadena ya escrita.

Lo que se decidió al construirlo

El vector oficial manda sobre el criterio propio
La Agencia publica un registro de ejemplo con su huella ya calculada, y la biblioteca lo reproduce como prueba. Es la diferencia entre «hemos leído la especificación y creemos que está bien» y «da exactamente lo que da la fuente». Una implementación de hash no se puede validar leyéndola: o coincide con el vector, o está mal y parece bien.
El alcance se queda en la huella, a propósito
No firma, no arma el XML, no envía y no guarda nada. Un paquete que prometiera las cinco cosas obligaría a confiar en las cinco, y la que de verdad no se puede tener mal es esta. Al dejarla sola se puede leer entera en una tarde y se puede sustituir sin tocar el resto del sistema.
Cero dependencias no es minimalismo: es superficie
Esto acaba dentro del sistema de facturación de alguien, que es donde una cadena de dependencias transitivas se convierte en un problema que no es suyo. Con la biblioteca estándar basta, así que se usa solo la biblioteca estándar, y el tipado va incluido para que el error salga al escribir y no en producción.

Hasta dónde llega

  • No firma electrónicamente. La firma XAdES que el envío exige la tiene que poner otro componente.
  • No construye el XML de facturación ni envía nada a la Agencia: entra un registro y sale una huella.
  • No guarda los registros. La conservación, que es una obligación aparte, corre por cuenta de quien la use.
  • No genera el código QR de la factura.
  • 0 dependencias
  • MIT licencia
  • 3.9+ Python

Construido con

  • Python
  • SHA-256
  • CLI

Respalda este servicio

Desarrollo de software y aplicaciones a medida

Leer el código