Aller au contenu

Ironfang Finance - Référence des règles

PEPPOL-EN16931-R046 : Corriger un prix net qui n'est pas le prix brut moins la remise sur le prix

Lorsque le prix d'une ligne indique un prix brut, le prix net doit être exactement égal au prix brut moins la remise sur le prix. Aucune tolérance n'est admise.

Peppol BIS BillingErreur : le document n'est pas valideLignes et prixRemises et frais

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.

TermeSignificationÉlément UBL
BT-146Prix net de l'articlecac:InvoiceLine/cac:Price/cbc:PriceAmount
BT-147Remise sur le prix de l'articlecac:InvoiceLine/cac:Price/cac:AllowanceCharge/cbc:Amount
BT-148Prix brut de l'articlecac: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

  1. Pour la ligne du constat, lisez cbc:PriceAmount, ainsi que cbc:BaseAmount et cbc:Amount de la remise située dans cac:Price.
  2. 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.
  3. 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.
  4. Si le système source ne peut pas fournir de prix brut fiable, omettez le cac:AllowanceCharge au 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é

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:InvoiceLine dans une Invoice et d'une cac:CreditNoteLine dans un CreditNote. Confirmé avec le validateur sur un avoir.
  • Le prix brut et la remise sur le prix sont informatifs. PEPPOL-EN16931-R120 calcule 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. Mettre cbc:ChargeIndicator à true à cet endroit est signalé par PEPPOL-EN16931-R044.
  • La chaîne complète refuse dès l'étape XSD, avant que cette règle ne s'exécute, un cac:AllowanceCharge au niveau du prix sans cbc:Amount.

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.