Files
Diabetix_v2/app/database/seeders/DatabaseSeeder.php
jeremy bayse 26c6d8031c Initial commit — Diabetix V2
Application Laravel 12 + Inertia + Vue 3 + Tailwind.
Fonctionnalités : dashboard glycémique, saisie de mesures, courbe SVG,
statistiques (jour/semaine/mois/trimestre), défis & badges, chat coach IA
(Gemini), paramètres profil avec palette de couleurs, pages auth redessinées,
emails transactionnels via Resend avec thème Diabetix.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 07:01:41 +02:00

124 lines
6.2 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace Database\Seeders;
use App\Models\Badge;
use App\Models\Challenge;
use App\Models\ChatMessage;
use App\Models\GlucoseMeasurement;
use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Carbon;
class DatabaseSeeder extends Seeder
{
use WithoutModelEvents;
public function run(): void
{
$challenges = [
['slug' => 'time-in-range', 'icon' => '🎯', 'title' => 'Temps dans la cible', 'description' => '21 jours · 91% dans la cible', 'points' => 30, 'target_value' => 100, 'unit' => '%'],
['slug' => 'hydration', 'icon' => '💧', 'title' => 'Hydratation', 'description' => 'Boire 1,5L/jour pendant 7 jours', 'points' => 20, 'target_value' => 100, 'unit' => '%'],
['slug' => 'walk-after-meal', 'icon' => '🏃', 'title' => 'Marche post-repas', 'description' => '10 min après chaque repas · 3×/jour', 'points' => 50, 'target_value' => 100, 'unit' => '%'],
['slug' => 'bedtime-glucose', 'icon' => '🌙', 'title' => 'Glycémie au coucher', 'description' => 'Mesurer chaque soir pendant 14 jours', 'points' => 40, 'target_value' => 100, 'unit' => '%'],
];
foreach ($challenges as $c) {
Challenge::updateOrCreate(['slug' => $c['slug']], $c);
}
$badges = [
['slug' => 'beginner', 'icon' => '🥇', 'label' => 'Débutant', 'criteria' => 'Enregistrer votre première mesure de glycémie'],
['slug' => 'streak-7', 'icon' => '🔥', 'label' => '7 jours', 'criteria' => 'Mesurer votre glycémie 7 jours consécutifs'],
['slug' => 'hydrated', 'icon' => '💧', 'label' => 'Hydraté', 'criteria' => 'Terminer le défi Hydratation (1,5 L/jour pendant 7 jours)'],
['slug' => 'in-target', 'icon' => '🎯', 'label' => 'Dans la cible', 'criteria' => 'Atteindre 80 % de temps dans la cible sur une semaine'],
['slug' => 'sporty', 'icon' => '🏃', 'label' => 'Sportif', 'criteria' => 'Terminer le défi Marche post-repas (10 min, 3×/jour)'],
['slug' => 'early-bed', 'icon' => '🌙', 'label' => 'Couche-tôt', 'criteria' => 'Mesurer votre glycémie au coucher 14 soirs de suite'],
['slug' => 'persevering', 'icon' => '💪', 'label' => 'Persévérant', 'criteria' => 'Maintenir une série de 30 jours de mesures consécutives'],
['slug' => 'expert', 'icon' => '⭐', 'label' => 'Expert', 'criteria' => 'Accumuler 5 000 points de défi'],
];
foreach ($badges as $b) {
Badge::updateOrCreate(['slug' => $b['slug']], $b);
}
$marie = User::updateOrCreate(
['email' => 'marie@diabetix.test'],
[
'name' => 'Marie Dupont',
'first_name' => 'Marie',
'password' => bcrypt('password'),
'diabetes_type' => 'type2',
// WHO / international Time-in-Range consensus targets, in mg/dL
'target_min' => 70,
'target_max' => 180,
'points' => 1240,
'streak_days' => 12,
'palette' => 'mint',
]
);
$progressMap = ['time-in-range' => 71, 'hydration' => 57, 'walk-after-meal' => 33, 'bedtime-glucose' => 85];
foreach (Challenge::all() as $c) {
$marie->challenges()->syncWithoutDetaching([
$c->id => ['progress' => $progressMap[$c->slug] ?? 50, 'started_at' => now()->subDays(14)],
]);
}
foreach (['beginner', 'streak-7', 'hydrated', 'in-target'] as $slug) {
$badge = Badge::where('slug', $slug)->first();
$marie->badges()->syncWithoutDetaching([$badge->id => ['unlocked_at' => now()->subDays(rand(1, 30))]]);
}
// Seed 30 days of measurements (5/day) — values in mg/dL
GlucoseMeasurement::where('user_id', $marie->id)->delete();
$contexts = ['fasting', 'after_meal', 'before_meal', 'after_meal', 'bedtime'];
for ($d = 30; $d >= 0; $d--) {
$day = Carbon::now()->subDays($d);
$hours = [7, 10, 12, 16, 21];
// Realistic typical values: fasting ~95, post-meal ~155, pre-meal ~110, post-meal ~140, bedtime ~110
$bases = [95, 155, 110, 140, 110];
foreach ($hours as $i => $h) {
$value = $bases[$i] + mt_rand(-22, 28); // jitter, occasional excursion
GlucoseMeasurement::create([
'user_id' => $marie->id,
'value' => max(60, $value),
'context' => $contexts[$i],
'measured_at' => $day->copy()->setTime($h, mt_rand(0, 59)),
]);
}
}
// Seed initial coach chat
ChatMessage::where('user_id', $marie->id)->delete();
$now = now();
$msgs = [
['coach', 'Bonjour Marie ! Votre glycémie de ce matin est bonne (105 mg/dL). 😊', null],
['user', 'Merci ! Que me conseillez-vous pour ce soir ?', null],
['coach', 'Votre glycémie après dîner était élevée hier. Je vous suggère une marche de 10 min après le repas. On essaie ?', ['Ajouter ce défi ✓', 'Plus tard']],
['user', 'Oui, bonne idée !', null],
['coach', "Super ! Je vous rappellerai à 19h30 chaque soir. Que mangez-vous ce midi ? Je peux estimer l'impact glycémique. 🍽️", ['Décrire mon repas', 'Tofu 🥢', 'Pâtes 🍝']],
];
foreach ($msgs as $i => [$sender, $body, $actions]) {
ChatMessage::create([
'user_id' => $marie->id,
'sender' => $sender,
'body' => $body,
'actions' => $actions,
'created_at' => $now->copy()->subMinutes((count($msgs) - $i) * 2),
'updated_at' => $now->copy()->subMinutes((count($msgs) - $i) * 2),
]);
}
// Optional second demo user
User::updateOrCreate(
['email' => 'demo@diabetix.test'],
[
'name' => 'Demo User',
'first_name' => 'Demo',
'password' => bcrypt('password'),
'diabetes_type' => 'type1',
]
);
}
}