Merge remote-tracking branch 'origin/merge_latest_SIT' into merge_latest_SIT

# Conflicts:
#	paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java
This commit is contained in:
kizzy 2026-01-09 15:05:14 +07:00
commit 37a3fb27bc
8 changed files with 63 additions and 39 deletions

View File

@ -14,8 +14,8 @@ android {
applicationId "com.utsmm.kbz" applicationId "com.utsmm.kbz"
minSdk 24 minSdk 24
targetSdk 33 targetSdk 33
versionCode 11 versionCode 14
versionName "1.10" versionName "1.13"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }

View File

@ -9,7 +9,7 @@
<uses-feature <uses-feature
android:name="android.hardware.telephony" android:name="android.hardware.telephony"
android:required="false" /> android:required="false" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" /> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />

View File

@ -94,7 +94,6 @@ public class TransactionResultFragment extends DataBindingFragment implements Da
@Override @Override
public void onStart() { public void onStart() {
super.onStart(); super.onStart();
} }
@Override @Override
@ -172,7 +171,11 @@ public class TransactionResultFragment extends DataBindingFragment implements Da
handleSettlementTransaction(siriusReq); handleSettlementTransaction(siriusReq);
} else if (isQRPayNonSuccessTransaction(transactionType, payDetail)) { } else if (isQRPayNonSuccessTransaction(transactionType, payDetail)) {
// startPrintProcess(false); // startPrintProcess(false);
if(transactionType == TransactionsType.MMQR_REFUND){
showDeclineDialog("QR Refund Failed!");
}else{
showDeclineDialog("QR Payment Failed!"); showDeclineDialog("QR Payment Failed!");
}
navigateToMainScreen(); navigateToMainScreen();
} else if (isQRPaySuccessTransaction(transactionType, payDetail)) { } else if (isQRPaySuccessTransaction(transactionType, payDetail)) {
handleQRPaySuccessTransaction(payDetail, siriusReq); handleQRPaySuccessTransaction(payDetail, siriusReq);

View File

@ -26,6 +26,8 @@ import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel;
import com.utsmm.kbz.util.DecimalDigitsInputFilter; import com.utsmm.kbz.util.DecimalDigitsInputFilter;
import com.utsmm.kbz.util.TransactionUtil; import com.utsmm.kbz.util.TransactionUtil;
import java.text.DecimalFormat;
public class QRRefundDetailFragment extends DataBindingFragment { public class QRRefundDetailFragment extends DataBindingFragment {
@ -43,6 +45,8 @@ public class QRRefundDetailFragment extends DataBindingFragment {
private EditText etReferenceNo, etOriginalAmount, etRefundAmount, etRefundReason; private EditText etReferenceNo, etOriginalAmount, etRefundAmount, etRefundReason;
private LinearLayout originalAmountLayout, refundAmountLayout; private LinearLayout originalAmountLayout, refundAmountLayout;
private String originalRefundAmount;
private boolean isPartialRefund = false; private boolean isPartialRefund = false;
@ -122,6 +126,10 @@ public class QRRefundDetailFragment extends DataBindingFragment {
} }
private void initData() { private void initData() {
double realAmount = payDetail.getAmount() / 100.0;
DecimalFormat df = new DecimalFormat("0.00");
originalRefundAmount = df.format(realAmount);
payDetail = TransactionUtil.getInstance().initWalletTransaction(TransactionsType.MMQR_REFUND); payDetail = TransactionUtil.getInstance().initWalletTransaction(TransactionsType.MMQR_REFUND);
payDetail.setInvoiceNo(SystemParamsOperation.getInstance().getIncrementInvoiceNum()); payDetail.setInvoiceNo(SystemParamsOperation.getInstance().getIncrementInvoiceNum());
@ -144,8 +152,8 @@ public class QRRefundDetailFragment extends DataBindingFragment {
} else { } else {
// Hide amount fields for original refund // Hide amount fields for original refund
isPartialRefund = false; isPartialRefund = false;
originalAmountLayout.setVisibility(View.GONE); originalAmountLayout.setVisibility(View.VISIBLE);
refundAmountLayout.setVisibility(View.GONE); refundAmountLayout.setVisibility(View.VISIBLE);
} }
}); });
} }
@ -162,6 +170,8 @@ public class QRRefundDetailFragment extends DataBindingFragment {
String referenceNo = etReferenceNo.getText().toString().trim(); String referenceNo = etReferenceNo.getText().toString().trim();
String refundReason = etRefundReason.getText().toString().trim(); String refundReason = etRefundReason.getText().toString().trim();
String originalAmountStr = etOriginalAmount.getText().toString().trim();
String refundAmountStr = etRefundAmount.getText().toString().trim();
// Validate reference number // Validate reference number
if (referenceNo.isEmpty()) { if (referenceNo.isEmpty()) {
@ -171,8 +181,8 @@ public class QRRefundDetailFragment extends DataBindingFragment {
if (isPartialRefund) { if (isPartialRefund) {
// Partial refund validation // Partial refund validation
String originalAmountStr = etOriginalAmount.getText().toString().trim(); // String originalAmountStr = etOriginalAmount.getText().toString().trim();
String refundAmountStr = etRefundAmount.getText().toString().trim(); // String refundAmountStr = etRefundAmount.getText().toString().trim();
if (originalAmountStr.isEmpty()) { if (originalAmountStr.isEmpty()) {
kPayViewModel.invalidAmountMsg.setValue("Enter original amount"); kPayViewModel.invalidAmountMsg.setValue("Enter original amount");
@ -207,12 +217,16 @@ public class QRRefundDetailFragment extends DataBindingFragment {
kPayViewModel.setQrRefund(qrRefund); kPayViewModel.setQrRefund(qrRefund);
} else { } else {
QRRefund qrRefund = new QRRefund(referenceNo, "0", etOriginalAmount.getText().toString().trim(), refundReason); // String originalAmountStr = etOriginalAmount.getText().toString().trim();
// String refundAmountStr = etRefundAmount.getText().toString().trim();
QRRefund qrRefund = new QRRefund(referenceNo, refundAmountStr, originalRefundAmount, refundReason);
kPayViewModel.setQrRefund(qrRefund); kPayViewModel.setQrRefund(qrRefund);
} }
sharedViewModel.transactionsType.setValue(TransactionsType.MMQR_REFUND); sharedViewModel.transactionsType.setValue(TransactionsType.MMQR_REFUND);
kPayViewModel.setPayDetail(payDetail); kPayViewModel.setPayDetail(payDetail);
// sharedViewModel.amount.setValue(refundAmountStr);
routeId = R.id.action_qrRefundDetail_inputPasswordFragment; routeId = R.id.action_qrRefundDetail_inputPasswordFragment;
safeNavigateToRouteId(); safeNavigateToRouteId();
} }

View File

@ -127,7 +127,7 @@ public class QRRefundProcessFragment extends DataBindingFragment {
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe( .subscribe(
response -> { response -> {
handleRefundResponse(response, referenceNo); handleRefundResponse(response, referenceNo, originalAmount);
}, },
throwable -> { throwable -> {
LogUtil.e(TAG, "Refund error: " + throwable.getMessage()); LogUtil.e(TAG, "Refund error: " + throwable.getMessage());
@ -141,14 +141,12 @@ public class QRRefundProcessFragment extends DataBindingFragment {
refundDisposable.add(refundDi); refundDisposable.add(refundDi);
} }
private void handleRefundResponse(KPayRefund.RefundResponse response, String referenceNo) { private void handleRefundResponse(KPayRefund.RefundResponse response, String referenceNo, String orgAmount) {
if (response != null && response.getResponse() != null && "REFUND_SUCCESS".equalsIgnoreCase(response.getResponse().getRefundStatus())) { if (response != null && response.getResponse() != null && "REFUND_SUCCESS".equalsIgnoreCase(response.getResponse().getRefundStatus())) {
LogUtil.d(TAG, "Refund successful!"); LogUtil.d(TAG, "Refund successful!");
String refundAmount = response.getResponse().getRefundAmount(); String refundAmount = response.getResponse().getRefundAmount();
Log.d(TAG, "refund amount -> " + refundAmount);
long text = POSUtil.getInstance().convertAmount(refundAmount); long text = POSUtil.getInstance().convertAmount(refundAmount);
Log.d(TAG, "refund amount but long -> " + text);
String dateTime = SystemDateTime.getTodayDateFormat() + " " + SystemDateTime.getTodayTimeFormat(); String dateTime = SystemDateTime.getTodayDateFormat() + " " + SystemDateTime.getTodayTimeFormat();
payDetail.setTC(response.getResponse().getRefundStatus()); payDetail.setTC(response.getResponse().getRefundStatus());
@ -185,6 +183,7 @@ public class QRRefundProcessFragment extends DataBindingFragment {
if (response != null && response.getResponse() != null && response.getResponse().getMsg() != null) { if (response != null && response.getResponse() != null && response.getResponse().getMsg() != null) {
errorMsg = response.getResponse().getMsg(); errorMsg = response.getResponse().getMsg();
} }
payDetail.setTradeResultDes(errorMsg); payDetail.setTradeResultDes(errorMsg);
EReceiptRequest request = EReceiptUtil.getInstance().generateQRRefundReceipt( EReceiptRequest request = EReceiptUtil.getInstance().generateQRRefundReceipt(
"0", "0",
@ -196,7 +195,7 @@ public class QRRefundProcessFragment extends DataBindingFragment {
TransResultStatus.FAIL TransResultStatus.FAIL
); );
sharedViewModel.pushReceipt(request); sharedViewModel.pushReceipt(request);
sharedViewModel.amount.setValue(orgAmount);
sharedViewModel.payDetail.setValue(payDetail); sharedViewModel.payDetail.setValue(payDetail);
navigateToNext(); navigateToNext();
} }

View File

@ -319,6 +319,7 @@ public class TMSUtil {
Log.d(TAG,"Connected to Wifi"); Log.d(TAG,"Connected to Wifi");
return "WIFI"; return "WIFI";
} }
}return "No Connection"; }
return "No Connection";
} }
} }

View File

@ -1,14 +1,16 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<network-security-config> <network-security-config>
<domain-config cleartextTrafficPermitted="true"> <domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">159.223.40.176</domain> <domain includeSubdomains="true">159.223.40.176</domain>
<domain includeSubdomains="true">128.199.170.203</domain> <domain includeSubdomains="true">128.199.170.203</domain>
<domain includeSubdomains="true">152.42.199.193</domain> <domain includeSubdomains="true">152.42.199.193</domain>
<domain includeSubdomains="true">api.kbzpay.com</domain> <domain includeSubdomains="true">api.kbzpay.com</domain>
<domain-config>
<domain includeSubdomains="true">receipt-nest.utsmyanmar.com</domain>
</domain-config>
<domain includeSubdomains="true">sirius-nest.utsmyanmar.com</domain> <domain includeSubdomains="true">sirius-nest.utsmyanmar.com</domain>
</domain-config> </domain-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">receipt-nest.utsmyanmar.com</domain>
</domain-config>
</network-security-config> </network-security-config>

View File

@ -162,7 +162,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
printMerchantHeader(); printMerchantHeader();
printTransHeader(payDetail); printTransHeader(payDetail);
printTransDetailQR(payDetail); printTransDetailQR(payDetail);
LogUtil.d(TAG,"QR trans status:"+payDetail.getQrTransStatus()); // LogUtil.d(TAG,"QR trans status:"+payDetail.getQrTransStatus());
if (payDetail.getQrTransStatus() == 1) { if (payDetail.getQrTransStatus() == 1) {
printTransFooter(true,payDetail, isMerchantCopy); printTransFooter(true,payDetail, isMerchantCopy);
} else { } else {
@ -232,7 +232,8 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
setHeight(0x12); setHeight(0x12);
printLogo(); printLogo();
printMerchantHeader(); printMerchantHeader();
printTransHeader(payDetail, hostType); // printTransHeader(payDetail, hostType);
printTranHeader("DETAIL REPORT");
printTransDetailReport(lists,hostType); printTransDetailReport(lists,hostType);
// emptyLine(1); // emptyLine(1);
startPrintNex(); startPrintNex();
@ -310,21 +311,25 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
// payDetail.getCustomerMobile() // as channel type // payDetail.getCustomerMobile() // as channel type
if(payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == 1 ) { if(payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == 1 ) {
print2ColumnsStringNoSpace("PAYMENT TYPE ",": "+ (payDetail.getCustomerMobile() == null || payDetail.getCustomerMobile().isEmpty() ? "-": payDetail.getCustomerMobile())); print2ColumnsStringNoSpace("PAYMENT TYPE",":"+ (payDetail.getCustomerMobile() == null || payDetail.getCustomerMobile().isEmpty() ? "-": payDetail.getCustomerMobile()));
print2ColumnsStringNoSpace("TRXN REF ",": "+ payDetail.getReferNo()); print2ColumnsStringNoSpace("TRXN REF ",":"+ payDetail.getReferNo());
if(payDetail.getQrReferNo() != null && !payDetail.getQrReferNo().isEmpty()) { if(payDetail.getQrReferNo() != null && !payDetail.getQrReferNo().isEmpty()) {
print2ColumnsStringNoSpace("MMQR REF ",": "+ payDetail.getQrReferNo()); print2ColumnsStringNoSpace("MMQR REF ",":"+ payDetail.getQrReferNo());
} }
print2ColumnsStringNoSpace("TRXN ID",":"+ (payDetail.getQrTransId() == null || payDetail.getQrTransId().isEmpty() ? "-": payDetail.getQrTransId())); print2ColumnsStringNoSpace("TRXN ID ",":"+ (payDetail.getQrTransId() == null || payDetail.getQrTransId().isEmpty() ? "-": payDetail.getQrTransId()));
print2ColumnsStringNoSpace("STATUS ",": "+ PrintUtils.getInstance().getQrTransStatus(payDetail.getQrTransStatus())); print2ColumnsStringNoSpace("STATUS ",":"+ PrintUtils.getInstance().getQrTransStatus(payDetail.getQrTransStatus()));
} else if(payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value && payDetail.getQrTransStatus() == 1) { } else if(payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value && payDetail.getQrTransStatus() == 1) {
String originalDate = payDetail.getOriginalTransDate();
String tranDate = originalDate.split(" ")[0];
String tranTime = originalDate.split(" ")[1];
print2ColumnsStringNoSpace("TRXN REF ",":"+ payDetail.getReferNo()); print2ColumnsStringNoSpace("TRXN REF ",":"+ payDetail.getReferNo());
print2ColumnsStringNoSpace("TXN DATE/TIME",":"+ payDetail.getOriginalTransDate()); print2ColumnsStringNoSpace("TXN DATE ",":"+ tranDate);
print2ColumnsStringNoSpace("TXN TIME ",":"+ tranTime);
print2ColumnsStringNoSpace("STATUS ",":"+ PrintUtils.getInstance().getQrTransStatus(payDetail.getQrTransStatus())); print2ColumnsStringNoSpace("STATUS ",":"+ PrintUtils.getInstance().getQrTransStatus(payDetail.getQrTransStatus()));
} else if(payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == -1) { } else if(payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == -1) {
print2ColumnsStringNoSpace("PAYMENT TYPE ",":"+ (payDetail.getCustomerMobile() == null || payDetail.getCustomerMobile().isEmpty() ? "-": payDetail.getCustomerMobile())); print2ColumnsStringNoSpace("PAYMENT TYPE",":"+ (payDetail.getCustomerMobile() == null || payDetail.getCustomerMobile().isEmpty() ? "-": payDetail.getCustomerMobile()));
print2ColumnsStringNoSpace("TRXN REF ",":"+ payDetail.getReferNo()); print2ColumnsStringNoSpace("TRXN REF ",":"+ payDetail.getReferNo());
print2ColumnsStringNoSpace("TXN TIME ",":"+ (payDetail.getOriginalTransDate() == null || payDetail.getOriginalTransDate().isEmpty() ? POSUtil.getInstance().getCurrentDateTimeForQR(): payDetail.getOriginalTransDate())); print2ColumnsStringNoSpace("TXN TIME ",":"+ (payDetail.getOriginalTransDate() == null || payDetail.getOriginalTransDate().isEmpty() ? POSUtil.getInstance().getCurrentDateTimeForQR(): payDetail.getOriginalTransDate()));
} }
@ -340,10 +345,9 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
boolean isNeedMinusSign = payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value; boolean isNeedMinusSign = payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value;
boolean isQrDecimalEnable = SystemParamsOperation.getInstance().isQrDecimalEnable(); boolean isQrDecimalEnable = SystemParamsOperation.getInstance().isQrDecimalEnable();
lineBreak(); dotBreak();
print2ColumnsStringBoldCenter("TOTAL MMK", isNeedMinusSign? "- "+PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isQrDecimalEnable): PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isQrDecimalEnable),fontLarge, AlignEnum.LEFT); print2ColumnsStringBoldCenter("AMOUNT :", isNeedMinusSign? "- "+PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isQrDecimalEnable) + " MMK": PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isQrDecimalEnable) + " MMK",fontLarge, AlignEnum.LEFT);
lineBreak(); dotBreak();
// if(payDetail.getTransactionType() == TransactionsType.MMQR.value) { // if(payDetail.getTransactionType() == TransactionsType.MMQR.value) {
// String data = payDetail.getReferNo()+"-"+payDetail.getAmount()+"-"+payDetail.getQrTransId()+"-"+payDetail.getMerchantNo()+"-"+payDetail.getCustomerMobile().toUpperCase()+"-"+payDetail.getOriginalTransDate(); // String data = payDetail.getReferNo()+"-"+payDetail.getAmount()+"-"+payDetail.getQrTransId()+"-"+payDetail.getMerchantNo()+"-"+payDetail.getCustomerMobile().toUpperCase()+"-"+payDetail.getOriginalTransDate();
// //
@ -430,7 +434,8 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
setHeight(0x12); setHeight(0x12);
printLogo(); printLogo();
printMerchantHeader(); printMerchantHeader();
printTransHeader(payDetail, hostType); // printTransHeader(payDetail, hostType);
printTranHeader("SUMMARY REPORT");
printTransDetailSummary(payDetail); printTransDetailSummary(payDetail);
// printTransFooterSummary(); // printTransFooterSummary();