subDays(29)->startOfDay(); // Nombre de séances complétées par jour, sur la fenêtre glissante de 30 jours. $countsByDay = WorkoutSession::query() ->where('status', WorkoutSessionStatus::Completed) ->where('started_at', '>=', $start) ->selectRaw('DATE(started_at) as day, COUNT(*) as total') ->groupBy('day') ->pluck('total', 'day'); $labels = []; $data = []; // On matérialise chaque jour (même sans séance) pour un axe continu. for ($offset = 0; $offset < 30; $offset++) { $date = $start->copy()->addDays($offset); $key = $date->format('Y-m-d'); $labels[] = $date->format('d/m'); $data[] = (int) ($countsByDay[$key] ?? 0); } return [ 'datasets' => [ [ 'label' => 'Séances complétées', 'data' => $data, 'backgroundColor' => '#f59e0b', 'borderRadius' => 4, ], ], 'labels' => $labels, ]; } protected function getType(): string { return 'bar'; } }