Validação de regras de negócio de fatura eletrônica
HPDFEInvoiceValidator combina a validação do contêiner Factur-X ou ZUGFeRD com conjuntos de regras de negócio e de regras de país selecionados explicitamente e com versão
Execução completa de regras revisadas
A biblioteca acompanha recursos correspondentes de `.sch` e `_codedb.xml` para MINIMUM, BASIC WL, BASIC, EN 16931 e EXTENDED
O engine de XE2 em diante executa toda a superfície revisada de XPath 2 por meio de parsing MSXML seguro, equivalentes determinísticos de XPath 1 e avaliação direta para quantificadores, somas FLWOR, casts, comparações de sequência, listas de códigos externas, padrões de data e valores de indicadores booleanos
O perfil EN 16931 contém 618 verificações e cada verificação é processada em toda execução de validação
Validação combinada
var
Report: THPDFEInvoiceValidationReport;
begin
if not HPDFValidateEInvoice(PDF,
'Lib\resources\Schematron', Report) then
LogValidationFailure(Report);
end;
HPDFValidateEInvoice primeiro chama THotPDF.ValidateFacturXInvoice, extrai e identifica o XML da fatura, carrega os recursos Schematron específicos do perfil e executa as regras de negócio
Uma fatura híbrida detectada falha fechada quando a extração de XML, a detecção de perfil, o carregamento de regras, o carregamento do banco de códigos ou a avaliação de expressões não podem ser concluídos
A função retorna true apenas quando o contêiner é válido, as regras de negócio foram avaliadas e não resta nenhuma constatação de erro ou aviso
Registro de perfis e escopo de validação
THPDFEInvoiceRuleRegistry registra uma camada de regras de negócio e, quando necessário, uma camada de regras de país por perfil, com nome de recurso explícito, versão de regras e implementação opcional de IHPDFESchematronEngine
O registro padrão contém os cinco perfis Factur-X embarcados e as regras EXTENDED de base para os perfis franceses EXTENDED-CTC-FR e EXTENDED-B2B-FR
Os perfis franceses exigem um registro adicional de regras de país antes que ValidationComplete se torne true, e o XRECHNUNG exige tanto as regras CII EN 16931 quanto as regras de país alemãs
Perfis desconhecidos não têm regras padrão e nunca caem no fallback EXTENDED, e HPDFSchematronFileForProfile retorna uma string vazia para perfis desconhecidos ou específicos de país
HPDFValidateEInvoiceWithRegistry usa o registro do chamador com a checagem do contêiner PDF, enquanto HPDFValidateEInvoiceXML valida bytes XML explícitos e um perfil sem avaliar um contêiner PDF
O relatório expõe ProfileSupported, CountryRulesRequired, CountryRulesEvaluated, ValidationComplete e ValidationNote, e o array RuleSets registra cada recurso selecionado, versão, escopo, sumário e status de conclusão
Uma avaliação de regras concluída ainda pode conter violações de regras de negócio, então verifique o resultado booleano ou BusinessRuleViolations além de ValidationComplete
Essas APIs relatam a cobertura de regras de negócio e de país, enquanto a validação de XML Schema, as políticas de transporte e as decisões legais de aceitação ficam fora deste escopo
Regras CII oficiais do XRechnung
HPDFEInvoiceSaxon fornece uma ponte opcional para o Saxon HE que executa sem modificações os stylesheets compilados EN 16931 CII 1.3.16 e XRechnung 3.0.2 Schematron 2.6.0 embarcados em Lib/resources/Schematron/XRechnung
Os recursos vêm da configuração oficial do validador KoSIT de 31 de agosto de 2026, e o README dos recursos registra a proveniência, as licenças e os hashes
O host fornece explicitamente o executável Java e o class path do Saxon, e a biblioteca dispara a transformação sem shell e sem janela de console visível, impõe um timeout, faz o parsing das constatações SVRL e remove os arquivos temporários dela
Timeout zero seleciona 60 segundos, valores acima de 3.600.000 milissegundos são rejeitados, a saída de diagnóstico tem teto de 8 MiB, e stylesheets compilados e relatórios SVRL têm teto de 64 MiB antes do parsing ou do carregamento
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 o class path do Saxon com o Saxon HE e as dependências exigidas dele, e use um registro e uma instância de engine separados por thread de validação
A ponte opcional exige Delphi XE2 ou posterior no Windows e um runtime Java/Saxon fornecido pelo host, e nenhum dos runtimes é baixado ou instalado pela biblioteca
Runtimes ausentes, sintaxe de fatura errada, DTDs proibidos, timeout, transformação com falha e saída SVRL malformada produzem diagnósticos explícitos de validação incompleta
Regras oficiais de fatura CTC francesas
HPDFRegisterFrenchCTCRules seleciona a camada de perfil oficial e a camada de país estrita BR-FR-Flux2 do release 1.4.0.04 da FNFE-MPE, publicado em 4 de setembro de 2026 para a AFNOR XP Z12-012 versão 1.4
O release oficial da FNFE-MPE é publicado sob Apache 2.0 e linkado pela página de recursos da FNFE-MPE, enquanto o stylesheet EN 16931 CII incluído mantém a EUPL 1.2, e os stylesheets compilados originais, as fontes Schematron, os bancos de códigos, as licenças, os caminhos de origem e os hashes são preservados em Lib/resources/Schematron/France
Para fisFacturX, o helper suporta BASIC WL, EN 16931 e EXTENDED usando as camadas de regras publicadas do Factur-X 1.09.2, e a designação de contêiner EXTENDED-CTC-FR usa a mesma camada Factur-X EXTENDED mais as checagens de país francesas
Para fisCII standalone, ele suporta EN 16931 e a camada CII dedicada do EXTENDED-CTC-FR, cujas restrições e identificador de guideline diferem da camada 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);
O registro preserva versões separadas de perfil e de regras de país e torna a camada de país francesa exigida para o perfil selecionado, incluindo EN 16931 e BASIC WL quando registrados explicitamente para a França
O stylesheet nacional estrito publicado é usado diretamente, sem substituir a variante separada de apenas avisos nem rebaixar constatações
O pacote oficial fixado não tem perfil de regras EXTENDED-B2B-FR, então o helper rejeita esse nome legado em vez de tratá-lo como um alias certificado automaticamente
Uma validação bem-sucedida estabelece a conclusão dessas camadas publicadas de regras de negócio de fatura, enquanto XML Schema, mensagens de ciclo de vida CDAR, extração de dados de e-reporting, autorização de plataforma, transporte e certificação legal permanecem escopos separados
API do engine
Engine := HPDFCreateSchematronEngine;
if not Engine.Load(SchematronPath, ErrorText) then
raise Exception.Create(ErrorText);
Findings := Engine.Validate(XMLBytes);
Summary := Engine.LastSummary;
THPDFSchematronSummary relata Profile, TotalRules, Evaluated, Skipped, EvaluationErrors, Violations, EngineAvailable e EngineNote
Skipped permanece zero no engine de XE2 em diante e é reservado para o stub do Delphi 7 ou dados de resultado legados
Expressões malformadas ou não suportadas produzem constatações explícitas de severidade de erro, incrementam EvaluationErrors e nunca desaparecem como verificações bem-sucedidas
Funções auxiliares de XML Factur-X
A unidade HPDFFacturX traz helpers em nível de bytes que leem o XML de uma fatura Factur-X / ZUGFeRD sem montar um DOM, então rodam em todas as versões de Delphi que a biblioteca suporta e são seguros sobre bytes extraídos de ExtractFacturXXML
HPDFFacturXGuidelineIDFromXMLBytes(XMLBytes) retorna o identificador de guideline do elemento GuidelineSpecifiedDocumentContextParameter / ram:ID de um documento CII, ou uma string vazia quando ausente
HPDFIsFacturXConformanceLevel(Value, FileName, Version) valida um nome de nível de conformidade, aceitando MINIMUM, BASIC WL, BASIC, EN 16931, EN16931, EXTENDED, EXTENDED-CTC-FR, EXTENDED-B2B-FR e XRECHNUNG; o nível legado COMFORT exige adicionalmente o nome de arquivo ZUGFeRD 1.0 ZUGFeRD-invoice.xml com versão 1.0
HPDFFacturXXMLGuidelineOK(XMLBytes, ConformanceLevel, Version, FileName) cruza a guideline encontrada no XML com o nível de conformidade, a versão e o nome de arquivo embutido declarados
HPDFFacturXInvoiceSummaryFromXML(XMLBytes, out ASummary) preenche um record THPDFFacturXInvoiceSummary a partir do XML da fatura e retorna True quando ao menos o XML primário da fatura pôde ser localizado; o tipo do record de sumário em si é declarado em HPDFDoc, ao lado de THPDFFacturXInvoiceInfo
Diagnósticos e limites estáveis
- Identificadores de regra são analisados do token de mensagem Schematron quando presente
- Identificadores ausentes recebem ordinais determinísticos de perfil e de asserção ou relatório
- Cada constatação preserva o contexto original e as expressões de teste dela
- Caminhos externos de banco de códigos são restritos a nomes de arquivo irmãos
- O processamento de DTD e a resolução de entidades XML externas ficam desabilitados
- A entrada XML de fatura é limitada a 64 MiB
Disponibilidade de toolchain
Delphi XE2 e posteriores usam o engine de compatibilidade MSXML embutido
Delphi 7 mantém as interfaces compartilhadas e os tipos de resultado, mas retorna um diagnóstico de engine indisponível
APIs relacionadas
HPDFValidateEInvoiceHPDFValidateEInvoiceWithRegistryHPDFValidateEInvoiceXMLTHPDFEInvoiceRuleRegistryHPDFRegisterXRechnungRulesHPDFRegisterFrenchCTCRulesTHPDFFrenchInvoiceSyntaxHPDFCreateSchematronEngineHPDFSchematronFileForProfileIHPDFESchematronEngineTHPDFBusinessRuleResultTHPDFSchematronSummary- THotPDF.ValidateFacturXInvoice
- THotPDF.ExtractFacturXXML
Aceitação sem GUI
Execute Tests/Delphi/Run-EInvoiceRuleTests.ps1 com valores explícitos de JavaExecutable e SaxonClassPath, ou as variáveis de ambiente correspondentes HOTPDF_JAVA_EXE e HOTPDF_SAXON_CLASSPATH
O runner padrão exige a configuração do engine de regras oficiais e roda tanto Win32 quanto Win64 com a abertura de visualizador de PDF suprimida; -NativeOnly omite deliberadamente a execução Saxon oficial