diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 6b901f8..c133996 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -2,24 +2,18 @@ namespace Database\Seeders; -use App\Models\User; -use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { - use WithoutModelEvents; - - /** - * Seed the application's database. - */ public function run(): void { - // User::factory(10)->create(); - - User::factory()->create([ - 'name' => 'Test User', - 'email' => 'test@example.com', + // Order matters: Roles FIRST (FK deps), then System, then Schools, then Private + $this->call([ + RolesSeeder::class, + SystemTenantSeeder::class, + MusterschuleSeeder::class, + PrivatBobanSeeder::class, ]); } } diff --git a/database/seeders/MusterschuleSeeder.php b/database/seeders/MusterschuleSeeder.php new file mode 100644 index 0000000..c43858b --- /dev/null +++ b/database/seeders/MusterschuleSeeder.php @@ -0,0 +1,55 @@ + 'Musterschule Wien'], + ['type' => 'school', 'active' => true] + ); + + $license = License::withoutGlobalScopes()->firstOrCreate( + ['tenant_id' => $school->id, 'type' => 'school_flat'], + ['seats' => null, 'expires_at' => now()->addYear(), 'active' => true] + ); + + $users = [ + ['email' => 'schuladmin@musterschule.at', 'name' => 'Schuladmin Muster', 'role' => 'school-admin'], + ['email' => 'lehrer@musterschule.at', 'name' => 'Lehrerin Muster', 'role' => 'teacher'], + ['email' => 'kind1@musterschule.at', 'name' => 'Kind 1', 'role' => 'child'], + ['email' => 'kind2@musterschule.at', 'name' => 'Kind 2', 'role' => 'child'], + ]; + + foreach ($users as $data) { + $user = \App\Models\User::withoutGlobalScopes()->firstOrCreate( + ['email' => $data['email']], + ['name' => $data['name'], 'tenant_id' => $school->id, 'password' => Hash::make('password')] + ); + + $role = Role::where('name', $data['role'])->first(); + DB::table('role_user')->updateOrInsert( + ['user_id' => $user->id], + ['role_id' => $role->id, 'created_at' => now(), 'updated_at' => now()] + ); + + if ($data['role'] === 'child') { + DB::table('license_assignments')->insertOrIgnore([ + 'license_id' => $license->id, + 'user_id' => $user->id, + 'created_at' => now(), + 'updated_at' => now(), + ]); + } + } + } +} diff --git a/database/seeders/PrivatBobanSeeder.php b/database/seeders/PrivatBobanSeeder.php new file mode 100644 index 0000000..8f44331 --- /dev/null +++ b/database/seeders/PrivatBobanSeeder.php @@ -0,0 +1,66 @@ + 'Privat Boban'], + ['type' => 'private', 'active' => true] + ); + + $license = License::withoutGlobalScopes()->firstOrCreate( + ['tenant_id' => $privat->id, 'type' => 'per_student'], + ['seats' => 5, 'expires_at' => now()->addYear(), 'active' => true] + ); + + $users = [ + ['email' => 'boban@lernschiff.com', 'name' => 'Boban Blaskovic', 'role' => 'parent'], + ['email' => 'kind.boban@lernschiff.com', 'name' => 'Kind Boban', 'role' => 'child'], + ]; + + $createdUsers = []; + foreach ($users as $data) { + $user = \App\Models\User::withoutGlobalScopes()->firstOrCreate( + ['email' => $data['email']], + ['name' => $data['name'], 'tenant_id' => $privat->id, 'password' => Hash::make('password')] + ); + + $role = Role::where('name', $data['role'])->first(); + DB::table('role_user')->updateOrInsert( + ['user_id' => $user->id], + ['role_id' => $role->id, 'created_at' => now(), 'updated_at' => now()] + ); + + if ($data['role'] === 'child') { + DB::table('license_assignments')->insertOrIgnore([ + 'license_id' => $license->id, + 'user_id' => $user->id, + 'created_at' => now(), + 'updated_at' => now(), + ]); + } + + $createdUsers[$data['role']] = $user; + } + + // Link parent ↔ child (cross-tenant-capable via withoutGlobalScope on children() relation) + if (isset($createdUsers['parent'], $createdUsers['child'])) { + $parent = $createdUsers['parent']; + $child = $createdUsers['child']; + // Avoid duplicate attach + if (!$parent->children()->withoutGlobalScope(\App\Scopes\TenantScope::class)->where('child_id', $child->id)->exists()) { + $parent->children()->attach($child->id); + } + } + } +} diff --git a/database/seeders/RolesSeeder.php b/database/seeders/RolesSeeder.php new file mode 100644 index 0000000..45d85b1 --- /dev/null +++ b/database/seeders/RolesSeeder.php @@ -0,0 +1,16 @@ + $name]); + } + } +} diff --git a/database/seeders/SystemTenantSeeder.php b/database/seeders/SystemTenantSeeder.php new file mode 100644 index 0000000..473c6b3 --- /dev/null +++ b/database/seeders/SystemTenantSeeder.php @@ -0,0 +1,35 @@ + 'system'], + ['name' => 'System', 'active' => true] + ); + + $admin = \App\Models\User::withoutGlobalScopes()->firstOrCreate( + ['email' => 'admin@lernschiff.com'], + [ + 'name' => 'Platform Admin', + 'tenant_id' => $system->id, + 'password' => Hash::make('password'), + ] + ); + + $role = Role::where('name', 'platform-admin')->first(); + DB::table('role_user')->updateOrInsert( + ['user_id' => $admin->id], + ['role_id' => $role->id, 'created_at' => now(), 'updated_at' => now()] + ); + } +}