# 📊 شرح تفصيلي لجميع جداول قاعدة البيانات
# Complete Database Schema Explanation

دليل شامل لجميع الجداول في نظام إدارة المدارس متعدد المستأجرين.

---

## 📋 جدول المحتويات

1. [نظرة عامة](#-نظرة-عامة)
2. [الجداول المركزية (Central Database)](#-الجداول-المركزية-central-database)
3. [جداول المدارس (Tenant Database)](#-جداول-المدارس-tenant-database)
4. [العلاقات بين الجداول](#-العلاقات-بين-الجداول)

---

## 📌 نظرة عامة

النظام يستخدم نموذج **Multi-Database Tenancy**:
- **قاعدة بيانات مركزية واحدة**: تحتوي على معلومات المدارس والنطاقات
- **قاعدة بيانات منفصلة لكل مدرسة**: تحتوي على جميع بيانات المدرسة

```
📦 school_system (قاعدة البيانات المركزية)
   ├── 📁 جداول المستخدمين والمصادقة (6 جداول)
   ├── 📁 جداول Multi-Tenancy (2 جداول)
   └── 📁 جداول النظام (3 جداول)

📦 tenant{school_id} (قاعدة بيانات كل مدرسة)
   ├── 📁 جداول الصلاحيات (5 جداول)
   ├── 📁 جداول الطلاب والدراسة (10 جداول)
   ├── 📁 جداول المعلمين والجداول (3 جداول)
   ├── 📁 جداول التقييم (4 جداول)
   ├── 📁 جداول المالية (2 جداول)
   └── 📁 جداول إضافية (6 جداول)
```

---

## 🏢 الجداول المركزية (Central Database)

هذه الجداول موجودة في قاعدة البيانات المركزية `school_system`.

### 1️⃣ **جداول Multi-Tenancy**

#### 📋 جدول `tenants`
**الوظيفة:** تخزين معلومات المدارس المسجلة في النظام.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | string (PK) | معرف فريد للمدرسة (UUID أو اسم) |
| `name` | string | اسم المدرسة |
| `slug` | string (unique) | اسم مختصر للنطاق الفرعي |
| `email` | string (unique) | البريد الإلكتروني للمدرسة |
| `phone` | string (nullable) | رقم الهاتف |
| `city` | string (nullable) | المدينة |
| `address` | text (nullable) | العنوان الكامل |
| `plan` | string | نوع الاشتراك (trial, basic, standard, premium) |
| `is_active` | boolean | هل المدرسة نشطة؟ |
| `trial_ends_at` | timestamp (nullable) | تاريخ انتهاء الفترة التجريبية |
| `data` | json (nullable) | بيانات إضافية مرنة |
| `created_at` | timestamp | تاريخ التسجيل |
| `updated_at` | timestamp | تاريخ آخر تحديث |

**مثال:**
```json
{
  "id": "school1",
  "name": "مدرسة النور الأهلية",
  "slug": "alnoor",
  "email": "admin@alnoor-school.edu",
  "phone": "+966501234567",
  "city": "الرياض",
  "plan": "standard",
  "is_active": true
}
```

---

#### 📋 جدول `domains`
**الوظيفة:** ربط النطاقات الفرعية بالمدارس.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | integer (PK) | المعرف التلقائي |
| `domain` | string (unique) | النطاق الكامل للمدرسة |
| `tenant_id` | string (FK) | معرف المدرسة (يشير لـ tenants.id) |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ آخر تحديث |

**مثال:**
```json
{
  "domain": "alnoor.localhost",
  "tenant_id": "school1"
}
```

**العلاقة:** `domains.tenant_id` → `tenants.id` (CASCADE)

---

### 2️⃣ **جداول المستخدمين والمصادقة**

#### 📋 جدول `users`
**الوظيفة:** تخزين مستخدمي القاعدة المركزية (مدراء النظام).

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `name` | string | اسم المستخدم |
| `email` | string (unique) | البريد الإلكتروني |
| `email_verified_at` | timestamp (nullable) | تاريخ التحقق من البريد |
| `password` | string | كلمة المرور المشفرة |
| `role` | string | الدور (admin, super_admin) |
| `remember_token` | string (nullable) | رمز التذكر |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ آخر تحديث |

**ملاحظة:** هذا للمدراء فقط. مستخدمو المدارس في قواعد بيانات منفصلة.

---

#### 📋 جدول `password_reset_tokens`
**الوظيفة:** تخزين رموز إعادة تعيين كلمة المرور.

| العمود | النوع | الوصف |
|--------|------|-------|
| `email` | string (PK) | البريد الإلكتروني |
| `token` | string | رمز إعادة التعيين |
| `created_at` | timestamp | تاريخ إنشاء الرمز |

**الاستخدام:** عند طلب إعادة تعيين كلمة المرور.

---

#### 📋 جدول `sessions`
**الوظيفة:** تخزين جلسات المستخدمين النشطة.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | string (PK) | معرف الجلسة |
| `user_id` | bigint (nullable) | معرف المستخدم (FK) |
| `ip_address` | string (nullable) | عنوان IP |
| `user_agent` | text (nullable) | معلومات المتصفح |
| `payload` | longtext | بيانات الجلسة |
| `last_activity` | integer | آخر نشاط (timestamp) |

**الاستخدام:** إدارة جلسات المستخدمين.

---

### 3️⃣ **جداول النظام**

#### 📋 جدول `cache`
**الوظيفة:** تخزين البيانات المؤقتة (Cache).

| العمود | النوع | الوصف |
|--------|------|-------|
| `key` | string (PK) | مفتاح الـ Cache |
| `value` | mediumtext | القيمة المخزنة |
| `expiration` | integer | وقت انتهاء الصلاحية |

**الاستخدام:** تسريع الاستعلامات المتكررة.

---

#### 📋 جدول `cache_locks`
**الوظيفة:** منع تنفيذ عمليات متزامنة.

| العمود | النوع | الوصف |
|--------|------|-------|
| `key` | string (PK) | مفتاح القفل |
| `owner` | string | مالك القفل |
| `expiration` | integer | وقت انتهاء القفل |

**الاستخدام:** Atomic Operations.

---

#### 📋 جدول `jobs`
**الوظيفة:** قائمة انتظار المهام (Queue Jobs).

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `queue` | string | اسم القائمة |
| `payload` | longtext | بيانات المهمة |
| `attempts` | tinyint | عدد المحاولات |
| `reserved_at` | integer (nullable) | وقت الحجز |
| `available_at` | integer | وقت التوفر |
| `created_at` | integer | وقت الإنشاء |

**الاستخدام:** إرسال الإشعارات، معالجة البيانات الثقيلة.

---

#### 📋 جدول `job_batches`
**الوظيفة:** تجميع المهام المترابطة.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | string (PK) | معرف الدفعة |
| `name` | string | اسم الدفعة |
| `total_jobs` | integer | إجمالي المهام |
| `pending_jobs` | integer | المهام المعلقة |
| `failed_jobs` | integer | المهام الفاشلة |
| `failed_job_ids` | longtext | معرفات المهام الفاشلة |
| `options` | mediumtext (nullable) | خيارات إضافية |
| `cancelled_at` | integer (nullable) | وقت الإلغاء |
| `created_at` | integer | وقت الإنشاء |
| `finished_at` | integer (nullable) | وقت الانتهاء |

---

#### 📋 جدول `failed_jobs`
**الوظيفة:** تسجيل المهام الفاشلة للمراجعة.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `uuid` | string (unique) | معرف فريد |
| `connection` | text | نوع الاتصال |
| `queue` | text | اسم القائمة |
| `payload` | longtext | بيانات المهمة |
| `exception` | longtext | سبب الفشل |
| `failed_at` | timestamp | تاريخ الفشل |

**الاستخدام:** debugging ومراجعة الأخطاء.

---

## 🏫 جداول المدارس (Tenant Database)

هذه الجداول موجودة في قاعدة بيانات كل مدرسة `tenant{school_id}`.

### 1️⃣ **جداول الصلاحيات (Permission System)**

#### 📋 جدول `permissions`
**الوظيفة:** تعريف الصلاحيات المتاحة في النظام.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `name` | string | اسم الصلاحية (view students) |
| `guard_name` | string | نوع الحارس (web) |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

**مثال:**
```
- view students
- create students
- edit students
- delete students
- view grades
```

---

#### 📋 جدول `roles`
**الوظيفة:** تعريف الأدوار (المناصب) في المدرسة.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `name` | string | اسم الدور (admin, teacher, student, parent) |
| `guard_name` | string | نوع الحارس |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

**الأدوار الأساسية:**
- `admin`: مدير المدرسة
- `teacher`: معلم
- `student`: طالب
- `parent`: ولي أمر

---

#### 📋 جدول `model_has_permissions`
**الوظيفة:** ربط الصلاحيات المباشرة بالمستخدمين.

| العمود | النوع | الوصف |
|--------|------|-------|
| `permission_id` | bigint (FK) | معرف الصلاحية |
| `model_type` | string | نوع النموذج (User) |
| `model_id` | bigint | معرف المستخدم |

**الاستخدام:** إعطاء صلاحية محددة لمستخدم معين.

---

#### 📋 جدول `model_has_roles`
**الوظيفة:** ربط الأدوار بالمستخدمين.

| العمود | النوع | الوصف |
|--------|------|-------|
| `role_id` | bigint (FK) | معرف الدور |
| `model_type` | string | نوع النموذج (User) |
| `model_id` | bigint | معرف المستخدم |

**الاستخدام:** تعيين دور لمستخدم (مدير، معلم، طالب).

---

#### 📋 جدول `role_has_permissions`
**الوظيفة:** ربط الصلاحيات بالأدوار.

| العمود | النوع | الوصف |
|--------|------|-------|
| `permission_id` | bigint (FK) | معرف الصلاحية |
| `role_id` | bigint (FK) | معرف الدور |

**مثال:**
```
الدور: teacher
الصلاحيات:
  - view students
  - view grades
  - create marks
  - edit marks
```

---

### 2️⃣ **جداول الطلاب والدراسة**

#### 📋 جدول `users` (Tenant)
**الوظيفة:** مستخدمو هذه المدرسة فقط.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `name` | string | الاسم الكامل |
| `email` | string (unique) | البريد الإلكتروني |
| `email_verified_at` | timestamp (nullable) | تاريخ التحقق |
| `password` | string | كلمة المرور المشفرة |
| `role` | string | الدور الأساسي |
| `tenant_id` | string | معرف المدرسة (للتأكيد الإضافي) |
| `remember_token` | string (nullable) | رمز التذكر |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

---

#### 📋 جدول `grades`
**الوظيفة:** الصفوف الدراسية (الأول، الثاني، الثالث...).

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `name` | string | اسم الصف (الصف الأول) |
| `level` | integer | المستوى (1, 2, 3...) |
| `description` | text (nullable) | وصف الصف |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

**مثال:**
```
- الصف الأول (level: 1)
- الصف الثاني (level: 2)
- الصف الثالث (level: 3)
```

---

#### 📋 جدول `students`
**الوظيفة:** معلومات الطلاب المسجلين في المدرسة.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `name` | string | اسم الطالب |
| `email` | string (unique, nullable) | البريد الإلكتروني |
| `phone` | string (nullable) | رقم الهاتف |
| `date_of_birth` | date (nullable) | تاريخ الميلاد |
| `gender` | string | الجنس (male/female) |
| `address` | text (nullable) | العنوان |
| `grade_id` | bigint (FK) | الصف الدراسي |
| `parent_id` | bigint (FK, nullable) | ولي الأمر |
| `user_id` | bigint (FK, nullable) | حساب المستخدم |
| `enrollment_date` | date (nullable) | تاريخ التسجيل |
| `status` | string | الحالة (active/inactive/graduated) |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

**العلاقات:**
- `grade_id` → `grades.id`
- `parent_id` → `parent_models.id`
- `user_id` → `users.id`

---

#### 📋 جدول `subjects`
**الوظيفة:** المواد الدراسية.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `name` | string | اسم المادة (رياضيات، علوم...) |
| `description` | text (nullable) | وصف المادة |
| `grade_id` | bigint (FK, nullable) | الصف المخصص |
| `teacher_id` | bigint (FK, nullable) | المعلم المسؤول |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

**مثال:**
```
- رياضيات (teacher: أ. محمد، grade: الصف الأول)
- علوم (teacher: أ. فاطمة، grade: الصف الثاني)
```

---

#### 📋 جدول `attendances`
**الوظيفة:** سجل الحضور والغياب.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `student_id` | bigint (FK) | معرف الطالب |
| `date` | date | تاريخ الحضور |
| `status` | string | الحالة (present/absent/late/excused) |
| `notes` | text (nullable) | ملاحظات |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

**الحالات:**
- `present`: حاضر
- `absent`: غائب
- `late`: متأخر
- `excused`: غياب بعذر

---

#### 📋 جدول `schedules`
**الوظيفة:** الجدول الدراسي (الحصص).

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `grade_id` | bigint (FK) | الصف |
| `subject_id` | bigint (FK) | المادة |
| `teacher_id` | bigint (FK, nullable) | المعلم |
| `day_of_week` | string | اليوم (Monday, Tuesday...) |
| `start_time` | time | وقت البداية |
| `end_time` | time | وقت النهاية |
| `room` | string (nullable) | رقم الفصل/القاعة |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

**مثال:**
```yaml
الأحد:
  - 08:00-09:00: رياضيات (أ. محمد، الصف الأول، الفصل 101)
  - 09:00-10:00: علوم (أ. فاطمة، الصف الأول، الفصل 101)
```

---

### 3️⃣ **جداول المعلمين**

#### 📋 جدول `teachers`
**الوظيفة:** معلومات المعلمين.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `name` | string | اسم المعلم |
| `email` | string (unique) | البريد الإلكتروني |
| `phone` | string (nullable) | رقم الهاتف |
| `specialization` | string (nullable) | التخصص |
| `qualification` | string (nullable) | المؤهل العلمي |
| `hire_date` | date (nullable) | تاريخ التعيين |
| `user_id` | bigint (FK, nullable) | حساب المستخدم |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

**العلاقات:**
- `user_id` → `users.id`

---

### 4️⃣ **جداول التقييم**

#### 📋 جدول `marks`
**الوظيفة:** درجات الطلاب في الاختبارات.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `student_id` | bigint (FK) | معرف الطالب |
| `subject_id` | bigint (FK) | معرف المادة |
| `exam_id` | bigint (FK, nullable) | معرف الاختبار |
| `mark` | decimal | الدرجة المحصلة |
| `max_mark` | decimal | الدرجة الكاملة |
| `exam_date` | date | تاريخ الاختبار |
| `notes` | text (nullable) | ملاحظات |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

**مثال:**
```
- أحمد: رياضيات (18/20) - اختبار نصف الفصل
- محمد: علوم (15/20) - اختبار شهري
```

---

#### 📋 جدول `exams`
**الوظيفة:** تعريف الاختبارات.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `name` | string | اسم الاختبار |
| `subject_id` | bigint (FK) | المادة |
| `grade_id` | bigint (FK) | الصف |
| `exam_date` | date | تاريخ الاختبار |
| `duration` | integer | المدة بالدقائق |
| `max_mark` | decimal | الدرجة الكاملة |
| `type` | string | النوع (midterm/final/quiz/monthly) |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

---

#### 📋 جدول `assignments`
**الوظيفة:** الواجبات المنزلية.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `title` | string | عنوان الواجب |
| `description` | text | تفاصيل الواجب |
| `subject_id` | bigint (FK) | المادة |
| `grade_id` | bigint (FK) | الصف |
| `teacher_id` | bigint (FK) | المعلم |
| `due_date` | date | تاريخ التسليم |
| `max_score` | decimal (nullable) | الدرجة الكاملة |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

---

#### 📋 جدول `notes`
**الوظيفة:** ملاحظات المعلمين على الطلاب.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `student_id` | bigint (FK) | معرف الطالب |
| `teacher_id` | bigint (FK) | معرف المعلم |
| `note` | text | نص الملاحظة |
| `type` | string | النوع (positive/negative/neutral) |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

---

### 5️⃣ **جداول المالية**

#### 📋 جدول `fees`
**الوظيفة:** الرسوم الدراسية المستحقة.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `student_id` | bigint (FK) | معرف الطالب |
| `amount` | decimal | المبلغ المستحق |
| `description` | string | وصف الرسوم (رسوم دراسية، كتب...) |
| `due_date` | date | تاريخ الاستحقاق |
| `status` | string | الحالة (pending/paid/overdue) |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

**مثال:**
```
- رسوم دراسية: 5000 ريال (pending)
- رسوم الكتب: 500 ريال (paid)
```

---

#### 📋 جدول `payments`
**الوظيفة:** سجل المدفوعات.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `student_id` | bigint (FK) | معرف الطالب |
| `fee_id` | bigint (FK, nullable) | معرف الرسوم المرتبطة |
| `amount` | decimal | المبلغ المدفوع |
| `payment_date` | date | تاريخ الدفع |
| `payment_method` | string | طريقة الدفع (cash/card/bank_transfer) |
| `reference` | string (nullable) | رقم المرجع/الإيصال |
| `notes` | text (nullable) | ملاحظات |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

---

### 6️⃣ **جداول إضافية**

#### 📋 جدول `parent_models`
**الوظيفة:** معلومات أولياء الأمور.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `name` | string | اسم ولي الأمر |
| `email` | string (unique, nullable) | البريد الإلكتروني |
| `phone` | string | رقم الهاتف |
| `occupation` | string (nullable) | المهنة |
| `address` | text (nullable) | العنوان |
| `user_id` | bigint (FK, nullable) | حساب المستخدم |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

**العلاقات:**
- يمكن لولي الأمر أن يكون مسؤولاً عن عدة طلاب (علاقة 1:N)

---

#### 📋 جدول `books` (المكتبة)
**الوظيفة:** كتب المكتبة المدرسية.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `title` | string | عنوان الكتاب |
| `author` | string | المؤلف |
| `isbn` | string (unique, nullable) | الرقم الدولي |
| `category` | string (nullable) | التصنيف |
| `quantity` | integer | عدد النسخ المتوفرة |
| `available` | integer | عدد النسخ المتاحة للإعارة |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

---

#### 📋 جدول `borrowings`
**الوظيفة:** سجل استعارة الكتب.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `book_id` | bigint (FK) | معرف الكتاب |
| `student_id` | bigint (FK) | معرف الطالب |
| `borrowed_at` | date | تاريخ الاستعارة |
| `due_date` | date | تاريخ الإرجاع المتوقع |
| `returned_at` | date (nullable) | تاريخ الإرجاع الفعلي |
| `status` | string | الحالة (borrowed/returned/overdue) |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

---

#### 📋 جدول `events`
**الوظيفة:** الفعاليات والأحداث المدرسية.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `title` | string | عنوان الحدث |
| `description` | text (nullable) | وصف الحدث |
| `event_date` | date | تاريخ الحدث |
| `start_time` | time (nullable) | وقت البداية |
| `end_time` | time (nullable) | وقت النهاية |
| `location` | string (nullable) | المكان |
| `type` | string (nullable) | النوع (meeting/trip/celebration) |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

**مثال:**
```
- يوم رياضي (2024-03-15، الملعب الرئيسي)
- اجتماع أولياء الأمور (2024-03-20، القاعة الكبرى)
```

---

#### 📋 جدول `settings`
**الوظيفة:** إعدادات خاصة بكل مدرسة.

| العمود | النوع | الوصف |
|--------|------|-------|
| `id` | bigint (PK) | المعرف التلقائي |
| `key` | string (unique) | مفتاح الإعداد |
| `value` | text | قيمة الإعداد |
| `type` | string | نوع البيانات (string/number/boolean/json) |
| `tenant_id` | string | معرف المدرسة |
| `created_at` | timestamp | تاريخ الإنشاء |
| `updated_at` | timestamp | تاريخ التحديث |

**مثال:**
```json
{
  "school_name": "مدرسة النور الأهلية",
  "school_logo": "/storage/logos/school1.png",
  "max_students_per_class": 30,
  "academic_year": "2023-2024"
}
```

---

## 🔗 العلاقات بين الجداول

### العلاقات الرئيسية:

```
📦 grades (الصفوف)
   ├─→ students (1:N) - كل صف له عدة طلاب
   ├─→ subjects (1:N) - كل صف له عدة مواد
   ├─→ schedules (1:N) - كل صف له جدول
   └─→ exams (1:N) - كل صف له اختبارات

📦 students (الطلاب)
   ├─→ attendances (1:N) - سجل حضور الطالب
   ├─→ marks (1:N) - درجات الطالب
   ├─→ fees (1:N) - رسوم الطالب
   ├─→ payments (1:N) - مدفوعات الطالب
   ├─→ borrowings (1:N) - استعارات الطالب
   ├─→ notes (1:N) - ملاحظات على الطالب
   ├─→ user (1:1) - حساب الطالب
   └─→ parent (N:1) - ولي الأمر

📦 teachers (المعلمون)
   ├─→ subjects (1:N) - مواد المعلم
   ├─→ schedules (1:N) - جدول المعلم
   ├─→ assignments (1:N) - واجبات المعلم
   ├─→ notes (1:N) - ملاحظات المعلم
   └─→ user (1:1) - حساب المعلم

📦 subjects (المواد)
   ├─→ marks (1:N) - درجات المادة
   ├─→ schedules (1:N) - حصص المادة
   ├─→ exams (1:N) - اختبارات المادة
   ├─→ assignments (1:N) - واجبات المادة
   ├─→ teacher (N:1) - معلم المادة
   └─→ grade (N:1) - صف المادة

📦 users (المستخدمون)
   ├─→ student (1:1) - إذا كان طالباً
   ├─→ teacher (1:1) - إذا كان معلماً
   ├─→ parent (1:1) - إذا كان ولي أمر
   └─→ roles (N:M) - أدوار المستخدم
```

---

## 📊 إحصائيات قاعدة البيانات

### ملخص الجداول:

```yaml
القاعدة المركزية (school_system):
  - جداول Multi-Tenancy: 2
  - جداول المستخدمين: 3
  - جداول النظام: 6
  المجموع: 11 جدول

قاعدة بيانات كل مدرسة (tenant{id}):
  - جداول الصلاحيات: 5
  - جداول الطلاب: 6
  - جداول المعلمين: 2
  - جداول التقييم: 5
  - جداول المالية: 2
  - جداول إضافية: 5
  المجموع: 25 جدول تقريباً

الإجمالي الكلي: ~33-36 جدول
```

---

## 🎯 ملاحظات مهمة

### ⚠️ **أمور يجب مراعاتها:**

1. **الفهرسة (Indexing):**
   ```sql
   -- جميع أعمدة tenant_id مفهرسة
   -- جميع Foreign Keys مفهرسة
   -- أعمدة البحث الشائعة (email, phone) مفهرسة
   ```

2. **Soft Deletes:**
   ```php
   // معظم الجداول تستخدم Soft Deletes
   // للحفاظ على السجلات التاريخية
   $student->delete(); // لا يحذف فعلياً
   ```

3. **Timestamps:**
   ```php
   // جميع الجداول لها created_at و updated_at
   // للتتبع الزمني
   ```

4. **Tenant Isolation:**
   ```php
   // جميع الجداول في قاعدة بيانات المدرسة
   // لها عمود tenant_id للتأكيد الإضافي
   ```

---

## 🔍 استعلامات مفيدة

### معرفة حجم كل جدول:

```sql
SELECT 
    tablename,
    pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
```

### عدد السجلات في كل جدول:

```sql
SELECT 
    schemaname,
    tablename,
    n_live_tup AS row_count
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
```

---

## 📚 المراجع

- [Laravel Migrations Documentation](https://laravel.com/docs/migrations)
- [Tenancy for Laravel](https://tenancyforlaravel.com/docs)
- [PostgreSQL Documentation](https://www.postgresql.org/docs/)
- [Spatie Permissions](https://spatie.be/docs/laravel-permission)

---

**📝 ملاحظة:** هذا التصميم قابل للتطوير ويمكن إضافة جداول جديدة حسب الحاجة (مثل: جدول الإجازات، جدول الشهادات، إلخ).

**💡 نصيحة:** استخدم `php artisan migrate:status` لمعرفة حالة جميع الترحيلات.
