Newer
Older
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.
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)
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`.