Aller au contenu

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

BR-CL-23 : Utiliser un code de la Recommandation 20 de l'UN/ECE dans unitCode

Chaque unitCode sur une quantité de ligne ou une quantité de base du prix doit être un code UN/ECE Rec 20 ou Rec 21, en majuscules. Les abréviations locales comme EACH échouent.

EN 16931Erreur : le document n'est pas valideListes de codesLignes et prix

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.

TermeSignificationÉlément UBL
BT-130Code de l'unité de mesure de la quantité facturéecac:InvoiceLine/cbc:InvoicedQuantity/@unitCode
BT-149Quantité de base du prix de l'article : son attribut de code d'unité de mesurecac: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 PCE en 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 X qui 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

  1. Dressez la liste des unités distinctes que votre système peut mettre sur une ligne de facture.
  2. Faites correspondre chacune au code de la Recommandation 20 de même sens, ou au code de la Recommandation 21 précédé de X pour 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.
  3. 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.
  4. Écrivez le code en majuscules dans unitCode sur la quantité de ligne, et le même code sur cac:Price/cbc:BaseQuantity lorsque cet élément est présent.
  5. 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é

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:InvoicedQuantity dans une Invoice, cac:CreditNoteLine/cbc:CreditedQuantity dans un CreditNote. cac:Price/cbc:BaseQuantity est identique dans les deux. L'avoir enregistré avec unitCode="EACH" sur cbc:CreditedQuantity et C62 sur 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:InvoicedQuantity dans une cac:CreditNoteLine est 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.

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.