import 'dart:async'; import 'dart:io' as io; import '../Model/unit.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; import 'package:sqflite/sqflite.dart'; import 'keys.dart'; import '../main.dart'; import 'package:permission_handler/permission_handler.dart' as pHandler; import 'dart:typed_data'; class DBHelper { DBHelper._(); static final DBHelper database = DBHelper._(); static Database? _db; Future get db async { _db ??= await initDb(); Database database = _db!; return database; } backupDb({context}) async{ var result = {"STATUS":0,"MSG":"Backup gagal!"}; var stock_id = prefs.getString(Keys.stockId)??''; if(stock_id != ''){ if(context!= null){ await util.permissionCheck(context,pHandler.Permission.storage,()async{ try{ // if(dbPath == null || dbPath == ''){ final database = await db; var dbPath = database.path; await DBHelper.database.closeDb(); // } await prefs.remove(Keys.backupStockId); if(stock_id !='' && stock_id != null ) await prefs.setString(Keys.backupStockId,stock_id); //backupDatabase String backupPath = join(dbPath.substring(0,dbPath.indexOf("/Android"))+"/Download", "${prefs.getString(Keys.backupStockId)}_UnitStocking.db"); io.File backupFile = new io.File(backupPath); io.File dbFile = io.File(dbPath); if(dbFile.existsSync()){ // dbFile.copySync(backupPath); Uint8List byte = dbFile.readAsBytesSync(); backupFile.writeAsBytesSync(byte); result = {"STATUS":1,"MSG":"Backup Berhasil!"}; } else{ result = {"STATUS":0,"MSG":"Backup gagal data unit tidak ditemukan!"}; print('file backup dont exist tho'); } } catch(e){ print(e); result = {"STATUS":0,"MSG":"Backup gagal!"}; } },customMessage: " untuk menyimpan data backup"); } else{ try{ // if(dbPath == null || dbPath == ''){ final database = await db; var dbPath = database.path; await DBHelper.database.closeDb(); // } await prefs.remove(Keys.backupStockId); if(stock_id !='' && stock_id != null ) await prefs.setString(Keys.backupStockId,stock_id); //backupDatabase String backupPath = join(dbPath.substring(0,dbPath.indexOf("/Android"))+"/Download", "${prefs.getString(Keys.backupStockId)}_UnitStocking.db"); io.File backupFile = new io.File(backupPath); io.File dbFile = io.File(dbPath); if(dbFile.existsSync()){ // dbFile.copySync(backupPath); Uint8List byte = dbFile.readAsBytesSync(); backupFile.writeAsBytesSync(byte); result = {"STATUS":1,"MSG":"Backup Berhasil!"}; } else{ result = {"STATUS":0,"MSG":"Backup gagal data unit tidak ditemukan!"}; print('file backup dont exist tho'); } } catch(e){ print(e); result = {"STATUS":0,"MSG":"Backup gagal!"}; } } } else{ result = {"STATUS":0,"MSG":"Backup gagal data unit tidak ditemukan!"}; } return result; } restoreDb(context)async{ var result = {"STATUS":0,"MSG":"File Backup tidak ditemukan!"}; if(prefs.getString(Keys.backupStockId)!=null){ await util.permissionCheck(context,pHandler.Permission.storage,()async{ io.Directory? documentsDirectory = await getExternalStorageDirectory(); String backupPath = join(documentsDirectory!.path.substring(0,documentsDirectory.path.indexOf("/Android"))+"/Download", "${prefs.getString(Keys.backupStockId)}_UnitStocking.db"); io.File backupdbFile = io.File(backupPath); if(backupdbFile.existsSync()){ io.File dbFile = new io.File(join(documentsDirectory.path, "UnitStocking.db")); Uint8List byte = backupdbFile.readAsBytesSync(); dbFile.writeAsBytesSync(byte); result = {"STATUS":1,"MSG":"Restore data successfull"}; await DBHelper.database.closeDb(); } else result = {"STATUS":0,"MSG":"File Backup tidak ditemukan!"}; },customMessage: " untuk menyimpan data backup"); } return result; } initDb() async { io.Directory? documentsDirectory = await getExternalStorageDirectory(); String path = join(documentsDirectory!.path, "UnitStocking.db"); var theDb = await openDatabase(path, version: 1,onCreate: _onCreate); return theDb; } // restoreDb()async{ // await closeDb(); // io.Directory documentsDirectory = await getExternalStorageDirectory(); // String backupPath = join(documentsDirectory.path.substring(0,documentsDirectory.path.indexOf("/Android"))+"/Download/UnitDBBackup/", "${prefs.getString(Keys.stockId)}_UnitStocking.db"); // io.File backupdbFile = io.File(backupPath); // if(backupdbFile.existsSync()){ // String path = join(documentsDirectory.path, "UnitStocking.db"); // backupdbFile.copySync(path); // return {"STATUS":1,"MSG":"File Back up successfull"}; // } // return {"STATUS":0,"MSG":"File Backup tidak ditemukan!"}; // } closeDb() async { final database = await db; if(database.isOpen){ await database.close(); _db = null; } } _onCreate(Database db, int version) async { io.Directory? documentsDirectory = await getExternalStorageDirectory(); String path = join(documentsDirectory!.path, "UnitStocking.db"); io.File file = io.File(path); print('Database created, ${file.lengthSync()}'); var res = await db.query(Tables.values,where: "${Columns.name} = ?",whereArgs: [Keys.stockId]); Value value = Value.fromJson(res.first); await prefs.setString(Keys.stockId, value.value); } getCount(mesin) async { final database = await db; var res = await database.rawQuery("SELECT COUNT(*) as count FROM ${Tables.blob} where ${Columns.mesin} = '$mesin'"); return res.isNotEmpty ? Count.fromJson(res.first).count : 0; } getUnitdetailMaster(id) async{ try{ final database = await db; var res = await database.rawQuery("SELECT * FROM '${Tables.master}' WHERE ${Columns.id} = $id"); return res.isNotEmpty ? Unit.fromJson(res.first) : null; } catch(e){ print(e); return null; } } Future> getAllUnits({inserted=false}) async { final database = await db; var res = await database.query("${Tables.master}",where: (inserted)?"${Columns.flag} = 'TRUE'":null,orderBy: "CASE WHEN ${Columns.flag} = 'FALSE' THEN 0 ELSE 1 END, ${Columns.state} desc"); // var res = await database.rawQuery("SELECT ${Columns.id}, ${Columns.mesin}, ${Columns.tipe}, ${Columns.state}, ${Columns.warna}, ${Columns.rangka},${Columns.kode},${Columns.flag}, ${Columns.timestamp} from ${Tables.master} ORDER BY CASE WHEN ${Columns.flag} = 'FALSE' THEN 0 ELSE 1 END, ${Columns.state} desc"); List list = res.isNotEmpty ? res.map((c) => Unit.fromJson(c)).toList() : []; return list; } Future> searchAllUnits(String query,{inserted:false}) async { // print("${(inserted)?"${Columns.flag} = 'TRUE' AND ":''} REPLACE(${Columns.mesin},'-','') like '%$query%' or ${Columns.rangka} like '%$query%' or ${Columns.mesin} like '%$query%' or ${Columns.timestamp} like '%$query%' or ${Columns.tipe} like '%$query%' or ${Columns.warna} like '%$query%' or UPPER(${Columns.state}) like '%$query%'"); final database = await db; try{ var res = await database.query(Tables.master,where: "${(inserted)?"${Columns.flag} = 'TRUE' AND ":''} (REPLACE(${Columns.mesin},'-','') like '%$query%' or ${Columns.rangka} like '%$query%' or ${Columns.mesin} like '%$query%' or ${Columns.timestamp} like '%$query%' or ${Columns.tipe} like '%$query%' or ${Columns.warna} like '%$query%' or UPPER(${Columns.state}) like '%$query%')",orderBy: "CASE WHEN ${Columns.flag} = 'FALSE' THEN 0 ELSE 1 END, ${Columns.state} desc"); // var res = await database.rawQuery( // "select * from (SELECT ${Columns.id}, ${Columns.state}, ${Columns.rangka}, ${Columns.mesin}, ${Columns.tipe}, ${Columns.warna}, ${Columns.timestamp}, ${Columns.mesin} from ${Tables.master} ) where REPLACE(${Columns.mesin},'-','') like '%$query%' or ${Columns.rangka} like '%$query%' or ${Columns.mesin} like '%$query%' or ${Columns.timestamp} like '%$query%' or ${Columns.tipe} like '%$query%' or ${Columns.warna} like '%$query%' or UPPER(${Columns.state}) like '%$query%' ORDER BY CASE WHEN ${Columns.flag} = 'FALSE' THEN 0 ELSE 1 END, ${Columns.state} desc"); List list = res.isNotEmpty ? res.map((c) => Unit.fromJson(c)).toList() : []; return list; } catch(e){ print(e); return []; } } getBlobUnits(mesin) async{ try{ final database = await db; var res = await database.query("${Tables.blob}" ,where: "${Columns.mesin} = ?", whereArgs: [mesin]); List list = res!=null ? res.map((c) => Blob.fromJson(c)).toList() : []; return list; } catch(e){ // print(e); return null; } } insertUpdateBlob(Blob blob) async{ return (blob.id==null)?newInsertBlob(blob):updateBlob(blob); } deleteBlob(id) async { final database = await db; try{ await database.delete("${Tables.blob}", where: "${Columns.id} = ?", whereArgs: [id]); return true; } catch(e){ print(e); return null; } } updateUnit(Unit unitUpdate) async{ try{ final database = await db; var res = await database.update("${Tables.master}", unitUpdate.toJson(), where: "${Columns.id} = ?", whereArgs: [unitUpdate.id]); var checkCount = await database.query(Tables.master,where: "${Columns.flag} = ?", whereArgs: ['TRUE']); if(checkCount.isNotEmpty&& checkCount.length%10==0){ backupDb(); } return res; } catch(e){ print(e); return null; } } updateBlob(Blob blobUpdate) async{ try{ final database = await db; var res = await database.update("${Tables.blob}", blobUpdate.toJson(), where: "${Columns.blobId} = ?", whereArgs: [blobUpdate.id]); return res; } catch(e){ print(e); return null; } } newInsertBlob(Blob newBlob) async { final database = await db; try{ var res = await database.rawInsert("Insert into ${Tables.blob}(${Columns.bytes},${Columns.mesin},${Columns.lat},${Columns.long},${Columns.jenis})VALUES(?,?,?,?,?)", [ newBlob.bytes, newBlob.mesin, newBlob.lat, newBlob.long, newBlob.jenis ]); print('Image Inserted'); return res; } catch(e){ print(e); return null; } } getThumbnail(mesin) async{ final database = await db; var res = await database.query("${Tables.blob}",where: "${Columns.mesin} = ? AND ${Columns.noUrut} = ?",whereArgs: [mesin,'1']); return res.isNotEmpty ? Blob.fromJson(res.first) : null; } Future?> getAllJenis() async { try{ final database = await db; var res = await database.query("${Tables.jenis}"); List list = res.isNotEmpty ? res.map((c) => ImageType.fromJson(c)).toList() : []; return list; } catch(e){ print(e); return null; } } getValue(value)async{ try{ final database = await db; var res = await database.query(Tables.values,where: "${Columns.name} = ?",whereArgs: [value]); return res.isEmpty?null:Value.fromJson(res.first); } catch(e){ return null; } } insertUpdateValue(Value newValue)async{ try{ final database = await db; var res = await database.rawQuery("Select Count(*) as count from ${Tables.values} where ${Columns.name} = '${newValue.name}'"); int count = res.isNotEmpty ? Count.fromJson(res.first).count : 0; return (count==0)?addNewValue(newValue):updateValue(newValue); } catch(e){ print(e); return null; } } updateValue(Value newValue) async { try{ final database = await db; var res = await database.update("${Tables.values}", newValue.toJson(), where: "${Columns.name} = ?", whereArgs: [newValue.name]); print('Row Updated'); return res; } catch(e){ print(e); return null; } } addNewValue(Value newValue) async { final database = await db; try{ var res = await database.rawInsert("Insert into ${Tables.values}(${Columns.name},${Columns.value})VALUES(?,?)", [ newValue.name, newValue.value ]); print('Row Inserted'); return res; } catch(e){ print(e); return null; } } deleteAll() async { final database = await db; try{ await database.rawQuery("DROP TABLE IF EXISTS ${Tables.blob}"); await database.rawQuery("DROP TABLE IF EXISTS ${Tables.master}"); return true; } catch(e){ print(e); return null; } } }