BCard - Documentation technique

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

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

Si la commande n'appartient pas à l'utilisateur connecté.

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 (djomy ou cash_on_delivery) et payer_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 : djomy ou cash_on_delivery.

$request : Request

Requête POST portant payer_phone.

Tags
throws
AccessDeniedException

Si l'utilisateur connecté n'est pas le propriétaire de la commande.

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_method et le tableau employees indexé 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.


        
On this page

Search results