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.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
## 📂 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)` fourni précédemment.
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)
Ajoutez les dépendances suivantes dans votre `pubspec.yaml` :
```yaml
dependencies:
flutter:
sdk: flutter
get_it: ^7.6.0 # Injection de dépendance (Singleton)
rxdart: ^0.27.7 # Reactive Programming
http: ^1.1.0 # Requêtes réseau vers Google Sheet
# nfc_manager: ^3.3.0 # Pour le scan réel (optionnel pour test)
```
Puis lancez :
```bash
flutter pub get
flutter run
```
-----
## 📖 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`.