# 📋 Guide du Système de Permissions Amélioré

## 🎯 Comment ça marche ?

Au lieu de définir les permissions manuellement dans le seeder, tu définis maintenant les permissions **directement dans chaque controller** via la méthode `getPermissions()`.

### Structure de base

```php
class MonController extends AdminController
{
    public function __construct()
    {
        parent::__construct();
    }

    public static function getPermissions(): array
    {
        return [
            'view' => 'Voir',
            'create' => 'Créer',
            'edit' => 'Modifier',
            'delete' => 'Supprimer',
            // ✨ Ajoute tes actions personnalisées
            'export' => 'Exporter',
            'search' => 'Rechercher',
            'devis' => 'Voir les devis',
        ];
    }
}
```

## 📌 Important : Le parent::__construct()

Si ton controller surcharge `__construct()`, **tu DOIS appeler `parent::__construct()`** :

```php
class ClientController extends AdminController
{
    public function __construct(private ClientService $clients)
    {
        parent::__construct();  // ✅ IMPORTANT
    }
}
```

## 📝 Exemples

### Exemple 1 : UserController avec action personnalisée

```php
class UserController extends AdminController
{
    public static function getPermissions(): array
    {
        return [
            'view' => 'Voir',
            'create' => 'Créer',
            'edit' => 'Modifier',
            'delete' => 'Supprimer',
            'mon_compte' => 'Accès au compte personnel',
            'updateAccount' => 'Modifier son compte',
        ];
    }

    public function mon_compte() { /* ... */ }
    public function updateAccount(Request $request) { /* ... */ }
}
```

Cela créera les permissions :
- `users.view`
- `users.create`
- `users.edit`
- `users.delete`
- `users.mon_compte`
- `users.updateAccount`

### Exemple 2 : ClientController

```php
class ClientController extends AdminController
{
    public static function getPermissions(): array
    {
        return [
            'view' => 'Voir',
            'create' => 'Créer',
            'edit' => 'Modifier',
            'delete' => 'Supprimer',
            'devis' => 'Voir les devis',
            'factures' => 'Voir les factures',
            'interventions' => 'Voir les interventions',
            'commandes' => 'Voir les commandes',
            'chantiers' => 'Voir les chantiers',
        ];
    }
}
```

Permissions créées :
- `clients.view`, `clients.create`, `clients.edit`, `clients.delete`
- `clients.devis`, `clients.factures`, `clients.interventions`, `clients.commandes`, `clients.chantiers`

## 🚀 Mise à jour du Seeder

Une fois que tu as défini les permissions dans tes controllers, exécute le seeder :

```bash
php artisan db:seed --class=Database\\Seeders\\Users\\PermissionRoleSeeder
```

Le seeder va :
1. Parcourir tous les controllers qui héritent d'`AdminController`
2. Lire les permissions définies dans `getPermissions()`
3. Les créer en base de données automatiquement

## 🔐 Vérifier les permissions dans les Blade

```blade
@can('clients.devis')
    <a href="{{ route('clients.devis', $client) }}">
        Voir les devis
    </a>
@endcan
```

## 📦 Avantages

✅ **Centralisé** : Les permissions sont définies au même endroit que le code  
✅ **Automatique** : Pas besoin de les ajouter manuellement au seeder  
✅ **Flexible** : Supporte les actions CRUD standard + actions personnalisées  
✅ **Maintenable** : Ajout facile de nouvelles permissions

## ⚠️ Checklist pour ajouter des permissions à un controller

- [ ] Le controller hérIte d'`AdminController`
- [ ] `public function __construct()` appelle `parent::__construct()`
- [ ] `getPermissions()` retourne un array des actions
- [ ] Chaque méthode du controller existe
- [ ] Exécuter le seeder : `php artisan db:seed`

## 🧪 Test

Pour vérifier que les permissions sont bien créées :

```bash
php artisan tinker
> Spatie\Permission\Models\Permission::pluck('name')
```

Ou dans les Blade templates :

```blade
@if(Auth::user()->hasPermissionTo('clients.devis'))
    Accès accordé ✅
@endif
```
