Commit 2f4c631c authored by Mahmoud Aglan's avatar Mahmoud Aglan

Enforce single-academy-per-instance architecture in seeders

DatabaseSeeder now uses Academy::first() — never creates duplicates. If
the wizard already created an academy, the seeder respects it and just
ensures the env-var admin user is super_admin on that academy.

FinancialAccountsSeeder no longer has a hardcoded 'el-captain' fallback;
it skips gracefully if no academy exists yet.
Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent c22fdd7b
......@@ -2,38 +2,38 @@
namespace Database\Seeders;
use App\Domain\Identity\Models\Branch;
use App\Domain\Identity\Models\Role;
use App\Domain\Shared\Models\Academy;
use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$academyNameEn = env('ACADEMY_NAME_EN', 'El Captain Academy');
$academyNameAr = env('ACADEMY_NAME_AR', 'أكاديمية الكابتن');
$adminEmail = env('ADMIN_EMAIL', 'admin@oc-sport.com');
$adminEmail = env('ADMIN_EMAIL', 'admin@elcaptain.com');
$adminPassword = env('ADMIN_PASSWORD', 'Alarcade123#');
$adminName = env('ADMIN_NAME', $academyNameAr);
$adminName = env('ADMIN_NAME', env('ACADEMY_NAME_AR', 'أكاديمية الكابتن'));
$slug = \Illuminate\Support\Str::slug($academyNameEn);
$academy = Academy::firstOrCreate(
['slug' => $slug],
[
'name' => $academyNameEn,
'name_ar' => $academyNameAr,
'slug' => $slug,
// Single academy per instance — use whatever exists, only create if empty
$academy = Academy::first();
if (!$academy) {
$academy = Academy::create([
'name' => env('ACADEMY_NAME_EN', 'El Captain Academy'),
'name_ar' => env('ACADEMY_NAME_AR', 'أكاديمية الكابتن'),
'slug' => Str::slug(env('ACADEMY_NAME_EN', 'El Captain Academy')),
'email' => $adminEmail,
'currency' => 'EGP',
'timezone' => 'Africa/Cairo',
'locale' => 'ar',
'status' => 'active',
]
);
]);
}
// Admin user — always on THE academy
$admin = User::firstOrCreate(
['email' => $adminEmail],
[
......@@ -46,30 +46,31 @@ public function run(): void
]
);
// Ensure admin is on the correct academy
if ($admin->academy_id !== $academy->id) {
$admin->update(['academy_id' => $academy->id]);
}
$this->call(FinancialAccountsSeeder::class);
$this->call(RolesAndPermissionsSeeder::class); // Creates roles (needed before PermissionSeeder)
$this->call(PermissionSeeder::class); // Authoritative permission+scope assignments
$this->call(RolesAndPermissionsSeeder::class);
$this->call(PermissionSeeder::class);
$this->call(PaymentNotificationTemplateSeeder::class);
// Assign academy_owner role to the admin user (check user's own academy first)
$ownerRole = Role::where('academy_id', $admin->academy_id)
// Assign academy_owner role + super_admin
$ownerRole = Role::where('academy_id', $academy->id)
->where('slug', 'academy_owner')
->first()
?? Role::where('academy_id', $academy->id)
->where('slug', 'academy_owner')
->first();
->first();
$branch = Branch::where('academy_id', $academy->id)->first();
// Ensure admin has branch assigned
$branch = \App\Domain\Identity\Models\Branch::where('academy_id', $admin->academy_id)->first();
$branchId = $branch?->id ?? $admin->branch_id;
$admin->update([
'role_id' => $ownerRole?->id ?? $admin->role_id,
'is_super_admin' => true,
'branch_id' => $branch?->id ?? $admin->branch_id,
]);
if ($ownerRole) {
$admin->update(['role_id' => $ownerRole->id, 'is_super_admin' => true, 'branch_id' => $branchId]);
if (!$admin->roles()->where('role_id', $ownerRole->id)->exists()) {
$admin->roles()->attach($ownerRole->id);
}
} else {
$admin->update(['is_super_admin' => true, 'branch_id' => $branchId]);
if ($ownerRole && !$admin->roles()->where('role_id', $ownerRole->id)->exists()) {
$admin->roles()->attach($ownerRole->id);
}
}
}
......@@ -12,17 +12,9 @@ public function run(): void
{
$academy = Academy::first();
if (! $academy) {
$academy = Academy::create([
'name' => 'El Captain Academy',
'name_ar' => 'أكاديمية الكابتن',
'slug' => 'el-captain',
'email' => 'info@elcaptain.com',
'currency' => 'EGP',
'timezone' => 'Africa/Cairo',
'locale' => 'ar',
'status' => 'active',
]);
if (!$academy) {
$this->command->warn('No academy exists yet — skipping financial accounts seeder.');
return;
}
$accounts = [
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment