feat: création services singleton et renommage Box

Services créés:
 CurrentUserService singleton pour utilisateur connecté
 CurrentAmicaleService singleton pour amicale courante
 ApiService transformé en singleton

Box Hive:
 Renommage users -> user (plus logique)
 Migration automatique des données
 Services intégrés dans main.dart

État: Services créés, prêt pour refactorisation repositories
This commit is contained in:
d6soft
2025-06-05 17:02:11 +02:00
parent e5ab857913
commit 86a9a35594
32 changed files with 10561 additions and 9982 deletions

View File

@@ -49,9 +49,8 @@ class UserRepository extends ChangeNotifier {
}
// Utilisation de getters lazy pour n'accéder aux boîtes que lorsque nécessaire
Box<UserModel> get _userBox => Hive.box<UserModel>(AppKeys.usersBoxName);
Box<AmicaleModel> get _amicaleBox =>
Hive.box<AmicaleModel>(AppKeys.amicaleBoxName);
Box<UserModel> get _userBox => Hive.box<UserModel>(AppKeys.userBoxName);
Box<AmicaleModel> get _amicaleBox => Hive.box<AmicaleModel>(AppKeys.amicaleBoxName);
// Getters pour les autres boîtes qui vérifient si elles sont ouvertes avant accès
Box<OperationModel> get _operationBox {
@@ -118,10 +117,7 @@ class UserRepository extends ChangeNotifier {
bool _isLoading = false;
UserRepository(this._apiService,
{SyncService? syncService,
OperationRepository? operationRepository,
SectorRepository? sectorRepository,
PassageRepository? passageRepository})
{SyncService? syncService, OperationRepository? operationRepository, SectorRepository? sectorRepository, PassageRepository? passageRepository})
: _syncService = syncService,
_operationRepository = operationRepository,
_sectorRepository = sectorRepository,
@@ -160,7 +156,7 @@ class UserRepository extends ChangeNotifier {
if (user.role is String) {
return int.tryParse(user.role as String) ?? 1;
} else {
return user.role as int;
return user.role;
}
}
@@ -168,15 +164,13 @@ class UserRepository extends ChangeNotifier {
UserModel? _getCurrentUserFromStorage() {
try {
// Vérifier d'abord si la boîte est ouverte
if (!Hive.isBoxOpen(AppKeys.usersBoxName)) {
if (!Hive.isBoxOpen(AppKeys.userBoxName)) {
debugPrint('Boîte users non ouverte, tentative d\'ouverture...');
return null; // Retourner null plutôt que d'essayer d'ouvrir ici
}
// Chercher un utilisateur avec une session active
final activeUsers = _userBox.values
.where((user) => user.sessionId != null && user.sessionId!.isNotEmpty)
.toList();
final activeUsers = _userBox.values.where((user) => user.sessionId != null && user.sessionId!.isNotEmpty).toList();
// S'il y a des utilisateurs actifs, retourner le premier
if (activeUsers.isNotEmpty) {
@@ -185,8 +179,7 @@ class UserRepository extends ChangeNotifier {
return null;
} catch (e) {
debugPrint(
'Erreur lors de la récupération de l\'utilisateur depuis le stockage: $e');
debugPrint('Erreur lors de la récupération de l\'utilisateur depuis le stockage: $e');
return null;
}
}
@@ -218,8 +211,7 @@ class UserRepository extends ChangeNotifier {
}
// Login API PHP
Future<Map<String, dynamic>> loginAPI(String username, String password,
{required String type}) async {
Future<Map<String, dynamic>> loginAPI(String username, String password, {required String type}) async {
try {
return await _apiService.login(username, password, type: type);
} catch (e) {
@@ -229,19 +221,11 @@ class UserRepository extends ChangeNotifier {
}
// Register API PHP - Uniquement pour les administrateurs
Future<Map<String, dynamic>> registerAPI(String email, String name,
String amicaleName, String postalCode, String cityName) async {
Future<Map<String, dynamic>> registerAPI(String email, String name, String amicaleName, String postalCode, String cityName) async {
try {
final Map<String, dynamic> data = {
'email': email,
'name': name,
'amicale_name': amicaleName,
'postal_code': postalCode,
'city_name': cityName
};
final Map<String, dynamic> data = {'email': email, 'name': name, 'amicale_name': amicaleName, 'postal_code': postalCode, 'city_name': cityName};
final response =
await _apiService.post(AppKeys.registerEndpoint, data: data);
final response = await _apiService.post(AppKeys.registerEndpoint, data: data);
return response.data;
} catch (e) {
debugPrint('Erreur register API: $e');
@@ -270,20 +254,16 @@ class UserRepository extends ChangeNotifier {
}
// Méthode d'inscription (uniquement pour les administrateurs)
Future<bool> register(String email, String password, String name,
String amicaleName, String postalCode, String cityName) async {
Future<bool> register(String email, String password, String name, String amicaleName, String postalCode, String cityName) async {
_isLoading = true;
notifyListeners();
try {
// Enregistrer l'administrateur via l'API
final apiResult =
await registerAPI(email, name, amicaleName, postalCode, cityName);
final apiResult = await registerAPI(email, name, amicaleName, postalCode, cityName);
// Créer l'administrateur local
final int userId = apiResult['user_id'] is String
? int.parse(apiResult['user_id'])
: apiResult['user_id'];
final int userId = apiResult['user_id'] is String ? int.parse(apiResult['user_id']) : apiResult['user_id'];
final now = DateTime.now();
final newAdmin = UserModel(
id: userId,
@@ -316,8 +296,7 @@ class UserRepository extends ChangeNotifier {
}
// Login complet avec suivi de progression
Future<bool> login(String username, String password,
{required String type}) async {
Future<bool> login(String username, String password, {required String type}) async {
_isLoading = true;
_updateLoadingState(LoadingState.initial.copyWith(
message: 'Connexion en cours...',
@@ -346,8 +325,7 @@ class UserRepository extends ChangeNotifier {
await Hive.deleteBoxFromDisk(boxName);
debugPrint('Nettoyage: Box $boxName supprimée');
} catch (e) {
debugPrint(
'Erreur lors de la suppression de la boîte non référencée $boxName: $e');
debugPrint('Erreur lors de la suppression de la boîte non référencée $boxName: $e');
}
}
@@ -361,8 +339,7 @@ class UserRepository extends ChangeNotifier {
// Sur le web, utiliser notre méthode sécurisée pour nettoyer les boîtes Hive
if (kIsWeb) {
await HiveWebFix.safeCleanHiveBoxes(
excludeBoxes: [AppKeys.usersBoxName]);
await HiveWebFix.safeCleanHiveBoxes(excludeBoxes: [AppKeys.userBoxName]);
}
// Sur iOS, nettoyer les fichiers Hive directement
else if (!kIsWeb && Platform.isIOS) {
@@ -403,8 +380,7 @@ class UserRepository extends ChangeNotifier {
// Si le statut n'est pas 'success', retourner false
if (status != 'success') {
debugPrint('Échec de connexion: $message');
_updateLoadingState(
LoadingState.error(message ?? 'Échec de connexion'));
_updateLoadingState(LoadingState.error(message ?? 'Échec de connexion'));
return false;
}
@@ -421,8 +397,7 @@ class UserRepository extends ChangeNotifier {
});
// Si la clé 'user' existe, examiner son contenu
if (apiResult['user'] != null &&
apiResult['user'] is Map<String, dynamic>) {
if (apiResult['user'] != null && apiResult['user'] is Map<String, dynamic>) {
debugPrint('Détails utilisateur:');
final userDetails = apiResult['user'] as Map<String, dynamic>;
userDetails.forEach((key, value) {
@@ -430,8 +405,7 @@ class UserRepository extends ChangeNotifier {
});
// Construire un UserModel à partir des données utilisateur
final user = _processUserData(
userDetails, apiResult['session_id'], apiResult['session_expiry']);
final user = _processUserData(userDetails, apiResult['session_id'], apiResult['session_expiry']);
// Supprimer les anciennes références à interface et utiliser directement le rôle
await saveUser(user);
@@ -463,8 +437,7 @@ class UserRepository extends ChangeNotifier {
if (apiResult['clients'] is List) {
clientsList = apiResult['clients'] as List<dynamic>;
} else if (apiResult['clients'] is Map &&
apiResult['clients'].containsKey('data')) {
} else if (apiResult['clients'] is Map && apiResult['clients'].containsKey('data')) {
clientsList = apiResult['clients']['data'] as List<dynamic>;
} else {
debugPrint('Format de données de clients non reconnu');
@@ -529,8 +502,7 @@ class UserRepository extends ChangeNotifier {
));
// Traitement des membres
if (apiResult.containsKey('membres') ||
apiResult.containsKey('members')) {
if (apiResult.containsKey('membres') || apiResult.containsKey('members')) {
final membresData = apiResult['membres'] ?? apiResult['members'];
if (membresData != null) {
await _processMembres(membresData);
@@ -547,8 +519,7 @@ class UserRepository extends ChangeNotifier {
// Traitement des associations utilisateurs-secteurs
if (apiResult.containsKey('users_sectors')) {
await _processUserSectors(apiResult['users_sectors']);
debugPrint(
'Nombre d\'associations utilisateurs-secteurs chargées: ${_userSectorBox.length}');
debugPrint('Nombre d\'associations utilisateurs-secteurs chargées: ${_userSectorBox.length}');
}
// Vérification finale du remplissage des boîtes
@@ -570,8 +541,7 @@ class UserRepository extends ChangeNotifier {
for (final userSector in _userSectorBox.values) {
if (displayCount < 5) {
// Limiter à 5 pour éviter de surcharger la console
debugPrint(
' User ${userSector.id} (${userSector.firstName}) -> Secteur ${userSector.fkSector} (${userSector.name})');
debugPrint(' User ${userSector.id} (${userSector.firstName}) -> Secteur ${userSector.fkSector} (${userSector.name})');
displayCount++;
} else {
debugPrint(' ... et ${userSectorCount - 5} autres associations');
@@ -591,27 +561,21 @@ class UserRepository extends ChangeNotifier {
if (apiResult.containsKey('passages')) {
if (apiResult['passages'] is List) {
passagesCountInResponse = (apiResult['passages'] as List).length;
} else if (apiResult['passages'] is Map &&
apiResult['passages'].containsKey('data')) {
passagesCountInResponse =
(apiResult['passages']['data'] as List).length;
} else if (apiResult['passages'] is Map && apiResult['passages'].containsKey('data')) {
passagesCountInResponse = (apiResult['passages']['data'] as List).length;
}
}
int passagesCountInBox = _passageBox.length;
debugPrint(
'Nombre de passages dans la réponse API: $passagesCountInResponse');
debugPrint('Nombre de passages dans la réponse API: $passagesCountInResponse');
debugPrint('Nombre de passages dans la Hive Box: $passagesCountInBox');
// Si les nombres ne correspondent pas, attendre un peu et revérifier
if (passagesCountInResponse > 0 &&
passagesCountInBox < passagesCountInResponse) {
debugPrint(
'Attente supplémentaire pour finaliser le chargement des passages...');
if (passagesCountInResponse > 0 && passagesCountInBox < passagesCountInResponse) {
debugPrint('Attente supplémentaire pour finaliser le chargement des passages...');
await Future.delayed(const Duration(seconds: 1));
passagesCountInBox = _passageBox.length;
debugPrint(
'Après attente: Nombre de passages dans la Hive Box: $passagesCountInBox');
debugPrint('Après attente: Nombre de passages dans la Hive Box: $passagesCountInBox');
}
// Étape 12: Chargement terminé (100%)
@@ -652,7 +616,7 @@ class UserRepository extends ChangeNotifier {
await Hive.openBox<OperationModel>(boxName);
} else if (boxName == AppKeys.sectorsBoxName) {
await Hive.openBox<SectorModel>(boxName);
} else if (boxName == AppKeys.usersBoxName) {
} else if (boxName == AppKeys.userBoxName) {
await Hive.openBox<UserModel>(boxName);
} else if (boxName == AppKeys.membresBoxName) {
await Hive.openBox<MembreModel>(boxName);
@@ -696,15 +660,13 @@ class UserRepository extends ChangeNotifier {
await Hive.deleteBoxFromDisk(boxName);
debugPrint('Nettoyage: Box $boxName supprimée');
} catch (e) {
debugPrint(
'Erreur lors de la suppression de la boîte non référencée $boxName: $e');
debugPrint('Erreur lors de la suppression de la boîte non référencée $boxName: $e');
}
}
// Sur le web, utiliser notre méthode sécurisée pour nettoyer les boîtes Hive
if (kIsWeb) {
await HiveWebFix.safeCleanHiveBoxes(
excludeBoxes: [AppKeys.usersBoxName]);
await HiveWebFix.safeCleanHiveBoxes(excludeBoxes: [AppKeys.userBoxName]);
}
// Sur iOS, nettoyer les fichiers Hive directement
else if (Platform.isIOS) {
@@ -758,8 +720,7 @@ class UserRepository extends ChangeNotifier {
try {
await Hive.deleteBoxFromDisk(boxName);
} catch (deleteError) {
debugPrint(
'Impossible de supprimer la boîte $boxName: $deleteError');
debugPrint('Impossible de supprimer la boîte $boxName: $deleteError');
}
}
}
@@ -854,15 +815,13 @@ class UserRepository extends ChangeNotifier {
// Si la boîte contient des éléments, c'est anormal après recréation
if (count > 0) {
debugPrint(
'ATTENTION: La boîte $boxName contient encore des données après recréation');
debugPrint('ATTENTION: La boîte $boxName contient encore des données après recréation');
// Essayer de vider la boîte une dernière fois
await box.clear();
debugPrint('Vidage forcé de la boîte $boxName effectué');
}
} catch (typeError) {
debugPrint(
'Erreur de typage lors de la vérification de $boxName: $typeError');
debugPrint('Erreur de typage lors de la vérification de $boxName: $typeError');
// Tentative alternative sans typage spécifique
try {
@@ -872,17 +831,14 @@ class UserRepository extends ChangeNotifier {
if (count > 0) {
await box.clear();
debugPrint(
'Vidage forcé de la boîte $boxName (sans typage) effectué');
debugPrint('Vidage forcé de la boîte $boxName (sans typage) effectué');
}
} catch (e2) {
debugPrint(
'Impossible de vérifier la boîte $boxName même sans typage: $e2');
debugPrint('Impossible de vérifier la boîte $boxName même sans typage: $e2');
}
}
} else {
debugPrint(
'Boîte $boxName non ouverte, impossible de vérifier l\'intégrité');
debugPrint('Boîte $boxName non ouverte, impossible de vérifier l\'intégrité');
}
} catch (e) {
debugPrint('Erreur lors de la vérification de la boîte $boxName: $e');
@@ -891,8 +847,7 @@ class UserRepository extends ChangeNotifier {
debugPrint('Vérification d\'intégrité terminée');
} catch (e) {
debugPrint(
'Erreur lors de la vérification d\'intégrité des boîtes Hive: $e');
debugPrint('Erreur lors de la vérification d\'intégrité des boîtes Hive: $e');
}
}
@@ -906,7 +861,7 @@ class UserRepository extends ChangeNotifier {
'''
var request = indexedDB.deleteDatabase("geosector_app");
request.onsuccess = function() { console.log("IndexedDB nettoyé avec succès"); };
request.onerror = function() { console.log("Erreur lors du nettoyage d\'IndexedDB"); };
request.onerror = function() { console.log("Erreur lors du nettoyage d'IndexedDB"); };
'''
]);
await Future.delayed(const Duration(milliseconds: 500));
@@ -932,7 +887,7 @@ class UserRepository extends ChangeNotifier {
for (var entry in entries) {
final name = entry.path.split('/').last;
// Ne pas supprimer la boîte des utilisateurs
if (!name.contains(AppKeys.usersBoxName)) {
if (!name.contains(AppKeys.userBoxName)) {
debugPrint('Suppression de: ${entry.path}');
if (entry is Directory) {
await entry.delete(recursive: true);
@@ -957,7 +912,7 @@ class UserRepository extends ChangeNotifier {
try {
debugPrint('Nettoyage des fichiers Hive sur Android...');
final appDir = await getApplicationDocumentsDirectory();
final hiveDir = Directory('${appDir.path}');
final hiveDir = Directory(appDir.path);
if (await hiveDir.exists()) {
debugPrint('Recherche des fichiers Hive dans: ${hiveDir.path}');
@@ -968,8 +923,7 @@ class UserRepository extends ChangeNotifier {
for (var entry in entries) {
final name = entry.path.split('/').last;
// Ne supprimer que les fichiers Hive, mais pas la boîte des utilisateurs
if (name.endsWith('.hive') &&
!name.contains(AppKeys.usersBoxName)) {
if (name.endsWith('.hive') && !name.contains(AppKeys.userBoxName)) {
debugPrint('Suppression du fichier Hive: ${entry.path}');
if (entry is File) {
await entry.delete();
@@ -985,23 +939,19 @@ class UserRepository extends ChangeNotifier {
}
}
debugPrint(
'Nettoyage des fichiers Hive sur Android terminé. $filesDeleted fichiers supprimés.');
debugPrint('Nettoyage des fichiers Hive sur Android terminé. $filesDeleted fichiers supprimés.');
} else {
debugPrint('Répertoire d\'application non trouvé');
}
} catch (e) {
debugPrint(
'Erreur lors du nettoyage des fichiers Hive sur Android: $e');
debugPrint('Erreur lors du nettoyage des fichiers Hive sur Android: $e');
}
}
}
/// Méthode de connexion avec affichage d'un overlay de chargement avec progression
/// Cette méthode remplace AuthService.login et utilise le nouvel overlay avec barre de progression
Future<bool> loginWithUI(
BuildContext context, String username, String password,
{required String type}) async {
Future<bool> loginWithUI(BuildContext context, String username, String password, {required String type}) async {
try {
// Réinitialiser l'état de chargement
_updateLoadingState(LoadingState.initial.copyWith(
@@ -1019,7 +969,7 @@ class UserRepository extends ChangeNotifier {
);
// Écouter les changements d'état pour mettre à jour l'overlay
final listener = () {
listener() {
if (_progressOverlay != null) {
// Mettre à jour l'overlay avec les nouvelles valeurs
LoadingProgressOverlayUtils.update(
@@ -1029,7 +979,7 @@ class UserRepository extends ChangeNotifier {
stepDescription: _loadingState.stepDescription,
);
}
};
}
// Ajouter l'écouteur
addListener(listener);
@@ -1164,24 +1114,21 @@ class UserRepository extends ChangeNotifier {
String? lastUsername;
int? lastRole;
UserModel? lastUser;
if (Hive.isBoxOpen(AppKeys.usersBoxName) && _userBox.isNotEmpty) {
if (Hive.isBoxOpen(AppKeys.userBoxName) && _userBox.isNotEmpty) {
try {
// Récupérer l'utilisateur actuel ou le dernier utilisateur connecté
lastUser = getCurrentUser() ?? _userBox.values.first;
if (lastUser != null) {
lastUsername = lastUser.username;
lastUsername = lastUser.username;
// Convertir le rôle en int si nécessaire
if (lastUser.role is String) {
lastRole = int.tryParse(lastUser.role as String) ?? 0;
} else {
lastRole = lastUser.role as int;
}
debugPrint(
'Username sauvegardé pour pré-remplissage: $lastUsername');
debugPrint('Rôle sauvegardé pour pré-remplissage: $lastRole');
// Convertir le rôle en int si nécessaire
if (lastUser.role is String) {
lastRole = int.tryParse(lastUser.role as String) ?? 0;
} else {
lastRole = lastUser.role;
}
debugPrint('Username sauvegardé pour pré-remplissage: $lastUsername');
debugPrint('Rôle sauvegardé pour pré-remplissage: $lastRole');
} catch (e) {
debugPrint('Erreur lors de la sauvegarde du username et du rôle: $e');
}
@@ -1189,7 +1136,7 @@ class UserRepository extends ChangeNotifier {
// 1. Vider toutes les boîtes sans les fermer
debugPrint('Vidage des boîtes Hive...');
if (Hive.isBoxOpen(AppKeys.usersBoxName)) {
if (Hive.isBoxOpen(AppKeys.userBoxName)) {
try {
await _userBox.clear();
debugPrint('Boîte users vidée');
@@ -1200,16 +1147,14 @@ class UserRepository extends ChangeNotifier {
id: lastUser?.id ?? DateTime.now().millisecondsSinceEpoch,
email: lastUser?.email ?? '',
username: lastUsername,
role: lastRole ??
0, // Conserver le rôle pour la vérification dans la page de login
role: lastRole ?? 0, // Conserver le rôle pour la vérification dans la page de login
createdAt: DateTime.now(),
lastSyncedAt: DateTime.now(),
isActive: false,
isSynced: false,
);
await _userBox.put(minimalUser.id, minimalUser);
debugPrint(
'Utilisateur minimal créé pour pré-remplissage du username avec rôle: $lastRole');
debugPrint('Utilisateur minimal créé pour pré-remplissage du username avec rôle: $lastRole');
}
} catch (e) {
debugPrint('Erreur lors du vidage de la boîte users: $e');
@@ -1266,8 +1211,7 @@ class UserRepository extends ChangeNotifier {
await _chatConversationBox.clear();
debugPrint('Boîte chat_conversations vidée');
} catch (e) {
debugPrint(
'Erreur lors du vidage de la boîte chat_conversations: $e');
debugPrint('Erreur lors du vidage de la boîte chat_conversations: $e');
}
}
@@ -1319,15 +1263,15 @@ class UserRepository extends ChangeNotifier {
try {
// Vérifier si la boîte est ouverte avant de tenter de la fermer
if (Hive.isBoxOpen(AppKeys.usersBoxName)) {
if (Hive.isBoxOpen(AppKeys.userBoxName)) {
debugPrint('Fermeture de la boîte users...');
try {
await Hive.box<UserModel>(AppKeys.usersBoxName).close();
await Hive.box<UserModel>(AppKeys.userBoxName).close();
debugPrint('Boîte users fermée avec succès');
} catch (e) {
debugPrint('Erreur lors de la fermeture de la boîte users: $e');
// Ne pas continuer avec la suppression si la fermeture a échoué
throw e;
rethrow;
}
// Attendre un peu pour s'assurer que la fermeture est terminée
@@ -1336,27 +1280,24 @@ class UserRepository extends ChangeNotifier {
// Supprimer la boîte du disque seulement si la fermeture a réussi
debugPrint('Suppression de la boîte users du disque...');
try {
await Hive.deleteBoxFromDisk(AppKeys.usersBoxName);
await Hive.deleteBoxFromDisk(AppKeys.userBoxName);
debugPrint('Boîte users supprimée du disque avec succès');
} catch (e) {
debugPrint('Erreur lors de la suppression de la boîte users: $e');
// Ne pas continuer avec la réouverture si la suppression a échoué
throw e;
rethrow;
}
} else {
debugPrint(
'La boîte users est déjà fermée, tentative de suppression directe...');
debugPrint('La boîte users est déjà fermée, tentative de suppression directe...');
try {
await Hive.deleteBoxFromDisk(AppKeys.usersBoxName);
await Hive.deleteBoxFromDisk(AppKeys.userBoxName);
debugPrint('Boîte users supprimée du disque avec succès');
} catch (e) {
debugPrint(
'Erreur lors de la suppression directe de la boîte users: $e');
debugPrint('Erreur lors de la suppression directe de la boîte users: $e');
}
}
} catch (e) {
debugPrint(
'Erreur lors du processus de nettoyage de la boîte users: $e');
debugPrint('Erreur lors du processus de nettoyage de la boîte users: $e');
// Continuer malgré l'erreur, mais ne pas tenter de réouvrir la boîte
return;
}
@@ -1366,12 +1307,11 @@ class UserRepository extends ChangeNotifier {
// Rouvrir la boîte (elle sera vide)
debugPrint('Réouverture de la boîte users (vide)...');
await Hive.openBox<UserModel>(AppKeys.usersBoxName);
await Hive.openBox<UserModel>(AppKeys.userBoxName);
// Vérifier que la boîte est bien vide
final checkUsers = _userBox.values.toList();
debugPrint(
'Après approche radicale: ${checkUsers.length} utilisateurs restants');
debugPrint('Après approche radicale: ${checkUsers.length} utilisateurs restants');
// Forcer la réinitialisation du cache
_cachedCurrentUser = null;
@@ -1486,8 +1426,7 @@ class UserRepository extends ChangeNotifier {
return;
}
final unsyncedUsers =
_userBox.values.where((user) => !user.isSynced).toList();
final unsyncedUsers = _userBox.values.where((user) => !user.isSynced).toList();
if (unsyncedUsers.isEmpty) {
return;
@@ -1605,9 +1544,7 @@ class UserRepository extends ChangeNotifier {
List<AmicaleModel> getAllClients() {
try {
_ensureBoxIsOpen(AppKeys.amicaleBoxName);
return _amicaleBox.values
.where((amicale) => amicale.fkType == 1)
.toList();
return _amicaleBox.values.where((amicale) => amicale.fkType == 1).toList();
} catch (e) {
debugPrint('Erreur lors de la récupération des clients: $e');
return [];
@@ -1814,25 +1751,21 @@ class UserRepository extends ChangeNotifier {
// Méthode pour traiter les données des associations utilisateurs-secteurs reçues de l'API
Future<void> _processUserSectors(dynamic userSectorsData) async {
try {
debugPrint(
'Traitement des données des associations utilisateurs-secteurs...');
debugPrint('Traitement des données des associations utilisateurs-secteurs...');
// Vérifier que les données sont au bon format
if (userSectorsData == null) {
debugPrint(
'Aucune donnée d\'association utilisateur-secteur à traiter');
debugPrint('Aucune donnée d\'association utilisateur-secteur à traiter');
return;
}
List<dynamic> userSectorsList;
if (userSectorsData is List) {
userSectorsList = userSectorsData;
} else if (userSectorsData is Map &&
userSectorsData.containsKey('data')) {
} else if (userSectorsData is Map && userSectorsData.containsKey('data')) {
userSectorsList = userSectorsData['data'] as List<dynamic>;
} else {
debugPrint(
'Format de données d\'associations utilisateurs-secteurs non reconnu');
debugPrint('Format de données d\'associations utilisateurs-secteurs non reconnu');
return;
}
@@ -1844,26 +1777,21 @@ class UserRepository extends ChangeNotifier {
for (final userSectorData in userSectorsList) {
try {
final userSector = UserSectorModel.fromJson(userSectorData);
await _userSectorBox.put(
'${userSector.id}_${userSector.fkSector}', userSector);
await _userSectorBox.put('${userSector.id}_${userSector.fkSector}', userSector);
count++;
} catch (e) {
debugPrint(
'Erreur lors du traitement d\'une association utilisateur-secteur: $e');
debugPrint('Erreur lors du traitement d\'une association utilisateur-secteur: $e');
}
}
debugPrint(
'$count associations utilisateurs-secteurs traitées et stockées');
debugPrint('$count associations utilisateurs-secteurs traitées et stockées');
} catch (e) {
debugPrint(
'Erreur lors du traitement des associations utilisateurs-secteurs: $e');
debugPrint('Erreur lors du traitement des associations utilisateurs-secteurs: $e');
}
}
// Méthode pour traiter les données utilisateur reçues de l'API
UserModel _processUserData(
Map<String, dynamic> userData, String? sessionId, String? sessionExpiry) {
UserModel _processUserData(Map<String, dynamic> userData, String? sessionId, String? sessionExpiry) {
debugPrint('Traitement des données utilisateur: ${userData.toString()}');
// Convertir l'ID en int, qu'il soit déjà int ou string
@@ -1884,20 +1812,15 @@ class UserRepository extends ChangeNotifier {
// Convertir fk_entite en int si présent
final dynamic rawFkEntite = userData['fk_entite'];
final int? fkEntite = rawFkEntite != null
? (rawFkEntite is String ? int.parse(rawFkEntite) : rawFkEntite as int)
: null;
final int? fkEntite = rawFkEntite != null ? (rawFkEntite is String ? int.parse(rawFkEntite) : rawFkEntite as int) : null;
// Convertir fk_titre en int si présent
final dynamic rawFkTitre = userData['fk_titre'];
final int? fkTitre = rawFkTitre != null
? (rawFkTitre is String ? int.parse(rawFkTitre) : rawFkTitre as int)
: null;
final int? fkTitre = rawFkTitre != null ? (rawFkTitre is String ? int.parse(rawFkTitre) : rawFkTitre as int) : null;
// Traiter les dates si présentes
DateTime? dateNaissance;
if (userData['date_naissance'] != null &&
userData['date_naissance'] != '') {
if (userData['date_naissance'] != null && userData['date_naissance'] != '') {
try {
dateNaissance = DateTime.parse(userData['date_naissance']);
} catch (e) {
@@ -1929,8 +1852,7 @@ class UserRepository extends ChangeNotifier {
isActive: true,
isSynced: true,
sessionId: sessionId,
sessionExpiry:
sessionExpiry != null ? DateTime.parse(sessionExpiry) : null,
sessionExpiry: sessionExpiry != null ? DateTime.parse(sessionExpiry) : null,
sectName: userData['sect_name'],
fkEntite: fkEntite,
fkTitre: fkTitre,