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

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
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()

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
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, 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_method et payer_phone.

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

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

Commande à confirmer.

$payment : Payment

Paiement associé, passé en ACCEPTED_STATUS.

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


        
On this page

Search results