Aller au contenu

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

BR-CO-20 : Mettre une date dans chaque période de ligne, ou omettre la période

Un cac:InvoicePeriod sur une ligne de facture ou d'avoir doit contenir cbc:StartDate, cbc:EndDate ou les deux. Contrairement à la période du document, un code seul échoue.

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

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.

TermeSignificationÉlément UBL
BG-26Période de facturation de la lignecac:InvoiceLine/cac:InvoicePeriod (cac:CreditNoteLine/cac:InvoicePeriod in a credit note)
BT-134Date de début de la période de facturation de la lignecac:InvoiceLine/cac:InvoicePeriod/cbc:StartDate (cac:CreditNoteLine/cac:InvoicePeriod/cbc:StartDate in a credit note)
BT-135Date de fin de la période de facturation de la lignecac: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:InvoicePeriod et 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:Description sur 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

  1. Trouvez la ligne à partir de l'emplacement du constat, par exemple cac:InvoiceLine[1]/cac:InvoicePeriod[1].
  2. Si la ligne facture une période de service, écrivez son premier jour dans cbc:StartDate et son dernier jour dans cbc:EndDate au format YYYY-MM-DD, ou au moins la seule date dont dispose la source.
  3. Si la ligne n'est liée à aucune période, retirez-en cac:InvoicePeriod. Le groupe est facultatif sur une ligne.
  4. 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.
  5. Gardez les libellés de période hors de la ligne : cbc:Description et cbc:DescriptionCode y 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é

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 Invoice et CreditNote. Lors d'un essai, une période vide sur un cac:CreditNoteLine a signalé BR-CO-20 et PEPPOL-EN16931-R008 de la même façon.
  • La période du document entier relève de BR-CO-19 : lors d'un essai, un cac:InvoicePeriod vide sous la racine a signalé cette règle-là, et non celle-ci.
  • Une fois les deux dates présentes, BR-30 vérifie leur ordre, et par rapport à une période du document, PEPPOL-EN16931-R110 et PEPPOL-EN16931-R111 vérifient que la ligne y reste.

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.