Validación de reglas de negocio de facturas electrónicas
HPDFEInvoiceValidator combina la validación de contenedor Factur-X o ZUGFeRD con conjuntos de reglas de negocio y de reglas de país seleccionados explícitamente y con versión
Ejecución completa de reglas revisadas
La biblioteca incluye recursos `.sch` y `_codedb.xml` coincidentes para MINIMUM, BASIC WL, BASIC, EN 16931 y EXTENDED
El motor de XE2 y posteriores ejecuta la superficie completa revisada de XPath 2 mediante análisis MSXML seguro, equivalentes deterministas de XPath 1 y evaluación directa de cuantificadores, sumas FLWOR, conversiones de tipo, comparaciones de secuencia, listas de códigos externas, patrones de fecha y valores de indicador booleano
El perfil EN 16931 contiene 618 comprobaciones y cada comprobación se procesa durante cada ejecución 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 de XML, la detección de perfil, la carga de reglas, la carga de la base de códigos 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 hallazgo de error o 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, versión de reglas y una implementación opcional de IHPDFESchematronEngine
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 EN 16931 como las reglas de país alemanas
Los perfiles desconocidos no tienen reglas por defecto y nunca recurren a EXTENDED, y HPDFSchematronFileForProfile devuelve una cadena vacía para perfiles desconocidos o específicos de país
HPDFValidateEInvoiceWithRegistry usa el registro del llamador con la comprobación del contenedor PDF, mientras que HPDFValidateEInvoiceXML valida bytes XML explícitos y un perfil sin evaluar un contenedor PDF
El informe expone ProfileSupported, CountryRulesRequired, CountryRulesEvaluated, ValidationComplete y ValidationNote, y su array RuleSets registra cada recurso seleccionado, versión, ámbito, resumen y estado de finalización
Una evaluación de reglas completada todavía puede contener violaciones de reglas de negocio, así que compruebe el resultado booleano o BusinessRuleViolations además de ValidationComplete
Estas APIs informan de 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 permanecen fuera de este alcance
Reglas CII oficiales de XRechnung
HPDFEInvoiceSaxon aporta un puente opcional con Saxon HE que ejecuta sin modificar las hojas de estilo compiladas EN 16931 CII 1.3.16 y XRechnung 3.0.2 Schematron 2.6.0 distribuidas en Lib/resources/Schematron/XRechnung
Los recursos provienen de la configuración oficial del validador KoSIT del 31 de agosto de 2026, y el README de los recursos registra su procedencia, licencias y hashes
El host suministra explícitamente el ejecutable de Java y el class path de Saxon, y la biblioteca lanza la transformación sin shell ni ventana de consola visible, aplica un timeout, analiza los hallazgos SVRL y elimina sus archivos temporales
Un timeout de cero selecciona 60 segundos, los valores por encima de 3.600.000 milisegundos se rechazan, la salida de diagnóstico se limita a 8 MiB, y las hojas de estilo compiladas y los informes SVRL se limitan a 64 MiB antes del análisis 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 puente opcional exige Delphi XE2 o posterior en Windows y un runtime Java/Saxon proporcionado por el host, y la biblioteca 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 de factura CTC francesas oficiales
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 AFNOR XP Z12-012 versión 1.4
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 la hoja de estilo EN 16931 CII incluida conserva EUPL 1.2, y las hojas de estilo compiladas originales, las fuentes Schematron, las bases de códigos, 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 Factur-X EXTENDED más las comprobaciones de país francesas
Para fisCII puro, soporta EN 16931 y la capa CII dedicada EXTENDED-CTC-FR, cuyas restricciones e identificador de guideline difieren de los de la capa híbrida Factur-X EXTENDED
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 convierte la capa de país francesa en obligatoria para el perfil seleccionado, incluidos EN 16931 y BASIC WL cuando se registran explícitamente para Francia
La hoja de estilo nacional estricta publicada se usa directamente, sin sustituirla por la variante separada de solo advertencias ni degradar hallazgos
El paquete oficial fijado no tiene perfil de reglas EXTENDED-B2B-FR, así que el helper rechaza ese nombre heredado en lugar de tratarlo como un alias certificado automáticamente
Una validación con éxito establece la finalización de estas capas de reglas de negocio de factura publicadas, 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 en ámbitos 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 informa de Profile, TotalRules, Evaluated, Skipped, EvaluationErrors, Violations, EngineAvailable y EngineNote
Skipped permanece en cero en el motor de XE2 y posteriores y está reservado para el stub de Delphi 7 o los datos de resultado heredados
Las expresiones malformadas o no admitidas producen hallazgos explícitos de severidad de error, incrementan EvaluationErrors y nunca desaparecen como comprobaciones correctas
Funciones auxiliares XML de 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, de modo que funcionan en todas las versiones de Delphi que la biblioteca 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 heredado COMFORT exige además 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 con el nivel de conformidad, la versión y el nombre de archivo incrustado declarados
HPDFFacturXInvoiceSummaryFromXML(XMLBytes, out ASummary) rellena un registro THPDFFacturXInvoiceSummary desde el XML de la factura y devuelve True cuando al menos pudo localizarse el XML de la factura principal; el propio tipo de registro de resumen está declarado en HPDFDoc junto a THPDFFacturXInvoiceInfo
Diagnósticos y límites estables
- Los identificadores de regla se analizan del token de mensaje Schematron cuando está presente
- Los identificadores ausentes reciben ordinales deterministas de perfil y de aserción o informe
- Cada hallazgo conserva su contexto original y sus expresiones de prueba
- Las rutas externas de la base de códigos se restringen a nombres de archivo hermanos
- El procesamiento DTD y la resolución de entidades XML externas están deshabilitados
- La entrada XML de la factura se limita a 64 MiB
Disponibilidad de la cadena de herramientas
Delphi XE2 y posteriores usan el motor de compatibilidad MSXML integrado
Delphi 7 conserva las interfaces y los tipos de resultado compartidos 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 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 ejecuta tanto Win32 como Win64 con el arranque del visor PDF suprimido; -NativeOnly omite deliberadamente la ejecución de Saxon oficial