AllowanceCharge dans les factures UBL : la différence entre le niveau facture et le niveau ligne, le calcul de la TVA et des exemples XML.
Pratiquement chaque organisation travaille avec des remises ou des suppléments sur ses factures. Une remise de volume, des frais de transport, une remise pour réservation anticipée, des frais environnementaux : ce sont autant de montants qui influencent le total final de la facture. Dans une facture UBL, ils sont enregistrés via l'élément AllowanceCharge, et ce à deux niveaux. La différence entre ces niveaux est essentielle pour que le calcul de la facture reste cohérent.
UBL prévoit des suppléments et des remises à deux endroits :
Niveau facture : l'élément AllowanceCharge se trouve directement sous l'élément racine de la facture, avant les totaux de TVA. Les remises au niveau facture diminuent le montant total de la facture. Les suppléments au niveau facture l'augmentent. Ils sont pris en compte dans le calcul de la TVA.
Niveau ligne : l'élément AllowanceCharge se trouve au sein d'un InvoiceLine. Les remises et suppléments au niveau ligne sont déjà intégrés dans le LineExtensionAmount de cette ligne. Ils influencent le prix de la ligne, pas le total de la facture en tant que tel.
La différence est subtile mais importante. Une remise au niveau facture apparaît séparément dans les totaux de la facture (dans AllowanceTotalAmount). Une remise au niveau ligne est intégrée dans le montant de la ligne et donc invisible dans les totaux.
Chaque remise ou supplément au niveau facture contient au minimum les éléments suivants :
<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>
Le ChargeIndicator détermine s'il s'agit d'un supplément (true) ou d'une remise (false). Le AllowanceChargeReasonCode est un code issu de la liste UNCL5189 (pour les remises) ou UNCL7161 (pour les suppléments). Les codes les plus utilisés sont :
Conseil : si aucun des codes standard ne correspond exactement, utilisez le code 95 (remise) ou le code de supplément le plus pertinent, et décrivez la raison dans
AllowanceChargeReason.
Les remises et suppléments au niveau facture se retrouvent dans le 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>
Le calcul : 1 000 (total des lignes) moins 150 (remise) = 850 hors TVA. Plus 178,50 de TVA (21 % de 850) = 1 028,50 TVA comprise.
Au niveau ligne, le fonctionnement est différent. La remise ou le supplément est déjà intégré dans le LineExtensionAmount. L'élément AllowanceCharge sur la ligne sert d'explication :
<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>
Le LineExtensionAmount est ici de 850 euros : 100 unités x 10 euros = 1 000 euros, moins 150 euros de remise sur volume. Le BaseAmount dans l'AllowanceCharge indique le montant initial avant remise. Le PriceAmount (8,50) est le prix effectif par unité après remise.
Attention : le
LineExtensionAmountdoit toujours être le montant net après remise/supplément. L'AllowanceCharge sur la ligne est informatif. Ne le déduisez pas une seconde fois du montant de la ligne, car la facture ne serait plus correcte.
Lorsqu'une facture contient à la fois des remises au niveau ligne et des remises au niveau facture, les bases imposables de TVA sont calculées comme suit :
LineExtensionAmount (déjà après remises de ligne)TaxableAmount dans le TaxSubtotalLa TVA est calculée sur cette base nette. C'est pourquoi il est essentiel que chaque remise et supplément au niveau facture soit accompagné d'une catégorie de TVA : le système doit savoir à quel taux la remise correspond.
Lorsqu'un AllowanceCharge au niveau document s'applique à une facture comportant des lignes avec différents taux de TVA (par exemple 9 % et 21 %), le montant de la remise ou du supplément doit être réparti au pro rata entre les catégories de TVA. Cela signifie : proportionnellement à la part de chaque catégorie dans le total des montants imposables.
Supposons qu'une facture contienne 2 000 euros de lignes à 21 % de TVA et 1 000 euros de lignes à 9 % de TVA. Une remise au niveau facture de 300 euros doit alors être inscrite sous forme de deux éléments AllowanceCharge distincts : 200 euros à 21 % (deux tiers) et 100 euros à 9 % (un tiers). La base imposable par catégorie est ensuite calculée correctement.
Outre les niveaux facture et ligne, UBL prévoit un troisième emplacement pour les remises : au sein de l'élément Price d'une ligne de facture. Ce mécanisme montre la différence entre le prix brut et le prix unitaire net.
<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>
Dans cet exemple, le prix brut (BaseAmount) est de 10,00 euros. Après déduction de 1,50 euro de remise, il reste le prix unitaire net (PriceAmount) de 8,50 euros.
Au niveau prix, seul ChargeIndicator=false (remise) est autorisé. Les suppléments (ChargeIndicator=true) ne sont pas possibles à ce niveau. De plus, la règle de validation BR-28 s'applique : le prix brut (BaseAmount) ne peut pas être négatif. Si vous souhaitez appliquer un supplément sur le prix unitaire, intégrez-le comme AllowanceCharge au niveau ligne ou indiquez directement le prix majoré comme PriceAmount.
Un cas particulier se présente lorsqu'une remise au niveau ligne (AllowanceCharge sur la ligne) dépasse le prix de l'article. La règle de validation Peppol R120 vérifie si LineExtensionAmount = (Quantity × PriceAmount ÷ BaseQuantity) + majorations − remises. R120 n'interdit pas explicitement les montants négatifs ; la validation échoue lorsque ce calcul n'est pas équilibré. Lorsque la remise dépasse le prix, il y a de fortes chances que le calcul ne soit pas correct.
Ce scénario se produit en pratique avec des avoirs comportant des remises élevées. La solution : utilisez directement le montant net de l'avoir (la différence entre le prix et la remise) comme PriceAmount et omettez l'élément AllowanceCharge sur la ligne. Le prix d'origine et la remise appliquée peuvent être mentionnés à titre de référence dans le champ Item/Name ou dans un élément Note sur la ligne de facture.
Attention : cette solution de contournement est destinée aux situations où la remise dépasse le prix. Pour les remises ordinaires qui restent inférieures au prix, utilisez normalement l'élément AllowanceCharge sur la ligne.
L'escompte de paiement (skonto) est tout à fait différent d'une remise sur facture. Une remise sur facture via AllowanceCharge est inconditionnelle et diminue directement le montant de la facture. L'escompte de paiement est conditionnel (dépendant du délai de paiement) et n'est pas intégré dans le montant de la facture. Consultez l'article sur l'escompte de paiement pour plus de détails.
Conseil : si vous n'êtes pas sûr que votre AllowanceCharge soit correctement intégré, soumettez la facture au validateur eConnect gratuit. Celui-ci vérifie que les bases imposables de TVA sont correctement calculées après déduction des remises et suppléments.
Validez votre facture