Sur cette page
La réponse courte
BR-CO-04 échoue pour chaque cac:InvoiceLine (ou cac:CreditNoteLine) dont l'article n'a pas de cac:ClassifiedTaxCategory avec un cbc:ID sous le régime fiscal VAT. Ajoutez cbc:ID comme premier enfant de cac:Item/cac:ClassifiedTaxCategory, avec la catégorie de TVA dans laquelle la ligne a été taxée : Z pour la ligne au taux zéro de l'exemple enregistré.
Une ligne sans catégorie sort aussi de sa ventilation de la TVA. La ventilation inclut toujours le montant de la ligne, si bien que le contrôle de la base imposable de cette catégorie échoue en même temps.
Ce que la règle vérifie
La règle s'exécute une fois par ligne, et l'emplacement du constat est la ligne. Elle cherche dans cac:Item un cac:ClassifiedTaxCategory dont le cac:TaxScheme/cbc:ID vaut VAT, sans tenir compte de la casse ni des espaces qui l'entourent, et passe lorsque cette catégorie a un élément cbc:ID.
Une catégorie sous un autre régime fiscal ne compte pas. Lors d'un essai, une ligne dont la catégorie avait le régime fiscal GST a été signalée par cette règle.
Un cbc:ID présent mais vide n'est pas détecté ici. Lors d'un essai, un code vide sur une ligne au taux normal a été signalé par BR-CL-18 et PEPPOL-EN16931-R008 à la place, avec BR-S-01 et BR-S-08.
Une ligne sans aucun cac:ClassifiedTaxCategory fait aussi échouer cette règle. Lors d'un essai, elle a en outre signalé UBL-SR-48, qui demande exactement une catégorie de taxe classifiée par ligne.
| Terme | Signification | Élément UBL |
|---|---|---|
| BG-25 | Ligne de facture | cac:InvoiceLine (cac:CreditNoteLine in a credit note) |
| BT-151 | Code de catégorie de TVA de l'article facturé | cac:InvoiceLine/cac:Item/cac:ClassifiedTaxCategory/cbc:ID (cac:CreditNoteLine/cac:Item/cac:ClassifiedTaxCategory/cbc:ID 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 articles sans code fiscal dans le référentiel produits sont exportés avec une catégorie de taxe vide au lieu d'être bloqués.
- La catégorie de la ligne n'est écrite que lorsqu'elle diffère d'une valeur par défaut du document, si bien que les lignes de la catégorie par défaut la perdent.
- Les lignes au taux zéro ou exonérées sont traitées comme si elles ne portaient pas de TVA, et l'export omet leur code de catégorie.
- Les lignes saisies à la main, comme des services ponctuels ou des ajustements, sont créées sans code fiscal d'article.
Comment corriger le document
- Trouvez la catégorie de TVA dans laquelle la ligne a réellement été taxée, à partir du code fiscal de son article ou de la détermination fiscale de cette ligne.
- Écrivez-la sous la forme de
cbc:ID, premier enfant decac:ClassifiedTaxCategory, suivi decbc:Percent(omis pour la catégorieO) et decac:TaxSchemeavec uncbc:IDégal àVAT. - Vérifiez que la ligne relève désormais de la ventilation de même catégorie et de même taux, afin que la base imposable de cette ventilation corresponde de nouveau à ses lignes.
- Arrêtez l'export lorsqu'une ligne n'a pas de code fiscal, plutôt que de l'envoyer sans catégorie.
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 ventilation au taux zéro totalise 10.00, mais la ligne 2 a perdu son code de catégorie
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">10.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>Z</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<!-- tax scheme omitted from this fragment -->
</cac:TaxCategory>
</cac:TaxSubtotal>
<cac:InvoiceLine>
<cbc:ID>2</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="GBP">10.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Example zero-rated item</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:Percent>0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<!-- price omitted from this fragment -->
</cac:InvoiceLine>Fragment de la facture corrigée : la ligne 2 est de nouveau au taux zéro
<cac:InvoiceLine>
<cbc:ID>2</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="GBP">10.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Example zero-rated item</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>Z</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<!-- price omitted from this fragment -->
</cac:InvoiceLine>La facture corrigée a <cbc:ID>Z</cbc:ID> au début du cac:ClassifiedTaxCategory de la ligne 2 ; rien d'autre ne diffère. Le document en échec signale aussi BR-Z-08, qui exige que la base imposable de la ventilation au taux zéro soit égale aux montants des lignes au taux zéro. Sans catégorie pour la ligne 2, le document n'a aucune ligne au taux zéro : le montant attendu est donc 0.00, contre 10.00 dans la ventilation. BR-Z-01 reste muette, car elle ne s'oppose pas à une ventilation au taux zéro sans rien au taux zéro derrière elle. Rétablir le code efface les deux constats.
Ce que le validateur a signalé
- La facture en erreur signale BR-CO-04 et
BR-Z-08. 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 à
InvoiceetCreditNoteen UBL. Dans un avoir, la ligne estcac:CreditNoteLine; avec le code retiré de son unique ligne, au taux normal, l'avoir a signalé cette règle avecBR-S-01etBR-S-08lors d'un essai. - Les constats associés dépendent de la catégorie que la ligne a perdue. Une ligne au taux normal laisse la ventilation au taux normal sans rien derrière elle, ce que
BR-S-01etBR-S-08détectent toutes deux ; la ligne au taux zéro de cet exemple n'entraîne queBR-Z-08. - Signalée par l'étape EN 16931. Une fois un code présent,
BR-CL-18vérifie qu'il s'agit d'un code de catégorie autorisé. - Les remises et frais au niveau du document portent leur catégorie dans
cac:AllowanceCharge/cac:TaxCategory, que cette règle ne lit pas ;BR-32couvre les remises.
Règles liées
- BR-CL-18 vérifie que le code de catégorie de la ligne est l'un des codes autorisés
- BR-47 est la même exigence pour le code de catégorie de chaque ventilation de la TVA
- BR-S-01 est signalée avec cette règle lorsque la ligne sans catégorie était au taux normal
- BR-Z-01 exige une ventilation au taux zéro lorsqu'il existe des lignes au taux zéro, mais pas l'inverse
- 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-04 (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.

