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:
@@ -1,6 +1,6 @@
|
|||||||
# 🎯 Antisèche oral CESIZen — à garder sous les yeux
|
# 🎯 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)**
|
**0:00–2:00 · Intro (slides 1-2)**
|
||||||
- Qui je suis · commanditaire = Ministère · objet = plateforme grand public santé mentale
|
- Qui je suis · commanditaire = Ministère · objet = plateforme grand public santé mentale
|
||||||
- Fil rouge : *« recueil → priorisation → réponse fonctionnelle → modélisation → RGPD »*
|
- Fil rouge : *« recueil → priorisation → réponse fonctionnelle + démo → modélisation → RGPD »*
|
||||||
- ➡️ transition : *« Commençons par le contexte. »*
|
- ➡️ *« 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
|
- Enjeu sociétal (22 %, stigmatisation) · 4 objectifs stratégiques
|
||||||
- Parties prenantes : Ministère ↔ apprenant ↔ HDS ↔ utilisateurs ↔ CNIL
|
- Parties prenantes : Ministère ↔ apprenant ↔ HDS ↔ utilisateurs ↔ CNIL · 3 acteurs
|
||||||
- 3 acteurs : Visiteur · Utilisateur connecté · Administrateur
|
- 💬 *« le besoin a été reformulé, pas recopié »*
|
||||||
- 💬 insister : *« le besoin a été reformulé, pas recopié »*
|
- ➡️ *« Comment ai-je choisi quoi développer ? »*
|
||||||
- ➡️ *« De ce besoin, 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**
|
- Périmètre : 2 oblig + Tracker · modules écartés **assumés**
|
||||||
- Grille pondérée /15 (5 critères) → conclusion : Tracker = plus rentable
|
- Grille pondérée /15 → Tracker = plus rentable
|
||||||
- ➡️ *« Voyons concrètement la réponse fonctionnelle. »*
|
- ➡️ *« Voyons la réponse fonctionnelle. »*
|
||||||
|
|
||||||
**7:00–12:00 · Réponse fonctionnelle (slides 7-8-9)** ⏱️ *moment clé*
|
**6:00–8:30 · Réponse fonctionnelle Comptes + Informations (slides 7-8)**
|
||||||
- **Comptes** : JWT · RGPD · admin CRUD (+ maquette inscription)
|
- **Comptes** : JWT · RGPD · admin CRUD (maquette)
|
||||||
- **Informations** : feeds · slug auto · modération (+ maquette)
|
- **Informations** : feeds · slug auto · modération (maquette)
|
||||||
- **Tracker** : wizard 3 étapes · journal · rapports 4 périodes · 6+36 émotions (+ maquettes)
|
- ➡️ *« 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
|
- 💬 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
|
- **Cas d'usage UML** : couverture par acteur
|
||||||
- **MCD Merise** : 8 entités · cardinalités · hiérarchie émotions auto-référencée (parent_id)
|
- **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
|
- **MVC découplé** : 1 API → 2 clients · justif = testabilité, évolutivité, non-duplication
|
||||||
@@ -54,15 +56,35 @@
|
|||||||
- ➡️ *« Tout cela est concrétisé par un prototype. »*
|
- ➡️ *« Tout cela est concrétisé par un prototype. »*
|
||||||
|
|
||||||
**17:30–19:00 · Prototype & perspectives (slide 14)**
|
**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
|
- Ouverture : activer les modules écartés sans réécrire · Mon Espace Santé (FHIR) · Open Data
|
||||||
|
|
||||||
**19:00–20:00 · Conclusion**
|
**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. »*
|
- 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)
|
## ❓ 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 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
|
- **Pourquoi MVC découplé ?** → 1 API → 2 clients · logique non dupliquée · testable
|
||||||
@@ -19,6 +19,7 @@ class DatabaseSeeder extends Seeder
|
|||||||
AdminSeeder::class,
|
AdminSeeder::class,
|
||||||
EmotionSeeder::class,
|
EmotionSeeder::class,
|
||||||
FeedSeeder::class,
|
FeedSeeder::class,
|
||||||
|
DemoSeeder::class,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user