QR Settlement is optimized and History was also resolved

This commit is contained in:
kizzy 2025-12-23 01:39:47 +07:00
parent ee037a1101
commit c96d68ff2f
11 changed files with 109 additions and 52 deletions

File diff suppressed because one or more lines are too long

View File

@ -22,6 +22,7 @@ import com.denzcoskun.imageslider.constants.ScaleTypes;
import com.denzcoskun.imageslider.models.SlideModel;
import com.pos.connection.bridge.binder.ECRConstant;
import com.utsmm.kbz.util.MockData;
import com.utsmyanmar.baselib.emv.EmvParamOperation;
import com.utsmyanmar.baselib.fragment.DataBindingFragment;
@ -35,6 +36,7 @@ import com.utsmyanmar.ecr.data.ResultOf;
import com.utsmyanmar.ecr.data.model.Transactions;
import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.print.PrintHelper;
import com.utsmyanmar.paylibs.print.printx.PrintXReceipt;
import com.utsmyanmar.paylibs.utils.POSUtil;
@ -75,6 +77,7 @@ import javax.inject.Inject;
import dagger.hilt.android.AndroidEntryPoint;
import com.utsmyanmar.paylibs.utils.LogUtil;
import com.utsmyanmar.paylibs.utils.params.Params;
@AndroidEntryPoint
public class MainFragment extends DataBindingFragment {
@ -123,9 +126,9 @@ public class MainFragment extends DataBindingFragment {
setNavBarIconWithTitle(getResourceString(R.string.menu_dashboard));
// logcat is resetting cuz of this setup , because it is using serial port
if(SystemParamsOperation.getInstance().getECRStatus()){
// if(SystemParamsOperation.getInstance().getECRStatus()){
// setUpECR();
}
// }
sharedViewModel.isEcrFinished.postValue(true);
sharedViewModel.isEcr.postValue(false);
@ -210,6 +213,8 @@ public class MainFragment extends DataBindingFragment {
}
sharedViewModel.setManualEntryStatus(SystemParamsOperation.getInstance().getManualEntryStatus());
// generateMockQR();
}
/*
@ -796,10 +801,10 @@ public class MainFragment extends DataBindingFragment {
}
// private void generateMockPreAuth() {
// String transDate = "01/03/24";
// String transTime = "12:27:30";
// TradeData tradeData = MockData.getInstance().generateMockDataWithTime(TransactionsType.PRE_AUTH_SALE, AidlConstantsV2.CardType.IC.getValue(),transDate,transTime);
// private void generateMockQR() {
// String transDate = "23/12/25";
// String transTime = "12:06:30";
// TradeData tradeData = MockData.getInstance().generateMockDataWithTime(TransactionsType.MMQR, 1,transDate,transTime);
// PayDetail payDetail = tradeData.getPayDetail();
// sharedViewModel.insertPayDetail(payDetail);
// LogUtil.d(TAG,"------------------- Inserted Mocked Data ------------------");

View File

@ -269,6 +269,8 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
cardReadViewModel.cardTypeData.postValue(cardType.value);
cardReadViewModel.setCardTransactionType(CardTransactionType.EMV);
}
// cardReadViewModel.cardTypeData.postValue(cardType.value);
// cardReadViewModel.setCardTransactionType(CardTransactionType.EMV);
}
delayFunctionCall(()->{
routeId = R.id.action_cardWaitingFragment_to_processingCardFragment;

View File

@ -163,17 +163,17 @@ public class TransactionResultFragment extends DataBindingFragment implements Da
TransactionsType transactionType = sharedViewModel.transactionsType.getValue();
if (isNonApprovedTrade(payDetail) && isNonWavepayTransaction(transactionType)) {
if (isNonApprovedTrade(payDetail) && isNonQRPayTransaction(transactionType)) {
startPrintProcess(false);
isCardInside();
} else if (transactionType == TransactionsType.SETTLEMENT || transactionType == TransactionsType.MMQR_SETTLEMENT) {
handleSettlementTransaction(siriusReq);
} else if (isWavePayNonSuccessTransaction(transactionType, payDetail)) {
} else if (isQRPayNonSuccessTransaction(transactionType, payDetail)) {
// startPrintProcess(false);
showDeclineDialog("QR Payment Failed!");
navigateToMainScreen();
} else if (isWavePaySuccessTransaction(transactionType, payDetail)) {
handleWavePaySuccessTransaction(payDetail, siriusReq);
} else if (isQRPaySuccessTransaction(transactionType, payDetail)) {
handleQRPaySuccessTransaction(payDetail, siriusReq);
} else {
handleDefaultTransaction(payDetail, siriusReq);
}
@ -187,19 +187,19 @@ public class TransactionResultFragment extends DataBindingFragment implements Da
!payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_ACCEPT);
}
private boolean isNonWavepayTransaction(TransactionsType transactionType) {
private boolean isNonQRPayTransaction(TransactionsType transactionType) {
return transactionType != TransactionsType.MMQR &&
transactionType != TransactionsType.MMQR_INQUIRY_STATUS &&
transactionType != TransactionsType.MMQR_REFUND;
}
private boolean isWavePayNonSuccessTransaction(TransactionsType transactionType, PayDetail payDetail) {
private boolean isQRPayNonSuccessTransaction(TransactionsType transactionType, PayDetail payDetail) {
return (transactionType == TransactionsType.MMQR && payDetail.getQrTransStatus() != 1) ||
(transactionType == TransactionsType.MMQR_INQUIRY_STATUS && payDetail.getQrTransStatus() != 1) ||
(transactionType == TransactionsType.MMQR_REFUND && payDetail.getQrTransStatus() != 1);
}
private boolean isWavePaySuccessTransaction(TransactionsType transactionType, PayDetail payDetail) {
private boolean isQRPaySuccessTransaction(TransactionsType transactionType, PayDetail payDetail) {
return (transactionType == TransactionsType.MMQR || transactionType == TransactionsType.MMQR_REFUND) &&
payDetail.getQrTransStatus() == 1;
@ -212,7 +212,7 @@ public class TransactionResultFragment extends DataBindingFragment implements Da
navigateToMainScreen();
}
private void handleWavePaySuccessTransaction(PayDetail payDetail, SiriusRequest siriusReq) {
private void handleQRPaySuccessTransaction(PayDetail payDetail, SiriusRequest siriusReq) {
SystemParamsOperation.getInstance().setLastSuccessTrnx(payDetail.getVoucherNo());
downloadParameters(siriusReq, TMSUpdate.CHECK);
navigateToPrintScreen();

View File

@ -296,8 +296,8 @@ public class ReprintAnyTransactionFragment extends DataBindingFragment {
// LogUtil.d(TAG,"Transaction settlement config : "+pay.isSettlementEnabled());
// LogUtil.d(TAG,"Transaction batch : "+pay.getBatchNo());
// LogUtil.d(TAG,"Current batch : "+SystemParamsOperation.getInstance().getCurrentBatchNum());
//
// LogUtil.d(TAG,"----------------------------------------------------------");
LogUtil.d(TAG,"----------------------------------------------------------");
if(sharedViewModel.transactionsType.getValue() != null && sharedViewModel.transactionsType.getValue() == TransactionsType.MMQR_HISTORY) {
// Wave Inquiry Status::

View File

@ -15,8 +15,10 @@ import com.utsmyanmar.baselib.util.DataBindingConfig;
import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.SettleData;
import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.utils.LogUtil;
import com.utsmyanmar.paylibs.utils.POSUtil;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsSettings;
import com.utsmyanmar.paylibs.utils.enums.HostType;
import com.utsmyanmar.paylibs.utils.enums.TransMenu;
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
@ -33,16 +35,22 @@ import java.util.List;
public class QRSettlementTransactionFragment extends DataBindingFragment implements DataBindingFragment.BackPressCallback {
private static final String TAG = QRSettlementTransactionFragment.class.getSimpleName();
private SharedViewModel sharedViewModel;
private ManagementViewModel managementViewModel;
private SettlementViewModel settlementViewModel;
ArrayList<PayDetail> qrTransactionsList = new ArrayList<>();
ArrayList<PayDetail> qrTransListAll = new ArrayList<>();
SettleData settleData;
private int routeId;
private int count = 0;
private long totalAmount = 0;
@Override
protected void initViewModel() {
@ -105,6 +113,7 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
@ -143,6 +152,7 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
managementViewModel.getTransactionHistory().observe(getViewLifecycleOwner(), payDetailList -> {
if (payDetailList != null) {
qrTransactionsList.clear();
qrTransListAll.clear();
count = 0;
totalAmount = 0;
@ -151,8 +161,7 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
// Filter for QR transactions only
if ((payDetail.getTransactionType() == TransactionsType.MMQR.value
|| payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value)
&& payDetail.getQrTransStatus() == 1
&& POSUtil.getInstance().getYesterdayDate().compareTo(POSUtil.getInstance().getDateByString(payDetail.transDate)) < 1) {
&& payDetail.getQrTransStatus() == 1) {
boolean isNeedMinusSign = payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value;
qrTransactionsList.add(payDetail);
@ -163,10 +172,13 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
totalAmount += payDetail.getAmount();
}
}
else if(payDetail.getTransactionType() == TransactionsType.MMQR.value || payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value) {
qrTransListAll.add(payDetail);
}
}
} catch (IllegalStateException e) {
// Handle cursor window size exceeded error
android.util.Log.e("QRSettlement", "Database cursor error - likely due to large data size", e);
LogUtil.e(TAG,"QRSettlement : Database cursor error - likely due to large data size:"+ e);
showEmptyDataView();
settlementViewModel.isNoData.setValue(true);
return;
@ -194,6 +206,7 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
List<PayDetail> payDetailList = managementViewModel.payDetails.getValue();
if( payDetailList != null) {
qrTransactionsList.clear();
qrTransListAll.clear();
count = 0;
totalAmount = 0;
@ -216,8 +229,7 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
}
}
} catch (IllegalStateException e) {
// Handle cursor window size exceeded error
android.util.Log.e("QRSettlement", "Database cursor error in last settlement - likely due to large data size", e);
LogUtil.e(TAG,"QRSettlement : Database cursor error in last settlement - likely due to large data size:"+ e);
showEmptyDataView();
settlementViewModel.isNoData.setValue(true);
return;
@ -248,7 +260,8 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
int qrRefundCount = 0;
long qrRefundAmount = 0;
long totalAmount = 0;
totalAmount = 0;
for (PayDetail payDetail : qrTransactionsList) {
if (payDetail.getTransactionType() == TransactionsType.MMQR.value) {
@ -272,24 +285,8 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
managementViewModel.trnxCountDR.setValue(String.valueOf(count));
// Create settlement data for transaction result
SettleData settleData = new SettleData(qrSaleCount, qrSaleAmount, 0, 0L, qrRefundCount, qrRefundAmount, 0, 0L);
TradeData tradeData = Params.newTrade(false);
PayDetail payDetail = tradeData.getPayDetail();
payDetail.setSettleDataObj(settleData);
payDetail.setTransactionType(TransactionsType.MMQR_SETTLEMENT.value);
payDetail.setTransType(TransactionsType.MMQR_SETTLEMENT.name);
payDetail.setAmount(totalAmount);
payDetail.setTradeAnswerCode("000");
settleData = new SettleData(qrSaleCount, qrSaleAmount, 0, 0L, qrRefundCount, qrRefundAmount, 0, 0L);
if(sharedViewModel.getTransMenu().getValue() != TransMenu.LAST_SETTLEMENT) {
sharedViewModel.insertPayDetail(payDetail);
}
sharedViewModel.setAmount(POSUtil.getInstance().getDecimalAmountSeparatorFormat(totalAmount));
sharedViewModel.payDetails.setValue(qrTransactionsList);
sharedViewModel.payDetail.setValue(payDetail);
}
@ -307,6 +304,34 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
}
private void processData() {
TradeData tradeData = Params.newTrade(false);
PayDetail payDetail = tradeData.getPayDetail();
payDetail.setSettleDataObj(settleData);
payDetail.setTransactionType(TransactionsType.MMQR_SETTLEMENT.value);
payDetail.setTransType(TransactionsType.MMQR_SETTLEMENT.name);
payDetail.setAmount(totalAmount);
payDetail.setTradeAnswerCode("000");
payDetail.setBatchNo(SystemParamsOperation.getInstance().getCurrentBatchNum());
if(sharedViewModel.getTransMenu().getValue() != TransMenu.LAST_SETTLEMENT) {
sharedViewModel.insertPayDetail(payDetail);
}
sharedViewModel.setAmount(POSUtil.getInstance().getDecimalAmountSeparatorFormat(totalAmount));
sharedViewModel.payDetails.setValue(qrTransactionsList);
sharedViewModel.payDetail.setValue(payDetail);
for (PayDetail pay : qrTransactionsList) {
settlementViewModel.deletePayDetail(pay);
}
for (PayDetail pay : qrTransListAll) {
settlementViewModel.deletePayDetail(pay);
}
}
private void updateData() {
EReceiptRequest request = EReceiptUtil.getInstance().generateMPUReceipt(sharedViewModel.payDetail.getValue());
sharedViewModel.pushReceipt(request);
@ -343,11 +368,9 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
if(sharedViewModel.getTransMenu().getValue() == TransMenu.SETTLEMENT) {
if (!qrTransactionsList.isEmpty()) {
for (PayDetail payDetail : qrTransactionsList) {
settlementViewModel.deletePayDetail(payDetail);
}
SystemParamsOperation.getInstance().getIncrementBatchNo();
processData();
updateData();
navigateToResult();

View File

@ -7,6 +7,7 @@ import com.utsmyanmar.paylibs.model.ICCardInfo;
import com.utsmyanmar.paylibs.model.MAGCardInfo;
import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.model.enums.TransCVM;
import com.utsmyanmar.paylibs.system.SystemDateTime;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
@ -151,6 +152,7 @@ public class MockData {
payDetail.setOriginalTransDate(SystemDateTime.getMMDD()+SystemDateTime.getYYYY());
payDetail.setTransCVM(TransCVM.NO_CVM);
if(transType == TransactionsType.MMQR) {
payDetail.setCardType(cardInputType);
payDetail.setTransType(transType.name);
@ -158,7 +160,13 @@ public class MockData {
payDetail.setCardHolderName(mockCardData.getCardHolderName());
payDetail.setAccountType(mockCardData.getCardScheme());
payDetail.setCustomerMobile(mockCardData.getPhoneNo());
payDetail.setCustomerMobile("kbzpay");
payDetail.setOriginalTransDate("2024-09-16 15:57:10");
payDetail.setQrTransId("12345678");
payDetail.setQrTransStatus(1);
payDetail.setQrReferNo("123456789012");
payDetail.setReferNo("123456789012");
payDetail.setApprovalCode("12345678");
} else {
payDetail.setCardType(cardInputType);
@ -197,7 +205,7 @@ public class MockData {
// payDetail.setTransDate(strTransDate);
// payDetail.setTransTime(strTransTime);
payDetail.setAmount(10000);
payDetail.setAmount(100000);
payDetail.setTransactionType(transType.value);
tradeData.setPayDetail(payDetail);

View File

@ -29,6 +29,7 @@ import com.utsmyanmar.checkxread.sdk.SunmiSDK;
import com.utsmyanmar.paylibs.PayLibNex;
import com.utsmyanmar.paylibs.PayLibsUtils;
import com.utsmyanmar.paylibs.network.ISOSocket;
import com.utsmyanmar.paylibs.utils.LogUtil;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
@ -101,21 +102,21 @@ public class BaseApplication extends Application {
TerminalKeyUtil.initNexKey();
emvParamOperation.loadAidRids();
} catch (UnsatisfiedLinkError e) {
android.util.Log.e("BaseApplication", "Failed to initialize NexGo SDK due to missing native library: " + e.getMessage());
LogUtil.e("BaseApplication", "Failed to initialize NexGo SDK due to missing native library: " + e.getMessage());
} catch (Exception e) {
android.util.Log.e("BaseApplication", "Failed to initialize NexGo SDK: " + e.getMessage());
LogUtil.e("BaseApplication", "Failed to initialize NexGo SDK: " + e.getMessage());
}
}
private void initFallbackMode() {
android.util.Log.w("BaseApplication", "Running in fallback mode without NexGo SDK");
LogUtil.w("BaseApplication", "Running in fallback mode without NexGo SDK");
try {
if (emvParamOperation != null) {
emvParamOperation.loadAidRids();
}
} catch (Exception e) {
android.util.Log.e("BaseApplication", "Failed to load EMV parameters in fallback mode: " + e.getMessage());
LogUtil.e("BaseApplication", "Failed to load EMV parameters in fallback mode: " + e.getMessage());
}
}

View File

@ -36,6 +36,7 @@ import com.nexgo.oaf.apiv3.emv.EmvTransConfigurationEntity;
import com.nexgo.oaf.apiv3.emv.OnEmvProcessListener2;
import com.nexgo.oaf.apiv3.emv.PromptEnum;
import com.nexgo.oaf.apiv3.emv.UnionPayTransDataEntity;
import com.nexgo.oaf.apiv3.emv.VisaTransDataEntity;
import com.sunmi.pay.hardware.aidl.bean.CardInfo;
import com.sunmi.pay.hardware.aidlv2.bean.EMVCandidateV2;
import com.sunmi.pay.hardware.aidlv2.bean.PinPadDataV2;
@ -244,6 +245,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
}
//for UPI
UnionPayTransDataEntity unionPayTransDataEntity = new UnionPayTransDataEntity();
unionPayTransDataEntity.setQpbocForGlobal(true);

View File

@ -27,7 +27,11 @@ object ECRHelper {
var onECRReceive: (bytes: ByteArray) -> Unit = { }
fun connect(bundle: Bundle) {
call { anyExecute(ecrService) { connect(bundle, ecrConnection) } }
call {
anyExecute(ecrService) {
connect(bundle, ecrConnection)
}
}
}
fun disconnect() {

View File

@ -930,6 +930,12 @@ public abstract class BaseXPrint {
public void onPrintResult(final int retCode) {
LogUtil.d(TAG, "Start printing :" + retCode);
if (retCode == 0) {
callbackStatus.onSuccess();
} else {
callbackStatus.onFailure();
}
}
});