feat: Release version 3.1.4 - Mode terrain et génération PDF
✨ Nouvelles fonctionnalités: - Ajout du mode terrain pour utilisation mobile hors connexion - Génération automatique de reçus PDF avec template personnalisé - Révision complète du système de cartes avec amélioration des performances 🔧 Améliorations techniques: - Refactoring du module chat avec architecture simplifiée - Optimisation du système de sécurité NIST SP 800-63B - Amélioration de la gestion des secteurs géographiques - Support UTF-8 étendu pour les noms d'utilisateurs 📱 Application mobile: - Nouveau mode terrain dans user_field_mode_page - Interface utilisateur adaptative pour conditions difficiles - Synchronisation offline améliorée 🗺️ Cartographie: - Optimisation des performances MapBox - Meilleure gestion des tuiles hors ligne - Amélioration de l'affichage des secteurs 📄 Documentation: - Ajout guide Android (ANDROID-GUIDE.md) - Documentation sécurité API (API-SECURITY.md) - Guide module chat (CHAT_MODULE.md) 🐛 Corrections: - Résolution des erreurs 400 lors de la création d'utilisateurs - Correction de la validation des noms d'utilisateurs - Fix des problèmes de synchronisation chat 🤖 Generated with Claude Code (https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
657
app/TODO-APP.md
657
app/TODO-APP.md
@@ -1,194 +1,7 @@
|
||||
# TODO-APP.md
|
||||
## TODO-APP.md
|
||||
|
||||
## 📋 Liste des tâches à effectuer sur l'application GEOSECTOR
|
||||
|
||||
### 🔧 Migration du pattern de gestion des erreurs API
|
||||
|
||||
#### 🎯 Objectif
|
||||
Appliquer le nouveau pattern de gestion des erreurs pour que tous les messages spécifiques de l'API soient correctement affichés aux utilisateurs (au lieu du message générique "Erreur inattendue").
|
||||
|
||||
---
|
||||
|
||||
### ✅ Repositories déjà migrés
|
||||
- [x] **MembreRepository** (`lib/core/repositories/membre_repository.dart`)
|
||||
- ✅ Conversion DioException → ApiException
|
||||
- ✅ Simplification du code
|
||||
- ✅ Logs avec LoggerService
|
||||
|
||||
---
|
||||
|
||||
### 📝 Repositories à migrer
|
||||
|
||||
#### 1. **UserRepository** (`lib/core/repositories/user_repository.dart`)
|
||||
- [ ] Vérifier/ajouter l'import `ApiException`
|
||||
- [ ] Simplifier `updateUser()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Simplifier `syncUser()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Simplifier `syncAllUsers()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Remplacer `debugPrint` par `LoggerService`
|
||||
- [ ] Améliorer la gestion des erreurs dans le bloc catch (ne pas logger DioException)
|
||||
|
||||
#### 2. **OperationRepository** (`lib/core/repositories/operation_repository.dart`)
|
||||
- [ ] Vérifier/ajouter l'import `ApiException`
|
||||
- [ ] Simplifier `createOperation()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Simplifier `updateOperation()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Simplifier `deleteOperation()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Simplifier `activateOperation()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Remplacer `debugPrint` par `LoggerService`
|
||||
- [ ] Améliorer la gestion des erreurs dans le bloc catch (ne pas logger DioException)
|
||||
|
||||
#### 3. **PassageRepository** (`lib/core/repositories/passage_repository.dart`)
|
||||
- [ ] Vérifier/ajouter l'import `ApiException`
|
||||
- [ ] Simplifier `createPassage()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Simplifier `updatePassage()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Simplifier `updatePassageStatus()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Simplifier `syncPassages()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Remplacer `debugPrint` par `LoggerService`
|
||||
- [ ] Améliorer la gestion des erreurs dans le bloc catch (ne pas logger DioException)
|
||||
|
||||
#### 4. **SectorRepository** (`lib/core/repositories/sector_repository.dart`)
|
||||
- [ ] Vérifier/ajouter l'import `ApiException`
|
||||
- [ ] Simplifier `createSector()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Simplifier `updateSector()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Simplifier `deleteSector()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Simplifier `assignUserToSector()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Remplacer `debugPrint` par `LoggerService`
|
||||
- [ ] Améliorer la gestion des erreurs dans le bloc catch (ne pas logger DioException)
|
||||
|
||||
#### 5. **AmicaleRepository** (`lib/core/repositories/amicale_repository.dart`)
|
||||
- [ ] Vérifier/ajouter l'import `ApiException`
|
||||
- [ ] Simplifier `updateAmicale()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Simplifier `createAmicale()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Simplifier `syncAmicales()` - supprimer les vérifications de statut après l'appel API
|
||||
- [ ] Remplacer `debugPrint` par `LoggerService`
|
||||
- [ ] Améliorer la gestion des erreurs dans le bloc catch (ne pas logger DioException)
|
||||
|
||||
---
|
||||
|
||||
### 🛠️ Pattern à appliquer
|
||||
|
||||
#### ❌ Code à supprimer (ancien pattern)
|
||||
```dart
|
||||
try {
|
||||
final response = await ApiService.instance.put('/endpoint', data: data);
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
// Traitement succès
|
||||
return true;
|
||||
}
|
||||
|
||||
// ⚠️ Ce code ne sera JAMAIS exécuté
|
||||
if (response.data != null && response.data is Map<String, dynamic>) {
|
||||
final responseData = response.data as Map<String, dynamic>;
|
||||
if (responseData['status'] == 'error') {
|
||||
throw Exception(responseData['message']);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} catch (e) {
|
||||
debugPrint('Erreur: $e');
|
||||
rethrow;
|
||||
}
|
||||
```
|
||||
|
||||
#### ✅ Nouveau pattern à utiliser
|
||||
```dart
|
||||
try {
|
||||
final response = await ApiService.instance.put('/endpoint', data: data);
|
||||
|
||||
// Si on arrive ici, la requête a réussi (200/201)
|
||||
// Traitement succès
|
||||
return true;
|
||||
|
||||
} catch (e) {
|
||||
// Log propre sans détails techniques
|
||||
if (e is ApiException) {
|
||||
LoggerService.error('Erreur lors de l\'opération: ${e.message}');
|
||||
} else {
|
||||
LoggerService.error('Erreur lors de l\'opération');
|
||||
}
|
||||
rethrow; // Propager pour affichage UI
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 📦 Imports nécessaires
|
||||
|
||||
Ajouter ces imports dans chaque repository si manquants :
|
||||
|
||||
```dart
|
||||
import 'package:geosector_app/core/services/logger_service.dart';
|
||||
import 'package:geosector_app/core/utils/api_exception.dart';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 🧪 Tests de validation
|
||||
|
||||
Pour chaque repository migré, tester :
|
||||
|
||||
1. **Test d'erreur 409 (Conflict)** :
|
||||
- Créer/modifier avec un email déjà existant
|
||||
- Vérifier que le message "Cet email est déjà utilisé" s'affiche
|
||||
|
||||
2. **Test d'erreur 400 (Bad Request)** :
|
||||
- Envoyer des données invalides
|
||||
- Vérifier que le message d'erreur spécifique s'affiche
|
||||
|
||||
3. **Test d'erreur réseau** :
|
||||
- Couper la connexion
|
||||
- Vérifier que "Problème de connexion réseau" s'affiche
|
||||
|
||||
4. **Test de succès** :
|
||||
- Opération normale
|
||||
- Vérifier que tout fonctionne comme avant
|
||||
|
||||
---
|
||||
|
||||
### 📊 Critères de succès
|
||||
|
||||
- [ ] Tous les repositories utilisent le nouveau pattern
|
||||
- [ ] Plus aucun `debugPrint` dans les repositories (remplacé par `LoggerService`)
|
||||
- [ ] Les messages d'erreur spécifiques de l'API s'affichent correctement
|
||||
- [ ] Les logs en production sont désactivés (sauf erreurs)
|
||||
- [ ] Le code est plus simple et maintenable
|
||||
|
||||
---
|
||||
|
||||
### 🔍 Commandes utiles pour vérifier
|
||||
|
||||
```bash
|
||||
# Rechercher les anciens patterns à remplacer
|
||||
grep -r "response.statusCode ==" lib/core/repositories/
|
||||
grep -r "responseData\['status'\] == 'error'" lib/core/repositories/
|
||||
grep -r "debugPrint" lib/core/repositories/
|
||||
|
||||
# Vérifier les imports manquants
|
||||
grep -L "LoggerService" lib/core/repositories/*.dart
|
||||
grep -L "ApiException" lib/core/repositories/*.dart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 📅 Priorité
|
||||
|
||||
1. **Haute** : UserRepository (utilisé partout)
|
||||
2. **Haute** : OperationRepository (fonctionnalité critique)
|
||||
3. **Moyenne** : PassageRepository (utilisé fréquemment)
|
||||
4. **Moyenne** : AmicaleRepository (gestion administrative)
|
||||
5. **Basse** : SectorRepository (moins critique)
|
||||
|
||||
---
|
||||
|
||||
### 📝 Notes
|
||||
|
||||
- Cette migration améliore l'UX en affichant des messages d'erreur clairs
|
||||
- Le LoggerService désactive automatiquement les logs en production
|
||||
- Le code devient plus maintenable et cohérent
|
||||
- Documenter dans README-APP.md une fois terminé
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Tests unitaires Flutter à implémenter
|
||||
|
||||
### 📁 Structure des tests
|
||||
@@ -197,95 +10,108 @@ Le dossier `/test` doit contenir des tests unitaires pour valider le comportemen
|
||||
|
||||
### 📝 Tests prioritaires à créer
|
||||
|
||||
#### 1. **Tests des Repositories** (`test/repositories/`)
|
||||
#### 1\. **Tests des Repositories** (`test/repositories/`)
|
||||
|
||||
##### `test/repositories/membre_repository_test.dart`
|
||||
- [ ] Test de création d'un membre avec succès
|
||||
- [ ] Test de création avec email déjà existant (409)
|
||||
- [ ] Test de mise à jour d'un membre
|
||||
- [ ] Test de suppression d'un membre
|
||||
- [ ] Test de gestion des erreurs réseau
|
||||
- [ ] Test du cache Hive local
|
||||
`test/repositories/membre_repository_test.dart`
|
||||
|
||||
##### `test/repositories/user_repository_test.dart`
|
||||
- [ ] Test de connexion réussie
|
||||
- [ ] Test de connexion avec mauvais identifiants
|
||||
- [ ] Test de mise à jour du profil utilisateur
|
||||
- [ ] Test de synchronisation des données
|
||||
- [ ] Test de gestion de session
|
||||
- Test de création d'un membre avec succès
|
||||
- Test de création avec email déjà existant (409)
|
||||
- Test de mise à jour d'un membre
|
||||
- Test de suppression d'un membre
|
||||
- Test de gestion des erreurs réseau
|
||||
- Test du cache Hive local
|
||||
|
||||
##### `test/repositories/operation_repository_test.dart`
|
||||
- [ ] Test de création d'opération
|
||||
- [ ] Test d'activation/désactivation
|
||||
- [ ] Test de récupération des opérations par amicale
|
||||
- [ ] Test de suppression avec transfert de passages
|
||||
`test/repositories/user_repository_test.dart`
|
||||
|
||||
#### 2. **Tests des Services** (`test/services/`)
|
||||
- Test de connexion réussie
|
||||
- Test de connexion avec mauvais identifiants
|
||||
- Test de mise à jour du profil utilisateur
|
||||
- Test de synchronisation des données
|
||||
- Test de gestion de session
|
||||
|
||||
##### `test/services/api_service_test.dart`
|
||||
- [ ] Test de détection d'environnement (DEV/REC/PROD)
|
||||
- [ ] Test de gestion des sessions
|
||||
- [ ] Test de conversion DioException vers ApiException
|
||||
- [ ] Test des différents codes d'erreur HTTP
|
||||
- [ ] Test du retry automatique
|
||||
`test/repositories/operation_repository_test.dart`
|
||||
|
||||
##### `test/services/logger_service_test.dart`
|
||||
- [ ] Test de désactivation des logs en PROD
|
||||
- [ ] Test des différents niveaux de log
|
||||
- [ ] Test du formatage des messages
|
||||
- Test de création d'opération
|
||||
- Test d'activation/désactivation
|
||||
- Test de récupération des opérations par amicale
|
||||
- Test de suppression avec transfert de passages
|
||||
|
||||
##### `test/services/hive_service_test.dart`
|
||||
- [ ] Test d'initialisation des boîtes Hive
|
||||
- [ ] Test de sauvegarde et récupération
|
||||
- [ ] Test de suppression de données
|
||||
- [ ] Test de migration de schéma
|
||||
#### 2\. **Tests des Services** (`test/services/`)
|
||||
|
||||
#### 3. **Tests des Models** (`test/models/`)
|
||||
`test/services/api_service_test.dart`
|
||||
|
||||
##### `test/models/membre_model_test.dart`
|
||||
- [ ] Test de sérialisation JSON
|
||||
- [ ] Test de désérialisation JSON
|
||||
- [ ] Test de conversion vers UserModel
|
||||
- [ ] Test des valeurs par défaut
|
||||
- Test de détection d'environnement (DEV/REC/PROD)
|
||||
- Test de gestion des sessions
|
||||
- Test de conversion DioException vers ApiException
|
||||
- Test des différents codes d'erreur HTTP
|
||||
- Test du retry automatique
|
||||
|
||||
##### `test/models/amicale_model_test.dart`
|
||||
- [ ] Test de sérialisation/désérialisation
|
||||
- [ ] Test des nouveaux champs booléens (chk_mdp_manuel, chk_username_manuel)
|
||||
- [ ] Test de validation des données
|
||||
`test/services/logger_service_test.dart`
|
||||
|
||||
#### 4. **Tests des Widgets** (`test/widgets/`)
|
||||
- Test de désactivation des logs en PROD
|
||||
- Test des différents niveaux de log
|
||||
- Test du formatage des messages
|
||||
|
||||
##### `test/widgets/user_form_test.dart`
|
||||
- [ ] Test d'affichage conditionnel des champs (username/password)
|
||||
- [ ] Test de validation du mot de passe (regex)
|
||||
- [ ] Test de validation de l'username (pas d'espaces)
|
||||
- [ ] Test de génération automatique d'username
|
||||
- [ ] Test du mode création vs modification
|
||||
`test/services/hive_service_test.dart`
|
||||
|
||||
##### `test/widgets/membre_table_widget_test.dart`
|
||||
- [ ] Test d'affichage responsive (mobile vs web)
|
||||
- [ ] Test de masquage des colonnes sur mobile
|
||||
- [ ] Test des icônes de statut
|
||||
- [ ] Test du tri et filtrage
|
||||
- Test d'initialisation des boîtes Hive
|
||||
- Test de sauvegarde et récupération
|
||||
- Test de suppression de données
|
||||
- Test de migration de schéma
|
||||
|
||||
#### 5. **Tests d'intégration** (`test/integration/`)
|
||||
#### 3\. **Tests des Models** (`test/models/`)
|
||||
|
||||
##### `test/integration/auth_flow_test.dart`
|
||||
- [ ] Test du flow complet de connexion
|
||||
- [ ] Test de persistance de session
|
||||
- [ ] Test de déconnexion
|
||||
- [ ] Test de redirection après expiration
|
||||
`test/models/membre_model_test.dart`
|
||||
|
||||
##### `test/integration/membre_management_test.dart`
|
||||
- [ ] Test de création complète d'un membre
|
||||
- [ ] Test de modification avec validation
|
||||
- [ ] Test de suppression avec transfert
|
||||
- [ ] Test de gestion des erreurs
|
||||
- Test de sérialisation JSON
|
||||
- Test de désérialisation JSON
|
||||
- Test de conversion vers UserModel
|
||||
- Test des valeurs par défaut
|
||||
|
||||
`test/models/amicale_model_test.dart`
|
||||
|
||||
- Test de sérialisation/désérialisation
|
||||
- Test des nouveaux champs booléens (chk_mdp_manuel, chk_username_manuel)
|
||||
- Test de validation des données
|
||||
|
||||
#### 4\. **Tests des Widgets** (`test/widgets/`)
|
||||
|
||||
`test/widgets/user_form_test.dart`
|
||||
|
||||
- Test d'affichage conditionnel des champs (username/password)
|
||||
- Test de validation du mot de passe (regex)
|
||||
- Test de validation de l'username (pas d'espaces)
|
||||
- Test de génération automatique d'username
|
||||
- Test du mode création vs modification
|
||||
|
||||
`test/widgets/membre_table_widget_test.dart`
|
||||
|
||||
- Test d'affichage responsive (mobile vs web)
|
||||
- Test de masquage des colonnes sur mobile
|
||||
- Test des icônes de statut
|
||||
- Test du tri et filtrage
|
||||
|
||||
#### 5\. **Tests d'intégration** (`test/integration/`)
|
||||
|
||||
`test/integration/auth_flow_test.dart`
|
||||
|
||||
- Test du flow complet de connexion
|
||||
- Test de persistance de session
|
||||
- Test de déconnexion
|
||||
- Test de redirection après expiration
|
||||
|
||||
`test/integration/membre_management_test.dart`
|
||||
|
||||
- Test de création complète d'un membre
|
||||
- Test de modification avec validation
|
||||
- Test de suppression avec transfert
|
||||
- Test de gestion des erreurs
|
||||
|
||||
### 🛠️ Configuration des tests
|
||||
|
||||
#### Fichier `test/test_helpers.dart`
|
||||
```dart
|
||||
|
||||
```plaintext
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:mockito/mockito.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
@@ -293,7 +119,7 @@ import 'package:hive_flutter/hive_flutter.dart';
|
||||
|
||||
// Mocks nécessaires
|
||||
class MockDio extends Mock implements Dio {}
|
||||
class MockBox<T> extends Mock implements Box<T> {}
|
||||
class MockBox<t> extends Mock implements Box<t> {}
|
||||
class MockApiService extends Mock implements ApiService {}
|
||||
|
||||
// Helper pour initialiser Hive en tests
|
||||
@@ -317,7 +143,7 @@ class TestDataFactory {
|
||||
// ...
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
static MembreModel createTestMembre() {
|
||||
return MembreModel(
|
||||
id: 1,
|
||||
@@ -332,7 +158,7 @@ class TestDataFactory {
|
||||
|
||||
### 📋 Commandes de test
|
||||
|
||||
```bash
|
||||
```plaintext
|
||||
# Lancer tous les tests
|
||||
flutter test
|
||||
|
||||
@@ -349,16 +175,17 @@ open coverage/html/index.html
|
||||
|
||||
### 🎯 Objectifs de couverture
|
||||
|
||||
- [ ] **Repositories** : 80% minimum
|
||||
- [ ] **Services** : 90% minimum
|
||||
- [ ] **Models** : 95% minimum
|
||||
- [ ] **Widgets critiques** : 70% minimum
|
||||
- [ ] **Couverture globale** : 75% minimum
|
||||
- **Repositories** : 80% minimum
|
||||
- **Services** : 90% minimum
|
||||
- **Models** : 95% minimum
|
||||
- **Widgets critiques** : 70% minimum
|
||||
- **Couverture globale** : 75% minimum
|
||||
|
||||
### 📚 Dépendances de test à ajouter
|
||||
|
||||
Dans `pubspec.yaml` :
|
||||
```yaml
|
||||
|
||||
```plaintext
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
@@ -372,7 +199,8 @@ dev_dependencies:
|
||||
### 🔄 Intégration CI/CD
|
||||
|
||||
Ajouter dans le pipeline CI :
|
||||
```yaml
|
||||
|
||||
```plaintext
|
||||
test:
|
||||
stage: test
|
||||
script:
|
||||
@@ -386,14 +214,12 @@ test:
|
||||
|
||||
### 📝 Bonnes pratiques
|
||||
|
||||
1. **Isolation** : Chaque test doit être indépendant
|
||||
2. **Mocking** : Utiliser des mocks pour les dépendances externes
|
||||
3. **Nommage** : Utiliser des noms descriptifs (test_should_xxx_when_yyy)
|
||||
4. **AAA** : Suivre le pattern Arrange-Act-Assert
|
||||
5. **Edge cases** : Tester les cas limites et erreurs
|
||||
6. **Performance** : Les tests unitaires doivent être rapides (<100ms)
|
||||
|
||||
---
|
||||
1. **Isolation** : Chaque test doit être indépendant
|
||||
2. **Mocking** : Utiliser des mocks pour les dépendances externes
|
||||
3. **Nommage** : Utiliser des noms descriptifs (test_should_xxx_when_yyy)
|
||||
4. **AAA** : Suivre le pattern Arrange-Act-Assert
|
||||
5. **Edge cases** : Tester les cas limites et erreurs
|
||||
6. **Performance** : Les tests unitaires doivent être rapides (\<100ms)
|
||||
|
||||
## 💬 Module Chat en ligne GEOSECTOR
|
||||
|
||||
@@ -403,7 +229,7 @@ Le module chat est partiellement implémenté avec une architecture MQTT pour le
|
||||
|
||||
### 🏗️ Architecture existante
|
||||
|
||||
```
|
||||
```plaintext
|
||||
lib/chat/
|
||||
├── models/ # ✅ Modèles créés avec Hive
|
||||
│ ├── conversation_model.dart # Conversations (one-to-one, groupe, annonce)
|
||||
@@ -429,60 +255,67 @@ lib/chat/
|
||||
|
||||
### 📝 Tâches de développement Chat
|
||||
|
||||
#### 1. **Finalisation des modèles Hive**
|
||||
- [ ] Compléter les adaptateurs Hive pour tous les modèles
|
||||
- [ ] Ajouter la gestion des pièces jointes (images, documents)
|
||||
- [ ] Implémenter le modèle `AnonymousUserModel` pour les utilisateurs temporaires
|
||||
- [ ] Ajouter les timestamps et statuts de lecture
|
||||
#### 1\. **Finalisation des modèles Hive**
|
||||
|
||||
#### 2. **Repository ChatRepository**
|
||||
- [ ] Implémenter `createConversation()` avec participants
|
||||
- [ ] Implémenter `sendMessage()` avec queue hors ligne
|
||||
- [ ] Implémenter `getConversations()` avec pagination
|
||||
- [ ] Implémenter `getMessages()` avec lazy loading
|
||||
- [ ] Ajouter la gestion des participants (ajout/suppression)
|
||||
- [ ] Implémenter les annonces ciblées par groupe
|
||||
- Compléter les adaptateurs Hive pour tous les modèles
|
||||
- Ajouter la gestion des pièces jointes (images, documents)
|
||||
- Implémenter le modèle `AnonymousUserModel` pour les utilisateurs temporaires
|
||||
- Ajouter les timestamps et statuts de lecture
|
||||
|
||||
#### 3. **Services**
|
||||
- [ ] Compléter `ChatApiService` avec endpoints REST
|
||||
- [ ] Implémenter la synchronisation bidirectionnelle
|
||||
- [ ] Configurer `OfflineQueueService` pour messages en attente
|
||||
- [ ] Implémenter le retry automatique avec exponential backoff
|
||||
- [ ] Ajouter la compression des images avant envoi
|
||||
#### 2\. **Repository ChatRepository**
|
||||
|
||||
#### 4. **Notifications MQTT**
|
||||
- [ ] Installer et configurer Mosquitto dans le container Incus
|
||||
- [ ] Configurer SSL/TLS pour MQTT (port 8883)
|
||||
- [ ] Implémenter l'authentification par token JWT
|
||||
- [ ] Créer les topics par utilisateur/groupe/conversation
|
||||
- [ ] Implémenter le système de présence (online/offline/typing)
|
||||
- [ ] Ajouter les ACLs pour sécuriser les topics
|
||||
- Implémenter `createConversation()` avec participants
|
||||
- Implémenter `sendMessage()` avec queue hors ligne
|
||||
- Implémenter `getConversations()` avec pagination
|
||||
- Implémenter `getMessages()` avec lazy loading
|
||||
- Ajouter la gestion des participants (ajout/suppression)
|
||||
- Implémenter les annonces ciblées par groupe
|
||||
|
||||
#### 5. **Interface utilisateur**
|
||||
- [ ] Créer `ChatScreen` avec liste de messages
|
||||
- [ ] Implémenter `ConversationsList` avec badges non-lus
|
||||
- [ ] Designer `MessageBubble` (texte, images, documents)
|
||||
- [ ] Créer `ChatInput` avec:
|
||||
- [ ] Saisie de texte avec emoji picker
|
||||
- [ ] Bouton d'envoi de fichiers
|
||||
- [ ] Indicateur "en train d'écrire"
|
||||
- [ ] Enregistrement vocal (optionnel)
|
||||
- [ ] Ajouter les animations (apparition messages, typing indicator)
|
||||
- [ ] Implémenter le swipe pour répondre
|
||||
- [ ] Ajouter la recherche dans les conversations
|
||||
#### 3\. **Services**
|
||||
|
||||
#### 6. **Fonctionnalités avancées**
|
||||
- [ ] Notifications push locales via `flutter_local_notifications`
|
||||
- [ ] Chiffrement end-to-end des messages sensibles
|
||||
- [ ] Réactions aux messages (emojis)
|
||||
- [ ] Messages éphémères avec auto-suppression
|
||||
- [ ] Partage de localisation en temps réel
|
||||
- [ ] Appels audio/vidéo via WebRTC (phase 2)
|
||||
- Compléter `ChatApiService` avec endpoints REST
|
||||
- Implémenter la synchronisation bidirectionnelle
|
||||
- Configurer `OfflineQueueService` pour messages en attente
|
||||
- Implémenter le retry automatique avec exponential backoff
|
||||
- Ajouter la compression des images avant envoi
|
||||
|
||||
#### 4\. **Notifications MQTT**
|
||||
|
||||
- Installer et configurer Mosquitto dans le container Incus
|
||||
- Configurer SSL/TLS pour MQTT (port 8883)
|
||||
- Implémenter l'authentification par token JWT
|
||||
- Créer les topics par utilisateur/groupe/conversation
|
||||
- Implémenter le système de présence (online/offline/typing)
|
||||
- Ajouter les ACLs pour sécuriser les topics
|
||||
|
||||
#### 5\. **Interface utilisateur**
|
||||
|
||||
- Créer `ChatScreen` avec liste de messages
|
||||
- Implémenter `ConversationsList` avec badges non-lus
|
||||
- Designer `MessageBubble` (texte, images, documents)
|
||||
- Créer `ChatInput` avec:
|
||||
- Saisie de texte avec emoji picker
|
||||
- Bouton d'envoi de fichiers
|
||||
- Indicateur "en train d'écrire"
|
||||
- Enregistrement vocal (optionnel)
|
||||
- Ajouter les animations (apparition messages, typing indicator)
|
||||
- Implémenter le swipe pour répondre
|
||||
- Ajouter la recherche dans les conversations
|
||||
|
||||
#### 6\. **Fonctionnalités avancées**
|
||||
|
||||
- Notifications push locales via `flutter_local_notifications`
|
||||
- Chiffrement end-to-end des messages sensibles
|
||||
- Réactions aux messages (emojis)
|
||||
- Messages éphémères avec auto-suppression
|
||||
- Partage de localisation en temps réel
|
||||
- Appels audio/vidéo via WebRTC (phase 2)
|
||||
|
||||
### 🔧 Configuration backend requise
|
||||
|
||||
#### Base de données
|
||||
```sql
|
||||
|
||||
```plaintext
|
||||
-- Tables à créer (voir chat_tables.sql)
|
||||
CREATE TABLE chat_conversations (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT,
|
||||
@@ -512,7 +345,8 @@ CREATE TABLE chat_participants (
|
||||
```
|
||||
|
||||
#### Configuration MQTT
|
||||
```bash
|
||||
|
||||
```plaintext
|
||||
# Installation Mosquitto
|
||||
apt-get install mosquitto mosquitto-clients
|
||||
|
||||
@@ -528,18 +362,18 @@ password_file /etc/mosquitto/passwd
|
||||
|
||||
### 📦 Dépendances à ajouter
|
||||
|
||||
```yaml
|
||||
```plaintext
|
||||
dependencies:
|
||||
# MQTT et notifications
|
||||
mqtt5_client: ^4.0.0
|
||||
flutter_local_notifications: ^17.0.0
|
||||
|
||||
|
||||
# UI et UX
|
||||
emoji_picker_flutter: ^2.0.0
|
||||
cached_network_image: ^3.3.1
|
||||
photo_view: ^0.14.0
|
||||
file_picker: ^6.1.1
|
||||
|
||||
|
||||
# Utilitaires
|
||||
path_provider: ^2.1.2
|
||||
image_picker: ^1.0.7
|
||||
@@ -548,13 +382,12 @@ dependencies:
|
||||
```
|
||||
|
||||
### 🧪 Tests à implémenter
|
||||
- [ ] Tests unitaires des repositories
|
||||
- [ ] Tests d'intégration MQTT
|
||||
- [ ] Tests de performance (1000+ messages)
|
||||
- [ ] Tests hors ligne/online
|
||||
- [ ] Tests de sécurité (injection, XSS)
|
||||
|
||||
---
|
||||
- Tests unitaires des repositories
|
||||
- Tests d'intégration MQTT
|
||||
- Tests de performance (1000+ messages)
|
||||
- Tests hors ligne/online
|
||||
- Tests de sécurité (injection, XSS)
|
||||
|
||||
## 💳 Module de paiement Stripe
|
||||
|
||||
@@ -564,76 +397,82 @@ Intégration de Stripe pour permettre aux amicales ayant activé `chk_stripe` d'
|
||||
|
||||
### 🎯 Objectifs
|
||||
|
||||
1. Permettre le paiement en ligne lors des passages
|
||||
2. Gérer les comptes Stripe des amicales
|
||||
3. Suivre les transactions et commissions
|
||||
4. Offrir une expérience de paiement fluide
|
||||
1. Permettre le paiement en ligne lors des passages
|
||||
2. Gérer les comptes Stripe des amicales
|
||||
3. Suivre les transactions et commissions
|
||||
4. Offrir une expérience de paiement fluide
|
||||
|
||||
### 📝 Tâches de développement Stripe
|
||||
|
||||
#### 1. **Configuration initiale Stripe**
|
||||
- [ ] Créer un compte Stripe Connect Platform
|
||||
- [ ] Configurer les webhooks Stripe
|
||||
- [ ] Mettre en place l'environnement de test (sandbox)
|
||||
- [ ] Configurer les clés API (publishable/secret)
|
||||
- [ ] Implémenter la gestion sécurisée des clés
|
||||
#### 1\. **Configuration initiale Stripe**
|
||||
|
||||
#### 2. **Onboarding des amicales**
|
||||
- [ ] Créer un workflow d'inscription Stripe pour les amicales
|
||||
- [ ] Implémenter Stripe Connect Onboarding
|
||||
- [ ] Gérer le KYC (Know Your Customer) requis par Stripe
|
||||
- [ ] Stocker de manière sécurisée le `stripe_account_id`
|
||||
- [ ] Créer une page de statut du compte Stripe
|
||||
- [ ] Gérer les documents requis (RIB, statuts, etc.)
|
||||
- Créer un compte Stripe Connect Platform
|
||||
- Configurer les webhooks Stripe
|
||||
- Mettre en place l'environnement de test (sandbox)
|
||||
- Configurer les clés API (publishable/secret)
|
||||
- Implémenter la gestion sécurisée des clés
|
||||
|
||||
#### 3. **Modèles de données**
|
||||
- [ ] Créer `StripeAccountModel` pour les comptes Connect
|
||||
- [ ] Créer `PaymentIntentModel` pour les intentions de paiement
|
||||
- [ ] Créer `TransactionModel` pour l'historique
|
||||
- [ ] Ajouter les champs Stripe dans `PassageModel`
|
||||
- [ ] Implémenter la table des commissions
|
||||
#### 2\. **Onboarding des amicales**
|
||||
|
||||
#### 4. **Service StripeService**
|
||||
```dart
|
||||
- Créer un workflow d'inscription Stripe pour les amicales
|
||||
- Implémenter Stripe Connect Onboarding
|
||||
- Gérer le KYC (Know Your Customer) requis par Stripe
|
||||
- Stocker de manière sécurisée le `stripe_account_id`
|
||||
- Créer une page de statut du compte Stripe
|
||||
- Gérer les documents requis (RIB, statuts, etc.)
|
||||
|
||||
#### 3\. **Modèles de données**
|
||||
|
||||
- Créer `StripeAccountModel` pour les comptes Connect
|
||||
- Créer `PaymentIntentModel` pour les intentions de paiement
|
||||
- Créer `TransactionModel` pour l'historique
|
||||
- Ajouter les champs Stripe dans `PassageModel`
|
||||
- Implémenter la table des commissions
|
||||
|
||||
#### 4\. **Service StripeService**
|
||||
|
||||
```plaintext
|
||||
class StripeService {
|
||||
// Compte Connect
|
||||
Future<String> createConnectAccount(AmicaleModel amicale);
|
||||
Future<string> createConnectAccount(AmicaleModel amicale);
|
||||
Future<void> updateAccountStatus(String accountId);
|
||||
Future<String> createAccountLink(String accountId);
|
||||
|
||||
Future<string> createAccountLink(String accountId);
|
||||
|
||||
// Paiements
|
||||
Future<PaymentIntent> createPaymentIntent({
|
||||
Future<paymentintent> createPaymentIntent({
|
||||
required double amount,
|
||||
required String currency,
|
||||
required String connectedAccountId,
|
||||
});
|
||||
|
||||
|
||||
Future<void> confirmPayment(String paymentIntentId);
|
||||
Future<void> refundPayment(String paymentIntentId);
|
||||
|
||||
|
||||
// Commissions
|
||||
double calculateApplicationFee(double amount); // 1.4%
|
||||
}
|
||||
```
|
||||
|
||||
#### 5. **Interface de paiement dans PassageForm**
|
||||
- [ ] Détecter si l'amicale accepte Stripe (`chk_stripe`)
|
||||
- [ ] Ajouter l'option "Paiement par carte" dans le dropdown
|
||||
- [ ] Intégrer Stripe Elements pour la saisie de carte
|
||||
- [ ] Implémenter le flow de paiement 3D Secure
|
||||
- [ ] Gérer les erreurs de paiement
|
||||
- [ ] Afficher le reçu de paiement
|
||||
- [ ] Permettre l'envoi du reçu par email
|
||||
#### 5\. **Interface de paiement dans PassageForm**
|
||||
|
||||
#### 6. **Widget StripePaymentSheet**
|
||||
```dart
|
||||
- Détecter si l'amicale accepte Stripe (`chk_stripe`)
|
||||
- Ajouter l'option "Paiement par carte" dans le dropdown
|
||||
- Intégrer Stripe Elements pour la saisie de carte
|
||||
- Implémenter le flow de paiement 3D Secure
|
||||
- Gérer les erreurs de paiement
|
||||
- Afficher le reçu de paiement
|
||||
- Permettre l'envoi du reçu par email
|
||||
|
||||
#### 6\. **Widget StripePaymentSheet**
|
||||
|
||||
```plaintext
|
||||
class StripePaymentSheet extends StatefulWidget {
|
||||
final double amount;
|
||||
final String currency;
|
||||
final AmicaleModel amicale;
|
||||
final Function(String) onSuccess;
|
||||
final Function(String) onError;
|
||||
|
||||
|
||||
// UI avec:
|
||||
// - Montant à payer
|
||||
// - Formulaire de carte (Stripe Elements)
|
||||
@@ -643,15 +482,17 @@ class StripePaymentSheet extends StatefulWidget {
|
||||
}
|
||||
```
|
||||
|
||||
#### 7. **Tableau de bord financier**
|
||||
- [ ] Page de suivi des transactions Stripe
|
||||
- [ ] Graphiques des paiements par période
|
||||
- [ ] Export des transactions (CSV/Excel)
|
||||
- [ ] Calcul automatique des commissions
|
||||
- [ ] Rapprochement bancaire
|
||||
- [ ] Dashboard temps réel des paiements
|
||||
#### 7\. **Tableau de bord financier**
|
||||
|
||||
- Page de suivi des transactions Stripe
|
||||
- Graphiques des paiements par période
|
||||
- Export des transactions (CSV/Excel)
|
||||
- Calcul automatique des commissions
|
||||
- Rapprochement bancaire
|
||||
- Dashboard temps réel des paiements
|
||||
|
||||
#### 8\. **Webhooks Stripe**
|
||||
|
||||
#### 8. **Webhooks Stripe**
|
||||
```php
|
||||
// Backend PHP pour gérer les webhooks
|
||||
class StripeWebhookHandler {
|
||||
@@ -664,26 +505,29 @@ class StripeWebhookHandler {
|
||||
}
|
||||
```
|
||||
|
||||
#### 9. **Sécurité**
|
||||
- [ ] Chiffrement des données sensibles
|
||||
- [ ] Validation PCI DSS
|
||||
- [ ] Audit trail des transactions
|
||||
- [ ] Détection de fraude
|
||||
- [ ] Rate limiting sur les API
|
||||
- [ ] Tokenisation des cartes
|
||||
#### 9\. **Sécurité**
|
||||
|
||||
#### 10. **Tests et conformité**
|
||||
- [ ] Tests avec cartes de test Stripe
|
||||
- [ ] Tests des cas d'erreur (carte refusée, etc.)
|
||||
- [ ] Tests 3D Secure
|
||||
- [ ] Tests de performance
|
||||
- [ ] Conformité RGPD pour les données de paiement
|
||||
- [ ] Documentation utilisateur
|
||||
- Chiffrement des données sensibles
|
||||
- Validation PCI DSS
|
||||
- Audit trail des transactions
|
||||
- Détection de fraude
|
||||
- Rate limiting sur les API
|
||||
- Tokenisation des cartes
|
||||
|
||||
#### 10\. **Tests et conformité**
|
||||
|
||||
- Tests avec cartes de test Stripe
|
||||
- Tests des cas d'erreur (carte refusée, etc.)
|
||||
- Tests 3D Secure
|
||||
- Tests de performance
|
||||
- Conformité RGPD pour les données de paiement
|
||||
- Documentation utilisateur
|
||||
|
||||
### 🔧 Configuration backend requise
|
||||
|
||||
#### Tables base de données
|
||||
```sql
|
||||
|
||||
```plaintext
|
||||
CREATE TABLE stripe_accounts (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT,
|
||||
fk_entite INT NOT NULL,
|
||||
@@ -708,7 +552,8 @@ CREATE TABLE stripe_transactions (
|
||||
```
|
||||
|
||||
#### Variables d'environnement
|
||||
```env
|
||||
|
||||
```plaintext
|
||||
STRIPE_PUBLISHABLE_KEY=pk_test_xxx
|
||||
STRIPE_SECRET_KEY=sk_test_xxx
|
||||
STRIPE_WEBHOOK_SECRET=whsec_xxx
|
||||
@@ -717,14 +562,14 @@ STRIPE_APPLICATION_FEE_PERCENT=1.4
|
||||
|
||||
### 📦 Dépendances Stripe
|
||||
|
||||
```yaml
|
||||
```plaintext
|
||||
dependencies:
|
||||
# Stripe
|
||||
flutter_stripe: ^10.1.1
|
||||
|
||||
|
||||
# Sécurité
|
||||
flutter_secure_storage: ^9.0.0
|
||||
|
||||
|
||||
# UI
|
||||
shimmer: ^3.0.0 # Loading states
|
||||
lottie: ^3.1.0 # Animations succès/échec
|
||||
@@ -733,21 +578,25 @@ dependencies:
|
||||
### 🚀 Roadmap d'implémentation
|
||||
|
||||
**Phase 1 (2 semaines)**
|
||||
|
||||
- Configuration Stripe Connect
|
||||
- Onboarding basique des amicales
|
||||
- Tests en sandbox
|
||||
|
||||
**Phase 2 (3 semaines)**
|
||||
|
||||
- Intégration dans PassageForm
|
||||
- Gestion des paiements simples
|
||||
- Webhooks essentiels
|
||||
|
||||
**Phase 3 (2 semaines)**
|
||||
|
||||
- Dashboard financier
|
||||
- Export et rapports
|
||||
- Tests complets
|
||||
|
||||
**Phase 4 (1 semaine)**
|
||||
|
||||
- Mise en production
|
||||
- Monitoring
|
||||
- Documentation
|
||||
@@ -759,8 +608,6 @@ dependencies:
|
||||
- **Commission application** : 1.4% (reversée à GEOSECTOR)
|
||||
- **Coût net pour l'amicale** : ~2.8% + 0.25€ par transaction
|
||||
|
||||
---
|
||||
|
||||
**Date de création** : 2025-08-07
|
||||
**Auteur** : Architecture Team
|
||||
**Version** : 1.2.0
|
||||
**Date de création** : 2025-08-07
|
||||
**Auteur** : Architecture Team
|
||||
**Version** : 1.2.0\</string,>\</string,>
|
||||
|
||||
Reference in New Issue
Block a user