# 📱 Exam Attendance Manager Une application Flutter cross-platform pour permettre aux professeurs d'émarger les étudiants durant un examen, synchronisée en temps réel avec un Google Sheet. ## 🏗 Architecture du Projet Le projet repose sur une architecture robuste conçue pour gérer la connectivité instable (mode hors-ligne) et la réactivité de l'interface. * **Service Singleton (`AttendanceService`)** : Cœur de l'application, injecté via `GetIt`. Il gère la logique métier et la communication avec l'API. * **Système de Queue** : Les émargements ne sont pas envoyés directement. Ils sont ajoutés dans une queue (FIFO). Un worker en arrière-plan dépile cette queue et synchronise avec le Google Sheet dès que possible. * **Programmation Réactive (RxDart)** : L'état de la queue est exposé via un `Observable` (Stream). L'interface utilisateur écoute ce stream pour afficher un indicateur visuel de synchronisation en temps réel. * **Backend Google Apps Script** : Un script hébergé sur le Google Sheet agit comme une API REST pour recevoir les données JSON. Veuillez lire aussi `./project_description.txt`. ----- ## 📂 Structure des Fichiers (`lib/`) L'intégralité du code Flutter réside dans le dossier `lib` pour assurer la portabilité. ```text . ├── components │ └── sync_status_indicator.dart # composant visuel pour ne pas fermer l'appli trop tot. ├── main.dart # point d'entree de l'application ├── models │ └── student.dart # notre model de donnees ├── services │ └── attendance_service.dart # notre service layer (partie la plus importante de l'appli) ├── utils │ └── locator.dart # notre gestionnaire de singleton (Dependency injection seeding) └── views ├── home.dart # page principale ├── manual_entry.dart # formulaire d'emargement manuel └── qr_scanner_screen.dart # page de scan du QR code qui mene vers le GoogleSheet. ``` ----- ## 🚀 Installation et Configuration ### 1\. Côté Backend (Google Sheet) Avant de lancer l'application, il faut préparer le fichier de destination. 1. Créez un nouveau Google Sheet. 2. Allez dans **Extensions \> Apps Script**. 3. Collez le code `doPost(e)` du fichier `Code.gs`. 4. **Déployez** en tant qu'Application Web : * *Execute as*: **Me** (Moi). * *Who has access*: **Anyone** (Tout le monde) -\> *Indispensable pour que l'app mobile puisse écrire sans authentification complexe.* 5. Copiez l'URL du script générée (ex: `https://script.google.com/.../exec`). 6. Générez un QR Code contenant cette URL. ### 2\. Côté Application (Flutter) lancez : ```bash flutter pub get # fetch all the dependencies flutter run # run the app ``` ----- ## 📖 Guide d'Utilisation L'application suit le workflow défini dans le cahier des charges : 1. **Configuration (Professeur)** : * Au premier lancement, scannez le **QR Code** généré à l'étape Backend via l'application. * L'application configure automatiquement l'URL de l'API cible. 2. **Émargement (Examen)** : * Le professeur scanne la carte étudiante (NFC) ou un QR étudiant. * L'étudiant est ajouté à la **Queue locale** via `push_student_queue`. * L'indicateur visuel passe à l'orange ("Données en attente"). 3. **Synchronisation** : * Le service tente d'envoyer les données en arrière-plan. * **Premier Scan** : Enregistre l'heure d'arrivée ("Entrée"). * **Deuxième Scan** : Met à jour la ligne existante avec l'heure de départ ("Sortie") pour calculer le temps total. * Une fois la queue vide, l'indicateur repasse au vert. ----- ## ⚠️ Notes Importantes * **Sécurité des données** : L'indicateur visuel est crucial. Ne fermez pas l'application tant que l'icône de synchronisation n'est pas verte (queue vide). * **Format des données** : Le modèle `Student` envoie les champs : `prenom`, `nom`, `no_etudiant`, `no_leo`, `entree`, `sortie`.