You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

231 lines
8.0 KiB

import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:youmazgestion/Models/users.dart';
import 'package:youmazgestion/Services/stock_managementDatabase.dart';
//import 'package:youmazgestion/Services/app_database.dart';
class UserController extends GetxController {
final _username = ''.obs;
final _email = ''.obs;
final _role = ''.obs;
final _name = ''.obs;
final _lastname = ''.obs;
final _password = ''.obs;
final _userId = 0.obs; // ✅ Ajout de l'ID utilisateur
final _pointDeVenteId = 0.obs;
final _pointDeVenteDesignation = ''.obs;
String get username => _username.value;
String get email => _email.value;
String get role => _role.value;
String get name => _name.value;
String get lastname => _lastname.value;
String get password => _password.value;
int get userId => _userId.value;
int get pointDeVenteId => _pointDeVenteId.value;
String get pointDeVenteDesignation => _pointDeVenteDesignation.value;
@override
void onInit() {
super.onInit();
loadUserData(); // Charger les données au démarrage
}
// ✅ CORRECTION : Charger les données complètes depuis SharedPreferences ET la base de données
Future<void> loadUserData() async {
try {
final prefs = await SharedPreferences.getInstance();
final storedUsername = prefs.getString('username') ?? '';
final storedRole = prefs.getString('role') ?? '';
final storedUserId = prefs.getInt('user_id') ?? 0;
final storedPointDeVenteId = prefs.getInt('point_de_vente_id') ?? 0;
final storedPointDeVenteDesignation = prefs.getString('point_de_vente_designation') ?? '';
if (storedUsername.isNotEmpty) {
try {
Users user = await AppDatabase.instance.getUser(storedUsername);
_username.value = user.username;
_email.value = user.email;
_name.value = user.name;
_lastname.value = user.lastName;
_password.value = user.password;
_role.value = storedRole;
_userId.value = storedUserId;
_pointDeVenteId.value = storedPointDeVenteId;
_pointDeVenteDesignation.value = storedPointDeVenteDesignation;
// Si la désignation n'est pas sauvegardée, on peut la récupérer
if (_pointDeVenteDesignation.value.isEmpty && _pointDeVenteId.value > 0) {
await loadPointDeVenteDesignation();
}
} catch (dbError) {
// Fallback
_username.value = storedUsername;
_email.value = prefs.getString('email') ?? '';
_role.value = storedRole;
_name.value = prefs.getString('name') ?? '';
_lastname.value = prefs.getString('lastname') ?? '';
_userId.value = storedUserId;
_pointDeVenteId.value = storedPointDeVenteId;
_pointDeVenteDesignation.value = storedPointDeVenteDesignation;
}
}
} catch (e) {
print('❌ Erreur lors du chargement des données utilisateur: $e');
}
}
Future<void> loadPointDeVenteDesignation() async {
if (_pointDeVenteId.value <= 0) return;
try {
final pointDeVente = await AppDatabase.instance.getPointDeVenteById(_pointDeVenteId.value);
if (pointDeVente != null) {
_pointDeVenteDesignation.value = pointDeVente['designation'] as String;
await saveUserData(); // Sauvegarder la désignation
}
} catch (e) {
print('❌ Erreur lors du chargement de la désignation du point de vente: $e');
}
}
// ✅ NOUVELLE MÉTHODE : Mise à jour complète avec Users + credentials
void setUserWithCredentials(Users user, String role, int userId) {
_username.value = user.username;
_email.value = user.email;
_role.value = role; // Rôle depuis les credentials
_name.value = user.name;
_lastname.value = user.lastName;
_password.value = user.password;
_userId.value = userId; // ID depuis les credentials
_pointDeVenteId.value = user.pointDeVenteId ?? 0;
print("✅ Utilisateur mis à jour avec credentials:");
print(" Username: ${_username.value}");
print(" Name: ${_name.value}");
print(" Email: ${_email.value}");
print(" Role: ${_role.value}");
print(" UserID: ${_userId.value}");
// Sauvegarder dans SharedPreferences
saveUserData();
}
// ✅ MÉTHODE EXISTANTE AMÉLIORÉE
void setUser(Users user) {
_username.value = user.username;
_email.value = user.email;
_role.value = user.role;
_name.value = user.name;
_lastname.value = user.lastName;
_password.value = user.password;
// Note: _userId reste inchangé si pas fourni
print("✅ Utilisateur mis à jour (méthode legacy):");
print(" Username: ${_username.value}");
print(" Role: ${_role.value}");
// Sauvegarder dans SharedPreferences
saveUserData();
}
// ✅ CORRECTION : Sauvegarder TOUTES les données importantes
Future<void> saveUserData() async {
try {
final prefs = await SharedPreferences.getInstance();
await prefs.setString('username', _username.value);
await prefs.setString('email', _email.value);
await prefs.setString('role', _role.value);
await prefs.setString('name', _name.value);
await prefs.setString('lastname', _lastname.value);
await prefs.setInt('user_id', _userId.value);
await prefs.setInt('point_de_vente_id', _pointDeVenteId.value);
await prefs.setString('point_de_vente_designation', _pointDeVenteDesignation.value);
print("✅ Données sauvegardées avec succès dans SharedPreferences");
} catch (e) {
print('❌ Erreur lors de la sauvegarde des données utilisateur: $e');
}
}
// ✅ CORRECTION : Vider TOUTES les données (SharedPreferences + Observables)
Future<void> clearUserData() async {
try {
final prefs = await SharedPreferences.getInstance();
await prefs.remove('username');
await prefs.remove('email');
await prefs.remove('role');
await prefs.remove('name');
await prefs.remove('lastname');
await prefs.remove('user_id');
await prefs.remove('point_de_vente_id');
await prefs.remove('point_de_vente_designation');
_username.value = '';
_email.value = '';
_role.value = '';
_name.value = '';
_lastname.value = '';
_password.value = '';
_userId.value = 0;
_pointDeVenteId.value = 0;
_pointDeVenteDesignation.value = '';
} catch (e) {
print('❌ Erreur lors de l\'effacement des données utilisateur: $e');
}
}
// ✅ MÉTHODE UTILITAIRE : Vérifier si un utilisateur est connecté
bool get isLoggedIn => _username.value.isNotEmpty && _userId.value > 0;
// ✅ MÉTHODE UTILITAIRE : Obtenir le nom complet
String get fullName => '${_name.value} ${_lastname.value}'.trim();
Future<bool> hasPermission(String permission, String route) async {
try {
if (_username.value.isEmpty) {
print('⚠️ Username vide, rechargement des données...');
await loadUserData();
}
if (_username.value.isEmpty) {
print('❌ Impossible de vérifier les permissions : utilisateur non connecté');
return false;
}
return await AppDatabase.instance.hasPermission(username, permission, route);
} catch (e) {
print('❌ Erreur vérification permission: $e');
return false; // Sécurité : refuser l'accès en cas d'erreur
}
}
Future<bool> hasAnyPermission(List<String> permissionNames, String menuRoute) async {
for (String permissionName in permissionNames) {
if (await hasPermission(permissionName, menuRoute)) {
return true;
}
}
return false;
}
// ✅ MÉTHODE DEBUG : Afficher l'état actuel
void debugPrintUserState() {
print("=== ÉTAT UTILISATEUR ===");
print("Username: ${_username.value}");
print("Name: ${_name.value}");
print("Lastname: ${_lastname.value}");
print("Email: ${_email.value}");
print("Role: ${_role.value}");
print("UserID: ${_userId.value}");
print("PointDeVenteID: ${_pointDeVenteId.value}");
print("PointDeVente: ${_pointDeVenteDesignation.value}");
print("IsLoggedIn: $isLoggedIn");
print("========================");
}
}