8 Commits f64663efc3 ... 73fcfea796

Autore SHA1 Messaggio Data
  ElPoteito 73fcfea796 13207: GRID: Ordenar Fecha DESC 6 mesi fa
  ElPoteito 5d1bfd03e0 13208: GRID PEDIDOS de mesa: Informar en una columna la MESA 6 mesi fa
  ElPoteito 0ffafebc94 13205: Pedidos de Mesa : Al guardar pedido corregir formato de fecha a iso 8601 6 mesi fa
  ElPoteito ecf6636c3d 13204: Los pedidos de Mesa no se debe imprimir automaticamente 6 mesi fa
  ElPoteito 3318a01aa8 13202: Ordenar selector de mesas en select Az-Z en pedido 6 mesi fa
  ElPoteito d33bb92aff 13200: Ocultar ID local en vista d epedidos 6 mesi fa
  ElPoteito fe39f9802a 13143: Cargar mesas al abrir pantalla de pedidos de mesa 6 mesi fa
  ElPoteito 49b1ee97c0 Guardado y cancelado de pedidos de mesa 6 mesi fa

+ 7 - 0
lib/models/pedido_model.dart

@@ -1,3 +1,4 @@
+import 'package:conalep_pos/models/mesa_model.dart';
 import 'package:intl/intl.dart';
 
 import 'basico_model.dart';
@@ -25,6 +26,7 @@ class Pedido extends Basico {
   double? cantTransferencia;
   List<PedidoProducto> productos = [];
   int? idWeb;
+  Mesa? mesa;
 
   String? sincronizado;
 
@@ -50,6 +52,7 @@ class Pedido extends Basico {
     this.cantTransferencia,
     this.productos = const [],
     this.idWeb,
+    this.mesa,
     this.sincronizado,
   });
 
@@ -75,6 +78,7 @@ class Pedido extends Basico {
       'cantEfectivo': cantEfectivo,
       'cantTarjeta': cantTarjeta,
       'cantTransferencia': cantTransferencia,
+      'mesa': mesa,
       'sincronizado': sincronizado,
     }..addAll(super.toJson());
   }
@@ -95,6 +99,7 @@ class Pedido extends Basico {
       'cantEfectivo': cantEfectivo,
       'cantTarjeta': cantTarjeta,
       'cantTransferencia': cantTransferencia,
+      'mesa': mesa,
       'productos': productos.map((producto) => producto.toApi()).toList(),
     };
     Map<String, dynamic> basicoMap = super.toJson();
@@ -128,6 +133,8 @@ class Pedido extends Basico {
     cantTransferencia = Basico.parseDouble(json['cantTransferencia']);
     idWeb = Basico.parseInt(json['idWeb']);
     sincronizado = Basico.parseString(json['sincronizado']);
+    mesa =
+        json["mesa"] == null ? null : Mesa.fromJson(json["mesa"]);
 
     List<PedidoProducto> _productos = [];
     if (json["productos"] != null && (json["productos"] as List).isNotEmpty) {

+ 16 - 11
lib/services/repo_service.dart

@@ -420,18 +420,21 @@ class RepoService<T> {
       modelMap.remove('eliminado');
     }
 
+    int resultado;
+    int? identificadorLocal = modelMap[Basico.identificadorLocal];
+
     if (modelMap['id'] == null || modelMap['id'] == 0) {
       modelMap.remove('id');
+      identificadorLocal = modelMap[Basico.identificadorLocal];
+    } else {
+      identificadorLocal = modelMap['id'];
     }
 
-    int resultado;
-    int? identificadorLocal = modelMap[Basico.identificadorLocal];
-
     if (identificadorLocal != null && identificadorLocal > 0) {
       resultado = await dbClient!.update(
         nombreTabla,
         modelMap,
-        where: "$idLocal = ?",
+        where: "$id = ?",
         whereArgs: [identificadorLocal],
       );
     } else {
@@ -546,19 +549,21 @@ class RepoService<T> {
     List<Map<String, dynamic>> result = await dbClient!.query('Pedido',
         limit: limit,
         offset: offset,
-        orderBy: 'id DESC',
-        where: 'idMesa = null');
+        orderBy: 'peticion DESC',
+        where: 'idMesa IS NULL');
     return result.map((map) => Pedido.fromJson(map)).toList();
   }
 
   Future<List<Pedido>> obtenerMesaPedidosPaginados(
       int limit, int offset) async {
     Database? dbClient = await db;
-    List<Map<String, dynamic>> result = await dbClient!.query('Pedido',
-        limit: limit,
-        offset: offset,
-        orderBy: 'id DESC',
-        where: 'idMesa != null');
+    List<Map<String, dynamic>> result = await dbClient!.query(
+      'Pedido',
+      limit: limit,
+      offset: offset,
+      orderBy: 'peticion DESC',
+      where: 'idMesa IS NOT NULL',
+    );
     return result.map((map) => Pedido.fromJson(map)).toList();
   }
 

+ 5 - 0
lib/viewmodels/mesa_view_model.dart

@@ -65,6 +65,11 @@ class MesaViewModel extends ChangeNotifier {
     notifyListeners();
   }
 
+  Mesa fetchLocalById({required int? idMesa}) {
+    final mesa = mesas.firstWhere((mesa) => mesa.id == idMesa, orElse: () => Mesa(id: 0, nombre: 'Mesa desconocida'));
+    return mesa;
+  }
+
   Future<void> addMesa(Mesa mesa) async {
     await RepoService().guardar(mesa);
     fetchLocalAll();

+ 2 - 0
lib/viewmodels/pedido_view_model.dart

@@ -156,6 +156,8 @@ class PedidoViewModel extends ChangeNotifier {
 
     List<Pedido> localPedidos =
         await repoPedido.obtenerMesaPedidosPaginados(_limit, offset);
+    // List<Pedido> localPedidos =
+        // await repoPedido.obtenerPedidosPaginados(_limit, offset);
     _pedidos = localPedidos;
 
     setIsLoading(false);

+ 1 - 1
lib/views/pedido/pedido_screen.dart

@@ -609,7 +609,7 @@ class _PedidoScreenState extends State<PedidoScreen> {
   }
 
   String _formatDateTime(String? dateTimeString) {
-    if (dateTimeString == null) return "Sin fecha";
+    if (dateTimeString == null || dateTimeString == "") return "Sin fecha";
 
     DateTime parsedDate = DateTime.parse(dateTimeString);
 

+ 108 - 28
lib/views/pedido_mesa/pedido_mesa_form.dart

@@ -96,7 +96,11 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
       }
     });
 
-    listaMesas = mvm.mesas
+    final mesas = mvm.mesas;
+    if (mesas.isNotEmpty) {
+      mesas.sort((a, b) => a.nombre!.compareTo(b.nombre!));
+    }
+    listaMesas = mesas
         .map(
           (mesa) => DropdownMenuItem<int>(
             value: mesa.id,
@@ -107,15 +111,14 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
           ),
         )
         .toList();
-
-    listaMesas.add(DropdownMenuItem<int>(
-        value: 0,
-        child:
-            Text('Seleccionar', style: const TextStyle(color: Colors.black))));
+    
 
     Provider.of<DescuentoViewModel>(context, listen: false).cargarDescuentos();
 
     if (widget.pedido != null && widget.pedido!.id != null) {
+      if (widget.pedido!.idMesa != null && listaMesas.isNotEmpty) {
+        selectedMesa = widget.pedido!.idMesa;
+      }
       Future(() async {
         for (var item in widget.pedido!.productos) {
           Map<int, List<Producto>> toppingsSeleccionables =
@@ -127,6 +130,11 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
         }
       });
     }
+
+    listaMesas.add(DropdownMenuItem<int>(
+        value: 0,
+        child:
+            Text('Seleccionar', style: const TextStyle(color: Colors.black))));
   }
 
   _onSearchChanged(String value) {
@@ -569,13 +577,13 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
 
   void prepararPedidoActual(String nombreCliente, String comentarios) async {
     DateTime now = DateTime.now();
-    String formattedDate = DateFormat('dd-MM-yyyy kk:mm:ss').format(now);
+    String formattedDate = DateTime.now().toUtc().toIso8601String();
 
     Pedido nuevoPedido = Pedido(
       peticion: formattedDate,
       nombreCliente: nombreCliente,
       comentarios: comentarios,
-      estatus: "NUEVO",
+      estatus: "FINALIZADO",
       totalPedido: totalPedido,
       descuento: pedidoActual?.descuento,
       tipoPago: _obtenerTipoPago(),
@@ -632,25 +640,25 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
 
   void guardarPedidoActual() async {
     DateTime now = DateTime.now();
-    String formattedDate = DateFormat('dd-MM-yyyy kk:mm:ss').format(now);
+    String formattedDate = DateTime.now().toUtc().toIso8601String();
 
     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,
-    );
+        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 = [];
@@ -689,15 +697,87 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
           await Provider.of<PedidoViewModel>(context, listen: false)
               .fetchPedidoConProductos(nuevoPedido.id!);
 
-      if (pedidoCompleto != null) {
+      /* if (pedidoCompleto != null) {
         imprimirTicketsJuntos(context, pedidoCompleto);
-      }
+      } */
       Navigator.of(context).pop();
     } else {
       print("Error al guardar el pedido");
     }
   }
 
+  void cancelarPedidoActual() async {
+    if (widget.pedido == null) {
+      Navigator.of(context).pop();
+    } else {
+      DateTime now = DateTime.now();
+      String formattedDate = DateTime.now().toUtc().toIso8601String();
+
+      Pedido nuevoPedido = Pedido(
+          peticion: formattedDate,
+          // nombreCliente: nombreCliente,
+          // comentarios: comentarios,
+          estatus: "CANCELADO",
+          // 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() {
     List<String> tiposPago = [];
     if (efectivoSeleccionado) tiposPago.add('Efectivo');
@@ -1209,7 +1289,7 @@ class _PedidoMesaFormState extends State<PedidoMesaForm> {
                   Padding(
                     padding: const EdgeInsets.all(8.0),
                     child: ElevatedButton(
-                      onPressed: _finalizeOrder,
+                      onPressed: cancelarPedidoActual,
                       style: ElevatedButton.styleFrom(
                         backgroundColor: AppTheme.tertiary,
                         textStyle: const TextStyle(fontSize: 22),

+ 27 - 8
lib/views/pedido_mesa/pedido_mesa_screen.dart

@@ -1,5 +1,6 @@
 import 'package:conalep_pos/models/models.dart';
 import 'package:conalep_pos/themes/themes.dart';
+import 'package:conalep_pos/viewmodels/mesa_view_model.dart';
 import 'package:conalep_pos/viewmodels/viewmodels.dart';
 import 'package:conalep_pos/views/pedido_mesa/pedido_mesa_detalle.dart';
 import 'package:conalep_pos/views/pedido_mesa/pedido_mesa_form.dart';
@@ -27,6 +28,7 @@ class _PedidoMesaScreenState extends State<PedidoMesaScreen> {
     WidgetsBinding.instance.addPostFrameCallback((_) {
       Provider.of<PedidoViewModel>(context, listen: false)
           .fetchLocalMesaPedidosForScreen();
+      Provider.of<MesaViewModel>(context, listen: false).fetchLocalAll();
     });
   }
 
@@ -80,8 +82,7 @@ class _PedidoMesaScreenState extends State<PedidoMesaScreen> {
         Navigator.push(
           context,
           MaterialPageRoute(
-            builder: (context) =>
-                PedidoMesaForm(pedido: pedidoCompleto),
+            builder: (context) => PedidoMesaForm(pedido: pedidoCompleto),
           ),
         );
       } else {
@@ -187,9 +188,25 @@ class _PedidoMesaScreenState extends State<PedidoMesaScreen> {
           )
         ])),
         DataCell(
+          Text(item.peticion ?? "Sin fecha"),
+          onTap: () => go(item),
+        ),
+        DataCell(
+          Text(Provider.of<MesaViewModel>(context, listen: false).fetchLocalById(idMesa: item.idMesa).nombre.toString()),
+          onTap: () => go(item),
+        ),
+        /* DataCell(
+          Text(item.id.toString()),
+          onTap: () => go(item),
+        ), */
+        DataCell(
           Text(item.folio.toString()),
           onTap: () => go(item),
         ),
+        /* DataCell(
+          Text(item.idLocal.toString()),
+          onTap: () => go(item),
+        ), */
         DataCell(
           Text(item.nombreCliente ?? "Sin nombre"),
           onTap: () => go(item),
@@ -202,10 +219,6 @@ class _PedidoMesaScreenState extends State<PedidoMesaScreen> {
           Text(item.estatus ?? "Sin Estatus"),
           onTap: () => go(item),
         ),
-        DataCell(
-          Text(item.peticion ?? "Sin fecha"),
-          onTap: () => go(item),
-        ),
       ]));
     }
 
@@ -315,7 +328,15 @@ class _PedidoMesaScreenState extends State<PedidoMesaScreen> {
                                   columns: [
                                     DataColumn(label: Text(" ", style: estilo)),
                                     DataColumn(
+                                        label: Text("FECHA", style: estilo)),
+                                    DataColumn(
+                                        label: Text("MESA", style: estilo)),
+                                    /* DataColumn(
+                                        label: Text("ID", style: estilo)), */
+                                    DataColumn(
                                         label: Text("FOLIO", style: estilo)),
+                                    /* DataColumn(
+                                        label: Text("IDLOCAL", style: estilo)), */
                                     DataColumn(
                                         label: Text("NOMBRE", style: estilo)),
                                     DataColumn(
@@ -323,8 +344,6 @@ class _PedidoMesaScreenState extends State<PedidoMesaScreen> {
                                             Text("COMENTARIOS", style: estilo)),
                                     DataColumn(
                                         label: Text("ESTATUS", style: estilo)),
-                                    DataColumn(
-                                        label: Text("FECHA", style: estilo)),
                                   ],
                                   rows: registros,
                                 ),