Saltar al contenido principal
EN 16931 · líneas

Error UBL-SR-48: una línea de la factura con dos impuestos o sin ninguno

En la factura electrónica europea cada línea lleva una categoría de IVA, y solo una. En Odoo una línea puede tener varios impuestos o ninguno, así que el choque es frecuente: es UBL-SR-48 en el fichero, y Odoo lo para antes de generarlo con su propio aviso. En el mismo grupo están BR-CO-04, BR-25 y BR-16.

FlexigoTech · Responsable: Víctor Gómez · Actualizado el 4 de noviembre de 2026

Lo esencial

Versiones
Odoo 17, 18, 19 y 20
Comprobado
en el código del módulo, versión 17.0 y 20.0 · en las fuentes enlazadas al final
Lectura
3 min

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.
Tarjeta de la regla UBL-SR-48 de EN 16931
Una categoría de IVA por línea (BT-151), con BR-CO-04, BR-25 y BR-16.

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 OdooQué hacer
Línea sin impuesto, por ejemplo un gasto repercutidoPonle el impuesto que corresponda, también si es del 0 % o exento.
Dos impuestos de IVA en la misma líneaDeja uno: si son dos tipos distintos, parte la línea en dos.
IVA más un recargo o retención en la líneaRevisa 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ónEscribe 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.

Factura de Odoo 20 con la pestaña XRechnung / ZUGFeRD del módulo
Resultado de la validación y Ready to send en la factura. Captura de Odoo 20 con datos de demostración; el informe de la captura es de prueba.

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

  1. Lee el aviso: dice si es el impuesto o el nombre de la línea.
  2. Abre la factura en borrador y revisa la columna de impuestos línea a línea.
  3. Corrige, publica y genera el fichero de nuevo.

Sigue leyendo

Errores BR-E-10, BR-AE-10, BR-IC-10 y BR-G-10: el motivo de exención del IVABR-E-10, BR-AE-10, BR-IC-10, BR-G-10 y BR-O-10 piden el motivo de exención; BR-S-10 y BR-Z-10 lo prohíben. Cómo lo decide Odoo 17, 18, 19 y 20 y dónde se cambia.Error BR-CL-23: la unidad de medida de la línea no es un código UN/ECEBR-CL-23 exige códigos UN/ECE para la unidad de cada línea, BR-23 que la haya y Peppol R130 que coincida con la del precio. De dónde la saca Odoo 17, 18, 19 y 20.Error BR-CO-15 en la factura electrónica: el total con IVA no es base más IVABR-CO-15, BR-CO-14, BR-CO-16 y BR-CO-17 comprueban que los totales de la factura electrónica cuadren. Qué suma cada una y cuáles fallan por un céntimo.
Comprobado en el código del módulo (versión 17.0 y 20.0) y en las fuentes enlazadas

Fuentes