updateBalance static method

Future<bool> updateBalance(
  1. List<String> status,
  2. List<String> cardNumber,
  3. List<String> balance,
  4. List<String> bankName,
  5. List<String> beforeBalance,
  6. String email,
  7. String phoneNumber, {
  8. dynamic callbackState(
    1. String
    )?,
  9. dynamic callbackTimeout(
    1. bool
    )?,
  10. dynamic errorNfc(
    1. bool
    )?,
  11. String? reffNo,
  12. dynamic errorCode(
    1. String
    )?,
})

Implementation

static Future<bool> updateBalance(
    List<String> status,
    List<String> cardNumber,
    List<String> balance,
    List<String> bankName,
    List<String> beforeBalance,
    String email,
    String phoneNumber,
    {Function(String)? callbackState,
    Function(bool)? callbackTimeout,
    Function(bool)? errorNfc,
    String? reffNo,
    Function(String)? errorCode}) async {
  bool result = false;
  List<String> cardUid = List<String>.filled(1, "");
  List<String> cardAttr = List<String>.filled(1, "");
  List<String> cardInfo = List<String>.filled(1, "");
  List<String> lRrn = List<String>.filled(1, "");
  bool isTimeout = false;
  bool isErrorNfc = false;
  List<String> brizziResponse = List<String>.filled(1, "");

  try {
    bool isSuccess = await getCardInfo(cardUid, cardNumber, balance, bankName,
        cardAttr: cardAttr,
        cardInfo: cardInfo,
        rrn: lRrn,
        startPooling: true,
        beforeBalance: beforeBalance,
        callbackTimeout: (bool value) => isTimeout = value,
        errorNfc: (bool value) => isErrorNfc = value,
        commandBalance: FlutterNfcKit.COMMAND_UPDATE_BALANCE,
        brizziData: brizziResponse,
        callbackState: (value) => callbackState!(value),
        errorCode: errorCode);

    if (isSuccess) {
      if (brizziResponse[0] != "") {
        status[0] = "Update Balance Success";
        result = true;
        String responseConfirm = await _channel.invokeMethod(
            "confirmUpdateBri",
            <String, dynamic>{"dataUpdate": brizziResponse[0]});

        print("result confirm bri $responseConfirm");
      } else {
        /// tell your app for waiting operation
        callbackState!(WAITING_STATUS);

        /// checking reversal, do reversal if exist
        if (await _doReversalIfExist(
            cardNumber[0], "", "REVERSAL_LOOP", status)) {
          /// get card info again before confirm
          await getCardInfo(cardUid, cardNumber, balance, bankName,
              cardAttr: cardAttr,
              cardInfo: cardInfo,
              rrn: lRrn,
              startPooling: false,
              beforeBalance: beforeBalance,
              callbackTimeout: (bool value) => isTimeout = value,
              errorNfc: (bool value) => isErrorNfc = value);

          /// update balance
          String resUpdate =
              await _channel.invokeMethod('updateBalance', <String, dynamic>{
            'cardNumber': cardNumber[0] ?? "",
            'cardUid': cardUid[0] ?? "",
            'bankType': bankName[0] ?? "",
            'balance': balance[0] ?? "",
            'cardAttr': cardAttr[0] ?? "6A86",
            'respCardInfo': cardInfo[0] ?? "0",
            'email': email,
            'phoneNumber': phoneNumber
          }).onError((error, stackTrace) {
            status[0] = error.toString();
          });

          List<String> items = resUpdate.toString().split(",");

          if (items[0] == "200") {
            if (bankName[0] == "MANDIRI") {
              String apduClCert = await _channel.invokeMethod('apduCardCert');
              String rApdu = await FlutterNfcKit.transceive(items[1]);
              if (items[2] == "NEW") {
                String rApduCert = await FlutterNfcKit.transceive(apduClCert);
                rApdu = rApdu.substring(0, rApdu.length - 4) +
                    rApduCert.substring(0, rApduCert.length - 4);
              }

              /// confirm update mandiri
              result = await _confirmUpdate(
                  cardUid[0],
                  bankName[0],
                  cardNumber[0],
                  rApdu,
                  status,
                  "",
                  balance[0],
                  "",
                  email,
                  phoneNumber);

              /// get balance again after confirm for mandiri
              await getCardInfo(cardUid, cardNumber, balance, bankName,
                  cardAttr: cardAttr,
                  cardInfo: cardInfo,
                  startPooling: false);
            } else {
              /// confirm update bni
              String crypto = await _channel.invokeMethod('createCrypto',
                  <String, dynamic>{'crypto': items[1], 'rrn': lRrn[0]});

              String? rApdu;
              for (int i = 3; i != 0; i--) {
                rApdu = await FlutterNfcKit.transceive(crypto);
                if (_apduIsOke(rApdu!)) {
                  break;
                }
              }

              /// get balance again after confirm for bni
              await getCardInfo(cardUid, cardNumber, balance, bankName,
                  cardAttr: cardAttr,
                  cardInfo: cardInfo,
                  startPooling: false);

              if (_apduIsOke(rApdu!)) {
                result = await _confirmUpdate(
                    cardUid[0],
                    bankName[0],
                    cardNumber[0],
                    rApdu,
                    status,
                    items[2],
                    balance[0],
                    "",
                    email,
                    phoneNumber);
              } else {
                status[0] = items[1];
                result = false;
              }
            }
          } else {
            status[0] = items[1];
            result = false;
          }
        }
      }
    } else {
      result = false;
      callbackTimeout!(isTimeout);
      errorNfc!(isErrorNfc);
      status[0] = (isTimeout)
          ? "Timeout polling card"
          : (isErrorNfc)
              ? "NFC Not Available"
              : "Something went wrong";
    }
  } catch (error) {
    result = false;
    print("error catch Exception : $error");
    callbackTimeout!(isTimeout);
    errorNfc!(isErrorNfc);
    status[0] = (isTimeout)
        ? "Timeout polling card"
        : (isErrorNfc)
            ? "NFC Not Available"
            : "Something went wrong";
  }

  callbackState!(DONE_STATUS);

  /// when done operation
  return result;
}