BCard - Documentation technique

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

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
throws
AccessDeniedException

Si l'utilisateur ne détient ni ROLE_ADMIN ni ROLE_OPERATOR.

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/user et les données du formulaire.

Tags
throws
AccessDeniedException

Si l'utilisateur ne détient ni ROLE_ADMIN ni ROLE_OPERATOR.

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
throws
AccessDeniedException

Si l'utilisateur ne détient ni ROLE_ADMIN ni ROLE_OPERATOR.

Attributes
#[Route]
'/orders'
$name: 'admin_subscription_orders_index'
$methods: ['GET']
Return values
Response

Page HTML admin/subscription_order/index.html.twig.


        
On this page

Search results