BCard - Documentation technique

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

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

Si l'utilisateur ne détient ni ROLE_ADMIN ni ROLE_OPERATOR.

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.


        
On this page

Search results