# مصفوفة الصلاحيات — Permission Matrix

## هيكل الصلاحيات

يتم تنفيذ الصلاحيات عبر **Spatie Laravel Permissions** مع أدوار قابلة للتخصيص من قبل مدير المدرسة.
الصلاحيات تُفحص عبر **Policies** في طبقة الـ Controller.

---

## الأدوار الأساسية (Predefined Roles)

| الدور | المعرف | الوصف |
|-------|--------|-------|
| Super Admin | `super_admin` | صلاحية كاملة، إنشاء أدوار أخرى |
| Admin | `admin` | إدارة النظام اليومية |
| Teacher | `teacher` | وصول لطلاب صفه فقط |
| Parent | `parent` | وصول لأطفاله فقط |

---

## قائمة الصلاحيات الكاملة

### صلاحيات المستخدمين (Users)

| الصلاحية | Super Admin | Admin | Teacher | Parent |
|----------|:-----------:|:-----:|:-------:|:------:|
| view_all_users | ✓ | ✓ | ✗ | ✗ |
| create_user | ✓ | ✓ | ✗ | ✗ |
| edit_user | ✓ | ✓ | ✗ | ✗ |
| delete_user | ✓ | ✓ | ✗ | ✗ |
| assign_roles | ✓ | ✗ | ✗ | ✗ |

### صلاحيات الطلاب (Students)

| الصلاحية | Super Admin | Admin | Teacher | Parent |
|----------|:-----------:|:-----:|:-------:|:------:|
| view_all_students | ✓ | ✓ | ✗ | ✗ |
| view_class_students | ✗ | ✗ | ✓ | ✗ |
| view_own_children | ✗ | ✗ | ✗ | ✓ |
| create_student | ✓ | ✓ | ✗ | ✗ |
| edit_student | ✓ | ✓ | ✗ | ✗ |
| delete_student | ✓ | ✓ | ✗ | ✗ |
| assign_parent_to_student | ✓ | ✓ | ✗ | ✗ |

### صلاحيات الصفوف (Classes)

| الصلاحية | Super Admin | Admin | Teacher | Parent |
|----------|:-----------:|:-----:|:-------:|:------:|
| view_all_classes | ✓ | ✓ | ✗ | ✗ |
| create_class | ✓ | ✓ | ✗ | ✗ |
| edit_class | ✓ | ✓ | ✗ | ✗ |
| delete_class | ✓ | ✓ | ✗ | ✗ |

### صلاحيات الحضور (Attendance)

| الصلاحية | Super Admin | Admin | Teacher | Parent |
|----------|:-----------:|:-----:|:-------:|:------:|
| view_all_attendance | ✓ | ✓ | ✗ | ✗ |
| view_class_attendance | ✗ | ✗ | ✓ | ✗ |
| view_child_attendance | ✗ | ✗ | ✗ | ✓ |
| record_attendance | ✗ | ✗ | ✓ | ✗ |
| edit_attendance | ✓ | ✓ | ✗ (فقط في نفس اليوم) | ✗ |

### صلاحيات الوجبات (Meals)

| الصلاحية | Super Admin | Admin | Teacher | Parent |
|----------|:-----------:|:-----:|:-------:|:------:|
| view_all_meal_records | ✓ | ✓ | ✗ | ✗ |
| view_class_meal_records | ✗ | ✗ | ✓ | ✗ |
| view_child_meal_records | ✗ | ✗ | ✗ | ✓ |
| record_meal | ✗ | ✗ | ✓ | ✗ |
| manage_meal_plans | ✓ | ✓ | ✗ | ✗ |

### صلاحيات النوم (Sleep)

| الصلاحية | Super Admin | Admin | Teacher | Parent |
|----------|:-----------:|:-----:|:-------:|:------:|
| view_all_sleep_records | ✓ | ✓ | ✗ | ✗ |
| view_class_sleep_records | ✗ | ✗ | ✓ | ✗ |
| view_child_sleep_records | ✗ | ✗ | ✗ | ✓ |
| record_sleep | ✗ | ✗ | ✓ | ✗ |

### صلاحيات الأنشطة (Activities)

| الصلاحية | Super Admin | Admin | Teacher | Parent |
|----------|:-----------:|:-----:|:-------:|:------:|
| view_all_activities | ✓ | ✓ | ✗ | ✗ |
| view_class_activities | ✗ | ✗ | ✓ | ✓ (أطفاله) |
| create_activity | ✗ | ✗ | ✓ | ✗ |
| manage_schedules | ✓ | ✓ | ✓ | ✗ |
| publish_activity | ✗ | ✗ | ✓ | ✗ |

### صلاحيات الصور والوسائط (Media)

| الصلاحية | Super Admin | Admin | Teacher | Parent |
|----------|:-----------:|:-----:|:-------:|:------:|
| view_all_media | ✓ | ✓ | ✗ | ✗ |
| upload_media | ✓ | ✓ | ✓ | ✗ |
| view_student_media | ✓ | ✓ | ✓ (صفه) | ✓ (طفله) |
| approve_media | ✓ | ✓ | ✗ | ✗ |
| delete_media | ✓ | ✓ | ✗ | ✗ |
| view_class_media (للصف كامل) | ✓ | ✓ | ✗ (يحتاج الموافقة) | ✗ (يحتاج الموافقة) |

### صلاحيات الإعلانات (Announcements)

| الصلاحية | Super Admin | Admin | Teacher | Parent |
|----------|:-----------:|:-----:|:-------:|:------:|
| view_announcements | ✓ | ✓ | ✓ | ✓ (نطاقه) |
| create_announcement | ✓ | ✓ | ✗ | ✗ |
| delete_announcement | ✓ | ✓ | ✗ | ✗ |

### صلاحيات "أنا قادم" (Pickup Alert)

| الصلاحية | Super Admin | Admin | Teacher | Parent |
|----------|:-----------:|:-----:|:-------:|:------:|
| send_pickup_alert | ✗ | ✗ | ✗ | ✓ |
| receive_pickup_alert | ✗ | ✗ | ✓ (صفه) | ✗ |
| view_pickup_alerts | ✓ | ✓ | ✓ (صفه) | ✗ |
| cancel_pickup_alert | ✗ | ✗ | ✗ | ✓ |

### صلاحيات الإعدادات (Settings)

| الصلاحية | Super Admin | Admin | Teacher | Parent |
|----------|:-----------:|:-----:|:-------:|:------:|
| view_settings | ✓ | ✓ | ✗ | ✗ |
| edit_settings | ✓ | ✗ | ✗ | ✗ |

### صلاحيات التقارير (Reports)

| الصلاحية | Super Admin | Admin | Teacher | Parent |
|----------|:-----------:|:-----:|:-------:|:------:|
| view_attendance_reports | ✓ | ✓ | ✗ | ✗ |

---

## الأدوار الديناميكية (حسب طلب العميل)

مدير المدرسة يمكنه:
1. إنشاء دور جديد (مثلاً: "مشرف عام")
2. تعيين مجموعة من الصلاحيات لهذا الدور
3. تعيين الدور لأي مستخدم

---

## نطاق البيانات (Data Scoping)

الصلاحيات وحدها لا تكفي — يجب تقييد نطاق البيانات أيضًا:

| الدور | نطاق الرؤية |
|-------|------------|
| Parent | `students.id IN (أطفاله فقط)` |
| Teacher | `students.class_id IN (صفوفه فقط)` |
| Admin | `students.id` (الجميع) |

يتم تطبيق النطاق عبر **Laravel Policies** و **Global Scopes** عند الحاجة.

مثال لـ `AttendancePolicy`:
```php
public function view(User $user, Student $student): bool
{
    if ($user->hasRole('teacher')) {
        return $user->teacherClasses()->pluck('classes.id')->contains($student->class_id);
    }
    if ($user->hasRole('parent')) {
        return $user->children()->pluck('students.id')->contains($student->id);
    }
    return $user->hasRole('admin') || $user->hasRole('super_admin');
}
```

---

## ملاحظات الصلاحيات

1. **Super Admin** وحده يملك `assign_roles` و `edit_settings` — لحماية إعدادات النظام.
2. **المعلم** يمكنه تعديل الحضور فقط في نفس اليوم لمنع التلاعب.
3. **الصور للصف كامل**: حتى إذا المعلم نشر صورة للصف، الوالد يرى أطفاله فقط ما لم توافق الإدارة على `visibility=parents_all`.
4. **الصلاحيات قابلة للتوسعة** — المدير يستطيع إضافة صلاحيات جديدة لاحقًا.
5. **الحساسيات تُخزن كحقل نصي بسيط في الطالب، لا تحتاج صلاحيات خاصة**.
6. **تم حذف صلاحيات المراسلة** نظرًا لإلغاء نظام المحادثات.
