CompanyPaymentController
extends AbstractController
in package
Pilote le tunnel de paiement des commandes de cartes de visite entreprise.
Prend le relais de CompanyOrderController : il lit la sélection d'employés stockée en
session sous company_order_data, la matérialise en Order, OrderItem et Payment, puis
oriente vers le moyen de règlement choisi (paiement en ligne via Djomy ou paiement à la livraison).
Il gère aussi les retours de paiement
(succès, échec) et la reprise d'un règlement en attente. Effet métier important : dès qu'une
commande est confirmée, les cartes de visite des employés sont générées automatiquement, un
échec de génération n'étant qu'un avertissement.
Préfixe de route : /admin/company-payment. Authentification complète requise
(IS_AUTHENTICATED_FULLY) ; les actions vérifient en outre que l'utilisateur est rattaché à
une entreprise activée et/ou qu'il est titulaire de la commande.
Attributes
- #[IsGranted]
- 'IS_AUTHENTICATED_FULLY'
- #[Route]
- '/admin/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
- Traite le retour d'un paiement entreprise ayant échoué.
- paymentSuccess() : Response
- Affiche le résultat d'un paiement de commande entreprise, sans jamais valider un paiement en ligne.
- processPayment() : Response
- Matérialise la commande entreprise préparée en session et lance le paiement choisi.
- retryPayment() : Response
- Affiche l'écran de reprise du règlement d'une commande entreprise impayée.
- retryPaymentProcess() : Response
- Relance le règlement d'une commande entreprise avec le moyen de paiement retenu.
- selectPaymentMethod() : Response
- Affiche l'écran de choix du moyen de paiement pour une commande entreprise en préparation.
- createOrderAndPayment() : Payment, message?: string}
- Matérialise en base la commande et le paiement préparés en session.
- getPaymentMethodLabel() : string
- Traduit une constante de moyen de paiement en libellé destiné au client.
- isCashOnDelivery() : bool
- Indique si la commande est réglée à la livraison.
- processCashOnDeliveryPayment() : Response
- Valide une commande réglée à la livraison.
- processDjomyPayment() : Response
- Démarre le paiement Djomy d'une commande entreprise et redirige vers la page de paiement.
- sendOrderConfirmationEmail() : void
- Envoie l'e-mail de confirmation d'une commande entreprise.
- sendOrderConfirmationEmailWithStatus() : void
- Envoie l'e-mail de commande entreprise en adaptant l'objet et les consignes au statut.
Properties
$businessCardGenerationService
private
BusinessCardGenerationService
$businessCardGenerationService
$cardRepository
private
CardRepository
$cardRepository
$djomyCheckoutService
private
DjomyCheckoutService
$djomyCheckoutService
$employeeRepository
private
EmployeeRepository
$employeeRepository
$entityManager
private
EntityManagerInterface
$entityManager
$logger
private
LoggerInterface
$logger
$mailerService
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 utilisé pour les transactions de création de commande et les mises à jour de statut.
- $employeeRepository : EmployeeRepository
-
Dépôt des employés, utilisé pour recharger et contrôler l'appartenance de chaque employé sélectionné.
- $cardRepository : CardRepository
-
Dépôt des produits carte, source des prix et des cartes non masquées.
- $mailerService : MailerService
-
Service d'envoi des e-mails de confirmation de commande.
- $djomyCheckoutService : DjomyCheckoutService
-
Démarre le paiement en ligne Djomy.
- $businessCardGenerationService : BusinessCardGenerationService
-
Service de génération automatique des cartes de visite des employés après confirmation.
- $logger : LoggerInterface
paymentFailed()
Traite le retour d'un paiement entreprise ayant échoué.
public
paymentFailed(Order $order) : Response
Page d'affichage seule (route GET) : après contrôle d'appartenance de la commande, elle informe de l'échec sans rien modifier ni envoyer d'e-mail. La commande a déjà été placée en « En attente de paiement » au démarrage du paiement (ou en cas d'échec de ce démarrage) ; elle reste réglable via CompanyPaymentController::retryPayment(). Une commande déjà payée est renvoyée vers son détail.
Route : /admin/company-payment/failed/{order}, nom admin_company_payment_failed.
Parameters
- $order : Order
-
Commande résolue depuis l'identifiant d'URL.
Tags
Attributes
- #[Route]
- '/failed/{order}'
- $name: 'admin_company_payment_failed'
Return values
Response —Page admin/company_payment/failed.html.twig.
paymentSuccess()
Affiche 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 bien à l'utilisateur connecté, sinon lève une exception
d'accès refusé. Un paiement en ligne n'est confirmé que par
PaymentFulfillmentService (retour Djomy vérifié ou webhook), qui passe la commande
en « En traitement », les paiements en COMPLETED_STATUS, génère les cartes de visite des employés
et envoie l'e-mail « Confirmée » : 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
CompanyPaymentController::processCashOnDeliveryPayment()) conserve l'ancien comportement :
commande en traitement, paiements COMPLETED, génération des cartes, e-mail « Confirmée ».
Route : /admin/company-payment/success/{order}, nom admin_company_payment_success.
Parameters
- $order : Order
-
Commande résolue depuis l'identifiant d'URL.
Tags
Attributes
- #[Route]
- '/success/{order}'
- $name: 'admin_company_payment_success'
Return values
Response —Page admin/company_payment/success.html.twig, ou redirection vers
admin_company_order_show si le paiement en ligne n'est pas encore confirmé.
processPayment()
Matérialise la commande entreprise préparée en session et lance le paiement choisi.
public
processPayment(Request $request, SessionInterface $session) : Response
Refuse l'accès aux comptes non rattachés à une entreprise et bloque les entreprises non
activées. Exige des données company_order_data en session contenant une clé employees
et un champ POST payment_method, sous peine de flash d'erreur et de retour à
admin_company_order_new. Le moyen doit être djomy ou cash_on_delivery, et pour djomy le
téléphone du payeur (payer_phone) doit être valide : ces contrôles précèdent toute création en base.
La commande et le paiement sont créés par
CompanyPaymentController::createOrderAndPayment() ; en cas d'échec, l'erreur est journalisée et
un message générique est affiché. La clé de session est ensuite supprimée. Le traitement est enfin
aiguillé vers CompanyPaymentController::processDjomyPayment() ou
CompanyPaymentController::processCashOnDeliveryPayment().
Route : /admin/company-payment/process (POST), nom admin_company_payment_process.
Parameters
- $request : Request
-
Requête HTTP portant
payment_methodetpayer_phone. - $session : SessionInterface
-
Session contenant la préparation
company_order_data, vidée après création.
Tags
Attributes
- #[Route]
- '/process'
- $name: 'admin_company_payment_process'
- $methods: ['POST']
Return values
Response —Redirection vers Djomy, vers l'écran d'échec ou de succès selon le moyen de paiement, ou vers admin_company_order_new / admin_company_payment_select_method / app_home en cas d'erreur.
retryPayment()
Affiche l'écran de reprise du règlement d'une commande entreprise impayée.
public
retryPayment(Order $order) : Response
Après contrôle d'appartenance, la reprise n'est proposée que si la commande est exactement au statut « En attente de paiement » ; tout autre statut donne lieu à un message d'erreur et à un renvoi vers le détail de la commande.
Route : /admin/company-payment/retry/{order} (GET), nom admin_company_payment_retry.
Parameters
- $order : Order
-
Commande résolue depuis l'identifiant d'URL.
Tags
Attributes
- #[Route]
- '/retry/{order}'
- $name: 'admin_company_payment_retry'
- $methods: ['GET']
Return values
Response —Page admin/company_payment/retry.html.twig, ou redirection vers
admin_company_order_show si la commande n'est plus réglable.
retryPaymentProcess()
Relance le règlement d'une commande entreprise avec le moyen de paiement retenu.
public
retryPaymentProcess(Order $order, string $method, Request $request) : Response
Contrôle successivement l'appartenance de la commande, son statut
(« En attente de paiement » exigé) et l'existence d'un paiement rattaché — le
premier de la collection étant retenu. Le moyen doit être djomy ou cash_on_delivery :
toute autre valeur produit un message d'erreur et un retour à l'écran de reprise. Pour djomy, le
téléphone du payeur (payer_phone) est contrôlé puis
CompanyPaymentController::processDjomyPayment() ouvre une nouvelle transaction (la précédente
est relue par DjomyCheckoutService::start()).
Route : /admin/company-payment/retry/{order}/{method} (POST),
nom admin_company_payment_retry_process.
Parameters
- $order : Order
-
Commande résolue depuis l'identifiant d'URL.
- $method : string
-
Moyen de paiement demandé.
- $request : Request
-
Requête POST portant
payer_phone.
Tags
Attributes
- #[Route]
- '/retry/{order}/{method}'
- $name: 'admin_company_payment_retry_process'
- $methods: ['POST']
Return values
Response —Redirection vers Djomy, page de confirmation, ou redirection vers
admin_company_order_show / admin_company_payment_retry selon le cas.
selectPaymentMethod()
Affiche l'écran de choix du moyen de paiement pour une commande entreprise en préparation.
public
selectPaymentMethod(SessionInterface $session) : Response
Bloque un compte entreprise non encore activé par l'administration (flash d'erreur et
redirection vers app_home). Exige la présence des données company_order_data en session,
sinon la préparation est considérée perdue et l'utilisateur repart de
admin_company_order_new. Le client est rechargé depuis l'identifiant stocké en session ;
s'il est introuvable, même redirection. Un tableau associatif identifiant de carte => prix
est construit à partir des produits non masqués pour permettre le calcul du total côté vue.
Route : /admin/company-payment/select-method (GET), nom admin_company_payment_select_method.
Parameters
- $session : SessionInterface
-
Session contenant la préparation de commande
company_order_data.
Attributes
- #[Route]
- '/select-method'
- $name: 'admin_company_payment_select_method'
- $methods: ['GET']
Return values
Response —Page HTML admin/company_payment/select_method.html.twig, ou redirection vers app_home / admin_company_order_new.
createOrderAndPayment()
Matérialise en base la commande et le paiement préparés en session.
private
createOrderAndPayment(array<string, mixed> $orderData, User $user) : Payment, message?: string}
L'ensemble est encapsulé dans une transaction Doctrine explicite, annulée par
rollback() à la moindre exception. La commande est renseignée à partir du compte
client (le nom de famille est laissé vide, le prénom recevant le nom du compte) et
initialisée au statut Order::EN_ATTENTE.
Deux modes de constitution des lignes :
- commande groupée (
is_bulk) : un uniquecard_ids'applique à tous les employés retenus, et une note « Commande groupée pour N employé(s) » est ajoutée ; - commande normale : chaque employé porte son propre
card_id.
Dans les deux cas, un employé n'est retenu que si sa valeur est un tableau, que
selected vaut exactement '1', et qu'il est retrouvé en base. Les employés ne
satisfaisant pas ces conditions sont ignorés silencieusement. Les prix sont
convertis en nombre après suppression des virgules ; le paiement est créé au statut
PENDING_STATUS et rattaché à la carte de la première ligne de commande.
Parameters
- $orderData : array<string, mixed>
-
Préparation issue de la session :
payment_method,employees,is_bulk,card_id. - $user : User
-
Client entreprise pour lequel la commande est créée.
Return values
Payment, message?: string} —Résultat de l'opération : la commande et le paiement en cas de succès, le message de l'exception sinon.
getPaymentMethodLabel()
Traduit une constante de moyen de paiement en libellé destiné au client.
private
getPaymentMethodLabel(string $paymentMethod) : string
Parameters
- $paymentMethod : string
-
Constante de Payment :
CREDIT_CARD,ORANGE_MONEYouDELIVERY_CASH.
Return values
string —« Carte bancaire », « Orange Money », « Paiement à la livraison », ou « Non défini » pour toute autre valeur.
isCashOnDelivery()
Indique 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()
Valide une commande réglée à la livraison.
private
processCashOnDeliveryPayment(Order $order, Payment $payment) : Response
Aucun encaissement n'a lieu : le moyen de paiement est fixé à
Payment::DELIVERY_CASH, la commande passe en « En traitement » et le paiement au
statut ACCEPTED_STATUS (et non COMPLETED_STATUS, l'argent n'étant pas encore
perçu). Les cartes de visite des employés sont ensuite générées, un échec n'étant
qu'un avertissement, et un e-mail au statut « Confirmée » est envoyé.
À noter : la redirection finale pointe vers admin_company_payment_success, qui
relance la génération des cartes, renvoie un second e-mail de confirmation et
repasse le paiement en COMPLETED_STATUS.
Parameters
Return values
Response —Redirection vers admin_company_payment_success.
processDjomyPayment()
Démarre le paiement Djomy d'une commande entreprise et redirige 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 « En attente de
paiement » (Djomy ne renvoie pas le client en cas d'échec, la reprise doit donc rester possible) et un
e-mail à ce statut est envoyé ; 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 admin_company_payment_success
ou vers admin_company_payment_failed.
sendOrderConfirmationEmail()
Envoie l'e-mail de confirmation d'une commande entreprise.
private
sendOrderConfirmationEmail(Order $order) : void
Utilise le gabarit company_order_confirmation, alimenté par la commande, le
compte entreprise et le libellé lisible du moyen de paiement. Toute exception
d'envoi est journalisée via error_log() puis absorbée, afin qu'un incident de
messagerie n'interrompe pas le tunnel de commande.
Cette variante n'est pas appelée dans le flux courant, qui lui préfère CompanyPaymentController::sendOrderConfirmationEmailWithStatus().
Parameters
- $order : Order
-
Commande dont la confirmation est envoyée.
sendOrderConfirmationEmailWithStatus()
Envoie l'e-mail de commande entreprise en adaptant l'objet et les consignes au statut.
private
sendOrderConfirmationEmailWithStatus(Order $order, string $status) : void
Pour le statut « En attente de paiement », l'objet devient « Commande en attente de
paiement #N » et les consignes invitent à finaliser le règlement depuis l'espace
entreprise ; pour tout autre statut, l'objet est celui d'une confirmation et les
consignes annoncent une prise en charge prochaine. Le gabarit
company_order_confirmation reçoit en plus les variables status et instructions.
Comme la variante sans statut, les erreurs d'envoi sont journalisées puis absorbées.
Parameters
- $order : Order
-
Commande dont la notification est envoyée.
- $status : string
-
Statut à afficher, par exemple « Confirmée » ou « En attente de paiement ».