OscarGil03 месяцев назад: 7
Родитель
Сommit
3a4e45b788

+ 15 - 15
lib/services/repo_service.dart

@@ -6,7 +6,7 @@ import 'package:sqflite/sqflite.dart';
 import '../models/models.dart';
 
 class RepoService<T> {
-  static int dbVersion = 11;
+  static int dbVersion = 12;
   static String dbName = 'conalepPos7.db';
   static const String id = Basico.identificadorWeb;
   static const String idLocal = Basico.identificadorLocal;
@@ -232,20 +232,20 @@ class RepoService<T> {
         ''');
           break;
 
-        case 10:
-          await db.execute('''
-          ALTER TABLE Pedido ADD COLUMN idWeb INTEGER;
-        ''');
-          await db.execute('''
-          ALTER TABLE Pedido ADD COLUMN sincronizado TEXT;
-        ''');
-          await db.execute('''
-          ALTER TABLE PedidoProducto ADD COLUMN idWeb INTEGER;
-        ''');
-          await db.execute('''
-          ALTER TABLE PedidoProducto ADD COLUMN sincronizado TEXT;
-        ''');
-          break;
+        // case 10:
+        //   await db.execute('''
+        //   ALTER TABLE Pedido ADD COLUMN idWeb INTEGER;
+        // ''');
+        //   await db.execute('''
+        //   ALTER TABLE Pedido ADD COLUMN sincronizado TEXT;
+        // ''');
+        //   await db.execute('''
+        //   ALTER TABLE PedidoProducto ADD COLUMN idWeb INTEGER;
+        // ''');
+        //   await db.execute('''
+        //   ALTER TABLE PedidoProducto ADD COLUMN sincronizado TEXT;
+        // ''');
+        //   break;
       }
       oldVersion++;
     }

+ 37 - 25
lib/viewmodels/pedido_view_model.dart

@@ -13,6 +13,7 @@ class PedidoViewModel extends ChangeNotifier {
   List<Pedido> _pedidos = [];
   Pedido? _selectedPedido;
   bool _isLoading = false;
+  String? _errorMessage;
 
   int _currentPage = 1;
   int _totalPedidos = 0;
@@ -25,12 +26,18 @@ class PedidoViewModel extends ChangeNotifier {
   List<Pedido> get pedidos => _pedidos;
   Pedido? get selectedPedido => _selectedPedido;
   bool get isLoading => _isLoading;
+  String? get errorMessage => _errorMessage;
 
   void setIsLoading(bool loading) {
     _isLoading = loading;
     notifyListeners();
   }
 
+  void setErrorMessage(String? message) {
+    _errorMessage = message;
+    notifyListeners();
+  }
+
   Future<bool> guardarPedidoLocal({required Pedido pedido}) async {
     RepoService<Pedido> repoPedido = RepoService<Pedido>();
 
@@ -223,41 +230,46 @@ class PedidoViewModel extends ChangeNotifier {
   }
 
   Future<bool> sincronizarPedidos() async {
-    List<Pedido> pedidosNoSincronizados =
-        await fetchAllLocalPedidosOrdenadosPorFecha();
+    try {
+      List<Pedido> pedidosNoSincronizados =
+          await fetchAllLocalPedidosOrdenadosPorFecha();
 
-    if (pedidosNoSincronizados.isNotEmpty) {
-      Pedido pedidoNoSincronizado = pedidosNoSincronizados.first;
+      if (pedidosNoSincronizados.isNotEmpty) {
+        Pedido pedidoNoSincronizado = pedidosNoSincronizados.first;
 
-      if (pedidoNoSincronizado.productos.isEmpty) {
-        pedidoNoSincronizado =
-            await fetchPedidoConProductos(pedidoNoSincronizado.id) ??
-                pedidoNoSincronizado;
-      }
+        if (pedidoNoSincronizado.productos.isEmpty) {
+          pedidoNoSincronizado =
+              await fetchPedidoConProductos(pedidoNoSincronizado.id) ??
+                  pedidoNoSincronizado;
+        }
 
-      Map<String, dynamic> pedidoJson =
-          await prepararPedidoParaApi(pedidoNoSincronizado);
+        Map<String, dynamic> pedidoJson =
+            await prepararPedidoParaApi(pedidoNoSincronizado);
 
-      print('JSON enviado: $pedidoJson');
+        print('JSON enviado: $pedidoJson');
 
-      var response = ApiResponse(await BaseService()
-          .post('/pos/pedido/sincronizar', body: pedidoJson));
+        var response = ApiResponse(await BaseService()
+            .post('/pos/pedido/sincronizar', body: pedidoJson));
 
-      if (response.isOk && response.detalle != null) {
-        int idWeb = response.detalle!['id'];
-        String sincronizado = response.detalle!['sincronizado'];
+        if (response.isOk && response.detalle != null) {
+          int idWeb = response.detalle!['id'];
+          String sincronizado = response.detalle!['sincronizado'];
 
-        await actualizarPedidoSincronizado(
-            pedidoNoSincronizado.id!, idWeb, sincronizado);
+          await actualizarPedidoSincronizado(
+              pedidoNoSincronizado.id!, idWeb, sincronizado);
 
-        await fetchLocalPedidosForScreen();
-        return true;
+          await fetchLocalPedidosForScreen();
+          return true;
+        } else {
+          throw Exception(
+              'Error en la sincronización del pedido: ${response.mensaje}');
+        }
       } else {
-        print('Error en la sincronización del pedido: ${response.mensaje}');
-        return true;
+        print('No se encontraron pedidos no sincronizados.');
+        return false;
       }
-    } else {
-      print('No se encontraron pedidos no sincronizados.');
+    } catch (e) {
+      setErrorMessage(e.toString());
       return false;
     }
   }

+ 21 - 5
lib/widgets/app_drawer.dart

@@ -14,9 +14,15 @@ import '../viewmodels/login_view_model.dart';
 import '../views/descuento/descuento_screen.dart';
 import '../views/variable/variable_screen.dart';
 import 'widgets_components.dart';
+import 'copia_db.dart';
 
-class AppDrawer extends StatelessWidget {
-  AppDrawer({super.key});
+class AppDrawer extends StatefulWidget {
+  @override
+  _AppDrawerState createState() => _AppDrawerState();
+}
+
+class _AppDrawerState extends State<AppDrawer> {
+  int _versionTapCount = 0;
 
   Future<bool> _showExitConfirmationDialog(BuildContext context) async {
     bool shouldPop = false;
@@ -197,15 +203,25 @@ class AppDrawer extends StatelessWidget {
             //   },
             // ),
           ])),
-          const Padding(
+          GestureDetector(
+            onTap: () {
+              _versionTapCount++;
+              if (_versionTapCount == 5) {
+                copyDatabase(context);
+                _versionTapCount = 0;
+              }
+            },
+            child: const Padding(
               padding: EdgeInsets.only(bottom: 10),
               child: Align(
                 alignment: Alignment.bottomCenter,
                 child: Text(
-                  'v1.24.09.03',
+                  'v1.24.09.03+3',
                   style: TextStyle(fontWeight: FontWeight.w300),
                 ),
-              ))
+              ),
+            ),
+          ),
         ],
       ),
     );

+ 53 - 0
lib/widgets/copia_db.dart

@@ -0,0 +1,53 @@
+import 'dart:io';
+import 'package:flutter/material.dart';
+import 'package:path_provider/path_provider.dart';
+
+Future<void> copyDatabase(BuildContext context) async {
+  try {
+    Directory appDocDir = await getApplicationDocumentsDirectory();
+
+    List<String> dbPaths = [
+      '${appDocDir.path}/databases/conalepPos7.db',
+      '${appDocDir.path}/conalepPos7.db',
+      '/data/data/com.example.conalep_pos/databases/conalepPos7.db',
+    ];
+
+    File? dbFile;
+    for (String path in dbPaths) {
+      if (await File(path).exists()) {
+        dbFile = File(path);
+        break;
+      }
+    }
+
+    if (dbFile != null) {
+      Directory? downloadsDir = await getExternalStorageDirectory();
+      if (downloadsDir == null) {
+        ScaffoldMessenger.of(context).showSnackBar(
+          SnackBar(
+              content: Text('No se pudo acceder al directorio de descargas.')),
+        );
+        return;
+      }
+
+      String newPath = '${downloadsDir.path}/conalepPos7_backup.db';
+
+      await dbFile.copy(newPath);
+
+      ScaffoldMessenger.of(context).showSnackBar(
+        SnackBar(
+            content: Text('Copia de la base de datos guardada en Descargas.')),
+      );
+    } else {
+      ScaffoldMessenger.of(context).showSnackBar(
+        SnackBar(
+            content: Text(
+                'El archivo de la base de datos no existe en ninguna de las rutas verificadas.')),
+      );
+    }
+  } catch (e) {
+    ScaffoldMessenger.of(context).showSnackBar(
+      SnackBar(content: Text('Error al copiar la base de datos: $e')),
+    );
+  }
+}

+ 1 - 0
lib/widgets/widgets.dart

@@ -6,3 +6,4 @@ export '../widgets/app_text_span.dart';
 export '../widgets/app_drawer.dart';
 export '../widgets/widgets_components.dart';
 export '../widgets/pagination_buttons.dart';
+export '../widgets/copia_db.dart';