Merge branch 'duel_settlement' into ESignature

This commit is contained in:
moon 2026-06-15 22:30:34 +06:30
commit bd90bc4a31
8 changed files with 89 additions and 96 deletions

2
.gitignore vendored
View File

@ -21,3 +21,5 @@ local.properties
/.idea /.idea
/app/prod/release /app/prod/release
nexdlkey-lib/build/ nexdlkey-lib/build/
/nexsdk-lib
/nexsdk-lib

View File

@ -58,15 +58,12 @@ import com.utsmm.kbz.ui.navigation.NaviMainFragment;
import com.utsmm.kbz.ui.navigation.NaviSetupFragment; import com.utsmm.kbz.ui.navigation.NaviSetupFragment;
import com.utsmm.kbz.util.ecr.CoreUtils; import com.utsmm.kbz.util.ecr.CoreUtils;
import com.utsmm.kbz.util.tms.TMSUtil; import com.utsmm.kbz.util.tms.TMSUtil;
import java.util.Calendar; import java.util.Calendar;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.inject.Inject; import javax.inject.Inject;
import dagger.hilt.android.AndroidEntryPoint; import dagger.hilt.android.AndroidEntryPoint;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Observable;
@ -76,7 +73,6 @@ import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers; import io.reactivex.rxjava3.schedulers.Schedulers;
import com.utsmyanmar.paylibs.utils.LogUtil; import com.utsmyanmar.paylibs.utils.LogUtil;
import com.utsmyanmar.paylibs.utils.params.Params; import com.utsmyanmar.paylibs.utils.params.Params;
/** /**
* Main Activity handling application navigation and fragment interactions * Main Activity handling application navigation and fragment interactions
*/ */
@ -165,7 +161,7 @@ public class MainActivity extends AppCompatActivity implements
// SystemParamsOperation.getInstance().setTmsAddress("https://api-tms-uat.kbzbank.com:8443/sirius"); // SystemParamsOperation.getInstance().setTmsAddress("https://api-tms-uat.kbzbank.com:8443/sirius");
// SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms-uat.kbzbank.com:8443/receipt"); // SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms-uat.kbzbank.com:8443/receipt");
SystemParamsOperation.getInstance().setTmsAddress("https://sirius-nest.utsmyanmar.com/api/v1"); SystemParamsOperation.getInstance().setTmsAddress("https://sirius-nest.utsmyanmar.com/api/v1");
SystemParamsOperation.getInstance().setEReceiptAddress("https://receipt-nest.utsmyanmar.com/api/v1"); SystemParamsOperation.getInstance().setEReceiptAddress("https://receipt-nest.utsmyanmar.com");
PinPad pinPad = MyApplication.getInstance().deviceEngine.getPinPad(); PinPad pinPad = MyApplication.getInstance().deviceEngine.getPinPad();
byte[] encryptedPIK = SystemParamsOperation.getInstance().getPIK(); byte[] encryptedPIK = SystemParamsOperation.getInstance().getPIK();
@ -480,6 +476,11 @@ public class MainActivity extends AppCompatActivity implements
boolean hasPOS = intent.getBooleanExtra("AUTO_SETTLEMENT", false); boolean hasPOS = intent.getBooleanExtra("AUTO_SETTLEMENT", false);
boolean hasQR = intent.getBooleanExtra("AUTO_QR_SETTLEMENT", false); boolean hasQR = intent.getBooleanExtra("AUTO_QR_SETTLEMENT", false);
if (!hasPOS && !hasQR) return;
// Clear immediately so onResume won't re-trigger on next wake
intent.removeExtra("AUTO_SETTLEMENT");
intent.removeExtra("AUTO_QR_SETTLEMENT");
if (hasPOS) { if (hasPOS) {
PayDetail payDetail = (PayDetail) intent.getSerializableExtra("EXTRA_PAY_DETAIL"); PayDetail payDetail = (PayDetail) intent.getSerializableExtra("EXTRA_PAY_DETAIL");
if (payDetail != null) { if (payDetail != null) {

View File

@ -129,12 +129,49 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
} }
} }
private void updateManualEntryVisibility() {
TransactionsType type = sharedViewModel.transactionsType.getValue();
boolean manualEntryStatus = SystemParamsOperation.getInstance().getManualEntryStatus();
boolean preAuthManualEntryStatus = SystemParamsOperation.getInstance().getPreAuthManualEnabled();
boolean preAuthCompManualEntryStatus = SystemParamsOperation.getInstance().getPreAuthCompleteManualEnabled();
boolean preAuthCancelManualEntryStatus = SystemParamsOperation.getInstance().getPreAuthVoidManualEnabled();
boolean show;
if (type == null) {
show = manualEntryStatus;
} else {
switch (type) {
case SALE:
case CASH_OUT:
case CASH_DEPOSIT:
case REFUND:
case VOID:
show = manualEntryStatus;
break;
case PRE_AUTH_SALE:
show = preAuthManualEntryStatus;
break;
case PRE_AUTH_VOID:
show = preAuthCancelManualEntryStatus;
break;
case PRE_AUTH_COMPLETE:
show = preAuthCompManualEntryStatus;
break;
default:
show = false;
break;
}
}
sharedViewModel.setManualEntryStatus(show);
}
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
resetUI(); resetUI();
updateManualEntryVisibility();
setToolBarTitleWithBackIcon(getResourceString(R.string.txt_title_card_capture)); setToolBarTitleWithBackIcon(getResourceString(R.string.txt_title_card_capture));
delayFunctionCall(()-> { delayFunctionCall(()-> {

View File

@ -170,36 +170,6 @@ public class ProcessingCardFragment extends DataBindingFragment {
transProcessViewModel.setTradeData(tradeData); transProcessViewModel.setTradeData(tradeData);
pinPadViewModel.setTradeData(tradeData); pinPadViewModel.setTradeData(tradeData);
if(sharedViewModel.getTransactionsType().getValue() == TransactionsType.PRE_AUTH_VOID && SystemParamsOperation.getInstance().getPreAuthVoidManualEnabled() ) {
sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_alert_pre_auth_cancel));
routeId = R.id.action_processingCardFragment_to_errorFragment;
safeNavigateToRouteId();
return;
}
if(sharedViewModel.getTransactionsType().getValue() == TransactionsType.PRE_AUTH_SALE && SystemParamsOperation.getInstance().getPreAuthManualEnabled()) {
sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_alert_pre_auth_cancel));
routeId = R.id.action_processingCardFragment_to_errorFragment;
safeNavigateToRouteId();
return;
}
if(sharedViewModel.getTransactionsType().getValue() == TransactionsType.PRE_AUTH_COMPLETE && SystemParamsOperation.getInstance().getPreAuthCompleteManualEnabled()) {
sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_alert_pre_auth_cancel));
routeId = R.id.action_processingCardFragment_to_errorFragment;
safeNavigateToRouteId();
return;
}
// else if(sharedViewModel.transactionsType.getValue() == TransactionsType.REFUND) {
// sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_card_not_supported));
// routeId = R.id.action_processingCardFragment_to_errorFragment;
//
// }
sharedViewModel.setCardDataExist(true); sharedViewModel.setCardDataExist(true);
if(sharedViewModel.getTransMenu().getValue() != TransMenu.PRE_AUTH_FULL_VOID if(sharedViewModel.getTransMenu().getValue() != TransMenu.PRE_AUTH_FULL_VOID
@ -259,32 +229,6 @@ public class ProcessingCardFragment extends DataBindingFragment {
transProcessViewModel.setTradeData(tradeData); transProcessViewModel.setTradeData(tradeData);
} }
if(sharedViewModel.getTransactionsType().getValue() == TransactionsType.PRE_AUTH_VOID && SystemParamsOperation.getInstance().getPreAuthVoidManualEnabled() ) {
sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_alert_pre_auth_cancel));
routeId = R.id.action_processingCardFragment_to_errorFragment;
}
if(sharedViewModel.getTransactionsType().getValue() == TransactionsType.PRE_AUTH_SALE && SystemParamsOperation.getInstance().getPreAuthManualEnabled()) {
sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_alert_pre_auth_cancel));
routeId = R.id.action_processingCardFragment_to_errorFragment;
}
if(sharedViewModel.getTransactionsType().getValue() == TransactionsType.PRE_AUTH_COMPLETE && SystemParamsOperation.getInstance().getPreAuthCompleteManualEnabled()) {
sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_alert_pre_auth_cancel));
routeId = R.id.action_processingCardFragment_to_errorFragment;
}
// else if(sharedViewModel.transactionsType.getValue() == TransactionsType.REFUND) {
// routeId = R.id.action_processingCardFragment_to_errorFragment;
// }
sharedViewModel.setCardDataExist(true); sharedViewModel.setCardDataExist(true);
if(sharedViewModel.getTransMenu().getValue() != TransMenu.PRE_AUTH_FULL_VOID && sharedViewModel.getAmountExist().getValue() != null && !sharedViewModel.getAmountExist().getValue()) { if(sharedViewModel.getTransMenu().getValue() != TransMenu.PRE_AUTH_FULL_VOID && sharedViewModel.getAmountExist().getValue() != null && !sharedViewModel.getAmountExist().getValue()) {
@ -313,34 +257,6 @@ public class ProcessingCardFragment extends DataBindingFragment {
prepareEmvTransaction(); prepareEmvTransaction();
if(sharedViewModel.getTransactionsType().getValue() == TransactionsType.PRE_AUTH_VOID && SystemParamsOperation.getInstance().getPreAuthVoidManualEnabled() ) {
sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_alert_pre_auth_cancel));
routeId = R.id.action_processingCardFragment_to_errorFragment;
safeNavigateToRouteId();
return;
}
if(sharedViewModel.getTransactionsType().getValue() == TransactionsType.PRE_AUTH_SALE && SystemParamsOperation.getInstance().getPreAuthManualEnabled()) {
sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_alert_pre_auth_cancel));
routeId = R.id.action_processingCardFragment_to_errorFragment;
safeNavigateToRouteId();
return;
}
if(sharedViewModel.getTransactionsType().getValue() == TransactionsType.PRE_AUTH_COMPLETE && SystemParamsOperation.getInstance().getPreAuthCompleteManualEnabled()) {
sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_alert_pre_auth_cancel));
routeId = R.id.action_processingCardFragment_to_errorFragment;
safeNavigateToRouteId();
return;
}
routeId = R.id.action_processingCardFragment_to_emvTransactionFragment; routeId = R.id.action_processingCardFragment_to_emvTransactionFragment;
} else { } else {

View File

@ -290,6 +290,7 @@
<!-- Manual Entry minimalist outlined button --> <!-- Manual Entry minimalist outlined button -->
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:id="@+id/manualEntryCard" android:id="@+id/manualEntryCard"
android:visibility="@{(sharedVM.ManualEntryStatus ?? false) ? View.VISIBLE : View.GONE}"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="44dp" android:layout_height="44dp"
android:layout_marginStart="32dp" android:layout_marginStart="32dp"

View File

@ -298,7 +298,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
LogUtil.d(TAG, "TransData :" + transData.getTransAmount()); LogUtil.d(TAG, "TransData :" + transData.getTransAmount());
LogUtil.d(TAG, "start emv "); LogUtil.d(TAG, "start emv ");
emvHandler.emvDebugLog(true); emvHandler.emvDebugLog(false);
emvHandler.emvProcess(transData, emvProcessListener); emvHandler.emvProcess(transData, emvProcessListener);
@ -1039,7 +1039,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
"9F2A", "9F26", "9F27", "9F10", "9F37", "9F36", "95", "9A", "9C", "9F02", "5F2A", "5F34", "82", "9F1A", //field 55 tag "9F2A", "9F26", "9F27", "9F10", "9F37", "9F36", "95", "9A", "9C", "9F02", "5F2A", "5F34", "82", "9F1A", //field 55 tag
"9F03", "9F33", "4F", "9F08", "9F34", "9F35", "9F1E", "9F52","9F53", "84", "9F09", "9F41", //field55 tag "9F03", "9F33", "4F", "9F08", "9F34", "9F35", "9F1E", "9F52","9F53", "84", "9F09", "9F41", //field55 tag
"9F5B", "8A", "9B", "9F6E", "9F7C", "9F4C", "50", "9F12", "DF01", "9F63", "5F20", "9F0B", "9F42", "9F5B", "8A", "9B", "9F6E", "9F7C", "9F4C", "50", "9F12", "DF01", "9F63", "5F20", "9F0B", "9F42",
"FF31", "9F7B", "8E","9F15", "9F01", "9F1B" "FF31", "9F7B", "8E","9F15", "9F01", "9F1B", "9F09"
}; };
try { try {
@ -1431,7 +1431,14 @@ private void configJcbContactlessParameter() {
// emvHandler.setTlv(ByteUtils.hexString2ByteArray("DF8161"), ByteUtils.hexString2ByteArray("7F00")); // emvHandler.setTlv(ByteUtils.hexString2ByteArray("DF8161"), ByteUtils.hexString2ByteArray("7F00"));
byte[] tag9F53 = emvHandler.getJcbContactlessTIP(); byte[] tag9F53 = emvHandler.getJcbContactlessTIP();
Log.d("nexgo", "getJcbContactlessTIP: tag9F53->:" + ByteUtils.byteArray2HexString(tag9F53)); Log.d("nexgo", "getJcbContactlessTIP: tag9F53->:" + ByteUtils.byteArray2HexString(tag9F53));
// if (tag9F53 != null) {
// tag9F53[1] &= 0x7F; //disable issuer update
// emvHandler.setJcbContactlessTIP(tag9F53);
// Log.d("nexgo", "tag9F53->:" + ByteUtils.byteArray2HexString(tag9F53));
//
// }
if (tag9F53 != null) { if (tag9F53 != null) {
tag9F53[0] &= 0x73; //enable online pin
tag9F53[1] &= 0x7F; //disable issuer update tag9F53[1] &= 0x7F; //disable issuer update
emvHandler.setJcbContactlessTIP(tag9F53); emvHandler.setJcbContactlessTIP(tag9F53);
Log.d("nexgo", "tag9F53->:" + ByteUtils.byteArray2HexString(tag9F53)); Log.d("nexgo", "tag9F53->:" + ByteUtils.byteArray2HexString(tag9F53));

View File

@ -55,7 +55,27 @@ public class AuthorizationProcessUtil {
if(field39.getDataStr().equals("000")){ if(field39.getDataStr().equals("000")){
emvOnlineResult.setRejCode("00"); emvOnlineResult.setRejCode("00");
}else{ }else{
// emvOnlineResult.setRejCode(field39.getDataStr());
switch (field39.getDataStr()) {
case "103":
emvOnlineResult.setRejCode("01");
break;
case "100":
emvOnlineResult.setRejCode("05");
break;
case "117":
emvOnlineResult.setRejCode("55");
break;
case "209":
emvOnlineResult.setRejCode("04");
break;
case "104":
emvOnlineResult.setRejCode("62");
break;
default:
emvOnlineResult.setRejCode(field39.getDataStr()); emvOnlineResult.setRejCode(field39.getDataStr());
break;
}
} }
} }
@ -165,15 +185,24 @@ public class AuthorizationProcessUtil {
importOnlineProcessStatus(SdkResult.Success,emvOnlineResult); importOnlineProcessStatus(SdkResult.Success,emvOnlineResult);
} else { } else {
equals = TextUtils.equals("3035", valueF039) || TextUtils.equals("3531", valueF039); // equals = TextUtils.equals("3035", valueF039) || TextUtils.equals("3531", valueF039);
// if (equals) {
// // Denial
// importOnlineProcessStatus(SdkResult.Fail,emvOnlineResult);
// } else {
// // Failed
// importOnlineProcessStatus(SdkResult.Fail,emvOnlineResult);
// }
equals = TextUtils.equals("3035", valueF039) || TextUtils.equals("3531", valueF039) || TextUtils.equals("313033", valueF039);
if (equals) { if (equals) {
// Denial // Denial
importOnlineProcessStatus(SdkResult.Fail,emvOnlineResult); importOnlineProcessStatus(SdkResult.Success,emvOnlineResult);
} else { } else {
// Failed // Failed
importOnlineProcessStatus(SdkResult.Fail,emvOnlineResult); importOnlineProcessStatus(SdkResult.Success,emvOnlineResult);
} }
} }
LogUtil.d(TAG,"Field 39 value:"+valueF039);
LogUtil.e(Constant.TAG, "status: " ); LogUtil.e(Constant.TAG, "status: " );
String scriptResult = ByteUtil.bytes2HexStr(outData); String scriptResult = ByteUtil.bytes2HexStr(outData);

View File

@ -45,7 +45,7 @@ public class SystemParamsSettings implements Serializable {
// private String tmsAddress = "https://api-tms-uat.kbzbank.com:8443/sirius"; // private String tmsAddress = "https://api-tms-uat.kbzbank.com:8443/sirius";
// private String ereceiptAddress = "https://api-tms-uat.kbzbank.com:8443/receipt"; // private String ereceiptAddress = "https://api-tms-uat.kbzbank.com:8443/receipt";
private String tmsAddress = "https://sirius-nest.utsmyanmar.com/api/v1"; private String tmsAddress = "https://sirius-nest.utsmyanmar.com/api/v1";
private String ereceiptAddress = "https://receipt-nest.utsmyanmar.com/api/v1"; private String ereceiptAddress = "https://receipt-nest.utsmyanmar.com";
private String binValues = ""; private String binValues = "";
private String restrictedBinValues = ""; private String restrictedBinValues = "";