Files
geo/app/docs/STATISTICS-REAL-DATA.md

164 lines
5.2 KiB
Markdown

# 📊 Intégration des données réelles dans la page Statistiques
## 📋 Problème résolu
La page de statistiques (`AdminStatisticsPage`) utilisait des données de test statiques pour les filtres secteurs et membres au lieu des vraies données stockées dans les boxes Hive.
## ✨ Solutions implémentées
### 1. 🔄 Chargement dynamique des données
- **Secteurs** : Chargés depuis la box `sectors` (Hive)
- **Membres** : Chargés depuis la box `membres` (Hive)
- **Méthode `_loadData()`** : Charge les données au démarrage
- **Listes dynamiques** : Remplacent les données statiques
### 2. 🗺️ Mapping des IDs
- **Maps de correspondance** : `_sectorIds` et `_memberIds`
- **Association nom ↔ ID** : Pour retrouver l'ID à partir du nom sélectionné
- **Gestion du "Tous"** : Retourne `null` pour afficher toutes les données
### 3. 📝 Corrections apportées
- **SectorModel** : Utilisation du champ `libelle` (pas `name`)
- **MembreModel** : Concaténation `firstName + name` pour l'affichage
- **Suppression du ValueListenableBuilder** : Temporairement retiré (nécessite plus de travail)
## 📂 Fichiers modifiés
### `lib/presentation/admin/admin_statistics_page.dart`
#### Imports ajoutés
```dart
import 'package:hive_flutter/hive_flutter.dart';
import 'package:geosector_app/core/constants/app_keys.dart';
import 'package:geosector_app/core/data/models/sector_model.dart';
import 'package:geosector_app/core/data/models/membre_model.dart';
```
#### Variables modifiées
```dart
// Avant (données statiques)
final List<String> _sectors = [
'Tous',
'Secteur Nord',
'Secteur Sud',
// ...
];
// Après (données dynamiques)
List<String> _sectors = ['Tous'];
List<String> _members = ['Tous'];
final Map<String, int> _sectorIds = {};
final Map<String, int> _memberIds = {};
```
#### Nouvelle méthode de chargement
```dart
void _loadData() {
// Charger les secteurs depuis Hive
if (Hive.isBoxOpen(AppKeys.sectorsBoxName)) {
final sectorsBox = Hive.box<SectorModel>(AppKeys.sectorsBoxName);
final sectors = sectorsBox.values.toList();
setState(() {
_sectors = ['Tous'];
_sectorIds.clear();
for (final sector in sectors) {
_sectors.add(sector.libelle);
_sectorIds[sector.libelle] = sector.id;
}
});
}
// Charger les membres depuis Hive
if (Hive.isBoxOpen(AppKeys.membresBoxName)) {
final membresBox = Hive.box<MembreModel>(AppKeys.membresBoxName);
final membres = membresBox.values.toList();
setState(() {
_members = ['Tous'];
_memberIds.clear();
for (final membre in membres) {
final fullName = '${membre.firstName} ${membre.name}'.trim();
_members.add(fullName);
_memberIds[fullName] = membre.id;
}
});
}
}
```
#### Méthodes utilitaires mises à jour
```dart
// Avant
int? _getUserIdFromName(String name) {
if (name == 'Jean Dupont') return 1;
if (name == 'Marie Martin') return 2;
// ...
}
// Après
int? _getUserIdFromName(String name) {
if (name == 'Tous') return null;
return _memberIds[name];
}
int? _getSectorIdFromName(String name) {
if (name == 'Tous') return null;
return _sectorIds[name];
}
```
## 🎯 Bénéfices
-**Données réelles** : Les filtres affichent maintenant les vrais secteurs et membres
-**Synchronisation automatique** : Les listes se mettent à jour avec les données Hive
-**Filtrage fonctionnel** : Possibilité de filtrer par secteur ou membre réel
-**IDs corrects** : Les graphiques reçoivent les bons IDs pour filtrer les données
## ⚠️ Limitations actuelles
### Filtre par secteur non supporté dans les graphiques
Les widgets `ActivityChart` et `PassageSummaryCard` ne supportent pas encore le paramètre `sectorId`. J'ai ajouté des commentaires TODO pour indiquer où cette fonctionnalité devrait être ajoutée :
```dart
// TODO: Ajouter le support du filtre par secteur dans ActivityChart
// TODO: Ajouter le support du filtre par secteur dans PassageSummaryCard
```
Pour implémenter complètement le filtrage par secteur, il faudrait :
1. Ajouter le paramètre `sectorId` aux widgets de graphiques
2. Modifier les requêtes de données pour filtrer par secteur
3. Joindre les tables passages/secteurs pour le filtrage
## 🔄 Évolution future
### Pour un rechargement automatique complet
Si vous souhaitez que la page se mette à jour automatiquement quand de nouveaux secteurs/membres sont ajoutés :
```dart
return ValueListenableBuilder(
valueListenable: Listenable.merge([
Hive.box<SectorModel>(AppKeys.sectorsBoxName).listenable(),
Hive.box<MembreModel>(AppKeys.membresBoxName).listenable(),
]),
builder: (context, _, __) {
_loadData();
return _buildContent();
},
);
```
### Pour le filtrage par secteur
Il faudrait modifier les widgets de graphiques pour :
1. Accepter un paramètre `int? sectorId`
2. Filtrer les passages par secteur dans les requêtes
3. Afficher uniquement les données du secteur sélectionné
## 📊 Utilisation
1. **Sélectionner "Filtrer par"** : Choisir entre Secteur ou Membre
2. **Choisir l'élément** : La liste affiche maintenant les vrais secteurs/membres
3. **Les graphiques se mettent à jour** : Actuellement uniquement pour les membres
4. **"Tous"** : Affiche toutes les données sans filtre