#!/usr/bin/env bash # Seed data for manual testing of Story 6.7 — Parent Grade Consultation # Usage: ./scripts/seed-parent-grades.sh set -euo pipefail COMPOSE="docker compose" PHP="$COMPOSE exec -T php" TENANT="ecole-alpha" TENANT_ID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" # --- Credentials --- PARENT_EMAIL="demo-parent-grades@example.com" PARENT_PASSWORD="Parent123" TEACHER_EMAIL="demo-pg-teacher@example.com" TEACHER_PASSWORD="Teacher123" STUDENT1_EMAIL="demo-pg-emma@example.com" STUDENT1_PASSWORD="Student123" STUDENT2_EMAIL="demo-pg-lucas@example.com" STUDENT2_PASSWORD="Student123" echo "=== Création des utilisateurs ===" $PHP php bin/console app:dev:create-test-user --tenant=$TENANT --email=$PARENT_EMAIL --password=$PARENT_PASSWORD --role=PARENT --firstName=Marie --lastName=Dupont 2>&1 || true $PHP php bin/console app:dev:create-test-user --tenant=$TENANT --email=$TEACHER_EMAIL --password=$TEACHER_PASSWORD --role=PROF --firstName=Jean --lastName=Martin 2>&1 || true $PHP php bin/console app:dev:create-test-user --tenant=$TENANT --email=$STUDENT1_EMAIL --password=$STUDENT1_PASSWORD --role=ELEVE --firstName=Emma --lastName=Dupont 2>&1 || true $PHP php bin/console app:dev:create-test-user --tenant=$TENANT --email=$STUDENT2_EMAIL --password=$STUDENT2_PASSWORD --role=ELEVE --firstName=Lucas --lastName=Dupont 2>&1 || true echo "=== Résolution des IDs ===" PARENT_ID=$($PHP php bin/console dbal:run-sql "SELECT id FROM users WHERE email='$PARENT_EMAIL' AND tenant_id='$TENANT_ID'" 2>&1 | grep -oP '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' | head -1) STUDENT1_ID=$($PHP php bin/console dbal:run-sql "SELECT id FROM users WHERE email='$STUDENT1_EMAIL' AND tenant_id='$TENANT_ID'" 2>&1 | grep -oP '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' | head -1) STUDENT2_ID=$($PHP php bin/console dbal:run-sql "SELECT id FROM users WHERE email='$STUDENT2_EMAIL' AND tenant_id='$TENANT_ID'" 2>&1 | grep -oP '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' | head -1) TEACHER_ID=$($PHP php bin/console dbal:run-sql "SELECT id FROM users WHERE email='$TEACHER_EMAIL' AND tenant_id='$TENANT_ID'" 2>&1 | grep -oP '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' | head -1) # Deterministic IDs SCHOOL_ID=$($PHP php -r "require '/app/vendor/autoload.php'; echo Ramsey\Uuid\Uuid::uuid5('6ba7b814-9dad-11d1-80b4-00c04fd430c8','school-$TENANT_ID')->toString();" 2>&1) ACAD_YEAR_ID=$($PHP php -r "require '/app/vendor/autoload.php'; \$m=(int)date('n'); \$s=\$m>=9?(int)date('Y'):(int)date('Y')-1; \$e=\$s+1; echo Ramsey\Uuid\Uuid::uuid5('6ba7b814-9dad-11d1-80b4-00c04fd430c8','$TENANT_ID:\$s-\$e')->toString();" 2>&1) # UUIDs déterministes pour les fixtures CLASS_6A=$($PHP php -r "require '/app/vendor/autoload.php'; echo Ramsey\Uuid\Uuid::uuid5('6ba7b814-9dad-11d1-80b4-00c04fd430c8','demo-pg-class6a-$TENANT_ID')->toString();" 2>&1) CLASS_5B=$($PHP php -r "require '/app/vendor/autoload.php'; echo Ramsey\Uuid\Uuid::uuid5('6ba7b814-9dad-11d1-80b4-00c04fd430c8','demo-pg-class5b-$TENANT_ID')->toString();" 2>&1) SUBJECT_MATH=$($PHP php -r "require '/app/vendor/autoload.php'; echo Ramsey\Uuid\Uuid::uuid5('6ba7b814-9dad-11d1-80b4-00c04fd430c8','demo-pg-math-$TENANT_ID')->toString();" 2>&1) SUBJECT_FRENCH=$($PHP php -r "require '/app/vendor/autoload.php'; echo Ramsey\Uuid\Uuid::uuid5('6ba7b814-9dad-11d1-80b4-00c04fd430c8','demo-pg-french-$TENANT_ID')->toString();" 2>&1) SUBJECT_HISTORY=$($PHP php -r "require '/app/vendor/autoload.php'; echo Ramsey\Uuid\Uuid::uuid5('6ba7b814-9dad-11d1-80b4-00c04fd430c8','demo-pg-history-$TENANT_ID')->toString();" 2>&1) EVAL1=$($PHP php -r "require '/app/vendor/autoload.php'; echo Ramsey\Uuid\Uuid::uuid5('6ba7b814-9dad-11d1-80b4-00c04fd430c8','demo-pg-eval1-$TENANT_ID')->toString();" 2>&1) EVAL2=$($PHP php -r "require '/app/vendor/autoload.php'; echo Ramsey\Uuid\Uuid::uuid5('6ba7b814-9dad-11d1-80b4-00c04fd430c8','demo-pg-eval2-$TENANT_ID')->toString();" 2>&1) EVAL3=$($PHP php -r "require '/app/vendor/autoload.php'; echo Ramsey\Uuid\Uuid::uuid5('6ba7b814-9dad-11d1-80b4-00c04fd430c8','demo-pg-eval3-$TENANT_ID')->toString();" 2>&1) EVAL4=$($PHP php -r "require '/app/vendor/autoload.php'; echo Ramsey\Uuid\Uuid::uuid5('6ba7b814-9dad-11d1-80b4-00c04fd430c8','demo-pg-eval4-$TENANT_ID')->toString();" 2>&1) EVAL5=$($PHP php -r "require '/app/vendor/autoload.php'; echo Ramsey\Uuid\Uuid::uuid5('6ba7b814-9dad-11d1-80b4-00c04fd430c8','demo-pg-eval5-$TENANT_ID')->toString();" 2>&1) echo "" echo " Parent: $PARENT_ID ($PARENT_EMAIL)" echo " Emma: $STUDENT1_ID ($STUDENT1_EMAIL)" echo " Lucas: $STUDENT2_ID ($STUDENT2_EMAIL)" echo " Teacher: $TEACHER_ID ($TEACHER_EMAIL)" echo " School: $SCHOOL_ID" echo " AcadYear: $ACAD_YEAR_ID" echo "" SQL="$PHP php bin/console dbal:run-sql" echo "=== Classes ===" $SQL "INSERT INTO school_classes (id, tenant_id, school_id, academic_year_id, name, level, status, created_at, updated_at) VALUES ('$CLASS_6A', '$TENANT_ID', '$SCHOOL_ID', '$ACAD_YEAR_ID', 'Demo-PG 6ème A', '6ème', 'active', NOW(), NOW()) ON CONFLICT DO NOTHING" 2>&1 $SQL "INSERT INTO school_classes (id, tenant_id, school_id, academic_year_id, name, level, status, created_at, updated_at) VALUES ('$CLASS_5B', '$TENANT_ID', '$SCHOOL_ID', '$ACAD_YEAR_ID', 'Demo-PG 5ème B', '5ème', 'active', NOW(), NOW()) ON CONFLICT DO NOTHING" 2>&1 echo "=== Matières ===" $SQL "INSERT INTO subjects (id, tenant_id, school_id, name, code, color, status, created_at, updated_at) VALUES ('$SUBJECT_MATH', '$TENANT_ID', '$SCHOOL_ID', 'Mathématiques', 'DPGMATH', '#3b82f6', 'active', NOW(), NOW()) ON CONFLICT DO NOTHING" 2>&1 $SQL "INSERT INTO subjects (id, tenant_id, school_id, name, code, color, status, created_at, updated_at) VALUES ('$SUBJECT_FRENCH', '$TENANT_ID', '$SCHOOL_ID', 'Français', 'DPGFRA', '#ef4444', 'active', NOW(), NOW()) ON CONFLICT DO NOTHING" 2>&1 $SQL "INSERT INTO subjects (id, tenant_id, school_id, name, code, color, status, created_at, updated_at) VALUES ('$SUBJECT_HISTORY', '$TENANT_ID', '$SCHOOL_ID', 'Histoire-Géo', 'DPGHIST', '#f59e0b', 'active', NOW(), NOW()) ON CONFLICT DO NOTHING" 2>&1 echo "=== Affectation élèves aux classes ===" $SQL "INSERT INTO class_assignments (id, tenant_id, user_id, school_class_id, academic_year_id, assigned_at, created_at, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$STUDENT1_ID', '$CLASS_6A', '$ACAD_YEAR_ID', NOW(), NOW(), NOW()) ON CONFLICT (user_id, academic_year_id) DO NOTHING" 2>&1 $SQL "INSERT INTO class_assignments (id, tenant_id, user_id, school_class_id, academic_year_id, assigned_at, created_at, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$STUDENT2_ID', '$CLASS_5B', '$ACAD_YEAR_ID', NOW(), NOW(), NOW()) ON CONFLICT (user_id, academic_year_id) DO NOTHING" 2>&1 echo "=== Liaison parent-enfants ===" $SQL "INSERT INTO student_guardians (id, tenant_id, student_id, guardian_id, relationship_type, created_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$STUDENT1_ID', '$PARENT_ID', 'mère', NOW()) ON CONFLICT DO NOTHING" 2>&1 $SQL "INSERT INTO student_guardians (id, tenant_id, student_id, guardian_id, relationship_type, created_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$STUDENT2_ID', '$PARENT_ID', 'mère', NOW()) ON CONFLICT DO NOTHING" 2>&1 echo "=== Affectation enseignant ===" $SQL "INSERT INTO teacher_assignments (id, tenant_id, teacher_id, school_class_id, subject_id, academic_year_id, status, start_date, created_at, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$TEACHER_ID', '$CLASS_6A', '$SUBJECT_MATH', '$ACAD_YEAR_ID', 'active', NOW(), NOW(), NOW()) ON CONFLICT DO NOTHING" 2>&1 $SQL "INSERT INTO teacher_assignments (id, tenant_id, teacher_id, school_class_id, subject_id, academic_year_id, status, start_date, created_at, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$TEACHER_ID', '$CLASS_6A', '$SUBJECT_FRENCH', '$ACAD_YEAR_ID', 'active', NOW(), NOW(), NOW()) ON CONFLICT DO NOTHING" 2>&1 $SQL "INSERT INTO teacher_assignments (id, tenant_id, teacher_id, school_class_id, subject_id, academic_year_id, status, start_date, created_at, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$TEACHER_ID', '$CLASS_5B', '$SUBJECT_MATH', '$ACAD_YEAR_ID', 'active', NOW(), NOW(), NOW()) ON CONFLICT DO NOTHING" 2>&1 $SQL "INSERT INTO teacher_assignments (id, tenant_id, teacher_id, school_class_id, subject_id, academic_year_id, status, start_date, created_at, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$TEACHER_ID', '$CLASS_5B', '$SUBJECT_HISTORY', '$ACAD_YEAR_ID', 'active', NOW(), NOW(), NOW()) ON CONFLICT DO NOTHING" 2>&1 echo "=== Évaluations publiées (> 48h pour passer le délai parent) ===" # Emma (6A) - Maths: DS Algèbre (15.5/20, coeff 2) $SQL "INSERT INTO evaluations (id, tenant_id, class_id, subject_id, teacher_id, title, evaluation_date, grade_scale, coefficient, status, grades_published_at, created_at, updated_at) VALUES ('$EVAL1', '$TENANT_ID', '$CLASS_6A', '$SUBJECT_MATH', '$TEACHER_ID', 'DS Algèbre', '2026-03-20', 20, 2.0, 'published', NOW() - INTERVAL '72 hours', NOW() - INTERVAL '72 hours', NOW()) ON CONFLICT (id) DO NOTHING" 2>&1 # Emma (6A) - Maths: Contrôle Géométrie (12/20, coeff 1) $SQL "INSERT INTO evaluations (id, tenant_id, class_id, subject_id, teacher_id, title, evaluation_date, grade_scale, coefficient, status, grades_published_at, created_at, updated_at) VALUES ('$EVAL2', '$TENANT_ID', '$CLASS_6A', '$SUBJECT_MATH', '$TEACHER_ID', 'Contrôle Géométrie', '2026-04-01', 20, 1.0, 'published', NOW() - INTERVAL '48 hours', NOW() - INTERVAL '48 hours', NOW()) ON CONFLICT (id) DO NOTHING" 2>&1 # Emma (6A) - Français: Dictée (17/20, coeff 1) $SQL "INSERT INTO evaluations (id, tenant_id, class_id, subject_id, teacher_id, title, evaluation_date, grade_scale, coefficient, status, grades_published_at, created_at, updated_at) VALUES ('$EVAL3', '$TENANT_ID', '$CLASS_6A', '$SUBJECT_FRENCH', '$TEACHER_ID', 'Dictée préparée', '2026-03-25', 20, 1.0, 'published', NOW() - INTERVAL '60 hours', NOW() - INTERVAL '60 hours', NOW()) ON CONFLICT (id) DO NOTHING" 2>&1 # Lucas (5B) - Maths: Fractions (8.5/20, coeff 2) $SQL "INSERT INTO evaluations (id, tenant_id, class_id, subject_id, teacher_id, title, evaluation_date, grade_scale, coefficient, status, grades_published_at, created_at, updated_at) VALUES ('$EVAL4', '$TENANT_ID', '$CLASS_5B', '$SUBJECT_MATH', '$TEACHER_ID', 'DS Fractions', '2026-03-22', 20, 2.0, 'published', NOW() - INTERVAL '72 hours', NOW() - INTERVAL '72 hours', NOW()) ON CONFLICT (id) DO NOTHING" 2>&1 # Lucas (5B) - Histoire: La Révolution (14/20, coeff 1) $SQL "INSERT INTO evaluations (id, tenant_id, class_id, subject_id, teacher_id, title, evaluation_date, grade_scale, coefficient, status, grades_published_at, created_at, updated_at) VALUES ('$EVAL5', '$TENANT_ID', '$CLASS_5B', '$SUBJECT_HISTORY', '$TEACHER_ID', 'La Révolution française', '2026-04-02', 20, 1.0, 'published', NOW() - INTERVAL '48 hours', NOW() - INTERVAL '48 hours', NOW()) ON CONFLICT (id) DO NOTHING" 2>&1 echo "=== Notes ===" # Emma $SQL "INSERT INTO grades (id, tenant_id, evaluation_id, student_id, value, status, created_by, created_at, updated_at, appreciation) VALUES (gen_random_uuid(), '$TENANT_ID', '$EVAL1', '$STUDENT1_ID', 15.5, 'graded', '$TEACHER_ID', NOW(), NOW(), 'Très bon travail, continue ainsi !') ON CONFLICT (evaluation_id, student_id) DO NOTHING" 2>&1 $SQL "INSERT INTO grades (id, tenant_id, evaluation_id, student_id, value, status, created_by, created_at, updated_at, appreciation) VALUES (gen_random_uuid(), '$TENANT_ID', '$EVAL2', '$STUDENT1_ID', 12.0, 'graded', '$TEACHER_ID', NOW(), NOW(), 'Des progrès à faire sur les angles') ON CONFLICT (evaluation_id, student_id) DO NOTHING" 2>&1 $SQL "INSERT INTO grades (id, tenant_id, evaluation_id, student_id, value, status, created_by, created_at, updated_at, appreciation) VALUES (gen_random_uuid(), '$TENANT_ID', '$EVAL3', '$STUDENT1_ID', 17.0, 'graded', '$TEACHER_ID', NOW(), NOW(), 'Excellente orthographe') ON CONFLICT (evaluation_id, student_id) DO NOTHING" 2>&1 # Lucas $SQL "INSERT INTO grades (id, tenant_id, evaluation_id, student_id, value, status, created_by, created_at, updated_at, appreciation) VALUES (gen_random_uuid(), '$TENANT_ID', '$EVAL4', '$STUDENT2_ID', 8.5, 'graded', '$TEACHER_ID', NOW(), NOW(), 'Revoir les fractions décimales') ON CONFLICT (evaluation_id, student_id) DO NOTHING" 2>&1 $SQL "INSERT INTO grades (id, tenant_id, evaluation_id, student_id, value, status, created_by, created_at, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$EVAL5', '$STUDENT2_ID', 14.0, 'graded', '$TEACHER_ID', NOW(), NOW()) ON CONFLICT (evaluation_id, student_id) DO NOTHING" 2>&1 echo "=== Statistiques classe ===" $SQL "INSERT INTO evaluation_statistics (evaluation_id, average, min_grade, max_grade, median_grade, graded_count, updated_at) VALUES ('$EVAL1', 13.2, 6.0, 18.5, 13.5, 28, NOW()) ON CONFLICT (evaluation_id) DO NOTHING" 2>&1 $SQL "INSERT INTO evaluation_statistics (evaluation_id, average, min_grade, max_grade, median_grade, graded_count, updated_at) VALUES ('$EVAL2', 11.8, 4.5, 19.0, 12.0, 28, NOW()) ON CONFLICT (evaluation_id) DO NOTHING" 2>&1 $SQL "INSERT INTO evaluation_statistics (evaluation_id, average, min_grade, max_grade, median_grade, graded_count, updated_at) VALUES ('$EVAL3', 14.5, 8.0, 20.0, 15.0, 28, NOW()) ON CONFLICT (evaluation_id) DO NOTHING" 2>&1 $SQL "INSERT INTO evaluation_statistics (evaluation_id, average, min_grade, max_grade, median_grade, graded_count, updated_at) VALUES ('$EVAL4', 10.3, 3.0, 17.5, 10.0, 25, NOW()) ON CONFLICT (evaluation_id) DO NOTHING" 2>&1 $SQL "INSERT INTO evaluation_statistics (evaluation_id, average, min_grade, max_grade, median_grade, graded_count, updated_at) VALUES ('$EVAL5', 12.1, 5.5, 18.0, 12.5, 25, NOW()) ON CONFLICT (evaluation_id) DO NOTHING" 2>&1 echo "=== Périodes et moyennes ===" # Trouver la période académique en cours PERIOD_ID=$($PHP php bin/console dbal:run-sql "SELECT id FROM academic_periods WHERE tenant_id='$TENANT_ID' AND start_date <= CURRENT_DATE AND end_date >= CURRENT_DATE LIMIT 1" 2>&1 | grep -oP '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' | head -1 || true) if [ -n "$PERIOD_ID" ]; then echo " Period ID: $PERIOD_ID" # Moyennes Emma $SQL "INSERT INTO student_averages (id, tenant_id, student_id, subject_id, period_id, average, grade_count, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$STUDENT1_ID', '$SUBJECT_MATH', '$PERIOD_ID', 14.33, 2, NOW()) ON CONFLICT (student_id, subject_id, period_id) DO NOTHING" 2>&1 $SQL "INSERT INTO student_averages (id, tenant_id, student_id, subject_id, period_id, average, grade_count, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$STUDENT1_ID', '$SUBJECT_FRENCH', '$PERIOD_ID', 17.0, 1, NOW()) ON CONFLICT (student_id, subject_id, period_id) DO NOTHING" 2>&1 $SQL "INSERT INTO student_general_averages (id, tenant_id, student_id, period_id, average, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$STUDENT1_ID', '$PERIOD_ID', 15.22, NOW()) ON CONFLICT (student_id, period_id) DO NOTHING" 2>&1 # Moyennes Lucas $SQL "INSERT INTO student_averages (id, tenant_id, student_id, subject_id, period_id, average, grade_count, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$STUDENT2_ID', '$SUBJECT_MATH', '$PERIOD_ID', 8.5, 1, NOW()) ON CONFLICT (student_id, subject_id, period_id) DO NOTHING" 2>&1 $SQL "INSERT INTO student_averages (id, tenant_id, student_id, subject_id, period_id, average, grade_count, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$STUDENT2_ID', '$SUBJECT_HISTORY', '$PERIOD_ID', 14.0, 1, NOW()) ON CONFLICT (student_id, subject_id, period_id) DO NOTHING" 2>&1 $SQL "INSERT INTO student_general_averages (id, tenant_id, student_id, period_id, average, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$STUDENT2_ID', '$PERIOD_ID', 10.33, NOW()) ON CONFLICT (student_id, period_id) DO NOTHING" 2>&1 else echo " ⚠️ Aucune période académique trouvée — moyennes non insérées" fi echo "=== Cache clear ===" $PHP php bin/console cache:pool:clear paginated_queries.cache 2>&1 || true echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo " ✅ Données de test prêtes !" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" echo " Connexion parent : $PARENT_EMAIL / $PARENT_PASSWORD" echo " URL : http://ecole-alpha.classeo.local:/dashboard/parent-grades" echo "" echo " Enfants :" echo " Emma Dupont (6ème A) — Maths 15.5 + 12.0, Français 17.0 → moy 15.22" echo " Lucas Dupont (5ème B) — Maths 8.5, Histoire 14.0 → moy 10.33" echo "" echo " Les notes sont publiées depuis > 48h (délai parent 24h OK)" echo ""