Files
Classeo/scripts/seed-parent-grades.sh
Mathias STRASSER 272d31e1c0
Some checks failed
CI / Backend Tests (push) Has been cancelled
CI / Frontend Tests (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
CI / Naming Conventions (push) Has been cancelled
CI / Build Check (push) Has been cancelled
feat: Permettre à l'élève de consulter ses notes et moyennes
L'élève avait accès à ses compétences mais pas à ses notes numériques.
Cette fonctionnalité lui donne une vue complète de sa progression scolaire
avec moyennes par matière, détail par évaluation, statistiques de classe,
et un mode "découverte" pour révéler ses notes à son rythme (FR14, FR15).

Les notes ne sont visibles qu'après publication par l'enseignant, ce qui
garantit que l'élève les découvre avant ses parents (délai 24h story 6.7).
2026-04-07 10:00:28 +02:00

154 lines
17 KiB
Bash
Executable File

#!/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, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$STUDENT1_ID', '$PARENT_ID', 'parent', NOW(), NOW()) ON CONFLICT DO NOTHING" 2>&1
$SQL "INSERT INTO student_guardians (id, tenant_id, student_id, guardian_id, relationship_type, created_at, updated_at) VALUES (gen_random_uuid(), '$TENANT_ID', '$STUDENT2_ID', '$PARENT_ID', 'parent', NOW(), 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:<port>/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 ""