Diferencias de redondeo en facturas UBL

Prevenir y tratar correctamente las diferencias de redondeo en facturas UBL: PayableRoundingAmount, redondeo de IVA y precios con IVA incluido.

Uno de los mensajes de error más frustrantes al enviar e-facturas es una diferencia de redondeo. Los totales de IVA no coinciden con los importes de las líneas, o el total de la factura difiere en un céntimo respecto a la suma calculada. El resultado: la factura es rechazada durante la validación. Este artículo explica de dónde provienen las diferencias de redondeo y cómo prevenirlas o resolverlas.

¿Por qué surgen las diferencias de redondeo?

Las diferencias de redondeo surgen por la combinación de tres factores: la multiplicación, la división y el redondeo a dos decimales. Algunos ejemplos:

Precio unitario con muchos decimales. Un precio de 3,333... euros por unidad x 3 unidades = 9,999 euros. Redondeado, son 10,00 euros. Pero si primero redondea el precio unitario a 3,33 y luego multiplica: 3,33 x 3 = 9,99. Un céntimo de diferencia.

IVA por línea versus IVA por total. Si calcula el IVA por línea de factura y lo redondea, y después suma los resultados, la suma puede diferir del IVA calculado sobre el total. Con un 21 % de IVA sobre 33,33 euros, resultan 7,00 euros (redondeado). Pero un 21 % sobre 3 x 33,33 = 21 % sobre 99,99 = 21,00 euros. Mientras que 3 x 7,00 = 21,00 euros también. En este caso coincide, pero con otros importes no siempre es así.

Precios con IVA incluido. Algunos sectores (comercio minorista, hostelería) trabajan con precios con IVA incluido. El importe neto debe recalcularse, lo que introduce un momento de redondeo adicional.

Cómo gestiona UBL las diferencias de redondeo
PayableRoundingAmount

El estándar UBL dispone de un elemento especial para las diferencias de redondeo: PayableRoundingAmount en el bloque LegalMonetaryTotal. Este elemento absorbe las pequeñas diferencias de redondeo, de modo que el PayableAmount pueda ser un importe redondo:

<cac:LegalMonetaryTotal>
  <cbc:LineExtensionAmount currencyID="EUR">99.99</cbc:LineExtensionAmount>
  <cbc:TaxExclusiveAmount currencyID="EUR">99.99</cbc:TaxExclusiveAmount>
  <cbc:TaxInclusiveAmount currencyID="EUR">120.99</cbc:TaxInclusiveAmount>
  <cbc:PayableRoundingAmount currencyID="EUR">0.01</cbc:PayableRoundingAmount>
  <cbc:PayableAmount currencyID="EUR">121.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

La diferencia de 0,01 euros se menciona explícitamente. Las reglas de validación permiten un PayableRoundingAmount, siempre que la diferencia sea lo suficientemente pequeña (generalmente un máximo de 1 euro, dependiendo del perfil).

Redondeo de IVA por tipo

El cálculo del IVA en una factura UBL funciona por tipo de IVA, no por línea. Todos los importes de línea con el mismo tipo de IVA se suman para obtener la base imponible (TaxableAmount), y el IVA se calcula sobre ese total. Esto evita redondear por línea y obtener después una diferencia de redondeo acumulativa.

La fórmula es:

TaxableAmount = suma de LineExtensionAmount por categoría de IVA
              - AllowanceTotalAmount por categoría de IVA
              + ChargeTotalAmount por categoría de IVA

TaxAmount = TaxableAmount × Percent / 100 (redondeado a 2 decimales)

Importante: calcule siempre el IVA sobre la base imponible total por tipo, no por línea. El cálculo del IVA por línea es la causa más frecuente de las diferencias de redondeo.

Precios con IVA incluido

Cuando los precios incluyen IVA, el importe neto debe recalcularse. El enfoque estándar es:

  1. Calcular el importe neto por línea: bruto / (1 + porcentaje de IVA/100)
  2. Redondear a 2 decimales
  3. El LineExtensionAmount es este importe neto
  4. La diferencia entre la suma de todos los importes netos de las líneas y el total bruto menos el IVA puede generar una diferencia de redondeo
  5. Absorber esta diferencia con PayableRoundingAmount
<!-- Precio con IVA incluido: 12,10 € por unidad, 3 unidades -->
<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <cbc:InvoicedQuantity unitCode="EA">3</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="EUR">30.00</cbc:LineExtensionAmount>
  <cac:Price>
    <cbc:PriceAmount currencyID="EUR">10.00</cbc:PriceAmount>
  </cac:Price>
</cac:InvoiceLine>

En este ejemplo, el precio con IVA incluido es de 12,10 euros. El importe neto es de 10,00 euros por unidad (12,10 / 1,21). Multiplicado por 3 = 30,00 euros. IVA: 21 % de 30,00 = 6,30 euros. Total: 36,30 euros. Eso coincide exactamente con 3 x 12,10 euros. Pero con precios que no se dividen limpiamente, aparece una diferencia.

Cómo lo gestiona eConnect

eConnect valida cada factura en cuanto a su coherencia interna. Si una pequeña diferencia de redondeo se encuentra dentro de la tolerancia, la factura es aceptada. Para diferencias mayores, recibe un mensaje de error claro que indica dónde se encuentra la diferencia.

La función de reparación automática XML de eConnect puede en algunos casos añadir un PayableRoundingAmount faltante si la diferencia es inferior al umbral de tolerancia. Pero siempre es mejor gestionar el redondeo correctamente en su propio software.

Reglas prácticas
  1. Calcule el IVA por tipo, no por línea. Sume primero todos los importes de línea por tipo de IVA y luego calcule el IVA sobre ese total.
  2. Redondee lo más tarde posible. Trabaje internamente con más de dos decimales y redondee solo al rellenar los elementos XML.
  3. Use PayableRoundingAmount para el último céntimo. Si a pesar de un redondeo correcto queda una pequeña diferencia, absórbala con este elemento.
  4. Verifique la suma. TaxExclusiveAmount + TaxAmount debe ser igual a TaxInclusiveAmount. Y TaxInclusiveAmount menos PrepaidAmount más PayableRoundingAmount debe ser igual a PayableAmount.
  5. Pruebe con el validador de eConnect. Envíe su factura a través del validador antes de enviarla. Este verifica todas las reglas de cálculo.

Verifique su factura


Artículos relacionados