AdminPhysicalCardOrderController
extends AbstractController
in package
Permet au staff de passer une commande de carte physique NFC pour le compte d'un client.
Le parcours est fortement contraint : le client doit posséder un abonnement (actif ou, à
défaut, le plus récent) dont le plan est Pro ou Entreprise, et disposer d'au moins une
carte virtuelle. Le contrôleur applique la règle commerciale de la première carte physique
offerte aux abonnés Pro (uniquement si le produit choisi est la carte Pro par défaut), calcule
le prix total à partir du produit et des options d'impression et de couleur, crée la Order et
l'OrderItem correspondants, et oriente la commande soit vers un règlement à zéro immédiatement
confirmé, soit vers un statut « à payer » que le client soldera depuis son espace.
Préfixe de route : /admin/physical-cards (préfixe de nom admin_physical_cards_).
Authentification complète requise (IS_AUTHENTICATED_FULLY) ; l'action exige ROLE_ADMIN ou
ROLE_OPERATOR.
Attributes
- #[IsGranted]
- 'IS_AUTHENTICATED_FULLY'
- #[Route]
- '/admin/physical-cards'
- $name: 'admin_physical_cards_'
Table of Contents
Properties
- $defaultProCardService : DefaultProCardService
- $entityManager : EntityManagerInterface
- $physicalCardRepository : PhysicalCardRepository
- $subscriptionService : SubscriptionService
- $uploaderService : UploaderService
Methods
- __construct() : mixed
- orderForUser() : Response
- Crée une commande de carte physique au nom d'un client depuis le back-office.
- createOrderForPhysicalCard() : Order
- Construit et persiste la commande correspondant à une carte physique.
- formatMoney() : string
- Formate un montant en chaîne décimale canonique à deux décimales.
- getLatestSubscription() : Subscription|null
- Retourne l'abonnement le plus récemment créé d'un client.
- parseMoney() : float
- Convertit un montant stocké sous forme de chaîne en nombre flottant.
Properties
$defaultProCardService read-only
private
DefaultProCardService
$defaultProCardService
$entityManager read-only
private
EntityManagerInterface
$entityManager
$physicalCardRepository read-only
private
PhysicalCardRepository
$physicalCardRepository
$subscriptionService read-only
private
SubscriptionService
$subscriptionService
$uploaderService read-only
private
UploaderService
$uploaderService
Methods
__construct()
public
__construct(SubscriptionService $subscriptionService, EntityManagerInterface $entityManager, PhysicalCardRepository $physicalCardRepository, DefaultProCardService $defaultProCardService, UploaderService $uploaderService) : mixed
Parameters
- $subscriptionService : SubscriptionService
-
Service déterminant si le client a accès aux fonctionnalités premium (abonnement Pro actif).
- $entityManager : EntityManagerInterface
-
Gestionnaire Doctrine utilisé pour persister commande, carte physique et paiement.
- $physicalCardRepository : PhysicalCardRepository
-
Dépôt des cartes physiques, utilisé pour compter les commandes antérieures du client.
- $defaultProCardService : DefaultProCardService
-
Service exposant la carte Pro offerte, la détection de première commande et le message associé.
- $uploaderService : UploaderService
-
Service d'upload des visuels personnalisés recto/verso et du logo.
orderForUser()
Crée une commande de carte physique au nom d'un client depuis le back-office.
public
orderForUser(User $user, Request $request, BusinessCardAizeRepository $businessCardRepository, CardModelRepository $cardModelRepository, CardRepository $cardRepository) : Response
Contrôles préalables, chacun soldé par un flash et une redirection : accès refusé hors
ROLE_ADMIN/ROLE_OPERATOR ; absence d'abonnement (retour à app_user_list) ; plan
différent de Pro ou Entreprise (retour à app_user_list) ; absence de carte virtuelle
(redirection vers la création de carte virtuelle admin_virtual_cards_create). Le
formulaire PhysicalCardOrderType est alimenté par les cartes virtuelles du client, les
modèles actifs, les produits carte non masqués, et par le contexte de première commande Pro.
À la soumission valide : les fichiers customFrontImageFile, customBackImageFile et
logoFile sont déplacés via UploaderService::uploadFile() dans les répertoires
custom_card_images_directory et custom_logos_directory. La gratuité de la base
(baseFree) n'est retenue que si c'est la toute première carte physique du client, que son
abonnement Pro est actif, et que le produit sélectionné est exactement la carte Pro par
défaut ; le total ajoute dans tous les cas le prix de l'option d'impression et de l'option
de couleur. La commande est ensuite créée par
AdminPhysicalCardOrderController::createOrderForPhysicalCard() et annotée du courriel
de l'agent initiateur dans orderNotes.
Deux issues : si la base est offerte et que le total est nul, la carte passe en
STATUS_CONFIRMED, la commande en Order::EN_TRAITEMENT avec PRO_SUBSCRIPTION comme
moyen de paiement et un Payment de 0.00 déjà complété est créé ; sinon la commande passe
en Order::EN_ATTENTE_PAIEMENT et la carte en STATUS_PENDING_PAYMENT. Dans les deux cas,
le téléphone de la commande est complété par celui de la carte virtuelle s'il est vide. La
redirection finale mène au détail de la commande pour un ROLE_ADMIN, sinon à la liste des
utilisateurs. En affichage simple, un avertissement est posé si l'abonnement est encore au
statut Subscription::STATUS_PENDING.
Route : /admin/physical-cards/order/{id} (GET, POST), nom admin_physical_cards_order_for_user.
Réservée à ROLE_ADMIN ou ROLE_OPERATOR (contrôle en dur dans la méthode).
Parameters
- $user : User
-
Client pour lequel la commande est passée, résolu depuis
{id}. - $request : Request
-
Requête HTTP traitée par le formulaire.
- $businessCardRepository : BusinessCardAizeRepository
-
Dépôt des cartes virtuelles du client.
- $cardModelRepository : CardModelRepository
-
Dépôt fournissant les modèles de carte actifs.
- $cardRepository : CardRepository
-
Dépôt fournissant les produits carte non masqués.
Tags
Attributes
- #[Route]
- '/order/{id}'
- $name: 'order_for_user'
- $methods: ['GET', 'POST']
Return values
Response —Formulaire HTML physical_card/order.html.twig, ou redirection (app_user_list, admin_virtual_cards_create, app_order_details) selon les contrôles et l'issue.
createOrderForPhysicalCard()
Construit et persiste la commande correspondant à une carte physique.
private
createOrderForPhysicalCard(PhysicalCard $physicalCard, User $user) : Order
Initialise une Order avec l'identité du client (le nom complet est placé dans
firstname, lastname reste vide), sa raison sociale le cas échéant, et le statut
Order::EN_ATTENTE ; l'adresse de livraison est reprise de la carte physique. Si un
produit carte est sélectionné, un OrderItem de quantité 1 est créé avec la police
(Arial par défaut), la couleur (#000000 par défaut), un design valant model ou
custom selon qu'un modèle de carte est choisi, et les options de couleur et d'impression.
Cas particulier employé : si la carte virtuelle est rattachée à un employé, celui-ci est
associé à l'article et écrase l'identité de la commande (prénom, nom, e-mail,
téléphone, raison sociale) par ses propres coordonnées lorsqu'elles sont renseignées ; un
récapitulatif employé est en outre écrit dans orderNotes. Le total de la commande reprend
le prix déjà calculé sur la carte physique. La commande est persistée mais non flush()ée.
Parameters
- $physicalCard : PhysicalCard
-
Carte physique source des options, du prix et de l'adresse de livraison.
- $user : User
-
Client titulaire de la commande.
Return values
Order —Commande persistée (sans flush()), prête à être complétée par l'appelant.
formatMoney()
Formate un montant en chaîne décimale canonique à deux décimales.
private
formatMoney(float $amount) : string
Utilise le point comme séparateur décimal et aucun séparateur de milliers, format attendu
par les colonnes de montant des entités Order, Payment et PhysicalCard.
Parameters
- $amount : float
-
Montant numérique à formater.
Return values
string —Montant sous la forme 1500.00.
getLatestSubscription()
Retourne l'abonnement le plus récemment créé d'un client.
private
getLatestSubscription(User $user) : Subscription|null
Parcourt en mémoire User::getSubscriptions() en ignorant les éléments qui ne sont pas des
instances de Subscription, et conserve celui dont createdAt est le plus grand. Utilisée
en repli lorsque le client n'a pas d'abonnement actif, afin de pouvoir tout de même
évaluer son plan.
Parameters
- $user : User
-
Client dont on cherche le dernier abonnement.
Return values
Subscription|null —Abonnement le plus récent, ou null si le client n'en a aucun.
parseMoney()
Convertit un montant stocké sous forme de chaîne en nombre flottant.
private
parseMoney(string|null $amount) : float
Retourne 0.0 pour null comme pour la chaîne vide. Sinon les espaces sont supprimés et
les virgules décimales converties en points avant le transtypage, ce qui rend la méthode
tolérante aux formats du type « 1 500,00 ».
Parameters
- $amount : string|null
-
Montant brut, éventuellement formaté avec espaces et virgule.
Return values
float —Montant numérique, 0.0 si l'entrée est vide ou nulle.