# Évolution LMS EFEKTIVACADEMIE — Analyse « Features UX » (05/08/2026)

**Source** : `Features UX.docx` (éléments bruts) croisé avec :
- l'exploration complète des repos de référence `EFEKTIVACADEMIE-BACK` (Laravel 12) et `EFEKTIVACADEMIE-FRONT` (React 19 / Vite) — exploration initiale menée sur les clones EACLAUDE (≈ branche `main`), puis **re-vérifiée le 05/08 contre la branche `development` de référence** (celle déployée) ; les écarts constatés sont intégrés ci-dessous,
- `docs/BESOIN_EVOLUTION_PILOTAGE.md` (audit 04-05/08 : le LMS enregistre des états, pas des événements),
- les évolutions déjà réalisées (MVP fil d'Ariane, séparation pilotage/apprentissage, filtres Mes cours),
- l'architecture produit : pipeline microlearning = génération d'artefacts, LMS = orchestration/délivrance.

---

## 1. Inventaire normalisé des demandes

| Réf | Domaine | Contenu (synthèse) |
|---|---|---|
| A | Page cours apprenant | 3 onglets Menu/Ressources/Chat ; suppression bandeau blanc + menu ; téléchargement par support (PDF + transcript voix off du pipeline, masqué si absent, liaison PDF↔vidéo/audio dans l'admin) ; statut « terminé » par support ; lancement vidéo/réel/podcast depuis la ligne du support ; deeplink par support avec minutage ; durée leçon = somme des durées des supports ; badge cliquable par leçon terminée → certificat ; reprise à la seconde ; bouton retour ; URLs sans accents |
| B | Mes cours | Statut Non débutée/En cours/Terminée ; % d'avancement ; certificat + téléchargement |
| C | Transverse | Notifications (liste d'événements « à compléter ») ; export Excel de tous les tableaux ; retour = page précédente partout ; colonnes réordonnables (DnD) + afficher/masquer, mémorisé par utilisateur |
| D | Admin — Utilisateurs | 3 menus (Utilisateurs/Cours/Paramètres) ; recherche tous champs ; nouveaux champs BDD société + profil ; manager de rattachement (+ hover card) ; inversion du rattachement (à la création : choisir le manager) ; manager sans apprenant possible ; tris tous champs ; filtres rôle/statut/manager ; vue formations suivies (qui a affecté, quand) |
| E | Admin — Cours | Menu Parcours/Cours/Tuto/Catégorie/Sous-catégorie/Balises ; switch Brouillon/Publié + confirmation ; filtres ; vignettes cat/sous-cat cliquables ; réorganisation DnD (formations dans une cat, cat/sous-cat entre elles) ; « Ajouter » avec choix Cours/Tuto/Parcours ; création de cours : accordéons, DnD direct sections+supports, édition inline des libellés, boutons simplifiés (éditer/publier/supprimer + confirmations), + de type de support |
| F | Quiz | Accordéon ; DnD questions/réponses ; génération assistée depuis le contenu du module ; banque de questions partagée taguée + tirage aléatoire N parmi M ; politique de passage (tentatives, délai, limite de temps, feedback immédiat/fin, mélange) ; pondération ; import/export GIFT/CSV ; duplication ; recherche/repli >20 questions ; journal des modifications ; types appariement + ordonnancement |
| G | Chat | Admin↔managers ; filtres rôle/entité ; recherche user ; suppression visio admin ; onglets chat/groupe ; non-lus antéchronologiques ; pièces jointes ; ouverture : « Parler à un admin » ou « Demande de support » ; chatbot à creuser ; date+heure ; gestion membres de groupe ; notification par message |
| H | Annonces | Message à un groupe de users sélectionnés ; épinglé en haut du chat ; notif à chaque envoi |
| I | Tickets | Ouverture par manager uniquement ; statut urgent (?) ; chat sur le ticket ; numéro auto ; suivi de statut ; filtres/tris ; clôture + indicateur résolu/en cours |
| J | Manager | Menus réduits (Dashboard/Invitation/Utilisateurs/Rôle) ; mail onboarding 1ʳᵉ connexion ; 1 mail par user par envoi (pas par formation) ; création users = admin only ; « Mes collaborateurs » (hiérarchie directe, colonnes riches, icône mail, compteurs formations, certificats) ; sélection multiple + actions de masse ; ligne cliquable → détail formations → cockpit par formation (résultats quiz, durées et nb de connexions, temps total, docs téléchargés, tentatives) |
| K | Manager général / Directeur | Idem manager + « Mes équipes » (hiérarchie directe+indirecte) + colonnes Manager, Société ; règle : >1 niveau hiérarchique ⇒ afficher l'onglet |
| L | Manager RH | Idem MG + « Tous les collaborateurs » |
| M | Formateur | Liste apprenants enrichie (formation, statut, inscription, dernière connexion, certificat) ; accès au même cockpit ; chat avec ses apprenants |
| N | Autres | Support d'éval « mise en situation » (mini-cas + questions) ; question ↔ objectif pédagogique + lien de remédiation minuté (« revoir Repères à 2:15 ») ; analyse des items (% réussite, discrimination, distracteurs) ; temps passé par support ; intégrateur automatique SCORM ; refonte dashboard |

---

## 2. État de l'existant — acquis et manques (résultat d'exploration)

### 2.1 Acquis réutilisables
- **Chat déjà présent** (1-à-1, groupes, fil de discussion par cours avec likes/follows) avec Laravel Echo + Pusher câblés (`BROADCAST_CONNECTION=log` à activer). La refonte chat est une **évolution**, pas une création.
- **Spatie roles** : 7 rôles référencés (`learner`, `teacher`, `manager`, `admin`, `sub_manager`, `manager_general`, `director`) — mais `director`/`manager_general` non seedés, et **pas de rôle RH**.
- **`users.parent_id`** existe (rattachement mono-parent) → base de « Mes collaborateurs / Mes équipes ».
- **`learning_paths`** avec vrai statut `draft/published` → modèle à généraliser aux cours.
- **maatwebsite/excel** installé (1 export existant) ; **dompdf** pour certificats (auto à 100 %) ; **gamification** points/badges (support du « hall of fame ») ; **invitations** (table + jobs) ; **notifications** maison (4 types, non affichées côté front).
- **DnD** déjà pratiqué (catégories, cours, questions) — mais dans des modales et avec 2 libs dont une dépréciée.

### 2.2 Manques structurels (à construire de zéro)
1. **Tracking événementiel** : aucune vue de leçon, aucun temps passé, aucune journalisation de connexion ni de téléchargement (fichiers servis en statique public non authentifié), position de lecture inexistante, tentatives de quiz **écrasées** à chaque essai. → conditionne cockpit manager, temps par support, analyse d'items, reprise à la seconde, dashboard.
2. **Typologie de supports** : le modèle ne connaît que `lesson` (1 média deviné par extension) et `quiz`. Pas de podcast/réel/article/fiche/mise en situation typés.
3. **% d'avancement** : aucun pourcentage stocké ni exposé par apprenant×cours ; les 3 états n'existent qu'en agrégats dashboard.
4. **Société / profil métier** : aucune table entreprise, aucun champ profil.
5. **Tickets, annonces** : zéro occurrence dans les deux repos.
6. **Notifications** : ~~cloche front commentée~~ → fonctionnelle sur `development` (cf. §2.4) ; le back reste limité à 5 types, sans préférences ni emails couplés ; aucun push.
7. **SCORM/xAPI** : zéro occurrence.
8. **Brouillon/Publié cours** : binaire actif/inactif (le front l'affiche déjà « Brouillon/Publié » mais sans workflow ni confirmation).
9. **Datatable** : tables maison dupliquées (tri sur 2-3 colonnes recopié 6×), pas de filtres, pas de gestion de colonnes, 1 seul export Excel.
10. **Quiz** : 2 types de questions, pas de pondération, `passing_percentage` stocké mais **jamais évalué**, pas de banque, pas de politique de passage.
11. **Navigation** : pas de sidebar ; 2 pages géantes à onglets (`AdminUsers.jsx` 3 358 l., `CreateCourse.jsx` 2 099 l.) ; duplications massives (StudentCourseDetail/AdminCourseDetail, AddQuiz/AdminAddQuiz, 4 écrans « utilisateurs » quasi identiques).

### 2.3 Bugs / failles à corriger dans la même vague (audit + exploration)
- **Sécurité** : IDOR sur téléchargement de certificat (`find($id)` sans contrôle de propriété) ; ZIP de TOUT le dossier certificats pour un manager sans `course_ids` ; création d'utilisateur sans liste blanche de rôles côté serveur (un sub_manager peut créer un admin) ; fichiers de cours publics non authentifiés ; upload sans restriction MIME ; **secret ZegoCloud en clair dans le front** ; `ProtectedRoute` sans contrôle de rôle (rôle lu en localStorage) ; mot de passe transmis en clair par email (rand 6 chiffres).
- **Reporting** : `getSingleCourseStats` ignore le périmètre managérial ; `CourseCompleRation` sans `unique()` ; `month-wise-chart` non filtré ; `sidebarStatics` switch sans `break`.
- **Schéma** (état `development`, cf. §2.4) : `users.is_active`, `order_no` et `courses.category_id` ont désormais leurs migrations ; restent fantômes `sections.description`/`start_date`/`frequency`/`start_after_enroll` (fillable sans migration), `sections.required_score` (colonne morte) et l'écriture `enrollments.is_complete` → **valider le schéma réel de la prod avant chiffrage**.
- **Divers** : pagination 20 en dur ; certificat généré sur cours vide ; `completed_courses` sans unicité ; enrollment forcé `Approved` par l'invitation.

---

### 2.4 Addendum — re-vérification sur la branche de référence `development` (05/08)

L'exploration initiale ayant été menée sur les clones EACLAUDE (≈ `main`), tous les constats ont
été re-vérifiés contre `origin/development` (front `d15c204`, back `5a358d0`). **Verdict global :
l'analyse tient** — manques structurels (§2.2 points 1-5, 8-11) et bugs/failles (§2.3) confirmés
sur la branche de référence. Corrections et nouveautés à intégrer :

**Constats corrigés (development a avancé) :**
- **Notifications front : FONCTIONNELLES** (contrairement au clone) — cloche, compteur non-lus,
  marquage lu, service API actifs (`NavbarPanel.jsx:1048-1134`). Le back reste limité à **5 types**.
  → EA-024/025 deviennent une *extension* (matrice d'événements, préférences, emails), pas une création.
- **Complétion : auto à 50 % de visionnage** (natif, YouTube, Vimeo via postMessage) — le bouton
  « Terminer la leçon » est supprimé. Vimeo reste en iframe mais **piloté par l'API postMessage**
  (événements de lecture disponibles). La reprise n'existe qu'en mémoire React (perdue au rechargement).
- **Slugs : ils existent** — 6 entités côté back (trait `HasSlug`, accents translittérés), routes front
  `/courses/:slug`… **MAIS** aucune route API ne résout un slug : le front fabrique la table slug→id en
  `localStorage`. **Bug réel : un lien partagé ne fonctionne pas dans un autre navigateur.** → EA-038 rescopée.
- **Schéma** : `users.is_active` et `lessons/quizzes.order_no` ont désormais leurs migrations
  (`2026_03_20`, ⚠️ `down()` vide sur is_active) ; `courses.category_id` existe (`2025_10_03`,
  ⚠️ FK `onDelete cascade` : supprimer une catégorie **détruit ses cours**). Restent fantômes :
  `sections.description` + `sections.start_date/frequency/start_after_enroll` (fillable sans migration),
  `sections.required_score` (colonne morte), écriture `enrollments.is_complete` à vérifier.
- **Quiz** : `development` a livré les **commentaires de réponse par option** (`answer_comment` +
  `show_answer_comments`, restitués après soumission) et les **quiz autonomes** (`is_standalone_enabled`).
  ⚠️ La notification de quiz autonome est diffusée à **tous les apprenants de la plateforme** (aucun
  périmètre) avec une boucle d'emails **synchrone** — risque de timeout à la publication (à corriger).
- **Export Excel** : présent sur 4 pages (pas 1) — toujours le seul export users.
- **Qualité** : ~40 suites de tests back (PHPUnit) et ~30 fichiers de tests front (Vitest) sont apparus ;
  sanitization XSS globale (middleware + HTMLPurifier) ; Swagger/OpenAPI sur la quasi-totalité des
  contrôleurs (explique l'essentiel du volume du diff) ; migration CSS→SCSS front complète.

**Aggravations constatées (à traiter en CH0) :**
- Escalade de privilèges complète : `assignRole($validated['role'])` **avant** le garde-fou, `role`
  sans liste blanche, 5 points d'entrée → un `sub_manager` peut créer un `admin` en une requête
  (la règle `in:` correcte existe ailleurs dans le même contrôleur, ligne 920 — régression).
- IDOR certificats confirmé + **500** sur ID inexistant (`find()` non testé null) ; fichiers sur disque public.
- `deleteFile`/`getFiles` des ressources de cours : sans contrôle de propriété ni d'inscription.
- L'invitation **écrase silencieusement une inscription existante** (delete puis re-create `Approved`).
- Fichiers parasites versionnés (sorties de debug, `php.ini`…) à purger.

## 3. Implications majeures

1. **Le tracking est le socle de la moitié du document.** Cockpit manager (durées, connexions, téléchargements, tentatives), temps par support, analyse des items, reprise à la seconde, % d'avancement fiable, dashboard refondu : tout repose sur le journal d'événements décrit dans `BESOIN_EVOLUTION_PILOTAGE.md`. Il doit passer **en premier** — chaque semaine sans lui est une semaine de données perdues.
2. **Le vocabulaire cible change le modèle de données.** Le doc parle de *formation > leçon > supports (vidéo, podcast, réel, article, fiche, quiz…)* avec durée de leçon = somme des supports. Le modèle actuel est *course > sections > lessons (1 média) + quiz*. Deux lectures possibles : (a) renommage (section=leçon, lesson=support) + typage explicite des supports ; (b) vraie refonte du modèle. La lecture (a) est réaliste et rétrocompatible — mais c'est une **décision structurante à valider avant tout développement contenu** (voir Z1).
3. **La refonte de navigation est un prérequis d'UI.** « 3 menus admin », « menus pilotage réduits », « onglets à côté du cours » : rien de tout cela ne tient dans les pages monolithiques actuelles. Il faut une **coquille de navigation (sidebar + layout routes + gardes par rôle)** avant d'y ranger les écrans — sinon chaque feature aggrave les fichiers de 3 000 lignes.
4. **Un composant datatable transverse est rentabilisé immédiatement.** Tri tous champs, filtres, recherche, export Excel, colonnes DnD + show/hide par user sont demandés sur *toutes* les listes : à construire une fois (composant + endpoint générique + table `user_preferences`), puis à déployer écran par écran.
5. **La hiérarchie utilisateurs devient un vrai graphe d'organisation.** Société, profil, manager de rattachement, équipes indirectes (récursif), règle d'affichage « >1 niveau » : nécessite CTE récursives (MySQL 8), un référentiel sociétés, et une matrice rôles×périmètres refondue (aujourd'hui 5 blocs de routes copiés-collés et des périmètres incohérents selon les endpoints).
6. **Adhérence forte avec le pipeline microlearning** (repo `microlearning-video-v2-light`) — en respectant la règle d'architecture « le pipeline génère des artefacts, le LMS orchestre » :
   - *Transcripts voix off* : le pipeline possède la narration et les timings Whisper → il doit **produire un artefact PDF transcript par vidéo/audio** ; le LMS ne fait que le lier et le servir.
   - *Génération assistée de quiz* : le pipeline sait générer des quiz groundés (jury, publish gate). Côté LMS : import + banque de questions ; la génération reste pipeline-side (tout nouveau type de support ⇒ registre `SUPPORT_GENERATORS` + grounding obligatoire).
   - *Mise en situation* : idem — nouveau type de support pipeline (groundé, jury) + rendu/éditeur LMS.
   - *Remédiation minutée* (« revoir Repères à 2:15 ») : les timestamps existent pipeline-side (Whisper). Le contrat LMS JSON v1 a été décidé « zéro timing » (le QUAND du rappel appartient au LMS) — mais le minutage intra-vidéo est un attribut de **contenu**, pas d'orchestration. Il faut un **contrat v2** ajoutant le mapping question→objectif→(support, timestamp). C'est une évolution de contrat inter-repos à spécifier avant de coder.
   - *SCORM* : le pipeline exporte SCORM 1.2/xAPI ; le LMS n'a rien. « Intégrateur automatique » = soit ingestion du manifeste JSON pipeline (léger, déjà spécifié), soit vrai player SCORM générique (chantier lourd, mais ouvre l'import de contenus tiers). Décision de portée nécessaire.
7. **Notifications = socle transverse à concevoir une fois** : matrice événements (cours ajouté/terminé, chat, annonce, ticket, invitation…) × canaux (in-app / email / push) × rôles, avec préférences. L'infra Pusher existe ; le back a une table maison embryonnaire ; le front n'affiche rien.
8. **RGPD** : le tracking nominatif (temps, connexions, téléchargements) et l'export Excel généralisé imposent minimisation, rétention, information des utilisateurs et périmètres d'accès par rôle — à traiter en conception, pas après coup.
9. **Appliquer la politique de passage change le comportement existant** : aujourd'hui un quiz est « complété » quel que soit le score (le seuil n'est jamais évalué). Activer seuil + tentatives limitées est une **régression volontaire** à annoncer (migration des acquis existants à décider).

---

## 4. Zones d'ombre — à clarifier avant ou pendant le cadrage

**Structurantes (bloquent la conception)**
- **Z1. Modèle Formation/Leçon/Support** : confirmer la lecture « section=leçon, lesson=support typé » (recommandée) et la liste des types de supports cible (vidéo, podcast, réel, article, fiche, quiz, mise en situation, tuto ?). Conditionne A, E, N.
- **Z2. Matrice des rôles cible** : correspondance exacte doc↔code (`Manager` du doc = `sub_manager` ? `manager` actuel = admin fonctionnel ?), création du rôle **Manager RH** (n'existe pas), devenir de `teacher`, et périmètre de données par rôle. Le doc édicte une règle générique (« >1 niveau hiérarchique ⇒ onglet Mes équipes ») qui suggère un rendu piloté par la profondeur plutôt que par le rôle — à confirmer.
- **Z3. Société** : simple référentiel (table `companies` + `users.company_id`) ou début de multi-tenancy avec cloisonnement des données ? (Impact énorme sur tout le reste ; le référentiel simple est recommandé à ce stade.)
- **Z4. SCORM** : ingestion du manifeste pipeline (recommandé en premier) vs player SCORM générique (import de paquets tiers) — quelle ambition, quel horizon ?
- **Z5. « Durée » d'un support** : source de vérité (métadonnée du média ? oEmbed Vimeo ? saisie admin ?) et définition pour les supports non temporels (article, fiche). Conditionne durée de leçon et % d'avancement.
- **Z6. % d'avancement** : formule exacte (supports terminés/total ? pondéré par durée ? quiz inclus ?).
- **Z7. Remédiation minutée** : qui fournit les timestamps (pipeline via contrat v2 — recommandé — vs saisie manuelle admin) ; format du deeplink (`?support=X&t=135`).

**Fonctionnelles (à trancher en atelier)**
- **Z8. Badge/certificat par leçon** (ligne A) vs certificat par formation (existant, ligne B) : certificat de leçon voulu, ou badge = accès au certificat du cours ? (Recommandation : certificat au niveau formation uniquement, badge de leçon = jalon visuel.)
- **Z9. Tickets vs « Demande de support »** du chat apprenant : les apprenants créent-ils des tickets (le doc dit « manager uniquement ») ou leurs demandes restent-elles du chat ? Conversion chat→ticket par l'admin ?
- **Z10. Menu manager « Rôle »** : que recouvre cet écran (consultation des rôles ? gestion ?) — les managers ne créant plus d'utilisateurs.
- **Z11. Notifications** : liste des événements (« à compléter » dans le doc), canaux (in-app seul ? + email ? + push web ?), préférences par user.
- **Z12. Visio** : « dégager la visio sur Admin » — la retirer partout (recommandé : le secret ZegoCloud est exposé dans le front, la feature est de toute façon à refaire) ou la conserver côté apprenants ?
- **Z13. Invitation vs création** : « seuls les admins créent des utilisateurs » — l'invitation par email crée aujourd'hui des comptes à la volée. Les managers ne peuvent-ils plus qu'inscrire des utilisateurs *existants* ?
- **Z14. Politique de passage** : valeurs par défaut (tentatives, délais, temps) et sort des acquis existants quand le seuil deviendra bloquant (cf. implication 9).
- **Z15. Statut « urgent »** des tickets : le doc met « (?) » — trancher (recommandation : priorité normal/urgent simple).
- **Z16. Export Excel « tous les tableaux »** : périmètre exact par rôle (RGPD — un formateur exporte-t-il les données nominatives de tous les apprenants ?).
- **Z17. « Tuto »** : nouveau type de contenu au même niveau que Cours/Parcours — définition exacte (cours mono-leçon ? catégorie ?).
- **Z18. URLs sans accents** : le front actuel n'utilise que des IDs numériques (aucun slug) — la demande vise-t-elle les liens à venir (deeplinks/partage) ? Stratégie de slugs à définir.
- **Z19. Chatbot (chatnode)** : étude séparée, hors sprints de dev — cadrer l'expérimentation.
- **Z20. Banque de questions — usages ludiques** (« hall of fame : qui sera le maître de la DO ? ») : cadrer en conception gamification (les tables points/badges existent).
- **Z21. Environnement cible** : la référence est `EFEKTIVACADEMIE-FRONT/BACK` (acté 05/08) — préciser la branche de travail (`development` = déployée) et la stratégie de branches/PR par sprint. Les issues GitHub seront créées sur ces repos (après les ateliers).
- **Z22. Schéma prod** : valider les divergences migrations/base réelle (cf. §2.3) avant chiffrage ferme.

---

## 5. Conflits et adhérences

| # | Conflit / adhérence | Nature | Résolution proposée |
|---|---|---|---|
| C1 | Politique de passage vs `passing_percentage` jamais évalué | Régression volontaire | Décision Z14 + migration des acquis + communication |
| C2 | Deeplink minuté / remédiation vs contrat LMS JSON v1 « zéro timing » | Conflit de contrat inter-repos | Contrat v2 : timestamps = attribut de contenu (pipeline), le QUAND du rappel reste LMS. Spéc commune avant dev |
| C3 | « Création users admin-only » vs 5 blocs de routes ouverts + invitation qui crée des comptes | Resserrage sécurité | Retrait des routes + liste blanche serveur + Z13 |
| C4 | « 1 mail par user » vs double boucle (user×formation) + enrollment forcé `Approved` | Refonte invitation | Regroupement par user + templates HTML + statut d'inscription propre |
| C5 | « 3 onglets Menu/Ressources/Chat » vs 4 onglets actuels (À propos, Ressources, Conversations, Quiz) | Ambiguïté UI | Maquette page cours : où vont « À propos » et le quiz (support à part entière ?) |
| C6 | « Réduire à Dashboard/Invitation/Utilisateurs/Rôle » vs 7 onglets manager actuels | Refonte navigation | Z10 + maquettes navigation |
| C7 | Suppression visio vs visio existante côté user (secret exposé) | Sécurité + périmètre | Z12 — recommandation : retrait complet |
| C8 | Badge par leçon vs certificat par cours | Ambiguïté | Z8 |
| C9 | « Leçon = somme des supports » vs modèle 1 leçon = 1 média | Modèle de données | Z1 — renommage + typage recommandé |
| A1 | Tracking ↔ `BESOIN_EVOLUTION_PILOTAGE.md` | Adhérence interne | Un seul chantier socle commun (mêmes tables, mêmes événements) |
| A2 | Transcripts, quiz générés, mise en situation, remédiation ↔ pipeline | Adhérence inter-repos | Artefacts produits pipeline-side (grounding + jury obligatoires), consommés LMS-side ; contrat v2 |
| A3 | Objectifs pédagogiques ↔ système de notions (référentiel N1-N4) + courbe de désapprentissage | Adhérence produit | Les « objectifs » des questions = notions du référentiel (ids stables), pas un nouveau vocabulaire |
| A4 | Hall of fame ↔ gamification existante (points/badges) | Adhérence interne | Réutiliser `point_master`/`badges` |
| A5 | MVP fil d'Ariane déjà réalisé (page cours, filtres, bascule pilotage/apprentissage) | Adhérence | La refonte page cours (A) intègre et généralise ce MVP, pas de fork |

---

*Suite : `02_PLAN_ACTION.md` (plan, chantiers, sprints) et `03_BACKLOG_ISSUES.md` (issues détaillées).*
