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