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

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

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