Aller au contenu

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

BR-26 : Ajouter le prix net de l'article sur chaque ligne

Chaque ligne exige cac:Price/cbc:PriceAmount, le prix net unitaire. Une ligne sans cac:Price échoue ici, et le calcul de ligne de Peppol échoue avec elle.

EN 16931Erreur : le document n'est pas valideLignes et prixChamps de base

Sur cette page

La réponse courte

BR-26 échoue lorsqu'une ligne n'a pas de cac:Price/cbc:PriceAmount. Ajoutez un bloc cac:Price après cac:Item, contenant le prix net unitaire dans cbc:PriceAmount, ainsi qu'un cbc:BaseQuantity si le prix est exprimé pour plus d'une unité.

Le prix est le montant net pour une unité, ou pour la quantité de base, après une éventuelle remise sur le prix. Ce n'est pas le total de la ligne : la ligne enregistrée de 2 unités valant 25.00 a un prix de 12.5.

Ce que la règle vérifie

La règle s'exécute sur chaque cac:InvoiceLine ou cac:CreditNoteLine et est satisfaite lorsque la ligne a un cac:Price contenant un cbc:PriceAmount. Le montant n'est pas évalué ici ; un prix de 0 passe.

En pratique, ce constat signifie que tout le bloc cac:Price manque. Le schéma UBL permet à une ligne d'omettre cac:Price, mais dès que cac:Price est présent, il doit contenir un cbc:PriceAmount numérique. Lors d'un essai, un cac:Price ne contenant qu'une quantité de base, un cac:Price vide et un cbc:PriceAmount vide ont tous été refusés à l'étape XSD : aucun d'eux n'a donc atteint cette règle.

Deux autres règles échouent sur la même ligne chaque fois que le prix manque. BR-27 compare le prix à zéro, et un prix qui n'existe pas ne passe pas cette comparaison. PEPPOL-EN16931-R120 traite un prix manquant comme 0 : il attend donc que le montant de la ligne soit simplement les frais de la ligne moins les remises de la ligne.

TermeSignificationÉlément UBL
BT-146Prix net de l'articlecac:InvoiceLine/cac:Price/cbc:PriceAmount (cac:CreditNoteLine/cac:Price/cbc:PriceAmount in a credit note)
BG-29Détail du prixcac:InvoiceLine/cac:Price
BT-149Quantité de base du prix de l'articlecac:InvoiceLine/cac:Price/cbc:BaseQuantity

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 lignes de forfait ou de frais ponctuels ne sont conservées que sous forme de montant, et l'export n'écrit aucun prix parce que la source n'a pas de prix unitaire pour elles.
  • Le bloc de prix n'est émis que si une entrée de liste de prix existe, et cette ligne a été tarifée à la main.
  • Le mapping a été écrit uniquement d'après le schéma UBL, où cac:Price est facultatif : il n'a donc jamais été ajouté.
  • Le prix est repris de la ligne de commande, et les lignes ajoutées au moment de la facturation n'ont pas de ligne de commande d'où le reprendre.

Comment corriger le document

  1. Repérez la ligne grâce à l'emplacement du constat.
  2. Prenez le prix net unitaire de la ligne source : le prix par unité après une éventuelle remise au niveau du prix. Si la source ne contient qu'une quantité et un montant, divisez le montant avant remises et frais de ligne par la quantité, en gardant assez de décimales pour que quantité x prix retombe sur ce montant à 0.02 près.
  3. Écrivez cac:Price après cac:Item dans la ligne, avec cbc:PriceAmount dans la devise du document et, pour un prix exprimé pour plusieurs unités, cbc:BaseQuantity avec le même unitCode que la quantité de la ligne.
  4. Gardez le prix nul ou positif. Une ligne de déduction ou de correction reçoit une quantité négative et un prix positif, sinon c'est BR-27 qui échoue à la place.

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 se termine après l'article, sans prix

<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
  <cac:Item>
    <cbc:Name>Example service</cbc:Name>
    <!-- tax category omitted from this fragment -->
  </cac:Item>
</cac:InvoiceLine>

Fragment de la facture corrigée : un prix de 12.5 pour 1 C62 suit l'article

<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
  <cac:Item>
    <cbc:Name>Example service</cbc:Name>
    <!-- tax category omitted from this fragment -->
  </cac:Item>
  <cac:Price>
    <cbc:PriceAmount currencyID="GBP">12.5</cbc:PriceAmount>
    <cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
  </cac:Price>
</cac:InvoiceLine>

La facture corrigée a un bloc cac:Price avec un cbc:PriceAmount de 12.5 et un cbc:BaseQuantity de 1 ; la facture en échec n'a aucun prix sur la ligne 1. Le document en échec signale aussi BR-27, car le contrôle vérifiant que le prix n'est pas négatif n'a aucune valeur à comparer et échoue, et PEPPOL-EN16931-R120, car avec un prix compté comme 0 la ligne devrait valoir 0.00, et non 25.00. Rétablir le prix fait disparaître les trois 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 une Invoice UBL et à cac:CreditNoteLine dans un CreditNote, où cac:Price a la même structure. Lorsque le prix a été retiré d'une ligne d'avoir, les trois mêmes règles ont été signalées sur cac:CreditNoteLine[1].
  • Le prix brut et la remise sur le prix dans cac:Price/cac:AllowanceCharge sont facultatifs et ne jouent aucun rôle dans cette règle. Lorsqu'ils sont présents, PEPPOL-EN16931-R046 vérifie que le prix net en découle.
  • Un prix de zéro compte comme présent. Sur une ligne dont le montant net n'est pas nul, il échoue quand même au calcul de ligne : lors d'un essai sur la ligne enregistrée, un prix de 0 a signalé PEPPOL-EN16931-R120 seul.

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