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

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

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