pedido_view_model.dart 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. import 'package:flutter/material.dart';
  2. import 'package:intl/intl.dart';
  3. import 'package:sqflite/sqflite.dart';
  4. import '../models/models.dart';
  5. import '../services/services.dart';
  6. class PedidoViewModel extends ChangeNotifier {
  7. String _busqueda = "";
  8. String get busqueda => _busqueda;
  9. List<Pedido> _pedidos = [];
  10. Pedido? _selectedPedido;
  11. bool _isLoading = false;
  12. int _currentPage = 1;
  13. int _totalPedidos = 0;
  14. int _limit = 10;
  15. int get currentPage => _currentPage;
  16. int get totalPedidos => _totalPedidos;
  17. int get totalPages => (_totalPedidos / _limit).ceil();
  18. List<Pedido> get pedidos => _pedidos;
  19. Pedido? get selectedPedido => _selectedPedido;
  20. bool get isLoading => _isLoading;
  21. void setIsLoading(bool loading) {
  22. _isLoading = loading;
  23. notifyListeners();
  24. }
  25. Future<bool> guardarPedidoLocal({required Pedido pedido}) async {
  26. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  27. int nextFolio = await repoPedido.obtenerProximoFolio();
  28. pedido.folio = nextFolio;
  29. int idPedido = await repoPedido.guardarLocal(pedido);
  30. if (idPedido > 0) {
  31. pedido.id = idPedido;
  32. RepoService<PedidoProducto> repoPedidoProducto =
  33. RepoService<PedidoProducto>();
  34. RepoService<PedidoProductoTopping> repoPedidoProductoTopping =
  35. RepoService<PedidoProductoTopping>();
  36. for (var producto in pedido.productos) {
  37. PedidoProducto pedidoProducto = PedidoProducto(
  38. idPedido: idPedido,
  39. idProducto: producto.idProducto,
  40. cantidad: producto.cantidad,
  41. costoUnitario: producto.costoUnitario,
  42. comentario: producto.comentario,
  43. );
  44. int idPedidoProducto =
  45. await repoPedidoProducto.guardarLocal(pedidoProducto);
  46. for (var topping in producto.toppings) {
  47. PedidoProductoTopping pedidoProductoTopping = PedidoProductoTopping(
  48. idPedidoProducto: idPedidoProducto,
  49. idTopping: topping.idTopping,
  50. );
  51. await repoPedidoProductoTopping.guardarLocal(pedidoProductoTopping);
  52. // Recuperar detalles completos del topping
  53. Producto? toppingInfo = await RepoService<Producto>()
  54. .obtenerProductoPorId(topping.idTopping!);
  55. if (toppingInfo != null) {
  56. topping.topping = toppingInfo;
  57. }
  58. }
  59. }
  60. notifyListeners();
  61. return true;
  62. } else {
  63. return false;
  64. }
  65. }
  66. Future<void> fetchLocalPedidos({int page = 1}) async {
  67. _isLoading = true;
  68. _currentPage = page;
  69. notifyListeners();
  70. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  71. _totalPedidos = await repoPedido.contarPedidos();
  72. int offset = (_limit * (page - 1));
  73. List<Pedido> paginatedPedidos =
  74. await repoPedido.obtenerPedidosPaginados(_limit, offset);
  75. _pedidos = paginatedPedidos;
  76. _isLoading = false;
  77. notifyListeners();
  78. }
  79. Future<void> fetchLocalMesaPedidos({int page = 1}) async {
  80. _isLoading = true;
  81. _currentPage = page;
  82. notifyListeners();
  83. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  84. _totalPedidos = await repoPedido.contarPedidos();
  85. int offset = (_limit * (page - 1));
  86. List<Pedido> paginatedPedidos =
  87. await repoPedido.obtenerMesaPedidosPaginados(_limit, offset);
  88. _pedidos = paginatedPedidos;
  89. _isLoading = false;
  90. notifyListeners();
  91. }
  92. void nextPage() {
  93. if (_currentPage < totalPages) {
  94. fetchLocalPedidosForScreen(page: _currentPage + 1);
  95. }
  96. }
  97. void previousPage() {
  98. if (_currentPage > 1) {
  99. fetchLocalPedidosForScreen(page: _currentPage - 1);
  100. }
  101. }
  102. Future<void> fetchLocalPedidosForScreen({int page = 1}) async {
  103. setIsLoading(true);
  104. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  105. _currentPage = page;
  106. var db = await RepoService().db;
  107. int? count = Sqflite.firstIntValue(
  108. await db!.rawQuery('SELECT COUNT(*) FROM Pedido'));
  109. _totalPedidos = count ?? 0;
  110. int offset = (_limit * (page - 1));
  111. List<Pedido> localPedidos =
  112. await repoPedido.obtenerPedidosPaginados(_limit, offset);
  113. _pedidos = localPedidos;
  114. setIsLoading(false);
  115. notifyListeners();
  116. }
  117. Future<void> fetchLocalMesaPedidosForScreen({int page = 1}) async {
  118. setIsLoading(true);
  119. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  120. _currentPage = page;
  121. var db = await RepoService().db;
  122. int? count = Sqflite.firstIntValue(
  123. await db!.rawQuery('SELECT COUNT(*) FROM Pedido'));
  124. _totalPedidos = count ?? 0;
  125. int offset = (_limit * (page - 1));
  126. List<Pedido> localPedidos =
  127. await repoPedido.obtenerMesaPedidosPaginados(_limit, offset);
  128. _pedidos = localPedidos;
  129. setIsLoading(false);
  130. notifyListeners();
  131. }
  132. Future<List<Pedido>> fetchAllLocalPedidos() async {
  133. setIsLoading(true);
  134. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  135. List<Pedido> allPedidos = await repoPedido.obtenerTodos();
  136. setIsLoading(false);
  137. return allPedidos;
  138. }
  139. Future<List<Pedido>> fetchPedidosPorFechaSinLimit(
  140. DateTime startDate, DateTime endDate) async {
  141. setIsLoading(true);
  142. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  143. List<Pedido> pedidos = await repoPedido.buscarPorFecha(startDate, endDate);
  144. setIsLoading(false);
  145. return pedidos;
  146. }
  147. Future<Pedido?> fetchPedidoConProductos(int idPedido) async {
  148. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  149. Pedido? pedido = await repoPedido.obtenerPorId(idPedido);
  150. if (pedido != null) {
  151. RepoService<PedidoProducto> repoProducto = RepoService<PedidoProducto>();
  152. RepoService<Producto> repoProductoInfo = RepoService<Producto>();
  153. List<PedidoProducto> productos =
  154. await repoProducto.obtenerPorIdPedido(idPedido);
  155. for (var producto in productos) {
  156. Producto? prodInfo =
  157. await repoProductoInfo.obtenerProductoPorId(producto.idProducto!);
  158. if (prodInfo != null) {
  159. producto.producto = prodInfo;
  160. }
  161. RepoService<PedidoProductoTopping> repoTopping =
  162. RepoService<PedidoProductoTopping>();
  163. List<PedidoProductoTopping> toppings =
  164. await repoTopping.obtenerToppingsPorPedidoProducto(producto.id!);
  165. for (var topping in toppings) {
  166. Producto? toppingInfo =
  167. await repoProductoInfo.obtenerProductoPorId(topping.idTopping!);
  168. if (toppingInfo != null) {
  169. topping.topping = toppingInfo;
  170. }
  171. }
  172. producto.toppings = toppings;
  173. }
  174. pedido.productos = productos;
  175. }
  176. return pedido;
  177. }
  178. Future<void> buscarPedidosPorFolio(String folio) async {
  179. setIsLoading(true);
  180. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  181. List<Pedido> localPedidos = await repoPedido.buscarPorFolio(folio);
  182. _pedidos = localPedidos;
  183. setIsLoading(false);
  184. notifyListeners();
  185. }
  186. Future<void> buscarPedidosPorFecha(
  187. DateTime startDate, DateTime endDate) async {
  188. setIsLoading(true);
  189. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  190. List<Pedido> localPedidos =
  191. await repoPedido.buscarPorFecha(startDate, endDate);
  192. _pedidos = localPedidos;
  193. setIsLoading(false);
  194. notifyListeners();
  195. }
  196. Future<List<Pedido>> buscarPorFecha(
  197. DateTime startDate, DateTime endDate) async {
  198. setIsLoading(true);
  199. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  200. List<Pedido> pedidos = await repoPedido.buscarPorFecha(startDate, endDate);
  201. setIsLoading(false);
  202. notifyListeners();
  203. return pedidos;
  204. }
  205. Future<void> cancelarPedido(int idPedido) async {
  206. var db = await RepoService().db;
  207. await db?.update('Pedido', {'estatus': 'CANCELADO'},
  208. where: 'id = ?', whereArgs: [idPedido]);
  209. fetchLocalPedidosForScreen();
  210. }
  211. }