En bref
- BR-33 exige qu’une
DocumentLevelAllowance(BG-20) ait soitReason(BT-97) soitReasonCode(BT-98). - BR-31 est une règle DIFFÉRENTE : elle concerne la présence du montant de la remise (
BT-92). - Le code de raison vient du subset UNCL 5189 — à revérifier dans la code-list EN16931 en vigueur avant toute génération automatique.
- Le texte libre
Reasonest accepté ; le code est préféré pour l’interopérabilité inter-systèmes. - Réparable automatiquement par
/repairquand un code raison par défaut est acceptable (best-effort, à valider métier).
Ce que l’erreur veut dire
BR-33 (règle cœur EN16931, aussi IBR-033 dans PINT) impose que toute DocumentLevelAllowance (remise documentaire au niveau facture, BG-20) déclare au moins une justification : soit Reason (texte libre, BT-97), soit ReasonCode (code du subset UNCL 5189, BT-98). Attention : BR-31 est une règle différente — elle vérifie la présence du MONTANT de la remise (BT-92), pas de la raison.
Quand cette erreur arrive
Survient quand : (a) une remise est appliquée par l’ERP sans champ libre associé ; (b) la remise est purement commerciale et n’a pas de motif explicite saisi ; (c) remise calculée par règle métier (volume, fidélité) sans expliciter le moteur de calcul ; (d) export XML qui oublie le bloc Reason/ReasonCode même quand la valeur est saisie côté ERP.
Exemple XML qui déclenche l’erreur
<ram:SpecifiedTradeAllowanceCharge>
<ram:ChargeIndicator><udt:Indicator>false</udt:Indicator></ram:ChargeIndicator>
<ram:ActualAmount>50.00</ram:ActualAmount>
<!-- ❌ ni Reason ni ReasonCode -->
</ram:SpecifiedTradeAllowanceCharge>
Exemple XML corrigé
<ram:SpecifiedTradeAllowanceCharge>
<ram:ChargeIndicator><udt:Indicator>false</udt:Indicator></ram:ChargeIndicator>
<ram:ActualAmount>50.00</ram:ActualAmount>
<ram:ReasonCode>95</ram:ReasonCode>
<ram:Reason>Remise commerciale fidélité</ram:Reason>
</ram:SpecifiedTradeAllowanceCharge>
Correction manuelle
Ajouter <ram:ReasonCode> (recommandé) avec un code du subset UNCL 5189 valide dans la code-list EN16931 en vigueur. Compléter idéalement avec un <ram:Reason> en texte libre pour la lisibilité humaine. Avant de mettre un code en dur dans votre pipeline, vérifier dans la code-list que le code est bien autorisé au moment de la génération.
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]"