E-Invoice Business-Rule Validation
HPDFEInvoiceValidator kết hợp xác thực container Factur-X hoặc ZUGFeRD với các tập quy tắc nghiệp vụ và quy tắc quốc gia được chọn tường minh, có phiên bản
Complete reviewed rule execution
Thư viện đi kèm các tài nguyên `.sch` và `_codedb.xml` khớp nhau cho MINIMUM, BASIC WL, BASIC, EN 16931, và EXTENDED
Engine XE2 trở lên thực thi toàn bộ bề mặt XPath 2 đã được rà soát thông qua phân tích MSXML an toàn, các tương đương XPath 1 xác định, và đánh giá trực tiếp cho lượng từ, tổng FLWOR, cast, so sánh chuỗi, danh sách mã ngoài, mẫu ngày, và giá trị chỉ báo boolean
Hồ sơ EN 16931 chứa 618 kiểm tra và mọi kiểm tra đều được xử lý trong mỗi lượt xác thực
Combined validation
var
Report: THPDFEInvoiceValidationReport;
begin
if not HPDFValidateEInvoice(PDF,
'Lib\resources\Schematron', Report) then
LogValidationFailure(Report);
end;
HPDFValidateEInvoice trước tiên gọi THotPDF.ValidateFacturXInvoice, trích xuất và nhận diện XML hóa đơn, nạp các tài nguyên Schematron theo hồ sơ cụ thể, và thực thi các quy tắc nghiệp vụ
Một hóa đơn lai được phát hiện sẽ thất bại đóng khi trích xuất XML, phát hiện hồ sơ, nạp quy tắc, nạp cơ sở mã, hoặc đánh giá biểu thức không thể hoàn tất
Hàm chỉ trả về true khi container hợp lệ, các quy tắc nghiệp vụ đã được đánh giá, và không còn phát hiện lỗi hoặc cảnh báo nào
Registry hồ sơ và phạm vi xác thực
THPDFEInvoiceRuleRegistry đăng ký một lớp quy tắc nghiệp vụ và, khi cần, một lớp quy tắc quốc gia cho mỗi hồ sơ, với tên tài nguyên tường minh, phiên bản quy tắc, và triển khai IHPDFESchematronEngine tùy chọn
Registry mặc định chứa năm hồ sơ Factur-X đi kèm cùng các quy tắc EXTENDED cơ sở cho các hồ sơ Pháp EXTENDED-CTC-FR và EXTENDED-B2B-FR
Các hồ sơ Pháp đòi hỏi một lần đăng ký quy tắc quốc gia bổ sung trước khi ValidationComplete trở thành true, còn XRECHNUNG đòi hỏi cả quy tắc EN 16931 CII lẫn quy tắc quốc gia Đức
Hồ sơ không xác định không có quy tắc mặc định và không bao giờ rơi về EXTENDED, còn HPDFSchematronFileForProfile trả về chuỗi rỗng cho hồ sơ không xác định hoặc dành riêng cho quốc gia
HPDFValidateEInvoiceWithRegistry dùng registry của bên gọi cùng bước kiểm tra container PDF, còn HPDFValidateEInvoiceXML xác thực các byte XML tường minh và một hồ sơ mà không đánh giá container PDF
Báo cáo phơi bày ProfileSupported, CountryRulesRequired, CountryRulesEvaluated, ValidationComplete, và ValidationNote, còn mảng RuleSets của nó ghi lại từng tài nguyên được chọn, phiên bản, phạm vi, tóm tắt, và trạng thái hoàn tất
Một lượt đánh giá quy tắc hoàn tất vẫn có thể chứa vi phạm quy tắc nghiệp vụ, nên hãy kiểm tra kết quả Boolean hoặc BusinessRuleViolations ngoài ValidationComplete
Các API này báo cáo mức độ phủ quy tắc nghiệp vụ và quốc gia, còn xác thực XML Schema, chính sách truyền vận, và quyết định chấp nhận pháp lý vẫn nằm ngoài phạm vi này
Quy tắc CII XRechnung chính thức
HPDFEInvoiceSaxon cung cấp một bridge Saxon HE tùy chọn thực thi các stylesheet đã biên dịch không chỉnh sửa của EN 16931 CII 1.3.16 và XRechnung 3.0.2 Schematron 2.6.0 đi kèm trong Lib/resources/Schematron/XRechnung
Các tài nguyên đến từ cấu hình validator chính thức của KoSIT ngày 31 tháng 8 năm 2026, và README của tài nguyên ghi lại nguồn gốc, giấy phép, và hash của chúng
Host cung cấp executable Java và class path Saxon tường minh, còn thư viện khởi chạy phép biến đổi không qua shell hay cửa sổ console hiện hình, thi hành timeout, phân tích các phát hiện SVRL, và xóa các tệp tạm của nó
Timeout bằng không chọn 60 giây, giá trị trên 3.600.000 milli-giây bị từ chối, đầu ra chẩn đoán bị chặn ở 8 MiB, và các stylesheet đã biên dịch cùng báo cáo SVRL bị chặn ở 64 MiB trước khi phân tích hoặc nạp
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;
Cấu hình class path Saxon với Saxon HE và các phụ thuộc bắt buộc của nó, và dùng registry cùng thể hiện engine riêng cho mỗi luồng xác thực
Bridge tùy chọn đòi hỏi Delphi XE2 trở lên trên Windows và một runtime Java/Saxon do host cung cấp, và thư viện không tự tải xuống hay cài đặt runtime nào
Thiếu runtime, cú pháp hóa đơn sai, DTD bị cấm, timeout, biến đổi thất bại, và đầu ra SVRL dị dạng tạo ra các chẩn đoán xác-thực-chưa-hoàn-tất rõ ràng
Quy tắc hóa đơn CTC Pháp chính thức
HPDFRegisterFrenchCTCRules chọn lớp hồ sơ chính thức và lớp quốc gia nghiêm ngặt BR-FR-Flux2 từ bản phát hành FNFE-MPE 1.4.0.04, công bố ngày 4 tháng 9 năm 2026 cho AFNOR XP Z12-012 phiên bản 1.4
Bản phát hành FNFE-MPE chính thức được công bố dưới Apache 2.0 và được liên kết từ trang tài nguyên FNFE-MPE, còn stylesheet EN 16931 CII đi kèm giữ nguyên EUPL 1.2, và các stylesheet đã biên dịch, mã nguồn Schematron, cơ sở mã, giấy phép, đường dẫn nguồn, cùng hash gốc được bảo toàn trong Lib/resources/Schematron/France
Với fisFacturX, helper hỗ trợ BASIC WL, EN 16931, và EXTENDED qua các lớp quy tắc Factur-X 1.09.2 đã công bố, còn định danh container EXTENDED-CTC-FR dùng cùng lớp Factur-X EXTENDED cộng với các kiểm tra quốc gia Pháp
Với fisCII độc lập, nó hỗ trợ EN 16931 và lớp CII EXTENDED-CTC-FR chuyên dụng, vốn có các ràng buộc và định danh guideline khác với lớp Factur-X EXTENDED lai
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);
Việc đăng ký giữ các phiên bản riêng cho hồ sơ và quy tắc quốc gia, và biến lớp quốc gia Pháp thành bắt buộc cho hồ sơ được chọn, bao gồm EN 16931 và BASIC WL khi được đăng ký tường minh cho Pháp
Stylesheet quốc gia nghiêm ngặt đã công bố được dùng trực tiếp, không thay bằng biến thể chỉ-cảnh-báo riêng hay hạ mức các phát hiện
Gói chính thức được ghim không có hồ sơ quy tắc EXTENDED-B2B-FR, nên helper từ chối tên kế thừa đó thay vì coi nó như một bí danh tự động được chứng nhận
Xác thực thành công xác lập việc hoàn tất các lớp quy tắc nghiệp vụ hóa đơn đã công bố này, còn XML Schema, thông điệp vòng đời CDAR, trích xuất dữ liệu e-reporting, ủy quyền nền tảng, truyền vận, và chứng nhận pháp lý vẫn là các phạm vi riêng
Engine API
Engine := HPDFCreateSchematronEngine;
if not Engine.Load(SchematronPath, ErrorText) then
raise Exception.Create(ErrorText);
Findings := Engine.Validate(XMLBytes);
Summary := Engine.LastSummary;
THPDFSchematronSummary báo cáo Profile, TotalRules, Evaluated, Skipped, EvaluationErrors, Violations, EngineAvailable, và EngineNote
Skipped vẫn bằng zero trong engine XE2 trở lên và được dành cho stub Delphi 7 hoặc dữ liệu kết quả kế thừa
Các biểu thức sai định dạng hoặc không được hỗ trợ tạo ra các phát hiện mức nghiêm trọng lỗi rõ ràng, tăng EvaluationErrors, và không bao giờ biến mất như các kiểm tra thành công
Các hàm helper XML Factur-X
Unit HPDFFacturX đi kèm các helper cấp byte đọc XML hóa đơn Factur-X / ZUGFeRD mà không dựng DOM, nên chúng chạy trên mọi phiên bản Delphi mà thư viện hỗ trợ và an toàn trên các byte trích xuất từ ExtractFacturXXML
HPDFFacturXGuidelineIDFromXMLBytes(XMLBytes) trả về định danh guideline từ phần tử GuidelineSpecifiedDocumentContextParameter / ram:ID của tài liệu CII, hoặc chuỗi rỗng khi không có mặt
HPDFIsFacturXConformanceLevel(Value, FileName, Version) xác thực tên mức tuân thủ, chấp nhận MINIMUM, BASIC WL, BASIC, EN 16931, EN16931, EXTENDED, EXTENDED-CTC-FR, EXTENDED-B2B-FR, và XRECHNUNG; mức kế thừa COMFORT còn đòi hỏi thêm tên tệp ZUGFeRD 1.0 là ZUGFeRD-invoice.xml với phiên bản 1.0
HPDFFacturXXMLGuidelineOK(XMLBytes, ConformanceLevel, Version, FileName) đối chiếu chéo guideline tìm thấy trong XML với mức tuân thủ, phiên bản, và tên tệp nhúng đã khai báo
HPDFFacturXInvoiceSummaryFromXML(XMLBytes, out ASummary) đổ dữ liệu vào record THPDFFacturXInvoiceSummary từ XML hóa đơn và trả về True khi ít nhất XML hóa đơn chính định vị được; bản thân kiểu record summary được khai báo trong HPDFDoc cạnh THPDFFacturXInvoiceInfo
Stable diagnostics and limits
- Định danh quy tắc được phân tích từ token thông điệp Schematron khi có mặt
- Các định danh thiếu nhận số thứ tự hồ sơ và assertion-or-report xác định
- Mỗi phát hiện giữ nguyên ngữ cảnh gốc và các biểu thức kiểm tra của nó
- Các đường dẫn cơ sở mã ngoài bị giới hạn ở tên tệp cùng thư mục
- Xử lý DTD và giải quyết thực thể XML ngoài bị vô hiệu hóa
- Đầu vào XML hóa đơn bị giới hạn ở 64 MiB
Toolchain availability
Delphi XE2 trở lên dùng engine tương thích MSXML tích hợp
Delphi 7 giữ các interface và kiểu kết quả dùng chung nhưng trả về chẩn đoán engine không khả dụng
API liên quan
HPDFValidateEInvoiceHPDFValidateEInvoiceWithRegistryHPDFValidateEInvoiceXMLTHPDFEInvoiceRuleRegistryHPDFRegisterXRechnungRulesHPDFRegisterFrenchCTCRulesTHPDFFrenchInvoiceSyntaxHPDFCreateSchematronEngineHPDFSchematronFileForProfileIHPDFESchematronEngineTHPDFBusinessRuleResultTHPDFSchematronSummary- THotPDF.ValidateFacturXInvoice
- THotPDF.ExtractFacturXXML
Nghiệm thu không GUI
Chạy Tests/Delphi/Run-EInvoiceRuleTests.ps1 với các giá trị JavaExecutable và SaxonClassPath tường minh, hoặc các biến môi trường HOTPDF_JAVA_EXE và HOTPDF_SAXON_CLASSPATH tương ứng
Runner mặc định đòi hỏi cấu hình engine quy-tắc-chính-thức và chạy cả Win32 lẫn Win64 với việc khởi chạy PDF viewer bị chặn; -NativeOnly cố ý bỏ qua thực thi Saxon chính thức