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

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

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