การตรวจสอบกฎธุรกิจใบกำกับสินค้าอิเล็กทรอนิกส์
HPDFEInvoiceValidator รวมการตรวจสอบคอนเทนเนอร์ Factur-X หรือ ZUGFeRD เข้ากับชุดกฎธุรกิจและกฎประจำประเทศที่เลือกอย่างชัดเจนและระบุเวอร์ชัน
การนำกฎชุดที่ทบทวนแล้วไปใช้อย่างสมบูรณ์
ไลบรารีมาพร้อมทรัพยากร `.sch` และ `_codedb.xml` ที่ตรงกันสำหรับ MINIMUM, BASIC WL, BASIC, EN 16931 และ EXTENDED
เอนจิน XE2 ขึ้นไปทำงานพื้นผิว XPath 2 ที่ทบทวนแล้วอย่างสมบูรณ์ผ่านการแยกวิเคราะห์ MSXML ที่ปลอดภัย ค่าเทียบเท่า XPath 1 เชิงกำหนด และการประเมินตรงสำหรับ quantifier ผลรวม FLWOR cast การเปรียบเทียบลำดับ รายการรหัสภายนอก รูปแบบวันที่ และค่าตัวบ่งชี้บูลีน
โปรไฟล์ EN 16931 ประกอบด้วยการตรวจสอบ 618 รายการและการตรวจสอบทุกครั้งถูกประมวลผลระหว่างการเรียกการตรวจสอบแต่ละครั้ง
การตรวจสอบแบบรวม
var
Report: THPDFEInvoiceValidationReport;
begin
if not HPDFValidateEInvoice(PDF,
'Lib\resources\Schematron', Report) then
LogValidationFailure(Report);
end;
HPDFValidateEInvoice แรกเรียก THotPDF.ValidateFacturXInvoice สกัดและระบุไฟล์ XML ใบกำกับ โหลดทรัพยากร Schematron เฉพาะโปรไฟล์ และทำงานกฎธุรกิจ
ใบกำกับแบบไฮบริดที่ตรวจพบล้มเหลวแบบปิดเมื่อการสกัด XML การตรวจจับโปรไฟล์ การโหลดกฎ การโหลดฐานข้อมูลรหัส หรือการประเมินนิพจน์ไม่สามารถเสร็จสมบูรณ์
ฟังก์ชันส่งคืน true เฉพาะเมื่อคอนเทนเนอร์ถูกต้อง กฎธุรกิจถูกประเมิน และไม่มีข้อค้นพบข้อผิดพลาดหรือคำเตือนที่เหลืออยู่
Registry ของโปรไฟล์และขอบเขตการตรวจสอบ
THPDFEInvoiceRuleRegistry ลงทะเบียนชั้นกฎธุรกิจหนึ่งชุด และเมื่อจำเป็น ชั้นกฎประจำประเทศอีกหนึ่งชุดต่อโปรไฟล์ พร้อมชื่อทรัพยากรที่ระบุชัด ระบุเวอร์ชันกฎ และการใช้งาน IHPDFESchematronEngine แบบเลือกได้
registry เริ่มต้นมีโปรไฟล์ Factur-X ที่แถมมาทั้ง 5 ตัว และกฎ EXTENDED พื้นฐานสำหรับโปรไฟล์ฝรั่งเศส EXTENDED-CTC-FR กับ EXTENDED-B2B-FR
โปรไฟล์ฝรั่งเศสต้องลงทะเบียนกฎประจำประเทศเพิ่มก่อน ValidationComplete จะเป็น true และ XRECHNUNG ต้องมีทั้งกฎ EN 16931 CII และกฎประจำเยอรมนี
โปรไฟล์ที่ไม่รู้จักไม่มีกฎเริ่มต้นและไม่เคย fallback ไปที่ EXTENDED ส่วน HPDFSchematronFileForProfile จะคืนสตริงว่างสำหรับโปรไฟล์ที่ไม่รู้จักหรือเฉพาะประเทศ
HPDFValidateEInvoiceWithRegistry ใช้ registry ของผู้เรียกพร้อมการตรวจคอนเทนเนอร์ PDF ส่วน HPDFValidateEInvoiceXML ตรวจ byte XML ที่ระบุกับโปรไฟล์ที่ระบุ โดยไม่ประเมินคอนเทนเนอร์ PDF
รายงานเปิดเผย ProfileSupported, CountryRulesRequired, CountryRulesEvaluated, ValidationComplete และ ValidationNote โดยอาเรย์ RuleSets บันทึกทรัพยากร เวอร์ชัน ขอบเขต สรุปผล และสถานะความครบถ้วนของทุกชุดที่ถูกเลือก
การประเมินกฎที่ครบถ้วนก็ยังมีการละเมิดกฎธุรกิจได้ จึงควรดูผล boolean หรือ BusinessRuleViolations ควบคู่กับ ValidationComplete ด้วย
API เหล่านี้รายงานการครอบคลุมของกฎธุรกิจกับกฎประจำประเทศ ส่วนการตรวจ XML Schema นโยบายการขนส่ง และการตัดสินใจยอมรับตามกฎหมายยังอยู่นอกขอบเขตนี้
กฎ CII ทางการของ XRechnung
HPDFEInvoiceSaxon ให้บริดจ์ Saxon HE แบบเสริมที่รัน stylesheet Schematron 2.6.0 ของ EN 16931 CII 1.3.16 และ XRechnung 3.0.2 ฉบับคอมไพล์แล้วโดยไม่แก้ไข ตามที่แถมมาใน Lib/resources/Schematron/XRechnung
ทรัพยากรชุดนี้มาจาก configuration ตัวตรวจทางการของ KoSIT ลงวันที่ 31 สิงหาคม 2026 และ README ของทรัพยากรบันทึกที่มา สัญญาอนุญาต และ hash ของมันไว้
ฝั่งผู้ใช้ระบุ executable ของ Java กับ class path ของ Saxon เอง แล้วไลบรารีจะเริ่มการแปลงโดยไม่ผ่าน shell หรือหน้าต่าง console ที่มองเห็น บังคับ timeout แยกวิเคราะห์ข้อค้นพบจาก SVRL และลบไฟล์ชั่วคราวของตัวเองทิ้ง
timeout เป็นศูนย์จะเลือก 60 วินาที ค่าที่เกิน 3,600,000 มิลลิวินาทีถูกปฏิเสธ ผลลัพธ์เชิงวินิจฉัยถูกกั้นที่ 8 MiB และ stylesheet คอมไพล์แล้วกับรายงาน SVRL ถูกกั้นที่ 64 MiB ก่อนการแยกวิเคราะห์หรือโหลด
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;
ตั้งค่า class path ของ Saxon ให้มี Saxon HE กับ dependency ที่จำเป็น และใช้ registry กับ engine instance แยกกันต่อหนึ่ง thread การตรวจสอบ
บริดจ์เสริมนี้ต้องการ Delphi XE2 ขึ้นไปบน Windows พร้อม runtime Java/Saxon ที่ฝั่งเรียกจัดหาเอง และไลบรารีไม่ได้ดาวน์โหลดหรือติดตั้ง runtime เหล่านั้นให้
runtime ที่ขาดหาย ไวยากรณ์ใบกำกับที่ผิด DTD ต้องห้าม timeout การแปลงที่ล้มเหลว และผลลัพธ์ SVRL ที่เสียโครงสร้าง ล้วนให้การวินิจฉัยว่าการตรวจยังไม่ครบถ้วนอย่างชัดเจน
กฎใบกำกับ CTC ทางการของฝรั่งเศส
HPDFRegisterFrenchCTCRules เลือกชั้นโปรไฟล์ทางการและชั้นประเทศเข้มงวด BR-FR-Flux2 จากรุ่น 1.4.0.04 ของ FNFE-MPE ที่เผยแพร่ 4 กันยายน 2026 สำหรับ AFNOR XP Z12-012 เวอร์ชัน 1.4
รุ่นทางการของ FNFE-MPE เผยแพร่ภายใต้ Apache 2.0 และถูกลิงก์จาก หน้ารวมทรัพยากรของ FNFE-MPE โดย stylesheet EN 16931 CII ที่แถมมาคงสัญญาอนุญาต EUPL 1.2 ส่วน stylesheet คอมไพล์แล้วต้นฉบับ ซอร์ส Schematron ฐานข้อมูลรหัส สัญญาอนุญาต เส้นทางซอร์ส และ hash ถูกเก็บไว้ครบใต้ Lib/resources/Schematron/France
สำหรับ fisFacturX helper รองรับ BASIC WL, EN 16931 และ EXTENDED ด้วยชั้นกฎ Factur-X 1.09.2 ที่เผยแพร่ไว้ และการระบุคอนเทนเนอร์ EXTENDED-CTC-FR ใช้ชั้น Factur-X EXTENDED เดิมบวกการตรวจประจำประเทศฝรั่งเศส
สำหรับ fisCII แบบ standalone รองรับ EN 16931 กับชั้น CII เฉพาะของ EXTENDED-CTC-FR ซึ่งมีข้อจำกัดและตัวระบุ guideline ต่างจากชั้น 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);
การลงทะเบียนคงเวอร์ชันของโปรไฟล์กับกฎประจำประเทศไว้แยกจากกัน และทำให้ชั้นประเทศฝรั่งเศสเป็นข้อบังคับของโปรไฟล์ที่เลือก รวมถึง EN 16931 กับ BASIC WL เมื่อลงทะเบียนไว้สำหรับฝรั่งเศสอย่างชัดเจน
stylesheet ประจำชาติที่เผยแพร่แบบเข้มงวดถูกใช้ตรง ๆ โดยไม่สลับไปใช้ตัวแปรที่ให้แค่คำเตือน หรือลดระดับข้อค้นพบ
แพ็กเกจทางการที่ pin ไว้ไม่มีโปรไฟล์กฎ EXTENDED-B2B-FR helper จึงปฏิเสธชื่อเดิมนี้ แทนที่จะถือว่าเป็น alias ที่รับรองอัตโนมัติ
การตรวจสอบที่ผ่านยืนยันความครบถ้วนของชั้นกฎธุรกิจใบกำกับที่เผยแพร่เหล่านี้ ส่วน XML Schema ข้อความวงจรชีวิต CDAR การดึงข้อมูล e-reporting การอนุญาตของแพลตฟอร์ม การขนส่ง และการรับรองตามกฎหมาย ยังเป็นขอบเขตที่แยกจากกัน
API ของเอนจิน
Engine := HPDFCreateSchematronEngine;
if not Engine.Load(SchematronPath, ErrorText) then
raise Exception.Create(ErrorText);
Findings := Engine.Validate(XMLBytes);
Summary := Engine.LastSummary;
THPDFSchematronSummary รายงาน Profile, TotalRules, Evaluated, Skipped, EvaluationErrors, Violations, EngineAvailable และ EngineNote
Skipped ยังคงเป็นศูนย์ในเอนจิน XE2 ขึ้นไปและถูกสงวนสำหรับ stub Delphi 7 หรือข้อมูลผลลัพธ์แบบเดิม
นิพจน์ที่เสียรูปแบบหรือไม่รองรับสร้างข้อค้นพบระดับความรุนแรงข้อผิดพลาดอย่างชัดเจน เพิ่ม EvaluationErrors และไม่หายไปในฐานะการตรวจสอบที่สำเร็จ
ฟังก์ชันช่วย XML ของ Factur-X
ยูนิต HPDFFacturX มี helper ระดับ byte สำหรับอ่าน XML ใบกำกับ Factur-X / ZUGFeRD โดยไม่ต้องสร้าง DOM จึงรันได้ทุกรุ่น Delphi ที่ไลบรารีรองรับ และใช้กับ byte ที่สกัดมาจาก ExtractFacturXXML ได้อย่างปลอดภัย
HPDFFacturXGuidelineIDFromXMLBytes(XMLBytes) คืนตัวระบุ guideline จาก element GuidelineSpecifiedDocumentContextParameter / ram:ID ของเอกสาร CII หรือคืนสตริงว่างเมื่อไม่มีข้อมูลนี้
HPDFIsFacturXConformanceLevel(Value, FileName, Version) ตรวจชื่อระดับ conformance โดยรับ MINIMUM, BASIC WL, BASIC, EN 16931, EN16931, EXTENDED, EXTENDED-CTC-FR, EXTENDED-B2B-FR และ XRECHNUNG ส่วนระดับเดิม COMFORT ต้องมีชื่อไฟล์ ZUGFeRD 1.0 เป็น ZUGFeRD-invoice.xml กับเวอร์ชัน 1.0 เพิ่มด้วย
HPDFFacturXXMLGuidelineOK(XMLBytes, ConformanceLevel, Version, FileName) ไขว้ตรวจ guideline ที่พบใน XML เทียบกับระดับ conformance เวอร์ชัน และชื่อไฟล์ที่ประกาศไว้
HPDFFacturXInvoiceSummaryFromXML(XMLBytes, out ASummary) เติม record THPDFFacturXInvoiceSummary จาก XML ใบกำกับ และคืน True เมื่อหา XML ใบกำกับหลักได้อย่างน้อย ชนิด record สรุปนี้ประกาศไว้ใน HPDFDoc ข้าง ๆ THPDFFacturXInvoiceInfo
การวินิจฉัยและขีดจำกัดที่เสถียร
- ตัวระบุกฎถูกแยกวิเคราะห์จากโทเคนข้อความ Schematron เมื่อปรากฏ
- ตัวระบุที่หายไปได้รับโปรไฟล์เชิงกำหนดและลำดับประจำการยืนยันหรือรายงาน
- แต่ละข้อค้นพบเก็บบริบทและนิพจน์การทดสอบดั้งเดิมของมัน
- เส้นทางฐานข้อมูลรหัสภายนอกถูกจำกัดเป็นชื่อไฟล์พี่น้อง
- การประมวลผล DTD และการแก้ไข entity XML ภายนอกถูกปิดใช้งาน
- อินพุต XML ใบกำกับถูกจำกัดที่ 64 MiB
ความพร้อมใช้ของ toolchain
Delphi XE2 ขึ้นไปใช้เอนจินความเข้ากันได้ MSXML ในตัว
Delphi 7 เก็บอินเทอร์เฟซและประเภทผลลัพธ์ร่วมไว้ แต่ส่งคืนการวินิจฉัยว่าเอนจินไม่พร้อมใช้
API ที่เกี่ยวข้อง
HPDFValidateEInvoiceHPDFValidateEInvoiceWithRegistryHPDFValidateEInvoiceXMLTHPDFEInvoiceRuleRegistryHPDFRegisterXRechnungRulesHPDFRegisterFrenchCTCRulesTHPDFFrenchInvoiceSyntaxHPDFCreateSchematronEngineHPDFSchematronFileForProfileIHPDFESchematronEngineTHPDFBusinessRuleResultTHPDFSchematronSummary- THotPDF.ValidateFacturXInvoice
- THotPDF.ExtractFacturXXML
การยอมรับแบบไม่ใช้ GUI
รัน Tests/Delphi/Run-EInvoiceRuleTests.ps1 โดยระบุ JavaExecutable กับ SaxonClassPath อย่างชัดเจน หรือใช้ตัวแปรสภาพแวดล้อม HOTPDF_JAVA_EXE กับ HOTPDF_SAXON_CLASSPATH ที่ตรงกัน
runner เริ่มต้นต้องมี configuration ของเอนจินกฎทางการ และรันทั้ง Win32 กับ Win64 โดยกดการเปิด PDF viewer ไว้ ส่วน -NativeOnly จะตัดการรัน Saxon ทางการออกอย่างตั้งใจ