pedido_view_model.dart 6.8 KB

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