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

5.2 KiB

📊 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

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

// 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

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

// 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 :

// 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 :

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