🎓 موديول Training Cycle — دورة التدريب

Quality Control System — SQAI

الفكرة العامة

موديول بيغطي دورة التدريب كاملة من التخطيط السنوي لحد تسجيل التدريب في ملف الموظف:

1) الخطة السنوية
⟸
اعتماد
⟸
تنبيه قبل التدريب بشهر
⟸
2) الأجندة
⟸
اعتماد
⟸
3) الحضور
⟸
4) الامتحان
⟸
5) كارت التدريب
الموديول مش بيبدأ من صفر: الأنشطة (training_activities) وكارت تدريب الموظف (employee_trainings) وموديول الامتحانات وبنية الإشعارات والـ cron كلها موجودة. اللي ناقص هو الخطة والأجندة والحضور والربط بينهم (التفاصيل في قسم "الموجود حاليًا").

1) إضافة خطة تدريب سنوية (Add Annual Training Plan)

الحقلالشرح
Topicالموضوع: Activity / Sub activity — اختيار واحد من شجرة training_activities (النشاط ثم النشاط الفرعي)
Monthالشهر المخطط للتدريب (مع السنة)
Expected No. of daysعدد الأيام المتوقع للتدريب
BranchMulti select — الفروع (Branch sites) اللي هتتدرب
Involved teamMulti select — الفرق المعنية (Department / Unit)
يحتاج اعتماد: أول ما الخطة تتسجل بتتبعت للمعتمد، ويوصله إشعار (Approval Notification). بعد الاعتماد بتبقى الخطة مقفولة زي باقي الموديولات (Approve-then-lock).

تنبيه تجهيز الأجندة

قبل التدريب بشهر يوصل إشعار لمسؤول التدريب: "جهّز أجندة تدريب كذا". لازم الخطة تكون معتمدة، ولسه مفيش أجندة اتعملت ليها. بيتفحص يوميًا بـ cron زي باقي التنبيهات الزمنية في النظام.

الخطة فيها شهر بس مش تاريخ يوم، فـ "قبل شهر" بيتحسب من أول يوم في الشهر المخطط (مثلًا تدريب في مارس ← التنبيه بتاع أول فبراير). ده افتراض محتاج تأكيد.

2) إضافة أجندة تدريب (Add Training Agenda)

الحقلالشرح
TopicActivity / Sub activity — يتعبى تلقائي لو الأجندة اتعملت من خطة، ويتعدّل لو لزم
Branchالفرع (Branch site) اللي هيتعقد فيه التدريب
Involved teamMulti select — Department / Unit
Fromتاريخ ووقت البداية (Date & Time)
Toتاريخ ووقت النهاية (Date & Time)
List of involved staffقائمة الموظفين بتتجاب تلقائيًا حسب الفرع والقسم/الوحدة المختارين، ويقدر المستخدم يشيل أو يضيف
يحتاج اعتماد: برضه بإشعار للمعتمد، والأجندة المعتمدة هي اللي بيتفتح لها الحضور.

3) الحضور والامتحان (Attendance & Post Exam)

تحضير الموظفين (Attendance check)
⟸
الحاضرين بس
⟸
Post exam يتبعت لكل الحاضرين
⟸
التدريب يتسجل في الكارت

4) التسجيل التلقائي في كارت الموظف (Training Card)

الكارت هو جدول employee_trainings الموجود فعلًا (بيتملا يدويًا من شاشة الموظف). الجديد إنه يتملا أوتوماتيك من الأجندة:

حقل الكارتبيتعبى من
employee_idالموظف الحاضر
training_activity_id / sub_training_activity_idموضوع الأجندة (Activity / Sub activity)
from_date / to_dateتاريخ From / To في الأجندة (الكارت بيخزن تاريخ بدون وقت)
training_provider_idفاضي (الأجندة مفيهاش مزوّد تدريب إلا لو العميل طلب)
training_agenda_id جديدالأجندة اللي اتولد منها السجل
exam_attempt_id جديدمحاولة الامتحان اللي اتبعتت للموظف، ومنها بتتقرا الدرجة ونجح/رسب
evaluation / evaluated_byفاضيين: التقييم بيتسجل يدويًا (محتاج تحديد المقصود بـ "Evaluation for each staff")
  • نتيجة الامتحان بتتقرا من محاولة الامتحان نفسها مش بتتنسخ في الكارت (نفس مبدأ "احسب ولا تخزّن" في باقي الموديولات)، فلو الدرجة اتعدّلت الكارت يعرض الجديد.
  • السجل بيتولد مرة واحدة لكل موظف في كل أجندة (مفتاح فريد)، فتكرار تسجيل الحضور مبيعملش تكرار.
  • لو الحضور اتلغى والموظف لسه ماخدش الامتحان: السجل والمحاولة بيتشالوا. ولو خد الامتحان: التغيير بيتمنع.

سجل الخطط وسجل الأجندات (Logs)

سجل الخطط: TopicMonthDaysBranchesTeamsStatus

سجل الأجندات: TopicBranchFromToAttendeesExamStatus

الحالة (Status)للخطةللأجندة
Draftمسودةمسودة
Pending approvalمُرسلة للاعتمادمُرسلة للاعتماد
Approvedمعتمدة (تفتح الأجندة وتشغّل تنبيه الشهر)معتمدة (يفتح الحضور)
Rejectedمرفوضة (ترجع مسودة)مرفوضة (ترجع مسودة)
Completed—تم تسجيل الحضور (والتدريب اتسجل في الكروت)

الإشعارات (Notifications)

الحدثالمستلمالتوقيت
خطة جديدة محتاجة اعتمادالمعتمدون (صلاحية approve_training_plans)فورًا عند الإرسال
نتيجة اعتماد/رفض الخطةاللي سجّل الخطةفورًا
جهّز الأجندة (قبل التدريب بشهر)مسؤول التدريب في الفرعيوميًا (cron)
أجندة جديدة محتاجة اعتمادالمعتمدون (صلاحية approve_training_agendas)فورًا عند الإرسال
نتيجة اعتماد/رفض الأجندةاللي سجّل الأجندةفورًا
الامتحان متاحالموظفون الحاضرونبعد تسجيل الحضور (الإشعار الموجود InformEmployeeExamNotification)
كل إشعار جديد يتبع بنية النظام: كلاس في app/Notifications + صف في notifications_types + صلاحية للمستلمين + ربط المستلم بالفرع. ومفاتيح اللغة الجديدة لازم تتسجل في جدول الترجمات (ltm_translations) كمان عشان ما تضيعش عند Publish.

جداول قاعدة البيانات (6 جداول جديدة + تعديل جدول)

الجدولوظيفته
training_plansبند في الخطة السنوية: النشاط والنشاط الفرعي، السنة والشهر، عدد الأيام، الحالة، المعتمد وتاريخ الاعتماد
training_plan_branchesفروع البند (Branch sites) — كثير لكثير
training_plan_teamsالفرق المعنية: department_id + unit_id اختياري
training_agendasالأجندة: الخطة (اختياري)، النشاط والنشاط الفرعي، الفرع، من/إلى (datetime)، الامتحان، الحالة، المعتمد
training_agenda_teamsالفرق المعنية بالأجندة (Department / Unit)
training_agenda_attendeesالموظفون المدعوون + الحضور (حاضر/غايب/لم يُسجَّل) + مين سجّل ووقته + ربط بسجل الكارت ومحاولة الامتحان. مفتاح فريد (أجندة، موظف)
employee_trainings تعديلإضافة training_agenda_id وexam_attempt_id (اختياريين)
training_activities ──< training_plans ──< training_plan_branches >── branch_sites
                              │       └──< training_plan_teams >── departments / units
                              │
                              └──< training_agendas ──< training_agenda_teams >── departments / units
                                        │   └── exams
                                        │
                                        └──< training_agenda_attendees >── employees
                                                   │            │
                                                   │            └── exam_attempts
                                                   └── employee_trainings  (كارت التدريب)
    

علاقات الحذف (Foreign Keys)

العلاقةعند الحذفالسبب
فروع/فرق الخطة والأجندة ← الخطة/الأجندةCASCADEتابعة للأب (pivots)
الحضور ← الأجندةCASCADEالحضور جزء من الأجندة
الحضور ← الموظفCASCADEبيانات الموظف نفسه
الأجندة ← الخطة، الامتحانSET NULLالأجندة تفضل لو الخطة أو الامتحان اتحذف
الكارت ← الأجندة، محاولة الامتحانSET NULLسجل التدريب في ملف الموظف ميضيعش
الخطة/الأجندة ← النشاطRESTRICTممنوع حذف نشاط عليه خطط (مع رسالة واضحة)
المنشئ والمعتمد ← adminsSET NULLالسجل أهم من الشخص

الصلاحيات (Permissions)

الصلاحيةالاستخدام
show / create / update / delete _training_plansالخطة السنوية
approve_training_plansاعتماد الخطة (وتستقبل الإشعار)
show / create / update / delete _training_agendasالأجندات
approve_training_agendasاعتماد الأجندة (وتستقبل الإشعار)
record_training_attendanceتسجيل الحضور وإرسال الامتحان

الموجود حاليًا في النظام (نتيجة الفحص)

المطلوبالحالةالموجود
أنشطة التدريب (Activity / Sub activity)✅ موجودtraining_activities فيه parent_id، ومستخدم في الكارت
كارت تدريب الموظف🟡 جزئيemployee_trainings بيتملا يدويًا فقط، ومفيهوش ربط بأجندة ولا بامتحان
الخطة السنوية❌ ناقصمفيش جدول ولا شاشة
الأجندة وقائمة الموظفين❌ ناقصالموظفون ممكن يتجابوا من الفرع والقسم والوحدة (موجودين في employees)
اعتماد + إشعار❌ ناقصنمط الاعتماد (Drill والمستندات) وبنية الإشعارات جاهزين للاستخدام
تنبيه قبل شهر❌ ناقصمفيش cron للتدريب (نمط الـ cron موجود في Kernel.php)
الحضور❌ ناقص—
إرسال الامتحان للحاضرين🟡 جزئيExamController@exams_assigns بينشئ محاولات waiting ويبعت إشعار لموظفين مختارين، بس مش مربوط بحدث تدريب

ملاحظات على الموجود (تحتاج إصلاح)

أسئلة مفتوحة للعميل

#السؤالليه مهم
1الخطة السنوية: كل "إضافة خطة" بند واحد (موضوع واحد)، ولا خطة بعنوان وسنة وتحتها بنود؟بيحدد عدد الجداول وطريقة الاعتماد (للبند ولا للخطة كلها)
2الأجندة بتتولد من بند في الخطة، ولا ممكن تتعمل مستقلة؟ وبند واحد ممكن يطلع منه أكتر من أجندة (فرع لكل أجندة)؟علاقة الخطة بالأجندة، وعدد الفروع في الأجندة (الملف بيقول Branch واحد)
3"أجندة تفصيلية": هي الحدث نفسه، ولا فيها جلسات ومواعيد ومدربين؟الحقول المذكورة هي بيانات الحدث بس، فلو فيه جلسات يتضاف جدول
4مين يعتمد الخطة؟ ومين يعتمد الأجندة؟ مرحلة واحدة ولا أكتر؟ وبعد الاعتماد بتتقفل؟الصلاحيات والإشعارات وقفل التعديل
5"قبل التدريب بشهر": بيتحسب من أول الشهر المخطط؟ ومين بيستلم التنبيه؟الخطة فيها شهر مش يوم
6الحضور: مرة واحدة للحدث كله، ولا لكل يوم لو التدريب أكتر من يوم؟ ومين بيسجّله؟جدول الحضور ممكن يبقى لكل (موظف × يوم)
7أي امتحان لكل تدريب؟ بيتحدد في الأجندة؟ ولو الموظف رسب؟ربط الأجندة بالامتحان وأثر النتيجة على الكارت
8"Evaluation for each staff": تقييم من المدرب/المدير بنص أو درجة، ولا مجرد نتيجة الامتحان؟حقل evaluation الحالي في الكارت نص حر
9هل الأجندة محتاجة مزوّد تدريب (Training Provider) أو مدرب؟الكارت فيه training_provider_id

نقاط تصميم مهمة

  • مفيش تكرار بيانات: بيانات التدريب بتتخزن مرة واحدة في الأجندة، والكارت بيشاور عليها بـ ID بس. نتيجة الامتحان بتتقرا من محاولة الامتحان.
  • إعادة استخدام الموجود: أنشطة التدريب، كارت الموظف، تعيين الامتحانات والإشعار بتاعها، والـ cron والإشعارات الحالية. لا يوجد موديول امتحانات جديد.
  • قائمة الموظفين بتتولد وقت إنشاء الأجندة (snapshot): لو موظف اتنقل قسم بعدين، الأجندة القديمة تفضل زي ما كانت.
  • المراحل المقترحة للتنفيذ: (1) الخطة + الاعتماد، (2) الأجندة + الموظفين + الاعتماد + تنبيه الشهر، (3) الحضور + إرسال الامتحان + التسجيل في الكارت.