# 12 — الموارد البشرية

## نظرة عامة

إدارة الموظفين والمدربين بالكامل: بيانات شخصية، عقود، مؤهلات، جداول توفر، مكافآت، رواتب، سلف.

```
موظف → مدرب (اختياري) → مؤهلات + جدول توفر → تعيينات → حضور → مكافآت → كشف راتب
```

---

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

### 1. قائمة الموظفين (`/hr/employees`)

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

**أعمدة:**
| العمود | الوصف |
|--------|-------|
| الاسم | person.name_ar |
| المسمى الوظيفي | job_title |
| نوع التوظيف | full_time, part_time, contract, freelance |
| الفرع | branch.name_ar |
| تاريخ التعيين | hire_date |
| الراتب | base_salary ج.م |
| الحالة | active, on_leave, suspended, terminated |

---

### 2. ويزارد إنشاء موظف (`/hr/employees/wizard`)

**خطوات:**
1. بيانات الشخص (اسم، هاتف، بريد، رقم قومي)
2. بيانات الوظيفة (مسمى، نوع، فرع، تاريخ تعيين)
3. الراتب والمزايا (أساسي، بدلات، تكرار الصرف)
4. مراجعة وتأكيد

---

### 3. نموذج موظف (`/hr/employees/create`, `/hr/employees/{id}/edit`)

**الحقول:**
| الحقل | النوع | مطلوب |
|--------|------|-------|
| الشخص | select/create | ✓ |
| المسمى الوظيفي | text | ✓ |
| نوع التوظيف | select | ✓ |
| الفرع | select | ✗ |
| تاريخ التعيين | date | ✓ |
| تاريخ انتهاء العقد | date | ✗ |
| الراتب الأساسي | money | ✗ |
| تكرار الصرف | select | ✓ | monthly, weekly, bi_weekly |
| طريقة الصرف | select | ✓ | cash, bank_transfer, wallet |
| رقم الحساب البنكي | text | ✗ |
| الحالة | select | ✓ |

---

### 4. قائمة المدربين (`/hr/trainers`)

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

**أعمدة:**
| العمود | الوصف |
|--------|-------|
| الاسم | person.name_ar |
| التخصص | specialization |
| سنوات الخبرة | experience_years |
| نموذج المكافأة | per_session, monthly_fixed, percentage |
| معدل الحصة | per_session_rate ج.م |
| المجموعات | عدد المجموعات المُعيّن لها |
| الحالة | active, inactive, on_leave, terminated |

---

### 5. ويزارد إنشاء مدرب (`/hr/trainers/wizard`)

**خطوات:**
1. بيانات الشخص
2. بيانات التدريب (تخصص، خبرة، مؤهلات)
3. نموذج المكافأة (لكل حصة / شهري / نسبة)
4. جدول التوفر
5. مراجعة

---

### 6. نموذج مدرب (`/hr/trainers/create`, `/hr/trainers/{id}/edit`)

**الحقول:**
| الحقل | النوع | مطلوب |
|--------|------|-------|
| الشخص | select/create | ✓ |
| الموظف (ربط) | select | ✗ | يمكن أن يكون مدرب بدون أن يكون موظف |
| التخصص | text | ✗ |
| سنوات الخبرة | number | ✗ |
| مستوى التصنيف | select | ✗ |
| نموذج المكافأة | select | ✓ | per_session, monthly_fixed, percentage |
| معدل الحصة | money | مشروط | مطلوب إذا per_session |
| الراتب الشهري | money | مشروط | مطلوب إذا monthly_fixed |
| نسبة الإيرادات | number | مشروط | مطلوب إذا percentage |
| الحالة | select | ✓ |

---

### 7. مؤهلات المدرب

**المكوّن:** ضمن نموذج المدرب

| الحقل | النوع |
|--------|------|
| اسم المؤهل | text |
| الجهة المانحة | text |
| تاريخ الحصول | date |
| تاريخ الانتهاء | date |
| رقم الشهادة | text |

---

### 8. جدول توفر المدرب

**المكوّن:** ضمن إعداد المدرب

| الحقل | النوع |
|--------|------|
| يوم الأسبوع | select |
| من الساعة | time |
| إلى الساعة | time |
| نوع | available, unavailable, preferred |

---

### 9. لوحة الرواتب (`/hr/payroll`)

**من يراها:** من لديه صلاحية `payroll.manage`

**المحتوى:**
- الفترة الحالية (من - إلى)
- حالة الفترة (draft, processing, approved, paid)
- إجمالي الرواتب المستحقة
- قائمة كشوف الرواتب (payslips)

**لكل كشف:**
| العمود | الوصف |
|--------|-------|
| المدرب/الموظف | الاسم |
| الراتب الأساسي | base_amount |
| المكافآت | total_earnings |
| الخصومات | total_deductions |
| صافي المستحق | net_amount |
| الحالة | draft, pending_approval, approved, paid |

---

### 10. تفاصيل كشف راتب (`/hr/payroll/payslip/{id}`)

**المحتوى:**
- بيانات الموظف/المدرب
- الفترة
- بنود الاستحقاق (earnings):
  - راتب أساسي
  - مكافأة حصص (عدد × معدل)
  - بدلات
- بنود الخصم (deductions):
  - سلف مسترجعة
  - غرامات
  - تأمينات
- صافي المستحق
- حالة الصرف

---

### 11. مكافآت المدرب (`/hr/payroll/trainer/{id}/compensations`)

**من يراها:** من لديه صلاحية `payroll.manage`

**المحتوى:**
- قائمة المكافآت المُستحقة (لكل حصة حضرها)
- الحالة: pending, approved, paid, cancelled
- المجموع

**الآلية (تلقائية):**
```mermaid
flowchart TD
    A[المدرب يحضر حصة] --> B[حدث: AttendanceMarked]
    B --> C[Listener: GenerateTrainerCompensation]
    C --> D[إنشاء سجل مكافأة]
    D --> E[المبلغ = per_session_rate]
    E --> F[حالة: pending]
```

---

### 12. السلف (`/hr/advances`)

**من يراها:** من لديه صلاحية `payroll.manage`

**أعمدة:**
| العمود | الوصف |
|--------|-------|
| المدرب | الاسم |
| المبلغ | amount |
| تاريخ الطلب | requested_date |
| طريقة السداد | one_time, installments |
| عدد الأقساط | installment_count |
| المسدد | repaid_amount |
| المتبقي | remaining |
| الحالة | pending, approved, active, repaid, rejected |

**إنشاء سلفة:**
| الحقل | النوع | مطلوب |
|--------|------|-------|
| المدرب | select | ✓ |
| المبلغ | money | ✓ |
| السبب | textarea | ✗ |
| طريقة السداد | select | ✓ |
| عدد أقساط السداد | number | مشروط |

**السداد:** يُخصم تلقائياً من كشف الراتب الشهري (كبند خصم).

---

### 13. تاريخ معدلات المدرب

**جدول `trainer_rate_history`:** يسجّل كل تغيير في معدل مكافأة المدرب:
- التاريخ
- المعدل القديم
- المعدل الجديد
- السبب

---

## نموذج المكافأة — 3 أنواع

| النموذج | الحساب | مناسب لـ |
|---------|--------|----------|
| per_session | حصص حضرها × معدل الحصة | مدربين part-time |
| monthly_fixed | مبلغ ثابت شهرياً | مدربين full-time |
| percentage | نسبة من إيرادات المجموعة | مدربين شراكة |

---

## دورة الراتب الشهري

```mermaid
sequenceDiagram
    participant S as النظام
    participant HR as الموارد البشرية
    participant T as المدرب

    Note over S: يومياً: المدرب يحضر حصص
    S->>S: كل حصة → مكافأة pending

    Note over HR: نهاية الشهر
    HR->>S: فتح فترة رواتب جديدة
    S->>S: تجميع مكافآت الشهر
    S->>S: خصم السلف المستحقة
    S->>S: إنشاء كشف راتب (draft)
    HR->>S: مراجعة + اعتماد
    S->>S: حالة: approved
    HR->>S: صرف
    S->>S: حالة: paid
    S-->>T: إشعار: تم صرف راتبك
```

---

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

### مثال 1: مدرب بمكافأة لكل حصة
> - كابتن أحمد: per_session_rate = 150 ج.م
> - حضر 24 حصة هذا الشهر
> - المستحق: 24 × 150 = 3600 ج.م
> - عليه سلفة قسط 500 ج.م
> - الصافي: 3100 ج.م

### مثال 2: مدرب براتب ثابت
> - كابتن سارة: monthly_fixed = 5000 ج.م
> - حضرت 20 من 24 حصة
> - لا خصم حضور (ثابت)
> - الصافي: 5000 ج.م

### مثال 3: سلفة مقسّطة
> 1. كابتن محمد يطلب سلفة 3000 ج.م
> 2. الموافقة: سداد على 6 أشهر = 500/شهر
> 3. كل كشف راتب: يُخصم 500 ج.م تلقائياً
> 4. بعد 6 أشهر: السلفة مسددة بالكامل

### مثال 4: إلغاء حصة وتأثيرها على المكافأة
> 1. حصة الأربعاء أُلغيت (مطر)
> 2. Listener: HandleSessionCancelled
> 3. مكافأة المدرب لهذه الحصة → cancelled
> 4. لا يُحسب ضمن الراتب

---

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

| الميزة | الفائدة |
|--------|---------|
| ربط الحضور بالمكافأة | عدالة — المدرب يُحاسب على ما حضره فعلاً |
| 3 نماذج مكافأة | مرونة — يناسب كل أنواع التعاقد |
| السلف | خدمة المدربين + سداد منظم |
| كشف الراتب | وثيقة رسمية لكل شهر |
| تاريخ المعدلات | شفافية — كل تغيير في الأجر موثّق |
| المؤهلات | تتبع صلاحية الشهادات |
| جدول التوفر | تجنب تعيين مدرب في وقت غير متاح |

---

## التكاملات

| الوحدة | العلاقة |
|--------|---------|
| التعيينات | المدرب مُعيّن لمجموعات |
| الحضور | حضور المدرب → مكافأة |
| المالية | كشف الراتب → قيود مالية |
| الإشعارات | إشعار صرف الراتب |
| المستندات | مؤهلات ووثائق الموظف |
