E-Invoice Business-Rule Validation

HPDFEInvoiceValidator combine la validation de conteneur Factur-X ou ZUGFeRD avec des jeux de règles métier et de règles pays explicitement sélectionnés et versionnés

Exécution complète des règles examinées

La bibliothèque fournit les ressources `.sch` et `_codedb.xml` correspondantes pour MINIMUM, BASIC WL, BASIC, EN 16931 et EXTENDED

Le moteur XE2 et ultérieur exécute la surface XPath 2 complète examinée via un analyseur MSXML sécurisé, des équivalents XPath 1 déterministes et une évaluation directe pour les quantificateurs, les sommes FLWOR, les conversions, les comparaisons de séquences, les listes de codes externes, les motifs de dates et les valeurs d'indicateurs booléens

Le profil EN 16931 contient 618 vérifications et chaque vérification est traitée à chaque exécution de validation

Validation combinée

var
  Report: THPDFEInvoiceValidationReport;
begin
  if not HPDFValidateEInvoice(PDF,
    'Lib\resources\Schematron', Report) then
    LogValidationFailure(Report);
end;

HPDFValidateEInvoice appelle d'abord THotPDF.ValidateFacturXInvoice, extrait et identifie le XML de facture, charge les ressources Schematron spécifiques au profil et exécute les règles métier

Une facture hybride détectée échoue en fail-closed lorsque l'extraction XML, la détection de profil, le chargement de règles, le chargement de base de codes ou l'évaluation d'expressions ne peuvent pas aboutir

La fonction renvoie true uniquement lorsque le conteneur est valide, les règles métier ont été évaluées et aucune constatation d'erreur ou d'avertissement ne subsiste

Registry de profils et périmètre de validation

THPDFEInvoiceRuleRegistry enregistre une couche de règles métier et, si nécessaire, une couche de règles pays par profil, avec un nom de ressource explicite, une version de règles et une implémentation IHPDFESchematronEngine facultative

Le registry par défaut contient les cinq profils Factur-X livrés et les règles EXTENDED de base pour les profils français EXTENDED-CTC-FR et EXTENDED-B2B-FR

Les profils français exigent un enregistrement supplémentaire de règles pays avant que ValidationComplete devienne vrai, et XRECHNUNG exige à la fois les règles CII EN 16931 et les règles pays allemandes

Les profils inconnus n'ont aucune règle par défaut et ne retombent jamais sur EXTENDED, et HPDFSchematronFileForProfile renvoie une chaîne vide pour les profils inconnus ou spécifiques à un pays

HPDFValidateEInvoiceWithRegistry utilise le registry de l'appelant avec le contrôle de conteneur PDF, tandis que HPDFValidateEInvoiceXML valide des octets XML explicites et un profil sans évaluer de conteneur PDF

Le rapport expose ProfileSupported, CountryRulesRequired, CountryRulesEvaluated, ValidationComplete et ValidationNote, et son tableau RuleSets enregistre chaque ressource sélectionnée, sa version, son périmètre, son résumé et son statut de complétion

Une évaluation de règles terminée peut encore contenir des violations de règles métier : vérifiez donc le résultat booléen ou BusinessRuleViolations en plus de ValidationComplete

Ces API signalent la couverture des règles métier et pays ; la validation XML Schema, les politiques de transport et les décisions d'acceptation légales restent hors de ce périmètre

Règles CII XRechnung officielles

HPDFEInvoiceSaxon fournit un pont Saxon HE facultatif qui exécute sans modification les stylesheets Schematron 2.6.0 compilés EN 16931 CII 1.3.16 et XRechnung 3.0.2 livrés dans Lib/resources/Schematron/XRechnung

Les ressources proviennent de la configuration officielle du validator KoSIT datée du 31 août 2026, et le README des ressources consigne leur provenance, leurs licences et leurs hashes

L'hôte fournit explicitement l'exécutable Java et le class path Saxon, et la bibliothèque lance la transformation sans shell ni fenêtre de console visible, applique un délai d'attente, analyse les constatations SVRL et supprime ses fichiers temporaires

Un délai d'attente de zéro sélectionne 60 secondes, les valeurs supérieures à 3 600 000 millisecondes sont rejetées, la sortie de diagnostic est plafonnée à 8 Mio, et les stylesheets compilés et rapports SVRL sont plafonnés à 64 Mio avant analyse ou chargement

uses HPDFEInvoiceValidator, HPDFEInvoiceSaxon;

Registry := THPDFEInvoiceRuleRegistry.Create;
try
  Engine := HPDFCreateSaxonSchematronEngine(
    JavaExecutable, SaxonClassPath, 60000);
  HPDFRegisterXRechnungRules(Registry, Engine);
  Valid := HPDFValidateEInvoiceWithRegistry(PDF,
    'Lib\resources\Schematron', Registry, Report);
finally
  Registry.Free;
end;

Configurez le class path Saxon avec Saxon HE et ses dépendances requises, et utilisez un registry et une instance de moteur séparés par thread de validation

Le pont facultatif exige Delphi XE2 ou ultérieur sous Windows et un runtime Java/Saxon fourni par l'hôte, et aucun des deux runtimes n'est téléchargé ni installé par la bibliothèque

Des runtimes manquants, une syntaxe de facture erronée, des DTD interdites, un dépassement de délai, une transformation échouée et une sortie SVRL malformée produisent des diagnostics explicites de validation incomplète

Règles de facturation CTC françaises officielles

HPDFRegisterFrenchCTCRules sélectionne la couche de profil officielle et la stricte couche pays BR-FR-Flux2 de la release FNFE-MPE 1.4.0.04, publiée le 4 septembre 2026 pour AFNOR XP Z12-012 version 1.4

La release officielle FNFE-MPE est publiée sous Apache 2.0 et reliée par la page de ressources FNFE-MPE, tandis que le stylesheet EN 16931 CII inclus conserve l'EUPL 1.2, et les stylesheets compilés d'origine, sources Schematron, bases de codes, licences, chemins sources et hashes sont préservés sous Lib/resources/Schematron/France

Pour fisFacturX, l'aide prend en charge BASIC WL, EN 16931 et EXTENDED via les couches de règles Factur-X 1.09.2 publiées, et la désignation de conteneur EXTENDED-CTC-FR utilise la même couche Factur-X EXTENDED plus les contrôles pays français

Pour fisCII autonome, elle prend en charge EN 16931 et la couche CII EXTENDED-CTC-FR dédiée, dont les restrictions et l'identifiant de guideline diffèrent de la couche Factur-X EXTENDED hybride

Engine := HPDFCreateSaxonSchematronEngine(
  JavaExecutable, SaxonClassPath, 60000);

HPDFRegisterFrenchCTCRules(Registry, 'EN 16931',
  Engine, fisFacturX);
Valid := HPDFValidateEInvoiceWithRegistry(PDF,
  'Lib\resources\Schematron', Registry, Report);

HPDFRegisterFrenchCTCRules(Registry, 'EXTENDED-CTC-FR',
  Engine, fisCII);
Valid := HPDFValidateEInvoiceXML(XMLBytes, 'EXTENDED-CTC-FR',
  'Lib\resources\Schematron', Registry, Report);

L'enregistrement conserve des versions distinctes pour le profil et les règles pays, et rend la couche pays française requise pour le profil sélectionné, y compris EN 16931 et BASIC WL lorsqu'ils sont explicitement enregistrés pour la France

Le stylesheet national publié strict est utilisé directement, sans substituer la variante distincte avertissement-seul ni dégrader les constatations

Le paquet officiel épinglé n'a pas de profil de règles EXTENDED-B2B-FR, l'aide rejette donc ce nom hérité au lieu de le traiter comme un alias certifié automatiquement

Une validation réussie établit la complétion de ces couches de règles métier de facturation publiées ; XML Schema, les messages de cycle de vie CDAR, l'extraction de données e-reporting, l'autorisation de plateforme, le transport et la certification légale restent des périmètres distincts

API du moteur

Engine := HPDFCreateSchematronEngine;
if not Engine.Load(SchematronPath, ErrorText) then
  raise Exception.Create(ErrorText);

Findings := Engine.Validate(XMLBytes);
Summary := Engine.LastSummary;

THPDFSchematronSummary rapporte Profile, TotalRules, Evaluated, Skipped, EvaluationErrors, Violations, EngineAvailable et EngineNote

Skipped reste à zéro dans le moteur XE2 et ultérieur et est réservé à la stub Delphi 7 ou aux données de résultats héritées

Les expressions malformées ou non prises en charge produisent des constatations explicites de sévérité erreur, incrémentent EvaluationErrors et ne disparaissent jamais comme des vérifications réussies

Fonctions d'aide XML Factur-X

L'unité HPDFFacturX livre des aides au niveau octet qui lisent un XML de facture Factur-X / ZUGFeRD sans construire de DOM, si bien qu'elles fonctionnent sur chaque version de Delphi prise en charge par la bibliothèque et sont sûres sur les octets extraits par ExtractFacturXXML

HPDFFacturXGuidelineIDFromXMLBytes(XMLBytes) renvoie l'identifiant de guideline depuis l'élément GuidelineSpecifiedDocumentContextParameter / ram:ID d'un document CII, ou une chaîne vide en son absence

HPDFIsFacturXConformanceLevel(Value, FileName, Version) valide un nom de niveau de conformité et accepte MINIMUM, BASIC WL, BASIC, EN 16931, EN16931, EXTENDED, EXTENDED-CTC-FR, EXTENDED-B2B-FR et XRECHNUNG ; le niveau hérité COMFORT exige en plus le nom de fichier ZUGFeRD 1.0 ZUGFeRD-invoice.xml avec la version 1.0

HPDFFacturXXMLGuidelineOK(XMLBytes, ConformanceLevel, Version, FileName) recoupe la guideline trouvée dans le XML avec le niveau de conformité, la version et le nom de fichier embarqué déclarés

HPDFFacturXInvoiceSummaryFromXML(XMLBytes, out ASummary) remplit un enregistrement THPDFFacturXInvoiceSummary depuis le XML de facture et renvoie True lorsque au moins le XML de facture primaire a pu être localisé ; le type d'enregistrement de résumé lui-même est déclaré dans HPDFDoc à côté de THPDFFacturXInvoiceInfo

Diagnostics et limites stables

Disponibilité de la chaîne d'outils

Delphi XE2 et ultérieur utilisent le moteur de compatibilité MSXML intégré

Delphi 7 conserve les interfaces et types de résultats partagés mais renvoie un diagnostic de moteur indisponible

API associées

Acceptation non-GUI

Exécutez Tests/Delphi/Run-EInvoiceRuleTests.ps1 avec des valeurs explicites de JavaExecutable et SaxonClassPath, ou les variables d'environnement correspondantes HOTPDF_JAVA_EXE et HOTPDF_SAXON_CLASSPATH

Le runner par défaut exige la configuration du moteur à règles officielles et s'exécute en Win32 comme en Win64 avec lancement du lecteur PDF supprimé ; -NativeOnly omet délibérément l'exécution Saxon officielle