Prévenir et traiter correctement les écarts d'arrondi dans les factures UBL : PayableRoundingAmount, arrondi de la TVA et prix TTC.
L'un des messages d'erreur les plus frustrants lors de l'envoi d'e-factures est un écart d'arrondi. Les totaux de TVA ne correspondent pas aux montants des lignes, ou le total de la facture diffère d'un centime par rapport à la somme calculée. Le résultat : la facture est rejetée lors de la validation. Cet article explique d'où viennent les écarts d'arrondi et comment les prévenir ou les résoudre.
Les écarts d'arrondi résultent de la combinaison de trois facteurs : la multiplication, la division et l'arrondi à deux décimales. Quelques exemples :
Prix unitaire avec de nombreuses décimales. Un prix de 3,333... euros l'unité x 3 unités = 9,999 euros. Arrondi, cela donne 10,00 euros. Mais si vous arrondissez d'abord le prix unitaire à 3,33 puis multipliez : 3,33 x 3 = 9,99. Un centime de différence.
TVA par ligne versus TVA par total. Si vous calculez la TVA par ligne de facture et l'arrondissez, puis additionnez les résultats, la somme peut différer de la TVA calculée sur le total. Avec 21 % de TVA sur 33,33 euros, cela donne 7,00 euros (arrondi). Mais 21 % sur 3 x 33,33 = 21 % sur 99,99 = 21,00 euros. Tandis que 3 x 7,00 = 21,00 euros également. Dans ce cas, cela correspond, mais avec d'autres montants, ce n'est pas toujours le cas.
Prix TTC. Certains secteurs (commerce de détail, hôtellerie-restauration) travaillent avec des prix TTC. Le montant net doit alors être recalculé, ce qui introduit un moment d'arrondi supplémentaire.
EN 16931-1:2017 (version de production actuelle) prescrit que tous les montants sont arrondis à 2 décimales, quelle que soit la devise.
La révision EN 16931-1:2026 (approbation CEN le 13 mars 2026, urn:cen.eu:en16931:2026) remplace cela par un nombre de décimales dépendant de la devise : le nombre de décimales = la colonne « minor unit » de l'ISO 4217 pour la devise utilisée. La mise en œuvre Peppol via OpenPeppol est attendue sous la forme BIS Billing 4.0 (indicativement 2027). Jusqu'à ce que cette version soit en production, la règle actuelle des 2 décimales s'applique.
Exceptions en 2026 (fixes, quelle que soit la devise) :
Impact eConnect : les factures sortantes sont toujours en euros (minor unit 2) — pas de changement. Les factures entrantes peuvent contenir des devises avec une minor unit jusqu'à 4 — le traitement doit gérer jusqu'à 4 décimales. Voir également EN 16931-1:2026 principaux changements pour la vue d'ensemble complète.
La norme UBL dispose d'un élément spécial pour les écarts d'arrondi : PayableRoundingAmount dans le bloc LegalMonetaryTotal. Cet élément absorbe les petits écarts d'arrondi, de sorte que le PayableAmount puisse être un montant rond :
<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>
L'écart de 0,01 euro est explicitement mentionné. Les règles de validation autorisent un PayableRoundingAmount, à condition que l'écart soit suffisamment faible (généralement un maximum de 1 euro, selon le profil).
XPath : Invoice/LegalMonetaryTotal/PayableRoundingAmount.
Exemple 1 (arrondi à la hausse) : TaxInclusiveAmount est 9,99 euro, le montant à payer souhaité est 10,00 euro. Alors PayableRoundingAmount = 0,01 euro et PayableAmount = 10,00 euro.
Exemple 2 (pas de changement du PayableAmount) : avec un calcul de prix à 4 décimales, un micro-écart peut apparaître, par exemple 8,2646 × 1,21 = 10,000166. Dans ce cas, PayableAmount reste inchangé et aucun PayableRoundingAmount n'est nécessaire.
Le calcul de la TVA dans une facture UBL fonctionne par taux de TVA, et non par ligne. Tous les montants de ligne ayant le même taux de TVA sont additionnés pour obtenir la base imposable (TaxableAmount), et la TVA est calculée sur ce total. Cela évite d'arrondir par ligne et d'obtenir ensuite un écart d'arrondi cumulatif.
La formule est :
TaxableAmount = somme des LineExtensionAmount par catégorie de TVA
- AllowanceTotalAmount par catégorie de TVA
+ ChargeTotalAmount par catégorie de TVA
TaxAmount = TaxableAmount × Percent / 100 (arrondi à 2 décimales)
Important : calculez toujours la TVA sur la base imposable totale par taux, et non par ligne. Le calcul de la TVA par ligne est la cause la plus fréquente des écarts d'arrondi.
Lorsque les prix sont TTC, le montant net doit être recalculé. L'approche standard est :
brut / (1 + taux de TVA/100)LineExtensionAmount est ce montant netPayableRoundingAmount<!-- Prix TTC : 12,10 € l'unité, 3 unités -->
<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>
Dans cet exemple, le prix TTC est de 12,10 euros. Le montant net est de 10,00 euros l'unité (12,10 / 1,21). Multiplié par 3 = 30,00 euros. TVA : 21 % de 30,00 = 6,30 euros. Total : 36,30 euros. Cela correspond exactement à 3 x 12,10 euros. Mais avec des prix qui ne se divisent pas proprement, un écart apparaît.
eConnect valide chaque facture sur sa cohérence interne. Si un petit écart d'arrondi se situe dans la tolérance, la facture est acceptée. Pour les écarts plus importants, vous recevez un message d'erreur clair indiquant où se situe la différence.
La fonction de réparation automatique XML d'eConnect peut dans certains cas ajouter un PayableRoundingAmount manquant si l'écart est inférieur au seuil de tolérance. Mais il est toujours préférable de gérer l'arrondi correctement dans votre propre logiciel.
TaxExclusiveAmount + TaxAmount doit être égal à TaxInclusiveAmount. Et TaxInclusiveAmount moins PrepaidAmount plus PayableRoundingAmount doit être égal à PayableAmount.Calculez la TVA par taux (et non par ligne), travaillez en interne avec plus de deux décimales et n'arrondissez qu'au moment de remplir les éléments XML. Si malgré un arrondi correct un petit écart subsiste, absorbez-le avec l'élément PayableRoundingAmount.
C'est un élément UBL spécial qui absorbe les petits écarts d'arrondi dans les totaux de la facture. L'écart est explicitement mentionné, de sorte que la facture est quand même validée. La plupart des profils autorisent un maximum de 1 euro.
Dans certains cas, la fonction de réparation automatique XML peut ajouter un PayableRoundingAmount manquant si l'écart est inférieur au seuil de tolérance. Mais il est toujours préférable de gérer l'arrondi correctement dans votre propre logiciel.
Vérifiez votre facture