# تطبيق الأعلام الإدارية (Admin Flags) بدلاً من الأدوار

## المشكلة
عند استخدام `php artisan shield:generate --all` يتم حذف جميع التعديلات في ملفات Policy، لذلك لا يمكن الاعتماد على UserPolicy لحماية المستخدمين.

## الحل
استخدام أعمدة في جدول `users` بدلاً من الأدوار:
- `is_system_admin` → بدلاً من دور `super_admin`
- `is_tenant_owner` → بدلاً من دور `tenant_owner`

---

## الملفات المعدلة

### 1. Migration
**الملف:** `database/migrations/2026_01_23_214350_add_admin_flags_to_users_table.php`

```php
public function up(): void
{
    Schema::table('users', function (Blueprint $table) {
        $table->boolean('is_tenant_owner')->default(false)->after('tenant_id');
        $table->boolean('is_system_admin')->default(false)->after('is_tenant_owner');
    });
}
```

**الحالة:** ✅ تم التنفيذ

---

### 2. User Model
**الملف:** `app/Models/User.php`

**التعديلات:**
- إضافة `is_tenant_owner` و `is_system_admin` إلى `$fillable`
- إضافة cast للقيم البوليانية

```php
protected $fillable = [
    // ... الحقول الأخرى
    'is_tenant_owner',
    'is_system_admin',
];

protected $casts = [
    // ... الحقول الأخرى
    'is_tenant_owner' => 'boolean',
    'is_system_admin' => 'boolean',
];
```

---

### 3. UserObserver
**الملف:** `app/Observers/UserObserver.php`

**التغيير:**
```php
// قبل
if ($user->hasRole('super_admin')) { ... }

// بعد
if ($user->is_system_admin) { ... }
```

**الفحوصات:**
- منع حذف مدير النظام
- منع حذف آخر مالك مؤسسة

---

### 4. UsersTable
**الملف:** `app/Filament/Resources/Users/Tables/UsersTable.php`

**التعديلات:**
1. إضافة IconColumn لعرض الأعلام بصرياً:
```php
IconColumn::make('is_system_admin')
    ->label('مدير النظام')
    ->boolean()
    ->trueIcon('heroicon-o-shield-check')
    ->trueColor('danger'),

IconColumn::make('is_tenant_owner')
    ->label('مالك المؤسسة')
    ->boolean()
    ->trueIcon('heroicon-o-star')
    ->trueColor('success'),
```

2. تحديث visibility checks:
```php
// قبل
->visible(fn() => auth()->user()?->hasRole('super_admin') ?? false)

// بعد
->visible(fn() => auth()->user()?->is_system_admin ?? false)
```

3. تحديث شرط إخفاء زر الحذف:
```php
// قبل
if ($record->hasRole('super_admin')) return false;

// بعد
if ($record->is_system_admin) return false;
```

---

### 5. UserForm
**الملف:** `app/Filament/Resources/Users/Schemas/UserForm.php`

**التعديلات:**
1. إضافة Toggle fields:
```php
Toggle::make('is_system_admin')
    ->label('مدير النظام (System Admin)')
    ->visible(fn() => auth()->user()?->is_system_admin ?? false),

Toggle::make('is_tenant_owner')
    ->label('مالك المؤسسة (Tenant Owner)')
    ->visible(fn() => auth()->user()?->is_system_admin ?? false),
```

2. تحديث شروط الظهور:
```php
// قبل
->visible(fn() => auth()->user()?->hasRole('super_admin'))

// بعد
->visible(fn() => auth()->user()?->is_system_admin)
```

---

### 6. CreateUser
**الملف:** `app/Filament/Resources/Users/Pages/CreateUser.php`

```php
// قبل
if (!auth()->user()->hasRole('super_admin')) {
    $data['tenant_id'] = auth()->user()->tenant_id;
}

// بعد
if (!auth()->user()->is_system_admin) {
    $data['tenant_id'] = auth()->user()->tenant_id;
}
```

---

### 7. TenantScope
**الملف:** `app/Models/Scopes/TenantScope.php`

```php
// قبل
if ($user->hasRole('super_admin') && is_null($user->tenant_id)) {
    return;
}

// بعد
if ($user->is_system_admin && is_null($user->tenant_id)) {
    return;
}
```

---

### 8. SetTenantFromSession Middleware
**الملف:** `app/Http/Middleware/SetTenantFromSession.php`

```php
// قبل
if ($user->hasRole('super_admin')) {
    $selectedTenantId = session('super_admin_viewing_tenant_id');
    // ...
}

// بعد
if ($user->is_system_admin) {
    $selectedTenantId = session('super_admin_viewing_tenant_id');
    // ...
}
```

---

### 9. CheckSubscription Middleware
**الملف:** `app/Http/Middleware/CheckSubscription.php`

```php
// قبل
if ($user->hasRole('super_admin')) {
    return $next($request);
}

// بعد
if ($user->is_system_admin) {
    return $next($request);
}
```

---

### 10. AppServiceProvider (Gates)
**الملف:** `app/Providers/AppServiceProvider.php`

**التغييرات في جميع الـ Gates:**

```php
// قبل
Gate::before(function ($user) {
    if ($user->hasRole('super_admin')) {
        return true;
    }
    return null;
});

// بعد
Gate::before(function ($user) {
    if ($user->is_system_admin) {
        return true;
    }
    return null;
});
```

**الـ Gates المحدثة:**
- `Gate::before()` - للـ System Admin
- `access-tenant` - الوصول للمؤسسة
- `create-in-tenant` - الإنشاء في المؤسسة
- `manage-tenant` - إدارة المؤسسة (Tenant Owner)

---

### 11. TenantSwitcher Page
**الملف:** `app/Filament/Pages/TenantSwitcher.php`

```php
// قبل
public static function canAccess(): bool
{
    return auth()->user()?->hasRole('super_admin') ?? false;
}

// بعد
public static function canAccess(): bool
{
    return auth()->user()?->is_system_admin ?? false;
}
```

---

### 12. TenantResource
**الملف:** `app/Filament/Resources/Tenants/TenantResource.php`

```php
// قبل
public static function canAccess(): bool
{
    return auth()->user()?->hasRole('super_admin') ?? false;
}

// بعد
public static function canAccess(): bool
{
    return auth()->user()?->is_system_admin ?? false;
}
```

---

### 13. DatabaseSeeder
**الملف:** `database/seeders/DatabaseSeeder.php`

```php
$adminUser = User::updateOrCreate(
    ['email' => 'admin@admin.com'],
    [
        'name' => 'Admin User',
        'password' => bcrypt('password'),
        'email_verified_at' => now(),
        'is_system_admin' => true,  // ✅ إضافة هذا السطر
    ]
);
```

---

## الأوامر المنفذة

### 1. تشغيل الـ Migration
```bash
php artisan migrate
```
✅ **النتيجة:** تمت إضافة العمودين `is_system_admin` و `is_tenant_owner` بنجاح

### 2. تحديث مستخدم Admin الموجود
```bash
php artisan tinker --execute="User::where('email', 'admin@admin.com')->update(['is_system_admin' => true]);"
```
✅ **النتيجة:** تم تحديث المستخدم بنجاح

---

## ملخص التغييرات

### الفوائد
✅ **حماية من فقدان التعديلات:** لن يتم حذف الحماية عند تشغيل `shield:generate --all`  
✅ **أداء أفضل:** فحص العمود أسرع من فحص العلاقات  
✅ **وضوح أكبر:** الأعلام واضحة ومباشرة في قاعدة البيانات  
✅ **سهولة الصيانة:** كل الفحوصات في مكان واحد (Observer + Middleware)  

### النمط المستخدم
```php
// ❌ القديم (معرض للحذف)
if ($user->hasRole('super_admin')) { ... }
if ($user->hasRole('tenant_owner')) { ... }

// ✅ الجديد (محمي)
if ($user->is_system_admin) { ... }
if ($user->is_tenant_owner) { ... }
```

---

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

1. **UserPolicy لن يُستخدم لحماية المستخدمين** لأن Shield يعيد توليده
2. **الحماية موجودة في:**
   - UserObserver (منع الحذف)
   - UsersTable (إخفاء زر الحذف)
   - UserForm (التحكم في الصلاحيات)
3. **الأدوار (Roles) ما زالت مستخدمة** لصلاحيات Filament Shield الأخرى
4. **is_system_admin** له صلاحيات كاملة عبر جميع المؤسسات
5. **is_tenant_owner** له صلاحيات كاملة داخل مؤسسته فقط

---

## الخطوات التالية

### للاختبار:
1. تسجيل الدخول بـ `admin@admin.com` / `password`
2. إنشاء مؤسسة جديدة
3. إنشاء مستخدم جديد وتعيينه كـ `is_tenant_owner`
4. محاولة حذف:
   - مدير النظام → ممنوع ✅
   - آخر مالك مؤسسة → ممنوع ✅
   - مستخدم عادي → مسموح ✅

### إذا كنت بحاجة لـ Resources أخرى:
جميع Resources التي تحتوي على `hasRole('super_admin')` يجب تحديثها إلى `is_system_admin`

**البحث عن الملفات المتبقية:**
```bash
grep -r "hasRole('super_admin')" app/
```

---

## تم الانتهاء ✅

تم تطبيق نظام الأعلام الإدارية بنجاح في:
- 13 ملف معدل
- 1 migration منفذ
- 1 مستخدم محدث

النظام الآن محمي من إعادة توليد Shield! 🎉
