BCard - Documentation technique

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 (carte bancaire via Stripe Checkout, Orange Money — actuellement indisponible — 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
$employeeRepository  : EmployeeRepository
$entityManager  : EntityManagerInterface
$mailerService  : MailerService
$stripeService  : StripeService

Methods

__construct()  : mixed
paymentFailed()  : Response
Traite le retour d'un paiement entreprise ayant échoué.
paymentSuccess()  : Response
Confirme une commande entreprise au retour d'un paiement réussi.
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.
processCashOnDeliveryPayment()  : Response
Valide une commande réglée à la livraison.
processCreditCardPayment()  : Response
Ouvre une session Stripe Checkout pour le règlement par carte bancaire.
processOrangeMoneyPayment()  : Response
Traite un règlement par Orange Money.
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

Methods

__construct()

public __construct(EntityManagerInterface $entityManager, EmployeeRepository $employeeRepository, CardRepository $cardRepository, MailerService $mailerService, StripeService $stripeService, BusinessCardGenerationService $businessCardGenerationService) : 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.

$stripeService : StripeService

Service de création des sessions Stripe Checkout.

$businessCardGenerationService : BusinessCardGenerationService

Service de génération automatique des cartes de visite des employés après confirmation.

paymentFailed()

Traite le retour d'un paiement entreprise ayant échoué.

public paymentFailed(Order $order) : Response

Après contrôle d'appartenance de la commande, celle-ci repasse au statut « En attente de paiement » et tous ses paiements en PENDING_STATUS. La commande n'est donc pas perdue : elle reste réglable ultérieurement via CompanyPaymentController::retryPayment(). Un e-mail portant le statut « En attente de paiement » est envoyé au client.

Route : /admin/company-payment/failed/{order}, nom admin_company_payment_failed.

Parameters
$order : Order

Commande résolue depuis l'identifiant d'URL.

Tags
throws
AccessDeniedException

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

Attributes
#[Route]
'/failed/{order}'
$name: 'admin_company_payment_failed'
Return values
Response

Page admin/company_payment/failed.html.twig.

paymentSuccess()

Confirme une commande entreprise au retour d'un paiement réussi.

public paymentSuccess(Order $order) : Response

Vérifie que la commande appartient bien à l'utilisateur connecté, sinon lève une exception d'accès refusé. Passe ensuite la commande en « En traitement » et tous ses paiements en COMPLETED_STATUS, puis déclenche la génération automatique des cartes de visite des employés : le nombre de cartes produites et le nombre d'erreurs sont restitués par des messages flash, et un échec global n'est qu'un avertissement invitant à créer les cartes manuellement. Un e-mail de confirmation au statut « Confirmée » est enfin envoyé.

À noter : cette action ne vérifie pas auprès de Stripe que le règlement a effectivement eu lieu — elle fait foi du seul retour de navigation.

Route : /admin/company-payment/success/{order}, nom admin_company_payment_success.

Parameters
$order : Order

Commande résolue depuis l'identifiant d'URL.

Tags
throws
AccessDeniedException

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

Attributes
#[Route]
'/success/{order}'
$name: 'admin_company_payment_success'
Return values
Response

Page admin/company_payment/success.html.twig.

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. La commande et le paiement sont créés par CompanyPaymentController::createOrderAndPayment() ; en cas d'échec, le message d'erreur remonté est affiché. La clé de session est ensuite supprimée, y compris avant un paiement encore non abouti. Le traitement est enfin aiguillé selon le moyen retenu : credit_card, orange_money ou cash_on_delivery ; toute autre valeur produit un flash « Méthode de paiement non supportée. ».

Route : /admin/company-payment/process (POST), nom admin_company_payment_process.

Parameters
$request : Request
$session : SessionInterface

Session contenant la préparation company_order_data, vidée après création.

Tags
throws
AccessDeniedException

Si l'utilisateur n'est pas rattaché à une entreprise.

Attributes
#[Route]
'/process'
$name: 'admin_company_payment_process'
$methods: ['POST']
Return values
Response

Redirection vers Stripe Checkout, vers l'écran d'échec ou de succès selon le moyen de paiement, ou vers admin_company_order_new / 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
throws
AccessDeniedException

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

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 de paiement est enregistré une première fois tel qu'il arrive dans l'URL, puis réécrit avec la constante correspondante de Payment avant l'aiguillage.

Valeurs acceptées : credit_card, orange_money, cash_on_delivery ; toute autre valeur produit un message d'erreur et un retour à l'écran de reprise.

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 transmise au traitement par carte bancaire.

Tags
throws
AccessDeniedException

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

Attributes
#[Route]
'/retry/{order}/{method}'
$name: 'admin_company_payment_retry_process'
$methods: ['POST']
Return values
Response

Redirection vers Stripe, 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 unique card_id s'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_MONEY ou DELIVERY_CASH.

Return values
string

« Carte bancaire », « Orange Money », « Paiement à la livraison », ou « Non défini » pour toute autre valeur.

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
$order : Order

Commande à confirmer.

$payment : Payment

Paiement associé, passé en ACCEPTED_STATUS.

Return values
Response

Redirection vers admin_company_payment_success.

processCreditCardPayment()

Ouvre une session Stripe Checkout pour le règlement par carte bancaire.

private processCreditCardPayment(Order $order, Payment $payment, Request $request) : Response

Chaque ligne de commande devient un article Stripe libellé « nom de la carte — nom de l'employé », en francs guinéens (gnf). Le prix unitaire est transmis tel quel après suppression des virgules et conversion en entier. L'illustration reprend la première image du produit si elle existe, sinon une image par défaut hébergée sur card.binn.pro.

Le moyen de paiement est fixé à Payment::CREDIT_CARD et un e-mail au statut « En attente de paiement » est envoyé avant la redirection vers Stripe. Les URL de retour pointent vers admin_company_payment_success et admin_company_payment_failed.

Parameters
$order : Order

Commande à régler.

$payment : Payment

Paiement associé, mis à jour avant redirection.

$request : Request

Requête, utilisée pour construire l'URL de base des images.

Return values
Response

Redirection vers la page de paiement Stripe, ou vers admin_company_payment_failed si la session n'a pu être créée.

processOrangeMoneyPayment()

Traite un règlement par Orange Money.

private processOrangeMoneyPayment(Order $order, Payment $payment) : Response

Le moyen de paiement n'est pas implémenté : la méthode se contente d'afficher un message d'indisponibilité et de renvoyer vers la page d'échec. Ni la commande ni le paiement ne sont modifiés — le paramètre $payment n'est pas utilisé.

Parameters
$order : Order

Commande concernée.

$payment : Payment

Paiement associé (non utilisé en l'état).

Return values
Response

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


        
On this page

Search results