Aligne les controleurs admin sur le contrat byan-api.md / conventions.md :
un conflit remonte par la base (SQLSTATE 23000) renvoie 409 Conflict, pas 422.
Couvre la suppression dure bloquee par une FK RESTRICT (Product, Menu) et la
course d'unicite slug/name a l'insertion (Category). La validation simple en
amont (champ/format/bornes, PIN invalide, acteur verrouille) et la
pre-verification nameExists/slugExists restent en 422.
renderDelete gagne un parametre de statut optionnel (defaut inchange).
Tests : assertions de conflit flippees en 409 (TDD). 201 tests, 597 assertions,
PHPStan L6 propre.