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.
Trois canaux de règlement sont pris en charge : carte bancaire via Stripe Checkout, paiement à
la livraison (validé immédiatement) et Orange Money (déclaré temporairement indisponible).
Une commande payée déclenche la génération automatique des cartes de visite des employés puis
l'envoi d'un e-mail de confirmation ; un échec laisse la commande 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
- $employeeRepository : EmployeeRepository
- $entityManager : EntityManagerInterface
- $mailerService : MailerService
- $stripeService : StripeService
Methods
- __construct() : mixed
- paymentFailed() : Response
- Enregistrer l'échec ou l'abandon du paiement d'une commande entreprise.
- paymentSuccess() : Response
- Confirmer une commande entreprise payée et déclencher la génération des cartes de visite.
- 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.
- processCashOnDeliveryPayment() : Response
- Valider immédiatement une commande entreprise réglée à la livraison.
- processCreditCardPayment() : Response
- Rediriger vers une session Stripe Checkout couvrant tous les articles de la commande.
- processOrangeMoneyPayment() : Response
- Traiter une demande de paiement Orange Money pour une commande entreprise.
- 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
$employeeRepository read-only
private
EmployeeRepository
$employeeRepository
$entityManager read-only
private
EntityManagerInterface
$entityManager
$mailerService read-only
private
MailerService
$mailerService
$stripeService read-only
private
StripeService
$stripeService
Methods
__construct()
public
__construct(EntityManagerInterface $entityManager, EmployeeRepository $employeeRepository, CardRepository $cardRepository, MailerService $mailerService, StripeService $stripeService, BusinessCardGenerationService $businessCardGenerationService) : 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.
- $stripeService : StripeService
-
Passerelle Stripe pour la création des sessions Checkout.
- $businessCardGenerationService : BusinessCardGenerationService
-
Service générant automatiquement les cartes de visite des employés une fois la commande payée.
paymentFailed()
Enregistrer l'échec ou l'abandon du paiement d'une commande entreprise.
public
paymentFailed(Order $order) : Response
URL de retour d'échec fournie à Stripe, également utilisée par le canal Orange Money indisponible. Repositionne la commande en Order::EN_ATTENTE_PAIEMENT et tous ses paiements en Payment::PENDING_STATUS avec horodatage, de sorte que la commande reste conservée et puisse être reprise via self::retryPayment(). Aucune carte de visite n'est générée et aucun e-mail n'est envoyé.
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()
Confirmer une commande entreprise payée et déclencher la génération des cartes de visite.
public
paymentSuccess(Order $order) : Response
URL de retour de succès fournie à Stripe, également appelée directement après un paiement à
la livraison. Bascule la commande en Order::EN_TRAITEMENT et tous ses paiements en
Payment::COMPLETED_STATUS avec horodatage, sans revérifier l'état réel du paiement
auprès de Stripe ni contrôler que la commande appartient à l'utilisateur connecté.
Appelle ensuite BusinessCardGenerationService::generateBusinessCardsForOrder() :
le nombre de cartes générées et le nombre d'erreurs sont restitués par des flashs info et
warning, et une exception de génération est simplement signalée en warning sans remettre
en cause la commande. Termine par self::sendOrderConfirmationEmail().
Route : /company-payment/success/{order} (toutes méthodes), nom company_payment_success.
Parameters
- $order : Order
-
Commande résolue par ParamConverter à partir de
{order}.
Attributes
- #[Route]
- '/success/{order}'
- $name: 'company_payment_success'
Return values
Response —Rendu de admin/company_payment/success.html.twig avec la commande.
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 systématiquement retirée de la session — y compris
avant un paiement Stripe, ce qui rend la commande non reconstructible depuis la session en cas
d'abandon. L'aiguillage final délègue à self::processCreditCardPayment(),
self::processOrangeMoneyPayment() ou self::processCashOnDeliveryPayment().
Route : /company-payment/process (POST), nom company_payment_process.
Parameters
- $request : Request
-
Requête POST portant
payment_method(credit_card,orange_moneyoucash_on_delivery). - $session : SessionInterface
-
Session HTTP contenant
company_order_data.
Attributes
- #[Route]
- '/process'
- $name: 'company_payment_process'
- $methods: ['POST']
Return values
Response —Redirection vers Stripe Checkout, vers company_payment_success
(paiement à la livraison), vers company_payment_failed (Orange Money)
ou vers admin_company_order_new (données manquantes, méthode inconnue
ou é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 est d'abord écrite
telle quelle sur le paiement puis persistée, avant d'être normalisée en constante
(Payment::CREDIT_CARD, Payment::ORANGE_MONEY ou Payment::DELIVERY_CASH)
dans la branche correspondante, avec un second flush. Le traitement est ensuite délégué à
self::processCreditCardPayment(), self::processOrangeMoneyPayment() ou
self::processCashOnDeliveryPayment(). Une valeur inconnue laisse toutefois la chaîne
brute enregistrée sur le paiement avant de renvoyer sur l'écran de reprise.
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 :
credit_card,orange_moneyoucash_on_delivery. - $request : Request
-
Requête POST, transmise au traitement carte bancaire pour construire les URL absolues des visuels.
Tags
Attributes
- #[Route]
- '/retry/{order}/{method}'
- $name: 'company_payment_retry_process'
- $methods: ['POST']
Return values
Response —Redirection vers Stripe Checkout, vers company_payment_success,
vers company_payment_failed, vers company_payment_retry (méthode inconnue)
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::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.
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.
processCreditCardPayment()
Rediriger vers une session Stripe Checkout couvrant tous les articles de la commande.
private
processCreditCardPayment(Order $order, Payment $payment, Request $request) : Response
Construit une ligne Stripe par OrderItem, libellée « gnf, au prix unitaire de la carte (virgules de milliers retirées) et à la quantité commandée.
Le visuel est la première image de la carte servie depuis l'hôte courant (/card/<image>),
avec repli sur une image BCard hébergée sur card.binn.pro. Positionne
Payment::CREDIT_CARD sur le paiement, puis crée la session Checkout avec les URL
absolues company_payment_success et company_payment_failed. Toute exception est
transformée en flash error suivi d'une redirection vers l'écran d'échec, lequel remet la
commande en attente de paiement.
Parameters
- $order : Order
-
Commande dont les articles alimentent les lignes Stripe.
- $payment : Payment
-
Paiement associé, dont la méthode est mise à jour.
- $request : Request
-
Requête HTTP courante, utilisée pour composer l'URL absolue des visuels.
Return values
Response —Redirection vers l'URL Stripe Checkout, ou vers company_payment_failed
en cas d'erreur.
processOrangeMoneyPayment()
Traiter une demande de paiement Orange Money pour une commande entreprise.
private
processOrangeMoneyPayment(Order $order, Payment $payment) : Response
Le canal Orange Money n'est pas encore opérationnel : la méthode ne modifie ni la commande
ni le paiement et se contente d'un flash info d'indisponibilité, puis redirige vers
self::paymentFailed() qui replace la commande en Order::EN_ATTENTE_PAIEMENT
afin qu'elle puisse être reprise plus tard.
Parameters
- $order : Order
-
Commande concernée, utilisée pour construire l'URL de redirection.
- $payment : Payment
-
Paiement associé, non utilisé dans le corps de la méthode.
Return values
Response —Redirection 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.