# πŸ“Š Γ‰TAPE 3 AJUSTΓ‰E : TABLEAU NOTES + GRAPHIQUES PAR CLASSE ## 🎯 **AJUSTEMENTS SELON SPECS NICOLAS** ### Graphiques - βœ… **Histogramme distribution notes PAR CLASSE** (multi-barres) - βœ… **Courbe progression PAR Γ‰LÈVE** (line chart multiple students) - ❌ **Pas de pie chart** (supprimΓ©) ### Tentatives - **Normale** : 1 seule tentative par Γ©lΓ¨ve - **Exception** : Si pb connexion, plusieurs tentatives possibles - **Affichage** : DerniΓ¨re tentative de chaque Γ©lΓ¨ve ### Export - **RΓ©utiliser** : `export.php` existant (CSV/JSON) βœ… - **Lien** : Bouton vers `export.php?id_evaluation=X&format=csv` - **Pas de modifications** : Minimiser changements code fonctionnel ### Pagination - **Aucune** : Affichage complet sans pagination - **Raisons** : - Classes fixes : Max 30 Γ©lΓ¨ves - Groupe soutien : Max 60-70 Γ©lΓ¨ves - Performance suffisante pour 100 lignes --- ## πŸ“‹ **SPΓ‰CIFICATIONS FONCTIONNELLES AJUSTΓ‰ES** ### Vue Tableau **Colonnes** : 1. Rang (calculΓ© selon note) 2. Nom PrΓ©nom 3. Classe 4. Note (/20) 5. Pourcentage (%) 6. Temps passΓ© (HH:MM:SS) 7. Statut (TerminΓ© / En cours) 8. Date soumission **FonctionnalitΓ©s** : - Tri par colonne (clic header) - Filtrage par classe (dropdown) - Filtrage par statut (terminΓ©/en cours) - Recherche Γ©lΓ¨ve (nom, prΓ©nom) - **Export CSV** : Lien vers export.php existant - **Pas de pagination** : Affichage complet ### Statistiques GΓ©nΓ©rales **Bloc 1 : SynthΓ¨se** - Nombre d'Γ©lΓ¨ves total - Nombre terminΓ© / en cours - Taux participation (%) - Temps moyen passΓ© **Bloc 2 : Notes** - Moyenne gΓ©nΓ©rale - MΓ©diane - Note min / max - Γ‰cart-type - Taux rΓ©ussite (β‰₯10/20) en % **Bloc 3 : Par Classe** - Nombre Γ©lΓ¨ves par classe - Moyenne par classe - Meilleure classe (moyenne max) **Bloc 4 : Questions** - Question la plus rΓ©ussie (% bonnes rΓ©ponses) - Question la plus Γ©chouΓ©e (% mauvaises rΓ©ponses) ### Graphiques Chart.js **Graphique 1 : Histogramme Distribution Notes par Classe** - Type : Bar chart (multi-datasets) - X : Tranches notes (0-5, 5-10, 10-15, 15-20) - Y : Nombre Γ©lΓ¨ves - Datasets : 1 barre par classe (couleurs diffΓ©rentes) - LΓ©gende : Classes affichΓ©es - Couleurs : Palette distincte par classe **Graphique 2 : Courbe Progression par Γ‰lΓ¨ve** - Type : Line chart (multiple lines) - X : NumΓ©ro question (Q1, Q2, Q3, ...) - Y : Points cumulΓ©s (0 Γ  note_totale) - Lines : Top 5 Γ©lΓ¨ves + moyenne classe - LΓ©gende : Noms Γ©lΓ¨ves - Couleurs : Palette distincte par Γ©lΓ¨ve - Tooltip : DΓ©tail question + points --- ## πŸ—‚οΈ **STRUCTURE FICHIERS** ### Fichier principal **`resultats_evaluation.php`** (~30 KB estimΓ©) - Localisation : `/var/www/mathematiques/enseignant/` - RΓ΄le : Interface HTML + CSS + JavaScript inline - Chart.js : CDN `https://cdn.jsdelivr.net/npm/chart.js@4.4.0` - ParamΓ¨tre : `?id_evaluation=X` - **RΓ©utilise** : Lien export.php existant ### API Backend **`resultats_ajax.php`** (~20 KB estimΓ©) - Localisation : `/var/www/mathematiques/enseignant/` - RΓ΄le : Retourne JSON avec notes + stats + graphiques data - Authentification : `$_SESSION['user_id']` + `type_libelle === 'enseignant'` - RequΓͺtes SQL optimisΓ©es --- ## πŸ”§ **ARCHITECTURE TECHNIQUE** ### Colonnes tentatives_eleves (vΓ©rifiΓ©es) ``` id_tentative (INT) id_eleve (INT) id_evaluation (INT) statut (VARCHAR) : 'en_cours', 'terminee' reponses_json (TEXT) note (DECIMAL) : Note obtenue note_sur (DECIMAL) : Note maximale (20) pourcentage (DECIMAL) : Pourcentage rΓ©ussite temps_passe (INT) : Secondes Γ©coulΓ©es date_debut (TIMESTAMP) date_fin (TIMESTAMP) derniere_sauvegarde (TIMESTAMP) ``` ### RequΓͺte SQL Principale (DerniΓ¨re tentative par Γ©lΓ¨ve) ```sql SELECT te.id_tentative, te.id_eleve, te.note, te.note_sur, te.pourcentage, te.temps_passe, te.statut, te.date_fin, te.reponses_json, u.nom, u.prenom, u.login, c.nom_classe, c.id_classe, -- Calcul rang global (SELECT COUNT(*) + 1 FROM tentatives_eleves te2 WHERE te2.id_evaluation = te.id_evaluation AND te2.note > te.note AND te2.id_tentative IN ( -- Sous-requΓͺte: derniΓ¨re tentative de chaque Γ©lΓ¨ve SELECT MAX(id_tentative) FROM tentatives_eleves WHERE id_evaluation = te.id_evaluation GROUP BY id_eleve ) ) as rang FROM ( -- Sous-requΓͺte: derniΓ¨re tentative par Γ©lΓ¨ve SELECT id_eleve, MAX(id_tentative) as max_id FROM tentatives_eleves WHERE id_evaluation = ? GROUP BY id_eleve ) dernieres JOIN tentatives_eleves te ON te.id_tentative = dernieres.max_id JOIN utilisateurs u ON te.id_eleve = u.id_utilisateur LEFT JOIN classes c ON u.id_classe = c.id_classe ORDER BY te.note DESC, te.date_fin ASC ``` ### Calculs Statistiques (PHP) ```php // Notes array (derniΓ¨res tentatives uniquement) $notes = array_column($tentatives, 'note'); // Moyenne $moyenne = array_sum($notes) / count($notes); // MΓ©diane sort($notes); $count = count($notes); $mediane = ($count % 2 === 0) ? ($notes[$count/2 - 1] + $notes[$count/2]) / 2 : $notes[floor($count/2)]; // Γ‰cart-type $variance = 0; foreach ($notes as $note) { $variance += pow($note - $moyenne, 2); } $ecart_type = sqrt($variance / count($notes)); // Taux rΓ©ussite $reussites = count(array_filter($notes, fn($n) => $n >= 10)); $taux_reussite = ($reussites / count($notes)) * 100; // Stats par classe $par_classe = []; foreach ($tentatives as $t) { $classe = $t['nom_classe'] ?? 'Sans classe'; if (!isset($par_classe[$classe])) { $par_classe[$classe] = ['notes' => [], 'count' => 0]; } $par_classe[$classe]['notes'][] = $t['note']; $par_classe[$classe]['count']++; } foreach ($par_classe as $classe => &$data) { $data['moyenne'] = array_sum($data['notes']) / count($data['notes']); } ``` ### DonnΓ©es Graphiques **Histogramme par Classe** : ```json { "labels": ["0-5", "5-10", "10-15", "15-20"], "datasets": [ { "label": "TCV", "data": [1, 3, 8, 12], "backgroundColor": "rgba(59, 130, 246, 0.6)" }, { "label": "1A", "data": [0, 2, 5, 8], "backgroundColor": "rgba(34, 197, 94, 0.6)" } ] } ``` **Courbe Progression** : ```json { "labels": ["Q1", "Q2", "Q3", "Q4", "Q5"], "datasets": [ { "label": "DUPONT Jean (19/20)", "data": [4, 8, 12, 16, 19], "borderColor": "rgb(59, 130, 246)", "tension": 0.3 }, { "label": "MARTIN Sophie (18/20)", "data": [3, 7, 11, 14, 18], "borderColor": "rgb(34, 197, 94)", "tension": 0.3 }, { "label": "Moyenne classe", "data": [2.5, 5.2, 8.1, 11.3, 14.5], "borderColor": "rgb(249, 115, 22)", "borderDash": [5, 5], "tension": 0.3 } ] } ``` --- ## 🎨 **DESIGN INTERFACE** ### Layout 3 Zones ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ πŸ“Š RΓ©sultats Γ‰valuation : [Titre Γ‰valuation] β”‚ β”‚ [Retour Dashboard] [Export CSV] β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ πŸ“ˆ STATISTIQUES GΓ‰NΓ‰RALES β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ 42 β”‚ 38 β”‚ 15.2 β”‚ 8.5 β”‚ 19.0 β”‚ β”‚ β”‚ β”‚ Γ‰lΓ¨ves β”‚ TerminΓ©β”‚ Moyenneβ”‚ Min β”‚ Max β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ 14.8 β”‚ 3.2 β”‚ 90% β”‚ TCV β”‚ 01:23 β”‚ β”‚ β”‚ β”‚ MΓ©dianeβ”‚ Γ‰cart-Οƒβ”‚ RΓ©ussiteβ”‚Meilleureβ”‚ Temps β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ πŸ“Š GRAPHIQUES ANALYTIQUES β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Histogramme Distribution Notes par Classe β”‚ β”‚ β”‚ β”‚ [Chart.js Bar - Multi-datasets] β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Courbe Progression par Γ‰lΓ¨ve (Top 5 + Moyenne) β”‚ β”‚ β”‚ β”‚ [Chart.js Line - Multiple lines] β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ πŸ“‹ TABLEAU DΓ‰TAILLΓ‰ β”‚ β”‚ [Filtre Classe β–Ό] [Filtre Statut β–Ό] [Recherche πŸ”] β”‚ β”‚ β”Œβ”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚ β”‚ β”‚ Rg β”‚ Γ‰lΓ¨ve β”‚ Classe β”‚ Note β”‚ % β”‚ Temps β”‚β”‚ β”‚ β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”‚ β”‚ β”‚ 1 β”‚ DUPONT β”‚ TCV β”‚19/20 β”‚ 95% β”‚ 01:23:45 β”‚β”‚ β”‚ β”‚ 2 β”‚ MARTIN β”‚ TCV β”‚18/20 β”‚ 90% β”‚ 01:05:12 β”‚β”‚ β”‚ β”‚ 3 β”‚ BERNARD β”‚ 1A β”‚17/20 β”‚ 85% β”‚ 00:58:30 β”‚β”‚ β”‚ β”‚ .. β”‚ ... β”‚ ... β”‚ ... β”‚ ... β”‚ ... β”‚β”‚ β”‚ β””β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚ β”‚ Total : 42 Γ©lΓ¨ves affichΓ©s β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## βœ… **CHECKLIST DΓ‰VELOPPEMENT** ### Γ‰tape 1 : VΓ©rification Structure BDD βœ… - [x] Colonnes tentatives_eleves vΓ©rifiΓ©es - [x] Format temps_passe : INT secondes - [x] RequΓͺte derniΓ¨re tentative par Γ©lΓ¨ve - [x] Jointures users/classes ### Γ‰tape 2 : Backend API - [ ] CrΓ©er `resultats_ajax.php` - [ ] Authentification `$_SESSION` (pattern export.php) - [ ] RequΓͺte SQL derniΓ¨res tentatives + rang - [ ] Calculs statistiques (moyenne, mΓ©diane, Γ©cart-type) - [ ] Stats par classe - [ ] Analyse questions (% rΓ©ussite par question) - [ ] Progression par Γ©lΓ¨ve (points cumulΓ©s) - [ ] Formatage donnΓ©es graphiques - [ ] Test retour JSON valide ### Γ‰tape 3 : Frontend Interface - [ ] CrΓ©er `resultats_evaluation.php` - [ ] Header + navigation - [ ] Section statistiques (8 cards) - [ ] Graphique histogramme par classe - [ ] Graphique courbe progression Γ©lΓ¨ves - [ ] Tableau notes complet - [ ] Filtres classe/statut (JavaScript) - [ ] Recherche Γ©lΓ¨ve (JavaScript) - [ ] Tri colonnes (JavaScript) - [ ] Bouton export CSV (lien export.php) - [ ] Responsive design ### Γ‰tape 4 : Tests - [ ] Tester avec Γ©valuation 23 (test.tcv) - [ ] VΓ©rifier stats cohΓ©rentes - [ ] VΓ©rifier graphiques par classe - [ ] VΓ©rifier courbe progression - [ ] Tester filtres/recherche/tri - [ ] Tester export CSV - [ ] Performance <2s chargement 70 Γ©lΓ¨ves --- ## πŸ“Š **ESTIMATION DURΓ‰E AJUSTΓ‰E** | TΓ’che | DurΓ©e | DΓ©tails | |-------|-------|---------| | VΓ©rification BDD | βœ… 15 min | **ComplΓ©tΓ©** | | Backend API | 60 min | SQL complexe + stats + progression | | Frontend HTML/CSS | 45 min | Layout + stats + graphiques | | Frontend JavaScript | 45 min | Filtres + tri + recherche + charts | | Tests validation | 20 min | DonnΓ©es rΓ©elles multi-classes | | **TOTAL** | **3h05** | Estimation rΓ©aliste | --- ## πŸš€ **PROCHAINE ACTION** **DΓ©marrer Backend API** : CrΓ©er `resultats_ajax.php` 1. RequΓͺte SQL derniΓ¨res tentatives 2. Calculs statistiques 3. DonnΓ©es graphiques 4. Test JSON **Puis Frontend** : Interface complΓ¨te avec Chart.js --- **PrΓͺt Γ  dΓ©velopper ?** πŸš€