mesa_view_model.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import '../data/api_response.dart';
  2. import '/models/mesa_model.dart';
  3. import 'package:flutter/material.dart';
  4. import '../services/services.dart';
  5. import 'package:sqflite/sqflite.dart';
  6. class MesaViewModel extends ChangeNotifier {
  7. String _busqueda = "";
  8. String get busqueda => _busqueda;
  9. List<Mesa> _mesas = [];
  10. bool _isLoading = false;
  11. Mesa? _selectedMesa;
  12. List<Mesa> get mesas => _mesas;
  13. bool get isLoading => _isLoading;
  14. Mesa? get selectedMesa => _selectedMesa;
  15. int _currentPage = 1;
  16. int _totalMesas = 0;
  17. int _limit = 10;
  18. int get currentPage => _currentPage;
  19. int get totalMesas => _totalMesas;
  20. int get totalPages => (_totalMesas / _limit).ceil();
  21. setBusqueda(String value) {
  22. _busqueda = value;
  23. notifyListeners();
  24. }
  25. void selectMesa(Mesa mesa) {
  26. _selectedMesa = mesa;
  27. notifyListeners();
  28. }
  29. Future<void> fetchLocalAll({int page = 1}) async {
  30. _currentPage = page;
  31. var db = await RepoService().db;
  32. int? count =
  33. Sqflite.firstIntValue(await db!.rawQuery('SELECT COUNT(*) FROM Mesa'));
  34. _totalMesas = count ?? 0;
  35. int offset = (_limit * (page - 1));
  36. var query = await db.query('Mesa',
  37. orderBy: 'id asc', limit: _limit, offset: offset);
  38. _mesas = query.map((element) => Mesa.fromJson(element)).toList();
  39. notifyListeners();
  40. }
  41. Future<void> fetchLocalByName({required String nombre}) async {
  42. var db = await RepoService().db;
  43. var query = await db!.query(
  44. 'Mesa',
  45. where: 'nombre LIKE "%$nombre%"',
  46. orderBy: 'id asc',
  47. );
  48. List<Mesa> aux = [];
  49. for (var element in query) {
  50. Mesa mesa = Mesa.fromJson(element);
  51. aux.add(mesa);
  52. }
  53. _mesas = aux;
  54. notifyListeners();
  55. }
  56. Mesa fetchLocalById({required int? idMesa}) {
  57. final mesa = mesas.firstWhere((mesa) => mesa.id == idMesa,
  58. orElse: () => Mesa(id: 0, nombre: 'Mesa desconocida'));
  59. return mesa;
  60. }
  61. Future<void> addMesa(Mesa mesa) async {
  62. mesa.creado = DateTime.now().toUtc();
  63. await RepoService().guardar(mesa);
  64. await fetchLocalAll();
  65. }
  66. Future<void> updateMesa(Mesa mesa) async {
  67. setIsLoading(true);
  68. try {
  69. mesa.modificado = DateTime.now().toUtc();
  70. await RepoService().guardar(mesa);
  71. await fetchLocalAll();
  72. } catch (e) {
  73. print('Error updating mesa: $e');
  74. }
  75. setIsLoading(false);
  76. }
  77. Future<void> deleteMesa(int id) async {
  78. await RepoService().eliminar<Mesa>(id);
  79. fetchLocalAll();
  80. }
  81. void setIsLoading(bool loading) {
  82. _isLoading = loading;
  83. notifyListeners();
  84. }
  85. void nextPage() {
  86. if (_currentPage < totalPages) {
  87. fetchLocalAll(page: _currentPage + 1);
  88. }
  89. }
  90. void previousPage() {
  91. if (_currentPage > 1) {
  92. fetchLocalAll(page: _currentPage - 1);
  93. }
  94. }
  95. Future<bool> isMesaActive(String clave) async {
  96. var db = await RepoService().db;
  97. var result = await db!.query(
  98. 'Mesa',
  99. where: 'clave = ?',
  100. whereArgs: [clave],
  101. );
  102. if (result.isNotEmpty) {
  103. var mesa = Mesa.fromJson(result.first);
  104. return mesa.activa == true;
  105. }
  106. return false;
  107. }
  108. Future<bool> sincronizarMesas() async {
  109. String? claveSucursal =
  110. await RepoService().obtenerClaveSucursalSeleccionada();
  111. try {
  112. Map<String, String> parametros = {
  113. "claveSucursal": claveSucursal!,
  114. "limite": "-1"
  115. };
  116. final response = ApiResponse(await BaseService()
  117. .get('/pos/mesa', queryParameters: parametros, withAuth: true));
  118. if (response.isOk && response.resultados != null) {
  119. List<Mesa> mesasApi =
  120. response.resultados!.map((json) => Mesa.fromApi(json)).toList();
  121. if (mesasApi.isNotEmpty) {
  122. print("Mesas API obtenidas: ${mesasApi.length}");
  123. await RepoService().sincronizarMesas(mesasApi);
  124. await fetchLocalAll();
  125. return true;
  126. } else {
  127. print("No se encontraron mesas en la API.");
  128. }
  129. } else {
  130. print("Error en la respuesta de la API o resultados nulos MESAS.");
  131. }
  132. return false;
  133. } catch (e) {
  134. print('Error al sincronizar mesas: $e');
  135. return false;
  136. }
  137. }
  138. }