Sur cette page
La réponse courte
PEPPOL-EN16931-R120 échoue lorsque le cbc:LineExtensionAmount d'une ligne s'écarte de plus de 0.02 de quantité x (prix net / quantité de base du prix) + frais de la ligne - remises de la ligne. Recalculez la ligne à partir des valeurs du XML, trouvez celle qui ne concorde pas avec la transaction source, et corrigez-la.
Parmi les erreurs qui produisent ce constat : une quantité ou un prix modifié sans recalcul du montant de la ligne, un prix exprimé pour 100 ou pour 1000 sans le cbc:BaseQuantity correspondant, et une remise de ligne à la fois intégrée au prix et envoyée comme remise de ligne.
Ce que la règle vérifie
La règle s'exécute une fois pour chaque cac:InvoiceLine ou cac:CreditNoteLine. La valeur attendue est quantité x (cbc:PriceAmount / cbc:BaseQuantity), plus la somme des cbc:Amount des éléments cac:AllowanceCharge de la ligne dont le cbc:ChargeIndicator vaut true, moins la même somme pour ceux qui valent false.
Le montant net de la ligne passe lorsqu'il s'écarte de 0.02 au plus de cette valeur. La limite est incluse. Avec une quantité de 2 et un montant de ligne de 25.00, le validateur accepte un prix de 12.51 (attendu 25.02) et de 12.49, et rejette 12.511 (attendu 25.022), 12.489 et 12.515.
L'arrondi ne s'applique qu'aux deux sommes : les frais sont additionnés et arrondis à deux décimales, de même que les remises. Quantité x prix n'est pas arrondi, pas plus que la valeur attendue finale, c'est pourquoi 25.022 ci-dessus compte comme un écart de 0.022. Comme les montants des remises et des frais de ligne ne peuvent de toute façon pas avoir plus de deux décimales, l'arrondi des sommes ne change rien pour un document qui passe les règles de décimales EN 16931.
La quantité de base du prix divise le prix. Un prix de 125 avec une quantité de base de 10 et une quantité de 2 donne 25.00 et passe ; un prix de 12.5 avec une quantité de base de 10 donne 2.50 et échoue. Un cbc:BaseQuantity absent est lu comme 1, tout comme une quantité de base de 0, que PEPPOL-EN16931-R121 signale séparément.
La remise située dans cac:Price ne fait pas partie de la formule. Le prix net s'entend déjà après cette remise : seul cbc:PriceAmount est donc utilisé.
Le test figé prévoit aussi des valeurs de repli pour d'autres éléments absents : une quantité absente est lue comme 1, un prix absent comme 0 et un montant net de ligne absent comme 0. Retirer la quantité de la ligne enregistrée signale BR-22 et BR-23 en plus de cette règle, car 1 x 12.5 ne fait pas 25.00.
| Terme | Signification | Élément UBL |
|---|---|---|
| BT-131 | Montant net de ligne de facture | cac:InvoiceLine/cbc:LineExtensionAmount |
| BT-129 | Quantité facturée | cac:InvoiceLine/cbc:InvoicedQuantity |
| BT-146 | Prix net de l'article | cac:InvoiceLine/cac:Price/cbc:PriceAmount |
| BT-149 | Quantité de base du prix de l'article | cac:InvoiceLine/cac:Price/cbc:BaseQuantity |
| BT-136 | Montant de la remise sur la ligne de facture | cac:InvoiceLine/cac:AllowanceCharge[cbc:ChargeIndicator = false]/cbc:Amount |
| BT-141 | Montant des charges ou frais sur la ligne de facture | cac:InvoiceLine/cac:AllowanceCharge[cbc:ChargeIndicator = true]/cbc:Amount |
Comment une intégration en arrive là
Causes possibles, déduites de la forme de la règle et non d'une utilisation mesurée :
- La quantité ou le prix a été modifié après l'enregistrement du montant de la ligne, et le montant enregistré est envoyé tel quel.
- Le prix unitaire s'entend pour 100 ou pour 1000 unités dans le système source, et le XML le porte sans
cbc:BaseQuantityou avec une quantité de base de 1. - Une remise de ligne est déjà reflétée dans le prix net et est aussi envoyée comme
cac:AllowanceChargeau niveau de la ligne : elle est donc soustraite deux fois dans la valeur attendue. - Le montant de la ligne est calculé à partir d'un prix comportant plus de décimales que le prix sérialisé, et sur une grande quantité l'écart dépasse 0.02.
- Le montant de la ligne inclut la TVA, ou des frais de ligne n'y sont pas intégrés, ou une remise de ligne est émise avec un
cbc:ChargeIndicatoràtrue, de sorte qu'elle est ajoutée au lieu d'être soustraite.
Comment corriger le document
- Recalculez la ligne en échec à partir de son propre XML : quantité x (
cbc:PriceAmount/cbc:BaseQuantity) + frais de la ligne - remises de la ligne, en arithmétique décimale. - Comparez chaque donnée d'entrée à la transaction source pour trouver celle qui est fausse. N'écrasez pas simplement le montant de la ligne avec le résultat de la formule, sauf si c'est réellement le montant de la ligne qui est faux.
- Si le prix s'entend pour plusieurs unités, envoyez le nombre d'unités dans
cbc:BaseQuantity. S'il s'entend pour une seule unité, envoyez 1 ou omettez l'élément. UnunitCodesur la quantité de base différent de celui de la quantité est signalé parPEPPOL-EN16931-R130. - Sérialisez le prix net avec autant de décimales que le calcul en a utilisé. Cette règle ne limite pas le prix à deux décimales, et un prix tronqué à deux décimales peut dériver au-delà de 0.02 une fois multiplié par une grande quantité.
- Si le montant net de la ligne change, recalculez la somme des montants nets des lignes, la ventilation de la TVA et les totaux du document.
BR-CO-10contrôle ensuite le premier d'entre eux.
La ligne de facture enregistrée a un prix net de 12.5 pour 1 unité, aucune remise ni aucuns frais de ligne, et un montant net de ligne de 25.00. La troisième ligne montre une ligne de l'exemple valide plus complet, avec des frais de ligne et une remise de ligne.
En échec : 3 x (12.5 / 1) + 0.00 - 0.00 = 37.50, montant net de la ligne 25.00, écart 12.50 Corrigé : 2 x (12.5 / 1) + 0.00 - 0.00 = 25.00, montant net de la ligne 25.00, écart 0.00 Avec frais et remise : 3 x (19.995 / 1) + 0.01 - 2.00 = 57.995, montant net de la ligne 58.00, écart 0.005, passe
Valider votre facture corrigée
Avant et après
Ce sont des extraits, pas des documents complets. Les documents synthétiques complets dont ils proviennent sont liés ci-dessous.
Fragment de la facture en échec : 3 unités à 12.5 font 37.50, mais le montant net de la ligne est de 25.00
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">3</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<!-- item omitted from this fragment -->
<cac:Price>
<cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
</cac:Price>
</cac:InvoiceLine>Fragment de la facture corrigée : 2 unités à 12.5 font 25.00
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<!-- item omitted from this fragment -->
<cac:Price>
<cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
</cac:Price>
</cac:InvoiceLine>Seul cbc:InvoicedQuantity diffère : 3 dans le document en échec, 2 dans le document corrigé. Le document en échec ne signale que PEPPOL-EN16931-R120, car le montant net de la ligne de 25.00 concorde toujours avec les totaux du document. Dans cet exemple, c'est la quantité qui était fausse ; si l'on avait plutôt porté le montant de la ligne à 37.50, chaque total qui en dépend aurait aussi dû être recalculé.
Ce que le validateur a signalé
- La facture en erreur signale PEPPOL-EN16931-R120. Le document corrigé passe toutes les étapes de validation sans constat.Télécharger le XML en erreurTélécharger le XML corrigé
- L'avoir en erreur signale PEPPOL-EN16931-R120. Le document corrigé passe toutes les étapes de validation sans constat.Télécharger le XML en erreurTélécharger le XML corrigé
Enregistré avec phive 12.1.0 / phive-rules-peppol 4.5.6 / Saxon-HE 12.10, le moteur du validateur gratuit, sur des données synthétiques. Un résultat enregistré est une preuve de non-régression pour ces documents ; ce n'est pas une certification.
Où la règle s'applique
- S'applique aux documents UBL
InvoiceetCreditNote. Dans un avoir, la quantité estcbc:CreditedQuantityet la ligne estcac:CreditNoteLine; tout le reste de la formule est identique. L'exemple d'avoir enregistré commet la même erreur, une quantité créditée de 3 face à un montant net de ligne de 25.00 à un prix de 12.5, et ne signale que cette règle. La limite de 0.02 a aussi été confirmée sur un avoir. - Chaque ligne est contrôlée isolément, dans la devise du document. La règle ne regarde ni la TVA ni les totaux du document.
- Un
cbc:BaseQuantitynégatif rend le prix unitaire négatif dans ce calcul : sur la ligne enregistrée, une quantité de base de -1 signale donc cette règle avecPEPPOL-EN16931-R121. - La tolérance de 0.02 s'applique par ligne et à cette seule comparaison. Elle ne s'étend pas à
BR-CO-10, qui compare sans tolérance le total des lignes du document à la somme des montants nets des lignes arrondie à deux décimales.
Règles liées
- PEPPOL-EN16931-R121 rejette une quantité de base du prix de l'article nulle ou négative
- PEPPOL-EN16931-R046 vérifie le prix net par rapport au prix brut et à la remise sur le prix
- BR-CO-10 vérifie que les montants nets des lignes donnent le total des lignes du document
- BR-DEC-23 limite le montant net de la ligne à deux décimales
- Parcourir toutes les règles de la référence
- Contexte (en anglais) : How Peppol invoice validation actually works
Portée et source
Rédigé pour Peppol BIS Billing 3.0.21 (May 2026), EN 16931 1.3.16, tel qu'appliqué aux documents Invoice et CreditNote en UBL 2.1. D'autres profils, syntaxes et versions peuvent définir cet identifiant autrement. Version du catalogue d'aide 2026-09-24.1 : source vérifiée le 2026-09-24, explication mise à jour le 2026-09-20.
La définition officielle de PEPPOL-EN16931-R120 (en anglais) contient le texte normatif et le test. Cette page en est notre explication, pas une copie.
Cette aide ne modifie pas le verdict du moteur. Corriger ce constat ne signifie pas que le document passe toutes les étapes de validation, et la validation ne certifie pas la conformité juridique ou fiscale et ne transmet aucun document via Peppol.

