دليل الاستخدام والاختبار
نظام Taalam لإدارة مراكز الدروس (سناتر) — 5 لوحات front-end مستقلة (4 أدوار + بوابة ولي الأمر)، أكتر من 30 صفحة، ميزات متكاملة لكل دور.
ولي الأمر
الكريدنشيالز التجريبية بتشتغل بعد ما السوبر-أدمن يضغط "Reset Demo" من /admin/dashboard.
1 الإعداد الأولي
خطوات لازم تتعمل مرة واحدة بعد تفعيل البلجن. كل خطوة بتفتح اللي بعدها.
-
فعّل البلجن من
Plugins → Taalam → Activate- أول page load بيشغّل migrations 2.0.0 → 2.0.17 ويبني 25+ جدول + 80+ index.
- الـ cron tasks بتتسجّل تلقائياً (daily 04:00، weekly Sunday 03:00، broadcast كل 5 دقايق، monthly day-1 03:00).
-
سجّل دخول كـ WP administrator على
/login- هيتم redirect تلقائي على
/admin/dashboard(لوحة السوبر-أدمن).
- هيتم redirect تلقائي على
-
(اختياري) شغّل الـ demo seeder من
/admin/dashboard→ "Reset Demo"- بيولّد 3 سناتر + 3 مديرين + 6 موظفين + 6 مدرسين + ~30 طالب + 90 يوم past attendance + dues + payments.
- الكريدنشيالز تظهر في flash message:
demo_manager_1 / Demo@123وهكذا. - يضمن جلسة واحدة على الأقل اليوم لكل سنتر (للاختبار الفوري).
- أضف سنتر من السناتر (مثلاً "سنتر النور").
-
أضف مدير من
المديرين
- الاسم + الإيميل + كلمة مرور 8+ حرف.
- اربطه بسنتر أو أكتر (multi-tenant).
-
اضبط Wapilot وقوالب الواتساب من
الإعدادات العامة
- API key + sender phone للـ Wapilot.
- قوالب الـ 7 رسائل (حضور، غياب، دفعة، تذكير، متأخرات، ترحيب، غياب متكرر) — لو سبتها فاضية، النظام بيستخدم قوالب عربية افتراضية.
-
سجّل خروج ودخل بحساب المدير على
/login→ redirect على/center/dashboard. - المدير يكمّل إعداد السنتر بالترتيب ده:
- توليد الحصص من الجدول → اضغط "توليد الحصص" (للأسبوعين الجايين). الـ daily cron بعد كده بيكمّل تلقائياً.
- فعّل التذكيرات التلقائية من إعدادات السنتر → toggles: تذكير الدفع، المتأخرات، الترحيب، الغياب المتكرر.
2 سوبر أدمن لوحة السوبر أدمن
فتح اللوحةلوحة front-end كاملة بنفس التصميم. wp-admin مش محتاج (بيظهر notice فيه redirect).
الصفحات (10)
| الصفحة | الرابط | الوظيفة |
|---|---|---|
| 🏠 الرئيسية | /admin/dashboard | إحصائيات شاملة + زرار Reset Demo |
| 🏫 السناتر | /admin/centers | إضافة/تعديل/تفعيل/تعطيل (مفيش حذف بقرار التصميم) |
| 👔 المديرين | /admin/managers | إنشاء WP users بدور sca_center_manager + ربطهم بسنتر/سناتر |
| 📊 التقارير | /admin/reports | تحليلات شاملة عبر كل السناتر (إيراد، مصروفات، طلاب، حضور، أرباح) |
| ⚙️ الإعدادات العامة | /admin/settings | Wapilot + 7 قوالب رسائل + النسخ الاحتياطية اليدوية + اختبار إرسال |
| 💬 سجل الواتساب | /admin/whatsapp | كل الرسائل عبر السناتر + filters + resend للفاشلة |
| 📜 سجل النشاط | /admin/activity | كل الأحداث (تسجيل دخول، إنشاء، تعديل، حذف...) |
| 🔒 سجل الأمان | /admin/security | محاولات تسجيل الدخول (نجاح/فشل/حظر) + IP + user agent |
| 💚 فحص النظام | /admin/health | سناتر معطّلة، حصص ملغاة، dues معلقة، إلخ |
| 📈 تحليلات السنتر | /admin/centers/analytics | تفاصيل سنتر معيّن (KPIs، groups، sessions، earnings) |
سيناريوهات الاختبار
- سجّل دخول بحساب WP administrator على
/login→ redirect على/admin/dashboard✓ /admin/centers→ "إضافة سنتر" → "اختبار-1" → ظهر بحالة "نشط"- اضغط "تعطيل" → بيظهر "معطل" + الزر بقى "تفعيل"
- تأكد من عدم وجود زرار "حذف" ⚠️ (قرار التصميم)
/admin/managers→ ضيف مدير + اختار 2 سناتر → الـ user اتعمل وقدر يدير الاتنين/admin/security→ كل محاولة login (سواء عبر/loginأوwp-login.php) بتـ-سجّل ✓/admin/activity→ كل create/update/delete مع user + IP + timestamp ✓/admin/settings→ "نسخة احتياطية الآن" → بيتولّد ملف.zipأو.sql.gzفيuploads/sca-backups//admin/whatsapp→ فلترة على status=failed → اضغط "إعادة محاولة" على رسالة فاشلة
3 مدير سنتر لوحة مدير السنتر
فتح اللوحةبعد login المدير بيتـ redirect هنا تلقائياً. عنده 21 صفحة + center switcher لو مدير لأكتر من سنتر + جرس إشعارات + بحث شامل.
الصفحات (21)
| الصفحة | الرابط | الوظيفة |
|---|---|---|
| 🏠 الرئيسية | /center/dashboard | إحصائيات + روابط سريعة |
| 👥 الطلاب | /center/students | إضافة/أرشفة + اشتراكات + QR + parent token + زرار "نسخ" للرابط |
| 📋 الحضور | /center/attendance | حصص اليوم → roster كامل (4 حالات) + تسجيل سريع بالكود/QR |
| 💵 المدفوعات | /center/payments | تحصيل + إيصالات + cash drawer + استرداد |
| 📃 المستحقات | /center/dues | توليد شهري + قائمة المعلق + per-session + تقرير الأعمار (0-30/31-60/61-90/90+) |
| ⚖️ أرباح المدرسين | /center/earnings | حساب شهري + payouts + drill-down per teacher |
| 🧾 المصروفات | /center/expenses | إيجار، فواتير، رواتب، إلخ |
| 📊 التقارير | /center/reports | P&L (إيراد − تكاليف = ربح) + تصدير CSV |
| ⚙️ الإعدادات | /center/settings | اسم السنتر + 7 toggles للإشعارات |
| 📚 المجموعات | /center/groups | subject + teacher + room + schedule + pricing + إدارة الطلاب المسجلين |
| 📅 الجدول | /center/schedule | list + أسبوعي/شهري (calendar view) + توليد + إلغاء/استعادة |
| 👨🏫 المدرسين | /center/teachers | دعوة + عقود (5 أنواع تعويض) + التوفر الأسبوعي |
| 🪪 الموظفين | /center/staff | دعوة + صلاحيات granular (8 خانات) |
| 📖 المواد + 🚪 القاعات | /center/subjects · /center/rooms | إضافة + لون / سعة |
| 🎂 الإجازات | /center/holidays | أيام رسمية → الـ generator يـ-skip تلقائياً |
| 📢 الإعلانات | /center/broadcast | إرسال جماعي للأهالي (سنتر/مجموعة) + queue + progress tracking |
| 💬 سجل الواتساب | /center/whatsapp | رسائل السنتر + filters + resend |
| 📝 الامتحانات | /center/exams | إنشاء + حضور الطلاب + درجات |
| 📚 الواجبات | /center/homework | تكليفات + تسليم + درجات |
| 📂 المواد التعليمية | /center/materials | ملفات/روابط + ربط بمجموعة |
| 🔔 الإشعارات | /notifications | inbox داخلي + bell badge في الـ topbar |
أ. إعداد البيانات الأولية
- أضف 3 مواد: فيزيا (لون أحمر) + رياضة (لون أزرق) + كيميا (لون أخضر)
- أضف 2 قاعات: قاعة 1 (سعة 30) + قاعة 2 (سعة 20)
- أضف مدرس "أ.محمد" بـ password 8+ حرف، عقد 50% commission
- (اختياري) من صفحة المدرس → "التوفر" → الجمعة "غير متاح" → الـ generator هيـ-skip الجمعة لـ أ.محمد
- أضف موظف "حسن" بصلاحيات:
record_attendance+collect_payments+view_dues - أضف مجموعة "3 ث - فيزيا - السبت 10ص" (المادة فيزيا، أ.محمد، قاعة 1، السبت 10:00-12:00، 200/شهر)
- أضف 3 طلاب → افتح صفحة المجموعة (تعديل) → استخدم قسم "إضافة طالب" فيها (الجديد) لإضافة الـ 3 (بدل ما تروح صفحة كل طالب)
- روح الجدول → "توليد الحصص" → السبت الجاي session بيظهر
- أضف إجازة "عيد الفطر" بتاريخ معيّن → الـ generator هيـ-skip اليوم ده
ب. اختبار الـ flow المالي الكامل
- روح المستحقات → اختر شهر الحالي → "توليد الشهر" → 3 dues بـ 200 ج.م
- افتح تقرير الأعمار → الـ buckets ظاهرة (0-30 يوم لو الشهر ده)
- روح المدفوعات → "تحصيل دفعة" → اختار طالب 1 → اختار الـ due المعلق → سدد 200 → الـ due يتحول مدفوع
- طبع الإيصال (Receipt#:
YYYY-MM-NNNauto-generated) → حقول كاملة + رقم القيد - روح أرباح المدرسين → اختر الشهر → "احسب الشهر" → أ.محمد له 100 ج.م (50% × 200)
- اضغط اسم المدرس → drill-down: كل الجلسات + كل الدفعات
- اضغط "دفع" على صف أ.محمد → سدد 100 → الحالة "مدفوع"
- أضف مصروف: إيجار 1000 ج.م
- روح التقارير → P&L: 200 إيراد − (100 + 1000) = −900
- اضغط "تنزيل CSV" → ملف بـ UTF-8 BOM (Excel-friendly)
ج. اختبار Multi-center
- السوبر-أدمن أضاف سنتر تاني وربط نفس المدير
- المدير يـ logout/login → في الـ topbar بيظهر center switcher (dropdown بالسنترين)
- بدّل للسنتر التاني → كل الـ data تتغير (طلاب، مدفوعات، إلخ)
- تأكد إن طلاب السنتر A ما بيظهروش في السنتر B ✓
4 موظف لوحة الموظف
فتح اللوحةبعد login الموظف بيتـ redirect على /center/attendance. الـ navigation محدودة بـ 5 صفحات حسب صلاحياته.
الصلاحيات الـ Granular (8)
| الصلاحية | تتيح إيه |
|---|---|
record_attendance | تسجيل حضور وعرض حصص اليوم |
edit_attendance | تعديل الحضور المسجل سابقاً |
view_students | عرض قائمة الطلاب بدون إضافة |
manage_students | إضافة/تعديل/أرشفة طلاب |
collect_payments | تحصيل دفعات نقدية |
view_dues | عرض المستحقات + المدفوعات + cash drawer |
view_reports | عرض التقارير المالية |
view_schedule | عرض الجدول |
سيناريوهات الاختبار
- المدير يعمل موظف "حسن" بصلاحية record_attendance + view_students فقط
- اعمل logout بحساب المدير، ادخل بحساب حسن
- روح
/center/attendance→ الترتيب الجديد: حصص اليوم فوق (للـ roster الكامل) + التسجيل السريع تحت (للـ door scan) - اضغط "تسجيل الحضور" بجوار session → افتح roster كل الطلاب → سجّل دفعة واحدة
- أو: استخدم الـ scan/code form للحالات الفردية (طالب واحد بكوده)
- جرّب تروح
/center/payments→ 403 (مفيش collect_payments) ✓ - المدير يضيف صلاحية
collect_paymentsلحسن - حسن يـ refresh → دلوقتي يقدر يحصّل
- حسن يحصّل دفعة → بتسجل بـ
received_by_user_id = حسن - روح
/center/payments→ في الـ stats بيظهر "في صندوقي اليوم" (الإجمالي اللي حسن استلمه فقط)
5 مدرس لوحة المدرس (read-only)
فتح اللوحةالمدرس بيشوف بياناته فقط: العقود، الأرباح المحسوبة، الدفعات المستلمة. مفيش صلاحية تعديل، مفيش center switcher (كل السناتر بتظهر مع بعض).
سيناريوهات الاختبار
- تأكد إن المدير عمل عقد لـ أ.محمد + ضيفه لمجموعة فعّالة
- يكون فيه تحصيل + توليد أرباح + دفعة لـ أ.محمد
- اعمل logout، ادخل بحساب أ.محمد
- هتلاقي اللوحة فيها card لكل سنتر هو شغال فيه:
- اسم السنتر + نوع العقد ("نسبة 50% من إيراد طلابك")
- إجمالي الأرباح + المعلق
- جدول آخر 12 شهر (حصص، إيراد، صافي، حالة)
- جدول آخر الدفعات المستلمة
- جرّب تروح
/center/dashboard→ redirect لـ/teacher/dashboard✓ - جرّب تروح
/center/students→ redirect ✓
Multi-center للمدرس
لو أ.محمد بيدرّس في 2 سناتر (عنده عقدين):
- هيشوف 2 cards منفصلين، كل واحد فيه أرباحه من السنتر ده
- الإجماليات لكل سنتر مستقلة (مفيش data leakage بين السناتر)
- الـ center switcher dropdown مخفي للمدرس (مش محتاجه — كل السناتر ظاهرة في الصفحة)
6 ولي الأمر بوابة ولي الأمر (token-gated)
صفحة عامة بدون login — الرابط فيه token مميز لكل طالب. ولي الأمر بيشوف بيانات ابنه فقط، read-only.
المحتوى
- 4 KPI cards: حضور / تأخير / غياب (آخر 60 يوم) / إجمالي المتأخرات
- سجل الحضور آخر 60 يوم (التاريخ، المجموعة، المادة، الحالة)
- سجل المدفوعات آخر 12 شهر (المبلغ، النوع، الفترة)
- المتأخرات غير المسددة (لو فيه)
- Layout مخصص responsive — مفيش sidebar أو session UI
سيناريوهات الاختبار
- المدير يفتح
/center/students→ بروفايل طالب → عند "رابط ولي الأمر" يضغط زرار "نسخ" (الجديد) - افتح الـ URL في tab خاص (no session) → بيرسم صفحة الطالب كاملة ✓
- جرّب token غلط:
/parent/INVALID→ 404 themed (مفيش data leakage) ✓ - المدير يضغط "تجديد" على الـ token → الرابط القديم بيبطل، الجديد يشتغل ✓
7 التواصل والإشعارات
قنوات التواصل مع الأهالي (واتساب) والإشعارات الداخلية للمستخدمين.
أ. التذكيرات التلقائية (cron) — Phase 19
الـ daily cron بيـ-fire كل يوم 04:00 ويبعت 4 أنواع تذكيرات بشروط محددة:
| النوع | الشرط | الـ event |
|---|---|---|
| تذكير الدفع | 3 أيام قبل آخر الشهر، 1 يوم قبل، أو 1 يوم بعد — لكل طالب عنده monthly_due غير مدفوع | payment_reminder |
| المتأخرات | الـ due عمره 7 / 14 / 30 / 45 / 60 / 90 يوم | overdue |
| الترحيب | عند إنشاء طالب جديد (مرة واحدة فقط ever) | welcome |
| الغياب المتكرر | 3 غيابات متتالية في نفس المجموعة | absence_streak |
already_sent_today بيتشيك على sca_whatsapp_logs، فمفيش تكرار حتى لو الـ cron اشتغل أكتر من مرة في نفس اليوم. الـ welcome بيستخدم ever_sent (مرة واحدة فقط).
الـ flow:
- السوبر-أدمن في
/admin/settingsيضبط Wapilot + (اختياري) قوالب مخصصة. لو سابهم فاضيين → يستخدم الـ قوالب العربية الافتراضية المضمنة. - المدير في
/center/settingsيفعّل toggles: تذكير الدفع، المتأخرات، الترحيب، الغياب المتكرر - كل توكن متاح في القوالب:
{student_name}{center_name}{amount}{period}{days}{streak}{group_name}{date}{time} - اختبر بـ trigger يدوي: WP-Cron page → run
sca_daily_tick - راجع
/center/whatsapp→ بتلاقي الرسائل المرسلة بـ status=sent (أو skipped لو الـ phone فاضي)
ب. الإعلانات الجماعية (Broadcast) — Phase 20
- المدير من
/center/broadcastيضغط "إعلان جديد" - scope: السنتر كله (كل الأهالي) أو مجموعة محددة
- الـ message بيتقسّم لـ queue في
sca_broadcast_queue - الـ
sca_broadcast_tickcron (كل 5 دقايق) بيرسل 50 رسالة في الـ batch — pacing آمن لـ Wapilot - صفحة الـ broadcast بتعرض progress: sent / total، meta-refresh كل 10 ثواني وقت ما الـ status=running
- 2000 طالب يخلصوا في ~3.5 ساعة
ج. سجل الواتساب (WhatsApp Logs) — Phase 21
- السوبر-أدمن:
/admin/whatsapp— كل الرسائل عبر السناتر - المدير:
/center/whatsapp— رسائل سنتره فقط - Filters: status (sent/failed/skipped) + event_type + date range + اسم الطالب
- زرار "إعادة محاولة" لرسالة فاشلة → بيـ-create insert جديد (مش mutate القديم — preserves history)
- Stats cards: 24-hour window (sent / failed / skipped)
د. الإشعارات الداخلية (Notifications Inbox) — Phase 22
- Bell icon في الـ topbar (لكل الأدوار) مع red dot + count لو فيه unread
- Dropdown بآخر 10 إشعارات + click على واحد بيـ-mark as read + يفتح اللينك
- صفحة كاملة على
/notificationsمع pagination + "علّم الكل" - JS بيـ-poll كل 30 ثانية لتحديث الـ badge
- Trigger points: session.cancel، payment.create لو > 1000، broadcast.done، backup.create، student.create
8 الكالندر والبحث
أ. عرض الكالندر للجدول — Phase 23
/center/scheduleفيه 3 views: قائمة (default) / أسبوع / شهر- الأسبوعي: شبكة 7 أعمدة × ساعات 8:00-22:00، الحصص ملوّنة بـ subject_color
- الشهري: 7×5 grid مع dots للأيام المزدحمة
- الاختيار محفوظ في cookie
sca_schedule_view - click على حصة يفتح صفحة الـ session
ب. البحث الشامل (Global Search) — Phase 24
- شريط بحث في الـ topbar — debounce 300ms
- AJAX endpoint:
sca_global_searchبيرجّع JSON بـ 4 categories: students / teachers / groups / payments - كل category top 5 results — scoped على الـ active center
- السوبر-أدمن: بحث عبر كل السناتر
- الـ keyboard navigation (Arrow + Enter)
- Receipt number search مدعوم (مثلاً
2026-04-001)
9 الامتحانات والواجبات والمواد
أ. الامتحانات (/center/exams)
- إنشاء امتحان: عنوان، مادة، مجموعة، تاريخ، درجة كاملة
- تسجيل درجة لكل طالب (مع notes)
- إحصائيات: متوسط، أعلى، أقل
ب. الواجبات (/center/homework)
- تكليف للمجموعة كاملة مع موعد تسليم
- تتبع التسليمات per طالب (submitted / late / not submitted)
- درجات اختيارية
ج. المواد التعليمية (/center/materials)
- ملفات / روابط YouTube / PDFs
- ربط بمجموعة أو متاحة لكل المجموعات
- الطالب يقدر يشوفها من بوابة ولي الأمر (لاحقاً)
د. تقارير الطلاب (/center/students/{id}/progress)
- تقرير شهري printable: نسبة الحضور + درجات الامتحانات + الواجبات + المتأخرات
- قابل للطباعة بـ note شخصية من المدرس
10 الإدارة المتقدمة
أ. الإجازات وتوفر المدرسين — Phase 25
/center/holidays: إضافة إجازة (تاريخ + اسم + recurring اختياري)is_recurring=1= نفس اليوم كل سنة (الأعياد الرسمية)- الـ session_generator بيشيك قبل ما يخلق جلسة → لو يوم إجازة → skip
- صفحة المدرس → "التوفر" → 7 checkboxes (الأحد-السبت) + reason field — الـ generator بيـ-skip أيام عدم التوفر
ب. النسخ الاحتياطية
- الـ weekly cron (Sunday 03:00) بيعمل backup تلقائي للـ
sca_*tables فقط - 3 fallback paths:
mysqldumpshell → PHP fallback → uncompressed SQL - نتيجة:
.zip(لو ZipArchive متاح) أو.sql.gzأو.sql - تخزين في
wp-content/uploads/sca-backups/+.htaccessdeny + index.html - Cleanup تلقائي: backups أقدم من 30 يوم بتنحذف
- السوبر-أدمن من
/admin/settingsيقدر يعمل backup يدوي + يحمّل أي ملف - الـ download endpoint محمي بـ role check + path traversal protection
ج. Activity Log (/admin/activity)
- كل create / update / delete / archive / restore بيتـ-log
- الحقول: action + entity_type + entity_id + user + IP + occurred_at + before/after JSON
- Filters: action / entity / center / تاريخ
- الـ super-admin بيشوف الكل، المدير بيشوف سنتره فقط (
/center/activity)
د. Security Log (/admin/security)
- كل محاولة تسجيل دخول بتتـ-log (نجاح / فشل / محظور)
- الحقول: user_id / identifier / IP / user_agent / status / attempted_at
- Rate limiting: 5+ محاولات فاشلة من نفس IP في 15 دقيقة → block 30 دقيقة
- بيلتقط محاولات الـ
wp-login.phpكمان (مش بس/loginالمخصص)
هـ. Health Check (/admin/health)
- سناتر معطّلة، مديرين بدون سنتر، مدرسين بدون عقد
- حصص ملغاة في آخر 30 يوم
- dues معلقة + aging
- backup الأخير + size + age
و. Forgot Password
- الـ flow القياسي:
/wp-login.php?action=lostpassword - الـ link في صفحة
/loginبيوجّه ليه - الإيميل من WordPress core — يشتغل من غير setup إضافي لو SMTP مظبوط
11 اختبار النظام (E2E)
السيناريوهات دي بتختبر سلوك السلامة (security + multi-tenancy + edge cases). اتعمل عليهم E2E شامل لكل الـ 5 لوحات.
أ. Multi-tenancy isolation Track A
- سنتر A ومدير A، سنتر B ومدير B (منفصلين)
- مدير A يضيف طالب → معرف الطالب = X
- مدير B يفتح URL:
/center/students/edit?id=X→ redirect مع flash "الطالب غير موجود في سنترك" ✓ - مدير B يحاول POST لـ
/center/students/saveبـ id=X → يرفض ✓
ب. Permission gates للموظفين Track D
- موظف بصلاحية
view_studentsفقط /center/students→ ✓ يشوف القائمة- POST
/center/students/save→ 403 /center/payments→ 403 (مفيش view_dues)/center/dues→ 403
ج. Payment over-application validation Track B
- طالب عليه dues إجمالي 500 ج.م
- افتح
/center/payments/new?student_id=X - اختار dues مجموعها 500، أدخل المبلغ 200
- اضغط تأكيد → يرفض برسالة "قيمة المستحقات (500) أكبر من مبلغ الدفعة (200)" ✓
- اختار due واحد بقيمة 200 → ✓ ينجح
د. Session cancel block (بعد الحضور) Decision 2
- session مولّد + حضّر طالب فيه
- روح الجدول → اضغط "إلغاء" → يرفض "لا يمكن إلغاء حصة تم تسجيل حضور فيها" ✓
- session تاني بدون حضور → اضغط "إلغاء" → ✓ ينجح
هـ. Teacher contract block (لو فيه مجموعات شغالة) Decision 3
- مدرس له عقد + مجموعة فعّالة
- روح
/center/teachers→ اضغط "إيقاف" → يرفض "فيه N مجموعة شغالة، حوّلها لمدرس آخر أو عطّلها أولاً" ✓ - عطّل المجموعة → اضغط "إيقاف العقد" تاني → ✓ ينجح
و. Soft-delete student cascade Track E
- طالب مسجل في 3 مجموعات
- أرشف الطالب → الـ 3 enrollments بتتعطّل (end_date = اليوم)
- روح المستحقات → "توليد الشهر القادم" → الطالب ما يطلعش ✓
- اضغط "استعادة" على الطالب → الـ 3 enrollments بترجع نشطة (end_date = NULL) ✓
ز. Room conflict detection Phase 3
- مجموعة A: قاعة 1، السبت 10-12
- مجموعة B: قاعة 1، السبت 11-13 (متداخلة)
- روح الجدول → "توليد الحصص" → الـ output: "تم إنشاء X حصة، 1+ تعارض في القاعات" ✓
ح. Holiday + teacher availability Phase 25
- أضف إجازة "عيد الفطر" بتاريخ معيّن (recurring=1)
- مدرس "أ.محمد" → التوفر → الجمعة "غير متاح"
- الـ daily cron يـ-generate sessions → اليوم ده + الجمعة لـ أ.محمد اتـ-skip ✓
ط. Idempotent reminders Phase 19
- طالب عنده monthly_due غير مدفوع، اليوم = آخر الشهر
- شغّل الـ daily cron يدوياً
- راجع
sca_whatsapp_logs→ 1 رسالةpayment_reminder✓ - شغّل الـ cron تاني في نفس اليوم → مفيش رسالة جديدة (already_sent_today) ✓
- غيّر تاريخ النظام → اليوم التالي → الـ cron → رسالة جديدة (لو لسه في window) ✓
ي. Default templates fallback Phase 19+
- السوبر-أدمن في
/admin/settingsسايب القوالب فاضية - المدير فعّل toggle تذكير الدفع
- الـ cron يـ-fire → الرسالة بتطلع بـ القالب العربي الافتراضي ✓
- السوبر-أدمن يكتب قالب مخصص → الرسائل الجديدة تستخدم القالب المخصص ✓
ك. Login rate limit + audit Security
- 5 محاولات failed login من نفس IP في 15 دقيقة
- المحاولة السادسة → blocked برسالة "تم حظر المحاولات مؤقتاً" ✓
- راجع
/admin/security→ كل محاولة بـ status (failed / blocked) + IP ✓ - محاولات السوبر-أدمن عبر
wp-login.phpبتتسجّل كمان ✓
ل. CSV export integrity
/center/reports→ "تنزيل CSV"- الملف بيبتدي بـ UTF-8 BOM (
EF BB BF) → الحروف العربية تظهر صح في Excel ✓ - أي قيمة بتبدأ بـ
= + - @بتتـ-prefix بـ apostrophe → CSV-injection protection ✓
Taalam 2.0.0-alpha — DB v2.0.17 — 5 لوحات مختبَرة E2E، Phases 0-25 مكتملة، production-ready
للـ deploy للإنتاج: اضبط WP_DEBUG_DISPLAY = false
في wp-config.php،
ولو هتستخدم Nginx ضيف قاعدة في الـ config تمنع الوصول المباشر لـ /wp-content/uploads/sca-backups/.