processRequestThird function

dynamic processRequestThird(
  1. dynamic dataRequest,
  2. dynamic context,
  3. 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;
}