- Termes métier
- BT-112 Invoice total amount with VAT BT-115 Amount due for payment BT-84 Payment account identifier BT-109 Invoice total amount without VAT BT-110 Invoice total VAT amount BT-1 Invoice number
- Exemples de code
- VB.NET
- Publié le
Une facture ZUGFeRD comporte deux parties : le PDF que lisent les personnes et le XML intégré que traitent les logiciels. Juridiquement, c'est le XML qui compte. Dans beaucoup d'entreprises, on contrôle et on valide pourtant ce qu'affiche le PDF. Personne ne s'assure que les deux parties disent la même chose.
En bref : dans une facture électronique hybride, la partie structurée – le XML – fait foi. Si le PDF visible s'en écarte, la personne qui valide voit un autre montant ou d'autres coordonnées bancaires que ceux traités par le logiciel comptable. Il peut s'agir d'une erreur ou d'une tentative de fraude. À partir de la version 11.0.0.19, le SDK Aloaha ZUGFeRD vérifie en un seul appel, CheckPDFTextAgainstXML, si le montant de la facture, le montant à payer, le numéro de facture et l'IBAN du XML sont aussi imprimés sur les pages du PDF.
Pourquoi c'est important
Selon la lettre du ministère fédéral allemand des Finances du 15 octobre 2024 (point 31), les données de facture du XML constituent la partie déterminante d'un format hybride comme ZUGFeRD. Si le PDF et le XML divergent, les données du XML priment. Si le PDF présente d'autres mentions, il peut être considéré comme une facture supplémentaire, pour laquelle l'article 14c de la loi allemande sur la TVA doit être examiné ; la déduction de la TVA n'est possible que sur la base de la partie structurée (point 32). Le PDF n'est donc qu'une représentation pour l'œil humain.
En pratique, c'est souvent l'inverse : la facture arrive par e-mail, quelqu'un ouvre le PDF, vérifie le montant et le fournisseur, puis valide. Le logiciel lit ensuite le XML et paie ce qui y figure. Aucun contrôle n'existe entre ces deux étapes.
| Ce qui peut arriver | Conséquence |
|---|---|
| Fraude : le PDF montre les coordonnées bancaires connues et le montant attendu, le XML contient un autre IBAN ou un montant plus élevé. | La validation suit le PDF, le paiement suit le XML – vers le mauvais compte. |
| Confusion : le XML d'une autre facture a été intégré, par exemple issu d'un test. | Une facture que personne n'a vue est comptabilisée. Nous avons trouvé exactement ce cas dans un fichier réel d'un client. |
| Versions différentes : le PDF et le XML proviennent de deux traitements, la facture ayant été modifiée entre-temps. | Montant ou TVA diffèrent entre PDF et XML. L'article 14c de la loi allemande sur la TVA doit alors aussi être examiné. |
| XML remplacé après coup : un tiers échange la pièce jointe d'une facture interceptée. | Le PDF semble inchangé, les données sont autres. |
Une validation formelle selon l'EN 16931 ne détecte pas ces cas : le XML peut être parfaitement valide en soi. Il ne correspond simplement pas au PDF.
Le contrôle : CheckPDFTextAgainstXML
La fonction lit le XML intégré et le texte des pages du PDF, puis recherche les valeurs clés du XML dans le texte imprimé. Les montants sont reconnus dans toutes les notations usuelles (1.234,56 – 1,234.56 – 1234,56 – 1 234,56).
| Valeur | Champ | Effet sur le résultat |
|---|---|---|
| Montant total (TTC) | BT-112 | L'un des deux doit être imprimé, sinon résultat 0. |
| Montant à payer | BT-115 | |
| Numéro de facture | BT-1 | Non imprimé : avertissement (résultat 2). |
| IBAN du bénéficiaire | BT-84 | Le PDF imprime un autre IBAN : avertissement (résultat 2). Aucun IBAN dans le PDF : simple remarque. |
| Montant HT, TVA | BT-109, BT-110 | Simple remarque dans le rapport. |
| Valeur de retour | Signification |
|---|---|
1 | Le montant du XML est imprimé sur le PDF, rien ne le contredit. |
2 | Le montant est imprimé, mais le numéro de facture ou l'IBAN diffèrent. À examiner. |
0 | Ni le montant total ni le montant à payer du XML ne sont imprimés sur le PDF. Bloquer le paiement et clarifier. |
-1 | Non vérifiable : pas de XML intégré, pas de texte dans le PDF (p. ex. un scan), fichier introuvable ou pas de licence. |
' VB.NET
Dim key As String = "VOTRE-CLE-DE-LICENCE"
Dim alo As New Aloaha_ZUGFeRD.XML(key)
Select Case alo.CheckPDFTextAgainstXML("C:\Reception\FA-4711.pdf", key)
Case 1
' concordance : poursuivre le traitement
Case 2
' avertissement : soumettre le rapport à une personne
System.IO.File.WriteAllText("C:\Clarifier\FA-4711.txt", alo.PDFTextCheckReport)
Case 0
' écart : bloquer le paiement, contacter le fournisseur
System.IO.File.WriteAllText("C:\Bloque\FA-4711.txt", alo.PDFTextCheckReport)
Case Else
' non vérifiable : la raison figure dans PDFTextCheckReport ou LastError
End Select
Le rapport de PDFTextCheckReport indique chaque valeur comparée sur une ligne (texte en anglais) :
PDF text check: WARNING - the payable amount is printed, but 1 other value(s) of the XML differ from the PDF.
OK BT-112 grand total 1190.00: printed as 1.190,00
OK BT-109 net total 1000.00: printed as 1.000,00
OK BT-110 VAT total 190.00: printed as 190,00
OK BT-1 invoice number RE-1001: printed
WARNING BT-84 IBAN DE02120300000000202051: not printed - the PDF prints another IBAN: DE89370400440532013000
Rough check only: a value counts as printed when it appears anywhere in the page text.
Le contrôle s'exécute en local. La facture ne quitte pas l'entreprise.
Sans programmation : dans la GUI et la visionneuse PDF
À partir de la version 11.0.0.19, le même contrôle est intégré à nos programmes. Dans l'Aloaha ZUGFeRD GUI, il s'exécute pour chaque PDF avec Validate e-invoice…, et après la fusion du XML et du PDF, la GUI avertit si les deux ne vont pas ensemble. L'Aloaha ZUGFeRD PDF Viewer affiche le résultat sous forme de mention colorée dans la barre d'outils à l'ouverture d'un PDF ZUGFeRD.
Ce qu'a montré le test sur des factures réelles
Avant la publication, nous avons testé la logique de comparaison sur 15 factures ZUGFeRD réelles issues de notre support :
- 12 factures : résultat 1, le montant et le numéro de facture figurent sur le PDF.
- 2 factures : résultat 2. Pour l'une, le PDF imprime deux autres comptes bancaires que le XML ; pour l'autre, le numéro de facture manque dans le texte.
- 1 facture : résultat 0. Le XML provenait d'un exemple, le PDF était une vraie facture – aucun montant ne concordait.
Trois fichiers sur quinze méritaient donc un second regard, et aucun n'aurait été remarqué par une simple validation de format.
Ce que le contrôle ne fait pas
- C'est un contrôle sommaire. Une valeur est considérée comme imprimée si elle apparaît n'importe où dans le texte de la page – pas forcément à côté du mot « total ».
- Les PDF scannés sans texte ne sont pas vérifiables (résultat -1). Ce n'est pas un indice de fraude.
- Coordonnées bancaires en image dans l'en-tête : le contrôle ne trouve alors aucun IBAN et ne donne qu'une remarque.
- Il ne remplace ni la validation de format ni le rapprochement avec vos données de base. Seule votre comptabilité sait si l'IBAN appartient au fournisseur.
Déroulement recommandé à la réception
- Valider le format :
ValidateInvoicePDF– la facture est-elle valide selon l'EN 16931 ? - Comparer PDF et XML :
CheckPDFTextAgainstXML– le PDF dit-il la même chose que le XML ? - Lire les données :
FillZUGFeRD_Structure– reprendre montants, numéro de TVA et IBAN depuis le XML. - Comparer avec les données de base : le numéro de TVA et l'IBAN correspondent-ils au fournisseur connu ? Voir facture d'un nouvel expéditeur : authentique ou hameçonnage ? (en allemand)
Questions fréquentes
Que vaut-il si le PDF et le XML d'une facture ZUGFeRD divergent ?
Le XML. Dans les formats hybrides, la partie structurée prime ; le PDF n'est que la représentation destinée aux personnes.
Pourquoi est-il risqué de ne contrôler que le PDF ?
Parce que le logiciel traite le XML. S'il contient un autre montant ou un autre IBAN que le PDF, on paie autre chose que ce qui a été validé.
Comment vérifier que le PDF et le XML vont ensemble ?
Avec CheckPDFTextAgainstXML du SDK Aloaha ZUGFeRD (à partir de la version 11.0.0.19). La fonction recherche le montant total, le montant à payer, le numéro de facture et l'IBAN du XML dans le texte des pages du PDF et renvoie 1 (concordance), 2 (avertissement), 0 (écart) ou -1 (non vérifiable).
Une validation selon l'EN 16931 détecte-t-elle ces écarts ?
Non. La validation de format ne regarde que le XML. Un XML valide peut appartenir à un tout autre PDF.
Que signifie le résultat -1 ?
Le fichier n'est pas vérifiable : il ne contient pas de XML de facture, ou les pages n'ont pas de texte, par exemple un scan. Ce n'est pas un indice de fraude.
Le résultat 1 prouve-t-il que le PDF et le XML sont identiques ?
Non. Il montre que les valeurs clés du XML sont aussi imprimées sur le PDF. C'est un contrôle de plausibilité sommaire, pas une comparaison complète.
Termes métier dans cet article : BT-112 BT-115 BT-84 BT-109 BT-110 BT-1