# GEOSECTOR v2.0 🚒 **Application de gestion des distributions de calendriers par secteurs gĂ©ographiques pour les amicales de pompiers** --- ## 🎯 Vue d'ensemble GEOSECTOR est une solution complĂšte dĂ©veloppĂ©e en Flutter qui rĂ©volutionne la gestion des campagnes de distribution de calendriers pour les amicales de pompiers. L'application combine gĂ©olocalisation, gestion multi-rĂŽles et synchronisation en temps rĂ©el pour optimiser les tournĂ©es et maximiser l'efficacitĂ© des Ă©quipes. ### 🏆 Points forts de la v2.0 - **Architecture moderne** sans Provider, basĂ©e sur l'injection de dĂ©pendances - **RĂ©activitĂ© native** avec ValueListenableBuilder et Hive - **Interface adaptative** selon les rĂŽles utilisateur - **Performance optimisĂ©e** avec un ApiService singleton - **Gestion avancĂ©e des permissions** multi-niveaux - **Gestion d'erreurs centralisĂ©e** avec ApiException - **Interface utilisateur unifiĂ©e** avec UserFormDialog rĂ©utilisable --- ## 📋 Table des matiĂšres 1. [FonctionnalitĂ©s](#-fonctionnalitĂ©s) 2. [Architecture technique](#-architecture-technique) 3. [Installation](#-installation-et-configuration) 4. [ModĂšles de donnĂ©es](#-modĂšles-de-donnĂ©es) 5. [Architecture des composants](#-architecture-des-composants) 6. [Gestion des rĂŽles](#-gestion-des-rĂŽles) 7. [Interface utilisateur](#-interface-utilisateur) 8. [API et synchronisation](#-api-et-synchronisation) 9. [Gestion des erreurs](#-gestion-des-erreurs) 10. [Cartes et gĂ©olocalisation](#-cartes-et-gĂ©olocalisation) --- ## 🚀 FonctionnalitĂ©s ### 🎯 FonctionnalitĂ©s mĂ©tier #### Pour les **Membres** (RĂŽle 1) - ✅ Visualisation des secteurs assignĂ©s sur carte interactive - ✅ Suivi GPS en temps rĂ©el des tournĂ©es - ✅ Enregistrement des passages avec gĂ©olocalisation - ✅ Gestion des stocks de calendriers - ✅ Historique des distributions - ✅ Chat intĂ©grĂ© avec l'Ă©quipe #### Pour les **Admins Amicale** (RĂŽle 2) - ✅ Gestion de leur amicale (informations, coordonnĂ©es) - ✅ Gestion des membres de l'amicale (crĂ©ation, modification, suppression) - ✅ Attribution des rĂŽles aux membres (Membre/Administrateur) - ✅ Gestion du statut actif des comptes membres - ✅ Consultation des statistiques de l'amicale - ✅ Attribution des secteurs aux membres - ✅ Suivi des performances Ă©quipe #### Pour les **Super Admins** (RĂŽle 3+) - ✅ Gestion globale multi-amicales - ✅ Administration des utilisateurs et permissions - ✅ Configuration des paramĂštres systĂšme - ✅ Analytics avancĂ©es et reporting - ✅ Gestion des secteurs gĂ©ographiques ### 🔧 FonctionnalitĂ©s techniques - **đŸ—ș Cartographie avancĂ©e** : Flutter Map avec tuiles Mapbox - **📍 GĂ©olocalisation prĂ©cise** : Suivi GPS des Ă©quipes - **đŸ’Ÿ Stockage hybride** : Cache local Hive + synchronisation cloud - **💬 Communication** : Chat MQTT en temps rĂ©el - **🔐 SĂ©curitĂ©** : Authentification JWT + gestion fine des permissions - **đŸ“± Multi-plateforme** : iOS, Android, Web - **🌐 Mode hors-ligne** : Fonctionnement dĂ©gradĂ© sans connexion - **⚡ Gestion d'erreurs robuste** : Extraction automatique des messages API - **🎹 Interface responsive** : Adaptation automatique selon la taille d'Ă©cran --- ## đŸ—ïž Architecture technique ### Stack technologique | Composant | Technologie | Version | Usage | | ------------------- | ---------------------- | ------- | ------------------------------ | | **Framework** | Flutter | 3.32+ | Interface multi-plateforme | | **Langage** | Dart | 3.0+ | Logique applicative | | **Navigation** | GoRouter | 12.1.3 | Routing dĂ©claratif | | **Stockage local** | Hive | 2.2.3 | Base de donnĂ©es NoSQL locale | | **RĂ©activitĂ©** | ValueListenableBuilder | Native | Écoute des changements Hive | | **HTTP** | Dio | 5.4.0 | Client HTTP avec intercepteurs | | **Cartes** | Flutter Map | 6.1.0 | Rendu cartographique | | **GĂ©olocalisation** | Geolocator | 10.1.0 | Services de localisation | | **Chat** | MQTT5 Client | 4.2.0 | Messagerie temps rĂ©el | | **UI** | Material Design 3 | Native | Composants d'interface | ### đŸ›ïž Architecture en couches ```mermaid graph TD A[UI Layer - Widgets] --> B[Repository Layer - Business Logic] B --> C[Data Layer - Hive + API] A1[ValueListenableBuilder] --> A A2[Custom Widgets] --> A A3[UserFormDialog] --> A B1[UserRepository] --> B B2[AmicaleRepository] --> B B3[MembreRepository] --> B C1[Hive Boxes] --> C C2[API Service Singleton] --> C C3[ApiException Handler] --> C ``` ### 📁 Structure du projet ``` app/ ├── lib/ │ ├── core/ # Couche centrale │ │ ├── constants/ # Constantes globales │ │ │ ├── app_keys.dart # ClĂ©s des Box Hive │ │ │ └── api_endpoints.dart # Endpoints API │ │ ├── data/ │ │ │ └── models/ # ModĂšles Hive │ │ │ ├── user_model.dart # @HiveType(typeId: 3) │ │ │ ├── amicale_model.dart # @HiveType(typeId: 4) │ │ │ └── membre_model.dart # @HiveType(typeId: 5) │ │ ├── repositories/ # Logique mĂ©tier │ │ │ ├── user_repository.dart │ │ │ ├── amicale_repository.dart │ │ │ └── membre_repository.dart │ │ ├── services/ # Services externes │ │ │ ├── api_service.dart # HTTP Singleton │ │ │ ├── chat_service.dart # MQTT │ │ │ └── location_service.dart # GPS │ │ └── utils/ # Utilitaires │ │ ├── validators.dart │ │ └── formatters.dart │ ├── presentation/ # Interface utilisateur │ │ ├── admin/ # Pages administrateur │ │ │ ├── admin_dashboard_page.dart │ │ │ ├── admin_amicale_page.dart │ │ │ └── admin_statistics_page.dart │ │ ├── user/ # Pages utilisateur │ │ │ ├── user_dashboard_page.dart │ │ │ ├── map_page.dart │ │ │ └── distribution_page.dart │ │ ├── widgets/ # Composants rĂ©utilisables │ │ │ ├── tables/ │ │ │ │ ├── amicale_table_widget.dart │ │ │ │ ├── amicale_row_widget.dart │ │ │ │ ├── membre_table_widget.dart │ │ │ │ └── membre_row_widget.dart │ │ │ ├── forms/ │ │ │ │ ├── amicale_form.dart │ │ │ │ └── custom_text_field.dart │ │ │ └── common/ │ │ │ ├── dashboard_layout.dart │ │ │ └── loading_widget.dart │ │ └── theme/ │ │ └── app_theme.dart │ ├── app.dart # Configuration app │ └── main.dart # Point d'entrĂ©e ├── assets/ # Ressources statiques │ ├── images/ │ ├── icons/ │ └── fonts/ ├── test/ # Tests unitaires ├── integration_test/ # Tests d'intĂ©gration └── docs/ # Documentation ``` --- --- ## 🚀 Installation et configuration ### PrĂ©requis systĂšme - **Flutter SDK** : 3.32 ou supĂ©rieur - **Dart SDK** : 3.0 ou supĂ©rieur - **IDE** : Android Studio, VS Code, ou IntelliJ - **Environnement** : - Android : SDK 21+ (Android 5.0+) - iOS : iOS 12.0+ - Web : Navigateurs modernes ## 🔐 Configuration des clĂ©s API ### Mapbox (Cartographie) 1. CrĂ©er un compte sur [Mapbox](https://www.mapbox.com/) 2. GĂ©nĂ©rer un token d'accĂšs 3. Ajouter le token dans `.env` ### Configuration MQTT (Chat) 1. Configurer votre broker MQTT 2. CrĂ©er les credentials 3. Tester la connexion --- ## đŸ—„ïž ModĂšles de donnĂ©es ### Registres Hive des adaptateurs ```dart // ModĂšles principaux UserModelAdapter() // typeId: 0 OperationModelAdapter() // typeId: 1 SectorModelAdapter() // typeId: 3 PassageModelAdapter() // typeId: 4 MembreModelAdapter() // typeId: 5 UserSectorModelAdapter() // typeId: 6 RegionModelAdapter() // typeId: 7 ClientModelAdapter() // typeId: 10 AmicaleModelAdapter() // typeId: 11 // ModĂšles de chat ConversationModelAdapter() // typeId: 20 MessageModelAdapter() // typeId: 21 ParticipantModelAdapter() // typeId: 22 AnonymousUserModelAdapter() // typeId: 23 AudienceTargetModelAdapter() // typeId: 24 NotificationSettingsAdapter() // typeId: 25 ``` CompatibilitĂ© entre modĂšles UserModel ↔ MembreModel : Conversion bidirectionnelle via toUserModel() et fromUserModel() Synchronisation : Maintien de la cohĂ©rence entre les deux reprĂ©sentations Champs spĂ©cialisĂ©s : PrĂ©servation des donnĂ©es spĂ©cifiques Ă  chaque modĂšle 🎹 Interface utilisateur Architecture des composants UserFormDialog - Modale unifiĂ©e RĂ©utilisabilitĂ© : MĂȘme widget pour "Mon Compte" et "Gestion des Membres" Personnalisation contextuelle : SĂ©lecteur de rĂŽle (Membre/Administrateur) Checkbox statut actif/inactif Édition du nom d'utilisateur selon le contexte Gestion du nom de tournĂ©e (sectName) Interface responsive : Adaptation automatique selon la largeur d'Ă©cran UserForm - Formulaire intelligent Layout adaptatif : > 900px : Champs groupĂ©s en lignes (username+email, prĂ©nom+nom, tĂ©lĂ©phones, dates) > ≀ 900px : Champs empilĂ©s verticalement > Validation conditionnelle : Au moins nom OU nom de tournĂ©e requis > Champs dynamiques : Affichage selon les permissions et le contexte > Indicateurs visuels : Points rouges sur les champs obligatoires > Tableaux interactifs > AmicaleTableWidget : Gestion des amicales avec Ă©dition inline > MembreTableWidget : Gestion des membres avec actions contextuelles > Alternance de couleurs : AmĂ©lioration de la lisibilitĂ© > Clic sur ligne : Ouverture directe du formulaire d'Ă©dition ## 🔗 API et synchronisation Principe "API First" ### Flow de mise Ă  jour Validation API : Tentative de mise Ă  jour sur le serveur SuccĂšs → Sauvegarde locale avec isSynced: true Erreur → Aucune modification locale + affichage de l'erreur ### Avantages CohĂ©rence des donnĂ©es : Local toujours synchronisĂ© avec le serveur Gestion d'erreurs propre : Pas de conflits entre donnĂ©es locales et distantes UX claire : Feedback immĂ©diat sur les erreurs de validation ### ApiService Singleton - Thread-safe : Initialisation sĂ©curisĂ©e avec verrous - Auto-configuration : DĂ©tection automatique de l'environnement (DEV/REC/PROD) - Gestion de session : Headers d'authentification automatiques - Retry logic : Nouvelles tentatives pour les erreurs rĂ©seau ## ⚠ Gestion des erreurs Architecture centralisĂ©e ```mermaid sequenceDiagram participant UI as dashboard_app_bar.dart participant UR as user_repository.dart participant AS as api_service.dart participant API as API Server participant AE as ApiException participant EU as ErrorUtils Note over UI: Utilisateur clique "Enregistrer" UI->>UR: updateUser(updatedUser) Note over UR: Tente la mise Ă  jour UR->>AS: updateUser(user) Note over AS: Appel HTTP PUT AS->>API: PUT /users/123 {email: "test@test.com"} alt SuccĂšs API API-->>AS: 200 OK {user data} AS-->>UR: UserModel (mis Ă  jour) UR-->>UI: UserModel (succĂšs) UI->>EU: showSuccessSnackBar() Note over UI: ✅ "Profil mis Ă  jour" else Erreur API (ex: email dĂ©jĂ  utilisĂ©) API-->>AS: 409 Conflict {"message": "Cet email est dĂ©jĂ  utilisĂ©"} Note over AS: Conversion en ApiException AS->>AE: ApiException.fromDioException(dioError) AE-->>AS: ApiException("Cet email est dĂ©jĂ  utilisĂ©") AS-->>UR: throw ApiException UR-->>UI: throw ApiException Note over UI: Gestion de l'erreur UI->>EU: showErrorSnackBar(context, exception) EU->>AE: extractErrorMessage(exception) AE-->>EU: "Cet email est dĂ©jĂ  utilisĂ©" Note over UI: ❌ "Erreur: Cet email est dĂ©jĂ  utilisĂ©" Note over UI: Dialog reste ouvert else Erreur rĂ©seau API-->>AS: Network Error / Timeout AS->>AE: ApiException.fromDioException(networkError) AE-->>AS: ApiException("ProblĂšme de connexion rĂ©seau") AS-->>UR: throw ApiException UR-->>UI: throw ApiException UI->>EU: showErrorSnackBar(context, exception) Note over UI: ❌ "ProblĂšme de connexion rĂ©seau" end ``` ## Composants de gestion d'erreurs ### ApiException Extraction intelligente : Messages spĂ©cifiques depuis la rĂ©ponse API Codes HTTP standardisĂ©s : Mapping automatique des erreurs communes Types d'erreurs : Classification (validation, authentification, rĂ©seau, conflit) MĂ©thodes d'affichage : showError() et showSuccess() intĂ©grĂ©es ### ResponsabilitĂ©s par couche ApiService : Conversion des erreurs Dio en ApiException Repository : Propagation transparente des erreurs Interface : Affichage utilisateur via ApiException.showError() ### Messages d'erreurs contextuels 409 Conflict : "Cet email est dĂ©jĂ  utilisĂ© par un autre utilisateur" 400 Bad Request : "DonnĂ©es invalides" 401 Unauthorized : "Non autorisĂ© : veuillez vous reconnecter" 500 Server Error : "Erreur serveur interne" Network Errors : "ProblĂšme de connexion rĂ©seau" Timeout : "DĂ©lai d'attente dĂ©passĂ©" ## 🎯 Gestion des rĂŽles ### HiĂ©rarchie des permissions Membre (RĂŽle 1) : Consultation et distribution dans ses secteurs Admin Amicale (RĂŽle 2) : Gestion complĂšte de son amicale et ses membres Super Admin (RĂŽle 3+) : Administration globale multi-amicales ### FonctionnalitĂ©s par rĂŽle Admin Amicale - Gestion des membres CrĂ©ation : Nouveaux membres avec attribution de rĂŽle Modification : Informations personnelles, rĂŽle, statut actif Suppression : Avec confirmation obligatoire Validation : ContrĂŽle d'unicitĂ© email/username par l'API ### Interface adaptative SĂ©lecteur de rĂŽle : Visible uniquement pour les admins Checkbox statut actif : ContrĂŽle d'accĂšs aux comptes Édition contextuelle : Champs modifiables selon les permissions Actions conditionnelles : Boutons disponibles selon le niveau d'autorisation ## đŸ‘„ Gestion des membres (Admin Amicale) ### 🎯 Vue d'ensemble La gestion des membres est une fonctionnalitĂ© clĂ© pour les **Admins Amicale** (RĂŽle 2) qui permet une administration complĂšte des Ă©quipes au sein de leur amicale. Cette interface centralise toutes les opĂ©rations liĂ©es aux membres avec une approche sĂ©curisĂ©e et intuitive. ### đŸ“± Interface AdminAmicalePage L'interface principale `admin_amicale_page.dart` offre une vue d'ensemble complĂšte : - **Informations de l'amicale** : Affichage des dĂ©tails de l'amicale courante - **Liste des membres** : Tableau interactif avec actions contextuelles - **Ajout de membres** : Bouton d'action pour crĂ©er de nouveaux comptes - **OpĂ©ration courante** : Indication de l'opĂ©ration active en cours ### ✹ FonctionnalitĂ©s principales #### 🆕 CrĂ©ation de nouveaux membres ```dart // Workflow de crĂ©ation 1. Clic sur "Ajouter un membre" 2. Ouverture du UserFormDialog 3. Formulaire vierge avec valeurs par dĂ©faut 4. SĂ©lection du rĂŽle (Membre/Administrateur) 5. Configuration du statut actif 6. Validation et crĂ©ation via API 7. Attribution automatique Ă  l'amicale courante ``` **Champs obligatoires :** - Email (unique dans le systĂšme) - Au moins un nom (nom de famille OU nom de tournĂ©e) - RĂŽle dans l'amicale **Champs optionnels :** - Nom d'utilisateur (Ă©ditable pour les admins) - PrĂ©nom, tĂ©lĂ©phones, dates - Nom de tournĂ©e (pour identification terrain) #### ✏ Modification des membres existants ```dart // Actions disponibles - Clic sur une ligne → Ouverture du formulaire d'Ă©dition - Modification de tous les champs personnels - Changement de rĂŽle (Membre ↔ Administrateur) - Activation/DĂ©sactivation du compte - Gestion du nom de tournĂ©e ``` **Workflow de modification :** 1. SĂ©lection du membre dans le tableau 2. Ouverture automatique du `UserFormDialog` 3. Formulaire prĂ©-rempli avec donnĂ©es existantes 4. Modification des champs souhaitĂ©s 5. Validation et mise Ă  jour via API 6. Synchronisation automatique avec Hive #### đŸ—‘ïž Suppression intelligente des membres La suppression des membres intĂšgre une **logique mĂ©tier avancĂ©e** pour prĂ©server l'intĂ©gritĂ© des donnĂ©es : ##### 🔍 VĂ©rification des passages ```dart // Algorithme de vĂ©rification 1. RĂ©cupĂ©ration de l'opĂ©ration courante 2. Analyse des passages du membre pour cette opĂ©ration 3. Classification : passages rĂ©alisĂ©s vs passages Ă  finaliser 4. Comptage total des passages actifs ``` ##### 📊 ScĂ©narios de suppression **Cas 1 : Aucun passage (suppression simple)** ```http DELETE /users/{id} ``` - Confirmation simple - Suppression directe - Aucun transfert nĂ©cessaire **Cas 2 : Passages existants (suppression avec transfert)** ```http DELETE /users/{id}?transfer_to={destinataire}&operation_id={operation} ``` - Dialog d'avertissement avec dĂ©tails - SĂ©lection obligatoire d'un membre destinataire - Transfert automatique de tous les passages - PrĂ©servation de l'historique **Cas 3 : Alternative recommandĂ©e (dĂ©sactivation)** ```dart // Mise Ă  jour du statut membre.copyWith(isActive: false) ``` - PrĂ©servation complĂšte des donnĂ©es - Blocage de la connexion - Maintien de l'historique - RĂ©activation possible ultĂ©rieurement ### 🔐 SĂ©curitĂ© et permissions #### ContrĂŽles d'accĂšs - **Isolation par amicale** : Admins limitĂ©s Ă  leur amicale - **VĂ©rification des rĂŽles** : Validation cĂŽtĂ© client et serveur - **OpĂ©ration courante** : Filtrage par contexte d'opĂ©ration - **Validation API** : ContrĂŽles d'unicitĂ© et cohĂ©rence #### Gestion des erreurs ```mermaid graph TD A[Action utilisateur] --> B[Validation locale] B --> C[Appel API] C --> D{SuccĂšs ?} D -->|Oui| E[Mise Ă  jour Hive] D -->|Non| F[Affichage erreur] E --> G[Notification succĂšs] F --> H[Dialog reste ouvert] ``` ### 🎹 Interface utilisateur #### Tableaux interactifs **MembreTableWidget** - Composant principal : - Colonnes : ID, PrĂ©nom, Nom, Email, RĂŽle, Statut - Actions : Modification, Suppression - Alternance de couleurs pour lisibilitĂ© - Tri et navigation intuitifs **MembreRowWidget** - Ligne individuelle : - Clic pour Ă©dition rapide - Boutons d'action contextuels - Indicateurs visuels de statut - Tooltip informatifs #### Formulaires adaptatifs **UserFormDialog** - Modale rĂ©utilisable : - Layout responsive (>900px vs mobile) - Validation en temps rĂ©el - Gestion des erreurs inline - Sauvegarde avec feedback ### 📡 Synchronisation et rĂ©activitĂ© #### Architecture ValueListenableBuilder ```dart // Écoute automatique des changements ValueListenableBuilder>( valueListenable: membreRepository.getMembresBox().listenable(), builder: (context, membresBox, child) { // Interface mise Ă  jour automatiquement final membres = membresBox.values .where((m) => m.fkEntite == currentUser.fkEntite) .toList(); return MembreTableWidget(membres: membres); }, ) ``` #### Principe "API First" 1. **Validation API** : Tentative sur serveur en prioritĂ© 2. **SuccĂšs** → Sauvegarde locale + mise Ă  jour interface 3. **Erreur** → Affichage message + maintien Ă©tat local 4. **CohĂ©rence** : DonnĂ©es locales toujours synchronisĂ©es ### 🔄 Workflow complet ```mermaid sequenceDiagram participant A as Admin participant UI as Interface participant R as Repository participant API as Serveur participant H as Hive A->>UI: Action membre UI->>R: Appel repository R->>API: RequĂȘte HTTP API-->>R: RĂ©ponse alt SuccĂšs R->>H: Sauvegarde locale H-->>UI: Notification changement UI-->>A: Interface mise Ă  jour else Erreur R-->>UI: Exception UI-->>A: Message d'erreur end ``` ### 🎯 Bonnes pratiques #### Pour les administrateurs 1. **VĂ©rification avant suppression** : Toujours examiner les passages 2. **PrĂ©fĂ©rer la dĂ©sactivation** : Éviter la perte de donnĂ©es 3. **Noms de tournĂ©e** : Utiliser des identifiants terrain clairs 4. **RĂŽles appropriĂ©s** : Limiter les administrateurs aux besoins #### Gestion des erreurs courantes | Erreur | Cause | Solution | | ----------------------- | ------------- | ------------------------ | | Email dĂ©jĂ  utilisĂ© | Duplication | Choisir un autre email | | Membre avec passages | DonnĂ©es liĂ©es | TransfĂ©rer ou dĂ©sactiver | | Aucune opĂ©ration active | Configuration | VĂ©rifier les opĂ©rations | | AccĂšs refusĂ© | Permissions | VĂ©rifier le rĂŽle admin | Cette architecture garantit une gestion des membres robuste, sĂ©curisĂ©e et intuitive, optimisant l'efficacitĂ© administrative tout en prĂ©servant l'intĂ©gritĂ© des donnĂ©es opĂ©rationnelles. đŸ‘„âœš ## đŸ—ș Cartes et gĂ©olocalisation Flutter Map : Rendu cartographique haute performance Tuiles Mapbox : Cartographie dĂ©taillĂ©e et personnalisable GĂ©olocalisation temps rĂ©el : Suivi GPS des Ă©quipes Secteurs gĂ©ographiques : Visualisation et attribution dynamique Passages gĂ©olocalisĂ©s : Enregistrement prĂ©cis des distributions ## 🔄 Synchronisation et rĂ©activitĂ© ### Hive + ValueListenableBuilder RĂ©activitĂ© native : Mise Ă  jour automatique de l'interface Performance optimisĂ©e : Pas de Provider, injection directe Écoute sĂ©lective : RĂ©activitĂ© fine par Box Hive CohĂ©rence des donnĂ©es : Synchronisation bidirectionnelle User/Membre ### Services Singleton CurrentUserService : Gestion de l'utilisateur connectĂ© CurrentAmicaleService : Amicale de l'utilisateur actuel ApiService : Communication centralisĂ©e avec l'API DataLoadingService : Orchestration du chargement des donnĂ©es Cette architecture garantit une application performante, maintenable et Ă©volutive avec une excellente expĂ©rience utilisateur. 🚀