| @@ -4,6 +4,7 @@ class keyClass{ | |||||
| static String duration = 'DURATION'; | static String duration = 'DURATION'; | ||||
| static String loginId = 'LOGIN_ID'; | static String loginId = 'LOGIN_ID'; | ||||
| static String hostAddress = 'HOST'; | static String hostAddress = 'HOST'; | ||||
| static String restTokenAddress = 'REST'; | |||||
| static String company = 'COMPANY'; | static String company = 'COMPANY'; | ||||
| static String user_id = 'USER'; | static String user_id = 'USER'; | ||||
| static String cabang_id = 'CABANG_ID'; | static String cabang_id = 'CABANG_ID'; | ||||
| @@ -11,6 +12,8 @@ class keyClass{ | |||||
| static String targetProccess = 'dbPath'; | static String targetProccess = 'dbPath'; | ||||
| static String submitProccess = 'SUBMIT'; | static String submitProccess = 'SUBMIT'; | ||||
| static String stock_id = 'STOCK_TAKING_UNIT_ID'; | static String stock_id = 'STOCK_TAKING_UNIT_ID'; | ||||
| static String client_credential = 'CLIENT_CREDENTIAL'; | |||||
| static String rest_data = 'REST_DATA'; | |||||
| } | } | ||||
| class columnName{ | class columnName{ | ||||
| static String id = 'ID'; | static String id = 'ID'; | ||||
| @@ -2,31 +2,135 @@ import 'dart:async'; | |||||
| import 'dart:convert'; | import 'dart:convert'; | ||||
| import 'dart:io'; | import 'dart:io'; | ||||
| import 'package:flutter/services.dart'; | import 'package:flutter/services.dart'; | ||||
| import 'package:http/http.dart'; | |||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:flushbar/flushbar.dart'; | import 'package:flushbar/flushbar.dart'; | ||||
| import 'package:http/io_client.dart'; | import 'package:http/io_client.dart'; | ||||
| import '../main.dart'; | import '../main.dart'; | ||||
| import 'package:location/location.dart'; | import 'package:location/location.dart'; | ||||
| import 'package:permission_handler/permission_handler.dart' as pHandler; | import 'package:permission_handler/permission_handler.dart' as pHandler; | ||||
| // import 'package:app_settings/app_settings.dart'; | |||||
| import 'Prefs.dart'; | |||||
| import 'package:oauth2/oauth2.dart' as oauth2; | |||||
| class Util{ | class Util{ | ||||
| bool tokenValidity = true; | |||||
| bool useLocal = false; | bool useLocal = false; | ||||
| JsonDataPostRaw(Map jsonData, String url,{timeout:false}) async{ | |||||
| getOauth2Client() async { | |||||
| bool resetClient = false; | |||||
| oauth2.Credentials restData = (prefs.getString(keyClass.rest_data)!=null&&prefs.getString(keyClass.rest_data).contains("accessToken"))?oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data)):null; | |||||
| if(restData == null)resetClient = true; | |||||
| else{ | |||||
| if(DateTime.now().isAfter(restData.expiration))resetClient = true; | |||||
| } | |||||
| oauth2.Client client; | |||||
| if(resetClient||!tokenValidity){ | |||||
| final tokenEndpoint = Uri.parse(prefs.getString(keyClass.restTokenAddress)); | |||||
| if(prefs.getString(keyClass.client_credential)==null){ | |||||
| client = await initRest(); | |||||
| } | |||||
| else{ | |||||
| var clients = JsonDecoder().convert(prefs.getString(keyClass.client_credential)); | |||||
| client = await oauth2.clientCredentialsGrant(tokenEndpoint, clients["id"], clients["secret"],httpClient: http); | |||||
| prefs.setString(keyClass.rest_data, client.credentials.toJson()); | |||||
| } | |||||
| } | |||||
| else { | |||||
| if (prefs.getString(keyClass.client_credential) == null) { | |||||
| client = await initRest(); | |||||
| } | |||||
| else { | |||||
| var clients = JsonDecoder().convert(prefs.getString(keyClass.client_credential)); | |||||
| client = new oauth2.Client(restData, identifier: clients["id"], | |||||
| secret: clients["secret"], | |||||
| httpClient: http); | |||||
| } | |||||
| } | |||||
| return client; | |||||
| } | |||||
| JsonDataPostRaw(Map jsonData, String url,{secure:true,timeout:false}) async{ | |||||
| var httpClient; | |||||
| const JsonDecoder decoder = const JsonDecoder(); | const JsonDecoder decoder = const JsonDecoder(); | ||||
| var headers = {'Content-type': 'application/json'}; | |||||
| try { | try { | ||||
| var response; | var response; | ||||
| if(secure) { | |||||
| httpClient = await getOauth2Client(); | |||||
| oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data)); | |||||
| headers["Authorization"] = | |||||
| "bearer ${tokenRestData.accessToken}"; | |||||
| } | |||||
| else { | |||||
| httpClient = http; | |||||
| } | |||||
| if (timeout) | if (timeout) | ||||
| response = await http.post( | |||||
| response = await httpClient.post( | |||||
| Uri.parse(url), headers: headers, | |||||
| body: json.encode(jsonData)).timeout( | |||||
| const Duration(seconds: 10)); | |||||
| else | |||||
| response = await httpClient.post( | |||||
| Uri.parse(url), headers: {'Content-type': 'application/json'}, | Uri.parse(url), headers: {'Content-type': 'application/json'}, | ||||
| body: json.encode(jsonData)); | |||||
| if(response.statusCode == 403) tokenValidity = false; | |||||
| if(htmlErrorTitle(response.body.toString())!=""){ | |||||
| return {"STATUS":(response.statusCode != 200)?0:1,"DATA":htmlErrorTitle(response.body.toString())}; | |||||
| } | |||||
| final Map data = decoder.convert(response.body); | |||||
| try{data["DATA"] = decoder.convert(data["DATA"]);}catch(e){} | |||||
| return data; | |||||
| } on TimeoutException catch(e){ | |||||
| return {"STATUS":0,"DATA":"Request Timeout"}; | |||||
| } | |||||
| on HandshakeException catch(e){ | |||||
| if(useLocal){ | |||||
| return {"STATUS":0,"DATA":"Not Connected to Server. $e"}; | |||||
| } | |||||
| else{ | |||||
| useLocal = true; | |||||
| http = IOClient(HttpClient(context: clientContext)); | |||||
| return await JsonDataPostRaw(jsonData, url,timeout:timeout,secure: secure); | |||||
| } | |||||
| } | |||||
| on Exception catch(exception){ | |||||
| print(url); | |||||
| // Toast("Not Connected to Server", Colors.red); | |||||
| return {"STATUS":0,"DATA":"Not Connected to Server. $exception"}; | |||||
| } | |||||
| } | |||||
| JsonDataPutRaw(Map jsonData, String url,{secure:true,timeout:false}) async{ | |||||
| var httpClient; | |||||
| const JsonDecoder decoder = const JsonDecoder(); | |||||
| var headers = {'Content-type': 'application/json'}; | |||||
| try { | |||||
| var response; | |||||
| if(secure) { | |||||
| httpClient = await getOauth2Client(); | |||||
| oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data)); | |||||
| headers["Authorization"] = | |||||
| "bearer ${tokenRestData.accessToken}"; | |||||
| } | |||||
| else { | |||||
| httpClient = http; | |||||
| } | |||||
| if (timeout) | |||||
| response = await httpClient.put( | |||||
| Uri.parse(url), headers: headers, | |||||
| body: json.encode(jsonData)).timeout( | body: json.encode(jsonData)).timeout( | ||||
| const Duration(seconds: 10)); | const Duration(seconds: 10)); | ||||
| else | else | ||||
| response = await http.post( | |||||
| response = await httpClient.put( | |||||
| Uri.parse(url), headers: {'Content-type': 'application/json'}, | Uri.parse(url), headers: {'Content-type': 'application/json'}, | ||||
| body: json.encode(jsonData)); | body: json.encode(jsonData)); | ||||
| if(response.statusCode == 403) tokenValidity = false; | |||||
| if(htmlErrorTitle(response.body.toString())!=""){ | |||||
| return {"STATUS":(response.statusCode != 200)?0:1,"DATA":htmlErrorTitle(response.body.toString())}; | |||||
| } | |||||
| final Map data = decoder.convert(response.body); | final Map data = decoder.convert(response.body); | ||||
| try{data["DATA"] = decoder.convert(data["DATA"]);}catch(e){} | |||||
| return data; | return data; | ||||
| } on TimeoutException catch(e){ | } on TimeoutException catch(e){ | ||||
| return {"STATUS":0,"DATA":"Request Timeout"}; | return {"STATUS":0,"DATA":"Request Timeout"}; | ||||
| @@ -38,7 +142,7 @@ class Util{ | |||||
| else{ | else{ | ||||
| useLocal = true; | useLocal = true; | ||||
| http = IOClient(HttpClient(context: clientContext)); | http = IOClient(HttpClient(context: clientContext)); | ||||
| return await JsonDataPostRaw(jsonData, url,timeout:timeout); | |||||
| return await JsonDataPostRaw(jsonData, url,timeout:timeout,secure: secure); | |||||
| } | } | ||||
| } | } | ||||
| @@ -49,6 +153,33 @@ class Util{ | |||||
| } | } | ||||
| } | } | ||||
| htmlErrorTitle(String html){ | |||||
| try{ | |||||
| if(html.contains('<title>')) { | |||||
| String titleElement = html.substring(html.indexOf("<title>")+7,html.indexOf("<\/title>")); | |||||
| return titleElement; | |||||
| } | |||||
| else return ''; | |||||
| } | |||||
| catch(e){ | |||||
| return ''; | |||||
| } | |||||
| } | |||||
| initRest()async{ | |||||
| try{ | |||||
| if(prefs.getString(keyClass.client_credential)==null){ | |||||
| prefs.setString(keyClass.client_credential, json.encode({ | |||||
| "id": "IZ4W8u8YZmLtUV0p1zd-_A..", | |||||
| "secret" : "AQ16v4bzGWm9AsWHvUcu2Q.." | |||||
| }).toString()); | |||||
| } | |||||
| return await getOauth2Client(); | |||||
| } | |||||
| catch(e){ | |||||
| print(e); | |||||
| print("error fetching Rest token"); | |||||
| } | |||||
| } | |||||
| showLoading(context,{dissmissable=false,onwillpop}){ | showLoading(context,{dissmissable=false,onwillpop}){ | ||||
| showDialog( | showDialog( | ||||
| context: context, | context: context, | ||||
| @@ -5,7 +5,10 @@ import 'dart:typed_data'; | |||||
| import 'package:http/io_client.dart'; | import 'package:http/io_client.dart'; | ||||
| import 'package:path_provider/path_provider.dart'; | import 'package:path_provider/path_provider.dart'; | ||||
| import 'package:http/http.dart'; | import 'package:http/http.dart'; | ||||
| import 'package:unitstocks/Util/Prefs.dart'; | |||||
| import '../main.dart'; | import '../main.dart'; | ||||
| import 'package:oauth2/oauth2.dart' as oauth2; | |||||
| class file_Trans_Handler { | class file_Trans_Handler { | ||||
| // double _progress = 0; | // double _progress = 0; | ||||
| @@ -17,32 +20,54 @@ class file_Trans_Handler { | |||||
| StreamController _progress = new StreamController<double>(); | StreamController _progress = new StreamController<double>(); | ||||
| Stream<double> get progress =>_progress.stream; | Stream<double> get progress =>_progress.stream; | ||||
| bool useLocal = false; | bool useLocal = false; | ||||
| var httpClient; | |||||
| downloadFile(String fileName,String link) async { | downloadFile(String fileName,String link) async { | ||||
| StreamedResponse _response; | StreamedResponse _response; | ||||
| List<int> _bytes = []; | List<int> _bytes = []; | ||||
| int _total = 0; | int _total = 0; | ||||
| httpClient = await util.getOauth2Client(); | |||||
| print('Start Download'); | print('Start Download'); | ||||
| _progress.add(null); | _progress.add(null); | ||||
| try { | try { | ||||
| Request req = new Request('GET', Uri.parse(link)); | Request req = new Request('GET', Uri.parse(link)); | ||||
| // req.headers = ''; | // req.headers = ''; | ||||
| _response = await http.send(req).timeout( | |||||
| _response = await httpClient.send(req).timeout( | |||||
| Duration(seconds: 20)); | Duration(seconds: 20)); | ||||
| // _response = await client.get('$link',headers: 'application/json') | // _response = await client.get('$link',headers: 'application/json') | ||||
| _total = _response.contentLength; | |||||
| print('${_total / 1024} KB'); | |||||
| if(_response.statusCode==200){ | |||||
| _total = _response.contentLength?? int.parse(_response.headers['file-size']); | |||||
| } | |||||
| // print('${_total / 1024} KB'); | |||||
| _error = ''; | |||||
| dlulStream = _response.stream.listen((value) { | dlulStream = _response.stream.listen((value) { | ||||
| _bytes.addAll(value); | |||||
| _progress.add(((_bytes.length / _total))); | |||||
| if(_response.statusCode==200){ | |||||
| _bytes.addAll(value); | |||||
| _progress.add(((_bytes.length / _total))); | |||||
| } | |||||
| else{ | |||||
| String resString = utf8.decode(value); | |||||
| if(util.htmlErrorTitle(resString)!=""){ | |||||
| _error = util.htmlErrorTitle(resString); | |||||
| } | |||||
| _error = resString; | |||||
| } | |||||
| }) | }) | ||||
| ..onDone(() async { | ..onDone(() async { | ||||
| _progress.add(0.0); | |||||
| print('Finish Download'); | |||||
| final file = File( | |||||
| "${(await getApplicationDocumentsDirectory()).path}/$fileName"); | |||||
| await file.writeAsBytes(_bytes); | |||||
| _path = file.path; | |||||
| if(_error==''){ | |||||
| _progress.add(0.0); | |||||
| print('Finish Download'); | |||||
| final file = File( | |||||
| "${(await getApplicationDocumentsDirectory()).path}/$fileName"); | |||||
| await file.writeAsBytes(_bytes); | |||||
| _path = file.path; | |||||
| } | |||||
| else{ | |||||
| print('Error Download, $_error'); | |||||
| _progress.add(-1.0); | |||||
| } | |||||
| }) | }) | ||||
| ..onError((e) async { | ..onError((e) async { | ||||
| print('Error Download, $e'); | print('Error Download, $e'); | ||||
| @@ -70,18 +95,27 @@ class file_Trans_Handler { | |||||
| } | } | ||||
| uploadFile(String fileName,String link,String company,String cabang_id) async{ | uploadFile(String fileName,String link,String company,String cabang_id) async{ | ||||
| httpClient = await util.getOauth2Client(); | |||||
| oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data)); | |||||
| final file = File( | final file = File( | ||||
| "${(await getApplicationDocumentsDirectory()).path}/$fileName"); | "${(await getApplicationDocumentsDirectory()).path}/$fileName"); | ||||
| String mimeType = 'application/vnd.sqlite3'; | |||||
| if(file.existsSync()){ | if(file.existsSync()){ | ||||
| Uint8List byte = file.readAsBytesSync(); | Uint8List byte = file.readAsBytesSync(); | ||||
| // print("file size ${file.lengthSync()/1024}"); | // print("file size ${file.lengthSync()/1024}"); | ||||
| try{ | try{ | ||||
| var _reponse = await http.post( | |||||
| Uri.parse(link), headers: {'Content-type': 'application/json'}, | |||||
| body: json.encode({"byte":byte,"cabangId":cabang_id,"company":company})); | |||||
| var _response = await httpClient.put( | |||||
| Uri.parse(link), headers: {"cabangId":cabang_id,"company":company,'Content-type': mimeType,'Authorization':'Bearer ${tokenRestData.accessToken}'}, | |||||
| body: byte); | |||||
| print('File send ${file.lengthSync()/1024} KB'); | print('File send ${file.lengthSync()/1024} KB'); | ||||
| final Map data = JsonDecoder().convert(_reponse.body); | |||||
| // print(_reponse.body); | |||||
| if(_response.statusCode!=200){ | |||||
| if(util.htmlErrorTitle(_response.body.toString())!=""){ | |||||
| return {"STATUS":0,"DATA":util.htmlErrorTitle(_response.body.toString())}; | |||||
| } | |||||
| throw _response.body.toString(); | |||||
| } | |||||
| final Map data = JsonDecoder().convert(_response.body); | |||||
| // print(_response.body); | |||||
| // if(data['STATUS']==1){ | // if(data['STATUS']==1){ | ||||
| // return {"STATUS":1,"DATA":'File send ${file.lengthSync()/1024} KB'}; | // return {"STATUS":1,"DATA":'File send ${file.lengthSync()/1024} KB'}; | ||||
| // } | // } | ||||
| @@ -110,11 +144,12 @@ class file_Trans_Handler { | |||||
| } | } | ||||
| unPackDb(String link,String company,String cabang_id,String dbPath) async{ | unPackDb(String link,String company,String cabang_id,String dbPath) async{ | ||||
| try{ | try{ | ||||
| var _reponse = await http.post( | |||||
| var _response = await http.post( | |||||
| Uri.parse(link), headers: {'Content-type': 'application/json'}, | Uri.parse(link), headers: {'Content-type': 'application/json'}, | ||||
| body: json.encode({"cabangId":cabang_id,"company":company,"dbPath":dbPath})); | body: json.encode({"cabangId":cabang_id,"company":company,"dbPath":dbPath})); | ||||
| final Map data = JsonDecoder().convert(_reponse.body); | |||||
| final Map data = JsonDecoder().convert(_response.body); | |||||
| return data; | return data; | ||||
| } | } | ||||
| on HandshakeException catch(e){ | on HandshakeException catch(e){ | ||||
| @@ -135,10 +170,10 @@ class file_Trans_Handler { | |||||
| submitDb(String link,String company,String stock_id) async{ | submitDb(String link,String company,String stock_id) async{ | ||||
| try{ | try{ | ||||
| var _reponse = await http.post( | |||||
| var _response = await http.post( | |||||
| Uri.parse(link), headers: {'Content-type': 'application/json'}, | Uri.parse(link), headers: {'Content-type': 'application/json'}, | ||||
| body: json.encode({"stockTakingId":stock_id,"company":company})); | body: json.encode({"stockTakingId":stock_id,"company":company})); | ||||
| final Map data = JsonDecoder().convert(_reponse.body); | |||||
| final Map data = JsonDecoder().convert(_response.body); | |||||
| return data; | return data; | ||||
| } | } | ||||
| on HandshakeException catch(e){ | on HandshakeException catch(e){ | ||||
| @@ -156,20 +191,21 @@ class file_Trans_Handler { | |||||
| return {"STATUS":0,"DATA":'Request timeout. Make sure server is up and running'}; | return {"STATUS":0,"DATA":'Request timeout. Make sure server is up and running'}; | ||||
| } | } | ||||
| } | } | ||||
| // apex rest blm support multipart | |||||
| uploadMultipart(String fileName,String link)async{ | uploadMultipart(String fileName,String link)async{ | ||||
| httpClient = await util.getOauth2Client(); | |||||
| StreamedResponse _response; | StreamedResponse _response; | ||||
| List<int> _bytes = []; | List<int> _bytes = []; | ||||
| int _total = 0; | int _total = 0; | ||||
| try{ | try{ | ||||
| var request = MultipartRequest('POST', Uri.parse(link)); | |||||
| var request = MultipartRequest('PUT', Uri.parse(link)); | |||||
| request.files.add( | request.files.add( | ||||
| await MultipartFile.fromPath( | await MultipartFile.fromPath( | ||||
| 'picture', | 'picture', | ||||
| "${(await getApplicationDocumentsDirectory()).path}/$fileName" | "${(await getApplicationDocumentsDirectory()).path}/$fileName" | ||||
| ) | ) | ||||
| ); | ); | ||||
| _response = await http.send(request); | |||||
| _response = await httpClient.send(request); | |||||
| _total = File("${(await getApplicationDocumentsDirectory()).path}/$fileName").lengthSync(); | _total = File("${(await getApplicationDocumentsDirectory()).path}/$fileName").lengthSync(); | ||||
| dlulStream = _response.stream.listen((value) { | dlulStream = _response.stream.listen((value) { | ||||
| _bytes.addAll(value); | _bytes.addAll(value); | ||||
| @@ -105,14 +105,17 @@ class _HomePageState extends State<HomePage> { | |||||
| loadState()async{ | loadState()async{ | ||||
| String company = prefs.getString(keyClass.company); | String company = prefs.getString(keyClass.company); | ||||
| if(prefs.getString(keyClass.stock_id) == null) | |||||
| { | |||||
| valueTab value = await DBHelper.database.getValue(keyClass.stock_id); | |||||
| await prefs.setString(keyClass.stock_id, value.value); | |||||
| } | |||||
| String stock_taking_id = prefs.getString(keyClass.stock_id); | String stock_taking_id = prefs.getString(keyClass.stock_id); | ||||
| if(company!=null&&stock_taking_id!=null){ | if(company!=null&&stock_taking_id!=null){ | ||||
| var result = await util.JsonDataPostRaw({"company":company,"stockTakingId":stock_taking_id}, '${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/getStateStockUnit'); | |||||
| print(result); | |||||
| var result = await util.JsonDataPostRaw({"company":company,"stockTakingId":stock_taking_id}, '${prefs.getString(keyClass.hostAddress)}/stock_taking/state/'); | |||||
| if(result['STATUS']==1){ | if(result['STATUS']==1){ | ||||
| setState(() { | setState(() { | ||||
| state = result['DATA']['STATE']; | |||||
| state = result['DATA']; | |||||
| }); | }); | ||||
| } | } | ||||
| } | } | ||||
| @@ -129,7 +132,7 @@ class _HomePageState extends State<HomePage> { | |||||
| changeCabang(context)async{ | changeCabang(context)async{ | ||||
| util.showLoading(context); | util.showLoading(context); | ||||
| 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'); | |||||
| var result = await util.JsonDataPostRaw({"company":prefs.getString(keyClass.company),"User":prefs.getString(keyClass.loginId)}, '${prefs.getString(keyClass.hostAddress)}/user/cabangs/'); | |||||
| Navigator.pop(context); | Navigator.pop(context); | ||||
| if(result['STATUS']==1){ | if(result['STATUS']==1){ | ||||
| var selected = prefs.getString(keyClass.cabang_id)??result['DATA'][0]["RETURN_VALUE"]; | var selected = prefs.getString(keyClass.cabang_id)??result['DATA'][0]["RETURN_VALUE"]; | ||||
| @@ -472,7 +475,7 @@ class _HomePageState extends State<HomePage> { | |||||
| }, | }, | ||||
| onSelected: (value)async{ | onSelected: (value)async{ | ||||
| if(value == 'hostChange'){ | if(value == 'hostChange'){ | ||||
| hostAddress.text = prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'; | |||||
| hostAddress.text = prefs.getString(keyClass.hostAddress); | |||||
| await showDialog(context: context,builder: (context)=> | await showDialog(context: context,builder: (context)=> | ||||
| Material( | Material( | ||||
| color: Colors.white.withOpacity(0.9), | color: Colors.white.withOpacity(0.9), | ||||
| @@ -533,7 +536,7 @@ class _HomePageState extends State<HomePage> { | |||||
| contentPadding: EdgeInsets.all(8), | contentPadding: EdgeInsets.all(8), | ||||
| ), | ), | ||||
| onSubmitted: (value){ | onSubmitted: (value){ | ||||
| prefs.setString(keyClass.hostAddress,(value=='')?'https://unitstocksbackend.thamringroup.web.id':value); | |||||
| prefs.setString(keyClass.hostAddress,(value=='')?'https://tbg.thamringroup.web.id/ords/tbs/unit/v1':value); | |||||
| Navigator.pop(context); | Navigator.pop(context); | ||||
| }, | }, | ||||
| ), | ), | ||||
| @@ -549,7 +552,7 @@ class _HomePageState extends State<HomePage> { | |||||
| TextButton( | TextButton( | ||||
| child: Text('OK',style: TextStyle(color: Colors.indigo),), | child: Text('OK',style: TextStyle(color: Colors.indigo),), | ||||
| onPressed: (){ | onPressed: (){ | ||||
| prefs.setString(keyClass.hostAddress,(hostAddress.text=='')?'https://unitstocksbackend.thamringroup.web.id':hostAddress.text); | |||||
| prefs.setString(keyClass.hostAddress,(hostAddress.text=='')?'https://tbg.thamringroup.web.id/ords/tbs/unit/v1':hostAddress.text); | |||||
| Navigator.pop(context); | Navigator.pop(context); | ||||
| }, | }, | ||||
| ) | ) | ||||
| @@ -593,7 +596,7 @@ class _HomePageState extends State<HomePage> { | |||||
| if(value == 'logout'){ | if(value == 'logout'){ | ||||
| prefs.remove(keyClass.cabang_id); | prefs.remove(keyClass.cabang_id); | ||||
| prefs.remove(keyClass.company); | prefs.remove(keyClass.company); | ||||
| prefs.remove(keyClass.user_id); | |||||
| prefs.remove(keyClass.loginId); | |||||
| prefs.setBool(keyClass.logged_in, false); | prefs.setBool(keyClass.logged_in, false); | ||||
| Navigator.pushNamed(context, '/login'); | Navigator.pushNamed(context, '/login'); | ||||
| } | } | ||||
| @@ -678,7 +681,8 @@ class _HomePageState extends State<HomePage> { | |||||
| print('fetching'); | print('fetching'); | ||||
| util.showLoading(context); | util.showLoading(context); | ||||
| file_Trans_Handler trans = new file_Trans_Handler(); | file_Trans_Handler trans = new file_Trans_Handler(); | ||||
| trans.downloadFile('UnitStocking.db',"${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/getSqliteDb/${prefs.getString(keyClass.company)}/${prefs.getString(keyClass.cabang_id)}"); | |||||
| // trans.downloadFile('UnitStocking.db',"http://172.16.1.8:14002/getSqliteDbtest/TBS/02"); | |||||
| trans.downloadFile('UnitStocking.db',"${prefs.getString(keyClass.hostAddress)}/stock_taking/get_units/${prefs.getString(keyClass.company)}/${prefs.getString(keyClass.cabang_id)}"); | |||||
| progressDLStream = trans.progress.listen((value)async { | progressDLStream = trans.progress.listen((value)async { | ||||
| if(progressDL==null) { | if(progressDL==null) { | ||||
| // print(['test',value]); | // print(['test',value]); | ||||
| @@ -810,7 +814,7 @@ class _HomePageState extends State<HomePage> { | |||||
| popped = true; | popped = true; | ||||
| return true; | return true; | ||||
| }); | }); | ||||
| 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)); | |||||
| var upload = await trans.uploadFile('UnitStocking.db',"${prefs.getString(keyClass.hostAddress)}/stock_taking/upload/",prefs.getString(keyClass.company),prefs.getString(keyClass.cabang_id)); | |||||
| if(!popped){ | if(!popped){ | ||||
| Navigator.pop(context); | Navigator.pop(context); | ||||
| util.showFlushbar(context, upload['DATA'],color:(upload['STATUS']!=1)?Colors.red:Colors.grey); | util.showFlushbar(context, upload['DATA'],color:(upload['STATUS']!=1)?Colors.red:Colors.grey); | ||||
| @@ -845,7 +849,7 @@ class _HomePageState extends State<HomePage> { | |||||
| children: <Widget>[ | children: <Widget>[ | ||||
| Container( | Container( | ||||
| alignment: (progressUL!=null)?Alignment.bottomCenter:Alignment.bottomLeft, | alignment: (progressUL!=null)?Alignment.bottomCenter:Alignment.bottomLeft, | ||||
| padding: EdgeInsets.only(left: 10,right: 10,top: 10,bottom: 15), | |||||
| padding: EdgeInsets.only(left: 10,right: 10,top: 10,bottom: 0), | |||||
| child: (progressUL!=null)?Column( | child: (progressUL!=null)?Column( | ||||
| mainAxisSize: MainAxisSize.min, | mainAxisSize: MainAxisSize.min, | ||||
| children: <Widget>[ | children: <Widget>[ | ||||
| @@ -926,11 +930,10 @@ class _HomePageState extends State<HomePage> { | |||||
| )); | )); | ||||
| if(result){ | if(result){ | ||||
| util.showLoading(context); | util.showLoading(context); | ||||
| file_Trans_Handler trans = new file_Trans_Handler(); | |||||
| 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)); | |||||
| var unpack = await util.JsonDataPutRaw({"cabangId":prefs.getString(keyClass.cabang_id),"company":prefs.getString(keyClass.company),"dbPath":prefs.getString(keyClass.targetProccess)}, '${prefs.getString(keyClass.hostAddress)}/stock_taking/add_collection/'); | |||||
| Navigator.pop(context); | Navigator.pop(context); | ||||
| util.showFlushbar(context, upload['DATA'],color:(upload['STATUS']!=1)?Colors.red:Colors.grey); | |||||
| if(upload['STATUS']==1){ | |||||
| util.showFlushbar(context, unpack['DATA'],color:(unpack['STATUS']!=1)?Colors.red:Colors.grey); | |||||
| if(unpack['STATUS']==1){ | |||||
| prefs.remove(keyClass.targetProccess); | prefs.remove(keyClass.targetProccess); | ||||
| prefs.setBool(keyClass.submitProccess,true); | prefs.setBool(keyClass.submitProccess,true); | ||||
| } | } | ||||
| @@ -989,11 +992,15 @@ class _HomePageState extends State<HomePage> { | |||||
| )); | )); | ||||
| if(result){ | if(result){ | ||||
| util.showLoading(context); | util.showLoading(context); | ||||
| file_Trans_Handler trans = new file_Trans_Handler(); | |||||
| var upload = await trans.submitDb("${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/submitStock",prefs.getString(keyClass.company),prefs.getString(keyClass.stock_id)); | |||||
| if(prefs.getString(keyClass.stock_id) == null) | |||||
| { | |||||
| valueTab value = await DBHelper.database.getValue(keyClass.stock_id); | |||||
| await prefs.setString(keyClass.stock_id, value.value); | |||||
| } | |||||
| var submits = await util.JsonDataPostRaw({"stockTakingId":prefs.getString(keyClass.stock_id),"company":prefs.getString(keyClass.company),"user_id":prefs.getString(keyClass.loginId)}, '${prefs.getString(keyClass.hostAddress)}/stock_taking/submit/'); | |||||
| Navigator.pop(context); | Navigator.pop(context); | ||||
| util.showFlushbar(context, upload['DATA'],color:(upload['STATUS']!=1)?Colors.red:Colors.grey); | |||||
| if(upload['STATUS']==1){ | |||||
| util.showFlushbar(context, submits['DATA'],color:(submits['STATUS']!=1)?Colors.red:Colors.grey); | |||||
| if(submits['STATUS']==1){ | |||||
| loadState(); | loadState(); | ||||
| prefs.remove(keyClass.submitProccess); | prefs.remove(keyClass.submitProccess); | ||||
| } | } | ||||
| @@ -1,5 +1,4 @@ | |||||
| import 'dart:io'; | import 'dart:io'; | ||||
| import 'package:flutter/cupertino.dart'; | import 'package:flutter/cupertino.dart'; | ||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'main.dart'; | import 'main.dart'; | ||||
| @@ -23,12 +22,12 @@ class _LoginPageState extends State<LoginPage> { | |||||
| Login()async{ | Login()async{ | ||||
| util.showLoading(context); | util.showLoading(context); | ||||
| var result = await util.JsonDataPostRaw({"User":userCon.text,"Pass":passCon.text}, '${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/login'); | |||||
| var result = await util.JsonDataPostRaw({"User":userCon.text,"Pass":passCon.text}, '${prefs.getString(keyClass.hostAddress)}/user//login/'); | |||||
| if(result['STATUS']==1){ | if(result['STATUS']==1){ | ||||
| prefs.setString(keyClass.user_id, result['DATA'][keyClass.user_id]); | |||||
| prefs.setString(keyClass.company, result['DATA'][keyClass.company]); | |||||
| prefs.setString(keyClass.loginId, result['DATA'][keyClass.loginId.toLowerCase()]); | |||||
| prefs.setString(keyClass.company, result['DATA'][keyClass.company.toLowerCase()]); | |||||
| prefs.setBool(keyClass.logged_in, true); | prefs.setBool(keyClass.logged_in, true); | ||||
| var cabangList = await util.JsonDataPostRaw({"company":prefs.getString(keyClass.company),"User":prefs.getString(keyClass.user_id)}, '${prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'}/getCabangByUser'); | |||||
| var cabangList = await util.JsonDataPostRaw({"company":prefs.getString(keyClass.company),"User":prefs.getString(keyClass.loginId)}, '${prefs.getString(keyClass.hostAddress)}/user/cabangs/'); | |||||
| Navigator.pop(context); | Navigator.pop(context); | ||||
| if(cabangList['STATUS']==1){ | if(cabangList['STATUS']==1){ | ||||
| cabangDrop = cabangList['DATA']; | cabangDrop = cabangList['DATA']; | ||||
| @@ -82,7 +81,7 @@ class _LoginPageState extends State<LoginPage> { | |||||
| prefs.setBool(keyClass.logged_in, false); | prefs.setBool(keyClass.logged_in, false); | ||||
| prefs.remove(keyClass.cabang_id); | prefs.remove(keyClass.cabang_id); | ||||
| prefs.remove(keyClass.company); | prefs.remove(keyClass.company); | ||||
| prefs.remove(keyClass.user_id); | |||||
| prefs.remove(keyClass.loginId); | |||||
| }); | }); | ||||
| } | } | ||||
| return false; | return false; | ||||
| @@ -104,13 +103,13 @@ class _LoginPageState extends State<LoginPage> { | |||||
| flex: 3, | flex: 3, | ||||
| child: InkWell( | child: InkWell( | ||||
| onLongPress: ()async{ | onLongPress: ()async{ | ||||
| hostAddress.text = prefs.getString(keyClass.hostAddress)??'https://unitstocksbackend.thamringroup.web.id'; | |||||
| hostAddress.text = prefs.getString(keyClass.hostAddress); | |||||
| await showDialog(context: context,builder: (context)=>AlertDialog( | await showDialog(context: context,builder: (context)=>AlertDialog( | ||||
| title: Text('Set IP Address'), | title: Text('Set IP Address'), | ||||
| content: TextField( | content: TextField( | ||||
| controller: hostAddress, | controller: hostAddress, | ||||
| onSubmitted: (value){ | onSubmitted: (value){ | ||||
| prefs.setString(keyClass.hostAddress,(value=='')?'https://unitstocksbackend.thamringroup.web.id':value); | |||||
| prefs.setString(keyClass.hostAddress,(value=='')?'https://tbg.thamringroup.web.id/ords/tbs/unit/v1':value); | |||||
| Navigator.pop(context); | Navigator.pop(context); | ||||
| }, | }, | ||||
| ), | ), | ||||
| @@ -118,7 +117,7 @@ class _LoginPageState extends State<LoginPage> { | |||||
| TextButton( | TextButton( | ||||
| child: Text('OK'), | child: Text('OK'), | ||||
| onPressed: (){ | onPressed: (){ | ||||
| prefs.setString(keyClass.hostAddress,(hostAddress.text=='')?'https://unitstocksbackend.thamringroup.web.id':hostAddress.text); | |||||
| prefs.setString(keyClass.hostAddress,(hostAddress.text=='')?'https://tbg.thamringroup.web.id/ords/tbs/unit/v1':hostAddress.text); | |||||
| Navigator.pop(context); | Navigator.pop(context); | ||||
| }, | }, | ||||
| ) | ) | ||||
| @@ -306,7 +305,7 @@ class _LoginPageState extends State<LoginPage> { | |||||
| prefs.setBool(keyClass.logged_in, false); | prefs.setBool(keyClass.logged_in, false); | ||||
| prefs.remove(keyClass.cabang_id); | prefs.remove(keyClass.cabang_id); | ||||
| prefs.remove(keyClass.company); | prefs.remove(keyClass.company); | ||||
| prefs.remove(keyClass.user_id); | |||||
| prefs.remove(keyClass.loginId); | |||||
| }); | }); | ||||
| }, | }, | ||||
| child: Text('Cancel',style: TextStyle(color: Colors.indigo)), | child: Text('Cancel',style: TextStyle(color: Colors.indigo)), | ||||
| @@ -334,7 +333,7 @@ class _LoginPageState extends State<LoginPage> { | |||||
| // prefs.setBool(keyClass.logged_in, false); | // prefs.setBool(keyClass.logged_in, false); | ||||
| // prefs.remove(keyClass.cabang_id); | // prefs.remove(keyClass.cabang_id); | ||||
| // prefs.remove(keyClass.company); | // prefs.remove(keyClass.company); | ||||
| // prefs.remove(keyClass.user_id); | |||||
| // prefs.remove(keyClass.loginId); | |||||
| // }); | // }); | ||||
| // return false; | // return false; | ||||
| // }, | // }, | ||||
| @@ -424,7 +423,7 @@ class _LoginPageState extends State<LoginPage> { | |||||
| // prefs.setBool(keyClass.logged_in, false); | // prefs.setBool(keyClass.logged_in, false); | ||||
| // prefs.remove(keyClass.cabang_id); | // prefs.remove(keyClass.cabang_id); | ||||
| // prefs.remove(keyClass.company); | // prefs.remove(keyClass.company); | ||||
| // prefs.remove(keyClass.user_id); | |||||
| // prefs.remove(keyClass.loginId); | |||||
| // }); | // }); | ||||
| // }, | // }, | ||||
| // child: Text('Cancel',style: TextStyle(color: Colors.indigo)), | // child: Text('Cancel',style: TextStyle(color: Colors.indigo)), | ||||
| @@ -31,6 +31,8 @@ void main() async{ | |||||
| WidgetsFlutterBinding.ensureInitialized(); | WidgetsFlutterBinding.ensureInitialized(); | ||||
| prefs = await SharedPreferences.getInstance(); | prefs = await SharedPreferences.getInstance(); | ||||
| await registerCert(); | await registerCert(); | ||||
| if( prefs.getString(keyClass.hostAddress) ==null)await prefs.setString(keyClass.hostAddress, "https://tbg.thamringroup.web.id/ords/tbs/unit/v1"); | |||||
| await prefs.setString(keyClass.restTokenAddress, "https://tbg.thamringroup.web.id/ords/tbs/oauth/token"); | |||||
| SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) | SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) | ||||
| .then((_) { | .then((_) { | ||||
| runApp(new MyApp()); | runApp(new MyApp()); | ||||
| @@ -7,14 +7,14 @@ packages: | |||||
| name: archive | name: archive | ||||
| url: "https://pub.dartlang.org" | url: "https://pub.dartlang.org" | ||||
| source: hosted | source: hosted | ||||
| version: "2.0.13" | |||||
| version: "3.1.5" | |||||
| args: | args: | ||||
| dependency: transitive | dependency: transitive | ||||
| description: | description: | ||||
| name: args | name: args | ||||
| url: "https://pub.dartlang.org" | url: "https://pub.dartlang.org" | ||||
| source: hosted | source: hosted | ||||
| version: "1.6.0" | |||||
| version: "2.3.0" | |||||
| async: | async: | ||||
| dependency: transitive | dependency: transitive | ||||
| description: | description: | ||||
| @@ -64,13 +64,6 @@ packages: | |||||
| url: "https://pub.dartlang.org" | url: "https://pub.dartlang.org" | ||||
| source: hosted | source: hosted | ||||
| version: "1.15.0" | version: "1.15.0" | ||||
| convert: | |||||
| dependency: transitive | |||||
| description: | |||||
| name: convert | |||||
| url: "https://pub.dartlang.org" | |||||
| source: hosted | |||||
| version: "2.1.1" | |||||
| cross_file: | cross_file: | ||||
| dependency: transitive | dependency: transitive | ||||
| description: | description: | ||||
| @@ -84,7 +77,7 @@ packages: | |||||
| name: crypto | name: crypto | ||||
| url: "https://pub.dartlang.org" | url: "https://pub.dartlang.org" | ||||
| source: hosted | source: hosted | ||||
| version: "2.1.4" | |||||
| version: "3.0.1" | |||||
| cupertino_icons: | cupertino_icons: | ||||
| dependency: "direct main" | dependency: "direct main" | ||||
| description: | description: | ||||
| @@ -138,7 +131,7 @@ packages: | |||||
| name: flutter_launcher_icons | name: flutter_launcher_icons | ||||
| url: "https://pub.dartlang.org" | url: "https://pub.dartlang.org" | ||||
| source: hosted | source: hosted | ||||
| version: "0.7.5" | |||||
| version: "0.9.2" | |||||
| flutter_plugin_android_lifecycle: | flutter_plugin_android_lifecycle: | ||||
| dependency: transitive | dependency: transitive | ||||
| description: | description: | ||||
| @@ -176,7 +169,7 @@ packages: | |||||
| name: image | name: image | ||||
| url: "https://pub.dartlang.org" | url: "https://pub.dartlang.org" | ||||
| source: hosted | source: hosted | ||||
| version: "2.1.12" | |||||
| version: "3.0.8" | |||||
| image_picker: | image_picker: | ||||
| dependency: "direct main" | dependency: "direct main" | ||||
| description: | description: | ||||
| @@ -247,6 +240,13 @@ packages: | |||||
| url: "https://pub.dartlang.org" | url: "https://pub.dartlang.org" | ||||
| source: hosted | source: hosted | ||||
| version: "1.7.0" | version: "1.7.0" | ||||
| oauth2: | |||||
| dependency: "direct main" | |||||
| description: | |||||
| name: oauth2 | |||||
| url: "https://pub.dartlang.org" | |||||
| source: hosted | |||||
| version: "2.0.0" | |||||
| path: | path: | ||||
| dependency: transitive | dependency: transitive | ||||
| description: | description: | ||||
| @@ -309,7 +309,7 @@ packages: | |||||
| name: petitparser | name: petitparser | ||||
| url: "https://pub.dartlang.org" | url: "https://pub.dartlang.org" | ||||
| source: hosted | source: hosted | ||||
| version: "2.4.0" | |||||
| version: "4.3.0" | |||||
| photo_view: | photo_view: | ||||
| dependency: "direct main" | dependency: "direct main" | ||||
| description: | description: | ||||
| @@ -489,14 +489,14 @@ packages: | |||||
| name: xml | name: xml | ||||
| url: "https://pub.dartlang.org" | url: "https://pub.dartlang.org" | ||||
| source: hosted | source: hosted | ||||
| version: "3.6.1" | |||||
| version: "5.3.0" | |||||
| yaml: | yaml: | ||||
| dependency: transitive | dependency: transitive | ||||
| description: | description: | ||||
| name: yaml | name: yaml | ||||
| url: "https://pub.dartlang.org" | url: "https://pub.dartlang.org" | ||||
| source: hosted | source: hosted | ||||
| version: "2.2.1" | |||||
| version: "3.1.0" | |||||
| sdks: | sdks: | ||||
| dart: ">=2.14.0 <3.0.0" | dart: ">=2.14.0 <3.0.0" | ||||
| flutter: ">=2.5.0" | flutter: ">=2.5.0" | ||||
| @@ -1,7 +1,7 @@ | |||||
| name: unitstocks | name: unitstocks | ||||
| description: App to stock Thamrin Brothers Units | description: App to stock Thamrin Brothers Units | ||||
| # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html | ||||
| version: 1.0.3+6 | |||||
| version: 1.0.4+7 | |||||
| environment: | environment: | ||||
| sdk: ">=2.1.0 <3.0.0" | sdk: ">=2.1.0 <3.0.0" | ||||
| @@ -27,6 +27,7 @@ dependencies: | |||||
| # app_settings: | # app_settings: | ||||
| # autocomplete_textfield: | # autocomplete_textfield: | ||||
| barcode_scan: ^3.0.1 | barcode_scan: ^3.0.1 | ||||
| oauth2: ^2.0.0 | |||||
| dev_dependencies: | dev_dependencies: | ||||