processRequestThird function
dynamic
processRequestThird(
- dynamic dataRequest,
- dynamic context,
- dynamic datamodel
Implementation
processRequestThird(dataRequest, context, datamodel) async {
//List result = ['thirdrequest'];
List result = [];
if (!isSS()) {
var requestname = '';
Map body = {};
result = [gCancel];
if (!isNull(dataRequest[gAction])) {
var action = dataRequest[gAction];
if (action == gFormchange) {
Map data = dataRequest[gData][0];
if (data.containsKey(gFormid)) {
dynamic formid = data[gFormid];
if (formid == gZzytransaction) {
if (isNull(data[gId] ?? '') || !isNull(data[gUnpaid] ?? '')) {
requestname = appParam[gPay];
var barcodevalue = data[gBarcode];
barcodevalue = barcodevalue.toString().replaceAll(' ', '');
if (isPhysicCard(data[gBarcode])) {
if (barcodevalue.toString().contains('/')) {
barcodevalue = barcodevalue
.toString()
.substring(barcodevalue.toString().lastIndexOf('/') + 1);
}
}
body[appParam['$gCode$gLabel']] = barcodevalue;
if (!isNull(data[gAmount])) {
var amount = fromMoney(data[gAmount]);
var tip = fromMoney(data[gTip]);
if (isNull(tip)) {
tip = '0';
}
var total =
'${datamodel.getInt(datamodel.expressValue({}, '$amount+$tip'))}';
body[appParam[gAmount]] = total;
body[appParam[gTip]] = tip;
}
datamodel.myLog('processRequestThird dataRequest:$dataRequest');
if (isPhysicCard(data[gBarcode])) {
if (isNull(data[gPin])) {
throw Exception("Missing pin");
}
body[appParam[gPin]] = data[gPin];
}
if (!isNull(data[appParam[gOrderno]])) {
body[appParam[gOrderno]] = data[appParam[gOrderno]];
} else if (!isNull(data[gId])) {
body[appParam[gOrderno]] = data[gId];
}
} else {
requestname = appParam[gQuery];
body[appParam[gId]] = data[gId];
}
//requestname = '';
} else if (formid == gLogin) {
requestname = appParam[gLogin];
appParam['$gLogin$gValue'] = data[gEmail];
body[appParam['$gLogin$gLabel']] = data[gEmail];
body[appParam[gPassword]] = data[gPassword];
} else if (formid == 'Zzytip') {
Map updateBody = {};
var dataActionid = '';
if (data.keys.length == 2) {
} else {
var tip = data[gTip];
var isDefault = data[gIsdefault] ?? "false";
if (datamodel.isSqlTrue(
"not exists from $formid where tip='$tip'", context)) {
dataActionid = gTableAdd;
updateBody = {
gId: "${appParam['$gTip$gId']}$tip",
"tip": "$tip",
"isdefault": "$isDefault",
gEntryid: appParam[gTargetid],
gEntrytime: "${datamodel.getSystemtime()}"
};
} else {
var tip = data[gTip];
var isDefault = data[gIsdefault] ?? "false";
dataActionid = gTableUpdate;
updateBody = {
gId: "${appParam['$gTip$gId']}$tip",
"isdefault": "$isDefault",
gEntryid: appParam[gTargetid],
gEntrytime: "${datamodel.getSystemtime()}"
};
}
}
return processSaveResponse(
formid, data, datamodel, context, updateBody, dataActionid);
}
}
} else if (action == 'getForm') {
if (dataRequest[gData][gFormid] == gLogin) {
return getThirdFormLogin(dataRequest);
}
} else if (action == 'getTab') {
return getThirdSetMyTab();
} else if (action == 'getsessionkey') {
return getThirdSessionkey();
} else if (action == gLogin) {
return getThirdLogin();
} else if (action == 'getImageLink') {
Map data = dataRequest[gData];
return getThirdImageLink(data);
} else if (action == gProcess) {
Map data = dataRequest[gData][0];
if (data[gType] == gTable) {
//check if table exists
var tableName = data[gActionid];
if (tableName == gZzytransaction) {
if (!isNull(data['$gRobin$gCnt'])) {
int robinCnt = data['$gRobin$gCnt'] + 1;
int robinTotal = data['$gRobin$gTotal'];
if (robinCnt > robinTotal) {
throw Exception("This request was over $robinTotal times");
}
data['$gRobin$gCnt'] = robinCnt;
int iSeconds = data['$gRobin$gSecond'] ?? 1;
for (int i = 0; i < iSeconds; i++) {
await Future.delayed(const Duration(seconds: 1));
}
requestname = appParam[gQuery];
body[appParam[gId]] = data[appParam[gId]];
}
}
List list = await datamodel.retrieveTableFromLocalList(
data[gActionid], context);
dynamic dbData = [];
if (list.isNotEmpty) {
dbData = list[0][gData];
if (dbData is! List) {
dynamic dataUnserial = getJsonDecode(dbData);
dbData = dataUnserial[gData];
}
}
if (data[gActionid] == gZzyi10nlist) {
return getThirdZzyi10nlist(dbData);
}
if (data[gActionid] == 'Zzyimage') {
return getThirdZzyimage(dbData);
}
if (data[gActionid] == 'Zzydictionary') {
return getThirdZzydictionary(dbData);
}
if (data[gActionid] == 'Zzydictionaryitem') {
return getThirdZzydictionaryitem(dbData);
}
if (data[gActionid] == 'Zzytransaction' && isNull(requestname)) {
return getThirdZzytransaction(dbData, datamodel);
}
if (data[gActionid] == 'Zzytip') {
return getThirdZzytip(dbData);
}
}
} else if (action == appParam['$gRefresh$gToken$gLabel']) {
requestname = appParam['$gRefresh$gToken$gValue'];
/*body[appParam['$gRefresh$gToken$gLabel']] =
appParam['$gRefresh$gToken'];*/
body[appParam['$gLogin$gLabel']] =
appParam['$gLogin$gLabel$gLabel'] ?? 'linus';
body[appParam[gPassword]] =
appParam['$gLogin$gLabel$gValue'] ?? 'linus';
} else if (action == appParam['$gBalance$gUrl']) {
requestname = action;
}
}
if (isNull(requestname)) {
return [];
}
var requestnameReal = requestname;
if (requestname == appParam['$gRefresh$gToken$gValue']) {
requestnameReal = appParam[gLogin];
}
Uri uri = Uri.http(appParam[gUrl], requestnameReal);
final headers = {
'contentType':
'text/html,application/xhtml+xml,application/xml,application/x-www-form-urlencoded',
'accept-language': 'en-US,en',
};
if (requestnameReal != appParam[gLogin]) {
headers['Authorization'] = 'Bearer ${appParam[gToken]}';
}
datamodel.myLog(
'======== $gUrl request: $requestnameReal, param: $body, headers: $headers');
http.Response response =
// ignore: return_of_invalid_type_from_catch_error
await httpClient
.post(uri, headers: headers, body: body)
.catchError((error) {
throw error.message;
});
//datamodel.removeCurrentSeq(dataList, dataRequest, context);
datamodel.myLog('======== response: $response');
if (response.statusCode != HttpStatus.ok) {
//refresh token
//relogin
if (requestname != appParam['$gRefresh$gToken$gValue']) {
//await processRequestThird(dataList, context, datamodel);
//await datamodel.processRequest(dataList, context);
await processRequestThird(
{gAction: appParam['$gRefresh$gToken$gLabel']}, context, datamodel);
await processRequestThird(dataRequest, context, datamodel);
return result;
//processRequestThird(dataRequest, context, datamodel);
}
//relogin
throw Exception("server error(${response.statusCode}, ${response.body})");
}
List actions = [];
datamodel.myLog('======== response BODY: ${response.body.toString()}');
Map mapResponse = getJsonDecode(response.body.toString());
var retcode = mapResponse[appParam[gCode]];
//var errMsg = '';
/*if (requestname == appParam[gPay] &&
(retcode == appParam['$gCode$gNo$gBalance$gCard'] ||
retcode == appParam['$gCode$gNo$gFalse$gCard'])) {
//errMsg = mapResponse[appParam[gMsg]];
if (retcode == appParam['$gCode$gNo$gFalse$gCard']) {
//var msg = mapResponse[appParam[gMsg]];
//datamodel.showMsg(context, '$retcode:$msg', null);
datamodel.setValueOnCol(gBarcode, '', context);
datamodel.setFocus(gZzytransaction, gBarcode, '', true, context, -1);
}
mapResponse = {
"ret_code": appParam[gComplete],
"data": {
"order": {
"amount": body[appParam[gAmount]],
"amount_paid": 0,
//"store_id": 8,
"order_no": body[appParam[gOrderno]],
//"updated_at": "2023-12-14T21:38:22.000000Z",
//"created_at": "2023-12-14T21:38:22.000000Z",
//"id": 224
}
}
};
retcode = mapResponse[appParam[gCode]];
}*/
if (retcode != appParam[gComplete]) {
if (requestname == appParam['$gRefresh$gToken$gValue']) {
//return to login
datamodel.clear(context);
initAppParam();
return getThirdLogin();
}
var msg = mapResponse[appParam[gMsg]];
//beforeMsgPopup(retcode, datamodel, context);
List codeList = appParam['${gCode}List'];
if (codeList.contains(retcode)) {
actions = appParam['$retcode$gAction'];
}
actions.add({
gAction: gShowErr,
gData: [
{gErrMsg: msg}
]
});
//actions.add({gAction:'refreshCommon',gData:[]});
return actions;
//throw Exception("$retcode, $msg");
}
if (requestname == appParam['$gBalance$gUrl']) {
appParam[gBalance] =
mapResponse[appParam[gData]][appParam['$gBalance$gLabel']];
}
if (requestname == appParam[gPay] || requestname == appParam[gQuery]) {
Map responseData = mapResponse[gData];
if (!isNull(responseData[gStore]) &&
!isNull(responseData[gStore][appParam['$gBalance$gLabel']])) {
appParam[gBalance] = responseData[gStore][appParam['$gBalance$gLabel']];
}
//if(!isNull(responseData[gOrder]) && !isNull(responseData['amountpaid']) ){
bool isComplete = false;
if (!isNull(responseData[appParam[gOrder]])) {
responseData = responseData[appParam[gOrder]];
}
if ((!isNull(responseData[appParam[gStatus]]) &&
responseData[appParam[gStatus]] ==
appParam['$gStatus$gComplete']) ||
!isNull(responseData[appParam['$gAmount$gPay']])) {
isComplete = true;
}
if (isComplete) {
actions = appParam['${appParam['$gStatus$gComplete']}$gAction'];
actions =
getOrderActions(responseData, actions, datamodel, dataRequest);
return actions;
}
String id = responseData[appParam[gId]];
actions = appParam['$gQuery$gAction'];
actions = getOrderActionsQuery(id, actions, datamodel, dataRequest);
return actions;
}
if (requestname == appParam[gPay]) {
//close me
//save table
datamodel.resetLastBarcode();
Map data = dataRequest[gData][0];
if (isPhysicCard(data[gBarcode])) {
Map order = mapResponse[gData][appParam[gOrder]];
var orderno = order[appParam[gOrderno]] ?? '';
var amount = order[appParam[gAmount]];
var amountpaid = order[appParam['$gAmount$gPay']] ?? '0';
//datamodel.setValueOnCol(gId, orderno, context);
datamodel.setValueOnCol(gOrderno, orderno, context);
datamodel.setValueOnCol(gPaid, toMoney(amountpaid), context);
if (amount != amountpaid) {
var unpaid =
'${datamodel.getInt(datamodel.expressValue({}, '$amount-$amountpaid'))}';
// continue?
int backcolor = Colors.white.value;
/*Widget cancelButton = ElevatedButton(
child: MyLabel(const {gLabel: 'Print receipt'}, backcolor),
onPressed: () {
if (amountpaid > 0) {
result = paymentReceipt(orderno, amountpaid,
body[appParam[gTip]], datamodel, context);
} else {
resetPaymentGui(datamodel, context);
}
Navigator.of(context).pop();
datamodel.myNotifyListeners();
},
);*/
//MyScreen aScreen = MyScreen(orderMap, backcolor);
Map itemList =
getOrderItemsList(datamodel, orderno, amount, amountpaid, true);
itemList[800] = {
gItem: {
gType: gBtn,
gLabel: 'Continue Pay ${toMoney(unpaid)}',
gFunction: 'thirdContinuepay',
gHeight: 60.0
}
};
itemList[810] = {
gItem: {
gType: gSizedbox,
gValue: 20.0,
}
};
itemList = Map.fromEntries(itemList.entries.toList()
..sort((e1, e2) =>
datamodel.getInt(e1.key) - datamodel.getInt(e2.key)));
Widget w = datamodel.getBodyStack(
true, {}, itemList, backcolor, [], context);
/*Widget continueButton = ElevatedButton(
child: MyLabel({gLabel: 'Continue Payment ${toMoney(unpaid)}.'},
Colors.white.value),
onPressed: () {
resetPaymentGuiMainvalue(datamodel, context);
datamodel.setValue('Zzytransaction', gBarcode, gFakeId, '');
datamodel.setValue('Zzytransaction', gPin, gFakeId, '');
if (!isNull(orderno)) {
datamodel.setValue(
'Zzytransaction', gOrderno, gFakeId, orderno);
}
datamodel.setFocus(
'Zzytransaction', gBarcode, gFakeId, true, context, -1);
Navigator.of(context).pop();
datamodel.myNotifyListeners();
},
);*/
// set up the AlertDialog
AlertDialog alert = AlertDialog(
title: MyLabel(
const {gLabel: 'Partial paid', gFontWeight: FontWeight.bold},
backcolor),
content: w,
/*actions: [
continueButton,
cancelButton,
],*/
);
// show the dialog
showDialog(
context: context,
builder: (BuildContext context) {
return alert;
},
);
return result;
}
return paymentReceipt(orderno, amount, body[appParam[gTip]], amountpaid,
datamodel, context);
}
var id = mapResponse[gData][appParam[gId]];
//check order status
await Future.delayed(const Duration(microseconds: 51)); //等1秒
dataRequest[gData][0][gId] = id;
dataRequest[gData][0][gCnt] = 0;
await processRequestThird(dataRequest, context, datamodel);
return result;
}
if (requestname == appParam[gLogin] ||
requestname == appParam['$gRefresh$gToken$gValue']) {
var accessToken = mapResponse[gData][appParam['$gToken$gLabel']];
/*var refreshToken =
mapResponse[gData][appParam['$gRefresh$gToken$gLabel']];
appParam['$gRefresh$gToken'] = refreshToken;*/
appParam[gToken] = accessToken;
appParam['$gLogin$gLabel$gLabel'] = body[appParam['$gLogin$gLabel']];
appParam['$gLogin$gLabel$gValue'] = body[appParam[gPassword]];
Map store = mapResponse[gData][appParam[gStore]];
setThirdBalance(store, context);
var address =
'${store[appParam[gAddress]]} ${store[appParam[gCity]]} ${store[appParam[gProvince]]} ${store[appParam[gPostal]]}';
appParam['$gAddress$gValue'] = address;
appParam['$gName$gValue'] = store[appParam[gName]];
appParam['$gLogo$gValue'] = store[appParam[gLogo]];
if (requestname == appParam['$gRefresh$gToken$gValue']) {
return result;
}
return getThirdLoginComplete();
}
if (requestname == appParam[gQuery]) {
var status = mapResponse[gData][appParam[gStatus]];
/*if (dataRequest[gData][0][gCnt] > 5) {
status = appParam[gComplete];
}*/
if (status == appParam[gPending]) {
dataRequest[gData][0][gCnt] = (dataRequest[gData][0][gCnt] ?? 0) + 1;
datamodel.myLog(
'-------------------$requestname cnt: ${dataRequest[gData][0][gCnt]}');
if (dataRequest[gData][0][gCnt] > appParam[gCnt]) {
throw Exception('time out, order was cancelled');
}
await Future.delayed(const Duration(seconds: 1)); //等1秒
await processRequestThird(dataRequest, context, datamodel);
return result;
}
if (status != appParam[gComplete]) {
throw Exception('order status was not right: $status');
}
datamodel
.myLog('-------------------response: ${response.body.toString()}');
/*{"ret_code":1,"data":{"id":190,"amount":10000,"store":{"id":8,"points":10,"logo":"https:\/\/supabckt.s3.ca-central-1.amazonaws.com\/images\/logos\/famous-logo-evolution-history-old-new-fb-png__700.jpg","area":["Richmond"],"address":"4731 Garden City Rd #150","latlng":["49.17870865425908","-123.12595725843511"]},"type":2,"status":10,"points_used":0,"points_added":0,"new_points":0,"balance_used":0,"balance_bonus":0,"new_balance":0,"fee":0,"tip":0,"payment_code":"V05988435188322396","payment_method":"V","txn_no":"17023245474678666","order_no":"O17023245474626138","related_id":51,"created_at":1702324547,"updated_at":1702324547}}*/
var orderno = mapResponse[gData][appParam[gId]];
var amount = mapResponse[gData][appParam[gAmount]];
//var initialamount = amount;
var tip = mapResponse[gData][appParam[gTip]] ?? 0;
var amountpaid = amount;
datamodel.setValueOnCol(gOrderno, orderno, context);
datamodel.setValueOnCol(gPaid, toMoney(amountpaid), context);
Map store = mapResponse[gData][appParam[gStore]];
setThirdBalance(store, context);
//print receipt
return paymentReceipt(
orderno, amount, tip, amountpaid, datamodel, context);
/*Map dataRow = {
gId: id,
gParentid: datamodel.globalParam[gGlobalCompanyid],
gTargettype: gCustomer,
gTranstype: gGiftcard,
gAction: gConsume,
gTargetid: datamodel.globalParam[gUid],
gAmount: '$amount',
gTip: '$tip',
gBarcode: body[gCode],
//gOriginalamount: '$initialamount',
gEntryid: datamodel.globalParam[gUid],
gEntrytime: '${datamodel.getSystemtime()}',
gAddress: appParam['$gAddress$gValue'],
gName: appParam['$gName$gValue'],
gBalance: balance,
//gAddress: mapResponse[gData][gStore][gAddress],
//gLogo: mapResponse[gData][appParam[gStore]][gLogo]
};
printReceipt(dataRow, context);*/
/*dataList.add({
gAction: gPrintReceipt,
gData: [
{
gTableID: 'Zzytransaction',
gId: id,
gAddress: mapResponse[gData][gStore][gAddress],
gLogo: mapResponse[gData][appParam[gStore]][gLogo]
}
]
});*/
}
//removeCurrentSeq(dataList, dataRequest, datamodel, context);
}
return result;
}