ClientSubscriptionController
extends AbstractController
in package
Gère la souscription d'abonnements pour le compte d'un client depuis le back-office.
Permet au staff de créer une souscription (abonnement + commande + paiement dans une même
transaction), de lister les commandes d'abonnement et de les marquer payées, ce qui déclenche
l'activation de l'abonnement. Règles métier notables : le plan Entreprise est réservé aux
comptes portant ROLE_MANAGER et exige un bloc d'informations entreprise (son montant dépend
du nombre d'employés) ; le plan Free force un montant nul et un règlement manuel ; en mode
manual_paid, la commande et le paiement sont immédiatement soldés et l'abonnement activé,
sinon tout reste en attente de paiement.
Préfixe de route : /admin/client-subscriptions. Authentification complète requise
(IS_AUTHENTICATED_FULLY) ; chaque action exige en outre ROLE_ADMIN ou ROLE_OPERATOR.
Attributes
- #[IsGranted]
- 'IS_AUTHENTICATED_FULLY'
- #[Route]
- '/admin/client-subscriptions'
Table of Contents
Properties
- $auditLogger : AuditLogger
- $entityManager : EntityManagerInterface
- $paymentService : PaymentService
- $subscriptionService : SubscriptionService
Methods
- __construct() : mixed
- markPaid() : Response
- Marque manuellement une commande d'abonnement comme payée et active l'abonnement.
- new() : Response
- Crée une souscription complète (abonnement, commande et paiement) pour un client.
- ordersIndex() : Response
- Liste les commandes correspondant à des souscriptions d'abonnement.
Properties
$auditLogger read-only
private
AuditLogger
$auditLogger
$entityManager read-only
private
EntityManagerInterface
$entityManager
$paymentService read-only
private
PaymentService
$paymentService
$subscriptionService read-only
private
SubscriptionService
$subscriptionService
Methods
__construct()
public
__construct(EntityManagerInterface $entityManager, SubscriptionService $subscriptionService, PaymentService $paymentService, AuditLogger $auditLogger) : mixed
Parameters
- $entityManager : EntityManagerInterface
-
Gestionnaire Doctrine, utilisé notamment pour les transactions explicites autour des créations.
- $subscriptionService : SubscriptionService
-
Service d'activation d'un abonnement (calcul des dates, passage au statut actif).
- $paymentService : PaymentService
-
Service de calcul du montant d'abonnement selon le plan, le cycle et l'effectif.
- $auditLogger : AuditLogger
-
Service de traçabilité des créations et activations d'abonnement.
markPaid()
Marque manuellement une commande d'abonnement comme payée et active l'abonnement.
public
markPaid(Order $order, Request $request) : Response
Refuse l'accès hors ROLE_ADMIN/ROLE_OPERATOR. Trois refus possibles, chacun avec flash
et retour à la liste : jeton CSRF mark_paid<id> invalide, absence de premier paiement
rattaché à une souscription, ou paiement déjà au statut Payment::COMPLETED_STATUS
(message informatif, opération idempotente). Sinon, dans une transaction explicite, le
paiement passe à COMPLETED_STATUS avec horodatage, la commande à Order::TERMINER, puis
SubscriptionService::activateSubscription() est appelé. Toute exception provoque un
rollback() et un flash d'erreur.
Route : /admin/client-subscriptions/orders/{id}/mark-paid (POST), nom admin_subscription_order_mark_paid.
Réservée à ROLE_ADMIN ou ROLE_OPERATOR (contrôle en dur dans la méthode).
Parameters
- $order : Order
-
Commande d'abonnement à solder, résolue depuis
{id}. - $request : Request
-
Requête HTTP portant le jeton CSRF
_token.
Tags
Attributes
- #[Route]
- '/orders/{id}/mark-paid'
- $name: 'admin_subscription_order_mark_paid'
- $methods: ['POST']
Return values
Response —Redirection vers admin_subscription_orders_index dans tous les cas.
new()
Crée une souscription complète (abonnement, commande et paiement) pour un client.
public
new(Request $request) : Response
Refuse l'accès hors ROLE_ADMIN/ROLE_OPERATOR. En GET, les paramètres de query plan et
user permettent de préremplir le formulaire ClientSubscriptionType ; l'option
enterprise du formulaire est activée lorsque le plan présélectionné se nomme Entreprise,
ce qui expose le sous-formulaire d'informations entreprise.
À la soumission valide, deux refus renvoient au formulaire avec un flash d'erreur : plan
Entreprise demandé pour un client sans ROLE_MANAGER, ou informations entreprise
manquantes. Le montant est ensuite déterminé selon le plan — Entreprise via
PaymentService::calculateSubscriptionAmount() en fonction de l'effectif, Pro et les
autres plans via le tarif mensuel ou annuel selon le cycle, Free forcé à 0.00 avec
basculement du mode de paiement en manual_paid. Pour Entreprise, l'entité Company du
client est créée ou mise à jour (nom, description, adresse, ville, pays, effectif,
téléphone de contact, e-mail repris du client) et rattachée au client.
Sont alors construits un Subscription au statut STATUS_PENDING avec renouvellement
automatique, une Order (statut TERMINER et méthode MANUAL si manual_paid, sinon
EN_ATTENTE_PAIEMENT et CREDIT_CARD) et un Payment de méthode PRO_SUBSCRIPTION
(complété ou en attente selon le mode). Le tout est persisté dans une transaction
explicite ; en mode manual_paid, l'abonnement est activé et la commande soldée avant le
commit(). L'action AuditLog::ACTION_SUBSCRIPTION_CREATED est tracée, complétée par
ACTION_SUBSCRIPTION_ACTIVATED en cas de règlement manuel. Toute exception provoque un
rollback() et un flash d'erreur, puis le formulaire est réaffiché.
Route : /admin/client-subscriptions/new (GET, POST), nom admin_client_subscription_new.
Réservée à ROLE_ADMIN ou ROLE_OPERATOR (contrôle en dur dans la méthode).
Parameters
- $request : Request
-
Requête HTTP portant les préselections
plan/useret les données du formulaire.
Tags
Attributes
- #[Route]
- '/new'
- $name: 'admin_client_subscription_new'
- $methods: ['GET', 'POST']
Return values
Response —Formulaire HTML admin/subscription_order/new.html.twig, ou redirection vers admin_subscription_orders_index après création réussie.
ordersIndex()
Liste les commandes correspondant à des souscriptions d'abonnement.
public
ordersIndex() : Response
Refuse l'accès hors ROLE_ADMIN/ROLE_OPERATOR. Sélectionne les Order jointes à au
moins un Payment rattaché à une souscription, triées par date de création décroissante.
Le résultat n'est pas paginé : la totalité des commandes est chargée.
Route : /admin/client-subscriptions/orders (GET), nom admin_subscription_orders_index.
Réservée à ROLE_ADMIN ou ROLE_OPERATOR (contrôle en dur dans la méthode).
Tags
Attributes
- #[Route]
- '/orders'
- $name: 'admin_subscription_orders_index'
- $methods: ['GET']
Return values
Response —Page HTML admin/subscription_order/index.html.twig.