Sur cette page
La réponse courte
PEPPOL-EN16931-R046 échoue lorsque le cac:AllowanceCharge situé dans cac:Price donne un prix brut dans cbc:BaseAmount, et que cbc:PriceAmount n'est pas exactement ce prix brut moins la remise de cbc:Amount. Corrigez celui des trois chiffres qui est faux, de sorte que prix net = prix brut - remise.
La comparaison est exacte. Un écart à la quatrième décimale échoue.
Ce que la règle vérifie
La règle s'exécute sur le cac:AllowanceCharge situé dans cac:Price, pas sur les remises au niveau de la ligne ou du document.
Si cet élément n'a pas de cbc:BaseAmount, aucun prix brut n'est indiqué et la règle passe sans rien comparer. Confirmé avec le validateur.
Sinon, le cbc:PriceAmount voisin doit être égal à cbc:BaseAmount moins cbc:Amount. Les valeurs sont comparées comme des décimaux, sans arrondi ni tolérance. Avec une remise de 2.5 et un prix net de 12.5, le validateur rejette un prix brut de 15.01, 14.99 et 15.0001.
La comparaison étant numérique, les zéros finaux n'ont pas d'importance : 12.50 et 15.00 se comportent comme 12.5 et 15.
| Terme | Signification | Élément UBL |
|---|---|---|
| BT-146 | Prix net de l'article | cac:InvoiceLine/cac:Price/cbc:PriceAmount |
| BT-147 | Remise sur le prix de l'article | cac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:Amount |
| BT-148 | Prix brut de l'article | cac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:BaseAmount |
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 :
- Le prix net est arrondi à deux décimales alors que le prix brut et la remise en gardent davantage, ou l'inverse, si bien que la soustraction ne tombe plus juste.
- La remise est calculée comme un pourcentage du prix brut puis arrondie, et le prix net est calculé séparément à partir de chiffres non arrondis.
- Le prix brut provient de la liste de prix actuelle alors que le prix net et la remise proviennent de la commande, et le prix catalogue a changé depuis.
- Une remise portant sur toute la ligne est écrite dans la remise au niveau du prix, qui est une remise par quantité de base du prix.
- Une soustraction en virgule flottante binaire produit une valeur telle que 12.499999, sérialisée telle quelle.
Comment corriger le document
- Pour la ligne du constat, lisez
cbc:PriceAmount, ainsi quecbc:BaseAmountetcbc:Amountde la remise située danscac:Price. - Prenez le prix net comme point d'ancrage : c'est à partir de lui qu'est calculé le montant net de la ligne. Si les montants de la ligne sont justes, c'est le prix brut ou la remise qu'il faut corriger.
- Dérivez un chiffre des deux autres en arithmétique décimale au lieu de tirer les trois de sources indépendantes, par exemple remise = prix brut - prix net, et sérialisez avec assez de décimales pour ne rien perdre. Cette règle ne limite pas les prix à deux décimales.
- Si le système source ne peut pas fournir de prix brut fiable, omettez le
cac:AllowanceChargeau niveau du prix et envoyez le prix net seul. La ligne reste valide sans lui.
L'exemple enregistré a un prix net de 12.5 et une remise sur le prix de 2.5.
En échec : prix brut 16 - remise 2.5 = 13.5, prix net envoyé 12.5 Corrigé : prix brut 15 - remise 2.5 = 12.5, prix net envoyé 12.5
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 ligne de facture en échec : 16 moins 2.5 font 13.5, et non le prix net de 12.5
<cac:Price>
<cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:Amount currencyID="GBP">2.5</cbc:Amount>
<cbc:BaseAmount currencyID="GBP">16</cbc:BaseAmount>
</cac:AllowanceCharge>
</cac:Price>Fragment de la ligne de facture corrigée : 15 moins 2.5 font 12.5
<cac:Price>
<cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:Amount currencyID="GBP">2.5</cbc:Amount>
<cbc:BaseAmount currencyID="GBP">15</cbc:BaseAmount>
</cac:AllowanceCharge>
</cac:Price>Seul le prix brut de cbc:BaseAmount diffère : 16 dans le document en échec, 15 dans le document corrigé. Le document en échec ne signale que PEPPOL-EN16931-R046. Le montant net de la ligne de 25.00 est calculé à partir du prix net de 12.5 et d'une quantité de 2 : le prix brut erroné ne perturbe donc aucun autre total.
Ce que le validateur a signalé
- La facture en erreur signale PEPPOL-EN16931-R046. 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 au prix d'une
cac:InvoiceLinedans uneInvoiceet d'unecac:CreditNoteLinedans unCreditNote. Confirmé avec le validateur sur un avoir. - Le prix brut et la remise sur le prix sont informatifs.
PEPPOL-EN16931-R120calcule le montant net de la ligne à partir du seul prix net et ne soustrait pas une seconde fois la remise au niveau du prix. - Seule une remise est acceptée dans
cac:Price. Mettrecbc:ChargeIndicatoràtrueà cet endroit est signalé parPEPPOL-EN16931-R044. - La chaîne complète refuse dès l'étape XSD, avant que cette règle ne s'exécute, un
cac:AllowanceChargeau niveau du prix sanscbc:Amount.
Règles liées
- PEPPOL-EN16931-R120 calcule le montant net de la ligne à partir du prix net
- PEPPOL-EN16931-R121 exige une quantité de base du prix supérieure à zéro
- BR-27 rejette un prix net négatif
- PEPPOL-EN16931-R040 est le contrôle des montants des remises au niveau de la ligne et du document, qui admet bien 0.02
- 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-R046 (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.

