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 est1.- Cette cohérence est vérifiée par la règle Peppol CII
PEPPOL-EN16931-R120avec une tolérance de0.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
/repairquand les composantsBT-146,BT-149,BT-129sont 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 "[email protected]"
Voir aussi
- Catalogue complet des erreurs BR-* EN16931
- Comprendre les messages Schematron EN16931
- Corriger automatiquement les erreurs réparables
- Champs obligatoires EN16931 : cartographie et mapping ERP
- Données ERP → Factur-X CII : guide de mapping JSON → XML — construction correcte de
invoice_data.lines[]avecpriceBaseQuantity - Valider EN16931 / Factur-X : XSD vs Schematron — l’arithmétique relève du Schematron, pas de l’XSD