Une plateforme agréée ne lit pas votre facture, elle la vérifie. Quand le message dit que le XML « n'a pas passé la validation Schematron », c'est qu'une règle de la norme a échoué — ici parce qu'une remise avait été saisie comme une ligne à prix négatif. La facture est refusée ; refaite avec la remise sur chaque ligne, elle passe. Voici le message, la cause, et le geste.
Le message, tel qu'il arrive
Dans Odoo, il tombe dans le fil de la facture, quelques minutes après l'envoi à la plateforme agréée. Le voici, tel qu'il s'affiche :
E-Invoicing Status Update
PA Status: Error
Errors from PA Invoice:
The XML document did not pass the Schematron validation.
Schematron Validation failed with error:
Fatal:
Num Fact :
Somme calculée :
[BR-FREXT-S-08ini] - Num Fact :
Warning:
[BR-FREXT-S-08ini] warning - Num Fact :
[BR-FREXT-S-08rev] warning - Num Fact :
Trois choses à lire dedans. « PA Status: Error » : la plateforme agréée a refusé la facture, elle n'est pas partie chez le client. « Schematron validation » : le refus vient d'une règle de gestion, pas d'un problème de connexion. « BR-FREXT-S-08 » : le nom de la règle qui a échoué. Le reste — « Num Fact », « Somme calculée » — est le gabarit du message ; la plateforme ne renvoie pas toujours les valeurs.
Qu'est-ce qu'une validation Schematron ?
Une facture électronique est un fichier de données structurées selon la norme européenne EN 16931. Un Schematron est un jeu de règles qui vérifie qu'un fichier respecte cette norme : pas seulement sa forme, mais sa cohérence — les totaux qui s'additionnent, les taux de TVA présents là où ils doivent l'être, les identifiants au bon format. Chaque plateforme agréée passe la facture au Schematron avant de la transmettre. Une règle échouée en « Fatal » arrête tout ; une règle en « Warning » laisse passer mais signale.
Les règles portent des noms codés. BR-S-08, dans la norme européenne, vérifie que la base de TVA déclarée au taux normal est égale à la somme des lignes facturées à ce taux, remises et frais de pied compris. Le Schematron français, publié avec la norme AFNOR XP Z12-012, a renommé plusieurs règles génériques avec le préfixe BR-FREXT pour distinguer le socle européen de l'extension française : BR-FREXT-S-08 est la déclinaison française de cette règle. Les suffixes « ini » et « rev » désignent des variantes de la même règle ; leur sens précis est dans la norme, pas dans le message.
Le cas type
Une facture dont on offre la totalité : plusieurs lignes de prestation au prix normal, et une dernière ligne « Remise 100 % » au prix négatif qui annule le tout. Total : 0 €. C'est une façon courante de présenter une remise dans un devis, et Odoo l'accepte sans broncher à la validation.
Mais la norme ne l'admet pas telle quelle. La règle BR-27 dit que le prix net d'un article ne peut pas être négatif. Pour la respecter, Odoo transforme une ligne à prix négatif en ligne à prix positif et quantité négative au moment de produire le XML — c'est écrit dans son code, et c'est conforme. Le fichier est alors une facture à zéro dont la ventilation de TVA doit se réconcilier avec des lignes de signes opposés. C'est là que la plateforme dit non : la somme qu'elle recalcule ne correspond pas à la base déclarée, et BR-FREXT-S-08 échoue en « Fatal ».
Ce qui passe
- Un avoir sur la facture refusée. Une facture validée puis envoyée ne se modifie pas : elle s'annule par un avoir qui la référence, et c'est ce que la norme attend aussi.
- Une nouvelle facture, avec les mêmes lignes, et la remise portée sur chaque ligne, dans le champ « Remise » à 100 %. Le total est toujours 0 €, mais chaque ligne est cohérente en elle-même : un prix positif, une remise, un net à zéro, un taux de TVA.
- Le renvoi, et la lecture des statuts : « PA Status: Done », puis « Made Available » — la facture est déposée chez le client —, et « PPF Status: Sent » — les données fiscales sont parties à l'administration.
La leçon tient en une phrase : une remise est un attribut de la ligne ou du pied de facture, jamais une ligne à part au prix négatif. Sur papier, les deux se lisent pareil. Dans un fichier structuré, seule la première forme dit ce qu'elle veut dire.
Comment s'en prémunir
- Remisez dans le champ prévu. Sur un devis Odoo, la remise se saisit par ligne, en pourcentage ; une remise globale s'applique par l'outil dédié, qui la répartit. Une ligne « Remise » avec un prix négatif est un contournement, et c'est précisément ce que la plateforme refuse.
- Lisez le fil de la facture dans les minutes qui suivent l'envoi. Le statut passe par « Envoyée », puis « Done » et « Made Available » ; une erreur y tombe au même endroit, sans courriel.
- Testez avec une vraie facture avant d'en dépendre. Une capture d'écran de configuration ne prouve rien ; une facture qui arrive, si. C'est le geste que nous faisons le lendemain de chaque mise en service, pour cette raison.
Et pour vous ?
Si votre logiciel est raccordé et qu'une facture revient en erreur, le message nomme la règle : c'est par elle qu'on commence. Si vous n'êtes pas encore raccordé, le simulateur « Suis-je concerné ? » dit si la réforme s'applique à vous, et la conformité facture électronique ce que nous proposons pour se mettre en règle, test réel compris. Les termes — plateforme agréée, Factur-X, statuts du cycle de vie — sont définis dans le glossaire.
Sources
- Norme EN 16931 : règles de gestion BR-27 (le prix net d'un article ne peut pas être négatif) et BR-S-08 (base de TVA au taux normal égale à la somme des lignes à ce taux), telles que citées dans le code source d'Odoo, module
account_edi_ubl_cii, version saas-19.4. - AFNOR XP Z12-012 — Formats et profils de facture électronique du socle minimum.
- Factur-X — FNFE-MPE.