ldc-gen-game-web/app/Http/Controllers/Bo/DashboardController.php
2026-10-20 12:27:49 +02:00

85 lines
3.2 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Http\Controllers\Bo;
use App\Http\Controllers\Controller;
use App\Models\Participation;
use App\Models\Settings;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Date;
use Illuminate\Support\Facades\DB;
class DashboardController extends Controller
{
/**
* Dashboard Page
*/
public function index(): View
{
// * Pour les stats.
/** @var Settings */
$settings = resolve(Settings::class);
$avgParticipUser = 0;
$statsUnique = [];
$query = DB::table(new Participation()->getTable());
$dateFrmtr = function (object $row): object {
$row->date = Date::parse($row->date)->isoFormat('DD/MM/YYYY');
return $row;
};
/** @var Collection<string, object> */
$participationsPerDay = (clone $query)
->selectRaw('COUNT(*) AS count, DATE(created_at) AS date')
->groupByRaw('DATE(created_at)')->get()->map($dateFrmtr)->keyBy('date');
/** @var Collection<object> */
$participationsUniquePerDay = (clone $query)
->selectRaw('DISTINCT customer_id AS user, COUNT(*) AS count, DATE(created_at) AS date')
->groupByRaw('DATE(created_at), user')->get()->map($dateFrmtr);
/** @var Collection<object> */
$participationsUniquePerCustomer = (clone $query)
->selectRaw('DISTINCT customer_id AS user, COUNT(*) AS count')
->groupBy('user')->orderBy('user')->get();
$participationsTotal = Participation::query()->count();
/** @var Collection<object> 3 codes EAN les plus utilisés */
$codesEan = (clone $query)
->selectRaw('COUNT(product_id) AS nb_usage, product_id, ean_code')
->join('products', 'product_id', '=', 'products.id')
->groupBy('product_id', 'ean_code')
->orderByDesc('nb_usage')->limit(3)->get();
$participationsUniquePerDay->each(function (object $row) use (&$statsUnique): void {
Arr::set($statsUnique, $row->date, (Arr::get($statsUnique, $row->date) ?? 0) + 1);
});
// * Calcul participation moyenne par utilisateur.
if ($participationsUniquePerCustomer->count() > 0) {
$avgParticipUser = round($participationsTotal / $participationsUniquePerCustomer->count(), 1);
}
now()->lt($settings->end_date) ? now() : $settings->end_date;
$dates = $participationsPerDay->keys();
$count = $participationsPerDay->pluck('count');
$countUnique = $dates->map(fn (string $formated_date) => Arr::get($statsUnique, $formated_date, 0));
/** @var view-string $view */
$view = 'back::pages.dashboard.index';
return view($view, [
'dates' => $dates,
'count' => $count,
'countUnique' => $countUnique,
'participationsTotal' => $participationsTotal,
'avgParticipUser' => $avgParticipUser,
'codesEan' => $codesEan,
'settings' => $settings,
]);
}
}