Lo que dice cada regla
Las cuatro son fatales en el Schematron de EN 16931 (validation-1.3.17):
- UBL-SR-48
- «Invoice lines shall have one and only one classified tax category.» Es una regla de la sintaxis UBL: una línea, una categoría.
- BR-CO-04
- «Each Invoice line (BG-25) shall be categorized with an Invoiced item VAT category code (BT-151).» La otra cara: ninguna línea sin categoría.
- BR-25
- «Each Invoice line (BG-25) shall contain the Item name (BT-153).» Cada línea con nombre.
- BR-16
- «An Invoice shall have at least one Invoice line (BG-25)» Al menos una línea.

El aviso de Odoo
Odoo no espera al validador. Antes de generar el UBL recorre las líneas y, si una no tiene exactamente un impuesto, para con: «Each invoice line shall have one and only one tax.» Pasa en las cuatro versiones, con un matiz:
- Odoo 17: cuenta los impuestos de la línea dejando fuera los de importe fijo, como las ecotasas; tiene que quedar uno.
- Odoo 18, 19 y 20: cuenta las categorías de impuesto que van a escribirse en la línea del fichero; tiene que haber una.
En el mismo paso comprueba BR-25: una línea sin producto ni descripción para con «Each invoice line should have a product or a label.»
Los casos que lo provocan
| Caso en Odoo | Qué hacer |
|---|---|
| Línea sin impuesto, por ejemplo un gasto repercutido | Ponle el impuesto que corresponda, también si es del 0 % o exento. |
| Dos impuestos de IVA en la misma línea | Deja uno: si son dos tipos distintos, parte la línea en dos. |
| IVA más un recargo o retención en la línea | Revisa si ese segundo impuesto debe ir en la factura electrónica como impuesto o de otra forma; lo correcto depende de tu país. |
| Línea de texto sin producto ni descripción | Escribe la descripción o conviértela en nota. |
Las secciones y notas de Odoo no cuentan como líneas, así que no provocan el aviso.
Con nuestro módulo XRechnung y ZUGFeRD
El módulo genera el XML con su propio código y no hace la comprobación de Odoo: una línea sin impuesto o con dos llega al fichero tal cual. Lo hemos comprobado con el validador de KoSIT:
- Línea sin impuesto: sale sin categoría de IVA. En XRechnung UBL da UBL-SR-48, BR-CO-04 y BR-Z-08; en XRechnung CII, el formato por defecto del módulo, BR-CO-04, BR-Z-01 y BR-Z-08.
- Línea con dos impuestos: en UBL solo se escribe el primero con porcentaje, pero el total con IVA lleva los dos, y salta BR-CO-15. En CII van los dos en la línea y el IVA total no cuadra con el desglose, y salta BR-CO-14.
- Línea con un impuesto del 0 %: en UBL sale como Z y KoSIT la acepta. En CII sale como S, y KoSIT da BR-S-05, además de BR-Z-01 y BR-Z-08.
Revisa los impuestos de cada línea antes de generar.

En Odoo 18, 19 y 20, con la suscripción a FlexigoTech Cloud, cada XRechnung y cada ZUGFeRD EN 16931 se valida con las reglas de KoSIT y las reglas que fallen quedan en Validation Errors. En Odoo 17 la versión publicada no valida: estos ficheros salen sin aviso.
Pasos
- Lee el aviso: dice si es el impuesto o el nombre de la línea.
- Abre la factura en borrador y revisa la columna de impuestos línea a línea.
- Corrige, publica y genera el fichero de nuevo.
Sigue leyendo
Comprobado en el código del módulo (versión 17.0 y 20.0) y en las fuentes enlazadas
Fuentes
- Código del módulo: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/ubl_generator.py
- Código del módulo: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/cii_generator.py
- Código del módulo: flexigo_germany_xrechnung 20.0 (446f2f68): models/res_company.py
- github.com/odoo/odoo/blob/6f00fdadb875342de2d14a179f25431f93cd63c9/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/4d2d4b5895db70596863df941d9a1f0beeb117f8/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/6f00fdadb875342de2d14a179f25431f93cd63c9/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/4d2d4b5895db70596863df941d9a1f0beeb117f8/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/account_edi_ubl_
- Código del módulo: flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_cloud.py
- Código del módulo: flexigo_germany_xrechnung 17.0 (ad05de8f): __manifest__.py
- github.com/ConnectingEurope/eInvoicing-EN16931/releases/tag/validation-1.3.17
