| @@ -67,7 +67,7 @@ if (keystorePropertiesFile.exists()) { | |||||
| } | } | ||||
| android { | android { | ||||
| compileSdkVersion 30 | |||||
| compileSdkVersion 31 | |||||
| sourceSets { | sourceSets { | ||||
| main.java.srcDirs += 'src/main/kotlin' | main.java.srcDirs += 'src/main/kotlin' | ||||
| @@ -11,7 +11,7 @@ | |||||
| <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> | ||||
| <application | <application | ||||
| android:name="io.flutter.app.FlutterApplication" | |||||
| android:name="${applicationName}" | |||||
| android:label="unitstocks" | android:label="unitstocks" | ||||
| android:icon="@mipmap/launcher_icon"> | android:icon="@mipmap/launcher_icon"> | ||||
| <activity | <activity | ||||
| @@ -19,8 +19,10 @@ class DBHelper { | |||||
| if (_db == null) _db = await initDb(); | if (_db == null) _db = await initDb(); | ||||
| return _db; | return _db; | ||||
| } | } | ||||
| backupDb() async{ | |||||
| try{ | |||||
| backupDb(context) async{ | |||||
| var result = {"STATUS":0,"MSG":"Backup gagal!"}; | |||||
| await util.permissionCheck(context,pHandler.Permission.storage,()async{ | |||||
| try{ | |||||
| // if(dbPath == null || dbPath == ''){ | // if(dbPath == null || dbPath == ''){ | ||||
| final database = await db; | final database = await db; | ||||
| var dbPath = database.path; | var dbPath = database.path; | ||||
| @@ -29,8 +31,6 @@ class DBHelper { | |||||
| await prefs.remove(keyClass.backup_stock_id); | await prefs.remove(keyClass.backup_stock_id); | ||||
| var stock_id = prefs.getString(keyClass.stock_id)??''; | var stock_id = prefs.getString(keyClass.stock_id)??''; | ||||
| if(stock_id != ''){ | if(stock_id != ''){ | ||||
| var cabang = prefs.getString(keyClass.cabang_id)??''; | |||||
| if(cabang !='' && cabang != null ) await prefs.setString(keyClass.backup_cabang_id,cabang); | |||||
| if(stock_id !='' && stock_id != null ) await prefs.setString(keyClass.backup_stock_id,stock_id); | if(stock_id !='' && stock_id != null ) await prefs.setString(keyClass.backup_stock_id,stock_id); | ||||
| //backupDatabase | //backupDatabase | ||||
| String backupPath = join(dbPath.substring(0,dbPath.indexOf("/Android"))+"/Download", "${prefs.getString(keyClass.backup_stock_id)}_UnitStocking.db"); | String backupPath = join(dbPath.substring(0,dbPath.indexOf("/Android"))+"/Download", "${prefs.getString(keyClass.backup_stock_id)}_UnitStocking.db"); | ||||
| @@ -40,21 +40,23 @@ class DBHelper { | |||||
| // dbFile.copySync(backupPath); | // dbFile.copySync(backupPath); | ||||
| Uint8List byte = dbFile.readAsBytesSync(); | Uint8List byte = dbFile.readAsBytesSync(); | ||||
| backupFile.writeAsBytesSync(byte); | backupFile.writeAsBytesSync(byte); | ||||
| return {"STATUS":1,"MSG":"Backup Berhasil!"}; | |||||
| result = {"STATUS":1,"MSG":"Backup Berhasil!"}; | |||||
| } | } | ||||
| else{ | else{ | ||||
| return {"STATUS":0,"MSG":"Backup gagal data unit tidak ditemukan!"}; | |||||
| result = {"STATUS":0,"MSG":"Backup gagal data unit tidak ditemukan!"}; | |||||
| print('file backup dont exist tho'); | print('file backup dont exist tho'); | ||||
| } | } | ||||
| } | } | ||||
| else{ | else{ | ||||
| return {"STATUS":0,"MSG":"Backup gagal data unit tidak ditemukan!"}; | |||||
| result = {"STATUS":0,"MSG":"Backup gagal data unit tidak ditemukan!"}; | |||||
| } | } | ||||
| } | } | ||||
| catch(e){ | catch(e){ | ||||
| print(e); | print(e); | ||||
| return {"STATUS":0,"MSG":"Backup gagal!"}; | |||||
| result = {"STATUS":0,"MSG":"Backup gagal!"}; | |||||
| } | } | ||||
| },customMessage: " untuk menyimpan data backup"); | |||||
| return result; | |||||
| } | } | ||||
| initDb() async { | initDb() async { | ||||
| io.Directory documentsDirectory = await getExternalStorageDirectory(); | io.Directory documentsDirectory = await getExternalStorageDirectory(); | ||||
| @@ -63,26 +65,23 @@ class DBHelper { | |||||
| return theDb; | return theDb; | ||||
| } | } | ||||
| restoreDb()async{ | |||||
| restoreDb(context)async{ | |||||
| var result = {"STATUS":0,"MSG":"File Backup tidak ditemukan!"}; | var result = {"STATUS":0,"MSG":"File Backup tidak ditemukan!"}; | ||||
| if(prefs.getString(keyClass.stock_id) == null || prefs.getString(keyClass.stock_id) == prefs.getString(keyClass.backup_cabang_id)){ | |||||
| if(prefs.getString(keyClass.backup_stock_id)!=null && prefs.getString(keyClass.backup_cabang_id)!= 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(keyClass.backup_stock_id)}_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":"File Back up successfull"}; | |||||
| await DBHelper.database.closeDb(); | |||||
| } | |||||
| else result = {"STATUS":0,"MSG":"File Backup tidak ditemukan!"}; | |||||
| },customMessage: " untuk menyimpan data backup"); | |||||
| } | |||||
| if(prefs.getString(keyClass.backup_stock_id)!=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(keyClass.backup_stock_id)}_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":"File Back up successfull"}; | |||||
| await DBHelper.database.closeDb(); | |||||
| } | |||||
| else result = {"STATUS":0,"MSG":"File Backup tidak ditemukan!"}; | |||||
| },customMessage: " untuk menyimpan data backup"); | |||||
| } | } | ||||
| else result = {"STATUS":0,"MSG":"File Backup tidak ditemukan!"}; | |||||
| return result; | return result; | ||||
| } | } | ||||
| @@ -37,7 +37,7 @@ class _HomePageState extends State<HomePage> { | |||||
| String state = ''; | String state = ''; | ||||
| final hostAddress = new TextEditingController(); | final hostAddress = new TextEditingController(); | ||||
| clearData(context,{backup=true})async{ | |||||
| clearData(context)async{ | |||||
| setState(() { | setState(() { | ||||
| progressDL = null; | progressDL = null; | ||||
| isLoading = false; | isLoading = false; | ||||
| @@ -63,8 +63,6 @@ class _HomePageState extends State<HomePage> { | |||||
| File db = File(path); | File db = File(path); | ||||
| if(db.existsSync()){ | if(db.existsSync()){ | ||||
| await DBHelper.database.closeDb(); | await DBHelper.database.closeDb(); | ||||
| //auto backup | |||||
| // if(backup)await DBHelper.database.backupDb(context); | |||||
| db.deleteSync(); | db.deleteSync(); | ||||
| await prefs.remove(keyClass.lastDownload); | await prefs.remove(keyClass.lastDownload); | ||||
| await prefs.remove(keyClass.lastUpload); | await prefs.remove(keyClass.lastUpload); | ||||
| @@ -281,6 +279,7 @@ class _HomePageState extends State<HomePage> { | |||||
| await prefs.remove(keyClass.lastUpload); | await prefs.remove(keyClass.lastUpload); | ||||
| await prefs.remove(keyClass.targetProccess); | await prefs.remove(keyClass.targetProccess); | ||||
| await prefs.remove(keyClass.submitProccess); | await prefs.remove(keyClass.submitProccess); | ||||
| await prefs.remove(keyClass.stock_id); | |||||
| lastUpload = ''; | lastUpload = ''; | ||||
| lastDownload = ''; | lastDownload = ''; | ||||
| timeString = ''; | timeString = ''; | ||||
| @@ -674,69 +673,92 @@ class _HomePageState extends State<HomePage> { | |||||
| Navigator.pushNamed(context, '/login'); | Navigator.pushNamed(context, '/login'); | ||||
| } | } | ||||
| if(value == 'backup'){ | if(value == 'backup'){ | ||||
| var result = await DBHelper.database.backupDb(); | |||||
| var result = await DBHelper.database.backupDb(context); | |||||
| util.showFlushbar(context, result['MSG'],color: result["STATUS"]==1?Colors.grey:Colors.red); | util.showFlushbar(context, result['MSG'],color: result["STATUS"]==1?Colors.grey:Colors.red); | ||||
| } | } | ||||
| if(value == 'restore'){ | if(value == 'restore'){ | ||||
| bool isRestore = await showDialog(context: context,builder: (context)=>AlertDialog( | |||||
| title: Text('Restore Data ?'), | |||||
| content: Text('Restore data akan menghapus dan mengganti data unit dan cabang yang ada dengan data backup.'), | |||||
| actions: <Widget>[ | |||||
| TextButton( | |||||
| child: Text('Proceed'), | |||||
| onPressed: ()async{ | |||||
| Navigator.pop(context,true); | |||||
| }, | |||||
| ), | |||||
| TextButton( | |||||
| child: Text('Cancel'), | |||||
| onPressed: ()=>Navigator.pop(context,false), | |||||
| ) | |||||
| ], | |||||
| )); | |||||
| if(isRestore??false){ | |||||
| var response; | |||||
| bool isclear; | |||||
| Directory documentsDirectory = await getExternalStorageDirectory(); | |||||
| String path = join(documentsDirectory.path, "UnitStocking.db"); | |||||
| File db = File(path); | |||||
| if(db.existsSync()){ | |||||
| isclear = await clearData(context,backup: false); | |||||
| } | |||||
| else{ | |||||
| isclear = true; | |||||
| } | |||||
| if(isclear??false){ | |||||
| var result = await DBHelper.database.restoreDb(); | |||||
| if(result["STATUS"]==1){ | |||||
| await prefs.remove(keyClass.lastDownload); | |||||
| await prefs.remove(keyClass.lastUpload); | |||||
| await prefs.remove(keyClass.targetProccess); | |||||
| await prefs.remove(keyClass.submitProccess); | |||||
| setState(() { | |||||
| lastUpload = ''; | |||||
| lastDownload = ''; | |||||
| timeString = ''; | |||||
| }); | |||||
| valueTab value = await DBHelper.database.getValue(keyClass.tgl_start); | |||||
| if(value != null)await prefs.setString(keyClass.lastDownload, DateFormat('dd-MM-yyyy HH:mm:ss').parse(value.value).toIso8601String()); | |||||
| else { | |||||
| await prefs.setString(keyClass.lastDownload, DateTime.now().toIso8601String()); | |||||
| if(prefs.getString(keyClass.stock_id) == null){ | |||||
| util.showFlushbar(context, "Data Unit cabang tidak ditemukan. Silakan get data terlbih dahulu."); | |||||
| } | |||||
| else{ | |||||
| if(prefs.getString(keyClass.stock_id) == prefs.getString(keyClass.backup_stock_id)){ | |||||
| String company = prefs.getString(keyClass.company); | |||||
| String stock_taking_id = prefs.getString(keyClass.stock_id); | |||||
| String stockState = ''; | |||||
| if(company!=null&&stock_taking_id!=null){ | |||||
| var result = await util.JsonDataPostRaw({"company":company,"stockTakingId":stock_taking_id}, '${prefs.getString(keyClass.hostAddress)}/stock_taking/state/'); | |||||
| if(result['STATUS']==1){ | |||||
| stockState = result['DATA']; | |||||
| } | } | ||||
| value = await DBHelper.database.getValue(keyClass.stock_id); | |||||
| if(value != null) await prefs.setString(keyClass.stock_id,value.value); | |||||
| else { | |||||
| await prefs.setString(keyClass.stock_id,prefs.getString(keyClass.backup_stock_id)); | |||||
| } | |||||
| if(['Open','Submitted'].contains(stockState)){ | |||||
| bool isRestore = await showDialog(context: context,builder: (context)=>AlertDialog( | |||||
| title: Text('Restore Data ?'), | |||||
| content: Text('Restore data akan menghapus dan mengganti data unit dan cabang yang ada dengan data backup.'), | |||||
| actions: <Widget>[ | |||||
| TextButton( | |||||
| child: Text('Proceed'), | |||||
| onPressed: ()async{ | |||||
| Navigator.pop(context,true); | |||||
| }, | |||||
| ), | |||||
| TextButton( | |||||
| child: Text('Cancel'), | |||||
| onPressed: ()=>Navigator.pop(context,false), | |||||
| ) | |||||
| ], | |||||
| )); | |||||
| if(isRestore??false){ | |||||
| var response; | |||||
| bool isclear; | |||||
| Directory documentsDirectory = await getExternalStorageDirectory(); | |||||
| String path = join(documentsDirectory.path, "UnitStocking.db"); | |||||
| File db = File(path); | |||||
| if(db.existsSync()){ | |||||
| isclear = await clearData(context); | |||||
| } | |||||
| else{ | |||||
| isclear = true; | |||||
| } | |||||
| if(isclear??false){ | |||||
| var result = await DBHelper.database.restoreDb(context); | |||||
| if(result["STATUS"]==1){ | |||||
| await prefs.remove(keyClass.lastDownload); | |||||
| await prefs.remove(keyClass.lastUpload); | |||||
| await prefs.remove(keyClass.targetProccess); | |||||
| await prefs.remove(keyClass.submitProccess); | |||||
| setState(() { | |||||
| lastUpload = ''; | |||||
| lastDownload = ''; | |||||
| timeString = ''; | |||||
| }); | |||||
| valueTab value = await DBHelper.database.getValue(keyClass.tgl_start); | |||||
| if(value != null)await prefs.setString(keyClass.lastDownload, DateFormat('dd-MM-yyyy HH:mm:ss').parse(value.value).toIso8601String()); | |||||
| else { | |||||
| await prefs.setString(keyClass.lastDownload, DateTime.now().toIso8601String()); | |||||
| } | |||||
| value = await DBHelper.database.getValue(keyClass.stock_id); | |||||
| if(value != null) await prefs.setString(keyClass.stock_id,value.value); | |||||
| else { | |||||
| await prefs.setString(keyClass.stock_id,prefs.getString(keyClass.backup_stock_id)); | |||||
| } | |||||
| loadState(); | |||||
| setState(() { | |||||
| lastDownload = prefs.getString(keyClass.lastDownload); | |||||
| }); | |||||
| } | |||||
| response = result["MSG"]; | |||||
| } | |||||
| if(response != null)util.showFlushbar(context, response); | |||||
| } | } | ||||
| await prefs.setString(keyClass.cabang_id,prefs.getString(keyClass.backup_cabang_id)); | |||||
| loadState(); | |||||
| setState(() { | |||||
| lastDownload = prefs.getString(keyClass.lastDownload); | |||||
| }); | |||||
| } | } | ||||
| response = result["MSG"]; | |||||
| else{ | |||||
| util.showFlushbar(context, "Stocking Unit sudah selesai dan tidak perlu di restore"); | |||||
| } | |||||
| } | |||||
| else { | |||||
| util.showFlushbar(context, "File Backup tidak ditemukan atau sudah selesai"); | |||||
| } | } | ||||
| if(response != null)util.showFlushbar(context, response); | |||||
| } | } | ||||
| } | } | ||||
| }, | }, | ||||
| @@ -247,6 +247,13 @@ packages: | |||||
| url: "https://pub.dartlang.org" | url: "https://pub.dartlang.org" | ||||
| source: hosted | source: hosted | ||||
| version: "0.12.11" | version: "0.12.11" | ||||
| material_color_utilities: | |||||
| dependency: transitive | |||||
| description: | |||||
| name: material_color_utilities | |||||
| url: "https://pub.dartlang.org" | |||||
| source: hosted | |||||
| version: "0.1.3" | |||||
| meta: | meta: | ||||
| dependency: transitive | dependency: transitive | ||||
| description: | description: | ||||
| @@ -524,7 +531,7 @@ packages: | |||||
| name: test_api | name: test_api | ||||
| url: "https://pub.dartlang.org" | url: "https://pub.dartlang.org" | ||||
| source: hosted | source: hosted | ||||
| version: "0.4.3" | |||||
| version: "0.4.8" | |||||
| typed_data: | typed_data: | ||||
| dependency: transitive | dependency: transitive | ||||
| description: | description: | ||||
| @@ -580,7 +587,7 @@ packages: | |||||
| name: url_launcher_web | name: url_launcher_web | ||||
| url: "https://pub.dartlang.org" | url: "https://pub.dartlang.org" | ||||
| source: hosted | source: hosted | ||||
| version: "2.0.6" | |||||
| version: "2.0.8" | |||||
| url_launcher_windows: | url_launcher_windows: | ||||
| dependency: transitive | dependency: transitive | ||||
| description: | description: | ||||
| @@ -625,4 +632,4 @@ packages: | |||||
| version: "3.1.0" | version: "3.1.0" | ||||
| sdks: | sdks: | ||||
| dart: ">=2.15.0 <3.0.0" | dart: ">=2.15.0 <3.0.0" | ||||
| flutter: ">=2.8.0" | |||||
| flutter: ">=2.10.0" | |||||