Sur cette page
La réponse courte
BR-CO-20 échoue lorsqu'un cac:InvoicePeriod à l'intérieur d'une ligne ne contient ni cbc:StartDate ni cbc:EndDate. Placez-y les dates de service de cette ligne, ou retirez l'élément des lignes qui ne facturent pas une période.
L'exemple enregistré est le <cac:InvoicePeriod/> vide qu'écrit un modèle lorsque les deux dates sont nulles. Peppol rejette aussi cet élément parce qu'il est vide, sous PEPPOL-EN16931-R008.
Ce que la règle vérifie
La règle parcourt chaque cac:InvoicePeriod de ligne, dans cac:InvoiceLine ou cac:CreditNoteLine, et est satisfaite lorsqu'au moins l'un des deux éléments de date est présent. Une date de début seule ou une date de fin seule suffit ; lors d'un essai, chacune a passé toutes les étapes.
Rien d'autre ne compte dans une période de ligne. Lors d'un essai, une période de ligne ne contenant que cbc:DescriptionCode 35 a signalé BR-CO-20 avec l'avertissement UBL-CR-523, et une autre ne contenant qu'un cbc:Description l'a signalé avec UBL-CR-524.
La règle de ligne est plus stricte que celle du document entier. Lors d'un essai, une période ne contenant que cbc:DescriptionCode 35 a passé au niveau du document, où BR-CO-19 accepte le code comme code de date d'exigibilité de la TVA.
Les espaces ne rendent pas l'élément moins vide. Lors d'un essai, une balise ouvrante et une balise fermante cac:InvoicePeriod sur des lignes séparées, avec seulement des espaces entre elles, ont signalé les deux mêmes règles que l'exemple enregistré.
Des éléments de date vides n'atteignent jamais cette règle : un cbc:StartDate ou cbc:EndDate vide n'est pas une date valide dans le schéma UBL, et lors d'un essai l'étape XSD a échoué avant qu'une règle métier ne s'exécute.
| Terme | Signification | Élément UBL |
|---|---|---|
| BG-26 | Période de facturation de la ligne | cac:InvoiceLine/cac:InvoicePeriod (cac:CreditNoteLine/cac:InvoicePeriod in a credit note) |
| BT-134 | Date de début de la période de facturation de la ligne | cac:InvoiceLine/cac:InvoicePeriod/cbc:StartDate (cac:CreditNoteLine/cac:InvoicePeriod/cbc:StartDate in a credit note) |
| BT-135 | Date de fin de la période de facturation de la ligne | cac:InvoiceLine/cac:InvoicePeriod/cbc:EndDate (cac:CreditNoteLine/cac:InvoicePeriod/cbc:EndDate 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 :
- Le modèle de ligne écrit toujours
cac:InvoicePeriodet ne remplit les dates que pour les lignes d'abonnement ou d'usage, si bien que les articles ponctuels reçoivent une période vide. - Le sérialiseur supprime les champs de date nuls mais conserve leur élément parent.
- Un libellé de période de facturation, comme un nom de mois, est écrit dans
cbc:Descriptionsur la ligne au lieu d'être converti en dates. - Le mapping de la période du document, qui peut porter un code de date d'exigibilité de la TVA, a été réutilisé pour les lignes, où ce code n'a pas sa place.
Comment corriger le document
- Trouvez la ligne à partir de l'emplacement du constat, par exemple
cac:InvoiceLine[1]/cac:InvoicePeriod[1]. - Si la ligne facture une période de service, écrivez son premier jour dans
cbc:StartDateet son dernier jour danscbc:EndDateau formatYYYY-MM-DD, ou au moins la seule date dont dispose la source. - Si la ligne n'est liée à aucune période, retirez-en
cac:InvoicePeriod. Le groupe est facultatif sur une ligne. - N'émettez l'élément que lorsque l'une de ses dates a une valeur, afin qu'une valeur nulle ne produise plus jamais de groupe vide.
- Gardez les libellés de période hors de la ligne :
cbc:Descriptionetcbc:DescriptionCodey sont hors du modèle et entraînent des avertissements.
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 ligne 1 a un élément de période vide
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<cac:InvoicePeriod/>
<!-- item and price omitted from this fragment -->
</cac:InvoiceLine>Fragment de la facture corrigée : la période de ligne va du 1er au 15 août
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<cac:InvoicePeriod>
<cbc:StartDate>2026-08-01</cbc:StartDate>
<cbc:EndDate>2026-08-15</cbc:EndDate>
</cac:InvoicePeriod>
<!-- item and price omitted from this fragment -->
</cac:InvoiceLine>La facture en échec a un <cac:InvoicePeriod/> vide sur la ligne 1, là où la facture corrigée a une date de début au 2026-08-01 et une date de fin au 2026-08-15 ; la période du document pour août est la même dans les deux. À côté de BR-CO-20, le document en échec signale PEPPOL-EN16931-R008 au même élément, car un élément sans contenu n'est pas autorisé. Renseigner les dates, ou retirer l'élément, lève les deux constats.
Ce que le validateur a signalé
- La facture en erreur signale BR-CO-20 et PEPPOL-EN16931-R008. 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 aux documents
InvoiceetCreditNote. Lors d'un essai, une période vide sur uncac:CreditNoteLinea signaléBR-CO-20etPEPPOL-EN16931-R008de la même façon. - La période du document entier relève de
BR-CO-19: lors d'un essai, uncac:InvoicePeriodvide sous la racine a signalé cette règle-là, et non celle-ci. - Une fois les deux dates présentes,
BR-30vérifie leur ordre, et par rapport à une période du document,PEPPOL-EN16931-R110etPEPPOL-EN16931-R111vérifient que la ligne y reste.
Règles liées
- BR-CO-19 est l'exigence de date pour la période de facturation du document entier
- BR-30 vérifie qu'une période de ligne portant les deux dates ne se termine pas avant de commencer
- PEPPOL-EN16931-R008 rejette la période de ligne vide de l'exemple enregistré
- PEPPOL-EN16931-R110 compare chaque date de début de ligne au début de la période de facturation
- 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-28.1 : source vérifiée le 2026-09-28, explication mise à jour le 2026-09-28.
La définition officielle de BR-CO-20 (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.

