BCard - Documentation technique

SubscriptionController extends AbstractController
in package

Contrôleur du parcours de souscription à l'abonnement Pro pour un utilisateur final.

Il expose la page de choix du cycle de facturation (mensuel / annuel), crée l'abonnement et le paiement associés au statut « en attente », puis délègue l'encaissement à Djomy. L'abonnement n'est activé que par PaymentFulfillmentService, après vérification du paiement (retour navigateur sur djomy_payment_return ou webhook) ; la route de succès ne fait qu'afficher. L'accès à la souscription est conditionné par SubscriptionService::canUpgrade() : un utilisateur possédant déjà un abonnement payant actif est renvoyé vers sa liste de cartes.

Aucun préfixe de route au niveau de la classe. Réservé à ROLE_USER.

Attributes
#[IsGranted]
'ROLE_USER'

Table of Contents

Properties

$djomyCheckoutService  : DjomyCheckoutService
$entityManager  : EntityManagerInterface
$logger  : LoggerInterface
$subscriptionService  : SubscriptionService

Methods

__construct()  : mixed
processUpgradeToPro()  : Response
Traite l'upgrade vers Pro et démarre le paiement en ligne Djomy
subscriptionCancel()  : Response
Gère l'annulation du paiement
subscriptionDetails()  : Response
Affiche les détails de l'abonnement actuel
subscriptionSuccess()  : Response
Affiche la page de félicitations après la souscription Pro, sans rien activer
upgradeToProPage()  : Response
Affiche la page de sélection du plan Pro avec les options de paiement
findReusablePendingPayment()  : Payment|null
Retrouve le paiement en attente d'une précédente tentative pour le même plan et le même cycle.

Properties

Methods

__construct()

public __construct(EntityManagerInterface $entityManager, SubscriptionService $subscriptionService, DjomyCheckoutService $djomyCheckoutService, LoggerInterface $logger) : mixed
Parameters
$entityManager : EntityManagerInterface

Gestionnaire Doctrine utilisé pour la persistance des entités Subscription et Payment ainsi que pour les transactions explicites.

$subscriptionService : SubscriptionService

Service métier des abonnements : contrôle d'éligibilité à l'upgrade et activation d'un abonnement.

$djomyCheckoutService : DjomyCheckoutService

Démarre le paiement en ligne Djomy.

$logger : LoggerInterface

Journalise les échecs de démarrage du paiement.

processUpgradeToPro()

Traite l'upgrade vers Pro et démarre le paiement en ligne Djomy

public processUpgradeToPro(Request $request) : Response

Contrôle d'abord le jeton CSRF upgrade_pro, puis recontrôle l'éligibilité de l'utilisateur (SubscriptionService::canUpgrade()) et la présence du plan Pro, puis exige le moyen de paiement djomy et un numéro de téléphone du payeur (payer_phone) valide, avant toute écriture en base. Crée ensuite, dans une transaction Doctrine, une Subscription au statut Subscription::STATUS_PENDING (cycle mensuel ou annuel, montant, renouvellement automatique) et un Payment en attente lié à cet abonnement, puis ouvre la transaction Djomy via DjomyCheckoutService::start(). L'abonnement n'est activé que par PaymentFulfillmentService (retour Djomy vérifié ou webhook). En cas d'erreur, la transaction est annulée, l'erreur est journalisée et un message générique est affiché.

Route : /upgrade-to-pro/process (POST), nom app_subscription_upgrade_to_pro_process.

Parameters
$request : Request

Requête POST portant payment_method (djomy), billing_cycle et payer_phone.

Attributes
#[Route]
'/upgrade-to-pro/process'
$name: 'app_subscription_upgrade_to_pro_process'
$methods: ['POST']
Return values
Response —

Redirection vers la page de paiement Djomy, vers app_subscription_upgrade_to_pro (erreur ou téléphone invalide) ou vers app_cards_list (abonnement déjà actif).

subscriptionCancel()

Gère l'annulation du paiement

public subscriptionCancel(SessionInterface $session) : Response

Page d'abandon du paiement. Le parcours Djomy ne pose plus la clé de session pending_subscription_id : sans elle, seul le message est affiché. Si la clé existe, l'abonnement correspondant est chargé et, s'il est toujours au statut Subscription::STATUS_PENDING, il est basculé en Subscription::STATUS_CANCELLED avec horodatage d'annulation et motif « Paiement annulé par l'utilisateur », puis persisté. La clé de session est retirée dans tous les cas où elle était présente. Le paiement en attente associé n'est en revanche pas modifié.

Route : /subscription/cancel (toutes méthodes), nom app_subscription_cancel.

Parameters
$session : SessionInterface

Session HTTP contenant éventuellement pending_subscription_id.

Attributes
#[Route]
'/subscription/cancel'
$name: 'app_subscription_cancel'
Return values
Response —

Rendu de subscription/cancel.html.twig, précédé d'un flash info.

subscriptionDetails()

Affiche les détails de l'abonnement actuel

public subscriptionDetails() : Response

Récupère l'abonnement actif de l'utilisateur connecté via User::getActiveSubscription() et le transmet au template. Aucune vérification supplémentaire n'est faite : la valeur transmise peut être null si l'utilisateur n'a aucun abonnement actif, le template devant gérer ce cas.

Route : /subscription/details (toutes méthodes), nom app_subscription_details.

Attributes
#[Route]
'/subscription/details'
$name: 'app_subscription_details'
Return values
Response —

Rendu de subscription/details.html.twig avec l'abonnement actif et l'utilisateur.

subscriptionSuccess()

Affiche la page de félicitations après la souscription Pro, sans rien activer

public subscriptionSuccess() : Response

Page neutre : l'activation est faite exclusivement par PaymentFulfillmentService après vérification du paiement auprès de Djomy (retour navigateur ou webhook). Si l'utilisateur possède un abonnement actif, celui-ci est affiché ; sinon il est renvoyé vers le détail de son abonnement avec un message indiquant que la confirmation est en cours. La route ne lit ni ne modifie aucune donnée de paiement.

Route : /subscription/success (toutes méthodes), nom app_subscription_success.

Attributes
#[Route]
'/subscription/success'
$name: 'app_subscription_success'
Return values
Response —

Rendu de subscription/success.html.twig avec l'abonnement actif, ou redirection vers app_subscription_details.

upgradeToProPage()

Affiche la page de sélection du plan Pro avec les options de paiement

public upgradeToProPage(Request $request) : Response

Vérifie d'abord l'éligibilité de l'utilisateur courant via SubscriptionService::canUpgrade() : s'il dispose déjà d'un abonnement payant actif, un message flash info est ajouté et il est redirigé vers app_cards_list. Charge ensuite le Plan dont le nom est exactement Pro ; en son absence, un flash error est posé et l'utilisateur est renvoyé vers app_tarifs. Le cycle de facturation est lu dans le paramètre de requête cycle (valeur par défaut monthly) et détermine le prix affiché (tarif annuel si yearly, mensuel sinon). Aucune écriture en base n'est effectuée ici.

Route : /upgrade-to-pro (toutes méthodes), nom app_subscription_upgrade_to_pro.

Parameters
$request : Request

Requête HTTP dont le paramètre de query cycle porte le cycle souhaité.

Attributes
#[Route]
'/upgrade-to-pro'
$name: 'app_subscription_upgrade_to_pro'
Return values
Response —

Rendu de subscription/upgrade_to_pro.html.twig avec le plan, le cycle, le prix et l'utilisateur ; ou une redirection vers app_cards_list (abonnement déjà actif) ou app_tarifs (plan Pro absent).

findReusablePendingPayment()

Retrouve le paiement en attente d'une précédente tentative pour le même plan et le même cycle.

private findReusablePendingPayment(User $user, Plan $plan, string $cycle) : Payment|null

Seuls les paiements Pro en libre-service (sans commande ni entreprise) dont l'abonnement est encore en attente sont repris, s'ils n'ont pas encore de transaction ou si leur prestataire est Djomy.

Parameters
$user : User

Utilisateur connecté.

$plan : Plan

Plan Pro.

$cycle : string

Subscription::BILLING_MONTHLY ou Subscription::BILLING_YEARLY.

Return values
Payment|null —

Paiement réutilisable, ou null.


        
On this page

Search results