Validación de reglas de negocio de e-invoices
HPDFEInvoiceValidator combina la validación de contenedores Factur-X o ZUGFeRD con conjuntos de reglas de negocio y reglas de país seleccionados de forma explícita y con versión
Ejecución completa de reglas revisadas
La librería incluye los recursos `.sch` y `_codedb.xml` correspondientes para MINIMUM, BASIC WL, BASIC, EN 16931 y EXTENDED
El motor de XE2 y posteriores ejecuta la superficie XPath 2 revisada completa mediante parseo seguro con MSXML, equivalentes deterministas de XPath 1 y evaluación directa para quantifiers, sumas FLWOR, casts, comparaciones de secuencias, code lists externas, patrones de fecha y valores de indicadores booleanos
El perfil EN 16931 contiene 618 comprobaciones y cada comprobación se procesa en cada pasada de validación
Validación combinada
var
Report: THPDFEInvoiceValidationReport;
begin
if not HPDFValidateEInvoice(PDF,
'Lib\resources\Schematron', Report) then
LogValidationFailure(Report);
end;
HPDFValidateEInvoice primero llama a THotPDF.ValidateFacturXInvoice, extrae e identifica el XML de la factura, carga los recursos Schematron específicos del perfil y ejecuta las reglas de negocio
Una factura híbrida detectada falla de forma cerrada cuando la extracción del XML, la detección del perfil, la carga de reglas, la carga de la code database o la evaluación de expresiones no pueden completarse
La función devuelve true solo cuando el contenedor es válido, las reglas de negocio se evaluaron y no queda ningún finding de error ni de advertencia
Registro de perfiles y alcance de validación
THPDFEInvoiceRuleRegistry registra una capa de reglas de negocio y, cuando se requiere, una capa de reglas de país por perfil, con un nombre de recurso explícito, una versión de reglas y una implementación IHPDFESchematronEngine opcional
El registro por defecto contiene los cinco perfiles Factur-X incluidos y las reglas EXTENDED base para los perfiles franceses EXTENDED-CTC-FR y EXTENDED-B2B-FR
Los perfiles franceses exigen un registro adicional de reglas de país antes de que ValidationComplete sea true, y XRECHNUNG exige tanto las reglas CII de EN 16931 como las reglas de país alemanas
Los perfiles desconocidos no tienen reglas por defecto y nunca hacen fallback a EXTENDED, y HPDFSchematronFileForProfile devuelve una cadena vacía para perfiles desconocidos o específicos de país
HPDFValidateEInvoiceWithRegistry usa el registro de quien llama con la verificación del contenedor PDF, mientras que HPDFValidateEInvoiceXML valida bytes XML explícitos y un perfil sin evaluar un contenedor PDF
El reporte expone ProfileSupported, CountryRulesRequired, CountryRulesEvaluated, ValidationComplete y ValidationNote, y su array RuleSets registra cada recurso seleccionado, versión, scope, resumen y estado de completitud
Una evaluación de reglas completada puede contener violaciones de reglas de negocio, así que revise el resultado Boolean o BusinessRuleViolations además de ValidationComplete
Estas APIs reportan la cobertura de reglas de negocio y de país, mientras que la validación XML Schema, las políticas de transporte y las decisiones de aceptación legal quedan fuera de este alcance
Reglas CII oficiales de XRechnung
HPDFEInvoiceSaxon aporta un bridge opcional de Saxon HE que ejecuta sin modificaciones los stylesheets compilados de EN 16931 CII 1.3.16 y XRechnung 3.0.2 Schematron 2.6.0 incluidos en Lib/resources/Schematron/XRechnung
Los recursos provienen de la configuración oficial del validador KoSIT con fecha del 31 de agosto de 2026, y el README de los recursos registra su procedencia, licencias y hashes
Quien hospeda suministra de forma explícita el ejecutable de Java y el class path de Saxon, y la librería lanza la transformación sin shell ni ventana de consola visible, aplica un timeout, parsea los findings SVRL y elimina sus archivos temporales
Un timeout de cero selecciona 60 segundos, los valores superiores a 3,600,000 milisegundos se rechazan, la salida de diagnóstico se acota a 8 MiB, y los stylesheets compilados y los reportes SVRL se acotan a 64 MiB antes del parseo o la carga
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;
Configure el class path de Saxon con Saxon HE y sus dependencias requeridas, y use un registro y una instancia de motor separados por hilo de validación
El bridge opcional requiere Delphi XE2 o posterior en Windows y un runtime Java/Saxon proporcionado por el host, y la librería no descarga ni instala ninguno de los dos runtimes
Los runtimes ausentes, una sintaxis de factura incorrecta, los DTD prohibidos, el timeout, la transformación fallida y la salida SVRL malformada producen diagnósticos explícitos de validación incompleta
Reglas oficiales de facturas CTC francesas
HPDFRegisterFrenchCTCRules selecciona la capa de perfil oficial y la capa de país estricta BR-FR-Flux2 del release 1.4.0.04 de FNFE-MPE, publicado el 4 de septiembre de 2026 para la versión 1.4 de AFNOR XP Z12-012
El release oficial de FNFE-MPE se publica bajo Apache 2.0 y está enlazado desde la página de recursos de FNFE-MPE, mientras que el stylesheet EN 16931 CII incluido conserva la EUPL 1.2, y los stylesheets compilados originales, las fuentes Schematron, las code databases, las licencias, las rutas de origen y los hashes se preservan bajo Lib/resources/Schematron/France
Para fisFacturX, el helper soporta BASIC WL, EN 16931 y EXTENDED usando las capas de reglas publicadas de Factur-X 1.09.2, y la designación de contenedor EXTENDED-CTC-FR usa la misma capa EXTENDED de Factur-X más las verificaciones de país francesas
Para fisCII standalone, soporta EN 16931 y la capa CII dedicada EXTENDED-CTC-FR, cuyas restricciones e identificador de guideline difieren de la capa EXTENDED híbrida de Factur-X
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);
El registro preserva versiones separadas de perfil y de reglas de país, y hace que la capa de país francesa sea requerida para el perfil seleccionado, incluidos EN 16931 y BASIC WL cuando se registran explícitamente para Francia
El stylesheet nacional estricto publicado se usa directamente, sin sustituirlo por la variante separada de solo advertencias ni degradar findings
El paquete oficial fijado no tiene un perfil de reglas EXTENDED-B2B-FR, así que el helper rechaza ese nombre legacy en lugar de tratarlo como un alias certificado automáticamente
Una validación exitosa establece la completitud de estas capas publicadas de reglas de negocio de facturas, mientras que XML Schema, los mensajes de ciclo de vida CDAR, la extracción de datos de e-reporting, la autorización de plataforma, el transporte y la certificación legal permanecen como scopes separados
API del motor
Engine := HPDFCreateSchematronEngine;
if not Engine.Load(SchematronPath, ErrorText) then
raise Exception.Create(ErrorText);
Findings := Engine.Validate(XMLBytes);
Summary := Engine.LastSummary;
THPDFSchematronSummary reporta Profile, TotalRules, Evaluated, Skipped, EvaluationErrors, Violations, EngineAvailable y EngineNote
Skipped permanece en cero en el motor de XE2 y posteriores, y queda reservado para el stub de Delphi 7 o datos de resultado legacy
Las expresiones malformadas o no soportadas producen findings de severidad de error explícitos, incrementan EvaluationErrors y nunca desaparecen como comprobaciones exitosas
Funciones helper de XML Factur-X
La unidad HPDFFacturX incluye helpers a nivel de bytes que leen el XML de una factura Factur-X / ZUGFeRD sin construir un DOM, así que corren en todas las versiones de Delphi que la librería soporta y son seguros sobre los bytes extraídos por ExtractFacturXXML
HPDFFacturXGuidelineIDFromXMLBytes(XMLBytes) devuelve el identificador de guideline del elemento GuidelineSpecifiedDocumentContextParameter / ram:ID de un documento CII, o una cadena vacía cuando está ausente
HPDFIsFacturXConformanceLevel(Value, FileName, Version) valida un nombre de nivel de conformidad y acepta MINIMUM, BASIC WL, BASIC, EN 16931, EN16931, EXTENDED, EXTENDED-CTC-FR, EXTENDED-B2B-FR y XRECHNUNG; el nivel legacy COMFORT además exige el nombre de archivo ZUGFeRD 1.0 ZUGFeRD-invoice.xml con versión 1.0
HPDFFacturXXMLGuidelineOK(XMLBytes, ConformanceLevel, Version, FileName) coteja la guideline encontrada en el XML contra el nivel de conformidad, la versión y el nombre de archivo embebido declarados
HPDFFacturXInvoiceSummaryFromXML(XMLBytes, out ASummary) llena un record THPDFFacturXInvoiceSummary desde el XML de la factura y devuelve True cuando al menos pudo localizarse el XML de la factura primaria; el tipo del record de resumen en sí se declara en HPDFDoc junto a THPDFFacturXInvoiceInfo
Diagnósticos estables y límites
- Los identificadores de reglas se parsean del token de mensaje Schematron cuando está presente
- Los identificadores ausentes reciben ordinales deterministas de perfil y de assertion-or-report
- Cada finding preserva su expresión original de contexto y de test
- Las rutas de code databases externas se restringen a nombres de archivo hermanos
- El procesamiento de DTD y la resolución de entidades XML externas están deshabilitadas
- La entrada XML de la factura se limita a 64 MiB
Disponibilidad de toolchain
Delphi XE2 y posteriores usan el motor de compatibilidad MSXML integrado
Delphi 7 conserva las interfaces compartidas y los tipos de resultado, pero devuelve un diagnóstico de motor no disponible
APIs relacionadas
HPDFValidateEInvoiceHPDFValidateEInvoiceWithRegistryHPDFValidateEInvoiceXMLTHPDFEInvoiceRuleRegistryHPDFRegisterXRechnungRulesHPDFRegisterFrenchCTCRulesTHPDFFrenchInvoiceSyntaxHPDFCreateSchematronEngineHPDFSchematronFileForProfileIHPDFESchematronEngineTHPDFBusinessRuleResultTHPDFSchematronSummary- THotPDF.ValidateFacturXInvoice
- THotPDF.ExtractFacturXXML
Aceptación sin GUI
Ejecute Tests/Delphi/Run-EInvoiceRuleTests.ps1 con valores explícitos de JavaExecutable y SaxonClassPath, o con las variables de entorno correspondientes HOTPDF_JAVA_EXE y HOTPDF_SAXON_CLASSPATH
El runner por defecto exige la configuración del motor de reglas oficiales y corre tanto en Win32 como en Win64 con el lanzamiento del visor de PDF suprimido; -NativeOnly omite deliberadamente la ejecución de Saxon oficial