getInstalledVersion(); $latestRelease = $updates->fetchLatestRelease(); // depuis le cache Redis $updateAvailable = $latestRelease && version_compare($latestRelease['version'], $installedVersion, '>'); // Compteurs sources par statut $sourcesByStatus = Source::selectRaw('status, count(*) as total') ->groupBy('status') ->pluck('total', 'status') ->mapWithKeys(fn ($total, $status) => [ SourceStatus::from($status)->value => (int) $total, ]); $totalSources = $sourcesByStatus->sum(); $totalReleves = Releve::count(); // Utilisateurs par rôle $usersByRole = User::selectRaw('role, count(*) as total') ->groupBy('role') ->pluck('total', 'role'); $totalUsers = $usersByRole->sum(); // Sources en attente de validation $sourcesAValider = Source::with(['sourceType', 'depot']) ->where('status', SourceStatus::AValider) ->orderByDesc('updated_at') ->take(10) ->get(); // Relevés récents (10 derniers) $relevesRecents = Releve::with(['source.sourceType', 'createur']) ->orderByDesc('created_at') ->take(10) ->get(); // Activité mensuelle des 6 derniers mois (compatible MySQL et PostgreSQL) $driver = config('database.default'); if ($driver === 'pgsql') { $activiteMensuelle = Releve::selectRaw("to_char(date_trunc('month', created_at), 'Mon YYYY') as mois, count(*) as total") ->where('created_at', '>=', now()->subMonths(5)->startOfMonth()) ->groupByRaw("date_trunc('month', created_at)") ->orderByRaw("date_trunc('month', created_at)") ->get(); } else { $activiteMensuelle = Releve::selectRaw("DATE_FORMAT(MIN(created_at), '%b %Y') as mois, count(*) as total") ->where('created_at', '>=', now()->subMonths(5)->startOfMonth()) ->groupByRaw("YEAR(created_at), MONTH(created_at)") ->orderByRaw("YEAR(created_at), MONTH(created_at)") ->get(); } return view('admin.dashboard', compact( 'sourcesByStatus', 'totalSources', 'totalReleves', 'usersByRole', 'totalUsers', 'sourcesAValider', 'relevesRecents', 'activiteMensuelle', 'installedVersion', 'latestRelease', 'updateAvailable' )); } }