Flutter app for Asset Management
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

390 lines
14 KiB

  1. import 'dart:typed_data';
  2. import 'package:assetstock/util/Models.dart';
  3. import 'package:sqflite/sqflite.dart';
  4. import 'package:path_provider/path_provider.dart';
  5. import 'prefsKey.dart';
  6. import 'dart:io';
  7. import 'dart:async';
  8. import 'package:path/path.dart';
  9. import 'package:intl/intl.dart';
  10. import 'package:assetstock/main.dart';
  11. import 'package:permission_handler/permission_handler.dart' as pHandler;
  12. class DBHelper{
  13. DBHelper._();
  14. static final DBHelper database = DBHelper._();
  15. Database _db;
  16. Future<Database> get db async {
  17. if (_db != null) return _db;
  18. _db = await initDb();
  19. return _db;
  20. }
  21. backupDb({context}) async{
  22. var result = {"STATUS":0,"MSG":"Backup gagal!"};
  23. var stock_id = prefs.getString(keyClass.dbName)??'';
  24. if(stock_id != ''){
  25. await util.permissionCheck(context,pHandler.Permission.storage,()async{
  26. try{
  27. // if(dbPath == null || dbPath == ''){
  28. final database = await db;
  29. var dbPath = database.path;
  30. await DBHelper.database.closeDb();
  31. // }
  32. await prefs.remove(keyClass.backup_stock_id);
  33. if(stock_id !='' && stock_id != null ) await prefs.setString(keyClass.backup_stock_id,stock_id);
  34. //backupDatabase
  35. // String backupPath = join(dbPath.substring(0,dbPath.indexOf("/Android"))+"/Download", "${prefs.getString(keyClass.backup_stock_id)}_assets.db");
  36. Directory documentsDirectory = await getApplicationDocumentsDirectory();
  37. String backupPath = join(documentsDirectory.path, "${prefs.getString(keyClass.backup_stock_id)}_assets.db");
  38. File backupFile = new File(backupPath);
  39. File dbFile = File(dbPath);
  40. if(dbFile.existsSync()){
  41. // dbFile.copySync(backupPath);
  42. Uint8List byte = dbFile.readAsBytesSync();
  43. backupFile.writeAsBytesSync(byte);
  44. result = {"STATUS":1,"MSG":"Backup Berhasil!"};
  45. }
  46. else{
  47. result = {"STATUS":0,"MSG":"Backup gagal data unit tidak ditemukan!"};
  48. print('file backup dont exist tho');
  49. }
  50. }
  51. catch(e){
  52. print("backup gagal $e");
  53. result = {"STATUS":0,"MSG":"Backup gagal!"};
  54. }
  55. },customMessage: " untuk menyimpan data backup");
  56. }
  57. else{
  58. result = {"STATUS":0,"MSG":"Backup gagal data unit tidak ditemukan!"};
  59. }
  60. return result;
  61. }
  62. restoreDb(context)async{
  63. var result = {"STATUS":0,"MSG":"File Backup tidak ditemukan!"};
  64. if(prefs.getString(keyClass.backup_stock_id)!=null){
  65. await util.permissionCheck(context,pHandler.Permission.storage,()async{
  66. Directory documentsDirectory = await getApplicationDocumentsDirectory();
  67. // String backupPath = join(documentsDirectory.path.substring(0,documentsDirectory.path.indexOf("/Android"))+"/Download", "${prefs.getString(keyClass.backup_stock_id)}_assets.db");
  68. String backupPath = join(documentsDirectory.path, "${prefs.getString(keyClass.backup_stock_id)}_assets.db");
  69. File backupdbFile = File(backupPath);
  70. if(backupdbFile.existsSync()){
  71. File dbFile = new File(join(documentsDirectory.path, "assets.db"));
  72. Uint8List byte = backupdbFile.readAsBytesSync();
  73. dbFile.writeAsBytesSync(byte);
  74. result = {"STATUS":1,"MSG":"File Back up successfull"};
  75. await DBHelper.database.closeDb();
  76. }
  77. else result = {"STATUS":0,"MSG":"File Backup tidak ditemukan!"};
  78. },customMessage: " untuk menyimpan data backup");
  79. }
  80. return result;
  81. }
  82. initDb() async {
  83. Directory documentsDirectory = await getApplicationDocumentsDirectory();
  84. String path = join(documentsDirectory.path, "assets.db");
  85. var theDb = await openDatabase(path, version: 1,onCreate: _onCreate);
  86. return theDb;
  87. }
  88. closeDb() async {
  89. if(_db!=null){
  90. final database = await db;
  91. await database.close();
  92. _db = null;
  93. }
  94. }
  95. void _onCreate(Database db, int version) async {
  96. Directory documentsDirectory = await getApplicationDocumentsDirectory();
  97. String path = join(documentsDirectory.path, "assets.db");
  98. File file = File(path);
  99. print('Database created, ${file.lengthSync()}');
  100. }
  101. autoBackup(database)async{
  102. var checkCount = await database.query(tableName.insert,where: "${columnName.blob} is not null");
  103. return checkCount.isNotEmpty&& checkCount.length%5==0;
  104. }
  105. insertAsset(Asset newAsset) async{
  106. try{
  107. final database = await db;
  108. await database.rawInsert("Insert into ${tableName.insert} (${columnName.tag_number},${columnName.blob},${columnName.keterangan}) VALUES(?,?,?)", [newAsset.tag_number,newAsset.blob,newAsset.keterangan]);
  109. await database.rawQuery("UPDATE ${tableName.ref} SET ${columnName.flag} = 'TRUE' WHERE ${columnName.tag_number} = '${newAsset.tag_number}'");
  110. if(await autoBackup(database)){
  111. backupDb();
  112. }
  113. return true;
  114. }
  115. catch(e){
  116. print(e);
  117. return null;
  118. }
  119. }
  120. updateAsset(Asset newAsset) async{
  121. try{
  122. final database = await db;
  123. await database.rawUpdate("Update ${tableName.insert} SET ${columnName.blob} = ?, ${columnName.tag_number} = ?, ${columnName.keterangan} = ? WHERE ${columnName.no} = ?", [newAsset.blob,newAsset.tag_number,newAsset.keterangan,newAsset.no]);
  124. if(await autoBackup(database)){
  125. backupDb();
  126. }
  127. return true;
  128. }
  129. catch(e){
  130. print(e);
  131. return null;
  132. }
  133. }
  134. getBlobbyTag(tag) async{
  135. try{
  136. final database = await db;
  137. var res = await database.query(tableName.insert,where: "${columnName.tag_number} = ?",whereArgs: [tag]);
  138. // var a = await database.rawQuery("select length(${columnName.blob}) / 1024 from ${tableName.insert} where ${columnName.no} = $no");
  139. // print(a);
  140. return res.isNotEmpty ? Asset.fromJson(res.first): null;
  141. }
  142. catch(e){
  143. print(e);
  144. return null;
  145. }
  146. }
  147. getBlobbyNo(no) async{
  148. try{
  149. final database = await db;
  150. var res = await database.query(tableName.insert,where: "${columnName.no} = ?",whereArgs: [no]);
  151. // var a = await database.rawQuery("select length(${columnName.blob}) / 1024 from ${tableName.insert} where ${columnName.no} = $no");
  152. // print(a);
  153. return res.isNotEmpty ? Asset.fromJson(res.first): null;
  154. }
  155. catch(e){
  156. print(e);
  157. return null;
  158. }
  159. }
  160. // getRefBlob(tagNumber)async{
  161. // try{
  162. // final database = await db;
  163. // var res = await database.query(tableName.insert,where: "${columnName.tag_number} = ?",whereArgs: [tagNumber]);
  164. // // var a = await database.rawQuery("select count(*) from ${tableName.insert}");
  165. // // print(a);
  166. // return res.isNotEmpty ? Asset.fromJson(res.first): null;
  167. // }
  168. // catch(e){
  169. // print(e);
  170. // return null;
  171. // }
  172. // }
  173. searchbyTagNumber(tagNumber) async{
  174. try{
  175. final database = await db;
  176. var exist = await database.query(tableName.insert,where: "${columnName.tag_number} = ?",whereArgs: [tagNumber]);
  177. var res = await database.query(tableName.ref,where: "${columnName.tag_number} = ?",whereArgs: [tagNumber]);
  178. if(res.isEmpty&&exist.isNotEmpty){
  179. var appendAsset = new Asset();
  180. appendAsset.tag_number=tagNumber;
  181. return {"EXIST":exist.isNotEmpty?true:false,"DATA":appendAsset};
  182. }
  183. else return {"EXIST":exist.isNotEmpty?true:false,"DATA":res.isNotEmpty ? Asset.fromJson(res.first): null};
  184. }
  185. catch(e){
  186. print(e);
  187. return null;
  188. }
  189. }
  190. getAllKategori() async{
  191. try{
  192. final database = await db;
  193. var res = await database.rawQuery("SELECT Distinct UPPER(${columnName.kategori}) ${columnName.kategori} from ${tableName.ref} ORDER BY UPPER(${columnName.kategori})");
  194. List<Asset> list =
  195. res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList().reversed.toList() : [];
  196. return list;
  197. }
  198. catch(e){
  199. print(e);
  200. return null;
  201. }
  202. }
  203. getAllLocation() async{
  204. try{
  205. final database = await db;
  206. var res = await database.rawQuery("SELECT Distinct UPPER(${columnName.lantai}) ${columnName.lantai} from ${tableName.ref} ORDER BY UPPER(${columnName.lantai})");
  207. List<Asset> list =
  208. res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList().reversed.toList() : [];
  209. return list;
  210. }
  211. catch(e){
  212. print(e);
  213. return null;
  214. }
  215. }
  216. getAllRuangan() async{
  217. try{
  218. final database = await db;
  219. var res = await database.rawQuery("SELECT Distinct UPPER(${columnName.ruang}) ${columnName.ruang} from ${tableName.ref} ORDER BY UPPER(${columnName.ruang})");
  220. List<Asset> list =
  221. res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList().reversed.toList() : [];
  222. return list;
  223. }
  224. catch(e){
  225. print(e);
  226. return null;
  227. }
  228. }
  229. getLantaiRuangan(lantai) async{
  230. try{
  231. final database = await db;
  232. var res = await database.rawQuery("SELECT Distinct UPPER(${columnName.ruang}) ${columnName.ruang} from ${tableName.ref} WHERE UPPER(${columnName.lantai}) = UPPER('$lantai') ORDER BY UPPER(${columnName.ruang})");
  233. List<Asset> list =
  234. res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList().reversed.toList() : [];
  235. return list;
  236. }
  237. catch(e){
  238. print(e);
  239. return null;
  240. }
  241. }
  242. getAllAsset() async {
  243. try{
  244. final database = await db;
  245. var res = await database.rawQuery("SELECT a.${columnName.tag_number}, a.${columnName.asset_desc},a.${columnName.kategori}, a.${columnName.ruang}, a.${columnName.lantai}, a.${columnName.gedung}, a.${columnName.flag}, b.${columnName.blob} from ${tableName.ref} a LEFT JOIN ${tableName.insert} b on a.${columnName.tag_number} = b.${columnName.tag_number} ORDER BY a.${columnName.flag},a.${columnName.ruang}");
  246. List<Asset> list =
  247. res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList() : [];
  248. return list;
  249. }
  250. catch(e){
  251. print(e);
  252. return null;
  253. }
  254. }
  255. filterAllAsset(search) async {
  256. try{
  257. final database = await db;
  258. var res = await database.rawQuery("SELECT * FROM (SELECT a.${columnName.tag_number}, a.${columnName.asset_desc},a.${columnName.kategori}, a.${columnName.ruang}, a.${columnName.lantai}, a.${columnName.gedung}, a.${columnName.flag}, b.${columnName.blob} from ${tableName.ref} a LEFT JOIN ${tableName.insert} b on a.${columnName.tag_number} = b.${columnName.tag_number}) WHERE UPPER(${columnName.tag_number}) Like '%$search%' ORDER BY ${columnName.flag},${columnName.ruang}");
  259. List<Asset> list =
  260. res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList() : [];
  261. return list;
  262. }
  263. catch(e){
  264. print(e);
  265. return null;
  266. }
  267. }
  268. getAllInsertAsset() async {
  269. try{
  270. final database = await db;
  271. // var res = await database.rawQuery("SELECT a.*, b.${columnName.asset_desc}, b.${columnName.gedung}, b.${columnName.lantai}, b.${columnName.ruang} FROM ${tableName.insert} a, ${tableName.ref} b WHERE a.${columnName.tag_number} = b.${columnName.tag_number}");
  272. var res = await database.rawQuery("select a.*, b.${columnName.asset_desc}, b.${columnName.gedung}, b.${columnName.lantai}, b.${columnName.ruang} from ${tableName.insert} a LEFT JOIN ${tableName.ref} b ON a.${columnName.tag_number} = b.${columnName.tag_number}");
  273. List<Asset> list =
  274. res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList() : [];
  275. return list;
  276. }
  277. catch(e){
  278. print(e);
  279. return null;
  280. }
  281. }
  282. deleteInsertAsset(no) async{
  283. try{
  284. final database = await db;
  285. // await database.rawUpdate("Update ${tableName.insert} SET ${columnName.blob} = ?, ${columnName.tag_number} = ?, ${columnName.keterangan} = ? WHERE ${columnName.no} = ?", [newAsset.blob,newAsset.tag_number,newAsset.keterangan,newAsset.no]);
  286. await database.delete(tableName.insert,where: "${columnName.no} = ?",whereArgs: [no]);
  287. return true;
  288. }
  289. catch(e){
  290. print(e);
  291. return null;
  292. }
  293. }
  294. filterAllInsertAsset(search) async {
  295. try{
  296. final database = await db;
  297. // var res = await database.rawQuery("SELECT * FROM (SELECT a.${columnName.no},a.${columnName.keterangan},a.${columnName.tag_number},a.${columnName.blob}, b.${columnName.asset_desc}, b.${columnName.gedung}, b.${columnName.lantai}, b.${columnName.ruang} FROM ${tableName.insert} a, ${tableName.ref} b WHERE a.${columnName.tag_number} = b.${columnName.tag_number}) WHERE UPPER(${columnName.tag_number}) Like '%$search%'");
  298. var res = await database.rawQuery("SELECT * FROM (select a.*, b.${columnName.asset_desc}, b.${columnName.gedung}, b.${columnName.lantai}, b.${columnName.ruang} from ${tableName.insert} a LEFT JOIN ${tableName.ref} b ON a.${columnName.tag_number} = b.${columnName.tag_number}) WHERE UPPER(${columnName.tag_number}) Like '%$search%'");
  299. List<Asset> list =
  300. res.isNotEmpty ? res.map((c) => Asset.fromJson(c)).toList() : [];
  301. return list;
  302. }
  303. catch(e){
  304. print(e);
  305. return null;
  306. }
  307. }
  308. countRows(tableName)async{
  309. try{
  310. final database = await db;
  311. var res = await database.rawQuery("SELECT Count(*) Count FROM $tableName");
  312. return res.isEmpty?0:Count.fromJson(res.first).count;
  313. }
  314. catch(e){
  315. print(e);
  316. return null;
  317. }
  318. }
  319. getDbName()async{
  320. try{
  321. final database = await db;
  322. var res = await database.rawQuery("SELECT ${columnName.value} FROM ${tableName.key} where ${columnName.key} = 'DB_MASTER_NAME'");
  323. return res.isEmpty?null:res.first[columnName.value];
  324. }
  325. catch(e){
  326. print(e);
  327. return null;
  328. }
  329. }
  330. getBUnit()async{
  331. try{
  332. final database = await db;
  333. var res = await database.rawQuery("SELECT ${columnName.value} FROM ${tableName.key} where ${columnName.key} = 'BUSINESS_UNIT'");
  334. return res.isEmpty?null:res.first[columnName.value];
  335. }
  336. catch(e){
  337. print(e);
  338. return null;
  339. }
  340. }
  341. setOpenState()async{
  342. try{
  343. final database = await db;
  344. var check_KEY = await database.rawQuery("SELECT 1 FROM ${tableName.key} where ${columnName.key} = 'STATE'");
  345. if (check_KEY.length<=0){
  346. await database.insert(tableName.key, {columnName.key:"STATE",columnName.value:"OPEN"});
  347. }
  348. else{
  349. await database.update(tableName.key, {columnName.value:"OPEN"},where: "${columnName.key} = ?",whereArgs: ['STATE']);
  350. }
  351. await database.update(tableName.key, {columnName.value:DateFormat("YYYY-MM-DD HH:mm:ss").format(DateTime.now())},where: "${columnName.key} = ?",whereArgs: ['START_DATE']);
  352. }
  353. catch(e){
  354. print(e);
  355. return null;
  356. }
  357. }
  358. }