mesa_view_model.dart 4.9 KB

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