Validação de regras de negócio de fatura eletrónica
HPDFEInvoiceValidator combina a validação do contentor Factur-X ou ZUGFeRD com conjuntos de regras de negócio e de regras de país explicitamente selecionados e com versões
Execução completa e revista de regras
A biblioteca inclui os recursos `.sch` e `_codedb.xml` correspondentes para MINIMUM, BASIC WL, BASIC, EN 16931 e EXTENDED
O motor do XE2 e posteriores executa toda a superfície XPath 2 revista, através de parsing MSXML seguro, equivalentes XPath 1 determinísticos e avaliação direta de quantificadores, somas FLWOR, casts, comparações de sequências, listas de códigos externas, padrões de data e valores de indicadores booleanos
O perfil EN 16931 contém 618 verificações e todas são processadas em cada 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 chama primeiro 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 detetada falha em modo fechado quando a extração do XML, a deteção do perfil, o carregamento das regras, o carregamento da base de dados de códigos ou a avaliação de expressões não conseguem ser concluídos
A função devolve true apenas quando o contentor é válido, as regras de negócio foram avaliadas e não resta nenhuma ocorrência de erro ou aviso
Registo de perfis e âmbito de validação
THPDFEInvoiceRuleRegistry regista uma camada de regras de negócio e, quando necessário, uma camada de regras de país por perfil, com um nome de recurso explícito, uma versão de regras e uma implementação opcional de IHPDFESchematronEngine
O registo predefinido contém os cinco perfis Factur-X fornecidos e as regras EXTENDED de base para os perfis franceses EXTENDED-CTC-FR e EXTENDED-B2B-FR
Os perfis franceses exigem um registo adicional de regras de país antes de ValidationComplete ficar verdadeiro, e o XRECHNUNG exige tanto as regras CII EN 16931 como as regras de país alemãs
Perfis desconhecidos não têm regras predefinidas e nunca recuam para EXTENDED, e HPDFSchematronFileForProfile devolve uma string vazia para perfis desconhecidos ou específicos de país
HPDFValidateEInvoiceWithRegistry usa o registo do chamador com a verificação do contentor PDF, enquanto HPDFValidateEInvoiceXML valida bytes XML explícitos e um perfil sem avaliar um contentor PDF
O relatório expõe ProfileSupported, CountryRulesRequired, CountryRulesEvaluated, ValidationComplete e ValidationNote, e o seu array RuleSets regista o recurso, a versão, o âmbito, o resumo e o estado de conclusão de cada seleção
Uma avaliação de regras concluída pode ainda conter violações de regras de negócio, por isso verifique o resultado Booleano ou BusinessRuleViolations para além de ValidationComplete
Estas APIs reportam 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 de aceitação legal ficam fora deste âmbito
Regras oficiais CII do XRechnung
HPDFEInvoiceSaxon fornece uma ponte opcional para o Saxon HE que executa, sem modificações, as folhas de estilo compiladas EN 16931 CII 1.3.16 e XRechnung 3.0.2 Schematron 2.6.0 fornecidas 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 regista a sua proveniência, licenças e hashes
O anfitrião fornece explicitamente o executável Java e o class path do Saxon, e a biblioteca lança a transformação sem shell nem janela de consola visível, impõe um timeout, faz o parsing das ocorrências SVRL e remove os seus ficheiros temporários
Um timeout de zero seleciona 60 segundos, valores acima de 3,600,000 milissegundos são rejeitados, a saída de diagnóstico fica limitada a 8 MiB, e as folhas de estilo compiladas e os relatórios SVRL ficam limitados a 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 de que precisa, e use um registo e uma instância de motor separados por thread de validação
A ponte opcional exige Delphi XE2 ou posterior em Windows e um runtime Java/Saxon fornecido pelo anfitrião; nenhum dos runtimes é descarregado ou instalado pela biblioteca
Runtimes em falta, sintaxe de fatura errada, DTDs proibidos, timeout, transformação falhada e saída SVRL malformada produzem diagnósticos explícitos de validação incompleta
Regras oficiais de fatura CTC francesa
HPDFRegisterFrenchCTCRules seleciona a camada oficial de perfil e a camada de país estrita BR-FR-Flux2 do release 1.4.0.04 da FNFE-MPE, publicado a 4 de setembro de 2026 para a versão 1.4 da AFNOR XP Z12-012
O release oficial da FNFE-MPE é publicado sob Apache 2.0 e ligado pela página de recursos da FNFE-MPE, enquanto a folha de estilo EN 16931 CII incluída mantém a EUPL 1.2, e as folhas de estilo compiladas originais, as fontes Schematron, as bases de dados 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 contentor EXTENDED-CTC-FR usa a mesma camada EXTENDED do Factur-X mais as verificações de país francesas
Para fisCII autónomo, suporta EN 16931 e a camada CII dedicada EXTENDED-CTC-FR, cujas restrições e identificador de guideline diferem da camada EXTENDED híbrida do 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);
O registo preserva versões separadas de perfil e de regras de país, e torna a camada de país francesa obrigatória para o perfil selecionado, incluindo EN 16931 e BASIC WL quando registados explicitamente para a França
A folha de estilo nacional estrita publicada é usada diretamente, sem substituir pela variante separada de apenas avisos nem rebaixar ocorrências
O pacote oficial fixado não tem perfil de regras EXTENDED-B2B-FR, pelo que o helper rejeita esse nome legado em vez de o tratar como um alias automaticamente certificado
Uma validação bem-sucedida estabelece a conclusão destas camadas publicadas de regras de negócio de faturas, enquanto o XML Schema, as mensagens de ciclo de vida CDAR, a extração de dados de e-reporting, a autorização de plataformas, o transporte e a certificação legal permanecem âmbitos separados
API do 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 e EngineNote
Skipped permanece a zero no motor do XE2 e posteriores e está reservado para o stub do Delphi 7 ou para dados de resultado legacy
Expressões malformadas ou não suportadas produzem ocorrências explícitas de severidade error, incrementam EvaluationErrors e nunca desaparecem como verificações bem-sucedidas
Funções auxiliares de XML Factur-X
A unidade HPDFFacturX fornece helpers ao nível de bytes que leem o XML de uma fatura Factur-X / ZUGFeRD sem construir um DOM, por isso correm em todas as versões de Delphi que a biblioteca suporta e são seguros sobre bytes extraídos por ExtractFacturXXML
HPDFFacturXGuidelineIDFromXMLBytes(XMLBytes) devolve 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 ficheiro ZUGFeRD 1.0 ZUGFeRD-invoice.xml com a versão 1.0
HPDFFacturXXMLGuidelineOK(XMLBytes, ConformanceLevel, Version, FileName) verifica em cruz a guideline encontrada no XML contra o nível de conformidade, a versão e o nome de ficheiro declarados
HPDFFacturXInvoiceSummaryFromXML(XMLBytes, out ASummary) preenche um registo THPDFFacturXInvoiceSummary a partir do XML da fatura e devolve True quando, pelo menos, o XML da fatura primária pôde ser localizado; o tipo do registo de resumo está declarado em HPDFDoc, junto a THPDFFacturXInvoiceInfo
Diagnósticos estáveis e limites
- Os identificadores de regra são extraídos do token de mensagem do Schematron, quando presente
- Os identificadores em falta recebem ordinais determinísticos de perfil e de assertion-or-report
- Cada ocorrência preserva o seu contexto original e as suas expressões de teste
- Os caminhos externos da base de dados de códigos estão restritos a nomes de ficheiros irmãos
- O processamento de DTD e a resolução de entidades XML externas estão desativados
- A entrada XML da fatura está limitada a 64 MiB
Disponibilidade de toolchain
O Delphi XE2 e posteriores usam o motor de compatibilidade MSXML incorporado
O Delphi 7 mantém as interfaces partilhadas e os tipos de resultado, mas devolve um diagnóstico de motor indisponível
APIs relacionadas
HPDFValidateEInvoiceHPDFValidateEInvoiceWithRegistryHPDFValidateEInvoiceXMLTHPDFEInvoiceRuleRegistryHPDFRegisterXRechnungRulesHPDFRegisterFrenchCTCRulesTHPDFFrenchInvoiceSyntaxHPDFCreateSchematronEngineHPDFSchematronFileForProfileIHPDFESchematronEngineTHPDFBusinessRuleResultTHPDFSchematronSummary- THotPDF.ValidateFacturXInvoice
- THotPDF.ExtractFacturXXML
Aceitação não 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 predefinido exige a configuração do motor de regras oficiais e corre tanto em Win32 como em Win64 com o arranque do visualizador de PDF suprimido; -NativeOnly omite deliberadamente a execução Saxon oficial