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

Sincronizacion de permisos, usuarios y usuarios permisos

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

+ 14 - 7
lib/models/basico_model.dart

@@ -54,13 +54,20 @@ class Basico {
     return origen.toString();
   }
 
-  static bool parseBolean(origen) {
-    if (origen == null) return false;
-    if (origen == "") return false;
-    if (origen == "null") return false;
-    if (origen == "false") return false;
-    if (origen.runtimeType.toString() == 'bool') return origen;
-    return bool.parse(origen.toString());
+  static bool? parseBolean(dynamic value) {
+    if (value == null) {
+      return null;
+    }
+    if (value is bool) {
+      return value;
+    }
+    if (value is int) {
+      return value == 1;
+    }
+    if (value is String) {
+      return value.toLowerCase() == 'true' || value == '1';
+    }
+    return null;
   }
 
   Map<String, dynamic> toJson() {

+ 2 - 0
lib/models/models.dart

@@ -19,3 +19,5 @@ export '../models/corte_caja_model.dart';
 export '../models/descuento_model.dart';
 export '../models/variable_model.dart';
 export '../models/sucursal_model.dart';
+export '../models/permiso_model.dart';
+export '../models/usuario_permiso_model.dart';

+ 76 - 0
lib/models/permiso_model.dart

@@ -0,0 +1,76 @@
+import 'package:yoshi_papas_app/models/models.dart';
+
+import '../services/services.dart';
+import 'basico_model.dart';
+
+class Permiso {
+  String? id;
+  String? idModulo;
+  String? nombre;
+  String? descripcion;
+  DateTime? eliminado;
+  DateTime? creado;
+  DateTime? modificado;
+
+  Permiso(
+      {this.id,
+      this.idModulo,
+      this.nombre,
+      this.descripcion,
+      this.eliminado,
+      this.creado,
+      this.modificado});
+
+  @override
+  Map<String, dynamic> toJson() {
+    return {
+      'id': id,
+      'idModulo': idModulo ?? '',
+      'nombre': nombre ?? '',
+      'descripcion': descripcion ?? '',
+      'creado': creado?.toIso8601String(),
+      'modificado': modificado?.toIso8601String(),
+      'eliminado': eliminado?.toIso8601String(),
+    };
+  }
+
+  Map<String, dynamic> toMap() {
+    return {
+      'id': id,
+      'idModulo': idModulo,
+      'nombre': nombre,
+      'descripcion': descripcion,
+      'creado': creado != null ? creado!.toIso8601String() : null,
+      'modificado': modificado != null ? modificado!.toIso8601String() : null,
+      'eliminado': eliminado != null ? eliminado!.toIso8601String() : null,
+    };
+  }
+
+  Permiso.fromJson(Map<String, dynamic> json) {
+    id = Basico.parseString(json['id']);
+    idModulo = Basico.parseString(json['idModulo']);
+    nombre = Basico.parseString(json['nombre']);
+    descripcion = Basico.parseString(json['descripcion']);
+    creado = json['creado'] != null ? Basico.parseDate(json['creado']) : creado;
+    eliminado = json['eliminado'] != null
+        ? Basico.parseDate(json['eliminado'])
+        : eliminado;
+    modificado = json['modificado'] != null
+        ? Basico.parseDate(json['modificado'])
+        : modificado;
+  }
+
+  Permiso.fromApi(Map<String, dynamic> json) {
+    id = Basico.parseString(json['id']);
+    idModulo = Basico.parseString(json['idModulo']);
+    nombre = Basico.parseString(json['nombre']);
+    descripcion = Basico.parseString(json['descripcion']);
+    creado = Basico.parseDate(json['creado']);
+    modificado = Basico.parseDate(json['modificado']);
+    eliminado = Basico.parseDate(json['eliminado']);
+  }
+
+  Future<void> guardar() async {
+    await RepoService().guardar(this);
+  }
+}

+ 132 - 21
lib/models/usuario_model.dart

@@ -1,47 +1,158 @@
+import '../models/models.dart';
+import '../services/repo_service.dart';
 import 'basico_model.dart';
 
 class Usuario extends Basico {
-  String? correo;
-  String? clave;
   String? nombre;
-  String? estatus;
-  String? telefono;
-  String? empresa;
-  String? rol;
+  String? apellidos;
+  String? correo;
+  String? celular;
+  String? celularPersonal;
+  int? rol;
+  bool? genero;
+  int? estatus;
+  String? imagen;
+  String? rfc;
+  String? razonSocial;
+  String? calle;
+  String? numeroExterior;
+  String? colonia;
+  String? codigoPostal;
+  int? idCiudad;
+  int? idEstado;
+  int? idSucursal;
+  String? turno;
+  List<String>? permisos;
 
   Usuario({
     super.id,
-    this.correo,
-    this.clave,
     this.nombre,
-    this.estatus,
-    this.telefono,
-    this.empresa,
+    this.apellidos,
+    this.correo,
+    this.celular,
+    this.celularPersonal,
     this.rol,
+    this.genero,
+    this.estatus,
+    this.imagen,
+    this.rfc,
+    this.razonSocial,
+    this.calle,
+    this.numeroExterior,
+    this.colonia,
+    this.codigoPostal,
+    this.idCiudad,
+    this.idEstado,
+    this.idSucursal,
+    this.turno,
+    this.permisos,
   });
 
   @override
   Map<String, dynamic> toJson() {
     return {
       'id': id,
-      'correo': correo,
-      'clave': clave,
       'nombre': nombre,
-      'estatus': estatus,
-      'telefono': telefono,
-      'empresa': empresa,
+      'apellidos': apellidos,
+      'correo': correo,
+      'celular': celular,
+      'celularPersonal': celularPersonal,
       'rol': rol,
+      'genero': genero != null ? (genero! ? 1 : 0) : null,
+      'estatus': estatus,
+      'imagen': imagen,
+      'rfc': rfc,
+      'razonSocial': razonSocial,
+      'calle': calle,
+      'numeroExterior': numeroExterior,
+      'colonia': colonia,
+      'codigoPostal': codigoPostal,
+      'idCiudad': idCiudad,
+      'idEstado': idEstado,
+      'idSucursal': idSucursal,
+      'turno': turno,
+      'creado': creado?.toIso8601String(),
+      'modificado': modificado?.toIso8601String(),
+      'eliminado': eliminado?.toIso8601String(),
     }..addAll(super.toJson());
   }
 
+  Map<String, dynamic> toMap() {
+    return {
+      'id': id,
+      'nombre': nombre,
+      'apellidos': apellidos,
+      'correo': correo,
+      'celular': celular,
+      'celularPersonal': celularPersonal,
+      'rol': rol,
+      'genero': genero,
+      'estatus': estatus,
+      'imagen': imagen,
+      'rfc': rfc,
+      'razonSocial': razonSocial,
+      'calle': calle,
+      'numeroExterior': numeroExterior,
+      'colonia': colonia,
+      'codigoPostal': codigoPostal,
+      'idCiudad': idCiudad,
+      'idEstado': idEstado,
+      'idSucursal': idSucursal,
+      'turno': turno,
+      'creado': creado != null ? creado!.toIso8601String() : null,
+      'modificado': modificado != null ? modificado!.toIso8601String() : null,
+      'eliminado': eliminado != null ? eliminado!.toIso8601String() : null,
+    };
+  }
+
   Usuario.fromJson(Map<String, dynamic> json) {
     super.parseJson(json);
+    nombre = Basico.parseString(json['nombre']);
+    apellidos = Basico.parseString(json['apellidos']);
     correo = Basico.parseString(json['correo']);
-    clave = Basico.parseString(json['clave']);
+    celular = Basico.parseString(json['celular']);
+    celularPersonal = Basico.parseString(json['celularPersonal']);
+    rol = Basico.parseInt(json['rol']);
+    genero = Basico.parseBolean(json['genero']);
+    estatus = Basico.parseInt(json['estatus']);
+    imagen = Basico.parseString(json['imagen']);
+    rfc = Basico.parseString(json['rfc']);
+    razonSocial = Basico.parseString(json['razonSocial']);
+    calle = Basico.parseString(json['calle']);
+    numeroExterior = Basico.parseString(json['numeroExterior']);
+    colonia = Basico.parseString(json['colonia']);
+    codigoPostal = Basico.parseString(json['codigoPostal']);
+    idCiudad = Basico.parseInt(json['idCiudad']);
+    idEstado = Basico.parseInt(json['idEstado']);
+    idSucursal = Basico.parseInt(json['idSucursal']);
+    turno = Basico.parseString(json['turno']);
+  }
+
+  Usuario.fromApi(Map<String, dynamic> json) {
+    super.parseJson(json);
     nombre = Basico.parseString(json['nombre']);
-    estatus = Basico.parseString(json['estatus']);
-    telefono = Basico.parseString(json['telefono']);
-    empresa = Basico.parseString(json['empresa']);
-    rol = Basico.parseString(json['rol']);
+    apellidos = Basico.parseString(json['apellidos']);
+    correo = Basico.parseString(json['correo']);
+    celular = Basico.parseString(json['celular']);
+    celularPersonal = Basico.parseString(json['celularPersonal']);
+    rol = Basico.parseInt(json['rol']);
+    genero = Basico.parseBolean(json['genero']);
+    estatus = Basico.parseInt(json['estatus']);
+    imagen = Basico.parseString(json['imagen']);
+    rfc = Basico.parseString(json['rfc']);
+    razonSocial = Basico.parseString(json['razonSocial']);
+    calle = Basico.parseString(json['calle']);
+    numeroExterior = Basico.parseString(json['numeroExterior']);
+    colonia = Basico.parseString(json['colonia']);
+    codigoPostal = Basico.parseString(json['codigoPostal']);
+    idCiudad = Basico.parseInt(json['idCiudad']);
+    idEstado = Basico.parseInt(json['idEstado']);
+    idSucursal = Basico.parseInt(json['idSucursal']);
+    turno = Basico.parseString(json['turno']);
+    permisos = (json['permisos'] as List).map((e) => e.toString()).toList();
+  }
+
+  Future<void> guardar() async {
+    idLocal = await RepoService().guardar(this);
   }
 }

+ 55 - 0
lib/models/usuario_permiso_model.dart

@@ -0,0 +1,55 @@
+import 'package:yoshi_papas_app/models/models.dart';
+
+import '../services/services.dart';
+import 'basico_model.dart';
+
+class UsuarioPermiso extends Basico {
+  int? idUsuario;
+  String? idPermiso;
+  DateTime? asignado;
+
+  UsuarioPermiso({super.id, this.idUsuario, this.idPermiso, this.asignado});
+
+  @override
+  Map<String, dynamic> toJson() {
+    return {
+      'id': id,
+      'idUsuario': idUsuario ?? 0,
+      'idPermiso': idPermiso ?? '',
+      'asignado': asignado?.toIso8601String(),
+      'modificado': modificado?.toIso8601String(),
+      'eliminado': eliminado?.toIso8601String(),
+    }..addAll(super.toJson());
+  }
+
+  Map<String, dynamic> toMap() {
+    return {
+      'id': id,
+      'idUsuario': idUsuario,
+      'idPermiso': idPermiso,
+      'asignado': asignado != null ? asignado!.toIso8601String() : null,
+      'modificado': modificado != null ? modificado!.toIso8601String() : null,
+      'eliminado': eliminado != null ? eliminado!.toIso8601String() : null,
+    };
+  }
+
+  UsuarioPermiso.fromJson(Map<String, dynamic> json) {
+    super.parseJson(json);
+    idUsuario = Basico.parseInt(json['idUsuario']);
+    idPermiso = Basico.parseString(json['idPermiso']);
+    asignado = Basico.parseDate(json['asignado']);
+  }
+
+  UsuarioPermiso.fromApi(Map<String, dynamic> json) {
+    super.parseJson(json);
+    idUsuario = Basico.parseInt(json['idUsuario']);
+    idPermiso = Basico.parseString(json['idPermiso']);
+    asignado = Basico.parseDate(json['asignado']);
+    modificado = Basico.parseDate(json['modificado']);
+    eliminado = Basico.parseDate(json['eliminado']);
+  }
+
+  Future<void> guardar() async {
+    idLocal = await RepoService().guardar(this);
+  }
+}

+ 164 - 44
lib/services/repo_service.dart

@@ -6,7 +6,7 @@ import 'package:sqflite/sqflite.dart';
 import '../models/models.dart';
 
 class RepoService<T> {
-  static int dbVersion = 16;
+  static int dbVersion = 17;
   static String dbName = 'joshipos026.db';
   static const String id = Basico.identificadorWeb;
   static const String idLocal = Basico.identificadorLocal;
@@ -500,6 +500,62 @@ class RepoService<T> {
         ''');
 
           break;
+
+        case 16:
+          await db.execute('''
+          CREATE TABLE Usuario (
+            id INTEGER PRIMARY KEY AUTOINCREMENT,
+            nombre TEXT,
+            apellidos TEXT,
+            correo TEXT,
+            celular TEXT,
+            celularPersonal TEXT,
+            rol INTEGER,
+            genero BOOLEAN,
+            estatus INTEGER,
+            imagen TEXT,
+            rfc TEXT,
+            razonSocial TEXT,
+            calle TEXT,
+            numeroExterior TEXT,
+            colonia TEXT,
+            codigoPostal TEXT,
+            idCiudad INTEGER,
+            idEstado INTEGER,
+            idSucursal INTEGER,
+            turno TEXT,
+            eliminado TEXT,
+            creado TEXT,
+            modificado TEXT,
+            idLocal INTEGER
+          )
+        ''');
+
+          await db.execute('''
+          CREATE TABLE Permiso (
+            id TEXT PRIMARY KEY,
+            idModulo TEXT,
+            nombre TEXT,
+            descripcion TEXT,
+            eliminado TEXT,
+            creado TEXT,
+            modificado TEXT
+          )
+        ''');
+
+          await db.execute('''
+          CREATE TABLE UsuarioPermiso (
+            id INTEGER PRIMARY KEY AUTOINCREMENT,
+            idUsuario INTEGER,
+            idPermiso TEXT,
+            asignado TEXT,
+            modificado TEXT,
+            eliminado TEXT,
+            idLocal INTEGER
+          )
+        ''');
+
+          break;
       }
       oldVersion++;
     }
@@ -509,15 +565,6 @@ class RepoService<T> {
     try {
       print("Guardando modelo en la base de datos: ${model.runtimeType}");
 
-      // Comprobar si es un modelo que obtiene las fechas del servidor (Producto o CategoriaProducto)
-      if (model is Producto || model is CategoriaProducto) {
-        // No hacer nada, las fechas vienen del servidor
-        print("Usando fechas del servidor para ${model.runtimeType}");
-      } else if (model is Basico) {
-        // Generar las fechas localmente para otros modelos
-        asignarFechasLocalmente(model);
-      }
-
       // Convertir el modelo a JSON para la base de datos
       String modelo = json.encode(model, toEncodable: toEncodable);
       print("Modelo convertido a JSON: $modelo");
@@ -526,30 +573,62 @@ class RepoService<T> {
       var dbClient = await db;
       String nombreTabla = model.runtimeType.toString();
 
-      int? id = modelMap['id'];
-
-      if (id == null || id == 0) {
-        modelMap.remove('id');
-      }
+      // Verificar si el modelo es de tipo Permiso (con id de tipo String)
+      if (model is Permiso) {
+        String? id = modelMap['id'];
 
-      List<Map> existing = id != null && id > 0
-          ? await dbClient!.query(nombreTabla, where: 'id = ?', whereArgs: [id])
-          : [];
+        if (id == null || id.isEmpty) {
+          throw Exception('El ID del permiso no puede ser nulo o vacío');
+        }
 
-      if (existing.isNotEmpty) {
-        print("Actualizando registro existente con ID: $id");
-        await dbClient!.update(
+        List<Map> existing = await dbClient!.query(
           nombreTabla,
-          modelMap,
           where: 'id = ?',
           whereArgs: [id],
         );
+
+        if (existing.isNotEmpty) {
+          print("Actualizando registro existente con ID: $id");
+          await dbClient!.update(
+            nombreTabla,
+            modelMap,
+            where: 'id = ?',
+            whereArgs: [id],
+          );
+        } else {
+          print(
+              "Insertando nuevo registro en la tabla $nombreTabla con ID: $id");
+          await dbClient!.insert(nombreTabla, modelMap);
+        }
+
+        return 1;
       } else {
-        print("Insertando nuevo registro en la tabla $nombreTabla");
-        id = await dbClient!.insert(nombreTabla, modelMap);
-      }
+        int? id = modelMap['id'];
+
+        if (id == null || id == 0) {
+          modelMap.remove('id');
+        }
+
+        List<Map> existing = id != null && id > 0
+            ? await dbClient!
+                .query(nombreTabla, where: 'id = ?', whereArgs: [id])
+            : [];
+
+        if (existing.isNotEmpty) {
+          print("Actualizando registro existente con ID: $id");
+          await dbClient!.update(
+            nombreTabla,
+            modelMap,
+            where: 'id = ?',
+            whereArgs: [id],
+          );
+        } else {
+          print("Insertando nuevo registro en la tabla $nombreTabla");
+          id = await dbClient!.insert(nombreTabla, modelMap);
+        }
 
-      return id!;
+        return id!;
+      }
     } catch (e) {
       print('Error al guardar en dynamic: $e');
       return 0;
@@ -627,24 +706,7 @@ class RepoService<T> {
 
   dynamic toEncodable(dynamic item) {
     print("Serializando objeto: $item");
-    if (item is Pedido) {
-      return item.toJson();
-    } else if (item is PedidoProducto) {
-      return item.toJson();
-    } else if (item is PedidoProductoTopping) {
-      return item.toJson();
-    } else if (item is Producto) {
-      return item.toJson();
-    } else if (item is CategoriaProducto) {
-      return item.toJson();
-    } else if (item is Sucursal) {
-      print("Serializando Sucursal: ${item.nombre}, ${item.descripcion}");
-      return item.toJson();
-    } else if (item is Variable) {
-      return item.toJson();
-    }
-    throw UnsupportedError(
-        'Type not supported for serialization: ${item.runtimeType}');
+    return item.toJson();
   }
 
   Future<List<T>> obtenerTodos({String orderBy = 'id DESC'}) async {
@@ -661,6 +723,8 @@ class RepoService<T> {
         return Pedido.fromJson(map) as T;
       case Producto:
         return Producto.fromJson(map) as T;
+      case Usuario:
+        return Usuario.fromJson(map) as T;
       default:
         throw Exception('Tipo no soportado');
     }
@@ -959,4 +1023,60 @@ class RepoService<T> {
       }
     }
   }
+
+  Future<void> sincronizarPermisos(List<Permiso> permisosApi) async {
+    var db = await RepoService().db;
+    var permisosLocalesQuery = await db!.query('Permiso');
+    List<Permiso> permisosLocales =
+        permisosLocalesQuery.map((e) => Permiso.fromJson(e)).toList();
+
+    for (var permisoApi in permisosApi) {
+      var permisoLocal = permisosLocales.firstWhere(
+        (permiso) => permiso.id == permisoApi.id,
+        orElse: () => Permiso(),
+      );
+
+      if (permisoLocal.id != null && permisoApi.modificado != null) {
+        await RepoService().guardar(permisoApi);
+      } else if (permisoLocal.id == null) {
+        await RepoService().guardar(permisoApi);
+      }
+    }
+  }
+
+  Future<void> sincronizarUsuarios(List<Usuario> usuariosApi) async {
+    var db = await RepoService().db;
+
+    var usuariosLocalesQuery = await db!.query('Usuario');
+    List<Usuario> usuariosLocales =
+        usuariosLocalesQuery.map((e) => Usuario.fromJson(e)).toList();
+
+    for (var usuarioApi in usuariosApi) {
+      var usuarioLocal = usuariosLocales.firstWhere(
+        (usuario) => usuario.id == usuarioApi.id,
+        orElse: () => Usuario(),
+      );
+
+      if (usuarioLocal.id != 0) {
+        await RepoService().guardar(usuarioApi);
+        await _guardarPermisosUsuario(db, usuarioApi.id!, usuarioApi.permisos!);
+      } else {
+        await RepoService().guardar(usuarioApi);
+        await _guardarPermisosUsuario(db, usuarioApi.id!, usuarioApi.permisos!);
+      }
+    }
+  }
+
+  Future<void> _guardarPermisosUsuario(
+      Database db, int idUsuario, List<String> permisos) async {
+    await db.delete('UsuarioPermiso',
+        where: 'idUsuario = ?', whereArgs: [idUsuario]);
+
+    for (var idPermiso in permisos) {
+      await db.insert('UsuarioPermiso', {
+        'idUsuario': idUsuario,
+        'idPermiso': idPermiso,
+      });
+    }
+  }
 }

+ 71 - 0
lib/viewmodels/permiso_view_model.dart

@@ -0,0 +1,71 @@
+import 'package:flutter/material.dart';
+import 'package:sqflite/sqflite.dart';
+
+import '../data/api_response.dart';
+import '../services/base_service.dart';
+import '../models/models.dart';
+import '../services/services.dart';
+import '../services/repo_service.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();
+
+  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 RepoService().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 RepoService().sincronizarPermisos(_permisos);
+      }
+    } catch (e) {
+      print('Error fetching permisos: $e');
+    }
+    _isLoading = false;
+    notifyListeners();
+  }
+}

+ 1 - 1
lib/viewmodels/producto_view_model.dart

@@ -50,7 +50,7 @@ class ProductoViewModel<T> extends ChangeNotifier {
 
     var query = await db.query('Producto',
         where: 'eliminado IS NULL',
-        orderBy: 'idLocal asc',
+        orderBy: 'id asc',
         limit: _limit,
         offset: offset);
     _productos = query.map((element) => Producto.fromJson(element)).toList();

+ 41 - 133
lib/viewmodels/usuarios_view_model.dart

@@ -1,158 +1,66 @@
 import 'dart:convert';
 
 import 'package:flutter/material.dart';
+import 'package:sqflite/sqflite.dart';
 
+import '../data/api_response.dart';
 import '../models/models.dart';
 import '../services/base_service.dart';
+import '../services/repo_service.dart';
 
-class UsuariosViewModel extends ChangeNotifier {
-  String _busqueda = "";
-  String get busqueda => _busqueda;
-  List<Usuario> _registros = [];
-  List<Usuario> get registros => _registros;
-  Usuario? _selectedModelo;
-  Usuario? get selectedModelo => _selectedModelo;
+class UsuarioViewModel extends ChangeNotifier {
+  List<Usuario> _usuarios = [];
   bool _isLoading = false;
-  bool get isLoading => _isLoading;
-
-  Map<String, bool> _selectedPermisos = {};
-  Map<String, bool> get selectedPermisos => _selectedPermisos;
 
-  Future<void> fetchRegistros() async {
-    Map<String, String> parametros = {
-      "ordenar": "id-desc",
-      "expand": "empresas"
-    };
-    if (_busqueda.isNotEmpty) {
-      parametros = {
-        "ordenar": "id-desc",
-        "limite": "-1",
-        "q": _busqueda,
-        "expand": "empresas"
-      };
-    }
-    var r =
-        await BaseService().get("admin/usuario", queryParameters: parametros);
-    Map<String, dynamic> resJson = jsonDecode(r.body);
-    try {
-      List<Usuario> aux = [];
-      if (r.statusCode == 200) {
-        for (var x in resJson['resultado']) {
-          Usuario modelo = Usuario.fromJson(x);
-          aux.add(modelo);
-        }
-      }
-      _registros = aux;
-      notifyListeners();
-    } catch (e) {
-      print(e);
-    }
-  }
+  List<Usuario> get usuarios => _usuarios;
+  bool get isLoading => _isLoading;
 
-  Future<void> cargarPermisosUsuario(int usuarioId) async {
-    setIsLoading(true);
-    try {
-      var response = await BaseService().get("admin/usuario",
-          queryParameters: {'expand': 'permisos', 'id': '$usuarioId'});
-      Map<String, dynamic> resJson = jsonDecode(response.body);
+  int _currentPage = 1;
+  int _totalProducts = 0;
+  int _limit = 10;
 
-      List<dynamic> permisosUsuario = resJson['resultado'][0]['permisos'];
-      Map<String, bool> permisosActualizados = {};
+  int get currentPage => _currentPage;
+  int get totalProducts => _totalProducts;
+  int get totalPages => (_totalProducts / _limit).ceil();
 
-      for (var permiso in permisosUsuario) {
-        String permisoId = permiso.toString();
-        permisosActualizados[permisoId] = true;
-      }
+  Future<void> fetchLocalAll({int page = 1}) async {
+    _currentPage = page;
+    var db = await RepoService().db;
+    int? count = Sqflite.firstIntValue(
+        await db!.rawQuery('SELECT COUNT(*) FROM Usuario'));
+    _totalProducts = count ?? 0;
 
-      _selectedPermisos = permisosActualizados;
-      // print(_selectedPermisos);
-      notifyListeners(); // Avisar a los widgets que escuchan sobre el cambio
-    } catch (e) {
-      print("Error al cargar los permisos del usuario: $e");
-    } finally {
-      setIsLoading(false);
-    }
-  }
+    int offset = (_limit * (page - 1));
 
-  void setSelectedPermisos(Map<String, bool> permisos) {
-    _selectedPermisos = permisos;
-    notifyListeners();
-  }
+    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();
 
-  Future<void> guardarModelo({
-    required Usuario modelo,
-    required String nombre,
-    required String correo,
-    required String telefono,
-  }) async {
-    //?TEMPORAL
-    modelo.nombre = nombre;
-    modelo.correo = correo;
-    modelo.telefono = telefono;
-    modelo.creado = DateTime.now();
     notifyListeners();
   }
 
-  Future<void> guardarUsuario({
-    required Usuario modelo,
-    required String nombre,
-    required String correo,
-    required List<String> permisosSeleccionados,
-  }) async {
-    setIsLoading(true);
+  Future<bool> sincronizarUsuarios() async {
     try {
-      var requestBody = {
-        'nombre': nombre,
-        'correo': correo,
-        'permisos': permisosSeleccionados,
-      };
-
-      if (modelo.id != null) {
-        requestBody['id'] = modelo.id;
-      }
-
-      var r =
-          await BaseService().post("admin/usuario/guardar", body: requestBody);
-      if (r.statusCode == 200) {
-        print('Usuario guardado exitosamente');
-      } else {
-        throw Exception('Error al guardar el usuario: ${r.statusCode}');
+      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 RepoService().sincronizarUsuarios(usuariosApi);
+          notifyListeners();
+          return true;
+        }
       }
+      return false;
     } catch (e) {
-      print('Error al guardar el usuario: $e');
-    } finally {
-      setIsLoading(false);
-    }
-  }
-
-  bool validarUsuario({
-    required String nombre,
-    required String correo,
-  }) {
-    if (nombre.isEmpty || correo.isEmpty) {
+      print('Error al sincronizar usuarios: $e');
       return false;
     }
-    return true;
-  }
-
-  setIsLoading(bool loading) {
-    _isLoading = loading;
-    notifyListeners();
-  }
-
-  selectUsuario(Usuario? usuario) {
-    _selectedModelo = usuario;
-    notifyListeners();
-  }
-
-  setBusqueda(String value) {
-    _busqueda = value;
-    notifyListeners();
-  }
-
-  Future usuarioEmpresa(int idUsuario, String idEmpresa) async {
-    var r = await BaseService().post("admin/usuario/usuario-empresa",
-        body: {"idUsuario": idUsuario, "idEmpresa": idEmpresa});
-    if (r.statusCode == 200) {}
   }
 }

+ 1 - 0
lib/viewmodels/viewmodels.dart

@@ -10,3 +10,4 @@ export '../viewmodels/pedido_view_model.dart';
 export '../viewmodels/descuento_view_model.dart';
 export '../viewmodels/variable_view_model.dart';
 export '../viewmodels/sucursal_view_model.dart';
+export '../viewmodels/permiso_view_model.dart';

+ 0 - 49
lib/views/main/main_screen.dart

@@ -1,49 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:provider/provider.dart';
-import 'package:yoshi_papas_app/views/pedido/pedido_screen.dart';
-
-import '../../viewmodels/viewmodels.dart';
-import '../../views/login/login_screen.dart';
-import '../home/home_screen.dart';
-
-class MainScreen extends StatefulWidget {
-  const MainScreen({super.key});
-
-  @override
-  MainScreenState createState() => MainScreenState();
-}
-
-class MainScreenState extends State<MainScreen> {
-  @override
-  void initState() {
-    super.initState();
-    Future(() async {
-      Provider.of<LoginViewModel>(context, listen: false).checkSession();
-    });
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    return const HomeScreen();
-    // return Consumer(builder: (context, LoginViewModel login, _) {
-    //   switch (login.status) {
-    //     case Status.uninitialized:
-    //       return const Scaffold(
-    //         body: Center(
-    //           child: CircularProgressIndicator(),
-    //         ),
-    //       );
-    //     case Status.unauthenticated:
-    //       return const HomeScreen();
-    //     case Status.authenticating:
-    //       return const Scaffold(
-    //         body: Center(
-    //           child: CircularProgressIndicator(),
-    //         ),
-    //       );
-    //     case Status.authenticated:
-    //       return const HomeScreen();
-    //   }
-    // });
-  }
-}