User::where('is_active', true)->where('role', 'user')->count(), 'users_inactive' => User::where('is_active', false)->where('role', 'user')->count(), 'users_total' => User::where('role', 'user')->count(), 'projects_total' => TranscriptionProject::count(), 'projects_pending' => TranscriptionProject::where('transcription_status', 'pending')->count(), 'projects_processing' => TranscriptionProject::where('transcription_status', 'processing')->count(), 'projects_completed' => TranscriptionProject::where('transcription_status', 'completed')->count(), 'projects_failed' => TranscriptionProject::where('transcription_status', 'failed')->count(), 'projects_deleted' => TranscriptionProject::onlyTrashed()->count(), 'projects_last_7' => TranscriptionProject::where('created_at', '>=', now()->subDays(7))->count(), 'projects_last_30' => TranscriptionProject::where('created_at', '>=', now()->subDays(30))->count(), 'storage_bytes' => (int) TranscriptionProject::sum('file_size'), 'storage_completed_bytes' => (int) TranscriptionProject::where('transcription_status', 'completed')->sum('file_size'), 'duration_total_seconds' => (int) TranscriptionProject::whereNotNull('duration_seconds')->sum('duration_seconds'), ]; // Top 5 pengguna paling aktif (by project count) $topUsers = User::where('role', 'user') ->withCount('ownedProjects') ->orderByDesc('owned_projects_count') ->limit(5) ->get(['id', 'name', 'email']); // Trend projek 30 hari lepas (group by date) $trendRaw = TranscriptionProject::select( DB::raw('DATE(created_at) as date'), DB::raw('COUNT(*) as total'), DB::raw('SUM(CASE WHEN transcription_status = "completed" THEN 1 ELSE 0 END) as completed'), DB::raw('SUM(CASE WHEN transcription_status = "failed" THEN 1 ELSE 0 END) as failed') ) ->where('created_at', '>=', now()->subDays(29)->startOfDay()) ->groupBy(DB::raw('DATE(created_at)')) ->orderBy('date') ->get(); // Projek mengikut jabatan (metadata sahaja) $deptStats = Department::select('departments.name') ->selectRaw('COUNT(tp.id) as project_count') ->leftJoin('users', 'users.department_id', '=', 'departments.id') ->leftJoin('transcription_projects as tp', 'tp.owner_user_id', '=', 'users.id') ->where('departments.is_active', true) ->groupBy('departments.id', 'departments.name') ->orderByDesc('project_count') ->limit(8) ->get(); return view('admin.dashboard', compact('stats', 'topUsers', 'trendRaw', 'deptStats')); } }