E-Invoice Business-Rule Validation

HPDFEInvoiceValidator اعتبارسنجی container مربوط به Factur-X یا ZUGFeRD را با مجموعه‌های قواعد کسب‌وکار و قواعد کشوریِ نسخه‌داری که صریحاً انتخاب شده‌اند ترکیب می‌کند

Complete reviewed rule execution

کتابخانه منابع متناظر `.sch` و `_codedb.xml` را برای MINIMUM، BASIC WL، BASIC، EN 16931 و EXTENDED همراه دارد

موتور XE2 و جدیدتر کل سطح بازبینی‌شدهٔ XPath 2 را از طریق parse امن MSXML، معادل‌های قطعی XPath 1 و ارزیابی مستقیم برای quantifierها، مجموع‌های FLWOR، castها، مقایسهٔ sequenceها، فهرست‌های کد خارجی، الگوهای تاریخ و مقادیر نشانگر boolean اجرا می‌کند

profile مربوط به EN 16931 شامل 618 بررسی است و همهٔ آن‌ها در هر اجرای اعتبارسنجی پردازش می‌شوند

Combined validation

var
  Report: THPDFEInvoiceValidationReport;
begin
  if not HPDFValidateEInvoice(PDF,
    'Lib\resources\Schematron', Report) then
    LogValidationFailure(Report);
end;

HPDFValidateEInvoice ابتدا THotPDF.ValidateFacturXInvoice را فراخوانی می‌کند، XML فاکتور را استخراج و شناسایی می‌کند، منابع Schematron مخصوص profile را بارگذاری می‌کند و قواعد کسب‌وکار را اجرا می‌کند

فاکتور هیبریدیِ شناسایی‌شده اگر استخراج XML، تشخیص profile، بارگذاری قواعد، بارگذاری code-database یا ارزیابی عبارت به پایان نرسد، به‌صورت fail-closed شکست می‌خورد

تابع فقط وقتی true برمی‌گرداند که container معتبر باشد، قواعد کسب‌وکار ارزیابی شده باشند و هیچ یافتهٔ error یا warning باقی نمانده باشد

مخزن profile و دامنهٔ اعتبارسنجی

THPDFEInvoiceRuleRegistry برای هر profile یک لایهٔ قواعد کسب‌وکار و در صورت نیاز یک لایهٔ قواعد کشوری ثبت می‌کند؛ با نام منبع صریح، نسخهٔ قاعده و پیاده‌سازی اختیاری IHPDFESchematronEngine

مخزن پیش‌فرض، پنج profile همراه کتابخانهٔ Factur-X و قواعد پایهٔ EXTENDED را برای profileهای فرانسوی EXTENDED-CTC-FR و EXTENDED-B2B-FR در بر دارد

profileهای فرانسوی پیش از true شدن ValidationComplete به یک ثبت اضافهٔ قواعد کشوری نیاز دارند و XRECHNUNG هم قواعد EN 16931 CII و هم قواعد کشوری آلمانی را می‌خواهد

profileهای ناشناخته قاعدهٔ پیش‌فرضی ندارند و هرگز به EXTENDED برنمی‌گردند؛ HPDFSchematronFileForProfile هم برای profileهای ناشناخته یا مخصوص-کشور رشتهٔ خالی برمی‌گرداند

HPDFValidateEInvoiceWithRegistry از مخزن فراخوان به‌همراه بررسی container PDF استفاده می‌کند، در حالی که HPDFValidateEInvoiceXML بایت‌های XML صریح و یک profile را بدون ارزیابی container PDF اعتبارسنجی می‌کند

گزارش ProfileSupported، CountryRulesRequired، CountryRulesEvaluated، ValidationComplete و ValidationNote را افشا می‌کند و آرایهٔ RuleSets آن هر منبع انتخاب‌شده، نسخه، دامنه، خلاصه و وضعیت تکمیل را ثبت می‌کند

ارزیابی کامل قواعد همچنان می‌تواند نقض قواعد کسب‌وکار داشته باشد؛ پس علاوه بر ValidationComplete، نتیجهٔ بولی یا BusinessRuleViolations را هم بررسی کنید

این APIها پوشش قواعد کسب‌وکار و قواعد کشوری را گزارش می‌کنند؛ اعتبارسنجی XML Schema، سیاست‌های انتقال و تصمیم‌های پذیرش قانونی بیرون از این دامنه می‌مانند

قواعد رسمی CII در XRechnung

HPDFEInvoiceSaxon یک پل اختیاری Saxon HE فراهم می‌کند که stylesheetهای کامپایل‌شدهٔ دست‌نخوردهٔ EN 16931 CII 1.3.16 و XRechnung 3.0.2 Schematron 2.6.0 را که در Lib/resources/Schematron/XRechnung همراه کتابخانه‌اند اجرا می‌کند

این منابع از پیکربندی رسمی KoSIT validator به تاریخ ۳۱ اوت ۲۰۲۶ می‌آیند و README منابع، خاستگاه، مجوزها و هش‌هایشان را ثبت کرده است

میزبان، اجرایی Java و class path ساکسون را صریحاً فراهم می‌کند و کتابخانه تبدیل را بدون shell یا پنجرهٔ کنسولِ قابل مشاهده اجرا می‌کند، timeout را اعمال می‌کند، یافته‌های SVRL را parse می‌کند و فایل‌های موقتش را پاک می‌کند

timeout صفر یعنی ۶۰ ثانیه، مقادیر بالای 3,600,000 میلی‌ثانیه رد می‌شوند، خروجی تشخیصی سقف 8 MiB دارد و stylesheetهای کامپایل‌شده و گزارش‌های SVRL پیش از parse یا بارگذاری سقف 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 HE و وابستگی‌های الزامی‌اش پیکربندی کنید و برای هر نخ اعتبارسنجی از مخزن و نمونهٔ موتور جداگانه استفاده کنید

پل اختیاری روی ویندوز به Delphi XE2 یا جدیدتر و یک زمان‌اجرای Java/Saxon فراهم‌شده توسط میزبان نیاز دارد؛ هیچ‌کدام از این زمان‌اجراها را کتابخانه دانلود یا نصب نمی‌کند

زمان‌اجرای غایب، syntax غلط فاکتور، DTDهای ممنوع، timeout، تبدیل شکست‌خورده و خروجی SVRL بدشکل، تشخیص‌های صریح اعتبارسنجی-ناقص تولید می‌کنند

قواعد رسمی CTC فاکتور فرانسه

HPDFRegisterFrenchCTCRules لایهٔ رسمی profile و لایهٔ کشوری سخت‌گیرانهٔ BR-FR-Flux2 را از انتشار 1.4.0.04 فن‌ام‌پ‌ئی (FNFE-MPE) برمی‌گزیند که در ۴ سپتامبر ۲۰۲۶ برای AFNOR XP Z12-012 نسخهٔ 1.4 منتشر شده است

انتشار رسمی FNFE-MPE تحت Apache 2.0 منتشر شده و از صفحهٔ منابع FNFE-MPE لینک شده است؛ stylesheet ضمیمهٔ EN 16931 CII مجوز EUPL 1.2 را نگه می‌دارد و stylesheetهای کامپایل‌شدهٔ اصلی، سورس‌های Schematron، پایگاه‌های کد، مجوزها، مسیرهای مبدأ و هش‌ها تحت Lib/resources/Schematron/France دست‌نخورده حفظ می‌شوند

برای fisFacturX، این helper با استفاده از لایه‌های قاعدهٔ منتشرشدهٔ Factur-X 1.09.2 از BASIC WL، EN 16931 و EXTENDED پشتیبانی می‌کند و نام‌گذاری container برای EXTENDED-CTC-FR از همان لایهٔ EXTENDED فاکتور-X به‌علاوهٔ بررسی‌های کشوری فرانسه استفاده می‌کند

برای fisCII مستقل، از EN 16931 و لایهٔ CII اختصاصی EXTENDED-CTC-FR پشتیبانی می‌کند که محدودیت‌ها و شناسهٔ guideline آن با لایهٔ EXTENDED فاکتور-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);

ثبت، نسخه‌های جداگانهٔ profile و قواعد کشوری را حفظ می‌کند و لایهٔ کشوری فرانسه را برای profile انتخابی الزامی می‌کند؛ از جمله EN 16931 و BASIC WL وقتی صریحاً برای فرانسه ثبت شده باشند

stylesheet ملیِ سخت‌گیرانهٔ منتشرشده مستقیماً به کار می‌رود؛ بدون جایگزینی با نسخهٔ جداگانهٔ فقط-هشدار یا پایین‌آوردن سطح یافته‌ها

بستهٔ رسمی سنجاق‌شده profile قاعدهٔ EXTENDED-B2B-FR ندارد؛ بنابراین helper آن نام قدیمی را رد می‌کند و آن را مثل یک نام مستعار خودکار-تأییدشده نمی‌گیرد

اعتبارسنجی موفق، تکمیل همین لایه‌های منتشرشدهٔ قواعد کسب‌وکار فاکتور را اثبات می‌کند؛ XML Schema، پیام‌های چرخهٔ عمر CDAR، استخراج دادهٔ e-reporting، مجوزدهی پلتفرم، انتقال و گواهی قانونی دامنه‌های جداگانه‌ای می‌مانند

Engine API

Engine := HPDFCreateSchematronEngine;
if not Engine.Load(SchematronPath, ErrorText) then
  raise Exception.Create(ErrorText);

Findings := Engine.Validate(XMLBytes);
Summary := Engine.LastSummary;

THPDFSchematronSummary reports Profile, TotalRules, Evaluated, Skipped, EvaluationErrors, Violations, EngineAvailable, and EngineNote

Skipped در موتور XE2 و جدیدتر صفر می‌ماند و برای stub مربوط به Delphi 7 یا داده‌های نتیجهٔ legacy رزرو شده است

عبارت‌های malformed یا پشتیبانی‌نشده یافته‌های صریح با severity برابر error تولید می‌کنند، EvaluationErrors را افزایش می‌دهند و هرگز به‌عنوان بررسی موفق ناپدید نمی‌شوند

توابع کمکی XML فاکتور-X

یونیت HPDFFacturX helperهایی سطح-بایت همراه دارد که XML فاکتور Factur-X / ZUGFeRD را بدون ساختن DOM می‌خوانند؛ بنابراین روی هر نسخهٔ Delphi که کتابخانه پشتیبانی می‌کند اجرا می‌شوند و روی بایت‌های استخراج‌شده از ExtractFacturXXML امن‌اند

HPDFFacturXGuidelineIDFromXMLBytes(XMLBytes) شناسهٔ guideline را از عنصر GuidelineSpecifiedDocumentContextParameter / ram:ID سند CII برمی‌گرداند و در صورت نبودش رشتهٔ خالی برمی‌گرداند

HPDFIsFacturXConformanceLevel(Value, FileName, Version) نام سطح انطباق را اعتبارسنجی می‌کند و MINIMUM، BASIC WL، BASIC، EN 16931، EN16931، EXTENDED، EXTENDED-CTC-FR، EXTENDED-B2B-FR و XRECHNUNG را می‌پذیرد؛ سطح قدیمی COMFORT علاوه بر آن، نام فایل ZUGFeRD-invoice.xml مخصوص ZUGFeRD 1.0 با نسخهٔ 1.0 را الزامی می‌کند

HPDFFacturXXMLGuidelineOK(XMLBytes, ConformanceLevel, Version, FileName) guideline پیداشده در XML را با سطح انطباق، نسخه و نام فایل جاسازی‌شدهٔ اعلان‌شده تطبیق می‌دهد

HPDFFacturXInvoiceSummaryFromXML(XMLBytes, out ASummary) یک رکورد THPDFFacturXInvoiceSummary را از XML فاکتور پر می‌کند و دست‌کم وقتی XML فاکتور اصلی قابل مکان‌یابی باشد True برمی‌گرداند؛ نوع رکورد خلاصه خودش در HPDFDoc کنار THPDFFacturXInvoiceInfo اعلان شده است

Stable diagnostics and limits

Toolchain availability

Delphi XE2 و جدیدتر از موتور سازگاری داخلی MSXML استفاده می‌کنند

Delphi 7 interfaceها و انواع نتیجهٔ مشترک را حفظ می‌کند اما یک diagnostic مبنی بر در دسترس نبودن موتور برمی‌گرداند

APIهای مرتبط

پذیرش بدون-GUI

Tests/Delphi/Run-EInvoiceRuleTests.ps1 را با مقادیر صریح JavaExecutable و SaxonClassPath یا متغیرهای محیطی متناظر HOTPDF_JAVA_EXE و HOTPDF_SAXON_CLASSPATH اجرا کنید

runner پیش‌فرض به پیکربندی موتور قواعد رسمی نیاز دارد و هر دو Win32 و Win64 را با سرکوب اجرای نمایشگر PDF اجرا می‌کند؛ -NativeOnly عمداً اجرای رسمی ساکسون را کنار می‌گذارد