أدوات الفوترة العربية

مكوّنات دقيقة للمطوّرين، وأدوات تعمل داخل المتصفّح — للفوترة الإلكترونية العربية. مفتوحة المصدر (MIT)، ولا ترفع بيانات أحد.

ما نقيسه نقوله، وما لا نقيسه لا ندّعيه. فكل رقمٍ هنا يشير إلى تشغيلٍ يُعاد، لا إلى وعد.


أدوات تعمل الآن

الأداة ماذا تفعل
أداة الفاتورة الضريبية تملأ نموذجاً فتنزل فاتورة PDF عربية بمجاميعها ورمزها — داخل متصفحك، بلا رفع
فاحص رمز QR يفكّ رمز الفاتورة ويفحص بنية حقول المرحلة الأولى
أداة طباعة الشيكات ملفٌ واحد يعمل بالنقر المزدوج — بلا خادم وبلا إنترنت
مقياس النصّ في PDF هل تصل المبالغ كما كُتبت؟ يبني ملفات فعلية ويقرأ منها الرسوم
مقياس التفقيط العربي 52 حالة، كلٌّ تحمل قاعدةً نحوية مسمّاة — ومحرّكُنا أول من فُحص بها
مقياس رمز QR السعودي 13 مكتبة npm على 10 حالات — 91.7% من التنزيلات المقيسة تُخفق، وستّ مسائل رُفعت عند أصحابها

مكتبات

المجلد ماذا تفعل ما يحرسها
nasq/ ترتيب النصّ العربي في PDF (UAX #9) 91,707 حالة من سلسلة يونيكود الرسمية
fatura-zatca/ فاتورة PDF: مجاميع بالهللات ورمز QR 41 اختباراً تقرأ الرسوم من داخل الملف
eta-lib/ مصر: التسلسل الكنسي والتجزئة، وتوقيع CAdES-BES مطابقة العيّنة الرسمية بايتاً ببايت (JSON وXML)، و95 اختباراً
python-lib/ خادم MCP: رمز QR، تفقيط، حسابات ضريبية 183 اختباراً
typescript-lib/ محرّك التفقيط — TypeScript تكافؤٌ مع نسخة بايثون، والمقياس

التثبيت — اليوم، بلا حساب npm

المكتبتان لم تُنشرا على npm بعد. وحتى ذلك، تُثبَّتان من إصدارٍ على هذا المستودع — وfatura-zatca تسحب nasq معها تلقائياً:

npm install https://github.com/opusstudiohq-max/arabic-invoice-mcp/releases/download/libs-v0.2.0/fatura-zatca-0.2.0.tgz
import { encodeZatcaQr, computeTotals, formatMinor } from "fatura-zatca";

const qr = encodeZatcaQr({
  sellerName: "مؤسسة عبد الرحمن بن محمد العتيبي للتجارة والمقاولات العامة والصيانة",
  vatNumber: "310122393500003",
  timestamp: "2026-09-01T14:30:00Z",
  totalWithVat: "1150.00",
  vatAmount: "150.00",
});
// اسمٌ من 140 بايتاً ⇒ الطول يُكتب 0x81 0x8C كما يقبله مُحقِّق الهيئة

وجُرّبت السلسلة من طرفها إلى طرفها: مشروعٌ نظيف ثبّت من هذا العنوان نفسه، فسحب nasq وتبعياتِها، ثم شُغّل فأعطى الطولَ صحيحاً والاسمَ سليماً والمجاميعَ بالهللات.

ثلاثة أشياء وجدناها بالقياس

① فاتورتك تطبع المبلغ مقلوباً. الإجمالي 1,234.50 ج.م تُكتب في ملف PDF المولَّد بـpdf-lib هكذا: م.ج 05.432,1 ﻲﻟﺎﻣﺟﻹا — أي أن المبلغ يصل العميل «05.432,1». والعيب في الترتيب الثنائي الاتجاه لا في تشكيل الحروف. وnasq/ يصلحه — وإضافةُ خوارزمية اتجاهٍ وحدها تزيده سوءاً، لأن العكس يقع مرّتين.

② نصف الخطوط العربية المرخَّصة بحرية تُنتج فاتورة مكسورة. قِسنا ثمانية عبر pdf-lib: Almarai وTajawal وIBM Plex وCairo سليمة؛ وNoto Sans وNoto Naskh وReadex Pro وAmiri مكسورة. والنصّ يُستخرج سليماً من المكسورة كلها — فلا اختبارٌ نصّي يمسّها، ولا يكشفها إلا النظر.

③ ومقياسنا عضّ صاحبه أولاً. قبل نشر مقياس التفقيط سألنا سؤالاً بديهياً: هل يجتازه بناؤنا نحن؟ فكان 19 من 50. أصلحناه، ونشرنا القصّة مع المقياس.

④ وذهبنا نفحص غيرنا فوجدنا عيبنا. قِسنا حزم ZATCA على npm فوجدنا إحداها تكتب طول الحقل بقواعد BER بينما نصّ المواصفة يقول «بايت واحد». ذهبنا نتحقق أيّهما الصواب — فإذا الخطأ عندنا، وفي ثلاث نسخ منها أداةُ الفحص المنشورة. أصلحناها قبل أن نقيس أحداً، ثم رفعنا ستّ مسائل عند أصحاب الحزم المعطوبة، كلٌّ ببرهانٍ يُشغَّل.


ما لا تفعله هذه الأدوات

وهذه الحدود مكتوبة في الكود لا في وثيقة: tools/claims_lint.py بوابةٌ تُفشل أي أصلٍ عام يتجاوزها، وFACTS.json يُبطل كل حقيقة تنظيمية تجاوزت موعد إعادة فحصها فيُوقف حتى يُعاد التحقق.


ماذا نعمل — وما لا نعمله

الأدوات أعلاه مجانيةٌ ومفتوحة، ولا تحتاج إلينا لتستعملها. وهذه فقرةٌ لمن يحتاج عملاً هندسياً فوقها.

نعمل:

ولا نعمل:

كيف تحكم علينا قبل أن تدفع: كلُّ ما تقرؤه هنا مفتوحٌ ويُعاد تشغيله — المقاييس، والاختبارات، والبوابات التي تُفشل ادعاءاتنا نحن. وابدأ بأصعب سؤالٍ عندك؛ إن كان جوابُنا «لا نعرف» قلناها.

📧 yahya@opus-studio.pro

الترخيص

الكود بترخيص MIT. والخطّ في أداة الفاتورة — Almarai — برخصة SIL Open Font License 1.1.

للتواصل: opus.studio.hq@gmail.com

نبني تكاملات فوترة إلكترونية ونصلح المكسور منها — بنطاقٍ وسعرٍ واضحين. راسلنا أو انسخ العنوان: yahya@opus-studio.pro