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. 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

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_money ou cash_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_money ou cash_on_delivery.

$request : Request

Requête POST, transmise au traitement carte bancaire pour construire les URL absolues des visuels.

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 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_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::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 « - <employé> », en devise 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.


        
On this page

Search results