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
$djomyCheckoutService
private
DjomyCheckoutService
$djomyCheckoutService
$entityManager
private
EntityManagerInterface
$entityManager
$logger
private
LoggerInterface
$logger
$subscriptionService
private
SubscriptionService
$subscriptionService
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_cycleetpayer_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
cycleporte 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_MONTHLYouSubscription::BILLING_YEARLY.
Return values
Payment|null —Paiement réutilisable, ou null.