validate([ 'structure_name' => 'required|string|max:255|unique:structures,name', 'name' => 'required|string|max:255', 'email' => 'required|string|lowercase|email|max:255|unique:'.User::class, 'password' => ['required', 'confirmed', Rules\Password::defaults()], ]); // 1. Créer la structure (Tenant) // Le slug est généré avec un uniqid() pour éviter les conflits si deux noms produisent le même slug. $structure = \App\Models\Structure::create([ 'name' => $request->structure_name, 'slug' => \Illuminate\Support\Str::slug($request->structure_name) . '-' . substr(uniqid(), -5), 'is_active' => true, ]); // 2. Définir le contexte Tenant pour que Spatie attache les rôles à cette structure-ci config(['tenant.structure_id' => $structure->id]); setPermissionsTeamId($structure->id); // 3. Création des rôles par défaut pour le nouveau locataire $adminRole = \App\Models\Role::firstOrCreate(['name' => 'Admin']); \App\Models\Role::firstOrCreate(['name' => 'Agent']); \App\Models\Role::firstOrCreate(['name' => 'Manager']); \App\Models\Role::firstOrCreate(['name' => 'RH']); // 4. Créer le premier compte Administrateur $user = User::withoutGlobalScope('structure')->create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), 'structure_id' => $structure->id, ]); // Affectation du rôle $user->assignRole($adminRole); event(new Registered($user)); Auth::login($user); return redirect(route('dashboard', absolute: false)); } }