flutter app untuk unitstock
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 

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