# 📚 Notytex - SystĂšme de Gestion Scolaire **Notytex** est une application web Flask moderne conçue pour la gestion complĂšte des Ă©valuations scolaires. Elle permet aux enseignants de crĂ©er, organiser et noter les Ă©valuations de leurs Ă©lĂšves avec une interface intuitive et des fonctionnalitĂ©s avancĂ©es. ## 🎯 **Objectif Principal** Simplifier et digitaliser le processus d'Ă©valuation scolaire, de la crĂ©ation des contrĂŽles Ă  la saisie des notes, en offrant une structure hiĂ©rarchique flexible et deux modes de notation. ## đŸ—ïž **Architecture Technique ** **Framework :** Flask (Python) avec architecture modulaire dĂ©couplĂ©e **Base de donnĂ©es :** SQLite avec SQLAlchemy ORM + Repository Pattern **Frontend :** Templates Jinja2 + TailwindCSS + JavaScript + Chart.js **Tests :** Pytest avec couverture complĂšte (100 tests ✅) **Configuration :** Variables d'environnement externalisĂ©es (.env) **Logging :** StructurĂ© JSON avec corrĂ©lation des requĂȘtes **SĂ©curitĂ© :** Configuration sĂ©curisĂ©e + gestion d'erreurs centralisĂ©e ## 📊 **ModĂšle de DonnĂ©es HiĂ©rarchique** ``` ClassGroup (6Ăšme A, 5Ăšme B...) ↓ Students (ÉlĂšves de la classe) ↓ Assessment (ContrĂŽle de mathĂ©matiques, Trimestre 1...) ↓ Exercise (Exercice 1, Exercice 2...) ↓ GradingElement (Question a, b, c...) ↓ Grade (Note attribuĂ©e Ă  chaque Ă©lĂšve) ``` ## ⭐ **FonctionnalitĂ©s ClĂ©s** ### **Gestion des Évaluations** - CrĂ©ation d'Ă©valuations complĂštes avec exercices multiples - **Organisation par trimestre** : Chaque Ă©valuation doit ĂȘtre assignĂ©e Ă  un trimestre (1, 2 ou 3) - Structure hiĂ©rarchique : Assessment → Exercise → GradingElement - Interface unifiĂ©e pour crĂ©er Ă©valuation + exercices + barĂšme en une fois - Modification et suppression avec gestion des cascades ### **SystĂšme de Notation UnifiĂ© ** **2 Types de Notation Fixes :** 1. **`notes`** : Valeurs numĂ©riques dĂ©cimales (ex: 2.5/4, 18/20, 15.5/20) 2. **`score`** : Échelle fixe de 0 Ă  3 pour l'Ă©valuation par compĂ©tences **Valeurs SpĂ©ciales Configurables :** - **`.`** = Pas de rĂ©ponse (traitĂ© comme 0 dans les calculs) - **`d`** = DispensĂ© (ne compte pas dans la note finale) - **Autres valeurs** : EntiĂšrement configurables via l'interface d'administration **Configuration CentralisĂ©e :** - **Signification des scores** : 0=Non acquis, 1=En cours, 2=Acquis, 3=Expert (modifiable) - **Couleurs associĂ©es** : Chaque niveau peut avoir sa couleur personnalisĂ©e - **RĂšgles de calcul** : Logique unifiĂ©e pour tous les types de notation - **Interface d'administration** : Gestion complĂšte des paramĂštres de notation ### **Filtrage AvancĂ© des Évaluations** **Filtres Dynamiques Disponibles :** - **Trimestre** : Filtrage par trimestre (1, 2, 3) pour organiser par pĂ©riode scolaire - **Classe** : Filtrage par groupe de classe pour se concentrer sur une classe spĂ©cifique - **Statut de Correction** : **NOUVEAU** - Filtre essentiel pour la gestion des corrections : - **Non terminĂ©es** : Évaluations partiellement corrigĂ©es ou non commencĂ©es (idĂ©al pour mode midyear) - **TerminĂ©es** : Évaluations 100% corrigĂ©es - **Non commencĂ©es** : Évaluations sans aucune note saisie - **Tri** : Organisation par date (rĂ©cent/ancien), titre alphabĂ©tique, ou classe **JavaScript Dynamique :** - **Filtrage temps rĂ©el** : Les filtres s'appliquent automatiquement au changement - **Persistence des filtres** : État maintenu dans l'URL pour navigation intuitive - **Interface responsive** : AdaptĂ©e aux appareils mobiles et desktop ### **Interface Utilisateur & UX Moderne ** - **Dashboard avec statistiques en temps rĂ©el** : Cartes cliquables avec animations et gradients - **Pages hero modernisĂ©es** : Sections d'accueil avec gradients colorĂ©s et informations contextuelles - **Navigation intuitive** : Actions principales mises en avant avec boutons colorĂ©s et icĂŽnes - **Templates responsive** avec TailwindCSS et animations fluides - **Page de prĂ©sentation d'Ă©valuation repensĂ©e** : - Hero section avec gradient et informations clĂ©s - Actions principales (Noter, RĂ©sultats, Modifier, Supprimer) en cards colorĂ©es - Indicateur de progression central avec visualisation circulaire animĂ©e - Structure d'Ă©valuation en cards compactes avec compĂ©tences visibles - **Suppression des pages intermĂ©diaires** : Plus de pages de dĂ©tail d'exercices, navigation directe - **Indicateurs de progression de correction** : Visualisation immĂ©diate avec cercles de progression et actions intĂ©grĂ©es - **Interface cohĂ©rente** : Design system unifiĂ© avec espacements, couleurs et animations harmonieux ### **Gestion des ÉlĂšves et Import CSV ** **Gestion Individuelle des ÉlĂšves :** - **Inscription manuelle** : CrĂ©ation d'Ă©lĂšves un par un avec prĂ©nom, nom, email optionnel - **SystĂšme d'inscription temporel** : Historique complet avec dates d'arrivĂ©e/dĂ©part - **Gestion des mouvements** : Transferts entre classes, dĂ©parts, rĂ©intĂ©grations - **Interface moderne** : Modal avec onglets (nouvel Ă©lĂšve / Ă©lĂšve existant) **Import en Lot depuis CSV :** - **Format CSV supportĂ©** : SĂ©parateur `;`, premiĂšre colonne "NOM PrĂ©noms" - **Extraction intelligente** : Reconnaissance automatique nom/prĂ©nom ("DUPONT Marie Claire" → nom: "DUPONT", prĂ©nom: "Marie Claire") - **Gestion des doublons** : Option pour ignorer ou Ă©chouer en cas d'Ă©lĂšve existant - **Rapport dĂ©taillĂ©** : Statistiques complĂštes (importĂ©s, ignorĂ©s, erreurs) avec dĂ©tail ligne par ligne - **Validation robuste** : ContrĂŽle format CSV, taille fichier, types de donnĂ©es - **Interface intuitive** : Modal avec drag & drop, instructions du format attendu **Points d'AccĂšs Multiples :** - **Dashboard de classe** : Carte d'action violette "Import CSV" - **Page gestion Ă©lĂšves** : Bouton "Import CSV" dans la barre d'actions - **Navigation cohĂ©rente** : AccĂšs contextuel selon le workflow utilisateur ### **Analyse des RĂ©sultats AvancĂ©e** - **Page de rĂ©sultats complĂšte** : Vue d'ensemble des performances de l'Ă©valuation - **Statistiques descriptives** : Moyenne, mĂ©diane, minimum, maximum, Ă©cart-type - **Visualisation graphique** : Histogramme de distribution des notes (groupes de 1 point, de 0 au maximum) - **Tableau dĂ©taillĂ©** : Classement alphabĂ©tique avec scores par exercice au format "score/total" - **Calcul intelligent des scores** : Gestion des types "points" et "compĂ©tences" avec formules spĂ©cialisĂ©es - **Traitement des absences** : Score "." = 0 point mais compte dans le total possible ## 🔧 **Structure du Code ** ``` app.py # Application Flask principale + routes de base models.py # ModĂšles SQLAlchemy (5 entitĂ©s principales + calcul progression) app_config_classes.py # Classes de configuration Flask (dev/prod/test) 🔧 config/ # Configuration externalisĂ©e sĂ©curisĂ©e ├── __init__.py └── settings.py # Gestion variables d'environnement + validation đŸ›Ąïž exceptions/ # Gestion d'erreurs centralisĂ©e ├── __init__.py └── handlers.py # Gestionnaires d'erreurs globaux (JSON/HTML) 🔍 core/ # Utilitaires centraux ├── __init__.py └── logging.py # Logging structurĂ© JSON + corrĂ©lation requĂȘtes 📩 repositories/ # Pattern Repository pour accĂšs donnĂ©es ├── __init__.py ├── base_repository.py # Repository gĂ©nĂ©rique CRUD └── assessment_repository.py # Repository spĂ©cialisĂ© Assessment 📁 routes/ # Blueprints organisĂ©s par fonctionnalitĂ© ├── assessments.py # CRUD Ă©valuations (crĂ©ation unifiĂ©e) ├── exercises.py # Gestion des exercices ├── grading.py # Saisie et gestion des notes ├── classes.py # Gestion classes + import CSV Ă©lĂšves └── config.py # Interface configuration systĂšme forms.py # Formulaires WTForms pour validation (+ CSVImportForm) 📋 services/ # Services mĂ©tier modulaires ├── csv_import_service.py # Service d'import CSV Ă©lĂšves └── assessment_services.py # Logique mĂ©tier Ă©valuations utils.py # Utilitaires existants commands.py # Commandes CLI Flask (init-db) templates/ # Templates Jinja2 avec indicateurs UX intĂ©grĂ©s 📋 domain/ # Exceptions mĂ©tier personnalisĂ©es đŸ§Ș tests/ # Tests pytest (100 tests ✅) ``` ## 🚀 **Installation & Lancement ** ```bash # Installation avec uv (gestionnaire moderne) uv sync # Configuration obligatoire (.env) cp .env.example .env # Modifier .env avec SECRET_KEY (obligatoire, min 32 caractĂšres) # Initialisation base de donnĂ©es + donnĂ©es de dĂ©mo uv run flask --app app init-db # Lancement dĂ©veloppement avec logging structurĂ© uv run flask --app app run --debug # Lancement des tests (100 tests ✅) uv run pytest # Consultation des logs structurĂ©s JSON tail -f logs/notytex.log ``` ## đŸ§Ș **QualitĂ© du Code ** - **Tests pytest avec 100% de rĂ©ussite** (100 tests ✅) - **Architecture dĂ©couplĂ©e** : Repository Pattern + Dependency Injection - **Gestion d'erreurs centralisĂ©e** : Gestionnaires globaux JSON/HTML - **Logging structurĂ© JSON** : CorrĂ©lation des requĂȘtes + contexte complet - **Configuration sĂ©curisĂ©e** : Variables d'environnement externalisĂ©es - **Validation robuste** : WTForms + Pydantic + services mĂ©tier - **SĂ©paration des responsabilitĂ©s** : ModĂšles/Repositories/Services/Controllers ## 📝 **Cas d'Usage Typiques** ### **ScĂ©nario A : Évaluation ComplĂšte** 1. **Professeur crĂ©e une Ă©valuation** : "ContrĂŽle Chapitre 3 - Fonctions" pour le 2Ăšme trimestre 2. **DĂ©finit les paramĂštres** : Date, trimestre (obligatoire), classe, coefficient 3. **Ajoute des exercices** : "Exercice 1: Calculs", "Exercice 2: Graphiques" 4. **DĂ©finit le barĂšme** : Question 1a (2 pts), Question 1b (3 pts), CompĂ©tence graphique (score 0-3) 5. **Voit l'indicateur de progression** : "Correction 0%" en rouge sur toutes les pages 6. **Saisit les notes** pour chaque Ă©lĂšve sur chaque Ă©lĂ©ment via clic sur l'indicateur 7. **Suit la progression** : L'indicateur passe Ă  "Correction 45%" en orange, puis "Correction 100%" en vert 8. **Consulte les rĂ©sultats dĂ©taillĂ©s** : AccĂšs direct Ă  la page de rĂ©sultats avec statistiques et histogramme 9. **Analyse les performances** : Statistiques descriptives, distribution des notes et classement alphabĂ©tique ### **ScĂ©nario B : Import d'ÉlĂšves en Masse (Nouveau)** 1. **Professeur accĂšde au dashboard** de la classe "6Ăšme A" 2. **Clique sur "Import CSV"** depuis la carte d'action violette ou la page des Ă©lĂšves 3. **PrĂ©pare le fichier CSV** : Export depuis le logiciel administratif avec colonnes sĂ©parĂ©es par `;` 4. **Glisse le fichier** dans la zone de drag & drop ou sĂ©lectionne via le bouton 5. **Configure l'import** : Date d'inscription, option "ignorer doublons" activĂ©e 6. **Lance l'import** : Validation automatique format + extraction intelligente des noms 7. **Consulte le rapport** : "15 Ă©lĂšves importĂ©s, 2 ignorĂ©s (doublons), 0 erreur" 8. **VĂ©rifie la liste** : Redirection automatique vers la page des Ă©lĂšves mise Ă  jour ## VolumĂ©trie de milieu d'annĂ©e - 5 classes d'entre 25 et 35 Ă©lĂšves - Les Ă©valuations sont constituĂ©s d'entre 10 et 20 Ă©lĂ©ments de notations - 4 Ă©valuations corrigĂ©es par classes pour le premier trimestre - 2 Ă©valuations non corrigĂ©e ou partiellement corrigĂ©e par classe ## 🎓 **Public Cible** - Enseignants du secondaire (collĂšge/lycĂ©e) - Établissements souhaitant digitaliser leurs Ă©valuations - Contexte oĂč coexistent notation classique et Ă©valuation par compĂ©tences Ce projet prĂ©sente une architecture solide, une interface soignĂ©e avec des **indicateurs UX avancĂ©s** pour le suivi de progression, et rĂ©pond Ă  un besoin concret du monde Ă©ducatif en combinant praticitĂ© et modernitĂ© technique. ## 🎹 **DerniĂšres AmĂ©liorations UX** ### **Indicateurs de Progression IntĂ©grĂ©s** - **Calcul automatique** : PropriĂ©tĂ© `grading_progress` dans le modĂšle Assessment - **Affichage multi-pages** : PrĂ©sent sur index, liste Ă©valuations, dĂ©tail Ă©valuation - **Code couleur intuitif** : - 🔮 Rouge : "Correction 0%" (non commencĂ©e) - 🟠 Orange : "Correction XX%" (en cours avec cercle de progression) - 🟱 Vert : "Correction 100%" (terminĂ©e) - **Actions directes** : Clic sur l'indicateur → redirection vers page de notation - **Informations dĂ©taillĂ©es** : "X/Y notes saisies (Z Ă©lĂšves)" - **Responsive design** : Version complĂšte sur liste Ă©valuations, version compacte sur index ### **SystĂšme de RĂ©sultats et Statistiques** - **Calculs automatisĂ©s** : MĂ©thodes `calculate_student_scores()`, `get_assessment_statistics()` dans le modĂšle Assessment - **Double logique de scoring** : - **Points** : Sommation directe des valeurs - **CompĂ©tences** : Formule `1/3 * score * pointMax` (score 0-3) - **Gestion des cas particuliers** : Les scores "." comptent comme 0 mais incluent les points maximum - **Arrondi intelligent** : Notes totales arrondies Ă  2 dĂ©cimales pour la prĂ©cision - **Interface graphique** : Chart.js pour histogrammes interactifs avec bins de 1 point - **Tri alphabĂ©tique** : Classement automatique par nom de famille puis prĂ©nom Cette Ă©volution transforme Notytex en un outil **vĂ©ritablement centrĂ© utilisateur** oĂč l'Ă©tat de correction est **visible et actionnable depuis n'importe quelle page**, avec une **analyse statistique complĂšte** des rĂ©sultats. --- # 🚀 **Guide de DĂ©marrage pour Nouveaux DĂ©veloppeurs** ## 📋 **PrĂ©requis** ### **Environnement de DĂ©veloppement** - **Python 3.8+** : Version recommandĂ©e 3.11+ - **uv** : Gestionnaire de paquets moderne Python ([installation](https://docs.astral.sh/uv/)) - **Git** : Pour le contrĂŽle de version - **IDE recommandĂ©** : VSCode avec extensions Python, Flask, Jinja2 ### **Connaissances Requises** - **Python** : Classes, dĂ©corateurs, gestion d'erreurs - **Flask** : Routes, templates, blueprints, contexte d'application - **SQLAlchemy** : ORM, relations, requĂȘtes - **HTML/CSS** : TailwindCSS de prĂ©fĂ©rence - **JavaScript** : Manipulation DOM, Ă©vĂ©nements ## ⚡ **DĂ©marrage Rapide (5 minutes)** ```bash # 1. Cloner et installer git clone cd notytex uv sync # 2. Initialiser la base de donnĂ©es avec donnĂ©es de test uv run flask --app app init-db # 3. Lancer l'application uv run flask --app app run --debug # 4. Ouvrir http://localhost:5000 ``` ## đŸ—ïž **Architecture DĂ©taillĂ©e** ### **Structure des Fichiers** ``` notytex/ ├── đŸ“± app.py # Point d'entrĂ©e Flask + routes principales ├── đŸ—„ïž models.py # ModĂšles SQLAlchemy + logique mĂ©tier ├── ⚙ app_config.py # Gestionnaire de configuration SQLite ├── 🔧 config.py # Configuration Flask (dev/prod/test) ├── 🎯 forms.py # Formulaires WTForms + validation ├── đŸ› ïž utils.py # Fonctions utilitaires + gestion erreurs ├── 📜 commands.py # Commandes CLI Flask ├── 📁 routes/ # Blueprints organisĂ©s par fonctionnalitĂ© │ ├── assessments.py # CRUD Ă©valuations + crĂ©ation unifiĂ©e │ ├── exercises.py # Gestion exercices + Ă©lĂ©ments de notation │ ├── grading.py # Interface de saisie des notes │ └── config.py # Interface de configuration systĂšme ├── 📁 templates/ # Templates Jinja2 + composants rĂ©utilisables │ ├── base.html # Layout principal + navigation │ ├── components/ # Composants rĂ©utilisables │ └── config/ # Interface de configuration ├── 📁 static/ # Assets statiques (CSS, JS, images) ├── đŸ§Ș tests/ # Tests pytest + fixtures └── 📝 pyproject.toml # Configuration uv + dĂ©pendances ``` ### **Flux de DonnĂ©es Typique** ``` 1. Route Flask (routes/*.py) ↓ 2. Validation Form (forms.py) ↓ 3. Logique MĂ©tier (models.py) ↓ 4. AccĂšs Base de DonnĂ©es (SQLAlchemy) ↓ 5. Rendu Template (templates/*.html) ``` ## 🎯 **Points d'EntrĂ©e pour Contribuer** ### **🌟 DĂ©butant - Familiarisation** 1. **Ajouter un champ Ă  un modĂšle existant** - Fichier : `models.py` - Exemple : Ajouter un champ "commentaire" Ă  Student - Impact : Migration DB + template + form 2. **Modifier l'apparence d'une page** - Fichiers : `templates/*.html` - Technologie : TailwindCSS - Exemple : Changer les couleurs du dashboard 3. **Ajouter une validation de formulaire** - Fichier : `forms.py` - Technologie : WTForms - Exemple : Validation format email Ă©tudiant ### **đŸ”„ IntermĂ©diaire - Nouvelles FonctionnalitĂ©s** 1. **CrĂ©er une nouvelle page** - Blueprint dans `routes/` - Template correspondant - Formulaire si nĂ©cessaire - Tests 2. **Ajouter un systĂšme d'export** - Route d'export (PDF, Excel, CSV) - Template de gĂ©nĂ©ration - Boutons dans l'interface 3. **Étendre le systĂšme de configuration** - Nouveau modĂšle dans `models.py` - Interface dans `routes/config.py` - Template de configuration ### **⚡ AvancĂ© - Architecture** 1. **Optimiser les performances** - RequĂȘtes SQLAlchemy (N+1 queries) - Cache des calculs coĂ»teux - Lazy loading intelligent 2. **Ajouter des API REST** - Endpoints JSON - Authentification - Documentation OpenAPI 3. **SystĂšme de notifications** - ModĂšles de notifications - Interface utilisateur - SystĂšme de stockage ## 📚 **Concepts ClĂ©s Ă  MaĂźtriser** ### **Configuration Dynamique** ```python # Configuration stockĂ©e en base SQLite from app_config import config_manager # Lecture school_year = config_manager.get('context.school_year') competences = config_manager.get_competences_list() # Écriture config_manager.set('context.school_year', '2025-2026') config_manager.save() ``` ### **Calcul de Progression** ```python # Dans models.py - Assessment @property def grading_progress(self): # Calcul automatique du % de correction # UtilisĂ© partout dans l'interface return { 'percentage': 75, 'status': 'in_progress', 'completed': 45, 'total': 60 } ``` ### **SystĂšme de Notation UnifiĂ©** ```python # Type "notes" - Valeurs numĂ©riques grade.value = "15.5" # Points dĂ©cimaux grade.grading_element.grading_type = "notes" grade.grading_element.max_points = 20 # Type "score" - Échelle 0-3 fixe grade.value = "2" # 0=Non acquis, 1=En cours, 2=Acquis, 3=Expert grade.grading_element.grading_type = "score" grade.grading_element.max_points = 3 # Toujours 3 pour les scores # Valeurs spĂ©ciales configurables grade.value = "." # Pas de rĂ©ponse (= 0) grade.value = "d" # DispensĂ© (ne compte pas) # Configuration centralisĂ©e from app_config import config_manager score_meanings = config_manager.get('grading.score_meanings') special_values = config_manager.get('grading.special_values') ``` ## đŸ§Ș **Tests et DĂ©bogage** ### **Lancer les Tests** ```bash # Tous les tests uv run pytest # Tests avec couverture uv run pytest --cov=. --cov-report=html # Test spĂ©cifique de l'import CSV uv run python -c " from services.csv_import_service import CSVImportService service = CSVImportService() print('✅ Test extraction:', service.extract_name_parts('DUPONT Marie Claire')) " # Tests spĂ©cifiques uv run pytest tests/test_models.py -v ``` ### **DĂ©bogage** ```bash # Mode debug avec rechargement auto uv run flask --app app run --debug # Console interactive uv run flask --app app shell # Logs dĂ©taillĂ©s tail -f logs/school_management.log ``` ### **Base de DonnĂ©es** ```bash # RĂ©initialiser complĂštement rm school_management.db uv run flask --app app init-db # Inspecter la DB sqlite3 school_management.db .tables .schema assessment ``` ## 🎹 **Conventions de Code** ### **Style Python** - **PEP 8** : Formatage automatique avec black - **Type hints** : RecommandĂ©s pour les nouvelles fonctions - **Docstrings** : Format Google pour les fonctions publiques - **Noms explicites** : `calculate_student_scores()` plutĂŽt que `calc()` ### **Templates Jinja2** - **Indentation** : 4 espaces - **Noms de variables** : snake_case - **Blocs rĂ©utilisables** : Utiliser les includes et macros - **Classes CSS** : TailwindCSS avec composition ### **Base de DonnĂ©es** - **Noms de tables** : Pluriel en anglais (`students`, `assessments`) - **Relations** : Toujours avec `backref` explicite - **Cascades** : DĂ©finir explicitement le comportement ## 🐛 **ProblĂšmes Courants** ### **Erreur : Template Not Found** ```python # ❌ Mauvais return render_template('config.html') # ✅ Correct return render_template('config/index.html') ``` ### **Erreur : SQLAlchemy Session** ```python # ❌ Oublier de commit db.session.add(new_student) # ✅ Correct db.session.add(new_student) db.session.commit() ``` ### **Erreur : Import Circulaire** ```python # ❌ Import direct dans models.py from app import app # ✅ Import dans fonction def get_current_app(): from flask import current_app return current_app ``` ## 📖 **Ressources Utiles** ### **Documentation Officielle** - [Flask](https://flask.palletsprojects.com/) - Framework web - [SQLAlchemy](https://docs.sqlalchemy.org/) - ORM Python - [TailwindCSS](https://tailwindcss.com/) - Framework CSS - [Jinja2](https://jinja.palletsprojects.com/) - Moteur de templates ### **Outils de DĂ©veloppement** - [uv](https://docs.astral.sh/uv/) - Gestionnaire de paquets - [pytest](https://docs.pytest.org/) - Framework de tests - [Flask-Shell](https://flask.palletsprojects.com/en/2.3.x/shell/) - Console interactive --- ## 📧 **SystĂšme d'Envoi de Bilans par Email** **Notytex** intĂšgre dĂ©sormais un systĂšme complet d'envoi automatique des bilans d'Ă©valuation individuels par email aux Ă©lĂšves et Ă  leurs familles. ### **🎯 FonctionnalitĂ©s Principales** - ✅ **Configuration SMTP flexible** via interface web (Gmail, Outlook, serveurs personnalisĂ©s) - ✅ **GĂ©nĂ©ration automatique** de bilans individualisĂ©s avec analyses dĂ©taillĂ©es - ✅ **Templates HTML responsives** optimisĂ©s pour tous clients email - ✅ **Analyses par compĂ©tences et domaines** avec visualisations graphiques - ✅ **Serveur de test intĂ©grĂ©** (`debug_smtp_server.py`) pour dĂ©veloppement - ✅ **Gestion d'erreurs robuste** avec logs structurĂ©s et rapports dĂ©taillĂ©s ### **đŸ—ïž Architecture** ``` services/ ├── email_service.py # Service d'envoi SMTP └── student_report_service.py # GĂ©nĂ©ration de bilans templates/email/ ├── base_email.html # Template de base responsive └── student_report.html # Template de bilan dĂ©taillĂ© ``` ### **📊 Contenu des Bilans** Chaque bilan inclut : - **Note globale** avec visualisation colorĂ©e et position dans la classe - **DĂ©tail par exercice** et questions individuelles - **Analyses par compĂ©tences** avec systĂšme d'Ă©toiles visuelles - **Performances par domaines** avec codes couleur - **Statistiques de classe** (moyenne, mĂ©diane, Ă©cart-type) - **Message personnalisĂ©** du professeur (optionnel) ### **📧 Workflow d'Envoi** 1. **Configuration SMTP** via `Configuration > Email` 2. **SĂ©lection d'Ă©lĂšves** depuis la page de rĂ©sultats d'Ă©valuation 3. **PrĂ©visualisation** des bilans via `/preview-report` 4. **Envoi groupĂ©** avec rapport dĂ©taillĂ© des succĂšs/erreurs 5. **RĂ©ception professionnelle** par les Ă©lĂšves et familles **📖 Documentation complĂšte** : [docs/features/EMAIL_REPORTS.md](docs/features/EMAIL_REPORTS.md)