mesa_view_model.dart 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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, bool sinLimite = false}) async {
  30. _currentPage = page;
  31. var db = await RepoService().db;
  32. if (!sinLimite) {
  33. int? count = Sqflite.firstIntValue(
  34. await db!.rawQuery('SELECT COUNT(*) FROM Mesa'));
  35. _totalMesas = count ?? 0;
  36. }
  37. String? limitOffsetClause;
  38. if (!sinLimite) {
  39. int offset = (_limit * (page - 1));
  40. limitOffsetClause = 'LIMIT $_limit OFFSET $offset';
  41. } else {
  42. limitOffsetClause = '';
  43. }
  44. var query = await db!
  45. .rawQuery('SELECT * FROM Mesa ORDER BY id ASC $limitOffsetClause');
  46. _mesas = query.map((element) => Mesa.fromJson(element)).toList();
  47. notifyListeners();
  48. }
  49. Future<void> fetchLocalByName({required String nombre}) async {
  50. var db = await RepoService().db;
  51. var query = await db!.query(
  52. 'Mesa',
  53. where: 'nombre LIKE "%$nombre%"',
  54. orderBy: 'id asc',
  55. );
  56. List<Mesa> aux = [];
  57. for (var element in query) {
  58. Mesa mesa = Mesa.fromJson(element);
  59. aux.add(mesa);
  60. }
  61. _mesas = aux;
  62. notifyListeners();
  63. }
  64. Mesa fetchLocalById({required int? idMesa}) {
  65. final mesa = mesas.firstWhere((mesa) => mesa.id == idMesa,
  66. orElse: () => Mesa(id: 0, nombre: 'Mesa desconocida'));
  67. return mesa;
  68. }
  69. Future<void> addMesa(Mesa mesa) async {
  70. mesa.creado = DateTime.now().toUtc();
  71. await RepoService().guardar(mesa);
  72. await fetchLocalAll();
  73. }
  74. Future<void> updateMesa(Mesa mesa) async {
  75. setIsLoading(true);
  76. try {
  77. mesa.modificado = DateTime.now().toUtc();
  78. await RepoService().guardar(mesa);
  79. await fetchLocalAll();
  80. } catch (e) {
  81. print('Error updating mesa: $e');
  82. }
  83. setIsLoading(false);
  84. }
  85. Future<void> deleteMesa(int id) async {
  86. await RepoService().eliminar<Mesa>(id);
  87. fetchLocalAll();
  88. }
  89. void setIsLoading(bool loading) {
  90. _isLoading = loading;
  91. notifyListeners();
  92. }
  93. void nextPage() {
  94. if (_currentPage < totalPages) {
  95. fetchLocalAll(page: _currentPage + 1);
  96. }
  97. }
  98. void previousPage() {
  99. if (_currentPage > 1) {
  100. fetchLocalAll(page: _currentPage - 1);
  101. }
  102. }
  103. Future<bool> isMesaActive(String clave) async {
  104. var db = await RepoService().db;
  105. var result = await db!.query(
  106. 'Mesa',
  107. where: 'clave = ?',
  108. whereArgs: [clave],
  109. );
  110. if (result.isNotEmpty) {
  111. var mesa = Mesa.fromJson(result.first);
  112. return mesa.activa == true;
  113. }
  114. return false;
  115. }
  116. Future<bool> sincronizarMesas() async {
  117. String? claveSucursal =
  118. await RepoService().obtenerClaveSucursalSeleccionada();
  119. try {
  120. Map<String, String> parametros = {
  121. "claveSucursal": claveSucursal!,
  122. "limite": "-1"
  123. };
  124. final response = ApiResponse(await BaseService()
  125. .get('/pos/mesa', queryParameters: parametros, withAuth: true));
  126. if (response.isOk && response.resultados != null) {
  127. List<Mesa> mesasApi =
  128. response.resultados!.map((json) => Mesa.fromApi(json)).toList();
  129. if (mesasApi.isNotEmpty) {
  130. print("Mesas API obtenidas: ${mesasApi.length}");
  131. await RepoService().sincronizarMesas(mesasApi);
  132. await fetchLocalAll();
  133. return true;
  134. } else {
  135. print("No se encontraron mesas en la API.");
  136. }
  137. } else {
  138. print("Error en la respuesta de la API o resultados nulos MESAS.");
  139. }
  140. return false;
  141. } catch (e) {
  142. print('Error al sincronizar mesas: $e');
  143. return false;
  144. }
  145. }
  146. }