Selaa lähdekoodia

Login funcional

OscarGil03 2 kuukautta sitten
vanhempi
commit
492f24b6ce

+ 4 - 3
lib/core/services/services.dart

@@ -1,5 +1,6 @@
-export '../services/base_service.dart';
-export '../services/login_service.dart';
-export '../services/profile_service.dart';
+export 'base_service.dart';
+export 'login_service.dart';
+export 'profile_service.dart';
 export 'database_service.dart';
 export 'api_response.dart';
+export 'session_storage.dart';

+ 3 - 2
lib/main.dart

@@ -7,8 +7,7 @@ import 'dart:io';
 import 'mvvm/views/home/home_screen.dart';
 import 'mvvm/views/login/login_screen.dart';
 import '/utils/themes.dart';
-import 'mvvm/viewmodels/login_view_model.dart';
-import 'mvvm/viewmodels/sucursal_view_model.dart';
+import 'mvvm/viewmodels/viewmodels.dart';
 import 'package:timezone/data/latest.dart' as tzdata;
 
 void main() async {
@@ -28,6 +27,8 @@ void main() async {
     runApp(MultiProvider(providers: [
       ChangeNotifierProvider(create: (_) => LoginViewModel()),
       ChangeNotifierProvider(create: (_) => SucursalViewModel()),
+      ChangeNotifierProvider(create: (_) => PermisoViewModel()),
+      ChangeNotifierProvider(create: (_) => UsuarioViewModel()),
       // Agrega aquí cualquier otro provider que necesites
     ], child: const MyApp()));
   });

+ 97 - 0
lib/mvvm/viewmodels/permiso_view_model.dart

@@ -0,0 +1,97 @@
+import 'package:flutter/material.dart';
+import 'package:sqflite/sqflite.dart';
+
+import '../../core/services/services.dart';
+import '../../core/models/models.dart';
+
+class PermisoViewModel extends ChangeNotifier {
+  List<Permiso> _permisos = [];
+  bool _isLoading = false;
+  Permiso? _selectedPermiso;
+
+  String _busqueda = "";
+  String get busqueda => _busqueda;
+
+  List<Permiso> get permisos => _permisos;
+  bool get isLoading => _isLoading;
+
+  int _currentPage = 1;
+  int _totalPermisos = 0;
+  int _limit = 10;
+
+  int get currentPage => _currentPage;
+  int get totalPermisos => _totalPermisos;
+  int get totalPages => (_totalPermisos / _limit).ceil();
+
+  List<String> _userPermisos = [];
+  List<String> get userPermisos => _userPermisos;
+
+  setBusqueda(String value) {
+    _busqueda = value;
+    notifyListeners();
+  }
+
+  void selectPermiso(Permiso permiso) {
+    _selectedPermiso = permiso;
+    notifyListeners();
+  }
+
+  Future<void> fetchLocalAll({int page = 1}) async {
+    _currentPage = page;
+    var db = await DatabaseService().db;
+
+    int? count = Sqflite.firstIntValue(
+        await db!.rawQuery('SELECT COUNT(*) FROM Permiso'));
+    _totalPermisos = count ?? 0;
+
+    int offset = (_limit * (page - 1));
+
+    var query = await db.query('Permiso',
+        orderBy: 'id asc', limit: _limit, offset: offset);
+    _permisos = query.map((element) => Permiso.fromJson(element)).toList();
+    notifyListeners();
+  }
+
+  Future<void> sincronizarPermisos() async {
+    _isLoading = true;
+    notifyListeners();
+    try {
+      final response = ApiResponse(await BaseService().get('/pos/permiso'));
+      if (response.isOk && response.resultados != null) {
+        _permisos =
+            response.resultados!.map((json) => Permiso.fromJson(json)).toList();
+        await DatabaseService().sincronizarPermisos(_permisos);
+      }
+    } catch (e) {
+      print('Error fetching permisos: $e');
+    }
+    _isLoading = false;
+    notifyListeners();
+  }
+
+  Future<void> fetchUserPermisos() async {
+    _isLoading = true;
+    notifyListeners();
+
+    try {
+      int? userId = await SessionStorage().getId();
+      if (userId != null) {
+        var db = await DatabaseService().db;
+
+        var query = await db!.query(
+          'UsuarioPermiso',
+          where: 'idUsuario = ?',
+          whereArgs: [userId],
+        );
+
+        _userPermisos =
+            query.map((row) => row['idPermiso'].toString()).toList();
+      }
+    } catch (e) {
+      print('Error fetching user permisos: $e');
+    } finally {
+      _isLoading = false;
+      notifyListeners();
+    }
+  }
+}

+ 64 - 0
lib/mvvm/viewmodels/usuarios_view_model.dart

@@ -0,0 +1,64 @@
+import 'dart:convert';
+
+import 'package:flutter/material.dart';
+import 'package:sqflite/sqflite.dart';
+
+import '../../core/services/services.dart';
+import '../../core/models/models.dart';
+
+class UsuarioViewModel extends ChangeNotifier {
+  List<Usuario> _usuarios = [];
+  bool _isLoading = false;
+
+  List<Usuario> get usuarios => _usuarios;
+  bool get isLoading => _isLoading;
+
+  int _currentPage = 1;
+  int _totalProducts = 0;
+  int _limit = 10;
+
+  int get currentPage => _currentPage;
+  int get totalProducts => _totalProducts;
+  int get totalPages => (_totalProducts / _limit).ceil();
+
+  Future<void> fetchLocalAll({int page = 1}) async {
+    _currentPage = page;
+    var db = await DatabaseService().db;
+    int? count = Sqflite.firstIntValue(
+        await db!.rawQuery('SELECT COUNT(*) FROM Usuario'));
+    _totalProducts = count ?? 0;
+
+    int offset = (_limit * (page - 1));
+
+    var query = await db.query('Usuario',
+        where: 'eliminado IS NULL',
+        orderBy: 'id asc',
+        limit: _limit,
+        offset: offset);
+    _usuarios = query.map((element) => Usuario.fromJson(element)).toList();
+
+    notifyListeners();
+  }
+
+  Future<bool> sincronizarUsuarios() async {
+    try {
+      Map<String, String> parametros = {"expand": 'permisos'};
+      final response = ApiResponse(
+          await BaseService().get('/pos/usuario', queryParameters: parametros));
+
+      if (response.isOk && response.resultados != null) {
+        List<Usuario> usuariosApi =
+            response.resultados!.map((json) => Usuario.fromApi(json)).toList();
+        if (usuariosApi.isNotEmpty) {
+          await DatabaseService().sincronizarUsuarios(usuariosApi);
+          notifyListeners();
+          return true;
+        }
+      }
+      return false;
+    } catch (e) {
+      print('Error al sincronizar usuarios: $e');
+      return false;
+    }
+  }
+}

+ 5 - 0
lib/mvvm/viewmodels/viewmodels.dart

@@ -0,0 +1,5 @@
+export '../viewmodels/login_view_model.dart';
+export '../viewmodels/sucursal_view_model.dart';
+export '../viewmodels/permiso_view_model.dart';
+export '../viewmodels/home_view_model.dart';
+export '../viewmodels/usuarios_view_model.dart';

+ 27 - 23
lib/mvvm/views/login/login_screen.dart

@@ -3,8 +3,7 @@ import 'package:provider/provider.dart';
 
 import '../../../core/models/models.dart';
 import '../../../utils/themes.dart';
-import '../../viewmodels/login_view_model.dart';
-import '../../viewmodels/sucursal_view_model.dart';
+import '../../viewmodels/viewmodels.dart';
 import '../../../utils/widgets/widgets.dart';
 import '../home/home_screen.dart';
 
@@ -36,29 +35,34 @@ class _LoginScreenState extends State<LoginScreen> {
       final loginViewModel =
           Provider.of<LoginViewModel>(context, listen: false);
 
+      Provider.of<PermisoViewModel>(context, listen: false)
+          .sincronizarPermisos();
+      Provider.of<UsuarioViewModel>(context, listen: false)
+          .sincronizarUsuarios();
+
       // Verificar la sesión
       loginViewModel.checkSession().then((_) {
-        // if (loginViewModel.status == Status.authenticated) {
-        print("Sesión activa detectada, redirigiendo al HomeScreen.");
-        Navigator.pushReplacement(
-          context,
-          MaterialPageRoute(builder: (context) => const HomeScreen()),
-        );
-        // } else {
-        //   print("No se detectó sesión, mostrando la pantalla de login.");
-        //   final sucursalViewModel =
-        //       Provider.of<SucursalViewModel>(context, listen: false);
-        //   sucursalViewModel.sincronizarSucursales().then((_) {
-        //     setState(() {
-        //       final sucursales = sucursalViewModel.sucursales;
-        //       _selectedSucursal = sucursales.firstWhere(
-        //         (sucursal) => sucursal.seleccionado == 1,
-        //         orElse: () =>
-        //             sucursales.isNotEmpty ? sucursales[0] : Sucursal(),
-        //       );
-        //     });
-        //   });
-        // }
+        if (loginViewModel.status == Status.authenticated) {
+          print("Sesión activa detectada, redirigiendo al HomeScreen.");
+          Navigator.pushReplacement(
+            context,
+            MaterialPageRoute(builder: (context) => const HomeScreen()),
+          );
+        } else {
+          print("No se detectó sesión, mostrando la pantalla de login.");
+          final sucursalViewModel =
+              Provider.of<SucursalViewModel>(context, listen: false);
+          sucursalViewModel.sincronizarSucursales().then((_) {
+            setState(() {
+              final sucursales = sucursalViewModel.sucursales;
+              _selectedSucursal = sucursales.firstWhere(
+                (sucursal) => sucursal.seleccionado == 1,
+                orElse: () =>
+                    sucursales.isNotEmpty ? sucursales[0] : Sucursal(),
+              );
+            });
+          });
+        }
       });
     });
   }