77dd16143c
DATE_FORMAT(created_at) dans SELECT sans GROUP BY correspondant viole ONLY_FULL_GROUP_BY (mode par défaut MySQL 5.7+). Correction : MIN(created_at) comme agrégat + GROUP BY YEAR()/MONTH(). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
77 lines
2.9 KiB
PHP
77 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Enums\SourceStatus;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Releve;
|
|
use App\Models\Source;
|
|
use App\Models\User;
|
|
use App\Services\UpdateService;
|
|
use Illuminate\View\View;
|
|
|
|
class DashboardController extends Controller
|
|
{
|
|
public function index(UpdateService $updates): View
|
|
{
|
|
$installedVersion = $updates->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'
|
|
));
|
|
}
|
|
}
|