updateBalance static method
Future<bool>
updateBalance(
- List<String> status,
- List<String> cardNumber,
- List<String> balance,
- List<String> bankName,
- List<String> beforeBalance,
- String email,
- String phoneNumber, {
- dynamic callbackState(
- String
)?,
- dynamic callbackTimeout(
- bool
)?,
- dynamic errorNfc(
- bool
)?,
- String? reffNo,
- dynamic errorCode(
- 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;
}