CompanyPaymentController
extends AbstractController
in package
Contrôleur de paiement des commandes groupées de cartes de visite passées par une entreprise.
Il prend le relais du formulaire de commande entreprise : les employés sélectionnés et leurs
options (modèle de carte, quantité, police, couleur, design) sont transmis via la clé de session
company_order_data, à partir de laquelle sont créées une Order et son Payment.
Deux canaux de règlement sont pris en charge : le paiement en ligne via Djomy (Orange Money, MTN MoMo,
carte bancaire sur la page Djomy) et le paiement à la livraison (validé immédiatement). Un paiement en
ligne n'est confirmé que par PaymentFulfillmentService (retour Djomy vérifié ou
webhook), qui passe la commande en traitement, génère les cartes de visite des employés et envoie
l'e-mail de confirmation ; tant qu'il n'est pas confirmé, la commande reste en attente de paiement,
avec possibilité de relance.
Préfixe de route : /company-payment. Réservé à ROLE_ADMIN.
Attributes
- #[IsGranted]
- 'ROLE_ADMIN'
- #[Route]
- '/company-payment'
Table of Contents
Properties
- $businessCardGenerationService : BusinessCardGenerationService
- $cardRepository : CardRepository
- $djomyCheckoutService : DjomyCheckoutService
- $employeeRepository : EmployeeRepository
- $entityManager : EntityManagerInterface
- $logger : LoggerInterface
- $mailerService : MailerService
Methods
- __construct() : mixed
- paymentFailed() : Response
- Enregistrer l'échec ou l'abandon du paiement d'une commande entreprise.
- paymentSuccess() : Response
- Afficher le résultat d'un paiement de commande entreprise, sans jamais valider un paiement en ligne.
- processPayment() : Response
- Créer la commande entreprise puis lancer le règlement selon la méthode choisie.
- retryPayment() : Response
- Afficher l'écran de reprise de paiement d'une commande entreprise restée impayée.
- retryPaymentProcess() : Response
- Relancer le paiement d'une commande entreprise avec la méthode choisie.
- selectPaymentMethod() : Response
- Afficher l'écran de choix de la méthode de paiement pour une commande entreprise en cours.
- createOrderAndPayment() : Payment, message?: string}
- Construire et persister la commande entreprise et son paiement à partir des données de session.
- getPaymentMethodLabel() : string
- Convertir une constante de méthode de paiement en libellé lisible en français.
- isCashOnDelivery() : bool
- Indiquer si la commande est réglée à la livraison.
- processCashOnDeliveryPayment() : Response
- Valider immédiatement une commande entreprise réglée à la livraison.
- processDjomyPayment() : Response
- Démarrer le paiement Djomy d'une commande entreprise et rediriger vers la page de paiement.
- sendOrderConfirmationEmail() : void
- Envoyer l'e-mail de confirmation d'une commande entreprise.
Properties
$businessCardGenerationService read-only
private
BusinessCardGenerationService
$businessCardGenerationService
$cardRepository read-only
private
CardRepository
$cardRepository
$djomyCheckoutService read-only
private
DjomyCheckoutService
$djomyCheckoutService
$employeeRepository read-only
private
EmployeeRepository
$employeeRepository
$entityManager read-only
private
EntityManagerInterface
$entityManager
$logger read-only
private
LoggerInterface
$logger
$mailerService read-only
private
MailerService
$mailerService
Methods
__construct()
public
__construct(EntityManagerInterface $entityManager, EmployeeRepository $employeeRepository, CardRepository $cardRepository, MailerService $mailerService, DjomyCheckoutService $djomyCheckoutService, BusinessCardGenerationService $businessCardGenerationService, LoggerInterface $logger) : mixed
Parameters
- $entityManager : EntityManagerInterface
-
Gestionnaire Doctrine : persistance des commandes et paiements, transactions.
- $employeeRepository : EmployeeRepository
-
Dépôt des employés, utilisé pour valider que chaque employé sélectionné appartient bien à l'entreprise.
- $cardRepository : CardRepository
-
Dépôt des modèles de cartes (prix, visuels).
- $mailerService : MailerService
-
Service d'envoi de l'e-mail de confirmation de commande entreprise.
- $djomyCheckoutService : DjomyCheckoutService
-
Démarre le paiement en ligne Djomy.
- $businessCardGenerationService : BusinessCardGenerationService
-
Service générant automatiquement les cartes de visite des employés (paiement à la livraison).
- $logger : LoggerInterface
-
Journalise les échecs de démarrage du paiement en ligne.
paymentFailed()
Enregistrer l'échec ou l'abandon du paiement d'une commande entreprise.
public
paymentFailed(Order $order) : Response
Page d'affichage seule (route GET) : après contrôle d'appartenance, elle informe de l'échec sans rien modifier ni envoyer d'e-mail. La commande a déjà été placée en Order::EN_ATTENTE_PAIEMENT au démarrage du paiement (ou en cas d'échec de ce démarrage) ; elle reste réglable via self::retryPayment().
Une commande déjà payée (EN_TRAITEMENT ou TERMINER) n'est jamais rétrogradée : elle est renvoyée
vers son détail.
Route : /company-payment/failed/{order} (toutes méthodes), nom company_payment_failed.
Parameters
- $order : Order
-
Commande résolue par ParamConverter à partir de
{order}.
Attributes
- #[Route]
- '/failed/{order}'
- $name: 'company_payment_failed'
Return values
Response —Rendu de admin/company_payment/failed.html.twig avec la commande,
précédé d'un flash warning.
paymentSuccess()
Afficher le résultat d'un paiement de commande entreprise, sans jamais valider un paiement en ligne.
public
paymentSuccess(Order $order) : Response
Vérifie que la commande appartient à l'utilisateur connecté. Un paiement en ligne n'est confirmé que
par PaymentFulfillmentService (retour Djomy vérifié ou webhook), qui passe la
commande en Order::EN_TRAITEMENT, génère les cartes de visite des employés et envoie l'e-mail :
tant que ce n'est pas fait, la page ne modifie rien et renvoie vers le détail de la commande. Seul le
paiement à la livraison (redirigé ici par self::processCashOnDeliveryPayment()) conserve
l'ancien comportement : commande en traitement, paiements COMPLETED, génération des cartes et e-mail.
Route : /company-payment/success/{order} (toutes méthodes), nom company_payment_success.
Parameters
- $order : Order
-
Commande résolue par ParamConverter à partir de
{order}.
Tags
Attributes
- #[Route]
- '/success/{order}'
- $name: 'company_payment_success'
Return values
Response —Rendu de admin/company_payment/success.html.twig avec la commande, ou redirection
vers admin_company_order_show si le paiement en ligne n'est pas encore confirmé.
processPayment()
Créer la commande entreprise puis lancer le règlement selon la méthode choisie.
public
processPayment(Request $request, SessionInterface $session) : Response
Exige que la session contienne company_order_data avec une clé employees et que le champ
POST payment_method soit renseigné ; sinon un flash error est posé et l'utilisateur est
renvoyé vers admin_company_order_new. La méthode de paiement est fusionnée dans les données
de session, puis self::createOrderAndPayment() crée la commande et le paiement en base ;
en cas d'échec, le message d'erreur remonté est affiché et l'utilisateur repart du formulaire.
La clé company_order_data est ensuite retirée de la session. L'aiguillage final délègue à
self::processDjomyPayment() (paiement en ligne) ou self::processCashOnDeliveryPayment().
La méthode est contrôlée en amont (djomy ou cash_on_delivery), de même que le téléphone du payeur
(payer_phone) pour djomy, avant toute création de commande.
Route : /company-payment/process (POST), nom company_payment_process.
Parameters
- $request : Request
-
Requête POST portant
payment_method(djomyoucash_on_delivery) etpayer_phone. - $session : SessionInterface
-
Session HTTP contenant
company_order_data.
Attributes
- #[Route]
- '/process'
- $name: 'company_payment_process'
- $methods: ['POST']
Return values
Response —Redirection vers Djomy, vers company_payment_success (paiement à la livraison),
vers company_payment_failed (échec du démarrage du paiement en ligne)
ou vers admin_company_order_new / company_payment_select_method (données
manquantes, méthode ou téléphone invalide, échec de création de la commande).
retryPayment()
Afficher l'écran de reprise de paiement d'une commande entreprise restée impayée.
public
retryPayment(Order $order) : Response
Seules les commandes au statut Order::EN_ATTENTE_PAIEMENT sont éligibles : tout autre
statut donne lieu à un flash error et à une redirection vers admin_company_order_show.
Cette action n'effectue aucune vérification de propriété de la commande (contrairement à
self::retryPaymentProcess()) et ne modifie rien en base.
Route : /company-payment/retry/{order} (GET), nom company_payment_retry.
Parameters
- $order : Order
-
Commande résolue par ParamConverter à partir de
{order}.
Attributes
- #[Route]
- '/retry/{order}'
- $name: 'company_payment_retry'
- $methods: ['GET']
Return values
Response —Rendu de admin/company_payment/retry.html.twig avec la commande,
ou redirection vers admin_company_order_show.
retryPaymentProcess()
Relancer le paiement d'une commande entreprise avec la méthode choisie.
public
retryPaymentProcess(Order $order, string $method, Request $request) : Response
Vérifie que l'utilisateur connecté est bien le propriétaire de la commande (sinon
AccessDeniedException), que la commande est toujours en Order::EN_ATTENTE_PAIEMENT
et qu'elle possède au moins un paiement. La méthode reçue dans l'URL doit être djomy ou
cash_on_delivery, sans quoi l'utilisateur est renvoyé sur l'écran de reprise. Pour djomy, le
téléphone du payeur (payer_phone) est contrôlé puis self::processDjomyPayment() ouvre une
nouvelle transaction (la précédente est relue par DjomyCheckoutService::start()) ; pour
cash_on_delivery, self::processCashOnDeliveryPayment() est appelée.
Route : /company-payment/retry/{order}/{method} (POST), nom company_payment_retry_process.
Parameters
- $order : Order
-
Commande résolue par ParamConverter à partir de
{order}. - $method : string
-
Méthode de paiement demandée :
djomyoucash_on_delivery. - $request : Request
-
Requête POST portant
payer_phone.
Tags
Attributes
- #[Route]
- '/retry/{order}/{method}'
- $name: 'company_payment_retry_process'
- $methods: ['POST']
Return values
Response —Redirection vers Djomy, vers company_payment_success,
vers company_payment_failed, vers company_payment_retry (méthode ou téléphone invalide)
ou vers admin_company_order_show (commande non payable ou sans paiement).
selectPaymentMethod()
Afficher l'écran de choix de la méthode de paiement pour une commande entreprise en cours.
public
selectPaymentMethod(SessionInterface $session) : Response
Relit la clé de session company_order_data alimentée par le formulaire de commande ;
si elle est absente, un flash error invite à recommencer et redirige vers
admin_company_order_new. Recharge l'utilisateur (l'entreprise) à partir de
$orderData['user_id'] et redirige de la même manière s'il est introuvable. Charge enfin
les Card non masquées (isHide = false) afin que la vue puisse afficher
les tarifs à jour. Aucune écriture en base ni en session.
Route : /company-payment/select-method (GET), nom company_payment_select_method.
Parameters
- $session : SessionInterface
-
Session HTTP contenant
company_order_data.
Attributes
- #[Route]
- '/select-method'
- $name: 'company_payment_select_method'
- $methods: ['GET']
Return values
Response —Rendu de admin/company_payment/select_method.html.twig avec les données de
commande, l'entreprise et les cartes ; ou redirection vers
admin_company_order_new.
createOrderAndPayment()
Construire et persister la commande entreprise et son paiement à partir des données de session.
private
createOrderAndPayment(array<string, mixed> $orderData, User $user) : Payment, message?: string}
Opère dans une transaction Doctrine explicite. La commande est renseignée avec l'identité de
l'entreprise (le nom de l'utilisateur est placé dans firstname, lastname reste vide),
son e-mail, son téléphone et le nom de sa société, puis mise au statut Order::EN_ATTENTE.
Chaque entrée de $orderData['employees'] est filtrée : les valeurs non tabulaires sont
ignorées, seuls les employés dont la case selected vaut exactement '1' sont retenus, et
l'employé doit exister et être rattaché à l'entreprise courante (comparaison
Employee::getCompany() !== $user) sous peine d'être silencieusement ignoré. Un card_id
manquant ou une carte introuvable lève une exception. Pour chaque employé retenu, un
OrderItem est créé avec la carte, la quantité (1 par défaut), la police (Arial),
la couleur (#000000) et le design (default) par défaut ; le total cumule le prix de la
carte (virgules de milliers retirées) multiplié par la quantité. Une sélection vide lève une
exception. Le Payment créé porte le total, la méthode de paiement, le statut
Payment::PENDING_STATUS et, à titre indicatif, la carte du premier article.
Toute exception provoque un rollback et un retour d'échec plutôt qu'une propagation.
Parameters
- $orderData : array<string, mixed>
-
Données de commande issues de la session, contenant
payment_methodet le tableauemployeesindexé par identifiant d'employé. - $user : User
-
Entreprise passant la commande (utilisateur connecté).
Return values
Payment, message?: string} —Tableau de résultat : success à true avec la commande et le paiement persistés,
ou success à false accompagné du message de l'exception rencontrée.
getPaymentMethodLabel()
Convertir une constante de méthode de paiement en libellé lisible en français.
private
getPaymentMethodLabel(string $paymentMethod) : string
Fait correspondre Payment::DJOMY, Payment::CREDIT_CARD, Payment::ORANGE_MONEY et
Payment::DELIVERY_CASH à leur intitulé destiné aux e-mails et aux vues. Toute autre
valeur, y compris une méthode brute non normalisée, retombe sur Non défini.
Parameters
- $paymentMethod : string
-
Code de la méthode de paiement stocké sur le paiement.
Return values
string —Libellé affichable, ou Non défini si le code n'est pas reconnu.
isCashOnDelivery()
Indiquer si la commande est réglée à la livraison.
private
isCashOnDelivery(Order $order) : bool
La méthode de la commande peut valoir cash_on_delivery (valeur brute du formulaire) ou
Payment::DELIVERY_CASH ; à défaut, un paiement DELIVERY_CASH suffit.
Parameters
- $order : Order
-
Commande à examiner.
Return values
bool —true pour un paiement à la livraison.
processCashOnDeliveryPayment()
Valider immédiatement une commande entreprise réglée à la livraison.
private
processCashOnDeliveryPayment(Order $order, Payment $payment) : Response
Aucun encaissement n'a lieu : le paiement prend la méthode Payment::DELIVERY_CASH et le
statut Payment::ACCEPTED_STATUS (et non COMPLETED), tandis que la commande passe en
Order::EN_TRAITEMENT. Les cartes de visite des employés sont ensuite générées via
BusinessCardGenerationService::generateBusinessCardsForOrder(), les
compteurs de cartes créées et d'erreurs étant restitués par flashs info et warning ;
une exception de génération est absorbée et signalée en warning. L'e-mail de confirmation
est envoyé via self::sendOrderConfirmationEmail(). La redirection vers
company_payment_success déclenchera un second passage de génération et d'envoi d'e-mail,
et y repositionnera le paiement en Payment::COMPLETED_STATUS.
Parameters
- $order : Order
-
Commande à confirmer.
- $payment : Payment
-
Paiement associé, basculé en méthode et statut « à la livraison ».
Return values
Response —Redirection vers company_payment_success.
processDjomyPayment()
Démarrer le paiement Djomy d'une commande entreprise et rediriger vers la page de paiement.
private
processDjomyPayment(Order $order, Payment $payment, Request $request) : Response
Le téléphone du payeur (payer_phone) est transmis à DjomyCheckoutService::start(), qui crée la
transaction et renvoie l'URL de la page de paiement. La commande est alors placée en
Order::EN_ATTENTE_PAIEMENT (Djomy ne renvoie pas le client en cas d'échec, la reprise doit donc
rester possible) ; elle n'est confirmée que par PaymentFulfillmentService. Un paiement
déjà encaissé renvoie vers la page de succès ; toute autre erreur est journalisée, affichée sous forme
de message générique, puis la commande est renvoyée vers l'écran d'échec.
Parameters
- $order : Order
-
Commande à régler.
- $payment : Payment
-
Paiement associé.
- $request : Request
-
Requête portant
payer_phone.
Return values
Response —Redirection vers la page de paiement Djomy, vers company_payment_success
ou vers company_payment_failed.
sendOrderConfirmationEmail()
Envoyer l'e-mail de confirmation d'une commande entreprise.
private
sendOrderConfirmationEmail(Order $order) : void
Utilise le template company_order_confirmation avec pour contexte la commande, l'entreprise
(Order::getUser()) et le libellé lisible de la méthode de paiement obtenu par
self::getPaymentMethodLabel(). L'envoi est volontairement non bloquant : toute
exception est capturée et seulement tracée via error_log(), afin qu'un incident de messagerie
n'invalide pas une commande déjà payée.
Parameters
- $order : Order
-
Commande dont l'adresse e-mail et l'identifiant alimentent le message.
Return values
void —Aucune valeur de retour ; l'échec d'envoi reste silencieux côté utilisateur.