Aller au contenu

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

PEPPOL-EN16931-R120 : Corriger un montant net de ligne qui ne découle pas de la quantité, du prix, des frais et des remises

Chaque montant net de ligne doit être égal à quantité x (prix net / quantité de base) + frais de la ligne - remises de la ligne, à 0.02 près.

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

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.

TermeSignificationÉlément UBL
BT-131Montant net de ligne de facturecac:InvoiceLine/cbc:LineExtensionAmount
BT-129Quantité facturéecac:InvoiceLine/cbc:InvoicedQuantity
BT-146Prix net de l'articlecac:InvoiceLine/cac:Price/cbc:PriceAmount
BT-149Quantité de base du prix de l'articlecac:InvoiceLine/cac:Price/cbc:BaseQuantity
BT-136Montant de la remise sur la ligne de facturecac:InvoiceLine/cac:AllowanceCharge[cbc:ChargeIndicator = false]/cbc:Amount
BT-141Montant des charges ou frais sur la ligne de facturecac: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:BaseQuantity ou 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:AllowanceCharge au 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

  1. 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.
  2. 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.
  3. 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. Un unitCode sur la quantité de base différent de celui de la quantité est signalé par PEPPOL-EN16931-R130.
  4. 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é.
  5. 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-10 contrô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é

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 Invoice et CreditNote. Dans un avoir, la quantité est cbc:CreditedQuantity et la ligne est cac: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:BaseQuantity né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 avec PEPPOL-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.

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.