BCard - Documentation technique

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

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
throws
TransportExceptionInterface

Si l'envoi de l'e-mail d'annulation échoue au niveau du transport.

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: ».

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
throws
TransportExceptionInterface

Si l'envoi de l'e-mail de remboursement échoue au niveau du transport.

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
throws
TransportExceptionInterface

Si l'envoi de l'e-mail de fin de commande échoue au niveau du transport.

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. ».

Tags
throws
AccessDeniedException

Si aucun des deux rôles n'est détenu.


        
On this page

Search results