OrderStatusController
extends AbstractController
in package
Pilote le cycle de vie des commandes via des points d'entrée JSON consommés par le back-office.
Toutes les actions renvoient du JSON et sont destinées à des appels AJAX depuis les écrans de gestion des commandes. Le contrôleur traduit les statuts « anglais » envoyés par l'interface vers les constantes métier de Order, refuse les transitions non autorisées, met à jour les informations de livraison, journalise chaque changement via AuditLogger et notifie le client par email (échec d'envoi non bloquant).
Aucun préfixe de route au niveau de la classe. Authentification complète requise
(IS_AUTHENTICATED_FULLY) ; chaque action exige en plus ROLE_ADMIN ou ROLE_OPERATOR via
OrderStatusController::assertBackofficeStaffAccess().
Attributes
- #[IsGranted]
- 'IS_AUTHENTICATED_FULLY'
Table of Contents
Properties
- $auditLogger : AuditLogger
- $entityManager : EntityManagerInterface
- $mailerService : MailerService
Methods
- __construct() : mixed
- getAvailableStatuses() : JsonResponse
- Renvoie la liste des statuts de commande sélectionnables dans l'interface.
- updateShippingInfo() : JsonResponse
- Met à jour les informations de livraison d'une commande.
- updateStatus() : JsonResponse
- Met à jour le statut d'une commande à partir d'une charge utile JSON.
- assertBackofficeStaffAccess() : void
- Vérifie que l'utilisateur courant fait partie du personnel du back-office.
- getStatusLabel() : string
- Traduit une constante de statut de commande en libellé affichable.
- isValidStatusTransition() : bool
- Indique si le passage d'un statut de commande à un autre est autorisé.
- sendStatusNotification() : void
- Notifie le client du changement de statut de sa commande.
Properties
$auditLogger
private
AuditLogger
$auditLogger
$entityManager
private
EntityManagerInterface
$entityManager
$mailerService
private
MailerService
$mailerService
Methods
__construct()
public
__construct(EntityManagerInterface $entityManager, MailerService $mailerService, AuditLogger $auditLogger) : mixed
Parameters
- $entityManager : EntityManagerInterface
-
Gestionnaire d'entités utilisé pour flusher les modifications de commande et de paiement.
- $mailerService : MailerService
-
Service d'envoi des notifications de changement de statut au client.
- $auditLogger : AuditLogger
-
Service de journalisation des actions d'audit sur les commandes.
getAvailableStatuses()
Renvoie la liste des statuts de commande sélectionnables dans l'interface.
public
getAvailableStatuses() : JsonResponse
Exige ROLE_ADMIN ou ROLE_OPERATOR. La liste est codée en dur et ne contient que les cinq
statuts principaux (EN_ATTENTE, EN_TRAITEMENT, TERMINER, ANNULER, REMBOURSE), avec
leur libellé d'affichage ; EN_ATTENTE_PAIEMENT n'y figure pas.
Route : /admin/order/statuses (GET), nom admin_order_get_statuses.
Requiert ROLE_ADMIN ou ROLE_OPERATOR.
Attributes
- #[Route]
- '/admin/order/statuses'
- $name: 'admin_order_get_statuses'
- $methods: ['GET']
Return values
JsonResponse —{"statuses": [{"value": string, "label": string}, ...]}.
updateShippingInfo()
Met à jour les informations de livraison d'une commande.
public
updateShippingInfo(Order $order, Request $request) : JsonResponse
Exige ROLE_ADMIN ou ROLE_OPERATOR. Applique, si les clés correspondantes sont présentes dans
le JSON, le numéro de suivi (tracking_number), le transporteur (carrier), la date
d'expédition (shipped_at) et la date de livraison (delivered_at). Contrairement à
OrderStatusController::updateStatus(), cette action modifie le statut sans passer par
la validation des transitions : renseigner shipped_at bascule la commande de EN_ATTENTE
vers EN_TRAITEMENT, et renseigner delivered_at la force à TERMINER. L'opération est
journalisée par AuditLogger avec l'ancien et le nouveau statut. Aucun email n'est envoyé.
Route : /admin/order/{id}/shipping (POST), nom admin_order_update_shipping.
Requiert ROLE_ADMIN ou ROLE_OPERATOR.
Parameters
- $order : Order
-
Commande résolue automatiquement depuis l'identifiant de l'URL.
- $request : Request
-
Requête HTTP dont le corps JSON porte les informations de livraison.
Attributes
- #[Route]
- '/admin/order/{id}/shipping'
- $name: 'admin_order_update_shipping'
- $methods: ['POST']
Return values
JsonResponse —{success: true, message, tracking_number, carrier, shipped_at, delivered_at}
en cas de succès ; statut 400 si le JSON est invalide ; statut 500 si une
exception survient (date non analysable, erreur de flush, etc.).
updateStatus()
Met à jour le statut d'une commande à partir d'une charge utile JSON.
public
updateStatus(Order $order, Request $request) : JsonResponse
Exige ROLE_ADMIN ou ROLE_OPERATOR. Le corps de la requête doit contenir une clé status
parmi pending, processing, shipped, delivered, cancelled, refunded ou paid,
traduite vers les constantes de Order (shipped est mappé sur EN_TRAITEMENT et
paid sur EN_ATTENTE). La transition est ensuite validée par
OrderStatusController::isValidStatusTransition() et rejetée si elle n'est pas permise.
Effets de bord : pour paid, le premier paiement de la commande passe au statut « complété »
et se voit affecter la méthode MANUAL s'il n'en avait pas, avec mise à jour de updatedAt.
Les champs de suivi optionnels tracking_number, carrier, shipped_at et delivered_at
sont appliqués s'ils sont fournis ; shipped renseigne automatiquement la date d'expédition
et delivered la date de livraison. Une annulation enregistre cancelledAt et, si présente,
la clé cancellation_reason. Le changement est journalisé (ancien et nouveau statut, numéro
de suivi, transporteur), puis une notification email est tentée via
OrderStatusController::sendStatusNotification() — son échec est ignoré.
Route : /admin/order/{id}/update-status (POST), nom admin_order_update_status.
Requiert ROLE_ADMIN ou ROLE_OPERATOR.
Parameters
- $order : Order
-
Commande résolue automatiquement depuis l'identifiant de l'URL.
- $request : Request
-
Requête HTTP dont le corps JSON porte le nouveau statut et les informations de suivi.
Attributes
- #[Route]
- '/admin/order/{id}/update-status'
- $name: 'admin_order_update_status'
- $methods: ['POST']
Return values
JsonResponse —{success: true, message, new_status, status_label} en cas de succès ;
statut 400 pour un JSON invalide, un statut manquant, un statut inconnu
ou une transition interdite ; statut 500 si une exception est levée
pendant le traitement.
assertBackofficeStaffAccess()
Vérifie que l'utilisateur courant fait partie du personnel du back-office.
private
assertBackofficeStaffAccess() : void
Exige ROLE_ADMIN ou ROLE_OPERATOR. Appelée en début de chacune des actions publiques du contrôleur ; les rôles ROLE_MANAGER et ROLE_SUPPORT ne sont donc pas admis ici.
Tags
getStatusLabel()
Traduit une constante de statut de commande en libellé affichable.
private
getStatusLabel(string $status) : string
Couvre EN_ATTENTE, EN_TRAITEMENT, TERMINER, ANNULER et REMBOURSE ; tout autre
statut (par exemple EN_ATTENTE_PAIEMENT) est renvoyé tel quel.
Parameters
- $status : string
-
Constante de statut de Order.
Return values
string —Libellé lisible, ou le statut d'origine si aucun libellé n'est défini.
isValidStatusTransition()
Indique si le passage d'un statut de commande à un autre est autorisé.
private
isValidStatusTransition(string $currentStatus, string $newStatus) : bool
Machine à états implémentée sous forme de table : depuis EN_ATTENTE vers EN_TRAITEMENT ou
ANNULER ; depuis EN_TRAITEMENT vers TERMINER ou ANNULER ; depuis TERMINER
uniquement vers REMBOURSE ; depuis EN_ATTENTE_PAIEMENT vers EN_ATTENTE ou ANNULER.
Les statuts ANNULER et REMBOURSE sont terminaux. Un statut courant absent de la table
n'autorise aucune transition.
Parameters
- $currentStatus : string
-
Statut actuel de la commande (constante de Order).
- $newStatus : string
-
Statut cible demandé (constante de Order).
Return values
bool —true si la transition figure dans la table des transitions autorisées.
sendStatusNotification()
Notifie le client du changement de statut de sa commande.
private
sendStatusNotification(Order $order, string $status) : void
Délègue à MailerService::sendOrderStatusUpdate() en ne lui transmettant que la commande :
le paramètre $status n'est pas utilisé, le service déduisant le contenu du message du
statut déjà enregistré sur l'entité. Toute exception d'envoi est capturée et volontairement
ignorée afin de ne pas faire échouer la mise à jour du statut.
Parameters
- $order : Order
-
Commande concernée par la notification.
- $status : string
-
Statut cible (non exploité dans le corps de la méthode).