Aller au contenu

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

BR-21 : Donner à chaque ligne un identifiant de ligne non vide

Le cbc:ID au début de chaque ligne de facture ou d'avoir doit contenir du texte. Un identifiant de ligne vide ou blanc échoue ; sa valeur n'est pas contrôlée.

EN 16931Erreur : le document n'est pas valideChamps de baseLignes et prix

Sur cette page

La réponse courte

BR-21 échoue pour une ligne dont le cbc:ID propre n'a pas de texte. Dans l'exemple enregistré, l'unique cac:InvoiceLine commence par <cbc:ID></cbc:ID>. Écrivez le numéro de ligne, ou une autre référence qui distingue cette ligne des autres, dans cet élément de chaque cac:InvoiceLine ou cac:CreditNoteLine.

Supprimer l'élément n'est pas une solution. Le schéma UBL exige un cbc:ID dans chaque ligne : une ligne qui n'en a pas est donc refusée à l'étape XSD, et aucune règle métier n'est signalée.

Ce que la règle vérifie

La règle est évaluée une fois par ligne, sur chaque cac:InvoiceLine d'une facture et chaque cac:CreditNoteLine d'un avoir. Elle lit uniquement le cbc:ID qui appartient directement à la ligne et passe lorsque cet élément contient au moins un caractère autre qu'une espace.

Vide et blanc sont traités de la même façon. Lors d'un essai, une balise ouvrante et fermante sans rien entre elles, un <cbc:ID/> auto-fermant et un élément contenant trois espaces ont chacun signalé BR-21 avec PEPPOL-EN16931-R008. Un cbc:ID vide portant un attribut schemeID a échoué de la même façon, car un attribut n'est pas un contenu.

Une ligne sans aucun cbc:ID n'atteint jamais cette règle. Lors d'essais sur une facture et sur un avoir, l'étape XSD a refusé le document, et les étapes EN 16931 et Peppol ont été ignorées.

Au-delà de sa présence, la valeur n'est pas examinée. LINE-A passe aussi bien que 1, et lors d'un essai, une facture avec deux lignes toutes deux numérotées 1 a passé toutes les étapes. EN 16931 décrit l'identifiant de ligne comme unique dans le document : gardez-le unique, même si le validateur ne le vérifie pas.

TermeSignificationÉlément UBL
BT-126Identifiant de ligne de facturecac:InvoiceLine/cbc:ID (cac:CreditNoteLine/cbc:ID in a credit note)
BG-25Ligne de facturecac:InvoiceLine (cac:CreditNoteLine in a credit note)

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 numéros de ligne sont attribués lors de la comptabilisation de la facture, et le XML est construit à partir d'un brouillon dans lequel le champ est encore vide.
  • Les lignes ajoutées par l'export lui-même, comme des frais de livraison ou une ligne d'arrondi, n'ont pas d'enregistrement dans la table source et donc pas de numéro de ligne à copier.
  • Une référence de ligne nulle est sérialisée sous forme d'élément vide au lieu d'être remplie à partir du rang de la ligne.
  • L'identifiant est lu dans un champ qui n'existe que pour certains types de ligne, comme une référence de ligne de commande, et il est vide pour les lignes en texte libre.

Comment corriger le document

  1. Utilisez l'emplacement du constat, par exemple cac:InvoiceLine[1], pour voir quelle ligne est concernée. Chaque ligne dont l'identifiant est vide donne son propre constat.
  2. Prenez l'identifiant dans la ligne source : son numéro de ligne ou son rang sur la facture telle qu'émise. Si la source n'en a pas, numérotez les lignes dans l'ordre du document, 1, 2, 3, lors de la construction du XML.
  3. Gardez les identifiants uniques dans le document et identiques à ceux de tout PDF ou de toute copie de la facture, afin que l'acheteur puisse vous citer une ligne.
  4. Laissez cbc:ID là où le schéma le place, au début de la ligne, avant l'éventuel cbc:Note et la quantité. Le déplacer ou le supprimer transforme ce constat en échec XSD.

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 : l'identifiant de ligne est présent mais vide

<cac:InvoiceLine>
  <cbc:ID></cbc:ID>
  <cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
  <!-- item and price omitted from this fragment -->
</cac:InvoiceLine>

Fragment de la facture corrigée : la ligne porte le numéro 1

<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
  <!-- item and price omitted from this fragment -->
</cac:InvoiceLine>

Seul le cbc:ID de la ligne diffère : vide dans la facture en échec, 1 dans la facture corrigée. Le document en échec signale aussi PEPPOL-EN16931-R008, localisé à ce cbc:ID plutôt qu'à la ligne, car Peppol refuse tout élément sans contenu. Écrire le numéro de ligne lève les deux constats.

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 à cac:InvoiceLine dans un document UBL Invoice et à cac:CreditNoteLine dans un document CreditNote. Lors d'un essai sur un avoir, un identifiant de ligne vide a signalé BR-21 sur cac:CreditNoteLine[1] et PEPPOL-EN16931-R008 sur son cbc:ID, la même paire que sur la facture.
  • Les autres éléments cbc:ID ne sont pas lus par cette règle : ni le numéro du document directement sous la racine, couvert par BR-02, ni ceux imbriqués dans la ligne, comme le code de catégorie de TVA dans cac:ClassifiedTaxCategory.

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