- مقدمة
- العرض
- MVP
- خارطة الطريق
- متطلبات المنتج
- ابدأ الآن
- البيئة المحلية
- البنية المعمارية
- الهيكل
- الأنماط
- الحزمة التقنية
- قاعدة البيانات
- تعدّد المستأجرين
- الفهرس (Catalog)
- العمل دون اتصال
- المصادقة
- التهيئة (Onboarding)
- تدفق التكامل (Integration Flow)
- التهيئة (Provision)
- القبول
- الحضور
- الامتثال التنظيمي
- الملف الشخصي
- الاجتماعات
- إدارة الرسوم
- الفاتورة
- التدويل
- الترجمة
- دليل الترجمة
- أمان قاعدة البيانات
- المساهمة
- هَوْغوارتس
- عرض حي
- الإلهام
المالية
مالية المدرسة متعددة المستأجرين — محرك محاسبة بالقيد المزدوج مع 14 وحدة فرعية (الرسوم، الفواتير، الرواتب، البنوك، …)، وعملة لكل مدرسة، وبوابات دفع قابلة للتوصيل.
كتلة المالية هي أكبر ميزة في المنصة (نحو 45 ألف سطر، 14 وحدة فرعية) والعمود الفقري المالي لكل مدرسة: تُصدر فواتير الأسر، وتُحصّل المدفوعات، وتدفع رواتب الكادر، وتتابع الإنفاق، وتحتفظ بدفتر أستاذ بالقيد المزدوج. هذه الصفحة هي خريطة الحالة المعتمدة — ولكل وحدة فرعية صفحتها المرتبطة أدناه. المرجع الهندسي المفصّل (بأرقام الأسطر) هو finance/ISSUE.md.
ما هي كتلة المالية
أربع عشرة وحدة فرعية تلتف حول محرك محاسبة مشترك بالقيد المزدوج. يدخل المال (الرسوم، الفواتير، شحن المحافظ)، ويخرج المال (الرواتب، المصروفات)، وتحتفظ كل مدرسة بدليل حساباتها وعملتها وصلاحياتها. كل استعلام معزول بحسب المستأجر عبر schoolId.
| المجموعة | الوحدات |
|---|---|
| الإيراد والقيمة | الرسوم، الفواتير، المحفظة |
| الأفراد والأجور | الراتب، كشف الرواتب، سجلات الوقت |
| الإنفاق والتخطيط | المصروفات، الميزانية، الإيصالات |
| دفتر الأستاذ والبنوك | الحسابات، البنوك، التقارير |
| المنصة | لوحة التحكم، الصلاحيات |
نموذج القيد المزدوج
يعيش المحرك في finance/lib/accounting/. يترجم posting-rules.ts حدث المجال إلى أسطر يومية متوازنة؛ ويكتبها actions.ts.
حدث في المجال (تسجيل دفعة، اعتماد راتب، …)
→ قاعدة الترحيل تحوّله إلى سطرَي مدين ودائن (المدين == الدائن)
→ تُكتب صفوف JournalEntry + LedgerEntry مقيّدة بـ schoolId
→ تتجمّع في التقارير (ميزان المراجعة، الأرباح والخسائر، الميزانية العمومية)
قواعد الترحيل تُضاف ولا تُعدَّل — تعديل قاعدة قائمة يُغيّر الميزانيات العمومية التاريخية.
الوحدات الفرعية
- الرسوم — هياكل الرسوم، التعيين، الدفع الإلكتروني (Stripe/Tap) وغير الإلكتروني، الأقساط، مهمة التأخير الدورية، الغرامات، المنح.
- الفواتير — دورة حياة الفاتورة، معالج الإنشاء، البريد، التحليلات. أكثر الوحدات اكتمالاً.
- المحفظة — محافظ رصيد مخزَّن بلا نقد، الشحن، الأرصدة.
- الراتب — هياكل رواتب لكل معلم، البدلات، الخصومات، العلاوات.
- كشف الرواتب — دورات فترات الدفع، قسائم الرواتب، اعتماد ← صرف.
- سجلات الوقت — فترات وسجلات وقت الكادر؛ الغاية أن تغذّي كشف الرواتب.
- المصروفات — تقديم المصروف، سير الاعتماد، الفئات، التكامل مع الميزانية.
- الميزانية — تخطيط الميزانية، التخصيص، تتبّع الانحراف.
- الإيصالات — رفع إيصالات المصروفات مع استخراج بالذكاء الاصطناعي (تختلف عن إيصال دفع الرسوم PDF).
- الحسابات — دليل الحسابات، قيود اليومية اليدوية، دفتر الأستاذ العام؛ موطن محرك المحاسبة.
- البنوك — الحسابات البنكية، التحويلات، التسوية (Plaid / Dwolla).
- التقارير — الميزانية العمومية، الأرباح والخسائر، ميزان المراجعة من دفتر الأستاذ.
- لوحة التحكم — بطاقات مؤشرات بحسب الدور، رسوم بيانية، تنبيهات، إجراءات سريعة.
- الصلاحيات — إدارة
FinancePermissionالدقيقة (12 وحدة × 7 إجراءات).
الاهتمامات المشتركة
عزل المستأجرين
كل استعلام مالي مقيّد بـ schoolId؛ الحد الفاصل هنا أشد صرامة من أي مكان آخر في المنصة، لأن تسرّب صف واحد يعني تسرّب دفتر أستاذ مدرسة أخرى.
العملة لكل مدرسة
يقود School.currency (رمز ISO 4217) كل تنسيق نقدي — لا $ ولا SDG مكتوبة يدوياً في أي مكان. البطاقات الملخّصة تعرض صيغة مختصرة (١٠٫٦ مليون ج.س.) بينما تبقى الجداول ودفاتر الأستاذ والفواتير دقيقة حتى القرش.
الصلاحيات بحسب الدور
تُحلّ كل صفحة بوابتها عبر finance/guard.ts: يقرأ resolveFinanceAccess(module, actions) الجلسة والمستأجر مرة واحدة ثم يقيّم كل إجراء على التوازي، وتعرض الصفحة واجهة الرفض المدمجة (لا إعادة توجيه) لمن لا يملك الصلاحية. وفي 2026-08-15 تُتُبِّعت صفحات المسار الثمانون كلها حتى استعلامات قاعدة البيانات: أُغلقت ستة مسارات مفتوحة (صفحات قوائم الرسوم الخمس التي كانت تجلب صفحتها الأولى بفحص المستأجر فقط، ورمز بوابة الاشتراك الذي كان يُصدَر لأي مستخدم مسجّل)، وأُضيفت واجهة الرفض لثماني صفحات، ويفشل البناء الآن (guard-audit) إذا ظهرت صفحة جديدة تستعلم قاعدة البيانات بلا بوابة.
| الدور | الوصول |
|---|---|
| المسؤول | الوحدات الأربع عشرة، إدارة الصلاحيات، إعدادات المحاسبة |
| المحاسب | كامل المالية بما فيها القيود اليدوية والرواتب والتقارير |
| المطوّر | على مستوى المنصة عبر كل المدارس |
| المعلم / الموظف | راتبه وقسائمه، تقديم المصروفات، تسجيل الحضور |
| الطالب / ولي الأمر | عرض الرسوم ودفعها، رصيد المحفظة، تنزيل الإيصالات |
التدويل والاتجاه من اليمين إلى اليسار
النصوص الثابتة كلها من القاموس (dictionaries/{en,ar}/finance.json)، والإشعارات — بما فيها مهمّتا الرسوم الدوريتان — تُرسل بلغة المدرسة المفضّلة. تُعيد إجراءات الخادم رموز أخطاء لا جملاً إنجليزية، ويحوّلها العميل إلى نص مترجم بلا أن يعرض رمزاً خاماً أو رسالة استثناء. مقياسان يمنعان التراجع: مقياس المنصة للنصوص المكتوبة يدوياً، ومقياس خاص بالمالية (scripts/finance-i18n-audit.ts) يلتقط ما لا تراه اختبارات التطابق — بحثاً عن مفتاح غير موجود في ملفَي اللغتين (فيظهر البديل الإنجليزي بصمت على /ar)، ونصاً إنجليزياً عارياً داخل JSX.
النصوص المخزّنة في قاعدة البيانات (أسماء دليل الحسابات، فئات المصروفات، أسباب الغرامات، أسماء هياكل الرسوم) لا تحمل حقل lang بعد؛ لذا تمر كل القوائم والتقارير عبر مساعدات الترجمة المجمّعة (getLabels للتسميات وgetNames للأشخاص — قرار واحد لكل قائمة، مع نقل حرفي احتياطي إذا تعطّلت الخدمة) فيراها المشاهد بلغته متى دفئت ذاكرة الترجمة. عمود lang هو الحل طويل الأمد.
الاتجاه: تستخدم الكتلة الأدوات المنطقية فقط (ms-/me-/text-start)، وأسهم التنقل تحمل rtl:rotate-180، ولا يظهر dir="ltr" إلا على حقول الآيبان والروابط والمفاتيح. جرى التحقق من عرض 39 مساراً بـ dir="rtl" على /ar.
الثغرات المعروفة وخارطة الطريق
- جعل
postFeePaymentمعاملةً قابلة للتراجع؛ قاعدة ترحيل للاسترداد قبل توصيلrefundWallet. - تغذية شرائط المؤشرات في لوحة التحكم من سلسلة الأشهر التي تستخدمها رسوم الصفحة الرئيسية الآن (
finance/lib/monthly-series.ts). - إضافة
langإلى النماذج المالية الموجّهة للمستخدم. - إضافة
createRefund/verifyWebhookإلى واجهة الدفع؛ إتمام بنكك. - تغطية الاختبارات: 11 من 14 وحدة فرعية بلا اختبارات.
السجل المتحقَّق منه بأرقام الأسطر في finance/ISSUE.md.