Sur cette page
La réponse courte
BR-CO-23 échoue lorsqu'un cac:AllowanceCharge dans cac:InvoiceLine (ou cac:CreditNoteLine) a un cbc:ChargeIndicator à false et ne porte ni cbc:AllowanceChargeReasonCode ni cbc:AllowanceChargeReason. Donnez son motif à la remise de ligne : un code UNTDID 5189, une description, ou les deux.
La même remise est aussi signalée comme BR-42, une seconde règle EN 16931 au contrôle identique. Ajouter le motif une seule fois satisfait les deux.
Ce que la règle vérifie
La règle examine chaque cac:AllowanceCharge enfant direct d'une ligne qui se lit comme une remise. La remise est acceptée dès que l'un des deux éléments de motif y existe.
Chaque remise est jugée séparément : une ligne avec deux remises a besoin d'un motif sur chacune, et chaque ligne du document est parcourue.
La remise sur prix dans cac:Price est un autre élément et sort du champ de cette règle. L'exemple enregistré avec remise sur prix n'a pas de motif sur sa remise au niveau du prix et se valide sans constat.
Les frais de ligne en sortent aussi. La facture complète a des frais de ligne avec un texte de motif et sans code, ce qui suffit pour leur propre règle, BR-CO-24.
Un élément présent satisfait la règle même sans contenu. Lors d'un essai, un cbc:AllowanceChargeReason vide sur la remise de ligne a passé BR-CO-23 et a été signalé à la place par PEPPOL-EN16931-R008.
| Terme | Signification | Élément UBL |
|---|---|---|
| BG-27 | Remises sur la ligne de facture | cac:InvoiceLine/cac:AllowanceCharge[cbc:ChargeIndicator = false] (cac:CreditNoteLine/cac:AllowanceCharge in a credit note) |
| BT-139 | Motif de la remise de ligne de facture | cac:InvoiceLine/cac:AllowanceCharge/cbc:AllowanceChargeReason |
| BT-140 | Code du motif de la remise sur la ligne de facture | cac:InvoiceLine/cac:AllowanceCharge/cbc:AllowanceChargeReasonCode |
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 :
- Une remise client ou une remise sur volume est appliquée ligne par ligne par un moteur de prix qui enregistre le pourcentage et le montant, mais pas le type de remise.
- Les remises de ligne sont générées à partir de l'écart entre prix catalogue et prix de vente, ce qui ne laisse aucun motif à rattacher.
- Le motif est mappé pour les remises au niveau du document, mais le mapping au niveau des lignes a été écrit séparément et l'omet.
- Le texte du motif est tronqué ou nettoyé jusqu'à être vide, et l'élément est alors omis.
Comment corriger le document
- Retrouvez la ligne et la remise dans l'emplacement du constat, par exemple
cac:InvoiceLine[1]/cac:AllowanceCharge[1]. Le second index compte chaquecac:AllowanceChargede cette ligne, frais compris. - Reportez le type de remise depuis l'enregistrement de prix qui a produit la remise.
- Lorsque le type correspond à une entrée de UNTDID 5189, écrivez ce code dans
cbc:AllowanceChargeReasonCode(95pour une remise simple). Ajoutezcbc:AllowanceChargeReasonavec la description, ou envoyez le texte seul lorsqu'aucun code ne convient. - Gardez les éléments dans l'ordre UBL, juste après
cbc:ChargeIndicatoret avantcbc:MultiplierFactorNumericetcbc:Amount. Aucun montant de la ligne n'est à recalculer.
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 remise de 5 pour cent sur la ligne 1 n'a pas de motif, les frais de ligne à côté en ont un
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<!-- note, quantity, line net amount, accounting cost and order line reference omitted from this fragment -->
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:MultiplierFactorNumeric>5</cbc:MultiplierFactorNumeric>
<cbc:Amount currencyID="GBP">2.00</cbc:Amount>
<cbc:BaseAmount currencyID="GBP">40.00</cbc:BaseAmount>
</cac:AllowanceCharge>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>Example charge</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="GBP">0.01</cbc:Amount>
</cac:AllowanceCharge>
<!-- item and price omitted from this fragment -->
</cac:InvoiceLine>Fragment de la facture corrigée : la remise de ligne porte le code de motif 95 et un texte de motif
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<!-- note, quantity, line net amount, accounting cost and order line reference omitted from this fragment -->
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Example discount</cbc:AllowanceChargeReason>
<cbc:MultiplierFactorNumeric>5</cbc:MultiplierFactorNumeric>
<cbc:Amount currencyID="GBP">2.00</cbc:Amount>
<cbc:BaseAmount currencyID="GBP">40.00</cbc:BaseAmount>
</cac:AllowanceCharge>
<!-- line charge, item and price omitted from this fragment -->
</cac:InvoiceLine>Sur la ligne 1, la facture corrigée porte le code de motif 95 et le texte Example discount sur la remise de 5 pour cent ; la facture en échec n'a ni l'un ni l'autre, et rien d'autre ne change. Le document en échec signale aussi BR-42, qui applique le même contrôle que BR-CO-23 à la même remise : la même modification lève donc les deux. Les frais de ligne voisins avaient déjà un texte de motif et n'ont pas été signalés.
Ce que le validateur a signalé
- La facture en erreur signale
BR-42et BR-CO-23. 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 à
cac:InvoiceLinedans uneInvoiceet àcac:CreditNoteLinedans unCreditNote. Lors d'un essai, la version avoir de l'exemple enregistré a signaléBR-42etBR-CO-23àcac:CreditNoteLine[1]/cac:AllowanceCharge[1]. - Seule l'étape EN 16931 signale un motif manquant. Lorsqu'un code est présent, l'étape Peppol le vérifie par rapport à la liste des remises en tant que
PEPPOL-EN16931-CL002, et l'étape EN 16931 en tant queBR-CL-19. - Le montant d'une remise de ligne entre dans le calcul du montant net de la ligne, mais ajouter un motif ne change aucune valeur.
Règles liées
- BR-CO-21 est la même exigence pour les remises portant sur l'ensemble du document
- BR-CL-19 vérifie un code de motif de remise de ligne par rapport à la liste UNTDID 5189
- PEPPOL-EN16931-R120 soustrait la remise de ligne lorsqu'il vérifie le montant net de la ligne
- PEPPOL-EN16931-R040 vérifie le montant de la remise de ligne par rapport à son montant de base et à son pourcentage
- 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-CO-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.

