Technique

Erreur BT-131 montant net ligne Factur-X : formule exacte Peppol EN16931-R120

3 min de lecture Par FacturX API

Le montant net de ligne (BT-131) suit la formule Peppol EN16931-R120 : ((BT-146 / BT-149) × BT-129) + BT-141 − BT-136. Base quantity souvent oubliée, arrondi sur le composant prix.

En bref

  • Le montant net de ligne (BT-131) doit respecter la formule Peppol : ((BT-146 / BT-149) × BT-129) + BT-141 − BT-136.
  • BT-149 (item price base quantity) est souvent oublié : s’il est absent, la valeur par défaut est 1.
  • Cette cohérence est vérifiée par la règle Peppol CII PEPPOL-EN16931-R120 avec une tolérance de 0.02.
  • L’arrondi à 2 décimales se fait sur le composant ((BT-146 / BT-149) × BT-129), puis les remises/frais de ligne sont ajoutés.
  • Réparable automatiquement par /repair quand les composants BT-146, BT-149, BT-129 sont exposés et cohérents.

Ce que l’erreur veut dire

Le montant net de ligne (BT-131, LineTotalAmount dans CII) est un agrégat calculé. La formule normative Peppol est : ((BT-146 / BT-149) × BT-129) + Σ charges ligne − Σ remises ligne, où BT-146 est le prix net unitaire, BT-149 la base quantity du prix (price base quantity) et BT-129 la quantité facturée. Cette cohérence est contrôlée par la règle Peppol CII PEPPOL-EN16931-R120 (avec tolérance de 0.02). Attention : BR-CO-10 au sens EN16931 ne contrôle PAS cette formule — BR-CO-10 contrôle l’agrégat document-level BT-106 = Σ BT-131.

Quand cette erreur arrive

Cette incohérence survient quand : (a) votre ERP n’expose pas BT-149 alors que la base quantity n’est pas 1 (par exemple, prix pour 100 unités) ; (b) l’arrondi est appliqué sur chaque opérande avant la multiplication ; (c) les remises/frais ligne sont appliqués sur le prix unitaire au lieu d’être exposés séparément dans SpecifiedTradeAllowanceCharge ; (d) le signe des remises/frais est inversé dans l’export XML.

Exemple XML qui peut déclencher l’erreur

<ram:IncludedSupplyChainTradeLineItem>
  <ram:SpecifiedLineTradeAgreement>
    <ram:NetPriceProductTradePrice>
      <ram:ChargeAmount>100.00</ram:ChargeAmount>
      <!-- ❌ pas de BasisQuantity alors que le prix est pour 10 unités -->
    </ram:NetPriceProductTradePrice>
  </ram:SpecifiedLineTradeAgreement>
  <ram:SpecifiedLineTradeDelivery>
    <ram:BilledQuantity unitCode="H87">30</ram:BilledQuantity>
  </ram:SpecifiedLineTradeDelivery>
  <ram:SpecifiedLineTradeSettlement>
    <ram:SpecifiedTradeSettlementLineMonetarySummation>
      <ram:LineTotalAmount>300.00</ram:LineTotalAmount>  <!-- ❌ devrait être 300.00 si BasisQuantity=1, mais 3000 si BasisQuantity=10 -->
    </ram:SpecifiedTradeSettlementLineMonetarySummation>
  </ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>

Exemple XML corrigé (avec base quantity exposée)

<ram:IncludedSupplyChainTradeLineItem>
  <ram:SpecifiedLineTradeAgreement>
    <ram:NetPriceProductTradePrice>
      <ram:ChargeAmount>100.00</ram:ChargeAmount>
      <ram:BasisQuantity unitCode="H87">10</ram:BasisQuantity>
    </ram:NetPriceProductTradePrice>
  </ram:SpecifiedLineTradeAgreement>
  <ram:SpecifiedLineTradeDelivery>
    <ram:BilledQuantity unitCode="H87">30</ram:BilledQuantity>
  </ram:SpecifiedLineTradeDelivery>
  <ram:SpecifiedLineTradeSettlement>
    <ram:SpecifiedTradeSettlementLineMonetarySummation>
      <ram:LineTotalAmount>300.00</ram:LineTotalAmount>  <!-- 100 / 10 × 30 = 300.00 -->
    </ram:SpecifiedTradeSettlementLineMonetarySummation>
  </ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>

Correction manuelle

Recalculer selon la formule complète : BT-131 = round(((BT-146 / BT-149) × BT-129), 2) + Σ BT-141 − Σ BT-136. Si BT-149 n’est pas pertinent (prix à l’unité), l’omettre — la valeur par défaut est 1. Les remises et frais de ligne s’exposent dans des blocs SpecifiedTradeAllowanceCharge séparés, pas en minorant/majorant le prix unitaire.

Réparable automatiquement par /repair ?

Oui, sous conditions — l’endpoint /repair corrige automatiquement cette erreur quand les données structurées sont récupérables. Dans les cas ambigus, une décision humaine reste nécessaire.

Et maintenant ?

Réparer mon Factur-X →

curl -X POST https://api.facturxapi.com/api/v1/repair \
  -H "Authorization: Bearer VOTRE_CLE" \
  -F "file=@facture.xml"

Voir aussi

#en16931 #schematron #factur-x #erreurs #validation