AllowanceCharge en facturas UBL: la diferencia entre el nivel de factura y el nivel de línea, el cálculo del IVA y ejemplos XML.
Prácticamente toda organización trabaja con descuentos o suplementos en sus facturas. Un descuento por volumen, gastos de transporte, un descuento por reserva anticipada, costes medioambientales: son importes que influyen en el total final de la factura. En una factura UBL se registran mediante el elemento AllowanceCharge, y esto puede hacerse en dos niveles. La diferencia entre ambos niveles es esencial para que el cálculo de la factura sea correcto.
UBL contempla suplementos y descuentos en dos ubicaciones:
Nivel de factura: el elemento AllowanceCharge se encuentra directamente bajo el elemento raíz de la factura, antes de los totales de IVA. Los descuentos a nivel de factura reducen el importe total de la factura. Los suplementos a nivel de factura lo aumentan. Ambos se incluyen en el cálculo del IVA.
Nivel de línea: el elemento AllowanceCharge se encuentra dentro de un InvoiceLine. Los descuentos y suplementos a nivel de línea ya están incorporados en el LineExtensionAmount de esa línea. Influyen en el precio de la línea, no en el total de la factura como tal.
La diferencia es sutil pero importante. Un descuento a nivel de factura aparece por separado en los totales de la factura (en AllowanceTotalAmount). Un descuento a nivel de línea está incorporado en el importe de la línea y, por tanto, es invisible en los totales.
Cada descuento o suplemento a nivel de factura contiene como mínimo los siguientes elementos:
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Volumekorting Q1 2026</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">150.00</cbc:Amount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
El ChargeIndicator determina si se trata de un suplemento (true) o un descuento (false). El AllowanceChargeReasonCode es un código de la lista UNCL5189 (para descuentos) o UNCL7161 (para suplementos). Los códigos más utilizados son:
Consejo: si ninguno de los códigos estándar se ajusta exactamente, utilice el código 95 (descuento) o el código de suplemento más relevante, y describa el motivo en
AllowanceChargeReason.
Los descuentos y suplementos a nivel de factura se reflejan en el LegalMonetaryTotal:
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">1000.00</cbc:LineExtensionAmount>
<cbc:AllowanceTotalAmount currencyID="EUR">150.00</cbc:AllowanceTotalAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">850.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">1028.50</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="EUR">1028.50</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
El cálculo: 1.000 (total de líneas) menos 150 (descuento) = 850 sin IVA. Más 178,50 de IVA (21 % sobre 850) = 1.028,50 IVA incluido.
A nivel de línea, el funcionamiento es diferente. El descuento o suplemento ya está incorporado en el LineExtensionAmount. El elemento AllowanceCharge en la línea sirve como explicación:
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="EA">100</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">850.00</cbc:LineExtensionAmount>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Staffelkorting</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">150.00</cbc:Amount>
<cbc:BaseAmount currencyID="EUR">1000.00</cbc:BaseAmount>
</cac:AllowanceCharge>
<cac:Item>
<cbc:Name>Widget standaard</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">8.50</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
El LineExtensionAmount es aquí 850 euros: 100 unidades x 10 euros = 1.000 euros, menos 150 euros de descuento por volumen. El BaseAmount en el AllowanceCharge muestra el importe original antes del descuento. El PriceAmount (8,50) es el precio efectivo por unidad tras el descuento.
Atención: el
LineExtensionAmountdebe ser siempre el importe neto tras descuento/suplemento. El AllowanceCharge en la línea es informativo. No lo deduzca de nuevo del importe de la línea, ya que la factura dejaría de ser correcta.
Cuando una factura contiene tanto descuentos a nivel de línea como descuentos a nivel de factura, las bases imponibles del IVA se calculan de la siguiente manera:
LineExtensionAmount (ya con los descuentos de línea aplicados)TaxableAmount en el TaxSubtotalEl IVA se calcula sobre esa base neta. Por eso es esencial que cada descuento y suplemento a nivel de factura incluya una categoría de IVA: el sistema necesita saber a qué tipo impositivo corresponde el descuento.
Cuando un AllowanceCharge a nivel de documento se aplica a una factura con líneas de distintos tipos de IVA (por ejemplo, 9 % y 21 %), el importe del descuento o suplemento debe distribuirse proporcionalmente entre las categorías de IVA. Esto significa: en proporción a la participación de cada categoría en el total de los importes imponibles.
Supongamos que una factura contiene 2.000 euros en líneas con 21 % de IVA y 1.000 euros en líneas con 9 % de IVA. Un descuento a nivel de factura de 300 euros debe registrarse como dos elementos AllowanceCharge independientes: 200 euros al 21 % (dos tercios) y 100 euros al 9 % (un tercio). La base imponible por categoría se calcula entonces correctamente.
Además de los niveles de factura y línea, UBL prevé un tercer lugar para los descuentos: dentro del elemento Price de una línea de factura. Este mecanismo muestra la diferencia entre el precio bruto y el precio unitario neto.
<cac:Price>
<cbc:PriceAmount currencyID="EUR">8.50</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="EA">1</cbc:BaseQuantity>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:Amount currencyID="EUR">1.50</cbc:Amount>
<cbc:BaseAmount currencyID="EUR">10.00</cbc:BaseAmount>
</cac:AllowanceCharge>
</cac:Price>
En este ejemplo, el precio bruto (BaseAmount) es de 10,00 euros. Tras deducir 1,50 euros de descuento, queda el precio unitario neto (PriceAmount) de 8,50 euros.
A nivel de precio, solo se permite ChargeIndicator=false (descuento). Los suplementos (ChargeIndicator=true) no son posibles a este nivel. Además, se aplica la regla de validación BR-28: el precio bruto (BaseAmount) no puede ser negativo. Si desea aplicar un suplemento sobre el precio unitario, inclúyalo como AllowanceCharge a nivel de línea o indique directamente el precio incrementado como PriceAmount.
Un caso especial se presenta cuando un descuento a nivel de línea (AllowanceCharge en la línea) supera el precio del artículo. La regla de validación Peppol R120 verifica si LineExtensionAmount = (Quantity × PriceAmount ÷ BaseQuantity) + recargos − descuentos. R120 no prohíbe explícitamente los importes negativos; la validación falla cuando este cálculo no cuadra. Cuando el descuento supera el precio, es muy probable que el cálculo no sea correcto.
Este escenario se da en la práctica con notas de crédito que incluyen descuentos elevados. La solución: utilice directamente el importe neto del abono (la diferencia entre el precio y el descuento) como PriceAmount y omita el elemento AllowanceCharge en la línea. El precio original y el descuento aplicado pueden indicarse a modo de referencia en el campo Item/Name o en un elemento Note en la línea de factura.
Atención: esta solución alternativa está destinada a situaciones en las que el descuento supera el precio. Para descuentos ordinarios que se mantienen por debajo del precio, utilice normalmente el elemento AllowanceCharge en la línea.
El descuento por pronto pago (skonto) es algo completamente diferente a un descuento en factura. Un descuento en factura mediante AllowanceCharge es incondicional y reduce directamente el importe de la factura. El descuento por pronto pago es condicional (depende del plazo de pago) y no se incorpora en el importe de la factura. Consulte el artículo sobre descuento por pronto pago para más detalles.
Consejo: si no está seguro de que su AllowanceCharge esté correctamente incorporado, envíe la factura al validador eConnect gratuito. Este comprueba que las bases imponibles del IVA se calculen correctamente tras la deducción de descuentos y suplementos.
Valide su factura