|
@@ -14,6 +14,10 @@ import 'package:collection/collection.dart';
|
|
import '../../widgets/widgets.dart';
|
|
import '../../widgets/widgets.dart';
|
|
|
|
|
|
class PedidoMesaForm extends StatefulWidget {
|
|
class PedidoMesaForm extends StatefulWidget {
|
|
|
|
+ final Pedido? pedido;
|
|
|
|
+
|
|
|
|
+ const PedidoMesaForm({Key? key, Pedido? this.pedido}) : super(key: key);
|
|
|
|
+
|
|
@override
|
|
@override
|
|
_PedidoMesaFormState createState() => _PedidoMesaFormState();
|
|
_PedidoMesaFormState createState() => _PedidoMesaFormState();
|
|
}
|
|
}
|
|
@@ -29,6 +33,7 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
|
|
List<CategoriaProducto> categorias = [];
|
|
List<CategoriaProducto> categorias = [];
|
|
List<Producto> productos = [];
|
|
List<Producto> productos = [];
|
|
List<ItemCarrito> carrito = [];
|
|
List<ItemCarrito> carrito = [];
|
|
|
|
+ List<DropdownMenuItem<int>> listaMesas = [];
|
|
Producto? _productoActual;
|
|
Producto? _productoActual;
|
|
bool _estadoBusqueda = false;
|
|
bool _estadoBusqueda = false;
|
|
Pedido? pedidoActual;
|
|
Pedido? pedidoActual;
|
|
@@ -53,14 +58,14 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
|
|
double total = 0;
|
|
double total = 0;
|
|
|
|
|
|
for (var item in carrito) {
|
|
for (var item in carrito) {
|
|
- total += double.parse(item.producto.precio!) * item.cantidad;
|
|
|
|
|
|
+ total += item.producto.precio! * item.cantidad;
|
|
item.selectedToppings.forEach((categoryId, selectedToppingIds) {
|
|
item.selectedToppings.forEach((categoryId, selectedToppingIds) {
|
|
for (int toppingId in selectedToppingIds) {
|
|
for (int toppingId in selectedToppingIds) {
|
|
Producto? topping = item.selectableToppings[categoryId]?.firstWhere(
|
|
Producto? topping = item.selectableToppings[categoryId]?.firstWhere(
|
|
(topping) => topping.id == toppingId,
|
|
(topping) => topping.id == toppingId,
|
|
- orElse: () => Producto(precio: '0'));
|
|
|
|
|
|
+ orElse: () => Producto(precio: 0));
|
|
if (topping != null) {
|
|
if (topping != null) {
|
|
- total += (double.tryParse(topping.precio!) ?? 0) * item.cantidad;
|
|
|
|
|
|
+ total += (topping.precio ?? 0.0) * item.cantidad;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
});
|
|
@@ -83,6 +88,7 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
|
|
@override
|
|
@override
|
|
void initState() {
|
|
void initState() {
|
|
super.initState();
|
|
super.initState();
|
|
|
|
+ final mvm = Provider.of<MesaViewModel>(context, listen: false);
|
|
cargarCategoriasIniciales().then((_) {
|
|
cargarCategoriasIniciales().then((_) {
|
|
if (categorias.isNotEmpty) {
|
|
if (categorias.isNotEmpty) {
|
|
categoriaSeleccionada = categorias.first;
|
|
categoriaSeleccionada = categorias.first;
|
|
@@ -90,7 +96,37 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
|
|
+ listaMesas = mvm.mesas
|
|
|
|
+ .map(
|
|
|
|
+ (mesa) => DropdownMenuItem<int>(
|
|
|
|
+ value: mesa.id,
|
|
|
|
+ child: Text(
|
|
|
|
+ '${mesa.clave} - ${mesa.nombre}',
|
|
|
|
+ style: const TextStyle(color: Colors.black),
|
|
|
|
+ ),
|
|
|
|
+ ),
|
|
|
|
+ )
|
|
|
|
+ .toList();
|
|
|
|
+
|
|
|
|
+ listaMesas.add(DropdownMenuItem<int>(
|
|
|
|
+ value: 0,
|
|
|
|
+ child:
|
|
|
|
+ Text('Seleccionar', style: const TextStyle(color: Colors.black))));
|
|
|
|
+
|
|
Provider.of<DescuentoViewModel>(context, listen: false).cargarDescuentos();
|
|
Provider.of<DescuentoViewModel>(context, listen: false).cargarDescuentos();
|
|
|
|
+
|
|
|
|
+ if (widget.pedido != null && widget.pedido!.id != null) {
|
|
|
|
+ Future(() async {
|
|
|
|
+ for (var item in widget.pedido!.productos) {
|
|
|
|
+ Map<int, List<Producto>> toppingsSeleccionables =
|
|
|
|
+ await obtenerToppingsSeleccionables(item.producto!);
|
|
|
|
+ carrito.add(ItemCarrito(
|
|
|
|
+ producto: item.producto!,
|
|
|
|
+ cantidad: item.cantidad!,
|
|
|
|
+ selectableToppings: toppingsSeleccionables));
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
_onSearchChanged(String value) {
|
|
_onSearchChanged(String value) {
|
|
@@ -566,7 +602,7 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
|
|
return PedidoProducto(
|
|
return PedidoProducto(
|
|
idProducto: item.producto.id,
|
|
idProducto: item.producto.id,
|
|
producto: item.producto,
|
|
producto: item.producto,
|
|
- costoUnitario: item.producto.precio,
|
|
|
|
|
|
+ costoUnitario: item.producto.precio.toString(),
|
|
cantidad: item.cantidad,
|
|
cantidad: item.cantidad,
|
|
comentario: comentarios,
|
|
comentario: comentarios,
|
|
toppings: selectedToppings,
|
|
toppings: selectedToppings,
|
|
@@ -594,6 +630,74 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ void guardarPedidoActual() async {
|
|
|
|
+ DateTime now = DateTime.now();
|
|
|
|
+ String formattedDate = DateFormat('dd-MM-yyyy kk:mm:ss').format(now);
|
|
|
|
+
|
|
|
|
+ Pedido nuevoPedido = Pedido(
|
|
|
|
+ peticion: formattedDate,
|
|
|
|
+ // nombreCliente: nombreCliente,
|
|
|
|
+ // comentarios: comentarios,
|
|
|
|
+ estatus: "EN PROCESO",
|
|
|
|
+ // totalPedido: totalPedido,
|
|
|
|
+ descuento: pedidoActual?.descuento,
|
|
|
|
+ idMesa: selectedMesa
|
|
|
|
+ // tipoPago: _obtenerTipoPago(),
|
|
|
|
+ // cantEfectivo:
|
|
|
|
+ // efectivoSeleccionado ? double.tryParse(efectivoController.text) : 0,
|
|
|
|
+ // cantTarjeta:
|
|
|
|
+ // tarjetaSeleccionada ? double.tryParse(tarjetaController.text) : 0,
|
|
|
|
+ // cantTransferencia: transferenciaSeleccionada
|
|
|
|
+ // ? double.tryParse(transferenciaController.text)
|
|
|
|
+ // : 0,
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ List<PedidoProducto> listaPedidoProducto = carrito.map((item) {
|
|
|
|
+ List<PedidoProductoTopping> selectedToppings = [];
|
|
|
|
+
|
|
|
|
+ item.selectedToppings.forEach((categoryId, selectedToppingIds) {
|
|
|
|
+ for (int toppingId in selectedToppingIds) {
|
|
|
|
+ selectedToppings.add(PedidoProductoTopping(
|
|
|
|
+ idTopping: toppingId,
|
|
|
|
+ ));
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ return PedidoProducto(
|
|
|
|
+ idProducto: item.producto.id,
|
|
|
|
+ producto: item.producto,
|
|
|
|
+ costoUnitario: item.producto.precio.toString(),
|
|
|
|
+ cantidad: item.cantidad,
|
|
|
|
+ // comentario: comentarios,
|
|
|
|
+ toppings: selectedToppings,
|
|
|
|
+ );
|
|
|
|
+ }).toList();
|
|
|
|
+
|
|
|
|
+ nuevoPedido.productos = listaPedidoProducto;
|
|
|
|
+
|
|
|
|
+ if (widget.pedido != null && widget.pedido!.id != null) {
|
|
|
|
+ nuevoPedido.id = widget.pedido!.id;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ bool result = await Provider.of<PedidoViewModel>(context, listen: false)
|
|
|
|
+ .guardarPedidoLocal(pedido: nuevoPedido);
|
|
|
|
+
|
|
|
|
+ if (!mounted) return;
|
|
|
|
+
|
|
|
|
+ if (result) {
|
|
|
|
+ Pedido? pedidoCompleto =
|
|
|
|
+ await Provider.of<PedidoViewModel>(context, listen: false)
|
|
|
|
+ .fetchPedidoConProductos(nuevoPedido.id!);
|
|
|
|
+
|
|
|
|
+ if (pedidoCompleto != null) {
|
|
|
|
+ imprimirTicketsJuntos(context, pedidoCompleto);
|
|
|
|
+ }
|
|
|
|
+ Navigator.of(context).pop();
|
|
|
|
+ } else {
|
|
|
|
+ print("Error al guardar el pedido");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
String _obtenerTipoPago() {
|
|
String _obtenerTipoPago() {
|
|
List<String> tiposPago = [];
|
|
List<String> tiposPago = [];
|
|
if (efectivoSeleccionado) tiposPago.add('Efectivo');
|
|
if (efectivoSeleccionado) tiposPago.add('Efectivo');
|
|
@@ -751,7 +855,8 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
|
|
builder: (context, viewModel, child) {
|
|
builder: (context, viewModel, child) {
|
|
return AppDropdownModel<int>(
|
|
return AppDropdownModel<int>(
|
|
hint: 'Seleccionar',
|
|
hint: 'Seleccionar',
|
|
- items: viewModel.mesas
|
|
|
|
|
|
+ items:
|
|
|
|
+ listaMesas /* viewModel.mesas
|
|
.map(
|
|
.map(
|
|
(mesa) => DropdownMenuItem<int>(
|
|
(mesa) => DropdownMenuItem<int>(
|
|
value: mesa.id,
|
|
value: mesa.id,
|
|
@@ -761,7 +866,8 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
|
|
),
|
|
),
|
|
),
|
|
),
|
|
)
|
|
)
|
|
- .toList(),
|
|
|
|
|
|
+ .toList() */
|
|
|
|
+ ,
|
|
selectedValue: selectedMesa,
|
|
selectedValue: selectedMesa,
|
|
onChanged: (value) {
|
|
onChanged: (value) {
|
|
setState(() {
|
|
setState(() {
|
|
@@ -999,9 +1105,7 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
|
|
MainAxisAlignment.spaceBetween,
|
|
MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
children: [
|
|
Text(topping.nombre!),
|
|
Text(topping.nombre!),
|
|
- if (double.tryParse(
|
|
|
|
- topping.precio!) !=
|
|
|
|
- 0.0)
|
|
|
|
|
|
+ if (topping.precio != 0.0)
|
|
Text(
|
|
Text(
|
|
'+\$${topping.precio}',
|
|
'+\$${topping.precio}',
|
|
style: TextStyle(
|
|
style: TextStyle(
|
|
@@ -1071,7 +1175,7 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
|
|
Padding(
|
|
Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: ElevatedButton(
|
|
child: ElevatedButton(
|
|
- onPressed: _finalizeOrder,
|
|
|
|
|
|
+ onPressed: guardarPedidoActual,
|
|
style: ElevatedButton.styleFrom(
|
|
style: ElevatedButton.styleFrom(
|
|
backgroundColor: AppTheme.tertiary,
|
|
backgroundColor: AppTheme.tertiary,
|
|
textStyle: const TextStyle(fontSize: 22),
|
|
textStyle: const TextStyle(fontSize: 22),
|