VirtualCardController
extends AbstractController
in package
Permet au personnel du back-office de gérer les cartes virtuelles pour le compte des clients.
Offre un annuaire des clients avec leur offre, leur quota de cartes restant et leur droit d'en
créer une de plus, puis la création et la modification d'une carte BusinessCardAize au nom
d'un client. Les clients dépourvus d'abonnement se voient attribuer automatiquement l'offre
gratuite. Un publicHash est calculé après persistance et sert de base à la génération du QR code
pointant vers /bcard. Les fonctionnalités premium du formulaire et la saisie des activités sont
conditionnées à l'offre et au profil du client.
Préfixe de route : /admin/virtual-cards. Authentification complète requise au niveau de la
classe ; chaque action exige en plus ROLE_ADMIN, ROLE_OPERATOR ou ROLE_SUPPORT.
Attributes
- #[IsGranted]
- 'IS_AUTHENTICATED_FULLY'
- #[Route]
- '/admin/virtual-cards'
Table of Contents
Properties
- $auditLogger : AuditLogger
- $entityManager : EntityManagerInterface
- $logoManagementService : LogoManagementService
- $qrCodeService : QRCodeService
- $subscriptionService : SubscriptionService
- $userRepository : UserRepository
Methods
- __construct() : mixed
- clients() : Response
- Affiche l'annuaire paginé des clients avec leur situation en matière de cartes virtuelles.
- create() : Response
- Crée une carte virtuelle pour le compte d'un client.
- edit() : Response
- Modifie une carte virtuelle existante pour le compte de son propriétaire.
- checkPhpUploadErrors() : void
- Signale à l'utilisateur les erreurs d'upload remontées par PHP.
- getUploadErrorMessage() : string|null
- Traduit un code d'erreur d'upload PHP en message lisible en français.
- manageFiles() : void
- Traite les fichiers du formulaire et applique les éléments d'identité visuelle à la carte.
Properties
$auditLogger read-only
private
AuditLogger
$auditLogger
$entityManager read-only
private
EntityManagerInterface
$entityManager
$logoManagementService read-only
private
LogoManagementService
$logoManagementService
$qrCodeService read-only
private
QRCodeService
$qrCodeService
$subscriptionService read-only
private
SubscriptionService
$subscriptionService
$userRepository read-only
private
UserRepository
$userRepository
Methods
__construct()
public
__construct(EntityManagerInterface $entityManager, UserRepository $userRepository, SubscriptionService $subscriptionService, QRCodeService $qrCodeService, LogoManagementService $logoManagementService, AuditLogger $auditLogger) : mixed
Parameters
- $entityManager : EntityManagerInterface
-
Gestionnaire d'entités pour persister et flusher les cartes.
- $userRepository : UserRepository
-
Dépôt des utilisateurs, fournit le query builder de filtrage des clients par offre.
- $subscriptionService : SubscriptionService
-
Service d'abonnement : création de l'offre gratuite, quota de cartes, accès aux fonctionnalités premium.
- $qrCodeService : QRCodeService
-
Service de génération des QR codes à partir du hash public.
- $logoManagementService : LogoManagementService
-
Service de dépôt du logo personnalisé et d'application des couleurs de l'entreprise.
- $auditLogger : AuditLogger
-
Service d'audit des créations et modifications de cartes virtuelles.
clients()
Affiche l'annuaire paginé des clients avec leur situation en matière de cartes virtuelles.
public
clients(Request $request, PaginatorInterface $paginator) : Response
Refuse l'accès si l'utilisateur n'est ni ROLE_ADMIN, ni ROLE_OPERATOR, ni ROLE_SUPPORT. La
requête est filtrée par offre (plan) et par recherche libre (q) au moyen de
UserRepository::createClientsByPlanFilterQueryBuilder(), paginée selon page et limit
(défaut 15).
Effet de bord : pour chaque client de la page dépourvu d'abonnement actif, un abonnement gratuit est créé à la volée via SubscriptionService::createFreeSubscriptionForUser(). Chaque ligne préparée pour la vue expose le nom de l'offre (« Free » par défaut), le nombre de cartes restantes et la possibilité de créer une carte supplémentaire.
Route : /admin/virtual-cards/clients (GET), nom admin_virtual_cards_clients.
Requiert ROLE_ADMIN, ROLE_OPERATOR ou ROLE_SUPPORT.
Parameters
- $request : Request
-
Requête HTTP courante (paramètres
plan,q,page,limit). - $paginator : PaginatorInterface
-
Service de pagination KnpPaginator.
Attributes
- #[Route]
- '/clients'
- $name: 'admin_virtual_cards_clients'
- $methods: ['GET']
Return values
Response —Rendu du template admin/virtual_card/index.html.twig avec les lignes
préparées, l'objet de pagination et les filtres actifs.
create()
Crée une carte virtuelle pour le compte d'un client.
public
create(User $user, Request $request) : Response
Refuse l'accès si l'utilisateur n'est ni ROLE_ADMIN, ni ROLE_OPERATOR, ni ROLE_SUPPORT. Un
abonnement gratuit est créé si le client n'en a aucun d'actif. La saisie des activités
(allow_activities) n'est ouverte que pour les offres « Free » ou « Pro », lorsque le client
n'est rattaché à aucune entreprise et ne porte ni ROLE_MANAGER ni ROLE_EMPLOYEE. Si le quota
de cartes de l'offre est atteint, un flash d'information est affiché et l'utilisateur est
renvoyé vers l'annuaire sans rien créer.
La carte est créée directement au statut publié. Les erreurs d'upload PHP sont signalées par
VirtualCardController::checkPhpUploadErrors() et les fichiers sont traités par
VirtualCardController::manageFiles(). Après une première persistance, un publicHash
est calculé par hash_hmac('sha256', id, APP_SECRET) s'il est absent, puis le QR code est
généré vers <host>/bcard en y intégrant l'entreprise, l'intitulé de poste, le prénom et le
nom. La création est enfin journalisée.
Route : /admin/virtual-cards/clients/{id}/create (GET, POST), nom admin_virtual_cards_create.
Requiert ROLE_ADMIN, ROLE_OPERATOR ou ROLE_SUPPORT.
Parameters
- $user : User
-
Client bénéficiaire de la carte, résolu depuis l'identifiant de l'URL.
- $request : Request
-
Requête HTTP courante, utilisée pour traiter le formulaire et les fichiers.
Attributes
- #[Route]
- '/clients/{id}/create'
- $name: 'admin_virtual_cards_create'
- $methods: ['GET', 'POST']
Return values
Response —Rendu du template admin/virtual_card/create.html.twig, ou redirection vers
admin_virtual_cards_clients après création réussie ou quota atteint.
edit()
Modifie une carte virtuelle existante pour le compte de son propriétaire.
public
edit(BusinessCardAize $businessCard, Request $request) : Response
Refuse l'accès si l'utilisateur n'est ni ROLE_ADMIN, ni ROLE_OPERATOR, ni ROLE_SUPPORT. Si la carte n'est rattachée à aucun client, une exception 404 « Client introuvable. » est levée. Un abonnement gratuit est créé si le client n'en a aucun d'actif, et les mêmes règles que dans VirtualCardController::create() pilotent l'ouverture des activités et des fonctionnalités premium. Aucun contrôle de quota n'est appliqué en modification.
Après enregistrement, la modification est journalisée, le publicHash est calculé s'il
manquait, puis le QR code est systématiquement régénéré ; si la génération échoue, un flash
d'avertissement précise que la carte a bien été modifiée mais que le QR code n'a pas pu être
régénéré. En cas de succès, l'utilisateur est renvoyé vers la fiche de l'abonné.
Route : /admin/virtual-cards/cards/{id}/edit (GET, POST), nom admin_virtual_cards_edit.
Requiert ROLE_ADMIN, ROLE_OPERATOR ou ROLE_SUPPORT.
Parameters
- $businessCard : BusinessCardAize
-
Carte virtuelle résolue depuis l'identifiant de l'URL.
- $request : Request
-
Requête HTTP courante, utilisée pour traiter le formulaire et les fichiers.
Tags
Attributes
- #[Route]
- '/cards/{id}/edit'
- $name: 'admin_virtual_cards_edit'
- $methods: ['GET', 'POST']
Return values
Response —Rendu du template admin/virtual_card/create.html.twig en mode modification,
ou redirection vers app_admin_subscriber_view après enregistrement réussi.
checkPhpUploadErrors()
Signale à l'utilisateur les erreurs d'upload remontées par PHP.
private
checkPhpUploadErrors(Request $request) : void
Inspecte les fichiers bruts image, cv et brochure de la requête (et non les champs
imbriqués du formulaire) et, pour chaque fichier dont le code d'erreur diffère de
UPLOAD_ERR_OK, ajoute un message flash d'erreur obtenu via
VirtualCardController::getUploadErrorMessage(). N'interrompt pas le traitement du
formulaire.
Parameters
- $request : Request
-
Requête HTTP courante contenant les fichiers envoyés.
getUploadErrorMessage()
Traduit un code d'erreur d'upload PHP en message lisible en français.
private
getUploadErrorMessage(int $errorCode) : string|null
Couvre les constantes UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_FORM_SIZE, UPLOAD_ERR_PARTIAL,
UPLOAD_ERR_NO_FILE, UPLOAD_ERR_NO_TMP_DIR, UPLOAD_ERR_CANT_WRITE et
UPLOAD_ERR_EXTENSION. Malgré son type de retour nullable, la méthode renvoie toujours une
chaîne : un code inconnu produit « Erreur inconnue lors de l'upload du fichier. ».
Parameters
- $errorCode : int
-
Code d'erreur issu de
UploadedFile::getError().
Return values
string|null —Message d'erreur correspondant.
manageFiles()
Traite les fichiers du formulaire et applique les éléments d'identité visuelle à la carte.
private
manageFiles(FormInterface $form, BusinessCardAize $businessCard) : void
Le CV est déplacé vers le paramètre cv_directory et la photo vers profil_directory, tous
deux renommés avec un identifiant unique suivi de l'extension devinée ; une FileException
est capturée et convertie en message flash d'erreur sans interrompre le traitement. Si le
formulaire expose customLogo, le fichier est confié à
LogoManagementService::uploadCustomLogo() et le chemin retourné est enregistré sur la
carte. Les couleurs de l'entreprise sont ensuite appliquées via
LogoManagementService::setCompanyColors(), toute exception étant également transformée en
flash d'erreur. Enfin, pour chaque sous-formulaire d'activité disposant d'un champ
brochure, le fichier est déplacé vers brochure_directory et rattaché à l'activité — ce
dernier déplacement n'est pas protégé par un bloc try.
Aucun flush n'est réalisé ici : la persistance est à la charge de l'action appelante.
Parameters
- $form : FormInterface
-
Formulaire soumis contenant les champs de fichiers et les activités.
- $businessCard : BusinessCardAize
-
Carte virtuelle à alimenter avec les fichiers déposés.