All checks were successful
CI / static-tests (push) Successful in 47s
CI / secret-scan (pull_request) Successful in 9s
CI / php-lint (pull_request) Successful in 23s
CI / static-tests (pull_request) Successful in 47s
CI / js-tests (pull_request) Successful in 25s
CI / secret-scan (push) Successful in 10s
CI / php-lint (push) Successful in 22s
CI / js-tests (push) Successful in 29s
Ouvre le domaine commande cote back-office (les commandes existent depuis P4 1a/1b et, depuis la borne L4, sont reellement creees). - App\Order\OrderQueryRepository (read-side, DatabaseInterface seul) : recent($limit) pour la liste admin + salesKpis() (CA encaisse paid+delivered, nb payees, panier moyen, CA/nb du jour, total, repartition par statut). - OrderAdminController : GET /admin/orders, permission order.read, liste lecture seule (numero, mode, chevalet, statut, total ttc, date). Les transitions deliver/cancel restent aux ecrans operationnels (hors back-office MVP). - StatsController : ferme la dette "KPIs de vente differes P4" -> section Ventes dans /admin/stats (CA, commandes payees, panier moyen, total). Hook orderQuery() = seam. - Nav "Commandes" (order.read) reactivee dans la sidebar (etait volontairement absente tant que la route n'existait pas). - Tests : OrderQueryRepositoryDbTest (integration, vraie DB : 3) + OrderAdminControllerTest (double : guard 403/200 + rendu) + StatsControllerTest (section Ventes). 350 PHP verts, PHPStan L6 propre. Routes verifiees live (302 -> login, gardees par SessionGuard).
50 lines
1.5 KiB
PHP
50 lines
1.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Controllers;
|
|
|
|
use App\Catalogue\StatsRepository;
|
|
use App\Core\Response;
|
|
use App\Order\OrderQueryRepository;
|
|
|
|
/**
|
|
* Tableau de bord statistiques (mlt domaine 11). GET /admin/stats, permission
|
|
* stats.read (landing par defaut du role manager, cf. seed role.default_route).
|
|
* En P3, les KPIs portent sur les donnees disponibles : compteurs de catalogue
|
|
* et sante du stock (RG-T21). Les KPIs de vente (CA, volumes) viendront avec le
|
|
* domaine commande (P4).
|
|
*
|
|
* Non `final` : les tests sous-classent (seam db()/statsRepository()).
|
|
*/
|
|
class StatsController extends AdminController
|
|
{
|
|
/**
|
|
* @param array<string, string> $params
|
|
*/
|
|
public function index(array $params = []): Response
|
|
{
|
|
$guard = $this->guard('stats.read');
|
|
if ($guard instanceof Response) {
|
|
return $guard;
|
|
}
|
|
|
|
return $this->adminView('admin/stats/index', [
|
|
'title' => 'Statistiques - Wakdo Admin',
|
|
'activeNav' => 'stats',
|
|
'counts' => $this->statsRepository()->counts(),
|
|
'stock' => $this->statsRepository()->stockHealth(),
|
|
'sales' => $this->orderQuery()->salesKpis(),
|
|
], $guard);
|
|
}
|
|
|
|
protected function statsRepository(): StatsRepository
|
|
{
|
|
return new StatsRepository($this->db());
|
|
}
|
|
|
|
protected function orderQuery(): OrderQueryRepository
|
|
{
|
|
return new OrderQueryRepository($this->db());
|
|
}
|
|
}
|