Suplementos y descuentos en una factura UBL

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.

Dos niveles: factura y línea

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.

AllowanceCharge a nivel de factura

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:

CódigoTipoSignificado41DescuentoBonificación por pago anticipado42DescuentoDescuento de introducción60DescuentoDescuento de fabricante95DescuentoDescuento100DescuentoAcuerdo especialABLSuplementoGastos de embalajeFCSuplementoGastos de fleteAEWSuplementoSuplemento medioambiental

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.

Efecto en los totales de la factura

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.

AllowanceCharge a nivel de línea

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 LineExtensionAmount debe 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.

Cálculo del IVA con múltiples descuentos

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:

  1. Por línea de factura: el LineExtensionAmount (ya con los descuentos de línea aplicados)
  2. Por categoría de IVA: suma de todos los importes de línea de esa categoría
  3. Menos los descuentos a nivel de factura de esa misma categoría
  4. Más los suplementos a nivel de factura de esa misma categoría
  5. El resultado es el TaxableAmount en el TaxSubtotal

El 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.

Distribución proporcional con varios tipos de IVA

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.

AllowanceCharge a nivel de precio

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.

Descuento superior al precio del artículo

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.

Combinar con descuento por pronto pago

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

Relacionado