roleRepository = $roleRepository; } /** * Execute the console command. * * @return mixed */ public function handle() { $this->info('Starting permission sync for company admin roles...'); // First, scan and sync all module permissions $this->info('Scanning module permissions...'); $result = $this->roleRepository->synchModulePermissions(true); $this->info('Permissions scanned:'); $this->info(' - Created: ' . count($result['created'])); $this->info(' - Deleted: ' . count($result['deleted'])); // Clear permission cache app(PermissionRegistrar::class)->forgetCachedPermissions(); app()['cache']->forget('spatie.permission.cache'); // Get all available permissions $allPermissions = Permission::all(); $this->info('Total permissions available: ' . $allPermissions->count()); // Get company admin roles $companyId = $this->option('company-id'); $force = $this->option('force'); if ($companyId) { $companyAdminRoles = Role::where('name', 'company_manager') ->where('company_id', $companyId) ->get(); if ($companyAdminRoles->isEmpty()) { $this->error("No company admin role found for company ID: {$companyId}"); return 1; } } else { $companyAdminRoles = Role::where('name', 'company_manager')->get(); } if ($companyAdminRoles->isEmpty()) { $this->error('No company admin roles found in the system!'); return 1; } $this->info('Found ' . $companyAdminRoles->count() . ' company admin role(s)'); // Progress bar $progressBar = $this->output->createProgressBar($companyAdminRoles->count()); $progressBar->start(); $syncedCount = 0; $skippedCount = 0; foreach ($companyAdminRoles as $role) { $this->line(''); // New line for better readability $this->info("Processing company admin role for company ID: {$role->company_id}"); // Get permissions that exclude settings.access (company admins shouldn't have full settings access) $permissionsToSync = $allPermissions->where('name', '!=', 'settings.access'); // Get current permissions for this role $currentPermissions = $role->permissions()->pluck('name')->toArray(); $permissionsToAdd = []; foreach ($permissionsToSync as $permission) { if (!in_array($permission->name, $currentPermissions) || $force) { $permissionsToAdd[] = $permission->name; } } if (!empty($permissionsToAdd)) { if ($force) { // Force sync - replace all permissions $role->syncPermissions($permissionsToSync->pluck('name')->toArray()); $this->info(" → Force synced {$permissionsToSync->count()} permissions"); } else { // Add only missing permissions $role->givePermissionTo($permissionsToAdd); $this->info(" → Added " . count($permissionsToAdd) . " missing permissions"); } $syncedCount++; } else { $this->info(" → No new permissions to add"); $skippedCount++; } $progressBar->advance(); } $progressBar->finish(); $this->line(''); $this->line(''); // Summary $this->info('=== SYNC SUMMARY ==='); $this->info("Roles processed: {$companyAdminRoles->count()}"); $this->info("Roles updated: {$syncedCount}"); $this->info("Roles skipped: {$skippedCount}"); $this->info("Total permissions: {$allPermissions->count()}"); // Show some specific permissions that were synced $assistantPermissions = $allPermissions->where('name', 'like', 'reporting.assistant%'); if ($assistantPermissions->count() > 0) { $this->info(''); $this->info('Assistant permissions available:'); foreach ($assistantPermissions as $perm) { $this->info(" - {$perm->name}"); } } $this->info(''); $this->info('✅ Permission sync completed successfully!'); return 0; } }