Facturae en Python

El XML de factura electrónica que la ley española da por obligatorio, generado desde Python.

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

El problema

El Real Decreto 238/2026, de 25 de marzo, lleva la factura electrónica entre empresas de opción a obligación. El formato no es un PDF ni un JSON: es un XML con una estructura fija, importes que tienen que cuadrar entre sí y campos que se rechazan si vienen con la forma equivocada. Escribirlo a mano funciona hasta la primera factura con dos tipos de IVA.

Qué hace

  • Genera el XML de Facturae a partir de los datos de la factura escritos como estructuras de Python.
  • Calcula los totales desde las líneas —cantidad por precio— en vez de aceptarlos dados.
  • Valida los datos que se rechazan al presentar: código postal español, país en alfa-2 y bloques de impuestos.
  • Falla cuando una clave viene mal escrita, en lugar de emitir un XML al que le falta ese campo.

Lo que se decidió al construirlo

Los totales se calculan; no se aceptan dados
Si quien llama pudiera pasar el total, tarde o temprano pasaría uno que no coincide con las líneas, y el XML resultante sería válido para el analizador y rechazado en destino. El total sale de las líneas siempre. Es menos flexible y es justo lo que se quiere: no hay forma de escribir una factura que no cuadre consigo misma.
Una clave mal escrita detiene el proceso
Un diccionario acepta cualquier clave, así que una errata no produce un error: produce un XML sin ese campo, que se ve bien y se rechaza semanas después. La biblioteca comprueba las claves y falla en el momento, que es cuando todavía hay alguien mirando.
Los importes van en decimal, no en coma flotante
El dinero en coma flotante produce el céntimo que no cuadra, y en una factura ese céntimo es un rechazo. Se usa el tipo decimal de la biblioteca estándar, que es exacto en base diez y es la razón por la que la biblioteca no necesita ninguna dependencia para hacer aritmética fiable.

Hasta dónde llega

  • El XML sale sin firmar. Facturae exige una firma XAdES antes de presentarlo en FACe, y esa firma no la pone esta biblioteca.
  • No valida contra el esquema oficial en tiempo de ejecución: comprueba lo que comprueba, y está escrito cuál es.
  • No envía nada. Generar el documento y presentarlo son dos problemas distintos y aquí solo está el primero.
  • No es asesoramiento fiscal ni legal. Qué hay que facturar y cuándo queda fuera del alcance.
  • 0 dependencias
  • MIT licencia
  • 3.9+ Python

Construido con

  • Python
  • ElementTree
  • decimal

Respalda este servicio

Desarrollo de software y aplicaciones a medida

Leer el código