# 📱 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. ----- ## 📂 Structure des Fichiers (`lib/`) L'intégralité du code Flutter réside dans le dossier `lib` pour assurer la portabilité. ```text lib/ ├── main.dart # Point d'entrée + UI principale (Scan NFC & QR) ├── locator.dart # Configuration de l'injection de dépendance (GetIt) ├── models/ │ └── student.dart # Modèle de données (JSON serialization) ├── services/ │ └── attendance_service.dart # Service Singleton + Queue + Worker └── widgets/ └── sync_status_indicator.dart # Widget réactif écoutant l'état de la queue ``` ----- ## 🚀 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`.