corentin_wakdo/src/app/Controllers/StatsController.php
Imugiii 70388318ea
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
feat(admin): liste des commandes + KPIs de vente (P4)
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).
2026-06-19 18:22:37 +00:00

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());
}
}