📋 Cahier de Charge Officiel · Version 2.0

EduTrack IA

Plateforme Pédagogique Intelligente — Spécifications Complètes
Durée Projet
8 sem.
23 mars – 15 mai 2026
Équipe
5
membres · PFE N°9
Modules
3
Data · IA · Rapports
Précision IA cible
> 75%
classification compétences
01
Contexte et Objectifs

1.1 Contexte

EduTrack IA est une plateforme pédagogique intelligente destinée aux centres de cours de soutien scolaire au Maroc. Elle permet aux enseignants de suivre la progression des élèves du collège et du lycée et de communiquer automatiquement avec les parents grâce à l'intelligence artificielle.

🇲🇦
Contexte Éducatif Marocain
Le projet cible les centres de cours de soutien au Maroc, qui accompagnent les élèves du secondaire dans leur parcours scolaire. Ces centres offrent un suivi personnalisé en complément de l'éducation nationale marocaine.

1.1.1 Système Éducatif Cible

NiveauClassesÂge TypiqueExamen National
Collège1ère, 2ème, 3ème année12-15 ansBrevet (3ème année)
LycéeTronc Commun, 1ère Bac, 2ème Bac15-18 ansBaccalauréat (2ème Bac)

1.1.2 Matières Enseignées (Cours de Soutien)

CatégorieMatièresCoefficient Bac
SciencesMathématiques, Physique-Chimie, SVT7-9
LanguesArabe, Français, Anglais2-4
HumanitésHistoire-Géographie, Philosophie, Éducation Islamique2-3
TechniquesInformatique, Sciences de l'Ingénieur3-5

1.1.3 Système de Notation

📊 Échelle de Notes
Notation0 à 20
Moyenne passage10/20
Mention TB≥ 16/20
Mention Bien≥ 14/20
Mention AB≥ 12/20
📅 Périodes Scolaires
Année scolaireSept → Juin
Semestre 1Sept → Janv
Semestre 2Fév → Juin
Examens régionauxJuin (1ère Bac)
BaccalauréatJuin (2ème Bac)

1.2 Problématique

Les centres de soutien scolaire font face à plusieurs défis structurels :

⚠️
Défis identifiés Suivi manuel chronophage — Les enseignants passent beaucoup de temps à analyser manuellement les résultats · Communication inefficace — Les parents ne sont pas informés régulièrement de la progression · Manque de visibilité — Difficile d'identifier rapidement les compétences à renforcer · Absence d'historique — Pas de suivi longitudinal de la progression.

1.3 Objectifs du Projet

#ObjectifIndicateur de Succès
O1Analyser automatiquement les résultats scolairesTemps d'analyse réduit de 80%
O2Identifier les compétences maîtrisées / à renforcerPrécision classification > 75%
O3Suivre la progression temporelle des élèvesGraphiques de tendance disponibles
O4Générer des rapports automatiques pour les parentsRapport généré en < 10 secondes

1.4 Périmètre

✅ Inclus

  • Gestion des données élèves, notes, compétences
  • Analyse IA de la progression
  • Génération de rapports personnalisés
  • Envoi de notifications WhatsApp
  • Dashboard enseignant et vue parent

❌ Exclus

  • Gestion administrative (facturation, inscriptions)
  • Application mobile native
  • Intégration ENT / Pronote
02
Analyse des Besoins

2.1 Parties Prenantes

ActeurRôleBesoins Principaux
🧑‍🏫 EnseignantUtilisateur principalSaisir notes, voir progression, générer rapports
👨‍👩‍👧 ParentDestinataire des rapportsConsulter progression enfant, recevoir notifications
⚙️ AdministrateurGestionnaire du centreConfigurer le système, gérer les utilisateurs
👧 ÉlèveSujet du suivi (indirect)Bénéficier d'un suivi personnalisé

2.2 User Stories Principales

Enseignant

US-E1
En tant qu'enseignant, je veux enregistrer les notes d'une évaluation, afin de conserver un historique des résultats de chaque élève.
US-E2
En tant qu'enseignant, je veux voir un tableau de bord de ma classe, afin d'identifier rapidement les élèves en difficulté.
US-E3
En tant qu'enseignant, je veux ajouter des observations sur un élève, afin de compléter l'analyse quantitative par des remarques qualitatives.
US-E4
En tant qu'enseignant, je veux générer un rapport de progression en un clic, afin de gagner du temps sur la communication avec les parents.
US-E5
En tant qu'enseignant, je veux visualiser la progression d'un élève dans le temps, afin de mesurer l'efficacité de mon accompagnement.

Parent

US-P1
En tant que parent, je veux recevoir un rapport WhatsApp après chaque séance, afin d'être informé de la progression de mon enfant.
US-P2
En tant que parent, je veux accéder à un portail simplifié, afin de consulter l'historique des évaluations de mon enfant.
US-P3
En tant que parent, je veux voir un graphique radar des compétences, afin de comprendre les forces et faiblesses de mon enfant.

2.3 Exigences Non-Fonctionnelles

⚡ Performance
Temps de réponse API< 500ms
Génération rapport IA< 10s
Uptime99%
🏗️ Scalabilité & Sécurité
Élèves / centre500
Données personnellesRGPD
InterfaceResponsive
03
Spécifications Fonctionnelles

3.1 Module 1 — Gestion des Données Pédagogiques

3.1.1 Gestion des Élèves

RefFonctionnalitéPriorité
F1.1Créer un profil élève (nom, prénom, classe, date de naissance)Haute
F1.2Modifier les informations d'un élèveHaute
F1.3Archiver un élève (soft delete)Moyenne
F1.4Rechercher / filtrer les élèves par classe, nomHaute
F1.5Importer des élèves depuis un fichier CSVMoyenne
GET/api/studentsListe des élèves (pagination)
GET/api/students/{id}Détail d'un élève
POST/api/studentsCréer un élève
PUT/api/students/{id}Modifier un élève
DEL/api/students/{id}Archiver un élève
POST/api/students/importImport CSV

3.1.2 Gestion des Compétences

RefFonctionnalitéPriorité
F1.6Créer une compétence (nom, matière, niveau)Haute
F1.7Organiser les compétences par matièreHaute
F1.8Définir des niveaux de maîtrise (1-4 ou pourcentage)Haute

3.1.3 Gestion des Évaluations et Notes

📊
Classification des niveaux 🟢 Maîtrisée — Note moyenne ≥ 14/20  ·  🟡 En cours — 10 ≤ note < 14  ·  🔴 À renforcer — Note < 10/20
RefFonctionnalitéPriorité
F1.9Enregistrer une note (0-20) avec dateHaute
F1.10Associer une note à une ou plusieurs compétencesHaute
F1.11Type d'évaluation (contrôle, test blanc, exercice)Moyenne
F1.12Consulter l'historique des notes d'un élèveHaute

3.1.4 Gestion des Observations Enseignants

RefFonctionnalitéPriorité
F1.13Ajouter une observation textuelle sur un élèveHaute
F1.14Associer une observation à une séance/dateHaute
F1.15Catégoriser les observations (comportement, progrès, difficulté)Moyenne
F1.16Inclure les observations dans les rapportsHaute

3.2 Module 2 — Analyse IA de la Progression

3.2.1 Classification des Compétences

RefFonctionnalitéPriorité
F2.1Classifier chaque compétence en 3 niveaux (Maîtrisée / En cours / À renforcer)Haute
F2.2Afficher la classification par élèveHaute
F2.3Afficher la classification par classe (vue agrégée)Moyenne
GET/api/analytics/student/{id}/competenciesClassification compétences élève
GET/api/analytics/class/{id}/competenciesClassification compétences classe

3.2.2 Indicateurs de Progression Temporelle

RefFonctionnalitéPriorité
F2.4Calculer la tendance de progression (amélioration / stagnation / régression)Haute
F2.5Calculer le score de progression (delta entre périodes)Haute
F2.6Détecter les alertes de régressionMoyenne
# Calcul de la tendance
tendance = moyenne_période_récente - moyenne_période_précédente

si tendance > +2  → "Amélioration"
si tendance < -2  → "Régression"
sinon"Stagnation"
GET/api/analytics/student/{id}/progressionIndicateurs de progression
GET/api/analytics/student/{id}/trendTendance temporelle
GET/api/analytics/alertsÉlèves en régression
GET/api/analytics/student/{id}/radarDonnées radar (JSON)
GET/api/analytics/class/{id}/heatmapDonnées heatmap classe

3.2.3 Visualisations

RefFonctionnalitéPriorité
F2.7Graphique radar des compétences par élève (Recharts RadarChart)Haute
F2.8Courbe de progression temporelle (Recharts LineChart)Haute
F2.9Heatmap des compétences par classeMoyenne
F2.10Export des graphiques en PNGBasse
GET/api/analytics/student/{id}/timelineDonnées courbe temporelle

3.3 Module 3 — Rapports et Communication Parents

3.3.1 Structure du Rapport Généré

📋 RAPPORT DE PROGRESSION – [Nom Élève]
   Date : [Date]  ·  Enseignant : [Nom]

1. COMPÉTENCES TRAVAILLÉES
   - [Liste des compétences de la séance]

2. PROGRÈS RÉALISÉS
   - [Texte généré par IA sur les améliorations]

3. POINTS À AMÉLIORER
   - [Texte généré par IA sur les difficultés]

4. OBSERVATIONS DE L'ENSEIGNANT
   - [Observations saisies manuellement]

5. RECOMMANDATIONS
   - [Conseils générés par IA pour les parents]
RefFonctionnalitéPriorité
F3.1Générer un rapport texte personnalisé avec IAHaute
F3.2Inclure les compétences travailléesHaute
F3.3Inclure les progrès réalisésHaute
F3.4Inclure les points à améliorerHaute
F3.5Inclure les recommandations pédagogiquesHaute
F3.6Inclure les observations de l'enseignantHaute
F3.7Générer le rapport en PDFMoyenne
F3.8Générer le rapport en HTMLMoyenne
POST/api/reports/generateGénérer rapport (retourne texte)
GET/api/reports/{id}Consulter un rapport généré
GET/api/reports/{id}/pdfTélécharger rapport PDF
GET/api/reports/student/{id}Historique rapports d'un élève

3.3.2 Communication WhatsApp

RefFonctionnalitéPriorité
F3.9Envoyer un rapport via WhatsAppHaute
F3.10Configurer le numéro de téléphone du parentHaute
F3.11Historique des envois WhatsAppMoyenne
F3.12Gestion des erreurs d'envoiMoyenne
POST/api/reports/{id}/send-whatsappEnvoyer rapport via WhatsApp
GET/api/reports/{id}/whatsapp-historyHistorique des envois

3.3.3 Notifications In-App

RefFonctionnalitéPriorité
F3.13Afficher des alertes pour les élèves en difficultéMoyenne
F3.14Configurer des seuils d'alerte personnalisésBasse

3.3.4 Génération Périodique Automatique NOUVEAU

Celery Beat — Les rapports mensuels et trimestriels sont déclenchés automatiquement sans intervention humaine. La génération à la demande (F3.1–F3.8) reste disponible.
RefFonctionnalitéPriorité
F3.15Générer et envoyer automatiquement un rapport mensuel (1er du mois à 08h00)Haute
F3.16Générer et envoyer automatiquement un rapport trimestriel (1er jan / avr / juil / oct)Haute
F3.17Mécanisme anti-spam : 1 rapport max par type par mois/trimestre par élèveHaute
F3.18Rapport trimestriel plus détaillé : synthèse 3 mois, comparaison des périodesHaute
POST/api/reports/scheduleConfigurer la fréquence (mensuel/trimestriel)
GET/api/reports/scheduleConsulter la configuration actuelle
Python — Celery Beat Schedule
CELERY_BEAT_SCHEDULE = {
    'send-monthly-reports': {
        'task': 'app.tasks.reports.send_monthly_reports',
        'schedule': crontab(hour=8, minute=0, day_of_month=1),
    },
    'send-quarterly-reports': {
        'task': 'app.tasks.reports.send_quarterly_reports',
        'schedule': crontab(hour=8, minute=0, day_of_month=1, month_of_year='1,4,7,10'),
    },
}
04
Spécifications Techniques

4.1 Stack Technologique

CoucheTechnologieVersionJustification
BackendFlask2.3+Léger, flexible, écosystème Python
BDDPostgreSQL15+Robuste, requêtes complexes, JSON support
ORMSQLAlchemy2.0+Migrations Alembic intégrées
MLScikit-learn1.3+Classification, métriques
DataPandas / NumPy2.x / 1.24+Manipulation & calculs vectorisés
NLPTransformers4.35+Génération de texte (HuggingFace)
VizMatplotlib / Seaborn3.8+ / 0.13+Graphiques & heatmaps
FrontendNext.js15+React 19, App Router, SSR/SSG
FrontendReact19+UI components, Hooks
UI LibraryTailwind CSS + shadcn/ui3.x / latestDesign system, composants accessibles
ChartsRecharts2.xGraphiques React (RadarChart, LineChart...)
Démo IAGradio4.xInterface interactive IA
SchedulerCelery Beat5.xTâches périodiques (rapports mensuels/trimestriels)
PDFWeasyPrint60+Génération PDF depuis HTML
Notif.Twilio / WhatsApp8.xAPI WhatsApp Business

4.2 Variables d'Environnement

VariableDescriptionExemple
DATABASE_URLURL PostgreSQLpostgresql://user:pass@host:5432/edutrack
FLASK_ENVEnvironnementdevelopment / production
SECRET_KEYClé secrète Flaskyour-secret-key-here
TWILIO_ACCOUNT_SIDID compte TwilioACxxxxxxxx
HF_MODELModèle HuggingFacetiiuae/falcon-7b-instruct

4.3 Infrastructure de Déploiement

Azure VM — Serveur de développement et tests Docker pour toute l'équipe.
ComposantValeurDescription
VM Nameedutrack-aiMachine virtuelle Azure
IP Publique20.199.136.39Accès SSH et services
OSUbuntu 24.04 LTSDernière version LTS
Docker29.3.1Container runtime
Docker Composev5.1.1Orchestration multi-container
TailleStandard B2als v22 vCPUs, 4 GiB RAM

Images Docker Construites

ServiceDockerfileTaillePort
Flask APIDockerfile.flask807 MB:5000
Next.js DashboardDockerfile.nextjs~800 MB:3000
Gradio DemoDockerfile.gradio476 MB:7860
PostgreSQLpostgres:15-alpine~80 MB:5432
Redisredis:7-alpine~30 MB:6379
Celery WorkerDockerfile.flask(partagé)

4.4 Repository GitHub & Workflow

ÉlémentValeurDescription
Repositorygithub.com/ahmeddamouad/edutrack-iaCode source principal
Branche ProductionmainProtégée — PR obligatoire
Branche IntégrationdevelopFeatures mergées ici
Feature Branchesfeature/EI-XXX-descConvention de nommage

Workflow de Développement

┌─────────────────────────────────────────────────────────────────────┐ WORKFLOW DE DÉVELOPPEMENT └─────────────────────────────────────────────────────────────────────┘ ① LOCAL ② GITHUB ③ AZURE VM ④ DOCKER ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ VS Code │ ───▶ │ Push │ ───▶ │ Pull │ ───▶ │ Build & │ │ + Git │ │ PR/Review │ │ Latest │ │ Test │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ Développeur Code Review edutrack-ai Containers Commandes clés: git checkout -b feature/EI-XXXgit push -u origin feature/EI-XXXgit pull origin main

Branch Protection Rules (main)

🔒
Règles de protection appliquées:
✅ Require Pull Request avant merge
✅ Require au moins 1 approbation
✅ Push direct interdit sur main
✅ Admin bypass activé (workflow développeur solo)
05
Architecture Système

5.1 Architecture C4 — Niveau Contexte

┌──────────────────── UTILISATEURS ────────────────────────────┐ Enseignant Parent Administrateur (Dashboard) (Vue simplifiée) (Configuration) └──────────────────────────────────────────────────────────────┘ │ │ │ ▼ ▼ ▼ ┌──────────────────────────────────────────────────────────────┐ EduTrack IA ┌─────────────────────────────────────────────────────┐ │ │ Interface Utilisateur │ │ │ │ Next.js 15 / Gradio │ │ │ └─────────────────────────────────────────────────────┘ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Backend API (Flask) │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ ┌────────▼────────┐ ┌──────▼──────┐ ┌────────▼──────┐ │ │ │ Module IA │ │ PostgreSQL │ │ WhatsApp │ │ │ │ Scikit-learn │ │ (AWS RDS) │ │ (Twilio) │ │ │ │ + Transformers │ │ │ │ │ │ │ └─────────────────┘ └─────────────┘ └──────────────┘ │ └──────────────────────────────────────────────────────────────┘

5.2 Ports & Services

ServicePortDescription
Next.js Dashboard:3000Interface principale (admin / enseignant / parent)
Gradio Demo IA:7860Interface de démonstration IA
Flask API:5000API REST centrale
PostgreSQL:5432Base de données AWS RDS
Redis:6379Broker Celery / Cache

5.3 Structure du Projet

edutrack-ia/
├── 📁 app/
│   ├── 📁 api/           # students, grades, analytics, reports, notifications
│   ├── 📁 models/        # SQLAlchemy models
│   ├── 📁 schemas/       # Marshmallow schemas
│   ├── 📁 services/      # ml_classifier, progression, report_generator, whatsapp
│   └── 📁 ml/            # models/*.joblib + training scripts
├── 📁 frontend/
│   ├── 📁 nextjs/        # Next.js 15 App (admin / enseignant / parent)
│   │   ├── 📁 app/       # App Router — /dashboard, /students, /reports, /parent
│   │   ├── 📁 components/ # shadcn/ui + composants custom
│   │   └── 📁 lib/       # utils, API client
│   └── 📁 gradio/        # Interface démo IA
├── 📁 data/             # CSV fixtures d'exemple
├── 📁 migrations/       # Alembic versions
├── 📁 tests/            # unit/ + integration/
├── 📁 docs/             # ADR, brand-guide, api-reference
├── .env.example
├── requirements.txt
├── README.md
└── docker-compose.yml

5.4 API REST — Documentation Complète

5.4.1 Format Standard des Réponses

JSON
// Réponse succès
{
  "success": true,
  "data": { ... },
  "meta": {
    "page": 1,
    "per_page": 20,
    "total": 150,
    "total_pages": 8
  }
}

// Réponse erreur
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "La note doit être entre 0 et 20",
    "field": "value"
  }
}

5.4.2 Authentification

MéthodeEndpointDescriptionAuth
POST/api/auth/loginConnexion utilisateur-
POST/api/auth/logoutDéconnexionJWT
POST/api/auth/refreshRenouveler le tokenRefresh
GET/api/auth/meProfil utilisateur connectéJWT
POST /api/auth/login
// Request
{
  "email": "enseignant@edutrack.fr",
  "password": "motdepasse123"
}

// Response 200
{
  "success": true,
  "data": {
    "access_token": "eyJhbGciOiJIUzI1NiIs...",
    "refresh_token": "eyJhbGciOiJIUzI1NiIs...",
    "expires_in": 3600,
    "user": {
      "id": "uuid",
      "email": "enseignant@edutrack.fr",
      "role": "teacher",
      "first_name": "Jean",
      "last_name": "Dupont"
    }
  }
}

5.4.3 Students (Élèves)

MéthodeEndpointDescriptionAuth
GET/api/studentsListe paginée des élèvesJWT
POST/api/studentsCréer un élèveJWT
GET/api/students/{id}Détails d'un élèveJWT
PUT/api/students/{id}Modifier un élèveJWT
DELETE/api/students/{id}Supprimer (soft delete)JWT
POST/api/students/importImport CSV multipleJWT
GET/api/students/{id}/exportExport RGPD completJWT
POST /api/students
// Request
{
  "first_name": "Marie",
  "last_name": "Dupont",
  "date_of_birth": "2014-03-15",
  "class_name": "6A",
  "parent_phone": "+33612345678",
  "parent_email": "parent.dupont@email.com"
}

// Response 201
{
  "success": true,
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "first_name": "Marie",
    "last_name": "Dupont",
    "full_name": "Marie Dupont",
    "date_of_birth": "2014-03-15",
    "class_name": "6A",
    "parent_phone": "+33612345678",
    "parent_email": "parent.dupont@email.com",
    "is_active": true,
    "created_at": "2026-03-25T10:30:00Z"
  }
}

5.4.4 Grades (Notes)

MéthodeEndpointDescriptionAuth
GET/api/gradesListe des notes (filtrable)JWT
POST/api/gradesAjouter une noteJWT
GET/api/grades/{id}Détails d'une noteJWT
PUT/api/grades/{id}Modifier une noteJWT
DELETE/api/grades/{id}Supprimer une noteJWT
GET/api/grades/student/{id}Notes d'un élèveJWT
POST/api/grades/batchImport multiple notesJWT
POST /api/grades
// Request
{
  "student_id": "550e8400-e29b-41d4-a716-446655440000",
  "competency_id": "660e8400-e29b-41d4-a716-446655440001",
  "value": 16.5,
  "evaluation_type": "controle",
  "evaluation_date": "2026-03-25",
  "comment": "Excellent travail"
}

// Response 201
{
  "success": true,
  "data": {
    "id": "770e8400-e29b-41d4-a716-446655440002",
    "student_id": "550e8400-...",
    "student_name": "Marie Dupont",
    "competency_id": "660e8400-...",
    "competency_name": "Calcul mental",
    "value": 16.5,
    "evaluation_type": "controle",
    "evaluation_date": "2026-03-25",
    "comment": "Excellent travail",
    "created_at": "2026-03-25T14:00:00Z"
  }
}

5.4.5 Analytics (IA)

MéthodeEndpointDescriptionAuth
GET/api/analytics/student/{id}/progressionClassification ML + tendanceJWT
GET/api/analytics/student/{id}/radarRadar des compétencesJWT
GET/api/analytics/student/{id}/trendÉvolution temporelleJWT
GET/api/analytics/class/{id}/heatmapHeatmap classeJWT
GET/api/analytics/alertsListe des alertesJWT
GET /api/analytics/student/{id}/progression
// Response 200
{
  "success": true,
  "data": {
    "student_id": "550e8400-...",
    "student_name": "Marie Dupont",
    "classification": "en_progression",
    "confidence": 0.87,
    "trend_coefficient": 0.15,
    "average_grade": 14.5,
    "grade_std": 2.3,
    "num_evaluations": 12,
    "days_since_last_evaluation": 5,
    "recommendations": [
      "Continuer les exercices de français",
      "Renforcer la pratique en histoire"
    ],
    "computed_at": "2026-03-25T15:00:00Z"
  }
}

5.4.6 Reports (Rapports)

MéthodeEndpointDescriptionAuth
POST/api/reports/generateGénérer un rapport IAJWT
GET/api/reports/{id}Détails du rapportJWT
GET/api/reports/{id}/pdfTélécharger PDFJWT
GET/api/reports/student/{id}Historique rapportsJWT
POST/api/reports/{id}/send-whatsappEnvoyer via WhatsAppJWT
POST /api/reports/generate
// Request
{
  "student_id": "550e8400-e29b-41d4-a716-446655440000",
  "report_type": "seance"
}

// Response 201 (async)
{
  "success": true,
  "data": {
    "report_id": "880e8400-e29b-41d4-a716-446655440003",
    "status": "generating",
    "estimated_time_seconds": 8
  }
}

// GET /api/reports/{id} après génération
{
  "success": true,
  "data": {
    "id": "880e8400-...",
    "student_id": "550e8400-...",
    "student_name": "Marie Dupont",
    "report_type": "seance",
    "status": "ready",
    "content": {
      "summary": "Marie montre une progression constante...",
      "strengths": ["Calcul mental", "Compréhension écrite"],
      "improvements": ["Expression orale"],
      "recommendations": ["Pratiquer la lecture à voix haute"]
    },
    "pdf_url": "/api/reports/880e8400-.../pdf",
    "whatsapp_sent": false,
    "created_at": "2026-03-25T16:00:00Z"
  }
}

5.4.7 Competencies & Subjects

MéthodeEndpointDescription
GET/api/subjectsListe des matières
POST/api/subjectsCréer une matière
GET/api/competenciesListe des compétences
POST/api/competenciesCréer une compétence
GET/api/competencies/subject/{id}Compétences par matière

5.4.8 Observations

MéthodeEndpointDescription
GET/api/observationsListe des observations
POST/api/observationsAjouter observation
GET/api/observations/student/{id}Observations par élève
PUT/api/observations/{id}Modifier observation
DELETE/api/observations/{id}Supprimer observation
POST /api/observations
// Request
{
  "student_id": "550e8400-e29b-41d4-a716-446655440000",
  "content": "Marie participe activement en classe et aide ses camarades.",
  "category": "progres",
  "observation_date": "2026-03-25"
}

// Response 201
{
  "success": true,
  "data": {
    "id": "990e8400-e29b-41d4-a716-446655440004",
    "student_id": "550e8400-...",
    "student_name": "Marie Dupont",
    "teacher_name": "Jean Dupont",
    "content": "Marie participe activement en classe...",
    "category": "progres",
    "observation_date": "2026-03-25",
    "created_at": "2026-03-25T17:00:00Z"
  }
}

5.4.9 Codes d'Erreur HTTP

CodeSignificationExemple
200SuccèsGET réussi
201CrééPOST réussi
400Bad RequestDonnées invalides
401UnauthorizedToken manquant/expiré
403ForbiddenPermissions insuffisantes
404Not FoundRessource inexistante
409ConflictEmail déjà utilisé
422UnprocessableValidation échouée
500Server ErrorErreur interne

5.5 Diagrammes UML

5.5.1 Diagramme Use Case

┌─────────────────────────────────────────────────┐ │ EduTrack IA │ │ │ ┌─────────┐ │ ┌─────────────────────────────────────────┐ │ │Enseignant│───────────┼──│ S'authentifier │ │ └─────────┘ │ └─────────────────────────────────────────┘ │ │ │ │ │ │ ┌─────────────────────────────────────────┐ │ ├─────────────────┼──│ Gérer élèves (CRUD) │ │ │ │ └─────────────────────────────────────────┘ │ │ │ │ │ │ ┌─────────────────────────────────────────┐ │ ├─────────────────┼──│ Saisir notes │ │ │ │ └─────────────────────────────────────────┘ │ │ │ │ │ │ ┌─────────────────────────────────────────┐ │ ├─────────────────┼──│ Consulter dashboard │ │ │ │ └─────────────────────────────────────────┘ │ │ │ │ │ │ ┌─────────────────────────────────────────┐ │ «include» ├─────────────────┼──│ Générer rapport IA │◄──────────────┐ │ │ └─────────────────────────────────────────┘ │ │ │ │ │ │ │ │ │ │ «include» │ │ │ │ ▼ │ │ │ │ ┌─────────────────────────────────────────┐ │ │ │ │ │ Classifier élèves (ML) │◄──┼───────────┤ │ │ └─────────────────────────────────────────┘ │ │ │ │ │ │ │ │ ┌─────────────────────────────────────────┐ │ │ ├─────────────────┼──│ Envoyer WhatsApp │───┼───────────┘ │ │ └─────────────────────────────────────────┘ │ │ │ │ │ │ ┌─────────────────────────────────────────┐ │ └─────────────────┼──│ Configurer alertes │◄──┼────┐ │ └─────────────────────────────────────────┘ │ │ │ │ │ │ ┌─────────┐ │ │ «include» │ │ │ Parent │────────────┼───────────────────────┼────────────────────────┼────┤ └─────────┘ │ ▼ │ │ │ │ ┌─────────────────────────────────────────┐ │ │ │ │ │ Détecter alertes (IA) │───┼────┘ │ │ └─────────────────────────────────────────┘ │ │ │ │ │ │ ┌─────────────────────────────────────────┐ │ ├─────────────────┼──│ Consulter progression enfant │ │ │ │ └─────────────────────────────────────────┘ │ │ │ │ │ │ ┌─────────────────────────────────────────┐ │ └─────────────────┼──│ Recevoir notifications │ │ │ └─────────────────────────────────────────┘ │ │ │ ┌───────────┐ │ ┌─────────────────────────────────────────┐ │ │Administrateur│───────┼──│ Gérer utilisateurs │ │ └───────────┘ │ └─────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────┘

5.5.2 Diagramme de Séquence — Génération Rapport IA

┌──────────┐ ┌───────────┐ ┌─────────┐ ┌──────────┐ ┌───────────┐ ┌──────────┐ ┌─────────┐ │Enseignant│ │ Next.js │ │Flask API│ │PostgreSQL│ │ML Service │ │HuggingFace│ │ Twilio │ └────┬─────┘ └─────┬─────┘ └────┬────┘ └────┬─────┘ └─────┬─────┘ └─────┬─────┘ └────┬────┘ │ │ │ │ │ │ │ │ Clic "Générer Rapport" │ │ │ │ │ │─────────────>│ │ │ │ │ │ │ │ POST /api/reports/generate │ │ │ │ │────────────>│ │ │ │ │ │ │ │ SELECT student, grades, observations │ │ │ │ │───────────>│ │ │ │ │ │ │ données élève │ │ │ │ │ │<───────────│ │ │ │ │ │ │ │ │ │ │ │ │ │ classify_student(features)│ │ │ │ │ │───────────────────────────>│ │ │ │ │ │ │ ┌──────────┴──────────┐ │ │ │ │ │ │ │StandardScaler │ │ │ │ │ │ │ │.transform() │ │ │ │ │ │ │ │RandomForest │ │ │ │ │ │ │ │.predict_proba() │ │ │ │ │ │ │ └──────────┬──────────┘ │ │ │ │ │ {classification: "en_progression", confidence: 0.87} │ │ │ │<───────────────────────────│ │ │ │ │ │ generate_text(prompt, data)│ │ │ │ │ │────────────────────────────────────────────>│ │ │ │ │ texte rapport personnalisé │ │ │ │ │ │<────────────────────────────────────────────│ │ │ │ │ [WeasyPrint: génère PDF] │ │ │ │ │ │ INSERT INTO reports │ │ │ │ │ │───────────>│ │ │ │ │ │ {report_id, pdf_url, status: "ready"} │ │ │ │ │<────────────│ │ │ │ │ │ Rapport PDF affiché │ │ │ │ │ │<─────────────│ │ │ │ │ │ │ │ │ │ │ │ │ │ Clic "Envoyer WhatsApp" │ │ │ │ │ │─────────────>│ │ │ │ │ │ │ │ POST /api/reports/{id}/send-whatsapp │ │ │ │ │────────────>│ │ │ │ │ │ │ │ send_message(parent_phone, pdf_url) │ │ │ │ │────────────────────────────────────────────────────────>│ │ │ │ {message_sid, status: "sent"} │ │ │ │ │<────────────────────────────────────────────────────────│ │ │ │ UPDATE reports SET whatsapp_sent = true │ │ │ │ │───────────>│ │ │ │ │ ✓ Message envoyé au parent│ │ │ │ │ │<─────────────│ │ │ │ │ │

5.5.3 Diagramme de Séquence — Saisie de Note

┌──────────┐ ┌───────────┐ ┌─────────┐ ┌───────────┐ ┌──────────┐ ┌───────────┐ │Enseignant│ │ Next.js │ │Flask API│ │Marshmallow│ │PostgreSQL│ │ML Service │ └────┬─────┘ └─────┬─────┘ └────┬────┘ └─────┬─────┘ └────┬─────┘ └─────┬─────┘ │ │ │ │ │ │ │ Remplit formulaire note │ │ │ │ │──────────────>│ │ │ │ │ │ │ Validation client (0-20, date) │ │ │ │ │ │ │ │ │ │ POST /api/grades │ │ │ │ │─────────────>│ │ │ │ │ │ │ GradeSchema.load(data) │ │ │ │ │──────────────>│ │ │ │ │ │ │ Validate: │ │ │ │ │ │ value 0-20 │ │ │ │ │ │ date valid │ │ ╔══════════════════════════════════════════════════════════════════════════════╗ ║ ALT [Validation échoue] ║ ╠══════════════════════════════════════════════════════════════════════════════╣ │ │ │ ValidationError │ │ │ │ │<──────────────│ │ │ │ │ 400 {error: "Valeur invalide"} │ │ │ │<─────────────│ │ │ │ │ Message erreur rouge │ │ │ │ │<──────────────│ │ │ │ │ ╠══════════════════════════════════════════════════════════════════════════════╣ ║ ALT [Validation OK] ║ ╠══════════════════════════════════════════════════════════════════════════════╣ │ │ │ grade_data │ │ │ │ │ │<──────────────│ │ │ │ │ │ INSERT INTO grades │ │ │ │ │──────────────────────────────>│ │ │ │ │ grade_id │ │ │ │ │ │<──────────────────────────────│ │ │ │ │ update_classification(student_id) [Async] │ │ │ │──────────────────────────────────────────────>│ │ │ 201 {grade: {...}} │ │ │ │ │<─────────────│ │ │ │ │ "Note ajoutée ✓" │ │ │ │ │<──────────────│ │ │ │ │ │ │ Refresh dashboard │ │ │ ╚══════════════════════════════════════════════════════════════════════════════╝

5.5.4 Diagramme d'Activité — Workflow Enseignant

┌─────────────────┐ │ START │ └────────┬────────┘ ▼ ┌─────────────────┐ │ Connexion │ │ enseignant │ └────────┬────────┘ ▼ ◇───────────────────◇ ╱ Identifiants ╲ ╱ valides ? ╲ ◇───────────────────────────◇ │ OUI │ NON ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ │ Accès Dashboard │ │ Message erreur │──┐ └────────┬────────┘ └─────────────────┘ │ │ │ ┌────────────┴────────────┐ │ ▼ ▼ │ ┌─────────────────┐ ┌─────────────────┐ │ │Consulter alertes│ │Voir stats classe│ │ └────────┬────────┘ └────────┬────────┘ │ └────────────┬────────────┘ │ ▼ │ ┌─────────────────┐ │ ┌──────>│Sélectionner │ │ │ │action │ │ │ └────────┬────────┘ │ │ ┌───────────┼───────────┬───────────┐ │ │ ▼ ▼ ▼ ▼ │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │Saisir│ │Générer│ │Consul-│ │Ajouter│ │ │ │note │ │rapport│ │ter │ │observ.│ │ │ └──┬───┘ └──┬───┘ │progres│ └──┬───┘ │ │ │ │ └──┬───┘ │ │ │ ▼ ▼ │ │ │ │ ┌──────────┐ ┌──────┐ │ │ │ │ │Sélection-│ │Sélect│ │ │ │ │ │ner élève │ │élève │ │ │ │ │ └────┬─────┘ └──┬───┘ │ │ │ │ ▼ ▼ ▼ ▼ │ │ ┌──────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │Sélection-│ │Choisir │ │Afficher│ │Rédiger │ │ │ │ner compét│ │type │ │graphes │ │texte │ │ │ └────┬─────┘ └───┬────┘ └───┬────┘ └───┬────┘ │ │ ▼ ▼ │ ▼ │ │ ┌──────────┐ ┌────────┐ │ ┌────────┐ │ │ │Entrer │ │Génération │ │Sélect │ │ │ │valeur │ │IA │ │ │catégorie│ │ │ │(0-20) │ └───┬────┘ │ └───┬────┘ │ │ └────┬─────┘ ▼ │ ▼ │ │ ▼ ┌────────┐ │ ┌────────┐ │ │ ┌──────────┐│Afficher│ │ │Enregis-│ │ │ │Valider ││rapport │ │ │trer │ │ │ └────┬─────┘│PDF │ │ └───┬────┘ │ │ ▼ └───┬────┘ │ │ │ │ ┌──────────┐ ▼ │ │ │ │ │Note │◇─────────◇ │ │ │ │ │enregistrée│ Envoyer ╲ │ │ │ │ └────┬─────┘╲WhatsApp? ╱ │ │ │ │ │ ◇─────────◇ │ │ │ │ │ │OUI │NON │ │ │ │ │ ▼ │ │ │ │ │ │ ┌────────┐ │ │ │ │ │ │ │Envoi │ │ │ │ │ │ │ │parent │ │ │ │ │ │ │ └───┬────┘ │ │ │ │ │ │ ▼ │ │ │ │ │ │ ┌────────┐ │ │ │ │ │ │ │Confirm.│ │ │ │ │ │ │ └───┬────┘ │ │ │ │ │ └──────┴────────┴──────┴────────┘ │ │ │ │ │ ▼ │ │ ◇───────────────────◇ │ │ ╱ Continuer ? ╲ │ │ ◇───────────────────────◇ │ │ │ OUI │ NON │ └───────────┘ ▼ │ ┌─────────────────┐ │ │ Déconnexion │ │ └────────┬────────┘ │ ▼ │ ┌─────────────────┐ │ │ END │<──────────┘ └─────────────────┘
06
Modèle de Données

6.1 Tables Principales

studentsÉlèves
PKidUUIDNOT NULL
first_nameVARCHAR(100)NOT NULL
last_nameVARCHAR(100)NOT NULL
date_of_birthDATE
class_nameVARCHAR(50)NOT NULL
parent_phoneVARCHAR(20)
parent_emailVARCHAR(255)
is_activeBOOLEANDEFAULT TRUE
created_atTIMESTAMPDEFAULT NOW()
gradesNotes
PKidUUIDNOT NULL
FKstudent_idUUID→ students
FKcompetency_idUUID→ competencies
valueDECIMAL(4,2)CHECK 0–20
evaluation_typeENUMcontrole | test_blanc | exercice
evaluation_dateDATENOT NULL
created_atTIMESTAMPDEFAULT NOW()
competenciesCompétences
PKidUUIDNOT NULL
nameVARCHAR(200)NOT NULL
descriptionTEXT
FKsubject_idUUID→ subjects
levelVARCHAR(20)cycle3, 6ème…
created_atTIMESTAMPDEFAULT NOW()
observationsNouveau
PKidUUIDNOT NULL
FKstudent_idUUID→ students
teacher_nameVARCHAR(100)NOT NULL
contentTEXTNOT NULL
categoryENUMcomportement | progres | difficulte
NEWobservation_dateDATENOT NULL
created_atTIMESTAMPDEFAULT NOW()
usersAuthentification
PKidUUIDNOT NULL
emailVARCHAR(255)UNIQUE NOT NULL
password_hashVARCHAR(255)NOT NULL
roleENUMadmin | teacher | parent
first_nameVARCHAR(100)NOT NULL
last_nameVARCHAR(100)NOT NULL
phoneVARCHAR(20)
is_activeBOOLEANDEFAULT TRUE
last_loginTIMESTAMP
created_atTIMESTAMPDEFAULT NOW()
subjectsMatières
PKidUUIDNOT NULL
nameVARCHAR(100)UNIQUE NOT NULL
codeVARCHAR(10)UNIQUE NOT NULL
descriptionTEXT
coefficientDECIMAL(3,2)DEFAULT 1.00
colorVARCHAR(7)DEFAULT #3B82F6
is_activeBOOLEANDEFAULT TRUE
created_atTIMESTAMPDEFAULT NOW()
classesClasses
PKidUUIDNOT NULL
nameVARCHAR(50)NOT NULL
levelVARCHAR(20)NOT NULL
academic_yearVARCHAR(9)2025-2026
FKteacher_idUUID→ users
max_studentsINTEGERDEFAULT 30
created_atTIMESTAMPDEFAULT NOW()
reportsRapports IA
PKidUUIDNOT NULL
FKstudent_idUUID→ students
FKgenerated_byUUID→ users
report_typeENUMmensuel | trimestriel | seance
content_jsonJSONBNOT NULL
pdf_pathVARCHAR(500)
whatsapp_sentBOOLEANDEFAULT FALSE
whatsapp_sent_atTIMESTAMP
created_atTIMESTAMPDEFAULT NOW()
ai_predictionsML
PKidUUIDNOT NULL
FKstudent_idUUID→ students
prediction_typeVARCHAR(50)classification
classificationVARCHAR(50)NOT NULL
confidenceDECIMAL(5,4)0.0000-1.0000
features_jsonJSONBNOT NULL
model_versionVARCHAR(20)v1.0.0
created_atTIMESTAMPDEFAULT NOW()
audit_logsRGPD
PKidUUIDNOT NULL
FKuser_idUUID→ users
actionVARCHAR(50)CREATE | UPDATE | DELETE
entity_typeVARCHAR(50)student | grade | ...
entity_idUUID
old_valueJSONB
new_valueJSONB
ip_addressINET
created_atTIMESTAMPDEFAULT NOW()

6.2 Index et Contraintes

SQL
-- Index de performance
CREATE INDEX idx_students_class ON students(class_name);
CREATE INDEX idx_students_active ON students(is_active);
CREATE INDEX idx_grades_student ON grades(student_id);
CREATE INDEX idx_grades_date ON grades(evaluation_date);
CREATE INDEX idx_grades_student_date ON grades(student_id, evaluation_date);
CREATE INDEX idx_observations_student ON observations(student_id);
CREATE INDEX idx_competencies_subject ON competencies(subject_id);
CREATE INDEX idx_reports_student ON reports(student_id);
CREATE INDEX idx_predictions_student ON ai_predictions(student_id);

-- Contraintes CHECK
ALTER TABLE grades ADD CONSTRAINT chk_grade_value
  CHECK (value >= 0 AND value <= 20);
ALTER TABLE competencies ADD CONSTRAINT chk_level
  CHECK (level >= 1 AND level <= 5);
ALTER TABLE students ADD CONSTRAINT chk_phone_format
  CHECK (parent_phone ~ '^\+?[0-9]{10,15}$');

6.3 Diagramme ERD

┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ users │ │ subjects │ │ classes │ ├─────────────┤ ├─────────────┤ ├─────────────┤ │ PK id │ │ PK id │ │ PK id │ │ email │ │ name │ │ name │ │ password │ │ code │ │ level │ │ role │ │ coefficient │ │ FK teacher │ │ first_name │ └──────┬──────┘ └─────────────┘ │ last_name │ │ └──────┬──────┘ │ 1 │ │ │ 1 ▼ N │ ┌─────────────┐ │ │competencies │ │ ├─────────────┤ │ │ PK id │ │ │ name │ │ │ FK subject │ │ └──────┬──────┘ │ │ 1 ▼ N │ ┌─────────────┐ ▼ N │ reports │ ┌─────────────┐ ├─────────────┤ │ grades │◄──────────────────┐ │ PK id │ ├─────────────┤ │ │ FK student │ │ PK id │ │ │ FK user │ │ FK student │───────────────────┤ │ type │ │ FK compet. │ │ │ content │ │ value │ │ │ pdf_path │ │ date │ │ └─────────────┘ └─────────────┘ │ │ ┌─────────────┐ ┌─────────────┐ ┌───────────┴─┐ │audit_logs │ │observations │ │ students │ ├─────────────┤ ├─────────────┤ ├─────────────┤ │ PK id │ │ PK id │ │ PK id │ │ FK user │ │ FK student │───────│ first_name │ │ action │ │ teacher │ │ last_name │ │ entity │ │ content │ │ class_name │ │ old/new │ │ category │ │ parent_phone│ └─────────────┘ └─────────────┘ └─────────────┘ │ │ 1 ▼ N ┌─────────────┐ │ai_predictions│ ├─────────────┤ │ PK id │ │ FK student │ │ classif. │ │ confidence │ │ features │ └─────────────┘

6.4 Collecte de Données Éducatives Marocaines

🇲🇦
Responsabilité Data Engineers
Les Data Engineers sont responsables de collecter, structurer et valider les données éducatives marocaines pour alimenter le système.

6.4.1 Données à Collecter

CatégorieDonnéesSourceFormat
MatièresListe complète des matières par niveau (collège/lycée)Programme MEN MarocJSON/CSV
CompétencesRéférentiel de compétences par matière et niveauCurricula officielsJSON
CoefficientsCoefficients par matière et filière (Sciences, Lettres, Techniques)MEN MarocJSON
NiveauxStructure des classes (1AC→3AC, TC→2Bac)Système éducatifJSON
BarèmesSeuils de notation, mentions, critères de passageRèglements examenJSON

6.4.2 Structure des Matières Marocaines

JSON - data/fixtures/subjects_maroc.json
{
  "subjects": [
    {
      "code": "MATH",
      "name_fr": "Mathématiques",
      "name_ar": "الرياضيات",
      "levels": ["college", "lycee"],
      "coefficients": {
        "sciences_math": 9,
        "sciences_exp": 7,
        "lettres": 3
      }
    },
    {
      "code": "PHYS",
      "name_fr": "Physique-Chimie",
      "name_ar": "الفيزياء والكيمياء",
      "levels": ["college", "lycee"],
      "coefficients": {
        "sciences_math": 7,
        "sciences_exp": 7,
        "lettres": 2
      }
    },
    {
      "code": "SVT",
      "name_fr": "Sciences de la Vie et de la Terre",
      "name_ar": "علوم الحياة والأرض",
      "levels": ["college", "lycee"],
      "coefficients": {
        "sciences_exp": 7,
        "sciences_math": 5
      }
    },
    {
      "code": "ARAB",
      "name_fr": "Langue Arabe",
      "name_ar": "اللغة العربية",
      "levels": ["college", "lycee"],
      "coefficients": {
        "lettres": 4,
        "sciences_exp": 2,
        "sciences_math": 2
      }
    },
    {
      "code": "FRAN",
      "name_fr": "Langue Française",
      "name_ar": "اللغة الفرنسية",
      "levels": ["college", "lycee"],
      "coefficients": {
        "lettres": 4,
        "sciences_exp": 2,
        "sciences_math": 2
      }
    },
    {
      "code": "ANGL",
      "name_fr": "Langue Anglaise",
      "name_ar": "اللغة الإنجليزية",
      "levels": ["college", "lycee"],
      "coefficients": {
        "all": 2
      }
    },
    {
      "code": "HIST",
      "name_fr": "Histoire-Géographie",
      "name_ar": "التاريخ والجغرافيا",
      "levels": ["college", "lycee"],
      "coefficients": {
        "lettres": 3,
        "sciences": 2
      }
    },
    {
      "code": "PHIL",
      "name_fr": "Philosophie",
      "name_ar": "الفلسفة",
      "levels": ["lycee"],
      "coefficients": {
        "lettres": 4,
        "sciences": 2
      }
    },
    {
      "code": "ISLA",
      "name_fr": "Éducation Islamique",
      "name_ar": "التربية الإسلامية",
      "levels": ["college", "lycee"],
      "coefficients": {
        "all": 2
      }
    }
  ]
}

6.4.3 Compétences par Matière (Exemple Mathématiques)

JSON - data/fixtures/competencies_math.json
{
  "subject": "MATH",
  "competencies": {
    "college": {
      "1AC": [
        {"code": "M1C1", "name": "Opérations sur les nombres entiers"},
        {"code": "M1C2", "name": "Fractions et décimaux"},
        {"code": "M1C3", "name": "Géométrie plane - triangles"},
        {"code": "M1C4", "name": "Proportionnalité"}
      ],
      "2AC": [
        {"code": "M2C1", "name": "Calcul algébrique"},
        {"code": "M2C2", "name": "Équations du 1er degré"},
        {"code": "M2C3", "name": "Théorème de Pythagore"},
        {"code": "M2C4", "name": "Statistiques descriptives"}
      ],
      "3AC": [
        {"code": "M3C1", "name": "Identités remarquables"},
        {"code": "M3C2", "name": "Systèmes d'équations"},
        {"code": "M3C3", "name": "Théorème de Thalès"},
        {"code": "M3C4", "name": "Trigonométrie dans le triangle"}
      ]
    },
    "lycee": {
      "TC": [
        {"code": "MTC1", "name": "Calcul vectoriel"},
        {"code": "MTC2", "name": "Fonctions de référence"},
        {"code": "MTC3", "name": "Polynômes du 2nd degré"}
      ],
      "1BAC": [
        {"code": "M1B1", "name": "Suites numériques"},
        {"code": "M1B2", "name": "Limites et continuité"},
        {"code": "M1B3", "name": "Dérivation"},
        {"code": "M1B4", "name": "Produit scalaire"}
      ],
      "2BAC": [
        {"code": "M2B1", "name": "Intégration"},
        {"code": "M2B2", "name": "Équations différentielles"},
        {"code": "M2B3", "name": "Nombres complexes"},
        {"code": "M2B4", "name": "Probabilités et dénombrement"}
      ]
    }
  }
}

6.4.4 Niveaux Scolaires Marocains

JSON - data/fixtures/levels_maroc.json
{
  "levels": {
    "college": {
      "name_fr": "Collège (Secondaire Collégial)",
      "name_ar": "الثانوي الإعدادي",
      "classes": [
        {"code": "1AC", "name": "1ère Année Collège", "age": 12},
        {"code": "2AC", "name": "2ème Année Collège", "age": 13},
        {"code": "3AC", "name": "3ème Année Collège", "age": 14, "exam": "Brevet"}
      ]
    },
    "lycee": {
      "name_fr": "Lycée (Secondaire Qualifiant)",
      "name_ar": "الثانوي التأهيلي",
      "classes": [
        {"code": "TC", "name": "Tronc Commun", "age": 15},
        {"code": "1BAC", "name": "1ère Année Bac", "age": 16, "exam": "Régional"},
        {"code": "2BAC", "name": "2ème Année Bac", "age": 17, "exam": "Baccalauréat"}
      ],
      "filieres": [
        {"code": "SM", "name": "Sciences Mathématiques"},
        {"code": "PC", "name": "Sciences Physiques"},
        {"code": "SVT", "name": "Sciences de la Vie et de la Terre"},
        {"code": "SE", "name": "Sciences Économiques"},
        {"code": "SH", "name": "Sciences Humaines"},
        {"code": "LA", "name": "Lettres et Arts"}
      ]
    }
  }
}

6.4.5 Données de Test Réalistes

DatasetDescriptionVolumeFichier
Élèves TestProfils réalistes d'élèves marocains100+ élèvesstudents_maroc.json
Notes HistoriquesNotes sur 2 semestres par élève1000+ notesgrades_maroc.json
Compétences50 compétences par matière principale300+ compétencescompetencies_all.json
ObservationsRemarques enseignants en arabe/français200+ observationsobservations_maroc.json
📋
Tâches Data Engineers
1. Collecter les référentiels de compétences officiels du MEN Maroc
2. Créer les fixtures JSON pour toutes les matières du collège et lycée
3. Générer des données de test réalistes (noms marocains, notes cohérentes)
4. Valider les coefficients par filière avec les règlements officiels
5. Documenter les sources de données dans /docs/data-sources.md
07
Interfaces Utilisateur

7.1 Dashboard Enseignant — Page Accueil

┌────────────────────────────────────────────────────────────────┐ │ 🎓 EduTrack IA [Déconnexion] │ ├────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 42 │ │ 85% │ │ 3 │ │ 12 │ │ │ │ Élèves │ │ Moy. │ │ Alertes │ │ Rapports │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ ┌─────────────────────────────────────┐ │ │ │ Heatmap Compétences Classe │ │ │ │ Math Fran Angl Hist Phys │ │ │ │ [🟢] [🟡] [🟢] [🟡] [🔴] │ 3A │ │ │ [🟡] [🟢] [🟡] [🔴] [🟡] │ 3B │ │ └─────────────────────────────────────┘ │ │ │ │ ⚠️ Sarah D. : Régression en Mathématiques (-15%) │ │ ⚠️ Tom M. : Compétence "Fractions" à renforcer │ └────────────────────────────────────────────────────────────────┘

7.2 Vue Parent — Espace Simplifié

┌────────────────────────────────────────────────────────────────┐ │ 🎓 EduTrack IA – Espace Parent │ ├────────────────────────────────────────────────────────────────┤ │ Bonjour ! Voici la progression de Sarah. │ │ │ │ Mathématiques ████████████████░░░░ 80% 🟢 Maîtrisée │ │ Français ████████████░░░░░░░░ 60% 🟡 En cours │ │ Sciences ██████████████████░░ 90% 🟢 Maîtrisée │ │ Histoire ████████░░░░░░░░░░░░ 40% 🔴 À renforcer │ │ │ │ 📈 Tendance : ↗️ Amélioration (+8% ce mois) │ │ │ │ [📥 Télécharger PDF] [📲 Historique WhatsApp] │ └────────────────────────────────────────────────────────────────┘

7.3 Page de Connexion

┌────────────────────────────────────────────────────────────────┐ │ │ │ │ │ 🎓 EduTrack IA │ │ ━━━━━━━━━━━━━━━━━━ │ │ │ │ Système de suivi pédagogique │ │ intelligent avec IA │ │ │ │ ┌─────────────────────────┐ │ │ │ 📧 Email │ │ │ │ ________________________│ │ │ │ enseignant@ecole.fr │ │ │ └─────────────────────────┘ │ │ │ │ ┌─────────────────────────┐ │ │ │ 🔒 Mot de passe │ │ │ │ ________________________│ │ │ │ •••••••••• │ │ │ └─────────────────────────┘ │ │ │ │ ☐ Se souvenir de moi │ │ │ │ ┌─────────────────────────┐ │ │ │ SE CONNECTER │ │ │ │ 🔓 │ │ │ └─────────────────────────┘ │ │ │ │ Mot de passe oublié ? │ │ │ │ ───────────────────────────────────────────────────────── │ │ © 2026 EduTrack IA - PFE Projet #9 │ └────────────────────────────────────────────────────────────────┘

7.4 Fiche Élève Détaillée

┌──────────────────────────────────────────────────────────────────────────┐ │ ← Retour à la liste Fiche Élève [Générer Rapport ▼] │ ├──────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌────────┐ Marie DUPONT │ │ │ 👤 │ ───────────────────────────────────────────────── │ │ │ 📷 │ Classe: 6ème A • Né(e): 15/03/2014 • 📱 +33612345678 │ │ │ │ Email parent: parent.dupont@email.com │ │ └────────┘ Statut: ● Actif │ │ Classification IA: 🟢 En progression (confiance: 87%) │ │ │ ├──────────────────────────────────────────────────────────────────────────┤ │ [📊 Notes] [🎯 Compétences] [📝 Observations] [📈 Historique] [📄 Rapports] │ ├──────────────────────────────────────────────────────────────────────────┤ │ │ │ ÉVOLUTION DES NOTES RADAR COMPÉTENCES │ │ ┌────────────────────────────┐ ┌────────────────────────┐ │ │ │ 18│ ● │ │ Maths │ │ │ │ 16│ ╱ ╲ ● │ │ 90% │ │ │ │ 14│● ● ╲ ╱ ╲ │ │ ◢━━━━━━━◣ │ │ │ │ 12│ ╲ ╱ ● ● │ │ Fr◣ ◥Hist │ │ │ │ 10│ ╲╱ │ │ 75% ╲ ● ╱ 70% │ │ │ │ ──────────────────────── │ │ ╲ ╱ │ │ │ │ Sept Oct Nov Dec Jan │ │ Sc◤━━━◥Géo │ │ │ │ │ │ 85% 65% │ │ │ │ ● Notes ─── Tendance │ │ │ │ │ └────────────────────────────┘ │ ■ Actuel □ Objectif │ │ │ └────────────────────────┘ │ │ DERNIÈRES NOTES │ │ ┌──────────────────────────────────────────────────────────────────┐ │ │ │ Date │ Matière │ Compétence │ Note │ Type │ │ │ ├──────────────────────────────────────────────────────────────────┤ │ │ │ 25/03/2026 │ Mathématiques│ Calcul mental │ 16/20 │ Devoir │ │ │ │ 22/03/2026 │ Français │ Compréhension écrite │ 14/20 │ Contrôle│ │ │ │ 18/03/2026 │ Histoire │ Analyse documents │ 15/20 │ Oral │ │ │ │ 15/03/2026 │ Sciences │ Méthode scientifique │ 17/20 │ TP │ │ │ │ 10/03/2026 │ Géographie │ Lecture de carte │ 13/20 │ Devoir │ │ │ └──────────────────────────────────────────────────────────────────┘ │ │ [+ Ajouter une note] │ │ │ │ OBSERVATIONS RÉCENTES │ │ ┌──────────────────────────────────────────────────────────────────┐ │ │ │ 🟢 20/03 - M. Dupont: "Marie participe activement en classe" │ │ │ │ 🟡 15/03 - Mme Martin: "Doit améliorer l'expression orale" │ │ │ │ 🟢 08/03 - M. Dupont: "Excellent travail de groupe" │ │ │ └──────────────────────────────────────────────────────────────────┘ │ │ [+ Ajouter une observation] │ └──────────────────────────────────────────────────────────────────────────┘

7.5 Formulaire de Saisie de Note

┌─────────────────────────────────────────────────────────────┐ │ ✏️ Nouvelle Note ✕ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ Élève * │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 🔍 Marie DUPONT - 6A ▼ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ Matière * │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 📚 Mathématiques ▼ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ Compétence * │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 🎯 Calcul mental ▼ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌───────────────────┐ ┌─────────────────────────────┐ │ │ │ Note /20 * │ │ Type d'évaluation * │ │ │ │ ┌───────────────┐ │ │ ┌─────────────────────────┐ │ │ │ │ │ 16 │ │ │ │ Devoir maison ▼ │ │ │ │ │ └───────────────┘ │ │ └─────────────────────────┘ │ │ │ │ ◄━━━━━●━━━━━━► │ │ │ │ │ │ 0 20 │ │ ○ Devoir maison │ │ │ └───────────────────┘ │ ● Contrôle │ │ │ │ ○ Test blanc │ │ │ │ ○ Exercice │ │ │ │ ○ Oral │ │ │ └─────────────────────────────┘ │ │ │ │ Date d'évaluation * │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 📅 25/03/2026 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ Commentaire (optionnel) │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Excellent travail, bonne maîtrise des additions │ │ │ │ complexes. │ │ │ │ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌───────────────────┐ ┌─────────────────────────────┐ │ │ │ Annuler │ │ ✓ Enregistrer │ │ │ │ │ │ │ │ │ └───────────────────┘ └─────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘

7.6 Génération de Rapport IA

┌─────────────────────────────────────────────────────────────────────────┐ │ 📄 Rapport de Progression - Marie DUPONT ✕ │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ 🎓 EDUTRACK IA │ │ │ │ Rapport de Progression │ │ │ │ ━━━━━━━━━━━━━━━━━━━━━ │ │ │ │ │ │ │ │ Élève: Marie DUPONT Date: 25 mars 2026 │ │ │ │ Classe: 6ème A Période: Trimestre 2 │ │ │ │ │ │ │ │ ═══════════════════════════════════════════════════════════ │ │ │ │ │ │ │ │ 📊 RÉSUMÉ GLOBAL │ │ │ │ ─────────────────────────────────────────────────────────── │ │ │ │ Marie démontre une progression constante et encourageante. │ │ │ │ Sa moyenne générale de 14.5/20 reflète un travail régulier │ │ │ │ et une bonne compréhension des concepts abordés. │ │ │ │ │ │ │ │ Classification IA: 🟢 EN PROGRESSION (confiance: 87%) │ │ │ │ │ │ │ │ ✅ POINTS FORTS │ │ │ │ • Excellente maîtrise du calcul mental │ │ │ │ • Bonne compréhension en lecture │ │ │ │ • Participation active en classe │ │ │ │ │ │ │ │ 📈 AXES D'AMÉLIORATION │ │ │ │ • L'expression orale peut encore progresser │ │ │ │ • La méthodologie en histoire nécessite attention │ │ │ │ │ │ │ │ 💡 RECOMMANDATIONS POUR LES PARENTS │ │ │ │ • Encourager la lecture à voix haute (15 min/jour) │ │ │ │ • Continuer les exercices de mathématiques ludiques │ │ │ │ • Valoriser les efforts et progrès réalisés │ │ │ │ │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────┐ │ │ │ 📥 Télécharger │ │ 🖨️ Imprimer │ │ 📲 Envoyer via WhatsApp │ │ │ │ PDF │ │ │ │ │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────────┘

7.7 Liste des Alertes

┌──────────────────────────────────────────────────────────────────────────┐ │ ⚠️ Alertes Actives 🔔 Notifications │ ├──────────────────────────────────────────────────────────────────────────┤ │ │ │ Filtrer: [Toutes ▼] [Cette semaine ▼] [Classe 6A ▼] 🔍 Rechercher │ │ │ │ ┌──────────────────────────────────────────────────────────────────┐ │ │ │ 🔴 URGENT il y a 2h │ │ │ │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ │ │ │ Lucas MARTIN (6A) - Baisse significative en Mathématiques │ │ │ │ Moyenne passée de 14/20 à 8/20 sur les 3 dernières semaines │ │ │ │ Confiance IA: 92% │ │ │ │ │ │ │ │ [📞 Contacter parent] [📄 Voir fiche] [✓ Marquer résolu] │ │ │ └──────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────────────┐ │ │ │ 🟡 ATTENTION il y a 1 jour │ │ │ │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ │ │ │ Sophie BERNARD (6B) - Compétence "Fractions" non acquise │ │ │ │ 3 évaluations < 10/20 consécutives sur cette compétence │ │ │ │ Confiance IA: 78% │ │ │ │ │ │ │ │ [📞 Contacter parent] [📄 Voir fiche] [✓ Marquer résolu] │ │ │ └──────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────────────┐ │ │ │ 🟡 ATTENTION il y a 3 jours│ │ │ │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ │ │ │ Thomas PETIT (6A) - Absence prolongée (5 jours) │ │ │ │ Aucune note enregistrée depuis le 15/03/2026 │ │ │ │ │ │ │ │ [📞 Contacter parent] [📄 Voir fiche] [✓ Marquer résolu] │ │ │ └──────────────────────────────────────────────────────────────────┘ │ │ │ │ Affichage 3 sur 3 alertes [Actualiser 🔄] │ └──────────────────────────────────────────────────────────────────────────┘

7.8 Composants Next.js / shadcn/ui

ComposantBibliothèque / APIUsage
KPI Card<Card> + shadcn/uiAfficher statistiques avec variation
Graphique évolutionRecharts <LineChart>Tendance des notes
Radar compétencesRecharts <RadarChart>Visualiser multi-compétences par élève
Heatmap classeRecharts <Cell> + grilleMatrice élèves × compétences
Formulaire note<Form> + react-hook-formSaisie groupée avec validation Zod
Sélection élève<Select> (shadcn/ui)Recherche et sélection d'élève
Slider note<Slider 0-20>Saisie intuitive 0-20
Date picker<DatePicker> (shadcn/ui)Sélection date évaluation
Alertes<Alert> / <Toast>Notifications visuelles
Rapport PDF<Button> téléchargementExport PDF généré
Vue Parent (/parent)Route Next.js App RouterPortail simplifié parent — intégré dans la même app
08
Intelligence Artificielle

8.1 Pipeline de Classification Scikit-learn

📊
Features
avg_grade, std, trend, n_eval
⚖️
StandardScaler
Normalisation
🌲
RandomForest
100 estimateurs
🎯
Classification
Maîtrisée / En cours / À renforcer
# Pipeline de classification (Scikit-learn)
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline  import Pipeline

pipeline = Pipeline([
    ('scaler',     StandardScaler()),
    ('classifier', RandomForestClassifier(
        n_estimators=100,
        max_depth=10,
        random_state=42
    ))
])

features = [
    'avg_grade',        # Moyenne des notes
    'std_grade',        # Écart-type
    'trend_coefficient',# Coefficient tendance linéaire
    'num_evaluations', # Nombre d'évaluations
    'last_grade',      # Dernière note
    'days_since_last'  # Jours depuis dernière évaluation
]
🎯
Objectif de précisionPrécision minimale requise : 75% — Métrique affichée dans le dashboard enseignant. Classes : 0 = Maîtrisée, 1 = En cours, 2 = À renforcer.

8.2 Génération de Rapports — Transformers HuggingFace

ParamètreValeur
Modèletiiuae/falcon-7b-instruct ou mistralai/Mistral-7B-Instruct-v0.1
LangueFrançais
Max tokens300
Température0.7 (créativité modérée)
Temps max< 10 secondes
# Template de prompt pour la génération de rapport
PROMPT_TEMPLATE = """
Tu es un assistant pédagogique. Génère un rapport de progression.

Élève: {student_name}  ·  Classe: {class_name}  ·  Période: {period}

Compétences travaillées: {competencies_list}
Classification → Maîtrisées: {mastered} | En cours: {in_progress}
                 À renforcer: {to_reinforce}
Observations: {observations}

Génère un rapport bienveillant et constructif en 3-4 paragraphes.
1. Les progrès réalisés
2. Les points à améliorer
3. Des recommandations concrètes pour les parents
"""

8.3 Calcul des Features ML

# Service de calcul des features (app/services/ml_features.py)
import numpy as np
from datetime import date
from typing import Optional, Dict

def calculate_features(student_id: str) -> Optional[Dict]:
    """Calcule les features pour la classification ML d'un élève."""

    # Récupérer les notes ordonnées par date
    grades = Grade.query.filter_by(student_id=student_id)\
                        .order_by(Grade.evaluation_date).all()

    if len(grades) < 3:
        return None  # Pas assez de données

    values = [g.value for g in grades]
    dates = [(g.evaluation_date - grades[0].evaluation_date).days
             for g in grades]

    # Régression linéaire pour calculer la tendance
    slope, intercept = np.polyfit(dates, values, 1)

    # Calculer la couverture des compétences
    total_competencies = Competency.query.count()
    evaluated = Grade.query.filter_by(student_id=student_id)\
                     .distinct(Grade.competency_id).count()
    coverage = evaluated / total_competencies if total_competencies > 0 else 0

    return {
        'avg_grade': np.mean(values),              # Moyenne des notes
        'std_grade': np.std(values),               # Écart-type
        'trend_coefficient': slope,               # Coefficient de tendance
        'num_evaluations': len(grades),           # Nombre total d'évaluations
        'last_grade': values[-1],                  # Dernière note
        'days_since_last': (date.today() -        # Jours depuis dernière éval
                            grades[-1].evaluation_date).days,
        'competency_coverage': coverage,          # % compétences évaluées
        'improvement_rate': (values[-1] - values[0]) / len(values)
                                                   # Taux d'amélioration
    }

8.4 Configuration du Modèle

Python - config/ml_config.py
ML_CONFIG = {
    "model": {
        "type": "RandomForestClassifier",
        "params": {
            "n_estimators": 100,
            "max_depth": 10,
            "min_samples_split": 5,
            "min_samples_leaf": 2,
            "random_state": 42,
            "n_jobs": -1  # Utiliser tous les CPU
        }
    },
    "features": [
        "avg_grade",
        "std_grade",
        "trend_coefficient",
        "num_evaluations",
        "last_grade",
        "days_since_last",
        "competency_coverage",
        "improvement_rate"
    ],
    "target_classes": {
        0: "en_difficulte",    # Score < 10 ou tendance négative forte
        1: "stable",           # Score entre 10-14, tendance neutre
        2: "en_progression"    # Score > 14 ou tendance positive
    },
    "thresholds": {
        "alert_confidence": 0.75,     # Seuil pour déclencher alerte
        "min_evaluations": 3,         # Minimum évaluations requises
        "difficulty_grade": 10.0     # Seuil de difficulté
    },
    "huggingface": {
        "model_name": "mistralai/Mistral-7B-Instruct-v0.2",
        "max_new_tokens": 500,
        "temperature": 0.7,
        "top_p": 0.9,
        "repetition_penalty": 1.1
    }
}

8.5 Configuration WhatsApp (Twilio)

Python - config/whatsapp_config.py
WHATSAPP_CONFIG = {
    "account_sid": "${TWILIO_ACCOUNT_SID}",     # Variable d'environnement
    "auth_token": "${TWILIO_AUTH_TOKEN}",       # Variable d'environnement
    "from_number": "whatsapp:+14155238886",    # Numéro Sandbox Twilio

    "message_templates": {
        "report_ready": """
🎓 *EduTrack IA - Rapport de Progression*

Bonjour,

Le rapport de progression de {student_name} est disponible.

📊 Résumé:
• Moyenne: {avg_grade}/20
• Classification: {classification}
• Tendance: {trend}

📎 Consultez le rapport complet: {pdf_url}

Cordialement,
L'équipe pédagogique
""",
        "alert": """
⚠️ *Alerte EduTrack IA*

Concernant {student_name}:

{alert_message}

Nous vous invitons à consulter le tableau de bord
pour plus de détails.

📞 Contactez l'établissement si nécessaire.
""",
        "weekly_summary": """
📅 *Résumé Hebdomadaire - {student_name}*

Cette semaine:
• Notes ajoutées: {new_grades_count}
• Moyenne: {weekly_avg}/20
• Évolution: {evolution}

Détails sur le portail parent.
"""
    }
}
Python - services/whatsapp_service.py
from twilio.rest import Client
from config.whatsapp_config import WHATSAPP_CONFIG

class WhatsAppService:
    def __init__(self):
        self.client = Client(
            WHATSAPP_CONFIG['account_sid'],
            WHATSAPP_CONFIG['auth_token']
        )
        self.from_number = WHATSAPP_CONFIG['from_number']

    def send_report(self, parent_phone: str, student_name: str,
                     avg_grade: float, classification: str,
                     trend: str, pdf_url: str) -> dict:
        """Envoie un rapport de progression via WhatsApp."""

        message = WHATSAPP_CONFIG['message_templates']['report_ready'].format(
            student_name=student_name,
            avg_grade=avg_grade,
            classification=classification,
            trend=trend,
            pdf_url=pdf_url
        )

        response = self.client.messages.create(
            from_=self.from_number,
            body=message,
            to=f'whatsapp:{parent_phone}'
        )

        return {
            'message_sid': response.sid,
            'status': response.status,
            'sent_at': response.date_sent
        }

    def send_alert(self, parent_phone: str, student_name: str,
                    alert_message: str) -> dict:
        """Envoie une alerte urgente via WhatsApp."""

        message = WHATSAPP_CONFIG['message_templates']['alert'].format(
            student_name=student_name,
            alert_message=alert_message
        )

        response = self.client.messages.create(
            from_=self.from_number,
            body=message,
            to=f'whatsapp:{parent_phone}'
        )

        return {
            'message_sid': response.sid,
            'status': response.status
        }
09
Sécurité et Conformité

9.1 Protection des Données (RGPD)

MesureDescription
MinimisationCollecter uniquement les données nécessaires
PseudonymisationIDs UUID au lieu de données identifiantes dans les logs
ChiffrementHTTPS obligatoire, BDD chiffrée au repos
Droit d'accèsExport des données d'un élève sur demande
Droit à l'oubliSuppression complète possible

9.2 Authentification

ActeurMéthode
EnseignantSession Flask + mot de passe hashé (bcrypt)
ParentCode unique par élève (6 caractères)
APIJWT avec expiration 24h
10
Planning Détaillé

10.1 Dates Clés (1 semaine par sprint)

31/03/2026
Sprint 0 — 25-31/03 ✅ TERMINÉ
Architecture validée, maquettes UI, charte graphique, Dockerfiles, Docker Compose, config GitHub
07/04/2026
Sprint 1 — 01-07/04
BDD PostgreSQL connectée, Auth fonctionnel, fixtures chargées
14/04/2026
Sprint 2 — 08-14/04
CRUD API Flask fonctionnel + pipeline ingestion CSV
21/04/2026
Sprint 3 — 15-21/04
Module IA classification Scikit-learn + visualisations
28/04/2026
Sprint 4 — 22-28/04
Dashboard Next.js complet + interface Gradio
05/05/2026
Sprint 5 — 29/04-05/05
Rapports Transformers + WhatsApp + Tests unitaires 80%
12/05/2026
Sprint 6 — 06-12/05
Intégration, Sentry monitoring, documentation, responsive mobile
19/05/2026
Sprint 7 — 13-19/05
Mode démo PFE, audit sécurité, accessibilité WCAG
13–16/05
🎓 SOUTENANCE
Présentation 10 minutes devant le jury — FQIA 2026
10.2

Sprint Goals

Chaque sprint a un objectif clair et mesurable qui guide l'équipe vers une valeur livrée en fin de semaine.

Sprint Dates Goal (Objectif) Indicateur de Succès
S0 25-31 Mars Préparer les fondations: architecture validée, environnements configurés, maquettes approuvées Tous les devs peuvent lancer le projet localement ✅
S1 01-07 Avril Poser le socle: authentification fonctionnelle, schéma DB stable, composants UI de base Login/Logout opérationnel, 0 erreur console
S2 08-14 Avril Collecter les données: saisie notes complète, gestion absences, import CSV Un enseignant peut saisir et valider des notes
S3 15-21 Avril Analyser avec l'IA: modèle ML intégré, prédictions visibles, alertes automatiques API /predict retourne une prédiction en <500ms
S4 22-28 Avril Visualiser et démontrer: dashboard analytics, Gradio démo interactive Dashboard affiche graphiques, Gradio accessible
S5 29 Avr - 05 Mai Communiquer et tester: rapports Transformers, WhatsApp, tests unitaires 80% Rapport PDF généré, coverage pytest ≥ 80%
S6 06-12 Mai Stabiliser et documenter: Sentry monitoring, guide utilisateur, responsive mobile 0 erreur Sentry critique, doc PDF prête, mobile OK
S7 13-19 Mai Excellence PFE: mode démo jury, audit sécurité, accessibilité WCAG Démo 15 min prête, Lighthouse Security/A11y > 90
10.5
Backlog Produit Détaillé

10.5.1 Definition of Done (DoD)

Une User Story est considérée "Done" lorsque:
1. ✅ Le code est écrit et respecte les conventions du projet
2. ✅ Les tests unitaires sont écrits (couverture ≥ 80%)
3. ✅ Les tests passent sur la CI/CD
4. ✅ Le code a été reviewé par au moins 1 autre membre
5. ✅ La documentation est mise à jour (README, docstrings)
6. ✅ Les critères d'acceptation sont validés
7. ✅ Le code est mergé dans la branche develop
8. ✅ Aucune dette technique critique introduite

10.5.2 Epics du Projet

Epic IDNomDescriptionStoriesTotal SP
EPIC-0Sprint 0 - Setup & ArchitectureConfiguration environnements, architecture, maquettes, Docker, GitHub827
EPIC-1Authentification & SécuritéGestion des utilisateurs, JWT, rôles, CI/CD726
EPIC-2Gestion AcadémiqueCRUD élèves, notes, compétences, observations1449
EPIC-3Intelligence ArtificielleClassification ML, prédictions, features, validation945
EPIC-4Dashboard & VisualisationsNext.js, graphiques Recharts, heatmaps, Gradio, optimisation1464
EPIC-5Rapports & NotificationsGénération PDF, HuggingFace, WhatsApp, templates735
EPIC-6Data EngineeringBDD, migrations, fixtures Maroc, ETL, documentation834
EPIC-7Qualité & Excellence PFETests unitaires, Sentry, documentation, responsive, démo, sécurité, accessibilité826

Total: 74 Stories · ~306 Story Points · Vélocité estimée: 33 SP/sprint · 8 Sprints

10.5.3 Product Backlog avec Story Points

Principe de distribution: Chaque sprint implique les 5 membres de l'équipe avec des tâches et sous-tâches clairement définies et des descriptions détaillées.
Subtasks Jira: Chaque User Story dans Jira contient 2-3 subtasks de type [TASK] pour décomposer le travail:
Backend: Créer endpoint → Implémenter logique → Tester/Documenter
Frontend: Créer composant UI → Intégrer API → Finaliser UX
ML/IA: Préparer données → Implémenter modèle → Valider métriques
Data: Créer schéma → Implémenter ETL → Documenter

EPIC-0: Sprint 0 - Setup & Architecture

IDUser StorySPPrioritéSprintAssignéDescription détaillée
US-SETUP-1En tant que chef de projet, je veux définir l'architecture système5MustS0AhmedDéfinir la stack technique (Flask, PostgreSQL, Streamlit), créer les diagrammes C4, établir les conventions de code, configurer le repository Git
US-SETUP-2En tant que développeur IA, je veux configurer l'environnement ML3MustS0ChaimaeInstaller Scikit-learn, configurer HuggingFace Transformers, créer la structure dossier models/, tester un modèle de base
US-SETUP-3En tant que développeur frontend, je veux créer les maquettes UI/UX5MustS0ZakariaCréer wireframes avec Figma/Excalidraw pour: Login, Dashboard enseignant, Fiche élève, Rapport PDF. Définir la charte graphique
US-SETUP-4En tant que data engineer, je veux configurer PostgreSQL local3MustS0OuidadInstaller PostgreSQL 15, créer BDD edutrack_dev, configurer les accès, documenter les paramètres de connexion
US-SETUP-5En tant que data engineer, je veux configurer l'environnement de dev3MustS0AhmedConfigurer venv Python 3.11, créer requirements.txt, setup pre-commit hooks, configurer VS Code settings partagés
US-DOCKER-1En tant que développeur, je veux les Dockerfiles pour tous les services3MustS0AhmedCréer Dockerfile Flask (Python 3.11, gunicorn), Dockerfile Streamlit (dépendances UI), Dockerfile PostgreSQL (init scripts)
US-DOCKER-2En tant que développeur, je veux Docker Compose pour le dev local3MustS0AhmedConfigurer docker-compose.dev.yml avec hot-reload, volumes persistants, healthchecks, réseaux isolés, variables d'environnement
US-GIT-1En tant que chef de projet, je veux configurer le repository GitHub2MustS0AhmedConfigurer branch protection (main, develop), créer PR template, issue templates, .gitignore Python, CONTRIBUTING.md

EPIC-1: Authentification & Sécurité

IDUser StorySPPrioritéSprintAssignéDescription détaillée
US-AUTH-1En tant qu'utilisateur, je veux me connecter avec email/mot de passe5MustS1ChaimaeCréer endpoint POST /api/auth/login, valider email/password avec bcrypt, générer JWT avec expiration 24h, retourner user_id + role + token
US-AUTH-2En tant qu'utilisateur, je veux me déconnecter en toute sécurité2MustS1ChaimaeCréer endpoint POST /api/auth/logout, invalider le token côté serveur (blacklist), supprimer le refresh token si existant
US-AUTH-3En tant qu'admin, je veux créer des comptes enseignants5MustS1ChaimaeCréer endpoint POST /api/users avec validation email unique, hasher password, envoyer email de bienvenue (optionnel), assigner rôle teacher
US-AUTH-4En tant que développeur, je veux les formulaires d'authentification UI5MustS1ZakariaCréer page login Streamlit avec validation côté client, gérer le stockage session_state du token, rediriger vers dashboard après login
US-AUTH-5En tant que chef de projet, je veux configurer le pipeline CI/CD3MustS1AhmedConfigurer GitHub Actions: linting (flake8), tests (pytest), build Docker, déploiement automatique sur branche main
US-AUTH-6En tant qu'admin, je veux attribuer des rôles (admin/teacher/parent)5ShouldS2ChaimaeCréer endpoint PATCH /api/users/{id}/role, valider autorisations admin, logger les changements de rôle, mettre à jour le JWT
US-AUTH-7En tant qu'utilisateur, je veux réinitialiser mon mot de passe3CouldS5AhmedCréer endpoint POST /api/auth/reset-password, générer token temporaire 1h, envoyer email avec lien, page de reset avec nouveau mot de passe

EPIC-2: Gestion Académique

IDUser StorySPPrioritéSprintAssignéDescription détaillée
US-STU-1En tant qu'enseignant, je veux créer un profil élève3MustS2ChaimaeCréer endpoint POST /api/students avec champs: nom, prénom, date_naissance, niveau (1AC-2BAC), classe, parent_phone. Valider unicité par classe
US-STU-2En tant qu'enseignant, je veux modifier les informations d'un élève2MustS2ChaimaeCréer endpoint PUT /api/students/{id}, valider droits enseignant sur la classe, logger les modifications, retourner l'élève mis à jour
US-STU-3En tant qu'enseignant, je veux archiver un élève (soft delete)2ShouldS2AhmedCréer endpoint DELETE /api/students/{id} avec is_archived=true, conserver les notes et historique, exclure des listes actives
US-STU-4En tant qu'enseignant, je veux rechercher/filtrer les élèves3MustS2AhmedCréer endpoint GET /api/students?search=&level=&class=, implémenter recherche fulltext sur nom/prénom, pagination avec limit/offset
US-STU-5En tant qu'enseignant, je veux les formulaires CRUD élèves UI5MustS2ZakariaCréer pages Streamlit: liste élèves avec DataTable, formulaire création/édition, confirmation archivage, barre de recherche avec filtres
US-STU-6En tant qu'enseignant, je veux importer des élèves via CSV5ShouldS2OuidadCréer endpoint POST /api/students/import, valider format CSV (colonnes obligatoires), détecter doublons, rapport d'import avec erreurs
US-GRD-1En tant qu'enseignant, je veux saisir une note pour un élève5MustS2ChaimaeCréer endpoint POST /api/grades avec student_id, competence_id, note (0-20), type_eval, date. Valider note dans [0,20], déclencher recalcul features ML
US-GRD-2En tant qu'enseignant, je veux modifier une note existante3MustS2ChaimaeCréer endpoint PUT /api/grades/{id}, vérifier droits enseignant, logger l'ancienne valeur, recalculer features ML après modification
US-GRD-3En tant qu'enseignant, je veux voir l'historique des notes d'un élève5MustS2AhmedCréer endpoint GET /api/students/{id}/grades?from=&to=, retourner notes triées par date, groupées par matière, inclure moyenne par compétence
US-CMP-1En tant qu'enseignant, je veux créer une compétence3MustS2AhmedCréer endpoint POST /api/competences avec nom, description, subject_id, level (collège/lycée), coefficient. Valider unicité nom par matière
US-CMP-2En tant qu'enseignant, je veux organiser les compétences par matière3MustS2ChaimaeCréer endpoint GET /api/subjects/{id}/competences, implémenter arbre des compétences, permettre réorganisation drag-drop (ordre)
US-OBS-1En tant qu'enseignant, je veux ajouter une observation sur un élève3ShouldS3ChaimaeCréer endpoint POST /api/observations avec student_id, category, content, date. Catégories: comportement, participation, progrès, alerte
US-OBS-2En tant qu'enseignant, je veux catégoriser les observations2ShouldS3ChaimaeCréer CRUD catégories observations, permettre filtrage par catégorie, couleur-code pour chaque catégorie dans l'UI

EPIC-3: Intelligence Artificielle

IDUser StorySPPrioritéSprintAssignéDescription détaillée
US-ML-1En tant que système, je veux calculer les features ML d'un élève8MustS3ChaimaeCréer service calculate_features() avec: moyenne_globale, ecart_type, tendance (régression), nb_notes, taux_presence, nb_alertes. Retourner vecteur numpy
US-ML-2En tant que système, je veux classifier un élève (en difficulté/stable/progression)8MustS3ChaimaeImplémenter pipeline Scikit-learn: StandardScaler → RandomForestClassifier. Classes: 0=en_difficulté, 1=stable, 2=en_progression. Sauver modèle pickle
US-ML-3En tant qu'enseignant, je veux voir la prédiction IA pour chaque élève5MustS3ZakariaCréer composant Streamlit PredictionCard: classe prédite avec badge couleur, score confiance en %, icône indicateur, tooltip explicatif
US-ML-4En tant que chef de projet, je veux intégrer l'API ML au système5MustS3AhmedCréer endpoints ML: GET /api/predictions/{student_id}, POST /api/predictions/batch. Gérer cache prédictions, invalider après nouvelle note
US-ML-5En tant que data engineer, je veux valider les données pour le ML3MustS3OuidadCréer script validation_data.py: vérifier completude notes, détecter outliers, rapport qualité données, suggestions de nettoyage
US-ML-6En tant que data engineer, je veux préparer le dataset d'entraînement3MustS3TaoufiqCréer script prepare_training_data.py: extraire features, labéliser données historiques, split train/test 80/20, exporter CSV/Parquet
US-ML-7En tant que système, je veux entraîner le modèle avec les nouvelles données5ShouldS4ChaimaeCréer endpoint POST /api/ml/retrain (admin only), entraîner avec données récentes, comparer avec modèle existant, rollback si dégradation
US-ML-8En tant qu'enseignant, je veux voir le score de confiance de la prédiction3ShouldS4ZakariaAfficher probabilités par classe en bar chart, highlighter classe prédite, afficher seuil de confiance minimal (75%), warning si < seuil
US-ML-9En tant qu'admin, je veux voir les métriques du modèle (précision, rappel)5CouldS5ChaimaeCréer page admin métriques ML: matrice confusion, precision/recall/f1 par classe, courbe ROC, dashboard comparatif versions modèle

EPIC-4: Dashboard & Visualisations

IDUser StorySPPrioritéSprintAssignéDescription détaillée
US-DASH-1En tant qu'enseignant, je veux voir un dashboard avec les KPIs de ma classe8MustS4ZakariaCréer layout Streamlit avec cards: nb élèves total, moyenne classe, nb alertes, progression mensuelle. Utiliser st.metric() avec delta
US-DASH-2En tant qu'enseignant, je veux voir une heatmap des compétences par classe5MustS4ZakariaCréer heatmap Plotly: axe X = élèves, axe Y = compétences, couleur = moyenne. Filtres par matière, niveau. Tooltip avec détails note
US-DASH-3En tant qu'enseignant, je veux voir un graphique radar pour un élève5MustS4ZakariaCréer radar chart Plotly: 6-8 compétences principales, comparaison avec moyenne classe en overlay, export PNG possible
US-DASH-4En tant qu'enseignant, je veux voir la courbe de progression d'un élève5MustS4ZakariaCréer line chart: évolution moyenne sur temps, annotation des évaluations importantes, ligne de tendance (régression linéaire)
US-DASH-5En tant qu'enseignant, je veux voir les alertes élèves en difficulté5MustS4ZakariaCréer liste d'alertes triées par sévérité: rouge (urgent), orange (attention), jaune (surveillance). Lien vers fiche élève, actions rapides
US-DASH-6En tant que chef de projet, je veux optimiser les performances dashboard3MustS4AhmedImplémenter cache Redis pour KPIs, lazy loading des graphiques, pagination des listes, compression des réponses API
US-DASH-7En tant que développeur, je veux les endpoints Dashboard5MustS4ChaimaeCréer GET /api/analytics/kpis, GET /api/analytics/heatmap, GET /api/analytics/progression/{id}. Optimiser queries SQL avec agrégations
US-DASH-8En tant que data engineer, je veux seeder les données de démo dashboard3MustS4OuidadCréer script seed_demo_data.py: 50 élèves, 6 mois de notes, cas variés (progression, difficulté, stable), données réalistes Maroc
US-DASH-9En tant que data engineer, je veux documenter l'API Dashboard3MustS4TaoufiqCréer documentation Swagger/OpenAPI: endpoints, paramètres, exemples réponses, codes erreur, limites de rate
US-DASH-10En tant que parent, je veux voir un dashboard simplifié de mon enfant5ShouldS5ZakariaCréer vue parent Streamlit: KPIs simplifiés, radar compétences, dernières notes, recommandations IA en langage accessible
US-DASH-11En tant que parent, je veux voir le graphique radar de mon enfant3ShouldS5ZakariaRéutiliser composant radar existant, adapter textes pour parents, ajouter légende explicative des compétences
US-DASH-12En tant qu'enseignant, je veux filtrer le dashboard par période3CouldS6AhmedAjouter date picker: aujourd'hui, cette semaine, ce mois, ce trimestre, personnalisé. Recalculer tous les KPIs selon période
US-GRADIO-1En tant que jury PFE, je veux une interface Gradio interactive5MustS4ChaimaeCréer interface démo Gradio (port 7860): saisir features élève, voir prédiction temps réel, probabilités par classe, design cohérent EduTrack
US-GRADIO-2En tant que jury PFE, je veux des exemples préchargés Gradio3MustS4ZakariaAjouter 3-5 exemples: élève en difficulté, stable, progression. gr.Examples() avec labels explicatifs, tab À propos avec explication modèle

EPIC-5: Rapports & Notifications

IDUser StorySPPrioritéSprintAssignéDescription détaillée
US-RPT-1En tant qu'enseignant, je veux générer un rapport PDF avec l'IA8MustS5ChaimaeCréer service generate_report(): collecter données élève, appeler HuggingFace pour texte bienveillant, générer PDF avec ReportLab, inclure graphiques
US-RPT-2En tant qu'enseignant, je veux envoyer le rapport par WhatsApp8MustS5AhmedIntégrer Twilio WhatsApp API: envoyer PDF en pièce jointe, message personnalisé avec nom élève, gérer erreurs (numéro invalide), retry 3x
US-RPT-3En tant que système, je veux envoyer des alertes automatiques aux parents5ShouldS5AhmedCréer cron job quotidien: détecter élèves en difficulté (score ML < 0.3), envoyer notification WhatsApp/SMS, éviter spam (max 1/semaine)
US-RPT-4En tant que parent, je veux télécharger le rapport PDF3ShouldS5ZakariaCréer bouton téléchargement sur dashboard parent, stocker rapports en BDD/S3, servir via endpoint sécurisé avec token temporaire
US-RPT-5En tant que data engineer, je veux créer les templates de rapports3MustS5OuidadCréer templates HTML/Jinja2 pour rapport: en-tête école, sections (infos élève, graphiques, texte IA, recommandations), footer signature
US-RPT-6En tant que data engineer, je veux tester l'intégration end-to-end3MustS5TaoufiqCréer tests E2E: scénario complet login→saisie→génération→envoi, mock Twilio en test, vérifier contenu PDF, assertion messages WhatsApp
US-RPT-7En tant qu'enseignant, je veux voir l'historique des rapports envoyés5CouldS6AhmedCréer page historique: liste rapports par date, statut envoi (envoyé/échec/lu), lien vers PDF, bouton renvoyer, filtres par élève/période

EPIC-6: Data Engineering

IDUser StorySPPrioritéSprintAssignéDescription détaillée
US-DATA-1En tant que développeur, je veux une BDD PostgreSQL configurée5MustS1OuidadCréer schéma BDD: tables users, students, grades, competences, subjects, observations, ai_predictions, reports. Définir contraintes FK, index
US-DATA-2En tant que développeur, je veux les migrations Alembic en place5MustS1ChaimaeConfigurer Alembic avec flask-migrate, créer migration initiale, documenter commandes (upgrade/downgrade), intégrer dans CI/CD
US-DATA-3En tant que développeur, je veux les fixtures des matières marocaines5MustS1OuidadCréer fixtures JSON matières MEN Maroc: Maths, Physique-Chimie, SVT, Français, Arabe, Anglais, Histoire-Géo, Islamique, Philosophie (bac)
US-DATA-4En tant que développeur, je veux les fixtures des compétences collège5MustS1TaoufiqCréer fixtures compétences 1AC-3AC par matière: ~80 compétences total, structurées par chapitre, avec descriptions et coefficients
US-DATA-5En tant que développeur, je veux les fixtures des compétences lycée5MustS1OuidadCréer fixtures compétences TC-2BAC par filière: Sciences Maths, PC, SVT, Économie, Lettres. ~120 compétences avec coefficients Bac
US-DATA-6En tant que développeur, je veux des données de test réalistes3MustS2TaoufiqCréer script Faker generate_test_data.py: 100 élèves, 6 mois notes, distribution gaussienne, cas limites (échec, excellence, progression)
US-DATA-7En tant que développeur, je veux un script de seed pour la démo3ShouldS6OuidadCréer seed_demo.py: jeu de données cohérent pour présentation, 3 classes complètes, cas d'usage variés, données anonymisées mais réalistes
US-DATA-8En tant que développeur, je veux la doc des sources MEN Maroc3ShouldS2TaoufiqDocumenter sources officielles: liens PDF programmes, tableaux coefficients Bac, référentiel compétences, dates validité programmes

EPIC-7: Qualité & Excellence PFE

IDUser StorySPPrioritéSprintAssignéDescription détaillée
US-TEST-1En tant que chef de projet, je veux des tests unitaires API Flask5MustS5TaoufiqCréer tests pytest pour endpoints auth, students, grades, analytics. pytest-cov avec coverage min 80%, fixtures données test
US-TEST-2En tant que data scientist, je veux des tests unitaires ML3MustS5ChaimaeTests feature extraction, classification, edge cases (notes vides, outliers). numpy.testing, reproductibilité avec seed fixe
US-MON-1En tant que chef de projet, je veux intégrer Sentry3ShouldS6AhmedConfigurer sentry-sdk Flask/Streamlit, alertes email, DSN en variable environnement, release tracking Git
US-DOC-1En tant qu'enseignant, je veux un guide utilisateur3ShouldS6OuidadPage Aide dashboard: guide démarrage rapide, FAQ 10+ questions, captures annotées, export PDF
US-RESP-1En tant qu'enseignant mobile, je veux un dashboard responsive2ShouldS6AhmedTests mobile/tablette, corrections CSS, navigation tactile, graphiques lisibles petit écran, cross-browser
US-DEMO-1En tant que jury PFE, je veux un mode démonstration guidé5MustS7AhmedScript démo 15-20 min, parcours complet Login→Dashboard→Prédiction→Rapport, bouton Reset, mode présentation
US-SEC-1En tant que chef de projet, je veux un audit sécurité3ShouldS7TaoufiqAudit OWASP Top 10, protection CSRF/XSS, headers sécurité CSP, Flask-Talisman, rapport documenté
US-A11Y-1En tant qu'utilisateur, je veux une interface accessible WCAG2CouldS7OuidadAudit contraste couleurs 4.5:1, labels ARIA, navigation clavier, Lighthouse Accessibility > 90

10.5.4 Critères d'Acceptation Détaillés

US-AUTH-1: Connexion utilisateur

Critères d'Acceptation (Given/When/Then)
# Scénario 1: Connexion réussie
Given un utilisateur avec email "prof@edutrack.ma" et mot de passe valide
When il soumet le formulaire de connexion
Then il reçoit un token JWT valide
And il est redirigé vers le dashboard
And son dernier login est mis à jour en BDD

# Scénario 2: Connexion échouée (mauvais mot de passe)
Given un utilisateur avec email valide mais mauvais mot de passe
When il soumet le formulaire de connexion
Then il reçoit une erreur 401
And le message "Email ou mot de passe incorrect" s'affiche
And aucun token n'est généré

# Scénario 3: Compte désactivé
Given un utilisateur avec is_active = false
When il soumet le formulaire de connexion
Then il reçoit une erreur 403
And le message "Compte désactivé" s'affiche

US-GRD-1: Saisie d'une note

Critères d'Acceptation (Given/When/Then)
# Scénario 1: Saisie réussie
Given un enseignant connecté
And un élève "Ahmed Benali" de la classe "3AC-A"
And une compétence "Équations du 1er degré"
When il saisit la note 15/20 pour l'évaluation "Contrôle" du 2025-03-20
Then la note est enregistrée en BDD
And les features ML de l'élève sont recalculées
And un message de succès s'affiche
And le graphique de progression est mis à jour

# Scénario 2: Note invalide
Given un enseignant connecté
When il saisit une note de 25/20 (hors limite)
Then une erreur de validation s'affiche
And la note n'est pas enregistrée

# Scénario 3: Élève non trouvé
Given un student_id invalide
When l'enseignant tente de saisir une note
Then une erreur 404 est retournée

US-ML-2: Classification élève

Critères d'Acceptation (Given/When/Then)
# Scénario 1: Classification réussie
Given un élève avec au moins 3 notes enregistrées
When le système calcule sa classification
Then il retourne une des 3 classes: "en_difficulte", "stable", "en_progression"
And un score de confiance entre 0 et 1
And la prédiction est sauvegardée dans ai_predictions

# Scénario 2: Données insuffisantes
Given un élève avec moins de 3 notes
When le système tente de classifier
Then il retourne None
And un message "Données insuffisantes" est loggé

# Scénario 3: Précision du modèle
Given le jeu de données de test
When le modèle est évalué
Then la précision est >= 75%

US-RPT-1: Génération rapport PDF

Critères d'Acceptation (Given/When/Then)
# Scénario 1: Génération réussie
Given un enseignant connecté
And un élève avec des notes et une classification ML
When il clique sur "Générer rapport"
Then le rapport PDF est généré en moins de 10 secondes
And le rapport contient: infos élève, graphique radar, texte IA bienveillant
And le rapport est sauvegardé dans la table reports

# Scénario 2: Texte IA généré
Given les données de l'élève formatées dans le prompt
When HuggingFace génère le texte
Then le texte fait 3-4 paragraphes
And le ton est bienveillant et constructif
And des recommandations concrètes sont incluses

10.5.5 Subtasks Techniques par Story

Convention Subtasks: Chaque subtask inclut une description détaillée permettant au développeur de comprendre exactement ce qu'il doit faire.

US-SETUP-1: Architecture Système (Sprint 0) - 5 SP

SubtaskDescription DétailléeAssignéHeures
ST-0.1[Arch] Créer diagramme C4 niveau Context: système EduTrack, utilisateurs (enseignant, parent, admin), systèmes externes (WhatsApp, HuggingFace)Ahmed2h
ST-0.2[Arch] Créer diagramme C4 niveau Container: Flask API, PostgreSQL, Streamlit Frontend, ML Service, fichier PDFAhmed2h
ST-0.3[Doc] Définir conventions de code: PEP8 Python, docstrings Google style, commits conventionnels (feat/fix/docs)Ahmed1h
ST-0.4[Git] Créer repository GitHub avec .gitignore Python, README.md, structure dossiers (api/, frontend/, ml/, data/)Ahmed1h
ST-0.5[Doc] Rédiger ADR (Architecture Decision Records) pour choix techniques majeursAhmed2h

US-DATA-1: Configuration PostgreSQL (Sprint 1) - 5 SP

SubtaskDescription DétailléeAssignéHeures
ST-D1.1[BDD] Installer PostgreSQL 15, créer user edutrack_user avec password sécurisé, créer BDD edutrack_devOuidad1h
ST-D1.2[BDD] Créer schéma tables: users (id, email, password_hash, role, is_active, created_at, last_login)Ouidad2h
ST-D1.3[BDD] Créer tables: students (id, first_name, last_name, birth_date, level, class_name, parent_phone, teacher_id FK)Ouidad2h
ST-D1.4[BDD] Créer tables: subjects, competences (FK subject), grades (FK student, competence), observations (FK student)Ouidad3h
ST-D1.5[BDD] Créer tables: ai_predictions (FK student, class, confidence, created_at), reports (FK student, pdf_path, sent_at)Ouidad2h
ST-D1.6[BDD] Créer index: idx_students_level, idx_grades_student_date, idx_predictions_student. Documenter ERDOuidad2h

US-DATA-3: Fixtures Matières Marocaines (Sprint 1) - 5 SP

SubtaskDescription DétailléeAssignéHeures
ST-D3.1[Data] Créer JSON fixtures matières collège: Mathématiques, Physique-Chimie, SVT, Français, Arabe, Anglais, Histoire-Géo, Éducation IslamiqueOuidad3h
ST-D3.2[Data] Créer JSON fixtures matières lycée: ajouter Philosophie (2BAC), Économie (filière), Sciences de l'Ingénieur (SM)Ouidad2h
ST-D3.3[Data] Ajouter coefficients Bac par filière: SM (Maths=9, Physique=7), PC (Physique=7, Chimie=5), SVT (SVT=7)Ouidad2h
ST-D3.4[Script] Créer script load_fixtures.py avec validation JSON Schema, insert/update idempotentOuidad2h
ST-D3.5[Doc] Documenter sources officielles MEN utilisées, dates de validité des programmesOuidad1h

US-DATA-4: Fixtures Compétences Collège (Sprint 1) - 5 SP

SubtaskDescription DétailléeAssignéHeures
ST-D4.1[Data] Créer compétences Maths 1AC-3AC: Nombres et calculs, Géométrie, Grandeurs et mesures, Organisation de données (~30 items)Taoufiq3h
ST-D4.2[Data] Créer compétences Français 1AC-3AC: Lecture, Écriture, Grammaire, Conjugaison, Vocabulaire (~25 items)Taoufiq2h
ST-D4.3[Data] Créer compétences Sciences (PC+SVT) 1AC-3AC: Matière, Électricité, Mécanique, Vie et Terre (~25 items)Taoufiq2h
ST-D4.4[Data] Créer compétences Langues (Arabe, Anglais) 1AC-3AC: Compréhension, Expression, Grammaire (~20 items)Taoufiq2h
ST-D4.5[Script] Implémenter validation hiérarchie: matière → chapitre → compétence, contrôle unicité codesTaoufiq1h

US-AUTH-1: Connexion Utilisateur (Sprint 1) - 5 SP

SubtaskDescription DétailléeAssignéHeures
ST-A1.1[Backend] Créer endpoint POST /api/auth/login: recevoir {email, password}, valider format email regexChaimae2h
ST-A1.2[Backend] Implémenter vérification password avec bcrypt.checkpw(), gérer cas utilisateur inexistant (même message erreur)Chaimae1h
ST-A1.3[Backend] Générer JWT avec PyJWT: payload {user_id, role, exp}, clé secrète depuis .env, expiration 24hChaimae2h
ST-A1.4[Backend] Mettre à jour last_login en BDD après connexion réussie, retourner {token, user: {id, email, role}}Chaimae0.5h
ST-A1.5[Frontend] Créer page login Streamlit: formulaire email/password, bouton connexion, lien mot de passe oubliéZakaria2h
ST-A1.6[Frontend] Stocker token dans st.session_state['token'], créer fonction is_authenticated(), redirect si non connectéZakaria1h
ST-A1.7[Frontend] Implémenter redirection vers dashboard après login réussi, afficher message erreur si échecZakaria0.5h
ST-A1.8[Test] Tests unitaires pytest: test_login_success, test_login_wrong_password, test_login_user_not_foundChaimae1h
ST-A1.9[Test] Tests E2E Selenium/Playwright: scénario connexion complète, vérifier redirection et présence tokenZakaria1h

US-ML-2: Classification ML Élève (Sprint 3) - 8 SP

SubtaskDescription DétailléeAssignéHeures
ST-ML2.1[ML] Créer calculate_features(student_id): extraire moyenne_globale, ecart_type, pente_regression, nb_notes, derniere_note, nb_alertesChaimae3h
ST-ML2.2[ML] Implémenter pipeline Scikit-learn: StandardScaler → RandomForestClassifier(n_estimators=100, max_depth=10)Chaimae4h
ST-ML2.3[ML] Créer classify_student(student_id): appeler features, prédire classe (0=difficulté, 1=stable, 2=progression), retourner probaChaimae2h
ST-ML2.4[Backend] Créer endpoint GET /api/students/{id}/prediction: appeler classify_student, formater réponse JSONChaimae1h
ST-ML2.5[Backend] Sauvegarder prédiction dans ai_predictions: student_id, predicted_class, confidence, features_json, created_atChaimae1h
ST-ML2.6[Data] Préparer dataset entraînement: extraire features élèves historiques, labéliser manuellement 200 exemplesTaoufiq2h
ST-ML2.7[Test] Tests unitaires: test_calculate_features_returns_array, test_classify_returns_valid_classChaimae2h
ST-ML2.8[Test] Test précision modèle: cross_val_score >= 0.75, matrice confusion équilibréeChaimae1h

US-DASH-1: Dashboard Enseignant KPIs (Sprint 4) - 8 SP

SubtaskDescription DétailléeAssignéHeures
ST-DSH1.1[Frontend] Créer layout Streamlit: sidebar navigation, header avec nom enseignant, zone principale 3 colonnesZakaria2h
ST-DSH1.2[Frontend] Composant KPI cards avec st.metric(): Nb élèves, Moyenne classe, Nb alertes, Progression %. Delta coloréZakaria2h
ST-DSH1.3[Frontend] Intégrer heatmap Plotly: px.imshow(data), axe X élèves, axe Y compétences, colorscale RdYlGnZakaria3h
ST-DSH1.4[Frontend] Liste alertes: st.dataframe() trié par sévérité, colonnes (Élève, Type, Date, Action), bouton "Voir détail"Zakaria2h
ST-DSH1.5[Backend] Endpoint GET /api/analytics/dashboard?teacher_id=: calculer KPIs agrégés, retourner JSON structuréChaimae2h
ST-DSH1.6[Backend] Optimiser queries SQL avec GROUP BY, sous-requêtes, index. Cache Redis 5 min pour KPIsChaimae2h
ST-DSH1.7[Data] Créer données démo: 50 élèves répartis en 3 classes, 6 mois de notes, cas variésOuidad2h
ST-DSH1.8[Test] Tests rendu Streamlit: vérifier présence éléments DOM, données affichées correctesZakaria1h

US-RPT-1: Génération Rapport PDF (Sprint 5) - 8 SP

SubtaskDescription DétailléeAssignéHeures
ST-RPT1.1[Backend] Créer service generate_report(student_id): collecter données élève (infos, notes, compétences, prédiction ML)Chaimae2h
ST-RPT1.2[ML] Appeler HuggingFace API (text-generation): prompt avec données élève, demander texte bienveillant 3-4 paragraphesChaimae3h
ST-RPT1.3[Backend] Générer PDF avec ReportLab: en-tête école, section infos élève, graphique radar (matplotlib→bytes), texte IAChaimae4h
ST-RPT1.4[Backend] Sauvegarder PDF: stockage fichier (S3 ou local), enregistrer path dans table reports avec student_id, created_atChaimae1h
ST-RPT1.5[Data] Créer template Jinja2 HTML pour PDF: styles CSS inline, placeholders pour données dynamiquesOuidad2h
ST-RPT1.6[Frontend] Bouton "Générer rapport" sur fiche élève, spinner pendant génération, afficher aperçu PDFZakaria2h
ST-RPT1.7[Test] Tests génération: mock HuggingFace, vérifier structure PDF, temps < 10sTaoufiq2h

10.5.6 Mapping des Dépendances

Dépendances entre User Stories
# Sprint 1 - Fondations (pas de dépendances)
US-DATA-1 (BDD) ──────────────────────────────────────┐
US-DATA-2 (Migrations) ───────────────────────────────┤
US-DATA-3 (Fixtures matières) ────────────────────────┼──→ Sprint 2 peut commencer
US-DATA-4 (Fixtures compétences collège) ─────────────┤
US-DATA-5 (Fixtures compétences lycée) ───────────────┘

# Sprint 1 → Sprint 2
US-AUTH-1 (Login) ────────────────────────────────────┐
US-AUTH-2 (Logout) ───────────────────────────────────┼──→ US-STU-* (CRUD élèves)
US-AUTH-3 (Créer comptes) ────────────────────────────┘    US-GRD-* (CRUD notes)

# Sprint 2 → Sprint 3
US-STU-1 (Créer élève) ───────────────────────────────┐
US-GRD-1 (Saisir note) ───────────────────────────────┼──→ US-ML-1 (Features ML)
US-CMP-1 (Créer compétence) ──────────────────────────┘    US-ML-2 (Classification)

# Sprint 3 → Sprint 4
US-ML-1 (Features ML) ────────────────────────────────┐
US-ML-2 (Classification) ─────────────────────────────┼──→ US-DASH-* (Dashboard)
US-ML-3 (Voir prédiction) ────────────────────────────┘    US-DASH-5 (Alertes)

# Sprint 4 → Sprint 5
US-DASH-1 (Dashboard) ────────────────────────────────┐
US-DASH-3 (Radar) ────────────────────────────────────┼──→ US-RPT-1 (Rapport PDF)
US-ML-2 (Classification) ─────────────────────────────┘    US-RPT-2 (WhatsApp)

# Stories Indépendantes (peuvent être faites en parallèle)
US-STU-5 (Import CSV) ← indépendant après US-DATA-*
US-OBS-1 (Observations) ← indépendant après US-STU-1
US-AUTH-5 (Reset password) ← indépendant après US-AUTH-1

10.5.7 Répartition par Membre et Sprint

Équité garantie: Chaque sprint implique les 5 membres avec des tâches adaptées à leurs compétences. Workload équilibré (~12 stories par membre).
SprintDatesAhmed
Chef/Full-stack
Chaimae
IA+Backend
Zakaria
IA+Frontend
Ouidad
Data Engineer
Taoufiq
Data Engineer
S025-31/03Architecture (5)Setup ML (3)Maquettes UI (5)Setup PostgreSQL (3)Setup Dev Env (3)
S101-07/04CI/CD Pipeline (3)Auth Backend (12)Auth UI Forms (5)BDD+Fixtures (10)Migrations+Fixtures (10)
S208-14/04Recherche/Filtres (6)CRUD Backend (10)CRUD UI Forms (5)Import CSV+Archivage (7)Data test+Edit (8)
S315-21/04API ML Intégration (5)ML Pipeline (16)Prédiction UI (5)Observations+Valid (6)Dataset Prep+Cat (5)
S422-28/04Optimisation (3)Retrain+Endpoints (10)Dashboard UI (28)Seeds Dashboard (3)Endpoints+Doc (8)
S529/04-05/05WhatsApp+Alertes (13)Rapports+ML (11)Parent UI (11)Templates (3)Tests E2E (3)
S606-12/05Filtres+Historique (8)Tests Backend (5)Tests UI (5)Seed Démo (3)Doc Finale (3)
TOTAL~43 SP (11)~67 SP (12)~64 SP (13)~35 SP (12)~40 SP (13)

Vélocité moyenne: ~37 SP/sprint · Total: 61 stories · 7 Sprints (25/03/2026 - 12/05/2026)

Légende des responsabilités par sprint

SprintObjectif PrincipalLivrables ClésCritères de Validation
S0Préparation et planificationArchitecture validée, environnements configurés, maquettes approuvéesTous les outils installés, repository créé, équipe alignée
S1Fondations techniquesAuth fonctionnelle, BDD créée, fixtures chargéesLogin/logout OK, 100% tests Auth, données Maroc en BDD
S2CRUD académique completGestion élèves/notes/compétencesCRUD complet testé, import CSV OK, UI responsive
S3Intelligence ArtificielleModèle ML entraîné, prédictions fonctionnellesPrécision ≥75%, prédictions affichées, pipeline documenté
S4Visualisations et DashboardDashboard enseignant completKPIs temps réel, graphiques interactifs, alertes visibles
S5Rapports et NotificationsGénération PDF, envoi WhatsAppPDF généré <10s, WhatsApp envoyé, texte IA bienveillant
S6FinalisationTests complets, documentationCouverture tests ≥80%, doc complète, démo prête
S7Intégration et StabilisationVersion finale stable0 bugs critiques, déploiement OK, présentation validée
11
Équipe et Responsabilités

11.1 Composition de l'Équipe

MembreRôleResponsabilités Principales
AhmedChef de Projet / Frontend + BackendCoordination équipe, architecture système, développement full-stack, rapport final
ChaimaeIA + BackendModèles ML Scikit-learn, Flask API, Transformers HuggingFace, intégration
ZakariaIA + FrontendInterface Next.js/Gradio, visualisations ML (Recharts), composants dashboard, UX
OuidadData EngineerBDD PostgreSQL, collecte données éducatives Maroc, fixtures JSON, seed
TaoufiqData EngineerPipelines ETL, migrations Alembic, génération données test, documentation

11.2 Matrice RACI

TâcheAhmedChaimaeZakariaOuidadTaoufiq
ArchitectureRACII
BDD PostgreSQLACIRR
API FlaskCRIII
ML ClassificationARCII
Génération RapportsARCII
Dashboard Next.jsCCRII
Visualisations MLCCRII
Collecte Données MarocIIIRR
Tests E2EARCCC
DocumentationRCCCC
PrésentationRAAAA

R = Responsable  ·  A = Accountable  ·  C = Consulté  ·  I = Informé

12
Livrables
#LivrableFormatDate Limite
L1Dépôt GitHub documentéRepository public15/05/2026
L2README.md completMarkdown08/05/2026
L3Documentation APIMarkdown / Swagger08/05/2026
L4Prototype fonctionnelApplication déployable15/05/2026
L5Rapport technique (10–15 pages)PDF15/05/2026
L6Slides présentation 10 minPowerPoint / PDF15/05/2026
L7Script de démo juryMarkdown15/05/2026
13
Critères d'Acceptation

13.1 Critères Fonctionnels

ModuleCritèreValidation
Module 1CRUD élèves fonctionnel100% tests passent
Module 1CRUD notes fonctionnel100% tests passent
Module 1CRUD observations fonctionnel100% tests passent
Module 2Classification précision > 75%Métriques affichées
Module 2Graphiques Radar + Courbe + HeatmapRendus dans Next.js
Module 3Rapport généré en < 10sTemps mesuré
Module 3WhatsApp envoyé avec succèsLog de confirmation

13.2 Critères Non-Fonctionnels

CritèreCibleOutil de Mesure
Couverture tests> 80%pytest-cov
Temps réponse API< 500msLocust / k6
DocumentationComplèteRevue équipe

13.3 Scénarios de Tests E2E

#ScénarioÉtapesRésultat attendu
1 Login enseignant 1. Accéder /login
2. Entrer credentials
3. Soumettre
Dashboard affiché, token JWT stocké
2 Ajouter un élève 1. Clic "Nouvel élève"
2. Remplir formulaire
3. Valider
Élève créé en BDD, affiché dans liste
3 Saisir une note 1. Sélectionner élève
2. Remplir formulaire
3. Valider
Note en BDD, ML mis à jour, graphe actualisé
4 Générer rapport IA 1. Sélectionner élève
2. Clic "Générer rapport"
3. Attendre
PDF disponible en < 10s, texte IA pertinent
5 Envoyer WhatsApp 1. Ouvrir rapport
2. Clic "Envoyer WhatsApp"
Message reçu par parent, log confirmé
6 Consulter alertes 1. Accéder dashboard
2. Voir section alertes
Alertes triées par sévérité, données correctes
7 Vue parent 1. Connexion parent
2. Voir progression
Données enfant uniquement, graphes lisibles
8 Export RGPD 1. Ouvrir fiche élève
2. Clic "Export données"
JSON + PDF complet généré

13.4 Critères de Performance

MétriqueCibleCritiqueOutil
Temps réponse API (p95)< 500ms< 2sLocust / k6
Temps requête BDD< 100ms< 500mspg_stat_statements
Génération rapport< 10s< 30sLogs application
Classification ML< 200ms< 1sProfiler Python
Couverture tests> 80%> 60%pytest-cov
Disponibilité99.5%99%Monitoring
Utilisateurs simultanés5020Load testing

13.5 Structure des Tests

Structure tests/
tests/
├── unit/
│   ├── test_models.py          # Tests modèles SQLAlchemy
│   ├── test_schemas.py         # Tests validation Marshmallow
│   ├── test_ml_features.py     # Tests calcul features ML
│   └── test_classification.py  # Tests pipeline ML
├── integration/
│   ├── test_api_students.py    # Tests CRUD élèves
│   ├── test_api_grades.py      # Tests CRUD notes
│   ├── test_api_analytics.py   # Tests endpoints analytics
│   ├── test_api_reports.py     # Tests génération rapports
│   └── test_whatsapp.py        # Tests intégration Twilio
├── e2e/
│   ├── test_teacher_flow.py    # Parcours enseignant complet
│   ├── test_parent_flow.py     # Parcours parent
│   └── test_report_flow.py     # Génération + envoi rapport
├── fixtures/
│   ├── students.json           # Données test élèves
│   ├── grades.json             # Données test notes
│   └── competencies.json       # Données test compétences
├── conftest.py                 # Fixtures pytest partagées
└── pytest.ini                  # Configuration pytest
Exemple test unitaire - test_ml_features.py
import pytest
from app.services.ml_features import calculate_features

class TestMLFeatures:
    def test_calculate_features_minimum_grades(self, student_with_grades):
        """Test: minimum 3 notes requises pour calcul"""
        student_id = student_with_grades[0].id

        features = calculate_features(student_id)

        assert features is not None
        assert 'avg_grade' in features
        assert 'trend_coefficient' in features

    def test_calculate_features_insufficient_data(self, student_one_grade):
        """Test: retourne None si moins de 3 notes"""
        student_id = student_one_grade.id

        features = calculate_features(student_id)

        assert features is None

    def test_trend_coefficient_positive(self, improving_student):
        """Test: coefficient positif pour élève en progression"""
        features = calculate_features(improving_student.id)

        assert features['trend_coefficient'] > 0

    def test_avg_grade_accuracy(self, student_with_known_grades):
        """Test: moyenne calculée correctement"""
        # Élève avec notes: 10, 12, 14 → moyenne = 12
        features = calculate_features(student_with_known_grades.id)

        assert features['avg_grade'] == pytest.approx(12.0, rel=0.01)
14
Risques et Mitigation
R1
API WhatsApp non disponible ou non validée
La validation du compte WhatsApp Business peut prendre du temps. Probabilité: Moyenne Impact: Haut
Simuler avec logs console + mode démo Twilio sandbox
R2
Modèle IA pas assez précis
Données d'entraînement insuffisantes ou features inadaptées. Probabilité: Moyenne Impact: Moyen
Ajuster features, fallback sur règles métier (seuils fixes)
R3
Retard sur un sprint
Complexité sous-estimée ou problème technique bloquant. Probabilité: Haute Impact: Moyen
Buffer Sprint 7, repriorisation du backlog chaque vendredi
R4
Problème configuration AWS RDS
Accès réseau, groupe de sécurité mal configuré. Probabilité: Faible Impact: Haut
SQLite local en backup, migration vers RDS en Sprint 1
R5
Membre de l'équipe absent
Maladie ou contrainte personnelle réduisant la vélocité. Probabilité: Moyenne Impact: Moyen
Documentation cross-training, pair programming systématique
15
Annexes

A. Glossaire

TermeDéfinition
CompétenceSavoir-faire évalué (ex: "Résoudre une équation du 1er degré")
ÉvaluationSession notée (contrôle, test blanc, exercice)
ProgressionÉvolution des notes dans le temps
ClassificationAttribution d'un niveau (Maîtrisée / En cours / À renforcer)
RapportDocument texte résumant la progression pour les parents
ObservationRemarque qualitative de l'enseignant sur une séance

B. Références Techniques

C. Charte Graphique EduTrack IA

🎨 Couleurs
Navy Deep#0D1B2A
Teal Primary#00C9A7
Sky Blue#0EA5E9
Amber#FFB347
✍️ Typographie
TitresSyne 700/800
CorpsDM Sans 400/500
CodeJetBrains Mono
Thème Next.jsTailwind CSS config
📁
Fichiers de charte à créer en Sprint 1 /docs/brand-guide.md · /assets/logo.svg · /assets/logo.png · /.streamlit/config.toml

D. Liens du Projet

RessourceURL / AccèsDescription
GitHubgithub.com/ahmeddamouad/edutrack-iaCode source (main + develop)
Jiradamragnarockdam.atlassian.net/projects/EIBacklog Scrum, sprints, stories
Azure VMssh damragnarockdam@20.199.136.39Serveur de test Docker
PR #1Pull Request #1Structure projet + CLAUDE.md
Dernière mise à jour: 05 Avril 2026 — Sprint 0 terminé (4/4 stories, 11 SP)