return$this->redirect('/sa/players/'.$pid.'/documents')->withSuccess('تم رفع المستند بنجاح');
return$this->redirect('/sa/players/'.$pid.'/documents')->withSuccess('تم رفع المستند بنجاح'.($documentType==='medical_cert'?' — تم إرساله للجنة الطبية للمراجعة':''));
<h3style="margin:0;font-size:16px;font-weight:600;"><idata-lucide="trophy"style="width:18px;height:18px;vertical-align:middle;margin-left:6px;"></i> اختيار النشاط والمجموعة</h3>
<h3style="margin:0;font-size:16px;font-weight:600;"><idata-lucide="trophy"style="width:18px;height:18px;vertical-align:middle;margin-left:6px;"></i> اختيار النشاط والمجموعة</h3>
<divclass="tut-step"><divclass="tut-step-num">1</div><h3class="tut-step-title">إضافة مجموعة</h3><divclass="tut-step-body">من القائمة: <spanclass="field">الأنشطة الرياضية</span> > <spanclass="field">المجموعات</span> > إضافة مجموعة.</div></div>
<divclass="tut-step"><divclass="tut-step-num">1</div><h3class="tut-step-title">إضافة مجموعة</h3><divclass="tut-step-body">من القائمة: <spanclass="field">الأنشطة الرياضية</span> > <spanclass="field">المجموعات</span> > إضافة مجموعة.</div></div>
<divclass="tut-step"><divclass="tut-step-num">2</div><h3class="tut-step-title">البيانات والربط</h3><divclass="tut-step-body"><ul><li><spanclass="field">code / name_ar / name_en</span> — كود واسم المجموعة</li><li><spanclass="field">النشاط الرياضي</span> — اختياري لتصفية البرامج والمدربين</li><li><spanclass="field">program_id</span> — البرنامج (يحدد المستوى والفئة العمرية)</li><li><spanclass="field">coach_id</span> — المدرب (يتم تصفيته حسب النشاط المختار)</li><li><spanclass="field">الحد الأدنى / الحد الأقصى</span> — سعة المجموعة</li><li><spanclass="field">رسوم شهرية (أعضاء) / رسوم شهرية (غير أعضاء)</span> — الرسوم</li><li><spanclass="field">بداية الموسم / نهاية الموسم</span> — مدة الموسم</li></ul><spanclass="info">اختيار النشاط الرياضي اختياري — لكنه يصفي قائمة البرامج والمدربين المتاحة تلقائياً.</span></div></div>
<divclass="tut-step"><divclass="tut-step-num">2</div><h3class="tut-step-title">البيانات والربط</h3><divclass="tut-step-body"><ul><li><spanclass="field">code / name_ar / name_en</span> — كود واسم المجموعة</li><li><spanclass="field">النشاط الرياضي</span> — اختياري لتصفية البرامج والمدربين</li><li><spanclass="field">program_id</span> — البرنامج (يحدد المستوى والفئة العمرية والسعر والسعة)</li><li><spanclass="field">coach_id</span> — المدرب (يتم تصفيته حسب النشاط المختار)</li><li><spanclass="field">بداية الموسم / نهاية الموسم</span> — مدة الموسم</li></ul><spanclass="info">اختيار النشاط الرياضي اختياري — لكنه يصفي قائمة البرامج والمدربين المتاحة تلقائياً.</span><spanclass="success">السعة والرسوم موروثة تلقائياً من البرنامج المحدد — لا حاجة لتحديدها عند إنشاء المجموعة. عند تعديل سعة البرنامج، تتحدث جميع مجموعاته تلقائياً.</span></div></div>
<divclass="tut-step"><divclass="tut-step-num">3</div><h3class="tut-step-title">إعداد الجدول الأسبوعي</h3><divclass="tut-step-body">من صفحة المجموعة > الجدول > إضافة حصة:<ul><li><spanclass="field">day_of_week</span> — اليوم</li><li><spanclass="field">facility_unit_id</span> — الوحدة/الحارة/الملعب</li><li><spanclass="field">start_time / end_time</span> — الوقت</li></ul>مثال: أحد + ثلاثاء + خميس — حارة 3 — من 16:00 إلى 17:00<spanclass="warn">الجدول الأسبوعي يتحقق من التعارض — لو الوحدة محجوزة في نفس الوقت، النظام يرفض ويوضح التعارض.</span><spanclass="success">بعد إنشاء الجدول، يمكنك استخدام "توليد الحجوزات" لإنشاء حجوزات تلقائية لكل حصة.</span></div></div>
<divclass="tut-step"><divclass="tut-step-num">3</div><h3class="tut-step-title">إعداد الجدول الأسبوعي</h3><divclass="tut-step-body">من صفحة المجموعة > الجدول > إضافة حصة:<ul><li><spanclass="field">day_of_week</span> — اليوم</li><li><spanclass="field">facility_unit_id</span> — الوحدة/الحارة/الملعب</li><li><spanclass="field">start_time / end_time</span> — الوقت</li></ul>مثال: أحد + ثلاثاء + خميس — حارة 3 — من 16:00 إلى 17:00<spanclass="warn">الجدول الأسبوعي يتحقق من التعارض — لو الوحدة محجوزة في نفس الوقت، النظام يرفض ويوضح التعارض.</span><spanclass="success">بعد إنشاء الجدول، يمكنك استخدام "توليد الحجوزات" لإنشاء حجوزات تلقائية لكل حصة.</span></div></div>
<divclass="tut-nav">
<divclass="tut-nav">
<ahref="/tutorials/sports-activity/create-program"><idata-lucide="arrow-right"style="width:14px;height:14px;"></i> إنشاء برنامج تدريبي</a>
<ahref="/tutorials/sports-activity/create-program"><idata-lucide="arrow-right"style="width:14px;height:14px;"></i> إنشاء برنامج تدريبي</a>
<divclass="tut-step"><divclass="tut-step-num">4</div><h3class="tut-step-title">تفاصيل الحصص</h3><divclass="tut-step-body"><ul><li><spanclass="field">session_duration_minutes</span> — مدة الحصة (مثل 60 دقيقة)</li><li><spanclass="field">sessions_per_week</span> — عدد الحصص أسبوعياً (مثل 3)</li></ul><spanclass="info">البرنامج هو القالب — يحدد ماذا ندرّب ولمن. المجموعة هي التنفيذ الفعلي — من المدرب ومتى وأين.</span></div></div>
<divclass="tut-step"><divclass="tut-step-num">4</div><h3class="tut-step-title">تفاصيل الحصص</h3><divclass="tut-step-body"><ul><li><spanclass="field">session_duration_minutes</span> — مدة الحصة (مثل 60 دقيقة)</li><li><spanclass="field">sessions_per_week</span> — عدد الحصص أسبوعياً (مثل 3)</li></ul></div></div>
<divclass="tut-step"><divclass="tut-step-num">5</div><h3class="tut-step-title">العلاقة بين البرنامج والمجموعة</h3><divclass="tut-step-body"><divclass="tut-diagram">البرنامج (Template) المجموعة (Instance)
<divclass="tut-step"><divclass="tut-step-num">5</div><h3class="tut-step-title">التسعير والسعة</h3><divclass="tut-step-body"><ul><li><spanclass="field">monthly_fee_member</span> — الرسوم الشهرية للأعضاء</li><li><spanclass="field">monthly_fee_nonmember</span> — الرسوم الشهرية لغير الأعضاء</li><li><spanclass="field">min_capacity</span> — الحد الأدنى للسعة</li><li><spanclass="field">max_capacity</span> — الحد الأقصى للسعة</li></ul><spanclass="warn">البرنامج هو المنتج المباع — كل المجموعات التابعة ترث السعر والسعة تلقائياً. لا يمكن تحديد أسعار مختلفة لمجموعات نفس البرنامج.</span><spanclass="info">البرنامج هو القالب — يحدد ماذا ندرّب ولمن وبكم. المجموعة هي التنفيذ الفعلي — من المدرب ومتى وأين.</span></div></div>
<divclass="tut-step"><divclass="tut-step-num">6</div><h3class="tut-step-title">العلاقة بين البرنامج والمجموعة</h3><divclass="tut-step-body"><divclass="tut-diagram">البرنامج (Template) المجموعة (Instance)
<divclass="tut-step"><divclass="tut-step-num">1</div><h3class="tut-step-title">فتح تسجيل اللاعبين</h3><divclass="tut-step-body">من صفحة المجموعة > <spanclass="field">تسجيل لاعب</span>.</div></div>
<divclass="tut-step"><divclass="tut-step-num">1</div><h3class="tut-step-title">فتح تسجيل اللاعبين</h3><divclass="tut-step-body">من صفحة المجموعة > <spanclass="field">تسجيل لاعب</span>.</div></div>
<divclass="tut-step"><divclass="tut-step-num">2</div><h3class="tut-step-title">البحث عن اللاعب</h3><divclass="tut-step-body">ابحث بالاسم أو الرقم التسلسلي أو الرقم القومي.</div></div>
<divclass="tut-step"><divclass="tut-step-num">2</div><h3class="tut-step-title">البحث عن اللاعب</h3><divclass="tut-step-body">ابحث بالاسم أو الرقم التسلسلي أو الرقم القومي.</div></div>
<divclass="tut-step"><divclass="tut-step-num">3</div><h3class="tut-step-title">التحقق التلقائي</h3><divclass="tut-step-body">النظام يتحقق من:<ul><li>الحالة الطبية: لازم تكون <spanclass="field">fit</span> أو <spanclass="field">conditional</span></li><li>السعة: المجموعة لسه فيها مكان</li><li>العمر: ضمن الفئة العمرية للبرنامج</li><li>عدم التكرار: مش مسجل بالفعل</li></ul><spanclass="warn">إذا اللاعب حالته الطبية "pending" أو "unfit" أو "expired"، التسجيل مرفوض تلقائياً.</span></div></div>
<divclass="tut-step"><divclass="tut-step-num">3</div><h3class="tut-step-title">التحقق التلقائي</h3><divclass="tut-step-body">النظام يتحقق من:<ul><li>السعة: المجموعة لسه فيها مكان (موروثة من البرنامج)</li><li>العمر: ضمن الفئة العمرية للبرنامج</li><li>عدم التكرار: مش مسجل بالفعل</li></ul><spanclass="info">الرسوم الشهرية تُحسب من البرنامج تلقائياً حسب نوع اللاعب (عضو / غير عضو).</span><spanclass="warn">الحالة الطبية لا تمنع التسجيل — لكن اللاعب بدون شهادة طبية سارية سيظهر بعلامة تحذير ⚠ في كل مكان (قائمة اللاعبين، صفحة المجموعة، كشف الحضور).</span></div></div>
<divclass="tut-step"><divclass="tut-step-num">4</div><h3class="tut-step-title">نتيجة التسجيل</h3><divclass="tut-step-body">إذا كل الشروط تمام → يُسجل اللاعب بحالة <spanclass="field">pending_payment</span> (في انتظار الدفع). إذا المجموعة ممتلئة → يُعرض خيار "قائمة الانتظار".<spanclass="info">التسجيل لا يُفعّل مباشرة — يجب دفع أول اشتراك من خزنة الأنشطة أولاً. انظر: <ahref="/tutorials/sports-activity/enrollment-payment"style="color:#1E40AF;font-weight:600;">الدفع الإجباري عند التسجيل</a>.</span><spanclass="success">بعد التحصيل: اللاعب يظهر في كشف الحضور اليومي ويتم توليد اشتراك شهري له.</span></div></div>
<divclass="tut-step"><divclass="tut-step-num">4</div><h3class="tut-step-title">نتيجة التسجيل</h3><divclass="tut-step-body">إذا كل الشروط تمام → يُسجل اللاعب بحالة <spanclass="field">pending_payment</span> (في انتظار الدفع). إذا المجموعة ممتلئة → يُعرض خيار "قائمة الانتظار".<spanclass="info">التسجيل لا يُفعّل مباشرة — يجب دفع أول اشتراك من خزنة الأنشطة أولاً. انظر: <ahref="/tutorials/sports-activity/enrollment-payment"style="color:#1E40AF;font-weight:600;">الدفع الإجباري عند التسجيل</a>.</span><spanclass="success">بعد التحصيل: اللاعب يظهر في كشف الحضور اليومي ويتم توليد اشتراك شهري له.</span></div></div>
<divclass="tut-nav">
<divclass="tut-nav">
<ahref="/tutorials/sports-activity/create-group"><idata-lucide="arrow-right"style="width:14px;height:14px;"></i> إنشاء مجموعة تدريبية</a>
<ahref="/tutorials/sports-activity/create-group"><idata-lucide="arrow-right"style="width:14px;height:14px;"></i> إنشاء مجموعة تدريبية</a>
<divclass="tut-step"><divclass="tut-step-num">1</div><h3class="tut-step-title">فتح التوليد</h3><divclass="tut-step-body">من صفحة الاشتراكات الشهرية، اضغط زر <spanclass="field">توليد الاشتراكات</span> أعلى الصفحة. أو يمكنك الضغط على <spanclass="field">معاينة الشهر القادم</span> أولاً لرؤية ما سيتم توليده.</div></div>
<divclass="tut-step"><divclass="tut-step-num">1</div><h3class="tut-step-title">فتح التوليد</h3><divclass="tut-step-body">من صفحة الاشتراكات الشهرية، اضغط زر <spanclass="field">توليد الاشتراكات</span> أعلى الصفحة. أو يمكنك الضغط على <spanclass="field">معاينة الشهر القادم</span> أولاً لرؤية ما سيتم توليده.</div></div>
<divclass="tut-step"><divclass="tut-step-num">2</div><h3class="tut-step-title">اختيار الشهر</h3><divclass="tut-step-body">اختر الشهر والسنة (مثلاً: يونيو 2026).</div></div>
<divclass="tut-step"><divclass="tut-step-num">2</div><h3class="tut-step-title">اختيار الشهر</h3><divclass="tut-step-body">اختر الشهر والسنة (مثلاً: يونيو 2026).</div></div>
<divclass="tut-step"><divclass="tut-step-num">3</div><h3class="tut-step-title">المعالجة</h3><divclass="tut-step-body">لكل لاعب active في كل مجموعة نشطة:<ul><li>يتحقق: هل سبق توليد اشتراك لنفس الفترة؟</li><li>يحدد المبلغ حسب <spanclass="field">player_type</span></li><li>ينشئ سجل بحالة <spanclass="field">unpaid</span></li></ul><divclass="tut-diagram">المجموعة "سباحة صباحي":
<divclass="tut-step"><divclass="tut-step-num">3</div><h3class="tut-step-title">المعالجة</h3><divclass="tut-step-body">لكل لاعب active في كل مجموعة نشطة:<ul><li>يتحقق: هل سبق توليد اشتراك لنفس الفترة؟</li><li>يحدد المبلغ من <strong>البرنامج</strong> حسب <spanclass="field">player_type</span> (عضو/غير عضو)</li><li>ينشئ سجل بحالة <spanclass="field">unpaid</span></li></ul><divclass="tut-diagram">المجموعة "سباحة صباحي":
<divclass="tut-step"><divclass="tut-step-num">1</div><h3class="tut-step-title">رفع شهادة طبية</h3><divclass="tut-step-body">من صفحة اللاعب > المستندات > <spanclass="field">رفع شهادة طبية</span>.</div></div>
<divclass="tut-step"><divclass="tut-step-num">1</div><h3class="tut-step-title">مبدأ أساسي: الشهادة الطبية ليست شرطاً إجبارياً</h3><divclass="tut-step-body"><spanclass="info">الشهادة الطبية <strong>لا تمنع</strong> التسجيل أو التدريب. اللاعب بدون شهادة سارية يظهر بعلامة تحذير ⚠ في كل مكان — لكنه يستطيع التسجيل والتدريب والحضور بشكل طبيعي.</span><spanclass="warn">التحذير يظهر في: قائمة اللاعبين، صفحة اللاعب، قائمة المجموعة المسجلين، كشف الحضور، ومعالج التسجيل.</span></div></div>
<divclass="tut-step"><divclass="tut-step-num">2</div><h3class="tut-step-title">رفع شهادة طبية</h3><divclass="tut-step-body">من صفحة اللاعب > المستندات > <spanclass="field">رفع شهادة طبية</span>.<ul><li>نوع المستند: <spanclass="field">medical_cert</span></li><li>الملف (PDF أو صورة)</li></ul></div></div>
<divclass="tut-step"><divclass="tut-step-num">3</div><h3class="tut-step-title">انتظار اللجنة الطبية</h3><divclass="tut-step-body">الشهادة تذهب للحالة <spanclass="field">pending</span> — بانتظار اللجنة الطبية.</div></div>
<divclass="tut-step"><divclass="tut-step-num">3</div><h3class="tut-step-title">الإرسال التلقائي للجنة الطبية</h3><divclass="tut-step-body">عند رفع شهادة طبية، يتم تلقائياً:<ul><li>حفظ المستند في ملفات اللاعب بحالة <spanclass="field">pending</span></li><li>إنشاء سجل مراجعة في قائمة اللجنة الطبية <spanclass="field">/medical-board</span></li></ul><spanclass="warn">لا يمكن اعتماد الشهادة من نفس صفحة اللاعب — الاعتماد حصري للجنة الطبية فقط من خلال صفحة اللجنة.</span></div></div>
<divclass="tut-step"><divclass="tut-step-num">4</div><h3class="tut-step-title">دور اللجنة الطبية</h3><divclass="tut-step-body">صاحب صلاحية <spanclass="field">sa.medical.approve</span> يراجع ويختار: معتمدة (approved) أو مرفوضة (rejected مع سبب).<spanclass="warn">مدير النشاط الرياضي يقدر يشوف حالة الشهادة الطبية بس (read-only) — الاعتماد حصري للجنة الطبية فقط.</span></div></div>
<divclass="tut-step"><divclass="tut-step-num">4</div><h3class="tut-step-title">دور اللجنة الطبية</h3><divclass="tut-step-body">من صفحة <spanclass="field">/medical-board</span>، صاحب صلاحية <spanclass="field">medical.board.approve</span> يراجع ويختار:<ul><li><strong>اعتماد:</strong> يحدد تاريخ الانتهاء ← medical_status = fit</li><li><strong>رفض:</strong> يحدد السبب ← medical_status = unfit (التحذير يستمر)</li></ul></div></div>
<divclass="tut-step"><divclass="tut-step-num">5</div><h3class="tut-step-title">بعد الاعتماد</h3><divclass="tut-step-body">medical_status يتغير لـ <spanclass="field">fit</span> ويتم تعيين medical_expiry_date.<spanclass="success">لما اللاعب حالته "fit"، يقدر يتسجل في مجموعات ويحجز ساعات. النظام بيتحقق تلقائياً.</span></div></div>
<divclass="tut-step"><divclass="tut-step-num">5</div><h3class="tut-step-title">بعد الاعتماد</h3><divclass="tut-step-body">medical_status يتغير لـ <spanclass="field">fit</span> ويتم تعيين medical_expiry_date.<spanclass="success">بعد الاعتماد: علامة التحذير تختفي تلقائياً من كل الشاشات. لما ينتهي التاريخ، العلامة تعود.</span></div></div>
<divclass="tut-step"><divclass="tut-step-num">6</div><h3class="tut-step-title">دورة الحياة الكاملة</h3><divclass="tut-step-body"><divclass="tut-diagram">رفع الشهادة ──→ pending ──→ اللجنة الطبية ──→ approved ──→ fit
<divclass="tut-step"><divclass="tut-step-num">6</div><h3class="tut-step-title">دورة الحياة الكاملة</h3><divclass="tut-step-body"><divclass="tut-diagram">رفع الشهادة ──→ pending ──→ اللجنة الطبية ──→ approved ──→ fit (⚠ تختفي)
│ │
│ │
▼ ▼
▼ ▼
rejected expired (تلقائي)
rejected (⚠ تستمر) expired (تلقائي — ⚠ تعود)
│ عند انتهاء التاريخ
│ عند انتهاء التاريخ
▼
▼
إعادة الرفع مرة أخرى</div></div></div>
إعادة الرفع مرة أخرى
ملاحظة: في جميع الحالات، اللاعب يستطيع التدريب — التحذير إداري فقط</div></div></div>
<divclass="tut-nav">
<divclass="tut-nav">
<ahref="/tutorials/sports-activity/register-player"><idata-lucide="arrow-right"style="width:14px;height:14px;"></i> تسجيل لاعب جديد</a>
<ahref="/tutorials/sports-activity/register-player"><idata-lucide="arrow-right"style="width:14px;height:14px;"></i> تسجيل لاعب جديد</a>