expria-frontend/docs/PARCOURS_UTILISATEURS.md
Hermann_Kitio 044a305019
Some checks are pending
CI / quality (push) Waiting to run
docs(t2-live): cloture documentaire Sprint 6e
- CHANGELOG : bloc Sprint 6e (Voie A, Bugs 4/5/6, indicateur, cleanup, removed).
- PARCOURS : section 4 T2 Live (notes + gating 30 mots, candidat initie, timers prepa/dialogue).
- ROADMAP : Sprint 6 marque livre (6b/6c/6e).
- GOLDEN_DATASET : D3 corrige (candidat en premier) + annotations Groupe D (D6 partiel, D7-D11 sprints futurs).
2026-06-29 14:35:43 +03:00

17 KiB
Raw Blame History

PARCOURS_UTILISATEURS.md — Expria / Coach TCF Canada

Document de référence — Version 1.1 Ce document décrit le parcours exact de chaque type d'utilisateur, depuis la page d'accueil. À lire conjointement avec PLANS_TARIFAIRES.md.


1. Visiteur non connecté

Arrive sur la page d'accueil
    ↓
Sections visibles :
    — Proposition de valeur principale
      (ce qu'est Expria, pour qui, pourquoi ça marche)
    — Aperçu des 6 tâches (EE + EO) avec description courte de chacune
    — Section "Comment ça marche"
      (3 étapes : tu t'entraînes → tu reçois un rapport → tu progresses)
    — Témoignages / résultats candidats
    — Section tarifaire (3 plans visibles, comparatif des features)
    — CTA principal : "Commencer gratuitement"
    — CTA secondaire : "Voir les offres"

2. Parcours — Plan Découverte (Free)

Inscription

Clique sur "Commencer gratuitement"
    ↓
Page d'inscription :
    — Email + mot de passe
    — OU connexion Google / Apple
    ↓
Compte créé → rôle assigné : "free" dans Supabase
    ↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
DASHBOARD FREE
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Contenu affiché :
    — Message de bienvenue + explication du plan Découverte
    — Compteur : "0/5 simulations utilisées"
    — Accès au mode entraînement uniquement
    — Aperçu flouté du dashboard complet (historique, indice de préparation)
      avec mention "Disponible en Standard"
    — Bouton "Choisir une tâche"

Simulation (dans la limite des 5 à vie)

Clique sur "Choisir une tâche"
    ↓
Sélection de la tâche :
    — EE Tâche 1 ✅
    — EE Tâche 2 ✅
    — EE Tâche 3 ✅
    — EO Tâche 1 ✅
    — EO Tâche 3 ✅
    — EO Tâche 2 (live) ❌ → cadenas + "Exclusivité Premium"
    ↓
Vérification backend : simulations_used < 5 ?
    — OUI → accès à la simulation
    — NON → modal de blocage (voir section "Quota atteint")
    ↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SIMULATION — Mode entraînement
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    — Interface de production
      (zone de texte pour EE / enregistrement audio pour EO)
    — Pas de tips accessibles
    ↓
Envoi pour correction
    ↓
Compteur mis à jour : simulations_used + 1
    ↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
RAPPORT FREE
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Affiché :
    — Score global /20 ✅
    — Niveau NCLC estimé ✅
    — Feedback court (2-3 lignes) ✅

Flouté avec cadenas :
    — Détail par critère → "Disponible en Standard" 🔒
    — Explication des erreurs → "Disponible en Standard" 🔒
    — Production modèle → 1 phrase visible + "Voir plus en Standard" 🔒
    — Suggestions d'idées → 1 phrase visible + "Voir plus en Standard" 🔒
    — Exercices personnalisés → titre visible + "Disponible en Standard" 🔒
    ↓
Bandeau discret en bas du rapport :
    "Vous avez utilisé X/5 simulations gratuites.
     Débloquez le rapport complet et l'entraînement illimité."
    [Voir les offres]

Quota atteint (6e tentative)

Tentative de lancer une nouvelle simulation
    ↓
Modal de blocage :
    "Vous avez utilisé vos 5 simulations gratuites.
     Pour continuer votre préparation, choisissez un plan."
    [Passer en Standard]  [Passer en Premium]  [Plus tard]

3. Parcours — Plan Standard

Abonnement

Arrive sur la page tarifaire
(depuis la page d'accueil, ou depuis le modal de blocage du plan Free)
    ↓
Clique sur "Choisir Standard"
    ↓
Stripe Checkout — 19,90€ / 4 semaines
    ↓
Paiement réussi
    ↓
Webhook Stripe : checkout.session.completed
    → plan mis à jour : "standard" dans Supabase
    → redirection vers dashboard Standard
    ↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
DASHBOARD STANDARD
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Contenu affiché :
    — Message de bienvenue + confirmation d'accès
    — Historique des productions (vide au départ)
    — Indice de préparation (activé après 5 productions)
    — Accès mode entraînement ✅
    — Accès mode examen ❌ → cadenas + "Exclusivité Premium"
    — Bouton "Choisir une tâche"

Simulation (illimitée)

Clique sur "Choisir une tâche"
    ↓
Sélection de la tâche :
    — EE Tâche 1 ✅
    — EE Tâche 2 ✅
    — EE Tâche 3 ✅
    — EO Tâche 1 ✅
    — EO Tâche 3 ✅
    — EO Tâche 2 (live) ❌ → cadenas + "Exclusivité Premium"
    ↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SIMULATION — Mode entraînement
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Options activables avant de commencer :
    — Toggle "Afficher les suggestions d'idées" ✅
    — Toggle "Mode focus" (masquer les tips — simuler les conditions réelles) ✅
    ↓
Production :
    — Zone de texte (EE) / Enregistrement audio (EO)
    — Si tips activés : suggestions d'idées disponibles sans quitter la page
    ↓
Envoi pour correction
    ↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
RAPPORT STANDARD (complet)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Affiché en totalité :
    — Score /20 + NCLC ✅
    — Détail par critère ✅
    — Explication des erreurs détectées ✅
    — Production modèle basée sur la copie ✅
    — Exercices personnalisés liés à CETTE production ✅
    ↓
Production enregistrée automatiquement dans le dashboard
    ↓
Bandeau discret (max 1 fois toutes les 3 sessions) :
    "Passez en Premium pour vous entraîner en conditions réelles
     et simuler le dialogue avec l'examinateur."
    [En savoir plus]

Dashboard — Consultation

Dashboard Standard
    ↓
Liste de toutes les productions (date, tâche, score, NCLC)
    ↓
Clique sur une production
    → Rapport complet correspondant affiché
    ↓
Après 5 productions enregistrées :
    — Indice de préparation affiché ✅
      (score dynamique basé sur progression + régularité)

Tentative d'accès aux features Premium

Clique sur "Mode Examen" ou "EO Tâche 2 live"
    ↓
Message :
    "Le mode Examen et la simulation live de la Tâche 2
     sont réservés au plan Premium."
    [Passer en Premium]  [Pas maintenant]

Upgrade Standard → Premium en cours d'abonnement (prorata)

Clique sur "Passer en Premium"
    ↓
Page d'upgrade — Stripe calcule le prorata en temps réel
    ↓
Affichage du montant exact avant confirmation :
    "Il vous reste X jours sur votre abonnement Standard.
     Vous paierez [montant calculé]€ aujourd'hui
     pour accéder au plan Premium jusqu'au [date de fin actuelle]."
    [Confirmer]  [Annuler]
    ↓
Confirmation → Stripe débite le montant du prorata
    ↓
Webhook Stripe : invoice.paid
    → plan mis à jour : "premium" dans Supabase
    → accès Premium immédiat, sans reconnexion
    ↓
Dashboard Premium affiché
    — Message : "Bienvenue en Premium. Votre accès est actif jusqu'au [date]."

Règle : L'utilisateur ne paie jamais le plein tarif Premium si il était déjà abonné Standard. Stripe crédite les jours non consommés du Standard et facture uniquement la différence.

Expiration de l'abonnement Standard

Webhook Stripe : customer.subscription.deleted
    → plan remis à "free" dans Supabase
    ↓
À la prochaine connexion :
    — Dashboard Free affiché
    — Message :
      "Votre abonnement Standard a expiré.
       Vos productions sont conservées.
       Renouvelez pour y accéder à nouveau."
    — Productions : conservées en base
      (non accessibles en lecture tant que plan = "free")
    — Compteur simulations free :
      reprend là où il s'était arrêté avant l'abonnement

4. Parcours — Plan Premium

Abonnement

Arrive sur la page tarifaire
(depuis la page d'accueil, le dashboard Free, ou le dashboard Standard)
    ↓
Clique sur "Choisir Premium" ou "Passer en Premium"
    ↓
Stripe Checkout — 39,90€ / 4 semaines
    ↓
Paiement réussi
    ↓
Webhook Stripe : checkout.session.completed
    → plan mis à jour : "premium" dans Supabase
    → redirection vers dashboard Premium
    ↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
DASHBOARD PREMIUM
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Contenu affiché :
    — Historique complet des productions
    — Indice de préparation (actif dès 5 productions)
    — Analyse des patterns (active dès 5 productions)
    — Accès mode entraînement ✅
    — Accès mode examen ✅
    — Accès EO Tâche 2 live ✅
    — Bouton "Choisir une tâche"
    — Bouton "Lancer un examen"

Simulation entraînement — EO Tâche 2 live

Choisit EO Tâche 2 — Interaction live
    ↓
Page de préparation :
    — Explication du déroulé
      (l'IA joue le rôle de l'examinateur)
    — Consigne de la tâche affichée
    — Zone de notes personnelles (brouillon local du candidat)
    — Bouton "Suggestions d'idées"
        → propose des pistes pour nourrir la préparation
        → débloqué seulement quand les notes atteignent ~30 mots
          (évite une demande d'idées "à vide")
    — Bouton "Démarrer le dialogue"
    ↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SIMULATION LIVE — T2 Expression Orale
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    — Le candidat ouvre l'interaction de service (il a besoin d'une
      information et initie la conversation — format réel TCF Canada)
    — L'examinateur (IA) répond ensuite et relance le dialogue
    — Le candidat poursuit en audio en temps réel
    — La voix de l'IA est jouée sans blanc ni coupure ;
      voix de l'examinateur et voix du candidat partagent la même
      horloge audio (dialogue fluide, sans décalage)
    — Un indicateur signale qui a la parole
      (le candidat parle / il écoute l'examinateur)
    — L'IA adapte ses relances selon les réponses du candidat
    — Timer de préparation 2:00 (transition automatique vers le dialogue à 0:00)
    — Timer de dialogue 3:30 (210 s)
    ↓
Pendant le dialogue, le candidat peut :
    — "Annuler" → quitte la simulation sans évaluation,
      aucun rapport généré, aucun enregistrement conservé
    ↓
Fin du dialogue (candidat ou IA clôture)
    ↓
Écran terminal :
    — Bouton "Télécharger l'audio" (enregistrement WAV du dialogue complet,
      voix candidat + examinateur mixées sur une seule piste)
    — Bouton "Voir le rapport" → /rapport/:id
    — Bouton "Nouvelle simulation" → relance le parcours T2 Live
    ↓
Rapport complet généré (même structure que les autres tâches) ✅
    ↓
Production enregistrée dans le dashboard avec tag "T2 Live"

Mode Examen

Clique sur "Lancer un examen"
    ↓
Choix de l'épreuve :
    — Expression Écrite (60 min)
    — Expression Orale (12 min)
    ↓
Page d'avertissement :
    "Une fois lancé, le timer ne peut pas être arrêté.
     Votre production sera envoyée automatiquement
     à l'expiration du temps, même si vous n'avez pas terminé."
    [Je comprends — Lancer l'examen]  [Annuler]

Si Expression Écrite :

    ↓
3 tâches affichées simultanément sur la même page
Timer 60:00 visible en permanence (coin supérieur)
Zone de texte active
    ↓
À T=0 :
    — Zone de saisie figée (readOnly) ⛔
    — Envoi automatique déclenché ✅
    — Message : "Temps écoulé. Votre production a été envoyée."
    ↓
Rapport complet affiché ✅
Production enregistrée avec tag "Mode Examen"

Si Expression Orale :

    ↓
Tâches enchaînées (T1 → T3 → T2)
Timer global 12:00 visible
Enregistrement audio actif
    ↓
À T=0 :
    — Enregistrement stoppé ⛔
    — Envoi automatique déclenché ✅
    — Message : "Temps écoulé. Votre production a été envoyée."
    ↓
Rapport complet affiché ✅
Production enregistrée avec tag "Mode Examen"

Analyse des patterns

Dashboard → section "Mon profil de préparation"
    ↓
Condition : 5 productions enregistrées minimum
    ↓
SI condition remplie :
    ↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ANALYSE DES PATTERNS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Analyse automatique des 5 dernières productions
    ↓
Affichage des erreurs récurrentes classées par type :
    — Structurelles (organisation des idées, cohérence)
    — Lexicales (répétitions, registre, richesse)
    — Morphosyntaxiques (accords, conjugaison, syntaxe)
    ↓
Distinction visuelle :
    — Erreur ponctuelle (1 occurrence) → signalée
    — Pattern répété (3+ occurrences sur 5 productions) → mis en évidence
    ↓
Exercices long terme générés :
    — Spécifiques aux patterns détectés
    — Distincts des exercices du rapport individuel
    — Renouvelés automatiquement à chaque nouvelle analyse
    ↓
Indice de préparation :
    — Score dynamique 0 → 100
    — Basé sur : moyenne des scores récents + régularité + courbe de progression
    — Messages interprétatifs :
        · < 40  : "Continuez à vous entraîner régulièrement"
        · 4070 : "Bonne progression — visez NCLC 7-8"
        · > 70  : "Vous êtes en bonne voie pour NCLC 9+"

Expiration de l'abonnement Premium

Webhook Stripe : customer.subscription.deleted
    → plan remis à "free" dans Supabase
    ↓
À la prochaine connexion :
    — Dashboard Free affiché
    — Message :
      "Votre abonnement Premium a expiré.
       Toutes vos productions sont conservées.
       Renouvelez pour retrouver l'accès complet."
    — Productions : conservées en base
    — Accès mode examen, T2 live, patterns : coupé immédiatement
    — Compteur simulations free : reprend là où il s'était arrêté

5. Matrice des upgrades / downgrades

Depuis → Vers Action Montant facturé Délai Données
Free → Standard Stripe Checkout 19,90€ Immédiat après webhook Conservées
Free → Premium Stripe Checkout 39,90€ Immédiat après webhook Conservées
Standard → Premium Prorata Stripe Différence au prorata Immédiat après webhook Conservées
Premium → Standard Résiliation + nouvel abonnement 19,90€ Immédiat après webhook Conservées
Premium → Free Résiliation Immédiat après webhook Conservées
Standard → Free Résiliation Immédiat après webhook Conservées

Règle absolue : les productions ne sont jamais supprimées, quel que soit le changement de plan. L'accès aux features change. Les données restent.

Détail du prorata Standard → Premium

Stripe crédite automatiquement les jours non consommés du plan Standard et facture les jours restants au tarif Premium. L'utilisateur voit le montant exact avant de confirmer. Aucun calcul manuel requis côté code — comportement natif de Stripe via subscription.update() avec proration_behavior: 'always_invoice'.