Sur cette page
La réponse courte
BR-23 échoue lorsque la quantité de la ligne n'a pas d'attribut unitCode, comme dans <cbc:InvoicedQuantity>2</cbc:InvoicedQuantity>. Ajoutez unitCode avec le code de la recommandation 20 de l'UN/ECE correspondant à l'unité dans laquelle la quantité est comptée, et utilisez le même code sur cac:Price/cbc:BaseQuantity si la ligne en comporte une.
L'attribut doit se trouver sur l'élément de quantité lui-même. Un unitCodeListID sans unitCode, ou une unité mentionnée uniquement dans le nom ou la description de l'article, ne compte pas.
Ce que la règle vérifie
Pour chaque cac:InvoiceLine ou cac:CreditNoteLine, la règle est satisfaite lorsque l'élément de quantité de la ligne porte un attribut nommé unitCode. Elle vérifie que l'attribut existe, pas ce qu'il contient.
Un attribut vide ou composé uniquement d'espaces passe cette règle et est intercepté par d'autres. Lors d'un essai, unitCode="" et unitCode=" " ont chacun signalé BR-CL-23, car aucun des deux n'est un code reconnu, et PEPPOL-EN16931-R130, car aucun ne correspond au C62 de la quantité de base. BR-23 lui-même n'a pas été signalé.
Une ligne sans aucun élément de quantité échoue aussi ici, avec BR-22, car il n'y a aucun élément pour porter l'attribut.
L'unité de cac:Price/cbc:BaseQuantity ne joue aucun rôle dans cette règle. Lorsque l'unité a été retirée à la fois de la quantité et de la quantité de base, seul BR-23 a été signalé : la comparaison des unités de Peppol ne porte que sur une quantité de base qui a une unité.
| Terme | Signification | Élément UBL |
|---|---|---|
| BT-130 | Code de l'unité de mesure de la quantité facturée | cac:InvoiceLine/cbc:InvoicedQuantity/@unitCode (cac:CreditNoteLine/cbc:CreditedQuantity/@unitCode in a credit note) |
| BT-129 | Quantité facturée | cac:InvoiceLine/cbc:InvoicedQuantity |
| BT-150 | Code de l'unité de mesure de la quantité de base du prix de l'article | 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 :
- Le système source stocke les quantités comme de simples nombres et n'a aucun champ d'unité que l'export pourrait utiliser.
- Le sérialiseur n'écrit les attributs que lorsqu'une valeur est présente, et l'unité est nulle pour les lignes de service ou les lignes saisies à la main.
- L'unité est envoyée dans
unitCodeListID, ou seulement dans la description de l'article, et l'attributunitCodeest omis. - Un mapping d'avoir construit
cbc:CreditedQuantityde zéro et copie le nombre sans l'attribut.
Comment corriger le document
- Repérez la ligne grâce à l'emplacement du constat, puis trouvez l'unité de sa quantité dans la source : l'unité de vente du produit, ou l'unité dans laquelle le service est facturé.
- Associez cette unité à son code de la recommandation 20 de l'UN/ECE, par exemple
C62pour un,H87pour pièce,HURpour heure ouKGMpour kilogramme, et écrivez-le en majuscules dansunitCodesurcbc:InvoicedQuantityoucbc:CreditedQuantity. - Écrivez le même code sur
cac:Price/cbc:BaseQuantitylorsque la ligne en comporte une.PEPPOL-EN16931-R130rejette une quantité de base dont l'unité diffère de celle de la quantité. - Ne répondez pas au constat Peppol en retirant aussi l'unité de la quantité de base. Cela fait taire
PEPPOL-EN16931-R130et laisseBR-23exactement là où il était.
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 : la quantité est 2 sans unité, alors que le prix est exprimé pour 1 C62
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity>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>Fragment de la facture corrigée : la quantité et la quantité de base du prix sont toutes deux en C62
<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>La seule différence est unitCode="C62" sur cbc:InvoicedQuantity, absent de la facture en échec et présent dans la facture corrigée. Le document en échec signale aussi PEPPOL-EN16931-R130 sur cbc:BaseQuantity : la quantité de base du prix indique C62, et une quantité sans unité ne peut pas y correspondre. Ajouter l'attribut à la quantité fait disparaître les deux constats.
Ce que le validateur a signalé
- La facture en erreur signale BR-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
- S'applique à
cbc:InvoicedQuantitydans uneInvoiceUBL et àcbc:CreditedQuantitydans unCreditNote. Lors d'un essai sur un avoir, retirer l'attribut de la quantité créditée a signaléBR-23etPEPPOL-EN16931-R130, la même paire que pour la facture. - Le schéma UBL traite
unitCodecomme facultatif : son absence passe donc l'étape XSD et reste à la charge de cette règle. - Le code acceptable est déterminé par
BR-CL-23, pas ici. Une fois l'attribut présent, une valeur commeEACHoupcsdéplace le constat vers cette règle.
Règles liées
- BR-CL-23 vérifie que le code d'unité, une fois présent, est un code UN/ECE reconnu
- PEPPOL-EN16931-R130 exige que la quantité de base du prix utilise la même unité que la quantité de la ligne
- BR-22 signale une ligne sans aucun élément de quantité et se déclenche avec cette règle
- BR-21 est l'autre contrôle de présence sur la ligne elle-même, pour l'identifiant de 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-24.
La définition officielle de BR-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.

