vernova/database/seeders/UserSeeder.php
2026-07-26 19:58:27 +03:30

104 lines
3.8 KiB
PHP

<?php
namespace Database\Seeders;
use App\Models\Tenant;
use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
use Spatie\Permission\Models\Role;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*
* Creates sample users across tenants and assigns Spatie roles.
*
* Users:
* 1. Super Admin — platform-wide, no tenant
* 2. Admin — tenant 1 (Sepideh)
* 3. Project Mgr — tenant 1 (Sepideh)
* 4. Admin — tenant 2 (Global)
*/
public function run(): void
{
$tenant1 = Tenant::where('slug', 'sepideh')->firstOrFail();
$tenant2 = Tenant::where('slug', 'global')->firstOrFail();
$users = [
[
'tenant_id' => null,
'name' => 'Super Admin',
'email' => 'admin@projectra.ir',
'password' => Hash::make('password'),
'locale' => 'fa',
'preferred_calendar' => 'jalali',
'is_active' => true,
'email_verified_at' => now(),
'role' => 'super-admin',
],
[
'tenant_id' => $tenant1->id,
'name' => 'محمد احمدی',
'email' => 'admin@sepideh.ir',
'password' => Hash::make('password'),
'locale' => 'fa',
'preferred_calendar' => 'jalali',
'is_active' => true,
'email_verified_at' => now(),
'role' => 'admin',
],
[
'tenant_id' => $tenant1->id,
'name' => 'علی رضایی',
'email' => 'manager@sepideh.ir',
'password' => Hash::make('password'),
'locale' => 'fa',
'preferred_calendar' => 'jalali',
'is_active' => true,
'email_verified_at' => now(),
'role' => 'project-manager',
],
[
'tenant_id' => $tenant2->id,
'name' => 'John Smith',
'email' => 'admin@global.com',
'password' => Hash::make('password'),
'locale' => 'en',
'preferred_calendar' => 'gregorian',
'is_active' => true,
'email_verified_at' => now(),
'role' => 'admin',
],
];
foreach ($users as $userData) {
$roleName = $userData['role'];
unset($userData['role']);
$user = User::create($userData);
// Assign the Spatie role. For tenant-scoped users, scope the role
// to their tenant; for super-admin, use the global (null tenant) role.
if ($user->tenant_id) {
$role = Role::where('name', $roleName)
->where('tenant_id', $user->tenant_id)
->first();
} else {
$role = Role::where('name', $roleName)
->whereNull('tenant_id')
->first();
}
if ($role) {
$user->assignRole($role);
} else {
$this->command->warn("Role '{$roleName}' not found for user {$user->email}. Skipping role assignment.");
}
}
$this->command->info('Users seeded: ' . count($users) . ' records created with roles.');
}
}