creacion_pedido_view_model.dart 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import 'package:flutter/material.dart';
  2. import 'package:turquessa_mesas_hoster/core/models/categoria_producto_model.dart';
  3. import 'package:turquessa_mesas_hoster/core/models/media_model.dart';
  4. import 'package:turquessa_mesas_hoster/core/models/pedido_model.dart';
  5. import 'package:turquessa_mesas_hoster/core/models/producto_model.dart';
  6. class CreacionPedidoViewModel extends ChangeNotifier {
  7. // Lista de productos disponibles para elegir
  8. final List<Producto> _productosDisponibles = <Producto>[
  9. Producto(
  10. id: 1, // Añadido id para facilitar la búsqueda
  11. idCategoria: 1,
  12. nombre: 'Café Latte',
  13. descripcion: 'Café con leche y espuma',
  14. imagen: 'https://example.com/cafe_latte.jpg',
  15. venta: 1,
  16. existencia: 50,
  17. precio: 4.50,
  18. verMenu: 1,
  19. codigo: 'CL001',
  20. descuento: '10%',
  21. toping: 1,
  22. topings: [
  23. Producto(id: 1, nombre: 'Crema Batida', precio: 0.50),
  24. Producto(id: 2, nombre: 'Chocolate', precio: 0.75),
  25. ],
  26. activo: 1,
  27. media: [],
  28. idWeb: 101,
  29. sincronizado: 'Sí',
  30. ),
  31. Producto(
  32. id: 2,
  33. idCategoria: 1,
  34. nombre: 'Pizza al horno',
  35. descripcion: 'Pizza tradicional italiana',
  36. imagen: 'https://example.com/pizza.jpg',
  37. venta: 1,
  38. existencia: 50,
  39. precio: 4.50,
  40. verMenu: 1,
  41. codigo: 'PZ001',
  42. descuento: '10%',
  43. toping: 1,
  44. topings: [
  45. Producto(id: 3, nombre: 'Extra queso', precio: 0.50),
  46. Producto(id: 4, nombre: 'Champiñones', precio: 0.75),
  47. ],
  48. activo: 1,
  49. media: [],
  50. idWeb: 102,
  51. sincronizado: 'Sí',
  52. ),
  53. Producto(
  54. id: 3,
  55. idCategoria: 1,
  56. nombre: 'Capuchino',
  57. descripcion: 'Café con espuma de leche',
  58. imagen: 'https://example.com/capuchino.jpg',
  59. venta: 1,
  60. existencia: 50,
  61. precio: 4.50,
  62. verMenu: 1,
  63. codigo: 'CP001',
  64. descuento: '10%',
  65. toping: 1,
  66. topings: [
  67. Producto(id: 1, nombre: 'Crema Batida', precio: 0.50),
  68. Producto(id: 5, nombre: 'Canela', precio: 0.25),
  69. ],
  70. activo: 1,
  71. media: [],
  72. idWeb: 103,
  73. sincronizado: 'Sí',
  74. ),
  75. Producto(
  76. id: 4,
  77. idCategoria: 1,
  78. nombre: 'Pastel de Chocolate',
  79. descripcion: 'Pastel casero de chocolate',
  80. imagen: 'https://example.com/pastel.jpg',
  81. venta: 1,
  82. existencia: 50,
  83. precio: 4.50,
  84. verMenu: 1,
  85. codigo: 'PC001',
  86. descuento: '10%',
  87. toping: 1,
  88. topings: [
  89. Producto(id: 6, nombre: 'Helado', precio: 1.00),
  90. Producto(id: 7, nombre: 'Frutos rojos', precio: 0.75),
  91. ],
  92. activo: 1,
  93. media: [],
  94. idWeb: 104,
  95. sincronizado: 'Sí',
  96. )
  97. ];
  98. // Lista del carrito que se mostrará en el DataTable
  99. final List<Producto> _carrito = [];
  100. // Getters
  101. List<Producto> get productosDisponibles => _productosDisponibles;
  102. List<Producto> get carrito => _carrito;
  103. // Método para agregar un producto al carrito
  104. void agregarAlCarrito(Producto producto) {
  105. // Buscar si el producto ya está en el carrito
  106. int index = _carrito.indexWhere((p) => p.id == producto.id);
  107. if (index != -1) {
  108. // Si ya existe en el carrito, incrementar cantidad
  109. _carrito[index].venta = (_carrito[index].venta ?? 0) + 1;
  110. } else {
  111. // Si no existe, crear una copia del producto y añadirlo al carrito
  112. final productoCarrito = Producto(
  113. id: producto.id,
  114. nombre: producto.nombre,
  115. precio: producto.precio,
  116. descripcion: producto.descripcion,
  117. imagen: producto.imagen,
  118. venta: 1, // Iniciar con cantidad 1
  119. codigo: producto.codigo,
  120. topings: producto.topings,
  121. // Otros atributos que necesites copiar
  122. );
  123. _carrito.add(productoCarrito);
  124. }
  125. notifyListeners();
  126. }
  127. // Método para reducir la cantidad de un producto en el carrito
  128. void reducirDelCarrito(Producto producto) {
  129. int index = _carrito.indexWhere((p) => p.id == producto.id);
  130. if (index != -1) {
  131. if (_carrito[index].venta! > 1) {
  132. // Reducir cantidad si es mayor que 1
  133. _carrito[index].venta = _carrito[index].venta! - 1;
  134. } else {
  135. // Eliminar del carrito si la cantidad llega a 0
  136. _carrito.removeAt(index);
  137. }
  138. notifyListeners();
  139. }
  140. }
  141. // Método para eliminar un producto específico del carrito
  142. void eliminarDelCarrito(Producto producto) {
  143. _carrito.removeWhere((p) => p.id == producto.id);
  144. notifyListeners();
  145. }
  146. // Método para limpiar todo el carrito
  147. void limpiarCarrito() {
  148. _carrito.clear();
  149. notifyListeners();
  150. }
  151. // Método para calcular el total del carrito
  152. double calcularTotalCarrito() {
  153. return _carrito.fold(
  154. 0,
  155. (total, producto) =>
  156. total + ((producto.precio ?? 0) * (producto.venta ?? 0)));
  157. }
  158. }