Sur cette page
La réponse courte
PEPPOL-EN16931-R051 échoue pour chaque montant dont le currencyID n'est pas exactement la valeur de cbc:DocumentCurrencyCode. L'emplacement du constat est le montant : remplacez son currencyID par la devise de la facture, et assurez-vous que le chiffre est réellement exprimé dans cette devise.
Il existe une exception. Lorsque cbc:TaxCurrencyCode désigne une devise de comptabilisation de la TVA, le total de TVA dans cette devise va dans un second cac:TaxTotal sans ventilation, et ce montant garde sa propre devise.
Ce que la règle vérifie
La règle parcourt chaque élément de montant des types utilisés dans une facture, y compris cbc:PriceAmount et les montants des remises et des frais à tous les niveaux, et compare son currencyID au texte de cbc:DocumentCurrencyCode sous la racine. La comparaison est exacte : la casse et les espaces comptent.
Le cbc:TaxAmount d'un cac:TaxTotal sans cac:TaxSubtotal est ignoré ; c'est là que se place le total de TVA en devise de comptabilisation. Lors d'un essai, une facture en GBP avec un cbc:TaxCurrencyCode à EUR et un second total de taxe de 13.46 EUR a été validée sans erreur.
L'exception dépend de la forme du total de taxe, pas de la devise déclarée. Lors d'un essai, un second total de taxe en EUR qui reprenait la ventilation de la TVA a été signalé par cette règle sur ses trois montants, avec PEPPOL-EN16931-R053 et plusieurs règles de ventilation de la TVA.
Lorsque cbc:DocumentCurrencyCode est absent ou vide, il n'y a rien à quoi comparer, et chaque montant du document est signalé. Le code manquant lui-même relève de BR-05.
Un code absent de la liste ISO 4217 fait aussi échouer cette règle, puisqu'il ne peut pas être égal à une devise de document valide ; les règles de listes de codes BR-CL-03 et PEPPOL-EN16931-CL007 apparaissent alors avec elle.
| Terme | Signification | Élément UBL |
|---|---|---|
| BT-5 | Code de devise de la facture | cbc:DocumentCurrencyCode |
| - | Devise d'un montant (l'attribut currencyID) | currencyID on each amount element, for example cac:InvoiceLine/cac:Price/cbc:PriceAmount/@currencyID |
| BT-6 | Code de devise de comptabilisation de la TVA | cbc:TaxCurrencyCode |
| BT-111 | Montant total de la TVA de la facture dans la devise de comptabilisation (exclu) | cac:TaxTotal/cbc:TaxAmount, in the cac:TaxTotal that has no cac:TaxSubtotal |
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 :
- Les prix proviennent d'une liste de prix dans une autre devise que la facture, et l'élément de prix reprend la devise de la liste alors que les totaux utilisent la devise de la facture.
- La facture est convertie pour l'acheteur, et certains montants sont convertis et réétiquetés, d'autres non.
- La devise du document est définie par client dans l'en-tête, alors que les attributs
currencyIDsont codés en dur dans le modèle. - La TVA dans une devise locale est envoyée sous forme de copie complète de la ventilation au lieu d'un montant unique en devise de comptabilisation.
Comment corriger le document
- Choisissez la devise de la facture et écrivez-la dans
cbc:DocumentCurrencyCode. - Exprimez chaque montant dans cette devise. Si un prix provient d'une liste dans une autre devise, convertissez-le avant de construire la ligne ; changer seulement l'attribut laisserait un chiffre faux.
- Renseignez chaque
currencyIDà partir de la devise du document, à un seul endroit de votre mapping. - Si la TVA doit aussi être indiquée dans une devise de comptabilisation locale, ajoutez
cbc:TaxCurrencyCodeet un secondcac:TaxTotalcontenant seulement uncbc:TaxAmountdans cette devise, sanscac:TaxSubtotal.
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 : une facture en GBP dont le prix de l'article est en EUR
<cbc:DocumentCurrencyCode>GBP</cbc:DocumentCurrencyCode>
<!-- parties, tax total and monetary totals omitted from this fragment -->
<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="EUR">12.5</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
</cac:Price>
</cac:InvoiceLine>Fragment de la facture corrigée : le prix de l'article est en GBP, la devise de la facture
<cac:Price>
<cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
</cac:Price>La seule différence est le currencyID du prix de l'article : EUR dans la facture en échec et GBP dans la facture corrigée, sur une facture dont le code de devise est GBP. EUR est un code ISO 4217 valide : les règles de listes de codes restent donc muettes et l'étape EN 16931 passe, ce qui laisse cette règle Peppol comme seul constat. Dans l'exemple enregistré, réétiqueter est la bonne correction, car le prix de 12.5 a toujours été entendu en livres. Un prix réellement exprimé en euros devrait aussi être converti.
Ce que le validateur a signalé
- La facture en erreur signale PEPPOL-EN16931-R051. 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 aussi bien aux documents UBL
Invoicequ'auxCreditNote. Lors d'un essai, un avoir avec un prix enEURsur un document enGBPn'a signalé que cette règle. - Elle est signalée par l'étape Peppol. Dans l'exemple enregistré, l'étape EN 16931 passe, car aucune de ses règles ne compare la devise d'un prix d'article à la devise du document.
- Une mauvaise devise sur le total de TVA qui porte la ventilation concerne aussi EN 16931. Lors d'un essai,
EURà cet endroit a aussi entraînéBR-CO-15, qui ne trouve alors aucun total de TVA dans la devise du document. - Un second total de taxe dans une autre devise, envoyé sans
cbc:TaxCurrencyCode, n'est pas signalé ici : lors d'un essai, c'estPEPPOL-EN16931-R054qui l'a signalé.
Règles liées
- BR-05 exige le code de devise du document auquel chaque montant est comparé
- BR-CL-03 vérifie que chaque currencyID est un code ISO 4217 valide
- PEPPOL-EN16931-R054 encadre le second total de taxe qui porte la TVA dans la devise de comptabilisation
- BR-CO-15 exige exactement un total de TVA dans la devise du document
- 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-24.
La définition officielle de PEPPOL-EN16931-R051 (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.

