pedido_view_model.dart 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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. }
  55. }
  56. notifyListeners();
  57. return true;
  58. } else {
  59. return false;
  60. }
  61. }
  62. Future<void> fetchLocalPedidos({int page = 1}) async {
  63. _isLoading = true;
  64. _currentPage = page;
  65. notifyListeners();
  66. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  67. _totalPedidos = await repoPedido.contarPedidos();
  68. int offset = (_limit * (page - 1));
  69. List<Pedido> paginatedPedidos =
  70. await repoPedido.obtenerPedidosPaginados(_limit, offset);
  71. _pedidos = paginatedPedidos;
  72. _isLoading = false;
  73. notifyListeners();
  74. }
  75. void nextPage() {
  76. if (_currentPage < totalPages) {
  77. fetchLocalPedidosForScreen(page: _currentPage + 1);
  78. }
  79. }
  80. void previousPage() {
  81. if (_currentPage > 1) {
  82. fetchLocalPedidosForScreen(page: _currentPage - 1);
  83. }
  84. }
  85. Future<void> fetchLocalPedidosForScreen({int page = 1}) async {
  86. setIsLoading(true);
  87. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  88. _currentPage = page;
  89. var db = await RepoService().db;
  90. int? count = Sqflite.firstIntValue(
  91. await db!.rawQuery('SELECT COUNT(*) FROM Pedido'));
  92. _totalPedidos = count ?? 0;
  93. int offset = (_limit * (page - 1));
  94. List<Pedido> localPedidos =
  95. await repoPedido.obtenerPedidosPaginados(_limit, offset);
  96. _pedidos = localPedidos;
  97. setIsLoading(false);
  98. notifyListeners();
  99. }
  100. Future<Pedido?> fetchPedidoConProductos(int idPedido) async {
  101. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  102. Pedido? pedido = await repoPedido.obtenerPorId(idPedido);
  103. if (pedido != null) {
  104. RepoService<PedidoProducto> repoProducto = RepoService<PedidoProducto>();
  105. RepoService<Producto> repoProductoInfo = RepoService<Producto>();
  106. List<PedidoProducto> productos =
  107. await repoProducto.obtenerPorIdPedido(idPedido);
  108. for (var producto in productos) {
  109. Producto? prodInfo =
  110. await repoProductoInfo.obtenerProductoPorId(producto.idProducto!);
  111. if (prodInfo != null) {
  112. producto.producto = prodInfo;
  113. }
  114. RepoService<PedidoProductoTopping> repoTopping =
  115. RepoService<PedidoProductoTopping>();
  116. List<PedidoProductoTopping> toppings =
  117. await repoTopping.obtenerToppingsPorPedidoProducto(producto.id!);
  118. for (var topping in toppings) {
  119. Producto? toppingInfo =
  120. await repoProductoInfo.obtenerProductoPorId(topping.idTopping!);
  121. if (toppingInfo != null) {
  122. topping.topping = toppingInfo;
  123. }
  124. }
  125. producto.toppings = toppings;
  126. }
  127. pedido.productos = productos;
  128. }
  129. return pedido;
  130. }
  131. Future<void> buscarPedidosPorFolio(String folio) async {
  132. setIsLoading(true);
  133. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  134. List<Pedido> localPedidos = await repoPedido.buscarPorFolio(folio);
  135. _pedidos = localPedidos;
  136. setIsLoading(false);
  137. notifyListeners();
  138. }
  139. Future<void> buscarPedidosPorFecha(
  140. DateTime startDate, DateTime endDate) async {
  141. setIsLoading(true);
  142. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  143. List<Pedido> localPedidos =
  144. await repoPedido.buscarPorFecha(startDate, endDate);
  145. _pedidos = localPedidos;
  146. setIsLoading(false);
  147. notifyListeners();
  148. }
  149. Future<List<Pedido>> buscarPorFecha(
  150. DateTime startDate, DateTime endDate) async {
  151. setIsLoading(true);
  152. RepoService<Pedido> repoPedido = RepoService<Pedido>();
  153. List<Pedido> pedidos = await repoPedido.buscarPorFecha(startDate, endDate);
  154. setIsLoading(false);
  155. notifyListeners();
  156. return pedidos;
  157. }
  158. Future<void> cancelarPedido(int idPedido) async {
  159. var db = await RepoService().db;
  160. await db?.update('Pedido', {'estatus': 'CANCELADO'},
  161. where: 'id = ?', whereArgs: [idPedido]);
  162. fetchLocalPedidosForScreen();
  163. }
  164. }