Просмотр исходного кода

Se empezó a implementar las validaciones con permisos

OscarGil03 месяцев назад: 6
Родитель
Сommit
5df5fa09c2

+ 4 - 0
lib/models/usuario_model.dart

@@ -23,6 +23,10 @@ class Usuario extends Basico {
   int? idSucursal;
   int? idSucursal;
   String? turno;
   String? turno;
   List<String>? permisos;
   List<String>? permisos;
+  static const VER_CATEGORIAS = 'VER_CATEGORIAS';
+  static const VER_DESC_APP = 'VER_DESC_APP';
+  static const VER_SUCURSALES = 'VER_SUCURSALES';
+  static const VER_ADMIN = 'VER_ADMIN';
 
 
   Usuario({
   Usuario({
     super.id,
     super.id,

+ 3 - 3
lib/services/repo_service.dart

@@ -962,9 +962,9 @@ class RepoService<T> {
   Future<void> sincronizarProductos(List<Producto> productosApi) async {
   Future<void> sincronizarProductos(List<Producto> productosApi) async {
     var db = await RepoService().db;
     var db = await RepoService().db;
 
 
-    // Print del JSON recibido
-    print(
-        "Productos API recibidos: ${productosApi.map((e) => e.toJson()).toList()}");
+    // // Print del JSON recibido
+    // print(
+    //     "Productos API recibidos: ${productosApi.map((e) => e.toJson()).toList()}");
 
 
     var productosLocalesQuery = await db!.query('Producto');
     var productosLocalesQuery = await db!.query('Producto');
     List<Producto> productosLocales =
     List<Producto> productosLocales =

+ 30 - 0
lib/viewmodels/permiso_view_model.dart

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
 import 'package:sqflite/sqflite.dart';
 import 'package:sqflite/sqflite.dart';
 
 
 import '../data/api_response.dart';
 import '../data/api_response.dart';
+import '../data/session/session_storage.dart';
 import '../services/base_service.dart';
 import '../services/base_service.dart';
 import '../models/models.dart';
 import '../models/models.dart';
 import '../services/services.dart';
 import '../services/services.dart';
@@ -26,6 +27,9 @@ class PermisoViewModel extends ChangeNotifier {
   int get totalPermisos => _totalPermisos;
   int get totalPermisos => _totalPermisos;
   int get totalPages => (_totalPermisos / _limit).ceil();
   int get totalPages => (_totalPermisos / _limit).ceil();
 
 
+  List<String> _userPermisos = [];
+  List<String> get userPermisos => _userPermisos;
+
   setBusqueda(String value) {
   setBusqueda(String value) {
     _busqueda = value;
     _busqueda = value;
     notifyListeners();
     notifyListeners();
@@ -68,4 +72,30 @@ class PermisoViewModel extends ChangeNotifier {
     _isLoading = false;
     _isLoading = false;
     notifyListeners();
     notifyListeners();
   }
   }
+
+  Future<void> fetchUserPermisos() async {
+    _isLoading = true;
+    notifyListeners();
+
+    try {
+      int? userId = await SessionStorage().getId();
+      if (userId != null) {
+        var db = await RepoService().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();
+    }
+  }
 }
 }

+ 6 - 0
lib/views/home/home_screen.dart

@@ -27,6 +27,12 @@ class Formulario extends State<HomeScreen> {
     WidgetsBinding.instance.addPostFrameCallback((_) {
     WidgetsBinding.instance.addPostFrameCallback((_) {
       Provider.of<ProductoViewModel>(context, listen: false)
       Provider.of<ProductoViewModel>(context, listen: false)
           .sincronizarProductosYCategorias();
           .sincronizarProductosYCategorias();
+
+      final permisoViewModel =
+          Provider.of<PermisoViewModel>(context, listen: false);
+      if (permisoViewModel.userPermisos.isEmpty) {
+        permisoViewModel.fetchUserPermisos();
+      }
     });
     });
   }
   }
 
 

+ 5 - 5
lib/views/login/login_screen.dart

@@ -33,6 +33,11 @@ class _LoginScreenState extends State<LoginScreen> {
       final loginViewModel =
       final loginViewModel =
           Provider.of<LoginViewModel>(context, listen: false);
           Provider.of<LoginViewModel>(context, listen: false);
 
 
+      Provider.of<PermisoViewModel>(context, listen: false)
+          .sincronizarPermisos();
+      Provider.of<UsuarioViewModel>(context, listen: false)
+          .sincronizarUsuarios();
+
       // Verificar la sesión
       // Verificar la sesión
       loginViewModel.checkSession().then((_) {
       loginViewModel.checkSession().then((_) {
         if (loginViewModel.status == Status.authenticated) {
         if (loginViewModel.status == Status.authenticated) {
@@ -55,11 +60,6 @@ class _LoginScreenState extends State<LoginScreen> {
               );
               );
             });
             });
           });
           });
-
-          Provider.of<PermisoViewModel>(context, listen: false)
-              .sincronizarPermisos();
-          Provider.of<UsuarioViewModel>(context, listen: false)
-              .sincronizarUsuarios();
         }
         }
       });
       });
     });
     });

+ 29 - 23
lib/widgets/app_drawer.dart

@@ -8,8 +8,10 @@ import 'package:yoshi_papas_app/views/sucursal/sucursal_screen.dart';
 import 'package:yoshi_papas_app/views/variable/variable_screen.dart';
 import 'package:yoshi_papas_app/views/variable/variable_screen.dart';
 import 'package:yoshi_papas_app/views/venta/venta_screen.dart';
 import 'package:yoshi_papas_app/views/venta/venta_screen.dart';
 import 'package:provider/provider.dart';
 import 'package:provider/provider.dart';
+import '../models/models.dart';
 import '../themes/themes.dart';
 import '../themes/themes.dart';
 import '../viewmodels/login_view_model.dart';
 import '../viewmodels/login_view_model.dart';
+import '../viewmodels/viewmodels.dart';
 import '../views/descuento/descuento_screen.dart';
 import '../views/descuento/descuento_screen.dart';
 import 'widgets_components.dart';
 import 'widgets_components.dart';
 
 
@@ -47,6 +49,8 @@ class AppDrawer extends StatelessWidget {
 
 
   @override
   @override
   Widget build(BuildContext context) {
   Widget build(BuildContext context) {
+    final permisoViewModel = Provider.of<PermisoViewModel>(context);
+    final userPermisos = permisoViewModel.userPermisos;
     return Drawer(
     return Drawer(
       surfaceTintColor: Colors.white,
       surfaceTintColor: Colors.white,
       backgroundColor: Colors.white,
       backgroundColor: Colors.white,
@@ -106,19 +110,20 @@ class AppDrawer extends StatelessWidget {
                     ),
                     ),
                   },
                   },
                 ),
                 ),
-                ListTile(
-                  leading:
-                      circulo(const Icon(Icons.format_list_bulleted_rounded)),
-                  title: const Text('Categoría Producto'),
-                  onTap: () => {
-                    Navigator.pop(context),
-                    Navigator.of(context).push(
-                      MaterialPageRoute(
-                        builder: (context) => CategoriaProductoScreen(),
+                if (userPermisos.contains(Usuario.VER_CATEGORIAS))
+                  ListTile(
+                    leading:
+                        circulo(const Icon(Icons.format_list_bulleted_rounded)),
+                    title: const Text('Categoría Producto'),
+                    onTap: () => {
+                      Navigator.pop(context),
+                      Navigator.of(context).push(
+                        MaterialPageRoute(
+                          builder: (context) => CategoriaProductoScreen(),
+                        ),
                       ),
                       ),
-                    ),
-                  },
-                ),
+                    },
+                  ),
                 ListTile(
                 ListTile(
                   leading: circulo(const Icon(Icons.receipt_long_outlined)),
                   leading: circulo(const Icon(Icons.receipt_long_outlined)),
                   title: const Text('Pedidos Por Día'),
                   title: const Text('Pedidos Por Día'),
@@ -159,18 +164,19 @@ class AppDrawer extends StatelessWidget {
                         ),
                         ),
                       },
                       },
                     ),
                     ),
-                    ListTile(
-                      leading: circulo(const Icon(Icons.storefront_outlined)),
-                      title: const Text('Sucursales'),
-                      onTap: () => {
-                        Navigator.pop(context),
-                        Navigator.of(context).push(
-                          MaterialPageRoute(
-                            builder: (context) => SucursalesPage(),
+                    if (userPermisos.contains(Usuario.VER_SUCURSALES))
+                      ListTile(
+                        leading: circulo(const Icon(Icons.storefront_outlined)),
+                        title: const Text('Sucursales'),
+                        onTap: () => {
+                          Navigator.pop(context),
+                          Navigator.of(context).push(
+                            MaterialPageRoute(
+                              builder: (context) => SucursalesPage(),
+                            ),
                           ),
                           ),
-                        ),
-                      },
-                    ),
+                        },
+                      ),
                   ],
                   ],
                 ),
                 ),
                 ListTile(
                 ListTile(