Aller au contenu

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

PEPPOL-EN16931-R040 : Corriger le montant d'une remise ou de frais qui ne correspond pas à son montant de base et à son pourcentage

Lorsqu'une remise ou des frais indiquent un montant de base et un pourcentage, le montant doit valoir base x pourcentage / 100, à 0.02 près.

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

Sur cette page

La réponse courte

PEPPOL-EN16931-R040 échoue lorsqu'un cac:AllowanceCharge porte à la fois cbc:BaseAmount et cbc:MultiplierFactorNumeric, et que cbc:Amount s'écarte de plus de 0.02 de montant de base x pourcentage / 100. Déterminez laquelle des trois valeurs est fausse dans les données source et corrigez celle-là.

cbc:MultiplierFactorNumeric est un pourcentage : 10 signifie dix pour cent. Ce n'est pas un coefficient comme 0.1.

Ce que la règle vérifie

La règle s'exécute sur chaque cac:AllowanceCharge placé directement sous la racine du document et directement sous une ligne. Remises et frais sont traités de la même façon ; cbc:ChargeIndicator ne joue aucun rôle. La remise dans cac:Price n'est pas couverte.

Si cbc:BaseAmount ou cbc:MultiplierFactorNumeric est absent, cette règle n'a rien à vérifier et passe. Une remise ou des frais sans aucun des deux éléments, avec seulement un cbc:Amount fixe, ne posent pas de problème.

Lorsque les deux sont présents, le montant attendu est montant de base x pourcentage / 100. Le produit n'est pas arrondi. La règle passe lorsque cbc:Amount s'en écarte de 0.02 au plus, et la limite est incluse : un écart d'exactement 0.02 passe, tout écart supérieur échoue.

Confirmé avec le validateur sur un montant de 3.50 à 10 pour cent : une base de 35.20 (attendu 3.52, écart de 0.02) passe ; une base de 35.21 (attendu 3.521) échoue ; une base de 35.30 (attendu 3.53) échoue. Il en va de même en dessous du montant, et pour une remise au niveau de la ligne.

Un pourcentage de 0 avec un montant de base attend un montant de 0 : un montant non nul échoue donc.

TermeSignificationÉlément UBL
BG-20Remises au niveau du documentcac:AllowanceCharge[cbc:ChargeIndicator = false]
BG-21Charges ou frais au niveau du documentcac:AllowanceCharge[cbc:ChargeIndicator = true]
BG-27Remises sur la ligne de facturecac:InvoiceLine/cac:AllowanceCharge[cbc:ChargeIndicator = false]
BG-28Charges ou frais sur la ligne de facturecac:InvoiceLine/cac:AllowanceCharge[cbc:ChargeIndicator = true]

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 pourcentage est envoyé sous forme de fraction, 0.1 pour dix pour cent, si bien que le montant attendu est cent fois plus petit que prévu.
  • Le montant de base est pris dans un autre chiffre que celui sur lequel la remise a été calculée, par exemple la valeur brute de la ligne au lieu de la valeur après une remise précédente.
  • Le montant a été négocié ou modifié à la main après application du pourcentage, et le pourcentage et la base sont restés tels quels.
  • Plusieurs remises en pourcentage sont appliquées en cascade dans le système source, mais envoyées comme une seule remise avec uniquement le premier pourcentage.
  • Le montant est arrondi par unité puis multiplié, ce qui s'écarte de plus de 0.02 d'un calcul unique sur la base entière.

Comment corriger le document

  1. Repérez le cac:AllowanceCharge en échec grâce à l'emplacement du constat et calculez cbc:BaseAmount x cbc:MultiplierFactorNumeric / 100 en arithmétique décimale.
  2. Déterminez quelle valeur est fausse en revenant aux conditions commerciales. Si le pourcentage ou la base est faux, corrigez-le et ne touchez pas au montant.
  3. Si le montant est faux, corrigez-le puis recalculez tout ce qui en dépend : le montant net de la ligne pour une entrée au niveau de la ligne, ou le total des remises ou des frais, la ventilation de la TVA et les totaux du document pour une entrée au niveau du document.
  4. Si le montant est une somme fixe qui n'a jamais été dérivée d'un pourcentage, envoyez cbc:Amount seul et supprimez à la fois cbc:BaseAmount et cbc:MultiplierFactorNumeric. En supprimer un seul fait échouer PEPPOL-EN16931-R041 ou PEPPOL-EN16931-R042 à la place.

L'exemple enregistré est un montant de frais au niveau du document de 3.50 sur une base de 35.00.

En échec : 35.00 x 20 / 100 = 7.00, montant envoyé 3.50, écart 3.50
Corrigé : 35.00 x 10 / 100 = 3.50, montant envoyé 3.50, écart 0.00
Écart autorisé : jusqu'à 0.02 inclus

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 : 20 pour cent de 35.00 font 7.00, mais le montant des frais est de 3.50

<cac:AllowanceCharge>
  <cbc:ChargeIndicator>true</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>CG</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Example document charge</cbc:AllowanceChargeReason>
  <cbc:MultiplierFactorNumeric>20</cbc:MultiplierFactorNumeric>
  <cbc:Amount currencyID="GBP">3.50</cbc:Amount>
  <cbc:BaseAmount currencyID="GBP">35.00</cbc:BaseAmount>
  <!-- tax category omitted from this fragment -->
</cac:AllowanceCharge>

Fragment de la facture corrigée : 10 pour cent de 35.00 donnent les 3.50 facturés

<cac:AllowanceCharge>
  <cbc:ChargeIndicator>true</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>CG</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Example document charge</cbc:AllowanceChargeReason>
  <cbc:MultiplierFactorNumeric>10</cbc:MultiplierFactorNumeric>
  <cbc:Amount currencyID="GBP">3.50</cbc:Amount>
  <cbc:BaseAmount currencyID="GBP">35.00</cbc:BaseAmount>
  <!-- tax category omitted from this fragment -->
</cac:AllowanceCharge>

Seul cbc:MultiplierFactorNumeric diffère : 20 dans le document en échec, 10 dans le document corrigé. Le document en échec ne signale que PEPPOL-EN16931-R040, car le montant de 3.50 concorde toujours avec le total des frais et le reste des totaux. Si l'on avait modifié le montant à la place, le total des frais aurait cessé de correspondre : avec le montant à 3.53 et rien d'autre de modifié, le validateur signale BR-CO-12 en plus de cette règle.

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, au niveau du document et dans cac:InvoiceLine ou cac:CreditNoteLine. Confirmé sur des avoirs aux deux niveaux.
  • La remise dans cac:Price n'entre pas dans le champ de cette règle. Un pourcentage ajouté à cet endroit provoque les avertissements UBL-CR-635 et UBL-CR-671, et aucun constat de cette règle.
  • Le test figé lit un cbc:Amount absent comme 0, mais la chaîne complète n'arrive jamais jusque-là : un cac:AllowanceCharge sans cbc:Amount est refusé par l'étape XSD et les étapes suivantes sont ignorées.
  • La règle ne vérifie pas que le montant de base est la bonne base, seulement que les trois nombres concordent entre eux.

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-R040 (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.