README.md 3,73 ko
Newer Older
# 📱 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**.
Massiles Ghernaout's avatar
Massiles Ghernaout a validé
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)

Massiles Ghernaout's avatar
Massiles Ghernaout a validé
lancez :
Massiles Ghernaout's avatar
Massiles Ghernaout a validé
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`.