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

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

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