flutter app untuk unitstock
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.
 
 
 
 
 

1068 rivejä
52 KiB

  1. import 'dart:async';
  2. import 'dart:io';
  3. import 'package:flutter/rendering.dart';
  4. import 'package:flutter/widgets.dart';
  5. import 'package:path/path.dart';
  6. import 'package:flutter/cupertino.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:path_provider/path_provider.dart';
  9. import 'Util/DBHelper.dart';
  10. import 'Util/Util.dart';
  11. import 'Util/download_Upload_Handler.dart';
  12. import 'package:intl/intl.dart';
  13. import 'main.dart';
  14. import 'Util/Prefs.dart';
  15. import 'Util/UnitModel.dart';
  16. class HomePage extends StatefulWidget {
  17. // HomePage({Key key}) : super(key: key);
  18. final String title;
  19. HomePage({this.title});
  20. @override
  21. _HomePageState createState() => _HomePageState();
  22. }
  23. class _HomePageState extends State<HomePage> {
  24. Util util = new Util();
  25. StreamSubscription progressDLStream,progressULStream;
  26. String lastDownload = '';
  27. String lastUpload = '';
  28. double progressDL,progressUL;
  29. String timeString = '';
  30. bool isLoading = false;
  31. String state = '';
  32. final hostAddress = new TextEditingController();
  33. clearData(context)async{
  34. setState(() {
  35. progressDL = null;
  36. isLoading = false;
  37. });
  38. String errMsg;
  39. bool result = await showDialog(context: context,builder: (context)=>WillPopScope(
  40. onWillPop: ()async{
  41. Navigator.pop(context,false);
  42. return false;
  43. },
  44. child: AlertDialog(
  45. title: Text('Clear Data ?'),
  46. content: Text('Proceed to clear any remaining units data on this device?'),
  47. actions: <Widget>[
  48. TextButton(
  49. child: Text('Proceed'),
  50. onPressed: ()async{
  51. util.showLoading(context);
  52. await Future.sync(()async{
  53. await prefs.remove(keyClass.lastDownload);
  54. await prefs.remove(keyClass.lastUpload);
  55. await prefs.remove(keyClass.targetProccess);
  56. await prefs.remove(keyClass.submitProccess);
  57. await prefs.remove(keyClass.stock_id);
  58. setState(() {
  59. lastUpload = '';
  60. lastDownload = '';
  61. timeString = '';
  62. });
  63. // var result = await DBHelper.database.deleteAll();
  64. // if(result!=null) {
  65. // await DBHelper.database.closeDb();
  66. // if(result!=null){
  67. try{
  68. Directory documentsDirectory = await getApplicationDocumentsDirectory();
  69. String path = join(documentsDirectory.path, "UnitStocking.db");
  70. File db = File(path);
  71. if(db.existsSync()){
  72. db.deleteSync();
  73. }
  74. }
  75. catch(e){
  76. print(e);
  77. util.showFlushbar(context, 'Failed to delete database file',color: Colors.red);
  78. }
  79. // }
  80. // else{
  81. // errMsg = 'Failed to clear unit data';
  82. // }
  83. // }
  84. // else{
  85. // errMsg = 'Failed to clear unit data';
  86. // }
  87. });
  88. Navigator.pop(context);
  89. Navigator.pop(context,true);
  90. util.showFlushbar(context,errMsg??'Data Cleared');
  91. },
  92. ),
  93. TextButton(
  94. child: Text('Cancel'),
  95. onPressed: (){Navigator.pop(context,false);},
  96. )
  97. ],
  98. ),
  99. ));
  100. return result;
  101. }
  102. loadState()async{
  103. String company = prefs.getString(keyClass.company);
  104. String stock_taking_id = prefs.getString(keyClass.stock_id);
  105. if(company!=null&&stock_taking_id!=null){
  106. var result = await util.JsonDataPostRaw({"company":company,"stockTakingId":stock_taking_id}, '${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/getStateStockUnit');
  107. print(result);
  108. if(result['STATUS']==1){
  109. setState(() {
  110. state = result['DATA']['STATE'];
  111. });
  112. }
  113. }
  114. }
  115. @override
  116. void initState() {
  117. // TODO: implement initState
  118. super.initState();
  119. loadState();
  120. lastDownload = prefs.getString(keyClass.lastDownload)??'';
  121. lastUpload = prefs.getString(keyClass.lastUpload)??'';
  122. }
  123. changeCabang(context)async{
  124. util.showLoading(context);
  125. var result = await util.JsonDataPostRaw({"company":prefs.getString(keyClass.company),"User":prefs.getString(keyClass.user_id)}, '${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/getCabangByUser');
  126. Navigator.pop(context);
  127. if(result['STATUS']==1){
  128. var selected = prefs.getString(keyClass.cabang_id)??result['DATA'][0]["RETURN_VALUE"];
  129. return await showDialog(context: context,builder: (context)=>StatefulBuilder(
  130. builder:(context,setState)=>
  131. Material(
  132. color: Colors.white.withOpacity(0.9),
  133. child: Center(
  134. child: Container(
  135. decoration: BoxDecoration(
  136. color: Colors.white,
  137. boxShadow: [
  138. BoxShadow(
  139. color: Colors.grey.withOpacity(0.5),
  140. spreadRadius: 2,
  141. blurRadius: 2,
  142. offset: Offset(0, 0), // changes position of shadow
  143. ),
  144. ],
  145. borderRadius: BorderRadius.circular(5)
  146. ),
  147. // height: MediaQuery.of(context).size.height/3.2,
  148. height:220,
  149. width: MediaQuery.of(context).size.width*0.75,
  150. child: Column(
  151. children: <Widget>[
  152. Flexible(
  153. flex:3,
  154. child: Container(
  155. padding: EdgeInsets.only(top:10,left: 10,right: 10),
  156. alignment: Alignment.center,
  157. decoration: BoxDecoration(
  158. // color: Colors.indigo,
  159. borderRadius: BorderRadius.only(topLeft: Radius.circular(5),topRight: Radius.circular(5))
  160. ),
  161. child: Column(
  162. mainAxisSize: MainAxisSize.min,
  163. crossAxisAlignment: CrossAxisAlignment.center,
  164. children: <Widget>[
  165. Icon(Icons.business,size: 70,color: Colors.indigo,),
  166. SizedBox(height: 5,),
  167. Text('Set Cabang',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 16,color: Colors.indigo),)
  168. ],
  169. ),
  170. ),
  171. ),
  172. Flexible(
  173. flex: 1,
  174. child: Container(
  175. padding: EdgeInsets.only(left: 20,right: 20),
  176. alignment: Alignment.centerLeft,
  177. child: Theme(
  178. data: ThemeData(
  179. canvasColor: Colors.white,
  180. primaryColor: Colors.indigo,
  181. accentColor: Colors.indigo,
  182. hintColor: Colors.indigo
  183. ),
  184. child: DropdownButtonFormField(
  185. style: TextStyle(color: Colors.black.withOpacity(0.6),fontWeight: FontWeight.w500,fontSize: 14,),
  186. decoration: InputDecoration(
  187. contentPadding: EdgeInsets.all(8.0),
  188. ),
  189. value: selected,
  190. onChanged: (value){
  191. setState(() {
  192. selected = value;
  193. });
  194. },
  195. items: result['DATA'].map<DropdownMenuItem<dynamic>>((item){
  196. return DropdownMenuItem(
  197. value: item['RETURN_VALUE'],
  198. child: Text(item["DISPLAY_VALUE"]),
  199. );
  200. }).toList(),
  201. ),
  202. ),
  203. ),
  204. ),
  205. Flexible(
  206. flex: 1,
  207. child: Container(
  208. child: Row(
  209. mainAxisAlignment: MainAxisAlignment.end,
  210. children: <Widget>[
  211. TextButton(
  212. child: Text('OK',style: TextStyle(color: Colors.indigo),),
  213. onPressed: ()async{
  214. if(selected!=prefs.getString(keyClass.cabang_id)){
  215. prefs.setString(keyClass.cabang_id,selected);
  216. await Future.sync(()async{
  217. await prefs.remove(keyClass.lastDownload);
  218. await prefs.remove(keyClass.lastUpload);
  219. await prefs.remove(keyClass.targetProccess);
  220. await prefs.remove(keyClass.submitProccess);
  221. lastUpload = '';
  222. lastDownload = '';
  223. timeString = '';
  224. try{
  225. Directory documentsDirectory = await getApplicationDocumentsDirectory();
  226. String path = join(documentsDirectory.path, "UnitStocking.db");
  227. File db = File(path);
  228. if(db.existsSync()){
  229. db.deleteSync();
  230. }
  231. }
  232. catch(e){
  233. print(e);
  234. util.showFlushbar(context, 'Failed to delete database file',color: Colors.red);
  235. }
  236. });
  237. Navigator.pop(context,true);
  238. }
  239. else{
  240. Navigator.pop(context,false);
  241. }
  242. },
  243. ),
  244. ],
  245. ),
  246. ),
  247. )
  248. ],
  249. ),
  250. ),
  251. ),
  252. ),
  253. // AlertDialog(
  254. // title: Text('Set Cabang'),
  255. // content: DropdownButtonFormField(
  256. // value: selected,
  257. // onChanged: (value){
  258. // setState(() {
  259. // selected = value;
  260. // });
  261. // },
  262. // items: result['DATA'].map<DropdownMenuItem<dynamic>>((item){
  263. // return DropdownMenuItem(
  264. // value: item['RETURN_VALUE'],
  265. // child: Text(item["DISPLAY_VALUE"]),
  266. // );
  267. // }).toList(),
  268. // ),
  269. // actions: <Widget>[
  270. // TextButton(
  271. // child: Text('OK'),
  272. // onPressed: ()async{
  273. // if(selected!=prefs.getString(keyClass.cabang_id)){
  274. // prefs.setString(keyClass.cabang_id,selected);
  275. // await Future.sync(()async{
  276. // await prefs.remove(keyClass.lastDownload);
  277. // await prefs.remove(keyClass.lastUpload);
  278. // await prefs.remove(keyClass.targetProccess);
  279. // await prefs.remove(keyClass.submitProccess);
  280. // lastUpload = '';
  281. // lastDownload = '';
  282. // timeString = '';
  283. //// var result = await DBHelper.database.deleteAll();
  284. //// if(result!=null) {
  285. //// await DBHelper.database.closeDb();
  286. //// if(result!=null){
  287. // try{
  288. // Directory documentsDirectory = await getApplicationDocumentsDirectory();
  289. // String path = join(documentsDirectory.path, "UnitStocking.db");
  290. // File db = File(path);
  291. // if(db.existsSync()){
  292. // db.deleteSync();
  293. // }
  294. // }
  295. // catch(e){
  296. // print(e);
  297. // util.showFlushbar(context, 'Failed to delete database file',color: Colors.red);
  298. // }
  299. //// }
  300. //// else{
  301. //// errMsg = 'Failed to clear unit data';
  302. //// }
  303. //// }
  304. //// else{
  305. //// errMsg = 'Failed to clear unit data';
  306. //// }
  307. // });
  308. // Navigator.pop(context,true);
  309. // }
  310. // else{
  311. // Navigator.pop(context,false);
  312. // }
  313. //// util.showLoading(context);
  314. //
  315. //// Navigator.pop(context);
  316. // },
  317. // )
  318. // ],
  319. // ),
  320. ));
  321. }
  322. else{
  323. util.showFlushbar(context, result['DATA'],color: Colors.red);
  324. return false;
  325. }
  326. }
  327. @override
  328. Widget build(BuildContext context) {
  329. return WillPopScope(
  330. onWillPop: ()async{
  331. await showDialog(context: context,builder: (context)=>
  332. Material(
  333. color: Colors.white.withOpacity(0.9),
  334. child: Center(
  335. child: Container(
  336. decoration: BoxDecoration(
  337. color: Colors.white,
  338. boxShadow: [
  339. BoxShadow(
  340. color: Colors.grey.withOpacity(0.5),
  341. spreadRadius: 2,
  342. blurRadius: 2,
  343. offset: Offset(0, 0), // changes position of shadow
  344. ),
  345. ],
  346. borderRadius: BorderRadius.circular(5)
  347. ),
  348. // height: MediaQuery.of(context).size.height/4.8,
  349. height:220,
  350. width: MediaQuery.of(context).size.width*0.75,
  351. child: Column(
  352. children: <Widget>[
  353. Flexible(
  354. flex:3,
  355. child: Container(
  356. padding: EdgeInsets.only(top:10,left: 10,right: 10),
  357. alignment: Alignment.center,
  358. decoration: BoxDecoration(
  359. // color: Colors.indigo,
  360. borderRadius: BorderRadius.only(topLeft: Radius.circular(5),topRight: Radius.circular(5))
  361. ),
  362. child: Column(
  363. mainAxisSize: MainAxisSize.min,
  364. crossAxisAlignment: CrossAxisAlignment.center,
  365. children: <Widget>[
  366. Icon(Icons.exit_to_app,size: 70,color: Colors.indigo,),
  367. ],
  368. ),
  369. ),
  370. ),
  371. Flexible(
  372. flex: 1,
  373. child: Container(
  374. padding: EdgeInsets.only(left: 20,right: 20),
  375. alignment: Alignment.centerLeft,
  376. child: Text('Keluar dari aplikasi?',style: TextStyle(fontWeight: FontWeight.w500,fontSize: 14,color: Colors.black.withOpacity(0.6)),)
  377. ),
  378. ),
  379. Flexible(
  380. flex: 1,
  381. child: Container(
  382. padding: EdgeInsets.only(bottom:10),
  383. child: Row(
  384. mainAxisAlignment: MainAxisAlignment.end,
  385. children: <Widget>[
  386. TextButton(
  387. child: Text('Exit',style: TextStyle(color: Colors.indigo),),
  388. onPressed: ()async{
  389. Navigator.pop(context);
  390. await locationStream?.cancel();
  391. exit(0);
  392. },
  393. ),
  394. TextButton(
  395. child: Text('Cancel',style: TextStyle(color: Colors.indigo),),
  396. onPressed: (){
  397. Navigator.pop(context);
  398. },
  399. )
  400. ],
  401. ),
  402. ),
  403. )
  404. ],
  405. ),
  406. ),
  407. ),
  408. ),
  409. );
  410. return false;
  411. },
  412. child: Scaffold(
  413. body: Column(
  414. crossAxisAlignment: CrossAxisAlignment.end,
  415. children: <Widget>[
  416. Container(
  417. padding: EdgeInsets.only(bottom: 0,left: 15,right: 10,top: 10),
  418. height: MediaQuery.of(context).size.height/13,
  419. width: MediaQuery.of(context).size.width,
  420. alignment: Alignment.bottomLeft,
  421. child: Row(
  422. crossAxisAlignment: CrossAxisAlignment.end,
  423. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  424. children: <Widget>[
  425. Text('Home',style: TextStyle(color: Colors.indigo.withOpacity(0.8),fontSize: 18,fontWeight: FontWeight.bold),),
  426. PopupMenuButton(
  427. child: Padding(
  428. padding: const EdgeInsets.only(right:2.0),
  429. child: Icon(Icons.menu,color: Colors.indigo.withOpacity(0.8),),
  430. ),
  431. itemBuilder: (context){
  432. return [
  433. PopupMenuItem(
  434. value:'hostChange',
  435. child: Row(
  436. children: <Widget>[
  437. Icon(Icons.network_wifi,color: Colors.black,),
  438. SizedBox(width: 10,),
  439. Text('Change Ip Address')
  440. ],
  441. ),
  442. ),
  443. PopupMenuItem(
  444. value:'cabangChange',
  445. child: Row(
  446. children: <Widget>[
  447. Icon(Icons.business,color: Colors.black,),
  448. SizedBox(width: 10,),
  449. Text('Change Cabang')
  450. ],
  451. ),
  452. ),
  453. PopupMenuItem(
  454. value:'logout',
  455. child: Row(
  456. children: <Widget>[
  457. Icon(Icons.exit_to_app,color: Colors.black,),
  458. SizedBox(width: 10,),
  459. Text('Logout')
  460. ],
  461. ),
  462. ),
  463. ];
  464. },
  465. onSelected: (value)async{
  466. if(value == 'hostChange'){
  467. hostAddress.text = prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id';
  468. await showDialog(context: context,builder: (context)=>
  469. Material(
  470. color: Colors.white.withOpacity(0.9),
  471. child: Center(
  472. child: Container(
  473. decoration: BoxDecoration(
  474. color: Colors.white,
  475. boxShadow: [
  476. BoxShadow(
  477. color: Colors.grey.withOpacity(0.5),
  478. spreadRadius: 2,
  479. blurRadius: 2,
  480. offset: Offset(0, 0), // changes position of shadow
  481. ),
  482. ],
  483. borderRadius: BorderRadius.circular(5)
  484. ),
  485. height:220,
  486. // height: MediaQuery.of(context).size.height/3.2,
  487. width: MediaQuery.of(context).size.width*0.75,
  488. child: Column(
  489. children: <Widget>[
  490. Flexible(
  491. flex:3,
  492. child: Container(
  493. padding: EdgeInsets.only(top:10,left: 10,right: 10),
  494. alignment: Alignment.center,
  495. decoration: BoxDecoration(
  496. // color: Colors.indigo,
  497. borderRadius: BorderRadius.only(topLeft: Radius.circular(5),topRight: Radius.circular(5))
  498. ),
  499. child: Column(
  500. mainAxisSize: MainAxisSize.min,
  501. crossAxisAlignment: CrossAxisAlignment.center,
  502. children: <Widget>[
  503. Icon(Icons.network_wifi,size: 70,color: Colors.indigo,),
  504. SizedBox(height: 5,),
  505. Text('Set Ip Address',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 16,color: Colors.indigo),)
  506. ],
  507. ),
  508. ),
  509. ),
  510. Flexible(
  511. flex: 1,
  512. child: Container(
  513. padding: EdgeInsets.only(left: 20,right: 20),
  514. alignment: Alignment.centerLeft,
  515. child: Theme(
  516. data: ThemeData(
  517. canvasColor: Colors.white,
  518. primaryColor: Colors.indigo,
  519. accentColor: Colors.indigo,
  520. hintColor: Colors.indigo
  521. ),
  522. child: TextField(
  523. controller: hostAddress,
  524. decoration: InputDecoration(
  525. contentPadding: EdgeInsets.all(8),
  526. ),
  527. onSubmitted: (value){
  528. prefs.setString(keyClass.hostAddress,(value=='')?'https://unitstocksbackend.thamringroup.web.id':value);
  529. Navigator.pop(context);
  530. },
  531. ),
  532. ),
  533. ),
  534. ),
  535. Flexible(
  536. flex: 1,
  537. child: Container(
  538. child: Row(
  539. mainAxisAlignment: MainAxisAlignment.end,
  540. children: <Widget>[
  541. TextButton(
  542. child: Text('OK',style: TextStyle(color: Colors.indigo),),
  543. onPressed: (){
  544. prefs.setString(keyClass.hostAddress,(hostAddress.text=='')?'https://unitstocksbackend.thamringroup.web.id':hostAddress.text);
  545. Navigator.pop(context);
  546. },
  547. )
  548. ],
  549. ),
  550. ),
  551. )
  552. ],
  553. ),
  554. ),
  555. ),
  556. )
  557. // AlertDialog(
  558. // title: Text('Set IP Address'),
  559. // content: TextField(
  560. // controller: hostAddress,
  561. // onSubmitted: (value){
  562. // prefs.setString(keyClass.hostAddress,(value=='')?'https://unitstocksbackend.thamringroup.web.id':value);
  563. // Navigator.pop(context);
  564. // },
  565. // ),
  566. // actions: <Widget>[
  567. // TextButton(
  568. // child: Text('OK'),
  569. // onPressed: (){
  570. // prefs.setString(keyClass.hostAddress,(hostAddress.text=='')?'https://unitstocksbackend.thamringroup.web.id':hostAddress.text);
  571. // Navigator.pop(context);
  572. // },
  573. // )
  574. // ],
  575. // )
  576. );
  577. }
  578. if(value=="cabangChange") {
  579. var res = await changeCabang(context);
  580. if(res??false){
  581. setState(() {
  582. });
  583. }
  584. }
  585. if(value == 'logout'){
  586. prefs.remove(keyClass.cabang_id);
  587. prefs.remove(keyClass.company);
  588. prefs.remove(keyClass.user_id);
  589. prefs.setBool(keyClass.logged_in, false);
  590. Navigator.pushNamed(context, '/login');
  591. }
  592. },
  593. ),
  594. ],
  595. ),
  596. ),
  597. (prefs.getString(keyClass.stock_id)==null)?Container():Padding(
  598. padding: const EdgeInsets.only(top: 8,right: 8),
  599. child: Container(
  600. decoration: BoxDecoration(
  601. color: Colors.indigo.withOpacity(0.9),
  602. borderRadius: BorderRadius.circular(8)
  603. // border: Border.all(),
  604. ),
  605. padding: EdgeInsets.all(8),
  606. child: Row(
  607. mainAxisSize: MainAxisSize.min,
  608. mainAxisAlignment: MainAxisAlignment.end,
  609. crossAxisAlignment: CrossAxisAlignment.center,
  610. children: <Widget>[
  611. Text('Status : ',style: TextStyle(color: Colors.white),),
  612. Text(state??'-',style: TextStyle(fontWeight: FontWeight.bold,color: Colors.white),),
  613. ],
  614. ),
  615. ),
  616. ),
  617. Expanded(
  618. child: Container(
  619. child:
  620. GridView.count(
  621. padding: EdgeInsets.all(10),
  622. crossAxisSpacing: 10,
  623. mainAxisSpacing: 10,
  624. crossAxisCount: 2,
  625. children: <Widget>[
  626. AbsorbPointer(
  627. absorbing: isLoading,
  628. child: InkWell(
  629. splashColor: Colors.black,
  630. onTap: ()async{
  631. bool getData = await showDialog(
  632. context: context,
  633. builder: (context)=>AlertDialog(
  634. title: Text("Get Data Units?"),
  635. content: Text('Fetch data unit for stocking'),
  636. actions: <Widget>[
  637. TextButton(
  638. child: Text('Proceed'),
  639. onPressed: (){
  640. Navigator.pop(context,true);
  641. },
  642. ),
  643. TextButton(
  644. child: Text('Cancel'),
  645. onPressed: (){
  646. Navigator.pop(context,false);
  647. },
  648. )
  649. ],
  650. )
  651. );
  652. if(getData??false){
  653. setState(() {
  654. isLoading = true;
  655. });
  656. var a = Stopwatch();
  657. a.start();
  658. await Future.delayed(Duration(milliseconds: 200));
  659. bool isclear;
  660. Directory documentsDirectory = await getApplicationDocumentsDirectory();
  661. String path = join(documentsDirectory.path, "UnitStocking.db");
  662. File db = File(path);
  663. if(db.existsSync()){
  664. isclear = await clearData(context);
  665. }
  666. else{
  667. isclear = true;
  668. }
  669. if(isclear??false){
  670. print('fetching');
  671. util.showLoading(context);
  672. file_Trans_Handler trans = new file_Trans_Handler();
  673. trans.downloadFile('UnitStocking.db',"${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/getSqliteDb/${prefs.getString(keyClass.company)}/${prefs.getString(keyClass.cabang_id)}");
  674. progressDLStream = trans.progress.listen((value)async {
  675. if(progressDL==null) {
  676. // print(['test',value]);
  677. if(value!=null) Navigator.pop(context);
  678. }
  679. setState(() {
  680. progressDL = (value!=-1.0)?value:null;
  681. });
  682. if(value!=null&&value >= 1.0) {
  683. progressDLStream.cancel();
  684. progressDL = null;
  685. setState(() {
  686. lastDownload = DateTime.now().toIso8601String();
  687. });
  688. await prefs.setString(keyClass.lastDownload, lastDownload);
  689. await DBHelper.database.insertUpdateValue(new valueTab(name: 'TGL_START',value: DateFormat('dd-MM-yyyy HH:mm:ss').format(DateTime.parse(lastDownload))));
  690. await DBHelper.database.insertUpdateValue(new valueTab(name: 'TGL_STOCK_TAKING',value: DateFormat('dd-MM-yyyy').format(DateTime.parse(lastDownload))));
  691. await DBHelper.database.closeDb();
  692. util.showFlushbar(context,'Data downloaded');
  693. loadState();
  694. a.stop();
  695. if(a.elapsed.inSeconds<3){
  696. await Future.delayed(Duration(seconds: 3-a.elapsed.inSeconds));
  697. }
  698. setState(() {
  699. isLoading = false;
  700. });
  701. }
  702. if(value==-1.0){
  703. setState(() {
  704. isLoading = false;
  705. });
  706. util.showFlushbar(context,'Data download error',color: Colors.red);
  707. }
  708. });
  709. // Navigator.popUntil(context, ModalRoute.withName('/home'));
  710. }
  711. }
  712. },
  713. child: Container(
  714. padding: EdgeInsets.all(5),
  715. decoration: BoxDecoration(
  716. boxShadow: [
  717. BoxShadow(
  718. color: Colors.grey.withOpacity(0.5),
  719. spreadRadius: 2,
  720. blurRadius: 2,
  721. offset: Offset(0, 0), // changes position of shadow
  722. ),
  723. ],
  724. borderRadius: BorderRadius.all(Radius.circular(5.0)),
  725. color: Colors.green.withAlpha(220).withOpacity(0.7),
  726. ),
  727. child: Stack(
  728. children: <Widget>[
  729. Container(
  730. alignment: (progressDL!=null)?Alignment.bottomCenter:Alignment.bottomLeft,
  731. padding: EdgeInsets.only(left: 10,right: 10,top: 10,bottom: 15),
  732. child: (progressDL!=null)?Column(
  733. mainAxisSize: MainAxisSize.min,
  734. children: <Widget>[
  735. LinearProgressIndicator(
  736. value: progressDL,
  737. ),
  738. Text('${(progressDL*100).floor()}%',style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold),)
  739. ],
  740. ):(lastDownload=='')?null:Text('Last download : ${DateFormat('dd MMM yyyy HH:mm').format(DateTime.parse(lastDownload))}',style: TextStyle(color: Colors.white,fontSize: 11,fontWeight: FontWeight.bold)),
  741. ),
  742. Positioned.fill(
  743. child: Column(
  744. mainAxisAlignment: MainAxisAlignment.center,
  745. children: <Widget>[
  746. Icon(Icons.file_upload,size: MediaQuery.of(context).size.width/6,color: Colors.white,),
  747. SizedBox(height: 5,),
  748. Text('Get Data Master',style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold,fontSize: 16),),
  749. ],
  750. ),
  751. ),
  752. ],
  753. ),
  754. ),
  755. ),
  756. ),
  757. InkWell(
  758. splashColor: Colors.black,
  759. onTap: ()async{
  760. await Future.delayed(Duration(milliseconds: 200));
  761. if(lastDownload!=''){
  762. Navigator.pushNamed(context, '/stocking');
  763. }
  764. else{
  765. util.showFlushbar(context, 'Data Master tidak ditemukan. Get data master dulu.');
  766. }
  767. },
  768. child: Container(
  769. padding: EdgeInsets.all(5),
  770. decoration: BoxDecoration(
  771. boxShadow: [
  772. BoxShadow(
  773. color: Colors.grey.withOpacity(0.5),
  774. spreadRadius: 2,
  775. blurRadius: 2,
  776. offset: Offset(0, 0), // changes position of shadow
  777. ),
  778. ],
  779. borderRadius: BorderRadius.all(Radius.circular(5.0)),
  780. color: Colors.blueGrey.withAlpha(230).withOpacity(0.8),
  781. ),
  782. child: Column(
  783. mainAxisAlignment: MainAxisAlignment.center,
  784. children: <Widget>[
  785. Icon(Icons.receipt,size: MediaQuery.of(context).size.width/6,color: Colors.white,),
  786. SizedBox(height: 5,),
  787. Text('Stocking',style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold,fontSize: 16),)
  788. ],
  789. ),
  790. ),
  791. ),
  792. InkWell(
  793. splashColor: Colors.black,
  794. onTap: ()async{
  795. if(lastDownload!=''){
  796. await DBHelper.database.insertUpdateValue(new valueTab(name: 'TGL_SELESAI',value: DateFormat('dd-MM-yyyy HH:mm:ss').format(new DateTime.now())));
  797. await DBHelper.database.closeDb();
  798. file_Trans_Handler trans = new file_Trans_Handler();
  799. bool popped = false;
  800. util.showLoading(context,onwillpop:()async{
  801. await trans.cancel();
  802. popped = true;
  803. return true;
  804. });
  805. var upload = await trans.uploadFile('UnitStocking.db',"${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/uploadSqlitedb",prefs.getString(keyClass.company),prefs.getString(keyClass.cabang_id));
  806. if(!popped){
  807. Navigator.pop(context);
  808. util.showFlushbar(context, upload['DATA'],color:(upload['STATUS']!=1)?Colors.red:Colors.grey);
  809. if(upload['STATUS']==1){
  810. setState(() {
  811. lastUpload = new DateTime.now().toIso8601String();
  812. });
  813. prefs.setString(keyClass.lastUpload, lastUpload);
  814. prefs.setString(keyClass.targetProccess, upload[keyClass.targetProccess]);
  815. }
  816. }
  817. }
  818. else{
  819. util.showFlushbar(context, "Belum ada data yang disimpan.",color: Colors.red);
  820. }
  821. },
  822. child: Container(
  823. padding: EdgeInsets.all(5),
  824. decoration: BoxDecoration(
  825. boxShadow: [
  826. BoxShadow(
  827. color: Colors.grey.withOpacity(0.5),
  828. spreadRadius: 2,
  829. blurRadius: 2,
  830. offset: Offset(0, 0), // changes position of shadow
  831. ),
  832. ],
  833. borderRadius: BorderRadius.all(Radius.circular(5.0)),
  834. color: Colors.indigo.withAlpha(220).withOpacity(0.7),
  835. ),
  836. child: Stack(
  837. children: <Widget>[
  838. Container(
  839. alignment: (progressUL!=null)?Alignment.bottomCenter:Alignment.bottomLeft,
  840. padding: EdgeInsets.only(left: 10,right: 10,top: 10,bottom: 15),
  841. child: (progressUL!=null)?Column(
  842. mainAxisSize: MainAxisSize.min,
  843. children: <Widget>[
  844. LinearProgressIndicator(
  845. value: progressUL,
  846. ),
  847. Text('${(progressUL*100).floor()}%',style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold),)
  848. ],
  849. ):(lastUpload=='')?null:Text('Last upload : ${DateFormat('dd MMM yyyy HH:mm').format(DateTime.parse(lastUpload))}\n${(timeString!='')?'Duration: $timeString':''}',style: TextStyle(color: Colors.white,fontSize: 11,fontWeight: FontWeight.bold)),
  850. ),
  851. Positioned.fill(
  852. child: Column(
  853. mainAxisAlignment: MainAxisAlignment.center,
  854. children: <Widget>[
  855. Icon(Icons.file_upload,size: MediaQuery.of(context).size.width/6,color: Colors.white,),
  856. SizedBox(height: 5,),
  857. Text('Send Data Stokan',style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold,fontSize: 16),),
  858. ],
  859. ),
  860. ),
  861. ],
  862. ),
  863. ),
  864. ),
  865. (prefs.getString(keyClass.targetProccess)==null&&prefs.getBool(keyClass.submitProccess)==null)?InkWell(
  866. splashColor: Colors.black,
  867. onTap: ()async{
  868. await Future.delayed(Duration(milliseconds: 200));
  869. await clearData(context);
  870. },
  871. child: Container(
  872. padding: EdgeInsets.all(5),
  873. decoration: BoxDecoration(
  874. boxShadow: [
  875. BoxShadow(
  876. color: Colors.grey.withOpacity(0.5),
  877. spreadRadius: 2,
  878. blurRadius: 2,
  879. offset: Offset(0, 0), // changes position of shadow
  880. ),
  881. ],
  882. borderRadius: BorderRadius.all(Radius.circular(5.0)),
  883. color: Colors.red.withAlpha(200).withOpacity(0.7),
  884. ),
  885. child: Column(
  886. mainAxisAlignment: MainAxisAlignment.center,
  887. children: <Widget>[
  888. Icon(Icons.restore_from_trash,size: MediaQuery.of(context).size.width/6,color: Colors.white,),
  889. SizedBox(height: 5,),
  890. Text('Clear Data',style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold,fontSize: 16),)
  891. ],
  892. ),
  893. ),
  894. ):
  895. (prefs.getString(keyClass.targetProccess)!=null)?InkWell(
  896. onTap: ()async{
  897. bool result = await showDialog(context: context,builder: (context)=>WillPopScope(
  898. onWillPop: ()async{
  899. Navigator.pop(context,false);
  900. return false;
  901. },
  902. child: AlertDialog(
  903. title: Text('Process Data ?'),
  904. content: Text('Proceed to unpack the uploaded data.'),
  905. actions: <Widget>[
  906. TextButton(
  907. child: Text('Proceed'),
  908. onPressed: ()async{
  909. Navigator.pop(context,true);
  910. },
  911. ),
  912. TextButton(
  913. child: Text('Cancel'),
  914. onPressed: (){Navigator.pop(context,false);},
  915. )
  916. ],
  917. ),
  918. ));
  919. if(result){
  920. util.showLoading(context);
  921. file_Trans_Handler trans = new file_Trans_Handler();
  922. var upload = await trans.unPackDb("${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/unpackDb",prefs.getString(keyClass.company),prefs.getString(keyClass.cabang_id),prefs.getString(keyClass.targetProccess));
  923. Navigator.pop(context);
  924. util.showFlushbar(context, upload['DATA'],color:(upload['STATUS']!=1)?Colors.red:Colors.grey);
  925. if(upload['STATUS']==1){
  926. prefs.remove(keyClass.targetProccess);
  927. prefs.setBool(keyClass.submitProccess,true);
  928. }
  929. setState(() {
  930. });
  931. }
  932. },
  933. child: Container(
  934. padding: EdgeInsets.all(5),
  935. decoration: BoxDecoration(
  936. boxShadow: [
  937. BoxShadow(
  938. color: Colors.grey.withOpacity(0.5),
  939. spreadRadius: 2,
  940. blurRadius: 2,
  941. offset: Offset(0, 0), // changes position of shadow
  942. ),
  943. ],
  944. borderRadius: BorderRadius.all(Radius.circular(5.0)),
  945. color: Colors.orangeAccent.withAlpha(230).withOpacity(0.7),
  946. ),
  947. child: Column(
  948. mainAxisAlignment: MainAxisAlignment.center,
  949. children: <Widget>[
  950. Icon(Icons.arrow_forward,size: MediaQuery.of(context).size.width/6,color: Colors.white,),
  951. SizedBox(height: 5,),
  952. Text('Process Units',style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold,fontSize: 16),)
  953. ],
  954. ),
  955. ),
  956. ):
  957. InkWell(
  958. onTap: ()async{
  959. bool result = await showDialog(context: context,builder: (context)=>WillPopScope(
  960. onWillPop: ()async{
  961. Navigator.pop(context,false);
  962. return false;
  963. },
  964. child: AlertDialog(
  965. title: Text('Submit Data ?'),
  966. content: Text('Submit the uploaded data.'),
  967. actions: <Widget>[
  968. TextButton(
  969. child: Text('Submit'),
  970. onPressed: ()async{
  971. Navigator.pop(context,true);
  972. },
  973. ),
  974. TextButton(
  975. child: Text('Cancel'),
  976. onPressed: (){Navigator.pop(context,false);},
  977. )
  978. ],
  979. ),
  980. ));
  981. if(result){
  982. util.showLoading(context);
  983. file_Trans_Handler trans = new file_Trans_Handler();
  984. var upload = await trans.submitDb("${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/submitStock",prefs.getString(keyClass.company),prefs.getString(keyClass.stock_id));
  985. Navigator.pop(context);
  986. util.showFlushbar(context, upload['DATA'],color:(upload['STATUS']!=1)?Colors.red:Colors.grey);
  987. if(upload['STATUS']==1){
  988. loadState();
  989. prefs.remove(keyClass.submitProccess);
  990. }
  991. setState(() {
  992. });
  993. }
  994. },
  995. child: Container(
  996. padding: EdgeInsets.all(5),
  997. decoration: BoxDecoration(
  998. boxShadow: [
  999. BoxShadow(
  1000. color: Colors.grey.withOpacity(0.5),
  1001. spreadRadius: 2,
  1002. blurRadius: 2,
  1003. offset: Offset(0, 0), // changes position of shadow
  1004. ),
  1005. ],
  1006. borderRadius: BorderRadius.all(Radius.circular(5.0)),
  1007. color: Colors.lightGreen.withAlpha(230),
  1008. ),
  1009. child: Column(
  1010. mainAxisAlignment: MainAxisAlignment.center,
  1011. children: <Widget>[
  1012. Icon(Icons.arrow_forward,size: MediaQuery.of(context).size.width/6,color: Colors.white,),
  1013. SizedBox(height: 5,),
  1014. Text('Submit Process',style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold,fontSize: 16),)
  1015. ],
  1016. ),
  1017. ),
  1018. ),
  1019. (prefs.getString(keyClass.targetProccess)!=null||(prefs.getBool(keyClass.submitProccess)!=null&&prefs.getBool(keyClass.submitProccess)))?InkWell(
  1020. splashColor: Colors.black,
  1021. onTap: ()async{
  1022. await Future.delayed(Duration(milliseconds: 200));
  1023. await clearData(context);
  1024. },
  1025. child: Container(
  1026. padding: EdgeInsets.all(5),
  1027. decoration: BoxDecoration(
  1028. boxShadow: [
  1029. BoxShadow(
  1030. color: Colors.grey.withOpacity(0.5),
  1031. spreadRadius: 2,
  1032. blurRadius: 2,
  1033. offset: Offset(0, 0), // changes position of shadow
  1034. ),
  1035. ],
  1036. borderRadius: BorderRadius.all(Radius.circular(5.0)),
  1037. color: Colors.red.withAlpha(200),
  1038. ),
  1039. child: Column(
  1040. mainAxisAlignment: MainAxisAlignment.center,
  1041. children: <Widget>[
  1042. Icon(Icons.restore_from_trash,size: MediaQuery.of(context).size.width/6,color: Colors.white,),
  1043. SizedBox(height: 5,),
  1044. Text('Clear Data',style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold,fontSize: 16),)
  1045. ],
  1046. ),
  1047. ),
  1048. ):Container(),
  1049. ],
  1050. )),
  1051. ),
  1052. ],
  1053. ),
  1054. bottomSheet: Container(height: 22,alignment: Alignment.bottomRight,child: Opacity(opacity: 0.5,child: Padding(padding: EdgeInsets.all(5),child: Text((lastDownload!='')?'Master Data Downloaded':'No Master Data Found',style: TextStyle(fontSize: 12),)))),
  1055. ),
  1056. );
  1057. }
  1058. }