Sur cette page
La réponse courte
BR-CL-23 échoue lorsqu'un attribut unitCode contient autre chose qu'un code de la liste des unités de mesure fournie avec les artefacts de validation. Remplacez votre abréviation locale d'unité par le code de la Recommandation 20 de l'UN/ECE qui a le même sens : KGM pour les kilogrammes, HUR pour les heures, C62, H87 ou EA pour les articles dénombrables.
L'emplacement du constat indique l'élément de quantité qui porte le mauvais code. Si vous changez l'unité de la quantité de ligne, changez-la aussi sur cac:Price/cbc:BaseQuantity, car Peppol exige que les deux concordent.
Ce que la règle vérifie
La règle s'exécute sur cbc:InvoicedQuantity, cbc:CreditedQuantity et cbc:BaseQuantity, chaque fois que l'élément a un attribut unitCode, et recherche la valeur dans une liste fixe. Cette liste combine la Recommandation 20 de l'UN/ECE, les unités de mesure, avec la Recommandation 21, les types d'emballage, dont les codes s'écrivent précédés d'un X : XPK est accepté et un PK seul ne l'est pas.
La correspondance est exacte et sensible à la casse. c62 et h87 échouent là où C62 et H87 passent. Les abréviations qui semblent plausibles mais ne figurent pas dans la liste échouent aussi : EACH, PCE, pcs, KG et HR sont tous rejetés. Un unitCode="" vide échoue également.
Chaque quantité donne un constat distinct. Une ligne qui porte le même mauvais code sur la quantité et sur la quantité de base du prix signale la règle deux fois.
Une quantité sans aucun attribut unitCode est hors du champ de cette règle, et le schéma UBL l'autorise. Sur la quantité de ligne, l'omission est signalée par BR-23 à la place. Sur cbc:BaseQuantity, l'attribut peut être omis sans aucun constat.
| Terme | Signification | Élément UBL |
|---|---|---|
| BT-130 | Code de l'unité de mesure de la quantité facturée | cac:InvoiceLine/cbc:InvoicedQuantity/@unitCode |
| BT-149 | Quantité de base du prix de l'article : son attribut de code d'unité de mesure | cac:InvoiceLine/cac:Price/cbc:BaseQuantity/@unitCode |
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 :
- L'unité est copiée telle quelle depuis le référentiel produits, qui utilise les abréviations de l'ERP ou de l'entrepôt et non des codes UN/ECE.
- Une table de correspondance existe mais ne couvre que les unités en usage lors de sa rédaction, et une nouvelle unité passe sans correspondance.
- Les codes passent par une étape qui les met en minuscules.
- Le système utilise une abréviation répandue comme
PCEen supposant qu'il s'agit d'un code standard, alors qu'elle ne figure pas dans cette liste. - Les types d'emballage sont envoyés sans le préfixe
Xqui les identifie comme codes de la Recommandation 21. - Les lignes de services n'ont pas d'unité dans la source, et une valeur par défaut inventée est écrite pour remplir l'attribut.
Comment corriger le document
- Dressez la liste des unités distinctes que votre système peut mettre sur une ligne de facture.
- Faites correspondre chacune au code de la Recommandation 20 de même sens, ou au code de la Recommandation 21 précédé de
Xpour un type d'emballage. Gardez la correspondance sous forme de données, pour qu'une nouvelle unité soit une nouvelle ligne et non une modification du code. - Ne regroupez pas les unités inconnues sous
C62. L'unité fait partie de ce qui a été vendu ; une quantité de 2 en kilogrammes et 2 d'un article sont des énoncés différents. - Écrivez le code en majuscules dans
unitCodesur la quantité de ligne, et le même code surcac:Price/cbc:BaseQuantitylorsque cet élément est présent. - Faites échouer l'export pour une unité sans correspondance, afin que le manque soit détecté dès l'introduction de l'unité.
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.
Ligne de la facture en échec : EACH n'est pas un code de la Recommandation 20
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="EACH">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>Ligne de la facture corrigée : C62 sur les deux quantités
<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 le unitCode de cbc:InvoicedQuantity diffère : EACH dans la facture en échec, C62 dans la facture corrigée. Le document en échec signale aussi PEPPOL-EN16931-R130, localisé sur cbc:BaseQuantity : cette règle Peppol exige que la quantité de base du prix utilise la même unité que la quantité de ligne, et C62 n'est pas EACH. C'est une conséquence du changement d'un attribut sans l'autre. Avec EACH sur les deux quantités, le document signale BR-CL-23 deux fois et PEPPOL-EN16931-R130 pas du tout.
Ce que le validateur a signalé
- La facture en erreur signale BR-CL-23 et PEPPOL-EN16931-R130. Le document corrigé passe toutes les étapes de validation sans constat.Télécharger le XML en erreurTélécharger le XML corrigé
- L'avoir en erreur signale BR-CL-23 et PEPPOL-EN16931-R130. 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
- La quantité de ligne porte un nom différent selon le type de document :
cac:InvoiceLine/cbc:InvoicedQuantitydans uneInvoice,cac:CreditNoteLine/cbc:CreditedQuantitydans unCreditNote.cac:Price/cbc:BaseQuantityest identique dans les deux. L'avoir enregistré avecunitCode="EACH"surcbc:CreditedQuantityetC62sur la quantité de base signale les deux mêmes règles que la facture. - Un mapper qui construit les avoirs en renommant les éléments de la facture doit aussi renommer la quantité : une
cbc:InvoicedQuantitydans unecac:CreditNoteLineest rejetée par l'étape XSD. Une fois l'élément correct, la liste de codes et le comportement de cette règle sont identiques. - La liste de codes est celle publiée avec les artefacts EN 16931 figés. Recherchez les codes dans cette liste ou dans les recommandations UN/ECE elles-mêmes ; cette page ne les reproduit pas.
Règles liées
- PEPPOL-EN16931-R121 vérifie que la quantité de base du prix qui porte cette unité est supérieure à zéro
- PEPPOL-EN16931-R120 contrôle le montant net de la ligne calculé à partir de la quantité et du prix
- BR-CL-04 est le contrôle de liste de codes équivalent pour la devise de la facture
- BR-25 exige un nom d'article sur la même ligne
- Parcourir toutes les règles de la référence
- Contexte (en anglais) : Understanding EN 16931 validation errors
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 BR-CL-23 (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.

