AdminOrderController
extends AbstractController
in package
Pilote le suivi des commandes dans le back-office.
Couvre la consultation filtrée des commandes (tous types, abonnement, entreprise, particulier),
le détail d'une commande et de ses cartes physiques, ainsi que les transitions de statut :
traitement/terminaison, annulation motivée et remboursement. Chaque transition envoie un e-mail
au client et écrit une trace AuditLog::ACTION_ORDER_STATUS_UPDATED. Le contrôleur expose aussi
les téléchargements liés à la production (design d'article, QR code, logo) et l'envoi du dossier
de design au prestataire graphique. Règles de transition notables : une commande TERMINER ne
peut plus être traitée ni annulée, une annulation exige un motif, et seul un état ANNULER
autorise le remboursement.
Aucun préfixe de route au niveau de la classe (les chemins sont déclarés méthode par méthode).
Authentification complète requise (IS_AUTHENTICATED_FULLY) ; chaque action exige en outre
ROLE_ADMIN ou ROLE_OPERATOR via AdminOrderController::assertBackofficeStaffAccess().
Attributes
- #[IsGranted]
- 'IS_AUTHENTICATED_FULLY'
Table of Contents
Properties
- $auditLogger : AuditLogger
- $entityManager : EntityManagerInterface
- $logger : LoggerInterface
- $mailer : MailerService
- $physicalCardRepository : PhysicalCardRepository
Methods
- __construct() : mixed
- cancelOrder() : Response
- Annule une commande en enregistrant un motif obligatoire.
- changeOrderStatus() : Response
- Point d'entrée non implémenté de changement de statut d'une commande.
- downloadLogo() : Response
- Télécharge le logo personnalisé associé à une carte physique.
- downloadQRCode() : Response
- Télécharge le QR code PNG de la carte virtuelle liée à une carte physique.
- index() : Response
- Affiche la liste paginée et filtrable des commandes.
- refundOrder() : Response
- Marque une commande annulée comme remboursée.
- sendToDesigner() : JsonResponse
- Transmet par e-mail le dossier de design d'une carte physique au(x) designer(s).
- showOrderDetails() : Response
- Affiche le détail d'une commande et de ses cartes physiques.
- traitmentOrder() : RedirectResponse
- Marque une commande comme terminée.
- viewOrderItemDesign() : Response
- Affiche en ligne le fichier de design importé pour un article de commande.
- assertBackofficeStaffAccess() : void
- Vérifie que l'utilisateur connecté appartient au staff du back-office.
Properties
$auditLogger read-only
private
AuditLogger
$auditLogger
$entityManager read-only
private
EntityManagerInterface
$entityManager
$logger read-only
private
LoggerInterface
$logger
$mailer read-only
private
MailerService
$mailer
$physicalCardRepository read-only
private
PhysicalCardRepository
$physicalCardRepository
Methods
__construct()
public
__construct(EntityManagerInterface $entityManager, MailerService $mailer, PhysicalCardRepository $physicalCardRepository, LoggerInterface $logger, AuditLogger $auditLogger) : mixed
Parameters
- $entityManager : EntityManagerInterface
-
Gestionnaire Doctrine utilisé pour les requêtes et les
flush()de changement de statut. - $mailer : MailerService
-
Service d'envoi des e-mails clients et du dossier de design au designer.
- $physicalCardRepository : PhysicalCardRepository
-
Dépôt des cartes physiques rattachées à une commande.
- $logger : LoggerInterface
-
Journalisation applicative des échecs d'envoi d'e-mail.
- $auditLogger : AuditLogger
-
Service de traçabilité des changements de statut de commande.
cancelOrder()
Annule une commande en enregistrant un motif obligatoire.
public
cancelOrder(Order $order, Request $request) : Response
Deux refus possibles, chacun avec flash d'erreur et retour à la liste : la commande est
déjà Order::TERMINER, ou le champ POST cancel_reason est vide. Sinon le motif et
l'horodatage d'annulation sont enregistrés, le statut passe à Order::ANNULER, l'action
AuditLog::ACTION_ORDER_STATUS_UPDATED est tracée (ancien statut, nouveau statut, action
cancel, motif) et l'e-mail cancel_notification est envoyé au client avec le motif.
Une commande annulée devient éligible au remboursement via
AdminOrderController::refundOrder().
Route : /order-cancel/{id} (toutes méthodes), nom app_order_cancel.
Réservée à ROLE_ADMIN ou ROLE_OPERATOR.
Parameters
- $order : Order
-
Commande à annuler, résolue depuis
{id}. - $request : Request
-
Requête HTTP portant le champ POST
cancel_reason.
Tags
Attributes
- #[Route]
- '/order-cancel/{id}'
- $name: 'app_order_cancel'
Return values
Response —Redirection vers app_order dans tous les cas.
changeOrderStatus()
Point d'entrée non implémenté de changement de statut d'une commande.
public
changeOrderStatus(mixed $id) : Response
En l'état, la méthode ne modifie aucune donnée, n'effectue aucun contrôle de rôle et ne charge pas la commande : elle renvoie simplement une réponse texte confirmant un changement qui n'a pas eu lieu. Les transitions réelles sont assurées par AdminOrderController::traitmentOrder(), AdminOrderController::cancelOrder() et AdminOrderController::refundOrder().
Route : /admin/order/{id}/status (toutes méthodes), nom app_order_status.
Parameters
- $id : mixed
-
Identifiant brut de la commande extrait de l'URL, non typé et non utilisé autrement que dans le message.
Attributes
- #[Route]
- '/admin/order/{id}/status'
- $name: 'app_order_status'
Return values
Response —Réponse texte brut « Order status changed successfully for order ID:
downloadLogo()
Télécharge le logo personnalisé associé à une carte physique.
public
downloadLogo(PhysicalCard $physicalCard) : Response
Deux cas d'échec avec flash d'erreur et redirection vers le détail de la commande : aucun
logo enregistré sur la carte physique, ou fichier absent du répertoire configuré par le
paramètre custom_logos_directory. Sinon le fichier est renvoyé en téléchargement sous
son nom stocké.
Route : /admin/order/physical-card/{id}/download-logo (GET), nom admin_physical_card_download_logo.
Réservée à ROLE_ADMIN ou ROLE_OPERATOR.
Parameters
- $physicalCard : PhysicalCard
-
Carte physique dont le logo est demandé, résolue depuis
{id}.
Attributes
- #[Route]
- '/admin/order/physical-card/{id}/download-logo'
- $name: 'admin_physical_card_download_logo'
- $methods: ['GET']
Return values
Response —Réponse binaire de téléchargement du logo, ou redirection vers app_order_details en cas d'erreur.
downloadQRCode()
Télécharge le QR code PNG de la carte virtuelle liée à une carte physique.
public
downloadQRCode(PhysicalCard $physicalCard, QRCodeService $qrCodeService) : Response
Trois cas d'échec, chacun signalé par un flash d'erreur et une redirection vers le détail
de la commande : aucune carte virtuelle associée à la carte physique, carte virtuelle sans
qrCodePath, ou réponse nulle renvoyée par QRCodeService::downloadQRCode() lorsque le
fichier est introuvable.
Route : /admin/order/physical-card/{id}/download-qr (GET), nom admin_physical_card_download_qr.
Réservée à ROLE_ADMIN ou ROLE_OPERATOR.
Parameters
- $physicalCard : PhysicalCard
-
Carte physique concernée, résolue depuis
{id}. - $qrCodeService : QRCodeService
-
Service produisant la réponse de téléchargement du QR code.
Attributes
- #[Route]
- '/admin/order/physical-card/{id}/download-qr'
- $name: 'admin_physical_card_download_qr'
- $methods: ['GET']
Return values
Response —Réponse de téléchargement du QR code au format PNG, ou redirection vers app_order_details en cas d'erreur.
index()
Affiche la liste paginée et filtrable des commandes.
public
index(OrderRepository $orderRepository, PaginatorInterface $paginator, Request $request) : Response
Construit une requête sur Order avec jointures sur l'utilisateur et son entreprise. Le
paramètre type sélectionne le périmètre et le titre de page :
subscription (commande portant un paiement d'abonnement et aucun article),
business (aucun paiement d'abonnement mais au moins un article rattaché à un employé),
personal (ni paiement d'abonnement ni article rattaché à un employé), sinon toutes.
S'ajoutent des filtres facultatifs : status (validé contre la liste blanche des statuts
Order), client_type (company = entreprise renseignée, individual = absente),
date_from/date_to (bornes converties en DateTimeImmutable, toute date invalide étant
silencieusement ignorée) et q, recherche insensible à la casse sur l'e-mail, le prénom,
le nom et la raison sociale de la commande ainsi que sur l'e-mail et le nom de
l'utilisateur — complétée par une égalité sur l'identifiant si q est purement numérique.
Résultat paginé à 10 par page avec wrap-queries activé.
Route : /admin/order (toutes méthodes), nom app_order.
Réservée à ROLE_ADMIN ou ROLE_OPERATOR.
Parameters
- $orderRepository : OrderRepository
-
Dépôt des commandes.
- $paginator : PaginatorInterface
-
Paginateur KnpPaginator.
- $request : Request
-
Requête HTTP source du type, des filtres et du numéro de page.
Attributes
- #[Route]
- '/admin/order'
- $name: 'app_order'
Return values
Response —Page HTML admin/order/index.html.twig.
refundOrder()
Marque une commande annulée comme remboursée.
public
refundOrder(Order $order) : Response
Exige que la commande soit au statut Order::ANNULER ; sinon un flash d'erreur rappelle
que l'annulation est un prérequis et l'utilisateur est renvoyé vers la liste. En cas de
succès, le statut passe à Order::REMBOURSE, l'action est tracée avec action = refund
et l'e-mail refund_notification est envoyé. Particularité : la redirection de succès
pointe vers app_dashboard et non vers la liste des commandes.
Route : /order-refund/{id} (toutes méthodes), nom app_order_refund.
Réservée à ROLE_ADMIN ou ROLE_OPERATOR.
Parameters
- $order : Order
-
Commande à rembourser, résolue depuis
{id}.
Tags
Attributes
- #[Route]
- '/order-refund/{id}'
- $name: 'app_order_refund'
Return values
Response —Redirection vers app_dashboard en cas de succès, vers app_order si le statut ne le permet pas.
sendToDesigner()
Transmet par e-mail le dossier de design d'une carte physique au(x) designer(s).
public
sendToDesigner(PhysicalCard $physicalCard, SettingsRepository $settingsRepository) : JsonResponse
Assemble un récapitulatif complet de la personnalisation (commande, client, modèle de
carte, option de couleur et d'impression, police, textes recto/verso, instructions,
visuels personnalisés, logo, date de création) — les clés primary_color et
secondary_color sont volontairement laissées à null. Les destinataires proviennent des
Settings (getDesignerEmailRecipientsArray()) ; si aucun n'est configuré, l'adresse
d'expédition par défaut du mailer sert de repli. L'envoi est tracé par
AuditLog::ACTION_ORDER_STATUS_UPDATED avec action = send_to_designer. Une
TransportExceptionInterface est capturée (flash d'erreur + log applicatif), toute autre
exception est également capturée ; les deux produisent une réponse JSON HTTP 500.
Route : /admin/order/physical-card/{id}/send-to-designer (POST), nom admin_send_to_designer.
Réservée à ROLE_ADMIN ou ROLE_OPERATOR.
Parameters
- $physicalCard : PhysicalCard
-
Carte physique dont le dossier de design est envoyé, résolue depuis
{id}. - $settingsRepository : SettingsRepository
-
Dépôt des réglages, source des adresses e-mail des designers.
Attributes
- #[Route]
- '/admin/order/physical-card/{id}/send-to-designer'
- $name: 'admin_send_to_designer'
- $methods: ['POST']
Return values
JsonResponse —{"success": true, "message": ...} en HTTP 200, ou {"success": false, "message": ...} en HTTP 500 en cas d'échec d'envoi.
showOrderDetails()
Affiche le détail d'une commande et de ses cartes physiques.
public
showOrderDetails(Order $order) : Response
Récupère les articles de la commande ainsi que toutes les PhysicalCard qui lui sont
rattachées, puis rend la vue de détail. Aucune écriture n'est réalisée.
Route : /admin/order/retail/{id} (toutes méthodes), nom app_order_details.
Réservée à ROLE_ADMIN ou ROLE_OPERATOR.
Parameters
- $order : Order
-
Commande consultée, résolue depuis
{id}.
Attributes
- #[Route]
- '/admin/order/retail/{id}'
- $name: 'app_order_details'
Return values
Response —Page HTML admin/order/retail.html.twig.
traitmentOrder()
Marque une commande comme terminée.
public
traitmentOrder(Order $order) : RedirectResponse
Refuse l'opération si la commande est déjà au statut Order::TERMINER (flash d'erreur).
Sinon mémorise l'ancien statut, bascule la commande en TERMINER, flush(), journalise
AuditLog::ACTION_ORDER_STATUS_UPDATED avec l'ancien et le nouveau statut et l'action
traitment, puis envoie l'e-mail order_done à l'adresse portée par la commande.
Route : /admin/order/{id}/traitment (toutes méthodes), nom app_order_traitment.
Réservée à ROLE_ADMIN ou ROLE_OPERATOR.
Parameters
- $order : Order
-
Commande à terminer, résolue depuis
{id}.
Tags
Attributes
- #[Route]
- '/admin/order/{id}/traitment'
- $name: 'app_order_traitment'
Return values
RedirectResponse —Redirection vers app_order dans tous les cas.
viewOrderItemDesign()
Affiche en ligne le fichier de design importé pour un article de commande.
public
viewOrderItemDesign(OrderItem $orderItem) : Response
Trois garde-fous conduisent à un flash d'erreur et à une redirection (vers le détail de la
commande si elle est connue, sinon vers la liste) : design absent, extension hors de la
liste autorisée (png, jpg, jpeg, pdf, gif) ou fichier introuvable sur le disque.
Le chemin est reconstruit à partir du paramètre design_directory et du seul basename()
de la valeur stockée, ce qui neutralise les tentatives de traversée de répertoire. En cas
de succès, le fichier est renvoyé avec une disposition inline.
Route : /admin/order/order-item/{id}/design (GET), nom admin_order_item_design.
Réservée à ROLE_ADMIN ou ROLE_OPERATOR.
Parameters
- $orderItem : OrderItem
-
Article de commande dont le design est demandé, résolu depuis
{id}.
Attributes
- #[Route]
- '/admin/order/order-item/{id}/design'
- $name: 'admin_order_item_design'
- $methods: ['GET']
Return values
Response —Réponse binaire du fichier en affichage inline, ou redirection vers app_order_details / app_order en cas d'erreur.
assertBackofficeStaffAccess()
Vérifie que l'utilisateur connecté appartient au staff du back-office.
private
assertBackofficeStaffAccess() : void
Garde interne appelée en tête de chaque action métier : l'accès est accordé si ROLE_ADMIN
ou ROLE_OPERATOR est détenu, sinon une exception d'accès refusé est levée avec le
message « Accès réservé aux administrateurs et gestionnaires. ».