# 07 — التعيينات (Assignments)

## نظرة عامة

التعيين = ربط مدرب أو موظف بمجموعة تدريبية أو حصة محددة. يحدد:
- من يُدرّب من
- في أي فترة
- بأي نطاق (كامل، جزئي، مساعد، مشرف، مراقب)

---

## الشاشات المنفذة

### 1. قائمة التعيينات (`/assignments`)

**من يراها:** من لديه صلاحية `assignments.list`

**الفلاتر:**
- بحث بالاسم
- تصفية بالمجموعة
- تصفية بالحالة

**أعمدة الجدول:**
| العمود | الوصف |
|--------|-------|
| المُعيَّن | اسم المدرب/الموظف |
| النوع | trainer, head_trainer, assistant |
| المجموعة | اسم المجموعة |
| النطاق | full, partial, supervising, assisting, observing |
| تاريخ البداية | start_date |
| تاريخ النهاية | end_date |
| الحالة | active, suspended, completed, cancelled |
| الإجراءات | — |

---

### 2. إنشاء تعيين (`/assignments/create`)

**من يراها:** من لديه صلاحية `assignments.create`

**الحقول:**
| الحقل | النوع | مطلوب | ملاحظات |
|--------|------|-------|---------|
| المُعيَّن | select | ✓ | بحث بالاسم بين المدربين |
| نوع المُعيَّن | select | ✓ | trainer, assistant, head_trainer |
| المجموعة | select | ✓ | |
| النطاق | select | ✓ | full, partial, supervising, assisting, observing |
| تاريخ البداية | date | ✓ | |
| تاريخ النهاية | date | ✗ | |
| ملاحظات | textarea | ✗ | |

**النطاقات:**
| النطاق | المعنى |
|--------|--------|
| full | مسؤول كامل عن المجموعة |
| partial | مسؤول عن جزء (أيام محددة) |
| supervising | إشراف فقط — لا يُدرّب مباشرة |
| assisting | مساعد — يساعد المدرب الرئيسي |
| observing | مراقب — لا يتدخل |

---

### حالات التعيين

```mermaid
stateDiagram-v2
    [*] --> نشط
    نشط --> موقوف : إيقاف مؤقت
    نشط --> مكتمل : انتهاء الفترة
    نشط --> ملغى : إلغاء

    موقوف --> نشط : استئناف
```

---

## كشف تعارض التعيينات

**الخدمة:** `ScheduleConflictService`

**التحققات عند إنشاء تعيين:**
1. هل المدرب مُعيّن بالفعل لمجموعة أخرى في نفس الوقت؟
2. هل المدرب متاح في هذه الأيام/الأوقات (جدول التوفر)؟
3. هل تجاوز الحد الأقصى لساعات العمل الأسبوعية؟

---

## العلاقة بالحضور

**عند إنشاء تعيين:**
- تُولّد سجلات حضور "expected" للمدرب في جميع حصص المجموعة المستقبلية

**عند إنهاء تعيين:**
- تُحذف سجلات الحضور المستقبلية للمدرب (الماضي يبقى)

**التجاوز على مستوى الحصة:**
- إذا حصة معينة لها مدرب مُعيّن خصيصاً (override) → المدرب المُعيّن على مستوى المجموعة لا يُتوقع حضوره لتلك الحصة

---

## أمثلة عملية

### مثال 1: تعيين مدرب رئيسي لمجموعة
> 1. كابتن أحمد → مجموعة "أشبال السبت/الاثنين" → نطاق: full
> 2. تُولّد سجلات حضور لأحمد في كل حصص المجموعة
> 3. يظهر في لوحة المدرب: حصصه اليوم

### مثال 2: مدرب مساعد في أيام محددة
> 1. كابتن سارة → نفس المجموعة → نطاق: partial
> 2. يوم السبت فقط
> 3. حضورها مطلوب يوم السبت فقط

### مثال 3: تعارض تعيين
> 1. كابتن أحمد مُعيّن لمجموعة "أشبال" السبت 16:00-17:00
> 2. المدير يحاول تعيينه لمجموعة "ناشئين" السبت 16:30-18:00
> 3. النظام يكتشف التعارض الزمني
> 4. تحذير: "تعارض مع تعيين موجود"

---

## لماذا يحتاج عملك هذا

| الميزة | الفائدة |
|--------|---------|
| ربط مدرب بمجموعة | واضح من يُدرّب من — لا خلافات |
| كشف التعارض | مستحيل تعيين مدرب في مكانين بنفس الوقت |
| نطاقات متعددة | يناسب أكاديميات بمدربين رئيسيين ومساعدين |
| الربط بالحضور | المدرب يُحاسب على حضوره تلقائياً |
| الربط بالرواتب | حضور المدرب = أساس حساب المكافأة |

---

## التكاملات

| الوحدة | العلاقة |
|--------|---------|
| الموارد البشرية | المدرب هو الشخص المُعيَّن |
| المجموعات | المجموعة هي هدف التعيين |
| الحضور | تعيين → سجلات حضور مدرب |
| الرواتب | حضور المدرب → مكافأة الحصة |
| المنشآت | التعيين مرتبط بمساحة في المنشأة |
