Présentation & fonctionnalités
Les rôles et ce qu'ils peuvent faire
| Rôle | Accès au Hub | Périmètre |
|---|---|---|
| Adhérent | Aucun | Il n'existe pas de profil adhérent dans le Hub. adherent n'est pas un profil que l'on attribue, c'est la valeur par défaut du champ role et le résultat de la dérivation faite par lib/parcours.ts quand un membre ne porte aucun axe d'animation. Un membre dans cet état est refusé à la connexion (lib/auth.ts), avec une redirection vers /login?deny=adherent. L'accès minimum au Hub est animateur. |
| Animateur | Accès complet aux fonctionnalités d'animation | Création et édition d'ateliers grand public, sélection des co-animateurs, gestion des inscriptions et présences, accès aux supports pédagogiques « Animer ». Tableau de bord « Mes événements » avec section À venir/Terminés/Annulés. |
| Formateur | Accès animateur + formation | Création de formations, gestion des habilitations des participants, accès aux supports pédagogiques « Former ». Émission de badges aux formés. |
| Administrateur | Accès complet | Tous les droits : gestion des membres, événements, organisations, codes avantage, intégrations, paramètres. Modération des contenus. Important : les administrateurs ont isAdmin=true mais role='formateur' — toujours vérifier isAdmin dans le code, jamais seulement le role. |
Parcours : un animateur crée et anime un atelier
- Connexion via
/login(page dansapp/(auth)/login/) avec email/mot de passe ou LinkedIn OAuth. - Navigation vers
/membres/events/new(page dansapp/members/events/new/) — formulaire de création d'atelier (NewWorkshopFormdansapp/members/events/new/NewWorkshopForm.tsx). - Saisie du titre, description, date/heure/durée (avec timezone), localisation (autocomplétion BAN API), type (atelier/formation), contexte (grand public/inter-organisations), capacité, sélection des co-animateurs directs, prix personnalisés par tier.
- Création du plateau en ligne (si atelier en ligne) : sélection d'un modèle de plateau depuis
WorkshopModelen DB, création automatique d'une entréeBoardetBoardLotDistributionpar lot. - Publication via le bouton Publier dans
/membres/events/[id](page dansapp/members/events/[id]/page.tsx) → appel APIPUT /api/admin/workshops/[id]/publishqui change le statut àpublished. - Suivi des inscriptions sur la fiche atelier (
app/members/events/[id]/WorkshopRegistrationsTable.tsx) : liste des inscrits payés, boutons de pointage de présence (CheckInButton), accès aux résultats satisfaction viaSatisfactionResults. - Optionnel : ajout de co-animateurs après coup via
AnimatorsEditorsur la même page, avec rôle lead/co.
Les ateliers créés via le Hub alimentent aussi la vitrine publique LeSite (via une API publique /api/public/workshops).
Parcours : un participant s'inscrit et paie
- Navigation depuis LeSite vers une fiche atelier publique (
app/(no-header)/events/[slug]/). - Saisie des informations d'inscription (prénom, nom, email, téléphone optionnel) et sélection du tier tarifaire (solidaire/classique/soutien) sur
/checkout(dansapp/(inscription)/checkout/— page en construction ou formulaire intégré). - Appel API
POST /api/checkout/route.tsqui :- Valide les paramètres (email unique, capacité restante, tarif valide pour l'atelier).
- Crée une intention de paiement HelloAsso via
createCheckoutIntent()(danslib/helloasso.ts). - Crée une
Registrationen DB avecpaymentStatus='pending'et un token d'annulation (cancellationToken). - Redirige vers le lien de paiement HelloAsso (valide 15 min).
- Paiement sur HelloAsso, puis redirection vers
NEXT_PUBLIC_APP_URLavec les paramètres?checkoutIntentId=xxx&code=succeeded&orderId=yyy. - Webhook HelloAsso vers
/api/webhooks/helloasso(dansapp/api/webhooks/helloasso/route.ts) :- Valide le token de sécurité (
HELLOASSO_WEBHOOK_TOKENen query string). - Trouve la
RegistrationparhelloassoCheckoutIntentId. - Crée ou met à jour un
Participant(CRM). - Change la
RegistrationàpaymentStatus='paid'. - Génère une PDF d'invoice (via
lib/pdf.ts). - Envoie un email de confirmation avec la facture (via
Resenddanslib/email.ts).
- Valide le token de sécurité (
- Optionnel : reçoit un rappel email J-2 avant l'atelier (cron
POST /api/cron/reminders). - Après l'atelier (J+1), reçoit une invitation au questionnaire de satisfaction. Elle part du même cron que les rappels (
app/api/cron/reminders/route.ts, étape 5), et non d'un cron dédié : la fenêtre d'envoi est calculée parlib/satisfaction-window.ts, et le lien pointe vers/satisfaction/[token]. L'envoi n'a lieu que si le gabarit d'e-mailsatisfaction_invitationest activé. - Peut voir son badge obtenu et le partager (badges Open Badges 3.0).
Si le webhook est perdu : la Registration reste en pending ; un mécanisme de réconciliation quotidienne (job cron, voir LeRunbook) rattrape les inscriptions non confirmées en interrogeant HelloAsso en direct par les checkoutIntentId enregistrés.
Parcours : un formateur suit une formation et ses habilitations
- Connexion avec rôle
formateur. - Accès au dashboard qui affiche les formations à venir et les habilitations courantes (expiration).
- Navigation vers
/membres/resources(page dansapp/members/resources/page.tsx) — accès aux supports pédagogiques gating àaccess='formateur'(fichiers PDF, slides, liens). - Optionnel : création d'un atelier de test depuis
/membres/resources(onglet Supports) — création d'uneWorkshoptemporaire avec lien animateur direct SSO, expiration automatique 24h, suppression manuelle possible. - Attributions d'habilitations depuis l'admin (les habilitations sont créées pour chaque formé via le champ
habilitationAnimationethabilitationFormationsurMember), avec dates d'expiration (habilitationExpiry). - Suivi des parcours : 2 axes indépendants (animateur·ice / formateur·ice × citoyen·ne / pro), toggles Pro en admin, émission de badges automatique par lot selon les niveaux atteints.
Parcours : un administrateur pilote et modère
- Connexion avec
isAdmin=true(note:role='formateur'). - Navigation vers
/admin→ dashboard d'administration (app/admin/dashboard/). - Gestion des événements :
/admin/events(page dansapp/admin/events/page.tsx) — table de tous les ateliers, filtres, actions (Éditer/Publier/Annuler/Dupliquer/Supprimer), édition en masse des tarifications. - Modération des ateliers : activation/désactivation du mode
workshopModerationOnpour forcer la validation admin avant publication des ateliers animateurs. - CRM participants :
/admin/participants— table desParticipant(adresses email), édition (notes internes, étiquettes texte libre), historique cliquable, anonymisation RGPD à la suppression. - Gestion des membres :
/admin/members— le rôle pédagogique ne se choisit pas directement, il est dérivé des axes cochés dans le formulaire de parcours (lib/parcours.ts) : un axe formateur donneformateur, un axe animateur donneanimateur, aucun axe laisseadherentet donc aucun accès au Hub. La page gère aussi les habilitations (animation/formation, type grand public/inter-orga/interne), type de licence, étiquettes annuaire. - Organisations :
/admin/organisations— CRUD des fiches organisation avec type, SIRET (lookup API recherche-entreprises automatique), adresse, gestionnaires (liaison membre ↔ organisation). - Codes avantage :
/admin/discount-codes— CRUD des codes de réduction (% ou montant fixe), max utilisations, liaison optionnelle à un atelier. - Actualités :
/admin/blog— CRUD d'articles Markdown GFM complet, auteur via dropdown admins, image upload → WebP, PDF upload → carrousel sur LeSite via shortcode[pdf-carrousel:id], publication. - Médiathèque :
/admin/library— articles, livres, rapports, podcasts, vidéos avec types, thématiques, import CSV. - Modèles de plateau :
/admin/cards— création et gestion des modèles de plateau (lots, cartes, titres personnalisés par lot, réordonnement). - Templates emails :
/admin/emails— prévisualisation des 14 emails transactionnels (invitation, confirmation inscription, 3 issues d'annulation, reset MDP, rappel J-2, expiration cotisation/habilitation, liste d'attente, badge obtenu, invitation satisfaction, test config). - Paramètres :
/admin/parametres→ page multi-sections (IdentiteSection, EmailSection, IntegrationsSection, NotificationsSection, MentionsLegalesSection, UsageRightsPricingSection) — identité association, config email Resend, intégrations HelloAsso/Telegram/Logo.dev, notifications email/Telegram par événement admin. - Tarification :
/admin/pricing(page dansapp/admin/pricing/TarificationSection.tsx) — gestion desPricingPolicy(price par eventType × publicType × tier solidaire/classique/soutien). - Annulation/remboursement : gestion des demandes d'annulation (décision auto remboursement/avoir/blocage selon délai et statut de paiement). Remboursement HelloAsso automatique en pause — en attendant le privilège
RefundManagement, chaque demande déclenche une notif admin Telegram pour traitement manuel.