২০২৬ সালে আপনি যদি জার্মান B2B customer-কে e-invoice পাঠান, ফাইলটি হয় ZUGFeRD-compliant হবে, নয়তো receipt পর্যায়েই bounce করবে। France-এ Factur-X-এর ক্ষেত্রেও একই কথা। Format হলো PDF/A-3 wrapper, যার সঙ্গে EN 16931 CII XML attached থাকে। Scratch থেকে generate করা কঠিন, আর validate করতে reference engine লাগে।
প্র্যাকটিক্যালি সেই engine হলো Mustang (mustangproject.org)। এটি open-source Java project, PDF/A-3 থেকে embedded XML extract করে EN 16931 Schematron-এর বিরুদ্ধে validate করে। ZUGFeRD ও Factur-X support-এর ক্ষেত্রে open-source tools-এর মধ্যে Mustang সবচেয়ে গভীর, এবং অনেক independent verifier এটিই চালায়।
এই পোস্টে Mustang যে failure modes ধরে এবং দ্রুত চালানোর পদ্ধতি দেখানো হলো।
Mustang আসলে কী check করে
Factur-X বা ZUGFeRD PDF দিলে Mustang মোটামুটি এসব করে:
- Embedded file extract করে। PDF/A-3 attachments রাখে
/EmbeddedFilesname tree-তে। Mustang canonical filename খোঁজে (factur-x.xmlfor Factur-X,zugferd-invoice.xmlfor ZUGFeRD 2.x) এবং bytes পড়ে। - AFRelationship check করে। Attached file-কে Factur-X / ZUGFeRD baseline অনুযায়ী
AFRelationship="Alternative"হতে হবে। অন্য কিছু (Source,Data,Supplement) fail। - XMP namespace এবং version check করে। Factur-X 1.0 ব্যবহার করে
urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#। ZUGFeRD 2.x ব্যবহার করেurn:zugferd:pdfa:CrossIndustryDocument:invoice:2p0#। ভুল namespace বা version string fail। - XML-কে Cross-Industry Invoice (CII) হিসেবে parse করে। XML well-formed হতে হবে এবং সঠিক CII root element (
rsm:CrossIndustryInvoice) দিয়ে শুরু হতে হবে। - EN 16931 Schematron চালায়। Validation-এর বড় অংশ: প্রায় ২০০ business rules, field semantics, mandatory codes, totals math, VAT logic, party identifiers ইত্যাদি।
Pass মানে invoice EU-র যেকোনো EN 16931-conformant AP system-এ acceptable। Fail মানে customer-এর AP automation receipt-এ invoice reject করবে এবং AR team manual exception পাবে।
পাঁচটি failure mode যা সবচেয়ে বেশি দেখি
Teams যখন প্রথম e-invoices test করে, validator এর Mustang side-এ এগুলো বারবার আসে।
1. Wrong AFRelationship
ERROR: Embedded file factur-x.xml uses AFRelationship="Source",
expected "Alternative".
PDF spec attached files-এর জন্য একাধিক relationship type allow করে। Factur-X / ZUGFeRD নির্দিষ্টভাবে Alternative চায়, অর্থাৎ attached XML visible PDF content-এর alternative representation। আপনার PDF generator যদি Data ব্যবহার করে (অনেক library-র default), Mustang সঙ্গে সঙ্গে fail করবে। Visible PDF render ঠিক থাকবে, কিন্তু structured payload AP system-এর কাছে অকার্যকর।
2. Wrong / missing XMP namespace
ERROR: XMP metadata missing fx:DocumentType or fx:DocumentFileName under
namespace urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#.
PDF-এর XMP packet-এ ঘোষণা করতে হবে এটি কোন Factur-X profile (MINIMUM, BASIC, EN 16931, EXTENDED) এবং কোন filename খুঁজতে হবে। হাতে PDF/A-3 wrapper লিখলে এটি সহজে বাদ পড়ে; gPdf-এর /api/v1/e-invoice/render endpoint এগুলো auto-emit করে।
3. CII XML well-formed, কিন্তু EN 16931 Schematron fail
ERROR: BR-CO-25 — In an invoice (BR-01) the
ram:SpecifiedTradePaymentTerms/ram:DueDateDateTime is required when
ram:DocumentTypeCode is 380.
Real-world failures-এর বড় অংশ এটি। XML syntactically valid; business rules fail। EN 16931 Schematron rules-এর stable IDs আছে (BR-01, BR-CO-25 ইত্যাদি), specification-এ lookup করা যায়। Common ones:
- BR-01: invoice-এ unique invoice number থাকতে হবে।
- BR-04: issue date থাকতে হবে।
- BR-05: invoice type code থাকতে হবে।
- BR-CO-25: document type “Commercial invoice” হলে payment terms required।
- BR-Z-01: VAT category codes
S,Z,E,AE,K,G,O,L,M-এর একটি হতে হবে।
Source data ঠিক করুন, rebuild করুন, re-validate করুন।
4. PDF/A wrapper আসলে validate করে না
INFO: CII XML extracted and validates against EN 16931.
ERROR: PDF/A-3b conformance check failed: missing Output Intent.
এখানে Mustang-এর XML check pass, কিন্তু underlying PDF/A-3 wrapper fail। Common cause: XML ঠিক আছে, কিন্তু output ordinary PDF, PDF/A-3 নয়। Embedded file আছে, কিন্তু archival wrapper rules পূরণ হয়নি। gpdf.com/validator/ parallel-এ veraPDF চালিয়ে এটি ধরে: PDF/A-3 fail veraPDF column-এ দেখা যায়, Mustang XML pass দেখায়।
5. Encoding / declaration mismatch
ERROR: XML declares <?xml version="1.0" encoding="UTF-8"?> but the
embedded byte stream is UTF-8 with BOM. Mustang strict mode rejects BOM.
XML tool যদি UTF-8 BOM emit করে এবং raw bytes embed হয়, এটি surprising হলেও common issue। Fix: embed করার আগে BOM strip করুন। gPdf-এর e-invoice endpoint এটি normalise করে।
Java install না করেও Mustang চালানো
One-off check-এর জন্য Java + Mustang CLI install করা ঠিক আছে। কিন্তু ongoing verification — প্রতিটি generated invoice, প্রতিটি CI run যা e-invoice compliance assert করে — এর জন্য এটি unnecessary friction।
gpdf.com/validator/ Mustang browser-এ চালায়:
- Factur-X / ZUGFeRD PDF upload zone-এ drag করুন।
- Validator embedded XML extract করে এবং Mustang-এর Schematron engine চালায় (JavaScript / WebAssembly-এ compiled, Cloudflare Worker-এ run)।
- Mustang report, veraPDF-এর PDF/A-3 report-এর সঙ্গে side-by-side ফিরে আসে, কারণ দুই layer-ই pass হতে হবে।
- QA evidence-এর জন্য JSON report download করুন।
No login. No quota. Maven দিয়ে install করা Mustang-এর মতোই check, শুধু free public service হিসেবে।
TL;DR
Mustang 5 common failure modes ধরে; বেশিরভাগের সারকথা হলো file এমন tool দিয়ে generated যা fully-conformant Factur-X / ZUGFeRD PDF/A-3 emit করে না। gPdf-এর E-invoice API এক call-এ compliant file emit করে। validator Mustang + veraPDF দিয়ে result parallel verify করে।
Mustang যে bugs ধরে তার বেশিরভাগ wrapper বা AFRelationship সমস্যা, শুধু XML semantics নয়। File সঠিকভাবে generate করাই লড়াইয়ের বড় অংশ; validator হলো proof receipt।