Merge remote-tracking branch 'origin/master' into merge

This commit is contained in:
MooN 2025-11-14 16:37:56 +06:30
commit 063dfae87f
32 changed files with 1121 additions and 282 deletions

33
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,33 @@
# Built files
*.apk
*.aab
*.dex
*.class
# Gradle
.gradle/
build/
*/build/
**/build/
**/build/**
**/.transforms/
**/intermediates/
**/tmp/
paysdk-lib/build/
# Android Studio
*.iml
.idea/
local.properties
# Keystore
*.jks
*.keystore
# OS files
.DS_Store
Thumbs.db
# Logs
*.log

File diff suppressed because one or more lines are too long

View File

@ -14,8 +14,8 @@ android {
applicationId "com.utsmm.kbz"
minSdk 24
targetSdk 33
versionCode 5
versionName "1.05"
versionCode 7
versionName "1.07"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@ -40,9 +40,6 @@ android {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
@ -91,8 +88,6 @@ kapt {
dependencies {
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
implementation libs.androidx.lifecycle.livedata.ktx
implementation libs.androidx.lifecycle.viewmodel.ktx
def nav_version = "2.3.2"

View File

@ -46,8 +46,7 @@
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme.NoActionBar"
>
android:theme="@style/AppTheme.NoActionBar">
<!-- android:manageSpaceActivity="com.utsmyanmar.upos.config.UTSManageSpaceActivity"-->
<!-- <activity-->
<!-- android:screenOrientation="portrait"-->

View File

@ -292,7 +292,7 @@ public class MainFragment extends DataBindingFragment {
private void updateButtonStatus() {
mainViewModel.settlementStatus.setValue(SystemParamsOperation.getInstance().getSettlementStatus());
mainViewModel.kPayStatus.setValue(SystemParamsOperation.getInstance().getWavePayStatus());
mainViewModel.kPayStatus.setValue(SystemParamsOperation.getInstance().getQRPayStatus());
}
private void setUpCarouselImages() {
@ -877,7 +877,6 @@ public class MainFragment extends DataBindingFragment {
processBatch();
sharedViewModel.transactionsType.setValue(TransactionsType.MMQR);
navigateToAmount();
}
}

View File

@ -94,7 +94,7 @@ public class MainViewModel extends ViewModel {
settlementStatus.setValue(SystemParamsOperation.getInstance().getSettlementStatus());
kPayStatus.setValue(SystemParamsOperation.getInstance().getWavePayStatus());
kPayStatus.setValue(SystemParamsOperation.getInstance().getQRPayStatus());
disabledMsg.setValue(SystemParamsOperation.getInstance().getDisabledMsg());
}

View File

@ -5,5 +5,6 @@ public enum CardTransactionType {
MPU,
EMV,
MAG,
FALLBACK
FALLBACK,
MOCK
}

View File

@ -106,11 +106,15 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
public void onClickManualEntry() {
// showSingleInfoDialogAutoHide("Coming Soon!");
routeId = R.id.action_cardWaitingFragment_to_manualEntryFragment;
safeNavigateToRouteId();
}
public void onClickTap() {
cardReadViewModel.setCardTransactionType(CardTransactionType.MOCK);
routeId = R.id.action_cardWaitingFragment_to_processingCardFragment;
safeNavigateToRouteId();
}
}
@Override

View File

@ -246,7 +246,6 @@ public class InputPasswordFragment extends DataBindingFragment implements DataBi
if(inputPasswordViewModel.onClickEnter()) {
clearLiveData();
if(sharedViewModel.transactionsType.getValue() == TransactionsType.SETTING) {
mListener.onSuccess();
}

View File

@ -7,6 +7,7 @@ import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.utsmm.kbz.util.MockData;
import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.util.DataBindingConfig;
import com.utsmyanmar.checkxread.model.CardDataX;
@ -41,6 +42,8 @@ public class ProcessingCardFragment extends DataBindingFragment {
private TransProcessViewModel transProcessViewModel;
private PinPadViewModel pinPadViewModel;
private EmvTransactionProcessViewModel emvTransactionViewModel;
private int routeId;
@Override
@ -102,9 +105,24 @@ public class ProcessingCardFragment extends DataBindingFragment {
break;
case MAG: readMAGStripe(false,true);
break;
case MOCK: mockMPUCard();
break;
}
}
private void mockMPUCard() {
LogUtil.d(TAG,"initialize mock card data...");
routeId = R.id.action_processingCardFragment_to_pinPadFragment;
transProcessViewModel.transType.postValue(sharedViewModel.transactionsType.getValue());
pinPadViewModel.transType.postValue(sharedViewModel.transactionsType.getValue());
CardDataX cardDataX = MockData.getInstance().generateMPUCard();
TradeData tradeData = TransactionUtil.getInstance().initMPUTransaction(cardDataX, CardTypeX.IC);
transProcessViewModel.setTradeData(tradeData);
pinPadViewModel.setTradeData(tradeData);
sharedViewModel.setCardDataExist(true);
safeNavigateToRouteId();
}
private void readMPUCard() {
cardReadViewModel.startReadXProcess(MPUXReadCard.getInstance(), new ReadCardResultX() {

View File

@ -42,12 +42,13 @@ import java.io.IOException;
import javax.inject.Inject;
import dagger.hilt.android.AndroidEntryPoint;
import retrofit2.HttpException;
import com.utsmyanmar.paylibs.utils.LogUtil;
// Temporarily disabled Hilt
// @AndroidEntryPoint
@AndroidEntryPoint
public class TransactionResultFragment extends DataBindingFragment implements DataBindingFragment.BackPressCallback {
private static final String TAG = TransactionResultFragment.class.getSimpleName();

View File

@ -25,6 +25,8 @@ import java.util.HashSet;
import javax.inject.Inject;
import io.reactivex.rxjava3.core.Single;
public class CardReadViewModel extends ViewModel {
@ -46,7 +48,6 @@ public class CardReadViewModel extends ViewModel {
public SingleLiveEvent<Integer> cardTypeData = new SingleLiveEvent<>();
public SingleLiveEvent<PayDetail> payDetail = new SingleLiveEvent<>();
public SingleLiveEvent<CardReadStatus> readStatus = new SingleLiveEvent<>();
public SingleLiveEvent<String> checkCardAlertMsg = new SingleLiveEvent<>();
@ -95,96 +96,6 @@ public class CardReadViewModel extends ViewModel {
checkCardAlertMsg.setValue(null);
}
// public void initCardReadProcess(int allType, int timeOutInSec, ReadCardResult readCardResult) {
// ReadCardProcess.getInstance().startReadCard(allType,"",timeOutInSec,false).onStartReadCardProcess(new CheckCardListener() {
// @Override
// public void onCheckCardSuccess(int cardType, MPUCardData mpuCardData, CardScheme cardScheme) {
//
// cardData.postValue(mpuCardData);
// cardSchemeData.postValue(cardScheme);
// cardTypeData.postValue(cardType);
// PayDetail payDetailData = new PayDetail();
// payDetailData.setCardNo(mpuCardData.getPan());
// payDetailData.setEXPDate(mpuCardData.getExp());
// payDetailData.setAccountType(cardScheme.name());
// payDetailData.setCardType(cardType);
// payDetailData.setCardHolderName(mpuCardData.getCardHolderName());
// CardInfo cardInfo = new CardInfo();
// MAGCardInfo magCardInfo = new MAGCardInfo();
// LogUtil.d(TAG,"track 2 : "+mpuCardData.getTrack2());
// magCardInfo.setTrack2Cipher(mpuCardData.getTrack2());
// cardInfo.setMAGCardInfo(magCardInfo);
// payDetailData.setCardInfo(cardInfo);
//
// payDetail.postValue(payDetailData);
//
// mainThreadHandler.post(readCardResult::onSuccess);
//// readCardResult.onSuccess();
//
// }
//
// @Override
// public void onCheckCardFail(int code, String message) {
//
// if(code == -2801) {
// mainThreadHandler.post(readCardResult::onCommunicationError);
//// readCardResult.onCommunicationError();
// } else {
// mainThreadHandler.post(() -> readCardResult.onError(code,message));
//// readCardResult.onError(code,message);
// }
//
// }
// });
// }
//
// public SingleLiveEvent<CardReadStatus> startReadProcess(int allType,int timeOutInSec){
//
// ReadCardProcess.getInstance().startReadCard(allType,"",timeOutInSec,false).onStartReadCardProcess(new CheckCardListener() {
// @Override
// public void onCheckCardSuccess(int cardType, MPUCardData mpuCardData, CardScheme cardScheme) {
// flag.postValue(true);
// cardData.postValue(mpuCardData);
// cardSchemeData.postValue(cardScheme);
// cardTypeData.postValue(cardType);
// PayDetail payDetailData = new PayDetail();
// payDetailData.setCardNo(mpuCardData.getPan());
// payDetailData.setEXPDate(mpuCardData.getExp());
// payDetailData.setAccountType(cardScheme.name());
// payDetailData.setCardType(cardType);
// payDetailData.setCardHolderName(mpuCardData.getCardHolderName());
// CardInfo cardInfo = new CardInfo();
// MAGCardInfo magCardInfo = new MAGCardInfo();
// LogUtil.d(TAG,"track 2 : "+mpuCardData.getTrack2());
// magCardInfo.setTrack2Cipher(mpuCardData.getTrack2());
// cardInfo.setMAGCardInfo(magCardInfo);
// payDetailData.setCardInfo(cardInfo);
//
// payDetail.postValue(payDetailData);
//
// readStatus.postValue(CardReadStatus.SUCCESS);
//
//
// }
//
// @Override
// public void onCheckCardFail(int code, String message) {
//
// readStatus.postValue(CardReadStatus.FAIL);
// // this action just need to do once because there's too many reason to get fail
// if(!oneTimeFlag){
// errorCode.postValue(code+":"+message);
// flag.postValue(false);
// cardSchemeData.postValue(CardScheme.UNK);
// oneTimeFlag = true;
// }
//
// }
// });
//
// return readStatus;
// }
public void resetOneTimeFlag(){
oneTimeFlag = false;
}
@ -193,19 +104,4 @@ public class CardReadViewModel extends ViewModel {
NexGoSDK.getInstance().cancelCheckCard();
}
// public void checkCard(){
// int allType = AidlConstants.CardType.NFC.getValue() | AidlConstants.CardType.IC.getValue() | AidlConstants.CardType.MAGNETIC.getValue();
// ReadCardProcess.getInstance().startReadCard(allType,"",60,false).onStartReadCardProcess(new CheckCardListener() {
// @Override
// public void onCheckCardSuccess(int cardType, MPUCardData mpuCardData, CardScheme cardScheme) {
// System.out.println("Success");
// }
//
// @Override
// public void onCheckCardFail(int code, String message) {
//
// System.out.println("Failed");
// }
// });
// }
}

View File

@ -492,9 +492,9 @@ public class EmvTransactionProcessViewModel extends EmvBaseViewModel implements
private void handleTransactionProcess() {
String cardNo = mPayDetail.getCardNo();
if (cardNo == null || TextUtils.equals(cardNo, "")) {
// if (cardNo == null || TextUtils.equals(cardNo, "")) {
getCardInfo();
}
// }
getPayWaveData();
getF055Data();
if(transType.getValue() == TransactionsType.PRE_AUTH_COMPLETE || transType.getValue() == TransactionsType.PRE_AUTH_VOID || transType.getValue() == TransactionsType.REFUND ) {

View File

@ -18,7 +18,6 @@ import com.utsmyanmar.paylibs.print.printx.PrintXStatus;
import com.utsmyanmar.paylibs.system.SingleLiveEvent;
import com.utsmyanmar.paylibs.utils.PrintStatus;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionType;
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
import com.utsmm.kbz.util.enums.AccountType;
import com.utsmm.kbz.util.enums.SettlementType;
@ -168,9 +167,6 @@ public class SharedViewModel extends ViewModel {
}
public void setTransactionsType(TransactionsType transactionType) {
this.transactionsType.postValue(transactionType);
}
public void setEmvTrans(boolean status) {
isEmv.setValue(status);
}

View File

@ -13,7 +13,6 @@ import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import com.kizzy.xpay.util.Sign;
import com.utsmm.kbz.ui.qr_pay.QRRefund;
import com.utsmyanmar.baselib.network.model.DemoQRRequest;
import com.utsmyanmar.baselib.network.model.DemoQRResponse;
import com.utsmyanmar.baselib.network.model.DemoQRReturnRequest;
@ -37,6 +36,7 @@ import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.system.SingleLiveEvent;
import com.utsmyanmar.paylibs.utils.LogUtil;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsSettings;
import java.security.SecureRandom;
import java.util.HashMap;
@ -53,7 +53,11 @@ public class KPayViewModel extends ViewModel {
private final Repository repository;
private final String appKey = "UTSMMuat@2025";
private final String appKey = SystemParamsOperation.getInstance().getAppKey();
// private final String appKey = "UTSMMuat@2025";
private final String appId = SystemParamsOperation.getInstance().getAppId();
// private final String appId = "kp9b0794b349ae85b00c51e0677484c7";
private final ExecutorService executor = Executors.newSingleThreadExecutor();
private final Handler mainHandler = new Handler(Looper.getMainLooper());
@ -67,7 +71,6 @@ public class KPayViewModel extends ViewModel {
private String generateRandomTwoChars() {
// You can reuse the existing character set and SecureRandom instance
StringBuilder randomChars = new StringBuilder(3);
@ -116,7 +119,7 @@ public class KPayViewModel extends ViewModel {
bizContent.put("refund_request_no", refundOrderId);
bizContent.put("merch_order_id", origOrderId);
bizContent.put("merch_code", mid);
bizContent.put("appid", "kp9b0794b349ae85b00c51e0677484c7");
bizContent.put("appid", appId);
if(!refundAmount.equals("0")) {
bizContent.put("refund_amount", refundAmount);
}
@ -140,7 +143,7 @@ public class KPayViewModel extends ViewModel {
KPayRefund.RefundRequest.RequestBody.BizContent biz =
new KPayRefund.RefundRequest.RequestBody.BizContent(
"kp9b0794b349ae85b00c51e0677484c7",
appId,
mid,
origOrderId,
refundAmount, // This can be null for original refunds
@ -162,7 +165,7 @@ public class KPayViewModel extends ViewModel {
} else {
KPayRefund.RefundRequest.RequestBody.BizContent biz =
new KPayRefund.RefundRequest.RequestBody.BizContent(
"kp9b0794b349ae85b00c51e0677484c7",
appId,
mid,
origOrderId,
refundOrderId,
@ -197,7 +200,7 @@ public class KPayViewModel extends ViewModel {
Map<String, Object> bizContent = new HashMap<>();
bizContent.put("merch_order_id", merchOrderId);
bizContent.put("merch_code", mid);
bizContent.put("appid", "kp9b0794b349ae85b00c51e0677484c7");
bizContent.put("appid", appId);
bizContent.put("trade_type", "PAY_BY_QRCODE");
bizContent.put("total_amount", amount);
bizContent.put("title", "testing");
@ -218,7 +221,7 @@ public class KPayViewModel extends ViewModel {
String sign = Sign.INSTANCE.generateSign(requestMap, appKey);
KPayQRRequest.QrRequest.RequestBody.BizContent biz = new KPayQRRequest.QrRequest.RequestBody.BizContent(
"kp9b0794b349ae85b00c51e0677484c7",
appId,
mid,
merchOrderId,
"PAY_BY_QRCODE",
@ -254,7 +257,7 @@ public class KPayViewModel extends ViewModel {
Map<String, Object> bizContentMap = new HashMap<>();
bizContentMap.put("merch_order_id", merchOrderId);
bizContentMap.put("merch_code", mid);
bizContentMap.put("appid", "kp9b0794b349ae85b00c51e0677484c7");
bizContentMap.put("appid", appId);
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("timestamp", currentTime);
@ -266,7 +269,7 @@ public class KPayViewModel extends ViewModel {
String sign = Sign.INSTANCE.generateSign(requestMap, appKey);
KPayQRQueryRequest.QRQueryRequest.Request.BizContent bizContent = new KPayQRQueryRequest.QRQueryRequest.Request.BizContent(
"kp9b0794b349ae85b00c51e0677484c7",
appId,
mid,
merchOrderId
);
@ -294,16 +297,6 @@ public class KPayViewModel extends ViewModel {
private TradeData tradeData;
private PayDetail payDetail;
private QRRefund qrRefund;
public QRRefund getQrRefund() {
return qrRefund;
}
public void setQrRefund(QRRefund qrRefund) {
this.qrRefund = qrRefund;
}
public void setTradeData(TradeData tradeData){
this.tradeData = tradeData;
}

View File

@ -119,7 +119,12 @@ public class PinPadViewModel extends ViewModel {
case ON_CONFIRM_CLICK:
LogUtil.d(TAG, "ON CLICK CONFIRM");
// increasedKSN();
pinStatus.postValue(PinPadStatus.ON_CONFIRM);
if(transType.getValue() == TransactionsType.PRE_AUTH_COMPLETE || transType.getValue() == TransactionsType.PRE_AUTH_VOID || transType.getValue() == TransactionsType.REFUND ) {
pinStatus.postValue(PinPadStatus.ON_NEXT_SCREEN);
} else {
pinStatus.postValue(PinPadStatus.ON_CONFIRM);
}
break;
case ON_CANCEL_CLICK:
LogUtil.d(TAG, "ON CLICK CANCEL");

View File

@ -8,6 +8,9 @@ import com.utsmyanmar.paylibs.model.PayDetail;
import javax.inject.Inject;
import dagger.hilt.android.lifecycle.HiltViewModel;
@HiltViewModel
public class PreAuthVoidViewModel extends ViewModel {
private Repository repository;

View File

@ -1,6 +1,7 @@
package com.utsmm.kbz.util;
import com.sunmi.pay.hardware.aidlv2.AidlConstantsV2;
import com.utsmyanmar.checkxread.model.CardDataX;
import com.utsmyanmar.paylibs.model.CardInfo;
import com.utsmyanmar.paylibs.model.ICCardInfo;
import com.utsmyanmar.paylibs.model.MAGCardInfo;
@ -44,13 +45,29 @@ public class MockData {
// .iccData("5F21BLAHBLAH")
// .build();
// mockCardData = new MockCardData.Builder()
// .cardNo("9503051034047056")
// .expDate("0230")
// .cardScheme("MPU")
// .cardHolderName("KBZ Debit")
// .iccData("9503051034047056=30021015930000000000")
// .build();
mockCardData = new MockCardData.Builder()
.cardNo("9503190006079422")
.expDate("0725")
.cardNo("9505050161133125")
.expDate("0127")
.cardScheme("MPU")
.cardHolderName("YOMA VALUED CUSTOMER")
.cardHolderName("KBZ Credit")
.iccData("9505050161133125=27011017250000000000")
.build();
// mockCardData = new MockCardData.Builder()
// .cardNo("9503742975107251")
// .expDate("0629")
// .cardScheme("MPU")
// .cardHolderName("Bank Q")
// .iccData("9503742975107251=22081010000000000000")
// .build();
// mockCardData = new MockCardData.Builder()
// .phoneNo("9794452506")
// .expDate("0425")
@ -74,6 +91,15 @@ public class MockData {
return String.valueOf(randomNumber);
}
public CardDataX generateMPUCard() {
CardDataX cardDataX = new CardDataX();
cardDataX.setPan(mockCardData.getCardNo());
cardDataX.setExp(mockCardData.getExpDate());
cardDataX.setCardHolderName(mockCardData.getCardHolderName());
cardDataX.setTrack2(mockCardData.getIccData());
return cardDataX;
}
public TradeData generateMockDataWithTime(TransactionsType transType,int cardInputType,String transDate,String transTime) {
String strDate = SystemDateTime.getMMDD();
String strTime = SystemDateTime.getHHmmss();

View File

@ -10,6 +10,7 @@ import com.utsmyanmar.baselib.network.model.sirius.SiriusMerchant;
import com.utsmyanmar.baselib.network.model.sirius.SiriusProperty;
import com.utsmyanmar.baselib.network.model.sirius.SiriusResponse;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsSettings;
import com.utsmyanmar.paylibs.utils.enums.CurrencyType;
import com.utsmm.kbz.BuildConfig;
@ -412,15 +413,15 @@ public class TMSSetupsImpl implements TMSSetups{
} else if (TextUtils.equals(name,"ssl_enable")) {
SystemParamsOperation.getInstance().setSslSwitchStatus(parseBoolean(data));
} else if (TextUtils.equals(name,"wave_pay_inquiry_status_enable")) {
} else if (TextUtils.equals(name,"qrpay_inquiry_status_enable")) {
SystemParamsOperation.getInstance().setWavePayInquiryStatus(parseBoolean(data));
SystemParamsOperation.getInstance().setQRPayInquiryStatus(parseBoolean(data));
} else if (TextUtils.equals(name,"tips_adjustment_enable")) {
SystemParamsOperation.getInstance().setTipsAdjustmentStatus(parseBoolean(data));
} else if (TextUtils.equals(name,"wave_enable")) {
} else if (TextUtils.equals(name,"qrpay_enable")) {
SystemParamsOperation.getInstance().setWavePayStatus(parseBoolean(data));
SystemParamsOperation.getInstance().setQRPayStatus(parseBoolean(data));
} else if (TextUtils.equals(name,"print_iso_enable")) {
SystemParamsOperation.getInstance().setPrintISOStatus(parseBoolean(data));
@ -582,11 +583,14 @@ public class TMSSetupsImpl implements TMSSetups{
}
} else if (TextUtils.equals(name,"speedup_contactless_enable")) {
SystemParamsOperation.getInstance().setSpeedUpContactless(parseBoolean(data));
}
else if (TextUtils.equals(name,"manual_entry_pin_enable")) {
} else if (TextUtils.equals(name,"manual_entry_pin_enable")) {
SystemParamsOperation.getInstance().setManualEntryPinEnable(parseBoolean(data));
} else if (TextUtils.equals(name,"decimal_enable")) {
SystemParamsOperation.getInstance().setDecimalEnable(parseBoolean(data));
} else if (TextUtils.equals(name,"app_key")) {
SystemParamsOperation.getInstance().setAppKey(data);
} else if (TextUtils.equals(name,"app_id")) {
SystemParamsOperation.getInstance().setAppId(data);
}
}

View File

@ -206,7 +206,7 @@ public class TMSUtil {
voidStatus = SystemParamsOperation.getInstance().getVoidStatus();
cashAdvanceStatus = SystemParamsOperation.getInstance().getCashAdvanceStatus();
refundStatus = SystemParamsOperation.getInstance().getRefundStatus();
wavePayInquiryStatus = SystemParamsOperation.getInstance().getWavePayInquiryStatus();
wavePayInquiryStatus = SystemParamsOperation.getInstance().getQRPayInquiryStatus();
tipAdjustmentStatus = SystemParamsOperation.getInstance().getTipsAdjustmentStatus();
settlementStatus = SystemParamsOperation.getInstance().getSettlementStatus();

View File

@ -149,6 +149,7 @@
android:layout_weight="1"
app:cardCornerRadius="12dp"
app:cardElevation="2dp"
android:onClick="@{()->click.onClickTap()}"
android:backgroundTint="#fff"
android:foreground="?android:attr/selectableItemBackground"
android:focusable="true"

View File

@ -189,6 +189,12 @@
app:popUpToInclusive="true"
android:id="@+id/action_cardWaitingFragment_to_nav_main"
app:destination="@id/nav_main" />
<action
android:id="@+id/action_cardWaitingFragment_to_pinPadFragment"
app:launchSingleTop="true"
app:popUpTo="@+id/cardWaitingFragment"
app:popUpToInclusive="true"
app:destination="@id/pinPadFragment" />
</fragment>
<fragment
tools:layout="@layout/fragment_emv_input_pin"
@ -1177,4 +1183,6 @@
android:id="@+id/action_QRRefundProcessFragment_to_nav_main"
app:destination="@id/nav_main" />
</fragment>
</navigation>

View File

@ -64,5 +64,4 @@
<dimen name="button_height">48dp</dimen>
<dimen name="button_corner_radius">12dp</dimen>
<dimen name="fab_size">56dp</dimen>
<dimen name="text_margin">16dp</dimen>
</resources>

View File

@ -443,7 +443,7 @@
<string name="txt_disconnect">Disconnect</string>
<string name="txt_sending_third_reversal">Trying reversal last time!</string>
<string name="txt_trans_voided">Transaction Voided</string>
<!-- <string name="txt_void_not_found">Void Failed,01- No Transaction Details Found</string>-->
<!-- <string name="txt_void_not_found">Void Failed,01- No Transaction Details Found</string>-->
<string name="txt_void_not_found">Void Failed 914-ORIGINAL TRANSACTION NOT FOUND</string>
<string name="txt_qr_generate_failed">QR Generation Failed!</string>
<string name="txt_qr_auth_failed">Auth Failed!</string>
@ -594,7 +594,5 @@
<item>PhaYaSa</item>
<item>YaTaNa</item>
</string-array>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
</resources>

View File

@ -564,6 +564,8 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
mHandler.obtainMessage(PIN_TIME_OUT,-7009).sendToTarget();
} else if (retCode == SdkResult.PinPad_No_Pin_Input) {
mHandler.obtainMessage(PIN_CLICK_CONFIRM).sendToTarget();
} else {
mHandler.obtainMessage(PIN_ERROR).sendToTarget();
}
LogUtil.d(TAG, "RetCode:" + retCode);
@ -631,24 +633,6 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
++pinEnterCount;
}
private void keyMap(String str, PinPadDataV2 data) {
data.keyMap = new byte[64];
for (int i = 0, j = 0; i < 15; i++, j++) {
if (i == 9 || i == 12) { // || i == 12
data.keyMap[i] = 0x1B;//cancel
j--;
} else if (i == 13) { //10
data.keyMap[i] = 0x0C;//clear
j--;
} else if (i == 11 || i == 14) { // || i == 14
data.keyMap[i] = 0x0D;//confirm
j--;
} else {
data.keyMap[i] = (byte) str.charAt(j);
}
}
}
private OnEmvProcessListener2 emvProcessListener = new OnEmvProcessListener2() {
@Override

View File

@ -12,9 +12,6 @@ coreKtx = "1.17.0"
hilt = "2.51.1"
androidx-hilt = "1.2.0"
nav = "2.5.0"
legacySupportV4 = "1.0.0"
lifecycleLivedataKtx = "2.9.4"
lifecycleViewmodelKtx = "2.9.4"
[libraries]
junit = { group = "junit", name = "junit", version.ref = "junit" }
@ -28,9 +25,6 @@ core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx"
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" }
androidx-hilt-compiler = { group = "androidx.hilt", name = "hilt-compiler", version.ref = "androidx-hilt" }
androidx-legacy-support-v4 = { group = "androidx.legacy", name = "legacy-support-v4", version.ref = "legacySupportV4" }
androidx-lifecycle-livedata-ktx = { group = "androidx.lifecycle", name = "lifecycle-livedata-ktx", version.ref = "lifecycleLivedataKtx" }
androidx-lifecycle-viewmodel-ktx = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycleViewmodelKtx" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }

View File

@ -17,7 +17,8 @@ public abstract class BaseISOMsgX {
byte[] newSendBytes = EncodePackage.assembly(map, msgIdentifier, 0, "0000000000",hostName);
String BPCTPDU = "6005150000";
// String BPCTPDU = "6005150000"; //UAT
String BPCTPDU = "6005170000"; //PrePro
if(isoMode == ISOMode.BOTH_HEADER_TPDU) {
byte[] outBytes = new byte[newSendBytes.length - 6 ];

View File

@ -12,16 +12,17 @@ import com.utsmyanmar.paylibs.model.MAGCardInfo;
import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.utils.CardSchemeUtils;
import com.utsmyanmar.paylibs.utils.LogUtil;
import com.utsmyanmar.paylibs.utils.TLV;
import com.utsmyanmar.paylibs.utils.enums.CardScheme;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;
import com.utsmyanmar.paylibs.utils.LogUtil;
public class KernelDataProcessUtil {
@ -32,7 +33,7 @@ public class KernelDataProcessUtil {
Map<String, TLV> tlvMap = TLVUtil.buildTLVMap(data);
com.sunmi.pay.hardware.aidl.bean.CardInfo cardInfo = new com.sunmi.pay.hardware.aidl.bean.CardInfo();
LogUtil.d(TAG,"EMV Track data : "+ByteUtil.bytes2HexStr(data));
LogUtil.d(TAG, "EMV Track data : " + ByteUtil.bytes2HexStr(data));
// Two magnetic
TLV tlv = tlvMap.get("57");
@ -40,10 +41,10 @@ public class KernelDataProcessUtil {
String value = tlv.getValue().toUpperCase();
cardInfo = Track2Util.parseTrack2(value);
// cardInfo.track2=value;
LogUtil.d(TAG,"57 track:"+value);
LogUtil.d(TAG, "57 track:" + value);
cardInfo.track2 = value.replaceAll("F", ""); // Edited "0" with "" 20,Nov,2024
LogUtil.d(TAG,"57 track:"+cardInfo.track2);
LogUtil.d(TAG, "57 track:" + cardInfo.track2);
}
// IC card obtains the card number and expiration date through 5A and 5F24
if (AidlConstants.CardType.IC.getValue() == cardType) {
@ -67,7 +68,6 @@ public class KernelDataProcessUtil {
}
LogUtil.d(Constant.TAG, "The card is valid for" + value);
}
}
// Card serial number
@ -94,7 +94,7 @@ public class KernelDataProcessUtil {
cardInfo = Track2Util.parseTrack2(value);
cardInfo.track2 = value.replaceAll("F", "0"); // edited " " with "0"
LogUtil.d(TAG,"9F6B track:"+cardInfo.track2);
LogUtil.d(TAG, "9F6B track:" + cardInfo.track2);
}
cardInfo.cardType = cardType;
@ -125,7 +125,11 @@ public class KernelDataProcessUtil {
if (track2 != null && track2.length() > 0) {
magCardInfo.setTrack2(track2);
String track2Encrypt = TrackEncrypt.trackEncrypt(track2);
track2Encrypt = track2Encrypt.replace("=","D");
// /*
// * comment this line cuz mastercard network validation is getting failure
// * */
track2Encrypt = track2Encrypt.replace("=", "D");
magCardInfo.setTrack2Cipher(track2Encrypt);
}
@ -231,7 +235,7 @@ public class KernelDataProcessUtil {
// if(value.equals("554E494F4E504159204445424954")){
// payDetail.setCardHolderName("UNIONPAY");
// }else{
LogUtil.d(TAG,"App Label 50 : "+Utils.hexStr2AsciiStr(value));
LogUtil.d(TAG, "App Label 50 : " + Utils.hexStr2AsciiStr(value));
icCardInfo.setAppLabel(Utils.hexStr2AsciiStr(value));
payDetail.setAppLabel(Utils.hexStr2AsciiStr(value));
@ -246,7 +250,7 @@ public class KernelDataProcessUtil {
String value = tlv.getValue();
icCardInfo.setAppName(value);
payDetail.setAppName(value);
LogUtil.d(TAG,"App Name : "+value);
LogUtil.d(TAG, "App Name : " + value);
}
// TVR Terminal verification result
@ -530,14 +534,22 @@ public class KernelDataProcessUtil {
// Cardholder verification method result CVM
if (tlvMap.get("9F34") != null) {
f55DataStr += "9F3403" + tlvMap.get("9F34").getValue();
if(tlvMap.get("9F34").getValue() != null && !tlvMap.get("9F34").getValue().isEmpty()) {
if (tlvMap.get("9F34").getValue() != null && !tlvMap.get("9F34").getValue().isEmpty()) {
f55WaveDataStr += "9F3403" + tlvMap.get("9F34").getValue();
}
// f55WaveDataStr += "9F3403020200" ;
}
// f55DataStr += "9F34031F0302";
// TSI Transaction status information
if (tlvMap.get("9B") != null && !tlvMap.get("9B").getValue().isEmpty()) {
f55DataStr += "9B02" + tlvMap.get("9B").getValue();
f55WaveDataStr += "9B02" + tlvMap.get("9B").getValue();
}
// terminal type
if (tlvMap.get("9F35") != null) {
f55DataStr += "9F3501" + tlvMap.get("9F35").getValue();
@ -563,8 +575,8 @@ public class KernelDataProcessUtil {
// need to keeps or not?
if (tlvMap.get("9F41") != null) {
int length = tlvMap.get("9F41").getLength();
f55DataStr += "9F41" + String.format("%02d", length-1) + tlvMap.get("9F41").getValue().substring(2,8);
f55WaveDataStr += "9F41" + String.format("%02d", length-1) + tlvMap.get("9F41").getValue().substring(2,8);
f55DataStr += "9F41" + String.format("%02d", length - 1) + tlvMap.get("9F41").getValue().substring(2, 8);
f55WaveDataStr += "9F41" + String.format("%02d", length - 1) + tlvMap.get("9F41").getValue().substring(2, 8);
} else {
String batchNumStart = SystemParamsOperation.getInstance().getSystemParamsSettings().getBatchNumStart();
try {
@ -576,29 +588,15 @@ public class KernelDataProcessUtil {
}
}
/* if (tlvMap.get("4F") != null) {
tlv = tlvMap.get("4F");
String value = tlv.getValue();
int length = tlv.getLength();
String len = getHexLen(length);
f55DataStr += "4F" + len + value;
}
if (tlvMap.get("9F08") != null) {
tlv = tlvMap.get("9F08");
String value = tlv.getValue();
int length = tlv.getLength();
String len = getHexLen(length);
f55DataStr += "9F08" + len + value;
}*/
/*
* merchant category code
* */
// disabled at 18/ July 2025
// if(tlvMap.get("9F53") !=null){
// f55DataStr += "9F5301"+ tlvMap.get("9F53").getValue();
// }
if (tlvMap.get("9F53") != null) {
f55DataStr += "9F5301" + tlvMap.get("9F53").getValue();
} else {
f55DataStr += "9F530150";
}
// else{
//// f55DataStr += "9F530152";
@ -659,53 +657,62 @@ public class KernelDataProcessUtil {
if (cardType == AidlConstants.CardType.IC.getValue()) {
icCardInfo.setICC55(f55DataStr);
payDetail.setICC55(f55DataStr);
LogUtil.d(TAG,"DE55 IC: "+f55DataStr);
LogUtil.d(TAG, "DE55 IC: " + f55DataStr);
} else {
String[] tagList = {
"9F6E"
};
String hexStr = "";
byte[] dataOut = new byte[1024];
try {
int len = PayLibsUtils.getInstance().emvOptV2.getTlvList(AidlConstantsV2.EMV.TLVOpCode.OP_PAYWAVE, tagList, dataOut);
if (len > 0) {
byte[] dataOutBytes = Arrays.copyOf(dataOut, len);
hexStr = ByteUtil.bytes2HexStr(dataOutBytes);
LogUtil.d(TAG, "get 9F6E Data :" + hexStr);
Map<String, TLV> map = TLVUtil.buildTLVMap(hexStr);
LogUtil.d(TAG, "get 9F6E Data :" + map);
} else {
LogUtil.e(TAG, "Get the data length of payWave is negative = " + len);
}
} catch (Exception e) {
e.printStackTrace();
if (tlvMap.get("9F6E") != null) {
int length = tlvMap.get("9F6E").getLength();
String len = getHexLen(length);
f55WaveDataStr += "9F6E" + len + tlvMap.get("9F6E").getValue();
}
if (hexStr.equals("9F6E00")) {
try {
int len = PayLibsUtils.getInstance().emvOptV2.getTlvList(AidlConstantsV2.EMV.TLVOpCode.OP_PAYPASS, tagList, dataOut);
if (len > 0) {
byte[] dataOutBytes = Arrays.copyOf(dataOut, len);
hexStr = ByteUtil.bytes2HexStr(dataOutBytes);
LogUtil.d(TAG, "get 9F6E Data :" + hexStr);
Map<String, TLV> map = TLVUtil.buildTLVMap(hexStr);
LogUtil.d(TAG, "get 9F6E Data :" + map);
} else {
LogUtil.e(TAG, "Get the data length of payPass is negative = " + len);
}
} catch (Exception e) {
e.printStackTrace();
}
}
if(!hexStr.equals("9F6E00")) {
f55WaveDataStr += hexStr;
}
LogUtil.d(TAG,"9F6E data :"+hexStr);
// byte[] dataOut = new byte[1024];
//
// try {
// int len = PayLibsUtils.getInstance().emvOptV2.getTlvList(AidlConstantsV2.EMV.TLVOpCode.OP_PAYWAVE, tagList, dataOut);
// if (len > 0) {
// byte[] dataOutBytes = Arrays.copyOf(dataOut, len);
// hexStr = ByteUtil.bytes2HexStr(dataOutBytes);
// LogUtil.d(TAG, "get 9F6E Data :" + hexStr);
// Map<String, TLV> map = TLVUtil.buildTLVMap(hexStr);
// LogUtil.d(TAG, "get 9F6E Data :" + map);
//
// } else {
// LogUtil.e(TAG, "Get the data length of payWave is negative = " + len);
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// if (hexStr.equals("9F6E00")) {
// try {
// int len = PayLibsUtils.getInstance().emvOptV2.getTlvList(AidlConstantsV2.EMV.TLVOpCode.OP_PAYPASS, tagList, dataOut);
// if (len > 0) {
// byte[] dataOutBytes = Arrays.copyOf(dataOut, len);
// hexStr = ByteUtil.bytes2HexStr(dataOutBytes);
// LogUtil.d(TAG, "get 9F6E Data :" + hexStr);
// Map<String, TLV> map = TLVUtil.buildTLVMap(hexStr);
// LogUtil.d(TAG, "get 9F6E Data :" + map);
//
// } else {
// LogUtil.e(TAG, "Get the data length of payPass is negative = " + len);
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
// if (!hexStr.equals("9F6E00")) {
// f55WaveDataStr += hexStr;
// }
icCardInfo.setICC55(f55WaveDataStr);
payDetail.setICC55(f55WaveDataStr);
LogUtil.d(TAG,"DE55 kpay: "+f55WaveDataStr);
LogUtil.d(TAG, "DE55 wave: " + f55WaveDataStr);
}

View File

@ -395,9 +395,9 @@ public class SystemParamsOperation {
saveSystemParamsSettings(params);
}
public void setWavePayInquiryStatus(boolean status) {
public void setQRPayInquiryStatus(boolean status) {
SystemParamsSettings params = getSystemParamsSettings();
params.setWavePayInquiryStatus(status);
params.setQRPayInquiryStatus(status);
saveSystemParamsSettings(params);
}
@ -423,9 +423,9 @@ public class SystemParamsOperation {
saveSystemParamsSettings(params);
}
public boolean getWavePayInquiryStatus() {
public boolean getQRPayInquiryStatus() {
SystemParamsSettings params = getSystemParamsSettings();
return params.getWavePayInquiryStatus();
return params.getQRPayInquiryStatus();
}
public void setNfcEnabled(boolean status) {
@ -478,9 +478,9 @@ public class SystemParamsOperation {
return params.isFallbackEnabled();
}
public void setWavePayStatus(boolean status) {
public void setQRPayStatus(boolean status) {
SystemParamsSettings params = getSystemParamsSettings();
params.setWavePayStatus(status);
params.setQRPayStatus(status);
saveSystemParamsSettings(params);
}
@ -494,9 +494,9 @@ public class SystemParamsOperation {
SystemParamsSettings params = getSystemParamsSettings();
return params.isDecimal_enable();
}
public boolean getWavePayStatus() {
public boolean getQRPayStatus() {
SystemParamsSettings params = getSystemParamsSettings();
return params.getWavePayStatus();
return params.getQRPayStatus();
}
public boolean getTipsAdjustmentStatus() {
@ -701,6 +701,28 @@ public class SystemParamsOperation {
return params.isEmvEnabled();
}
public String getAppId() {
SystemParamsSettings params = getSystemParamsSettings();
return params.getAppId();
}
public void setAppId(String appId) {
SystemParamsSettings params = getSystemParamsSettings();
params.setAppId(appId);
saveSystemParamsSettings(params);
}
public String getAppKey() {
SystemParamsSettings params = getSystemParamsSettings();
return params.getAppKey();
}
public void setAppKey(String appKey) {
SystemParamsSettings params = getSystemParamsSettings();
params.setAppKey(appKey);
saveSystemParamsSettings(params);
}
public String getComp1(){
SystemParamsSettings params = getSystemParamsSettings();
return params.getComp1();

View File

@ -129,6 +129,10 @@ public class SystemParamsSettings implements Serializable {
private String lastSuccessTranx = "000001";
private String appId = "";
private String appKey = "";
private int fallbackCounter = 2;
private long jCbCVMLimit = 75000;
@ -177,7 +181,7 @@ public class SystemParamsSettings implements Serializable {
private boolean cvv_bypass_status = false;
private boolean wave_pay_inquiry_status = true;
private boolean qrpay_inquiry_status = true;
private boolean tips_adjustment_status = true;
@ -187,7 +191,7 @@ public class SystemParamsSettings implements Serializable {
private boolean refund_status = true;
private boolean wave_status = true;
private boolean qrpay_status = true;
private boolean full_void_preauth_status = true;
@ -285,6 +289,22 @@ public class SystemParamsSettings implements Serializable {
this.disabledMessage = disabledMessage;
}
public void setAppId(String appId) {
this.appId = appId;
}
public void setAppKey(String appKey) {
this.appKey = appKey;
}
public String getAppId() {
return appId;
}
public String getAppKey() {
return appKey;
}
protected void setjCbCVMLimit(long amount) {
this.jCbCVMLimit = amount;
}
@ -369,8 +389,8 @@ public class SystemParamsSettings implements Serializable {
return ecrKey;
}
protected void setWavePayInquiryStatus(boolean status) {
this.wave_pay_inquiry_status = status;
protected void setQRPayInquiryStatus(boolean status) {
this.qrpay_inquiry_status = status;
}
protected String getTerminalCapability() { return terminalCapability;}
@ -403,11 +423,11 @@ public class SystemParamsSettings implements Serializable {
protected void setRandomPinPad(boolean randomPinPad) { this.isRandomPinPad = randomPinPad;}
protected boolean isRandomPinPad() { return isRandomPinPad; }
protected void setWavePayStatus(boolean status) {
this.wave_status = status;
protected void setQRPayStatus(boolean status) {
this.qrpay_status = status;
}
protected boolean getWavePayStatus() { return wave_status; }
protected boolean getQRPayStatus() { return qrpay_status; }
protected boolean isAutoPrintCustomerCopy() {
return isAutoPrintCustomerCopy;
@ -415,8 +435,8 @@ public class SystemParamsSettings implements Serializable {
protected void setAutoPrintCustomerCopy(boolean flag) { this.isAutoPrintCustomerCopy = flag; }
protected boolean getWavePayInquiryStatus() {
return wave_pay_inquiry_status;
protected boolean getQRPayInquiryStatus() {
return qrpay_inquiry_status;
}
protected void setTipsAdjustmentStatus(boolean status) {

View File

@ -24,7 +24,8 @@ public class BitmapConfig {
public static final String FUND_TRANSFER = "7024048020801080";
public static final String CASH_ADVANCE = "7024048020801000";
// public static final String CASH_ADVANCE = "7024048020801000";
public static final String CASH_ADVANCE = "7020048020801000"; // removed DE 14
// 7020048000808000
public static final String SIGN_ON = "2020000000800000";
@ -58,7 +59,8 @@ public class BitmapConfig {
// public static final String BPC_SALE = "3230058020C09000"; // original
// public static final String BPC_SALE = "3230058020C09A00"; // for emv
// public static final String BPC_SALE = "7234058020C19A00"; // DUKPT
public static final String BPC_SALE = "7234058020C19200"; // TMK
// public static final String BPC_SALE = "7234058020C19200"; // TMK
public static final String BPC_SALE = "7230058020C19200"; // TMK no DE 14
// public static final String BPC_SALE = "7230058020C19A00"; // also for manual
// public static final String BPC_SALE = "7230058020C09A00"; // also for manual , also added DE48
@ -88,19 +90,22 @@ public class BitmapConfig {
// commented on Nov 13,2024
// public static final String BPC_PRE_AUTH_SALE = "3230058020C09800";
// public static final String BPC_PRE_AUTH_SALE = "3230058020C09A00";
public static final String BPC_PRE_AUTH_SALE = "7230058020C09A00"; // for manual
// public static final String BPC_PRE_AUTH_SALE = "7230058020C09A00"; // for manual
public static final String BPC_PRE_AUTH_SALE = "7230058020C09200"; // for tmk
// public static final String BPC_PRE_AUTH_SALE_COMPLETE = "7230058028C09000";
// public static final String BPC_PRE_AUTH_SALE_COMPLETE = "3230058020C09000";
// commented on Nov 13, 2024
// public static final String BPC_PRE_AUTH_SALE_COMPLETE = "3230058028C09800";
public static final String BPC_PRE_AUTH_SALE_COMPLETE = "3230058028C09A00";
// public static final String BPC_PRE_AUTH_SALE_COMPLETE = "3230058028C09A00";
public static final String BPC_PRE_AUTH_SALE_COMPLETE = "3230058028C09200"; // for tmk
// public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "7230058028C09000";
// commented on Nov 13,2024
public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "7230058028C19800"; // added DE 2
// public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "7230058028C19800"; // added DE 2
public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "7234058008C09000"; // for tmk MPU
// public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "3230058028C19800";
// public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "3230058028C19A00"; //DE55
//
@ -122,7 +127,8 @@ public class BitmapConfig {
public static final String BPC_TIP_ADJUSTMENTS = "723005802CC08000";
// public static final String BPC_BATCH_UPLOAD = "7234058028C09000";
public static final String BPC_BATCH_UPLOAD = "3234058028C08000";
// public static final String BPC_BATCH_UPLOAD = "3234058028C08000";
public static final String BPC_BATCH_UPLOAD = "3230058028C08000"; //removed de 14
public static final String BPC_NETWORK_CUT_OVER = "2220010000C00000";

View File

@ -3,7 +3,7 @@ package com.utsmyanmar.paylibs.utils.iso_utils;
public enum TransactionsType {
SALE("SALE",1,"000000"),
VOID("VOID SALE",2,"200000"), //020000
VOID("VOID SALE",2,"020000"), //200000
SETTLEMENT("SETTLEMENT",3,"920000"),
@ -11,7 +11,7 @@ public enum TransactionsType {
PRE_AUTH_SALE("PRE-AUTH",5,"930000"),
PRE_AUTH_VOID("PREAUTH CANCELLATION",6,"200000"),
PRE_AUTH_VOID("PREAUTH CANCELLATION",6,"020000"), //200000
PRE_AUTH_COMPLETE("PREAUTH COMPLETION",7,"940000"),