feat: ajoute un compte de démo seedé et l'antisèche d'oral

- DemoSeeder : membre demo@cesizen.fr / Demo123! + 18 saisies sur 4 semaines
  (émotions variées, Joie dominante) pour une démo aux rapports déjà fournis
- Antiseche_Oral_CESIZen.md : déroulé 20 min avec démo live intégrée + script

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Azmog
2026-06-18 22:44:02 +02:00
parent c19071efff
commit fc267aeb9e
3 changed files with 128 additions and 20 deletions
@@ -1,6 +1,6 @@
# 🎯 Antisèche oral CESIZen — à garder sous les yeux
**20 min de présentation + 10 min Q/R · 16 slides · checkpoint mental à 12:00**
**20 min (présentation + démo live de l'app) + 10 min Q/R · 16 slides · checkpoint à 12:30**
---
@@ -16,33 +16,35 @@
---
## 🗺️ Déroulé (mots-clés seulement)
## 🗺️ Déroulé (mots-clés seulement) — démo live intégrée
**0:00–2:00 · Intro (slides 1-2)**
- Qui je suis · commanditaire = Ministère · objet = plateforme grand public santé mentale
- Fil rouge : *« recueil → priorisation → réponse fonctionnelle → modélisation → RGPD »*
- ➡️ transition : *« Commençons par le contexte. »*
- Fil rouge : *« recueil → priorisation → réponse fonctionnelle + démo → modélisation → RGPD »*
- ➡️ *« Commençons par le contexte. »*
**2:00–5:00 · Contexte & parties prenantes (slides 3-4)**
**2:00–4:30 · Contexte & parties prenantes (slides 3-4)**
- Enjeu sociétal (22 %, stigmatisation) · 4 objectifs stratégiques
- Parties prenantes : Ministère ↔ apprenant ↔ HDS ↔ utilisateurs ↔ CNIL
- 3 acteurs : Visiteur · Utilisateur connecté · Administrateur
- 💬 insister : *« le besoin a été reformulé, pas recopié »*
- ➡️ *« De ce besoin, comment ai-je choisi quoi développer ? »*
- Parties prenantes : Ministère ↔ apprenant ↔ HDS ↔ utilisateurs ↔ CNIL · 3 acteurs
- 💬 *« le besoin a été reformulé, pas recopié »*
- ➡️ *« Comment ai-je choisi quoi développer ? »*
**5:00–7:00 · Besoins & priorisation (slides 5-6)**
**4:30–6:00 · Besoins & priorisation (slides 5-6)**
- Périmètre : 2 oblig + Tracker · modules écartés **assumés**
- Grille pondérée /15 (5 critères) → conclusion : Tracker = plus rentable
- ➡️ *« Voyons concrètement la réponse fonctionnelle. »*
- Grille pondérée /15 → Tracker = plus rentable
- ➡️ *« Voyons la réponse fonctionnelle. »*
**7:00–12:00 · Réponse fonctionnelle (slides 7-8-9)** ⏱️ *moment clé*
- **Comptes** : JWT · RGPD · admin CRUD (+ maquette inscription)
- **Informations** : feeds · slug auto · modération (+ maquette)
- **Tracker** : wizard 3 étapes · journal · rapports 4 périodes · 6+36 émotions (+ maquettes)
**6:00–8:30 · Réponse fonctionnelle Comptes + Informations (slides 7-8)**
- **Comptes** : JWT · RGPD · admin CRUD (maquette)
- **Informations** : feeds · slug auto · modération (maquette)
- ➡️ *« Et pour le Tracker, je vais vous le montrer en direct. »*
**8:30–12:30 · 🎬 DÉMO LIVE — le Tracker (voir script ci-dessous)**
- inscription/connexion → journal → wizard 3 étapes → rapport graphique
- 💬 chaque écran = réponse à un besoin précis
- ➡️ *« Passons à la modélisation technique. »*
- ➡️ *« Voyons maintenant ce qui structure tout ça techniquement. »*
**12:00–16:00 · Modélisation (slides 10-11-12)** — ⚠️ si retard, accélère ici
**12:30–16:00 · Modélisation (slides 10-11-12)** — ⚠️ si retard, accélère ici
- **Cas d'usage UML** : couverture par acteur
- **MCD Merise** : 8 entités · cardinalités · hiérarchie émotions auto-référencée (parent_id)
- **MVC découplé** : 1 API → 2 clients · justif = testabilité, évolutivité, non-duplication
@@ -54,15 +56,35 @@
- ➡️ *« Tout cela est concrétisé par un prototype. »*
**17:30–19:00 · Prototype & perspectives (slide 14)**
- Stack réelle : Laravel + Next.js + Expo + Docker · 25 tests automatisés
- Stack réelle : Laravel + Next.js + Expo + Docker · **25 tests automatisés**
- Ouverture : activer les modules écartés sans réécrire · Mon Espace Santé (FHIR) · Open Data
**19:00–20:00 · Conclusion**
- Synthèse en 1 phrase : *besoin reformulé → périmètre priorisé → réponse fonctionnelle → archi pérenne → conformité*
- 1 phrase : *besoin reformulé → périmètre priorisé → réponse fonctionnelle → archi pérenne → conformité*
- Remercier · *« Je suis à votre disposition pour vos questions. »*
---
## 🎬 Script de démo (≈ 4 min) — le Tracker en direct
**AVANT de commencer l'oral** (à faire pendant l'installation, app déjà lancée) :
- `docker compose up -d` lancé · onglet navigateur ouvert sur **http://localhost:3000**
- **déjà connecté** sur le compte de démo · zoom navigateur à **125 %** · notifications coupées
- Compte : laisser le **journal pré-rempli** de quelques saisies (sinon le rapport est vide)
**Pendant la démo (chemin balisé, ne pas improviser) :**
1. *(20 s)* Page **Informations** publique → *« voici le module Informations, accessible sans compte »*
2. *(30 s)* **Journal de bord** → *« le membre retrouve son historique émotionnel »*
3. *(90 s)* **Nouvelle saisie** → wizard : Étape 1 émotion (Joie) → Étape 2 sous-émotion + intensité (slider) → Étape 3 date + note → **Valider** → *« elle apparaît immédiatement dans le journal »*
4. *(60 s)* **Rapports** → changer la période (semaine → mois) → *« camembert de répartition + courbe d'évolution, calculés côté API »*
5. *(20 s, si le temps)* mention rapide **admin** : config des émotions
🛟 **Filet de sécurité** : si la démo plante, je bascule sur les **maquettes des slides** sans m'excuser → *« je vous montre les écrans clés »*. Zéro stress.
🔑 Admin seedé : `admin@cesizen.fr` / `Admin123!`
---
## ❓ Q/R — réflexes (question → mots-clés de réponse)
- **Pourquoi le Tracker ?** → grille /15 en tête · 3 modules aboutis > 6 superficiels · archi extensible
- **Pourquoi MVC découplé ?** → 1 API → 2 clients · logique non dupliquée · testable
@@ -19,6 +19,7 @@ class DatabaseSeeder extends Seeder
AdminSeeder::class,
EmotionSeeder::class,
FeedSeeder::class,
DemoSeeder::class,
]);
}
}
+85
View File
@@ -0,0 +1,85 @@
<?php
namespace Database\Seeders;
use App\Models\Emotion;
use App\Models\Role;
use App\Models\SaisieTracker;
use App\Models\Tracker;
use App\Models\Utilisateur;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
class DemoSeeder extends Seeder
{
/**
* Compte membre de démonstration + journal pré-rempli.
*
* Sert à la soutenance : permet de montrer un journal et des rapports
* (camembert + courbe) déjà fournis, sans avoir à saisir en direct.
* Identifiants : demo@cesizen.fr / Demo123!
*/
public function run(): void
{
$roleMembre = Role::where('nom', 'membre')->firstOrFail();
$demo = Utilisateur::firstOrCreate(
['email' => 'demo@cesizen.fr'],
[
'nom' => 'Démo',
'prenom' => 'Camille',
'email' => 'demo@cesizen.fr',
'password' => Hash::make('Demo123!'),
'role_id' => $roleMembre->id,
'est_actif' => true,
'consentement_rgpd' => true,
]
);
$tracker = Tracker::firstOrCreate(
['utilisateur_id' => $demo->id],
['nom' => 'Mon journal']
);
// Idempotent : si le journal de démo est déjà rempli, on ne duplique pas.
if (SaisieTracker::where('tracker_id', $tracker->id)->exists()) {
return;
}
// Émotions de base (niveau 1) -> couleurs distinctes pour un camembert lisible.
$emotions = Emotion::where('niveau', 1)->pluck('id', 'nom');
// 18 saisies réparties sur les 4 dernières semaines (Joie dominante).
// [jours avant aujourd'hui, émotion, intensité (1-10), note]
$plan = [
[25, 'Joie', 7, 'Bonne nouvelle au travail.'],
[24, 'Surprise', 6, null],
[22, 'Tristesse', 4, 'Journée un peu morose.'],
[20, 'Joie', 8, 'Sortie entre amis.'],
[19, 'Peur', 5, 'Stress avant une présentation.'],
[17, 'Colère', 6, 'Transports en retard.'],
[15, 'Joie', 7, null],
[14, 'Joie', 9, 'Week-end ressourçant.'],
[12, 'Tristesse', 3, null],
[11, 'Surprise', 7, 'Visite imprévue.'],
[9, 'Peur', 4, null],
[8, 'Joie', 8, 'Objectif atteint.'],
[6, 'Dégoût', 5, null],
[5, 'Joie', 7, 'Belle journée.'],
[3, 'Colère', 4, 'Petite contrariété.'],
[2, 'Joie', 8, 'Café avec un proche.'],
[1, 'Peur', 5, 'Nuit agitée.'],
[0, 'Joie', 9, 'Je me sens bien aujourd\'hui.'],
];
foreach ($plan as [$daysAgo, $nom, $intensite, $note]) {
SaisieTracker::create([
'tracker_id' => $tracker->id,
'emotion_id' => $emotions[$nom],
'intensite' => $intensite,
'note' => $note,
'date_saisie' => now()->subDays($daysAgo)->setTime(20, 0),
]);
}
}
}