Compare commits

..

4 Commits

Author SHA1 Message Date
moon
e51d658733 error slip printing error fixed 2026-08-31 14:56:36 +06:30
moon
d92c18f3f7 qr settlement fix 2026-08-31 14:51:42 +06:30
moon
597560e3bd currency 2026-08-31 11:33:16 +06:30
moon
4ff2d286aa currency selector 2026-08-31 10:20:46 +06:30
14 changed files with 101 additions and 42 deletions

View File

@ -222,6 +222,7 @@ public class InputRRNFragment extends DataBindingFragment {
newPay.setReferNo(rrnNo);
newPay.setCurrencyCode(payDetail.getCurrencyCode());
if(sharedViewModel.getTransMenu().getValue() == TransMenu.PRE_AUTH_FULL_VOID) {
newPay.setAmount(payDetail.getAmount());
@ -315,6 +316,7 @@ public class InputRRNFragment extends DataBindingFragment {
}
newPay.setReferNo(rrnNo);
newPay.setCurrencyCode(payDetail.getCurrencyCode());
newPay.setApprovalCode(payDetail.getApprovalCode());
newPay.setTradeTime(payDetail.getTradeTime());
newPay.setTradeDate(payDetail.getTradeDate());

View File

@ -113,7 +113,7 @@ public class ReceiptFragment extends DataBindingFragment {
data.retrievalReferenceNumber = payDetail.getReferNo();
data.approvalNumber = payDetail.getApprovalCode();
data.amount = POSUtil.getInstance().getDecimalAmountSeparatorFormat(payDetail.getAmount());
data.currency = payDetail.getCurrency();
data.currency = POSUtil.getInstance().currencyCodeToText(payDetail.getCurrencyCode());
data.footerMessage = "Keep this receipt for your records";
data.responseCode = payDetail.getTradeAnswerCode();

View File

@ -170,9 +170,10 @@ public class TransactionResultFragment extends DataBindingFragment implements Da
if (isNonApprovedTrade(payDetail) && isNonQRPayTransaction(transactionType)) {
if (SystemParamsOperation.getInstance().getPrinterEnabled()) {
startPrintProcess(false);
startPrintErrorReceipt();
} else {
isCardInside();
}
isCardInside();
} else if (transactionType == TransactionsType.SETTLEMENT || transactionType == TransactionsType.MMQR_SETTLEMENT) {
handleSettlementTransaction(siriusReq);
} else if (isQRPayNonSuccessTransaction(transactionType, payDetail)) {
@ -378,6 +379,50 @@ public class TransactionResultFragment extends DataBindingFragment implements Da
});
}
private void startPrintErrorReceipt() {
PrintHelper.getInstance().checkPaperRollStatus(new PaperRollStatusCallback() {
@Override
public void printerReady() {
sharedViewModel.printErrorReceipt(new PrintXStatus() {
@Override
public void onSuccess() {
isCardInside();
}
@Override
public void onFailure() {
handleForEmptyPaperRoll(false);
}
});
}
@Override
public void paperRollIsEmpty() {
handleForEmptyPaperRoll(false);
}
@Override
public void printNotComplete() {
handleForEmptyPaperRoll(false);
}
@Override
public void printerTooHot() {
handleForEmptyPaperRoll(false);
}
@Override
public void printerFailed() {
handleForEmptyPaperRoll(false);
}
@Override
public void unknownStatusOccur(int code) {
handleForEmptyPaperRoll(false);
}
});
}
private void handleForEmptyPaperRoll(boolean isSettle) {
cancelTimeout();
@ -392,7 +437,11 @@ public class TransactionResultFragment extends DataBindingFragment implements Da
@Override
public void onClickRetry() {
dismissPrinterAlertDialog();
startPrintProcess(isSettle);
if (isSettle) {
startPrintProcess(true);
} else {
startPrintErrorReceipt();
}
}
});

View File

@ -460,6 +460,7 @@ public class EmvTransactionProcessViewModel extends EmvBaseViewModel implements
mPayDetail.setIsCanceled(true);
updatePayDetail(mPayDetail);
payResult.setESignBlob(mPayDetail.getESignBlob());
payResult.setCurrencyCode(mPayDetail.getCurrencyCode());
repository.insertPayDetail(updateCurrentDateAndTime(payResult));
}

View File

@ -403,6 +403,10 @@ public class SharedViewModel extends ViewModel {
});
}
public void printErrorReceipt(PrintXStatus printXStatus) {
PrintXReceipt.getInstance().printSmileReceipt(payDetail.getValue(), true, printXStatus);
}
public void startPrintReceipt(boolean isFirstPrint) {
/*

View File

@ -300,6 +300,7 @@ public class TransProcessViewModel extends ViewModel implements ProcessingTransa
payDetail.setIsCanceled(true);
updatePayDetail(payDetail);
payResult.setESignBlob(payDetail.getESignBlob());
payResult.setCurrencyCode(payDetail.getCurrencyCode());
repository.insertPayDetail(updateCurrentDateAndTime(payResult));
}

View File

@ -63,7 +63,7 @@ public class QRPayFragment extends DataBindingFragment {
features.add(new QRPayItem("Refund", R.drawable.ic_refund, true));
}
features.add(new QRPayItem("History", R.drawable.ic_history, true));
features.add(new QRPayItem("Mock QR", R.drawable.ic_qr_pay, true));
// features.add(new QRPayItem("Mock QR", R.drawable.ic_qr_pay, true));
// List<QRPayItem> features = List.of(
// new QRPayItem("Sale", R.drawable.ic_qr_pay, true),

View File

@ -6,6 +6,8 @@ import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.utsmm.kbz.config.data.model.ValidityStatus;
import com.utsmm.kbz.util.tms.TMSUtil;
import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.util.DataBindingConfig;
import com.utsmyanmar.paylibs.utils.enums.HostType;
@ -16,9 +18,7 @@ import com.utsmm.kbz.config.Constants;
import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel;
import com.utsmm.kbz.util.ecr.CoreUtils;
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
import com.utsmm.kbz.util.tms.TMSUtil;
import com.utsmm.kbz.util.Connectivity;
import com.utsmm.kbz.config.data.model.ValidityStatus;
public class SelectSettlementFragment extends DataBindingFragment implements DataBindingFragment.BackPressCallback {
@ -80,9 +80,7 @@ public class SelectSettlementFragment extends DataBindingFragment implements Dat
public class ClickEvent {
public void onCardSettlement() {
if (TMSUtil.getInstance().checkParams().isStatus() == ValidityStatus.FAILURE) {
showDeclineDialog(getResourceString(R.string.txt_please_download_config)+"\n"+TMSUtil.getInstance().checkParams().getMessage());
} else if (!Connectivity.isConnectedWifi(getContext()) && !Connectivity.isConnectedMobile(getContext())) {
if (!Connectivity.isConnectedWifi(getContext()) && !Connectivity.isConnectedMobile(getContext())) {
showSingleInfoDialog(getResourceString(R.string.txt_please_enable_internet));
} else{
routeId = R.id.action_selectSettlementFragment_to_settlementTransactionFragment;
@ -110,4 +108,4 @@ public class SelectSettlementFragment extends DataBindingFragment implements Dat
popBackStack();
}
}
}
}

View File

@ -36,9 +36,7 @@ import com.utsmyanmar.paylibs.model.QRSettleData;
import com.utsmyanmar.paylibs.model.SettleData;
import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel;
import com.utsmm.kbz.util.Connectivity;
import com.utsmm.kbz.config.data.model.ValidityStatus;
import com.utsmm.kbz.util.ecr.CoreUtils;
import com.utsmm.kbz.util.tms.TMSUtil;
import java.util.ArrayList;
import java.util.List;
@ -117,10 +115,7 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
super.onResume();
if(sharedViewModel.getTransMenu().getValue() == TransMenu.SETTLEMENT) {
if (TMSUtil.getInstance().checkParams().isStatus() == ValidityStatus.FAILURE) {
showDeclineDialog(getResourceString(R.string.txt_please_download_config)+"\n"+TMSUtil.getInstance().checkParams().getMessage());
return;
} else if (!Connectivity.isConnectedWifi(getContext()) && !Connectivity.isConnectedMobile(getContext())) {
if (!Connectivity.isConnectedWifi(getContext()) && !Connectivity.isConnectedMobile(getContext())) {
showSingleInfoDialog(getResourceString(R.string.txt_please_enable_internet));
return;
}

View File

@ -76,10 +76,6 @@ public class CurrencySelectionHelper {
values.add(normalizeCurrency(primaryCurrency.name));
}
if (!SystemParamsOperation.getInstance().getDuelCurrencyStatus()) {
return new ArrayList<>(values);
}
String secondaryCurrency = normalizeCurrency(SystemParamsOperation.getInstance().getThirdHostCurrency());
if (!TextUtils.isEmpty(SystemParamsOperation.getInstance().getThirdHostName()) && !TextUtils.isEmpty(secondaryCurrency)) {
values.add(secondaryCurrency);

View File

@ -131,12 +131,12 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{sharedViewModel._currencyText+` `+sharedViewModel.amount}"
android:text="@{sharedViewModel.payDetail != null ? sharedViewModel.amount : sharedViewModel.amount}"
android:textColor="@color/colorTextTitle"
android:textSize="16sp"
android:textStyle="bold"
android:fontFamily="@font/rubik_medium"
tools:text="MMK 250,000.00" />
tools:text="250,000.00" />
</LinearLayout>

View File

@ -300,11 +300,12 @@ public abstract class BaseXPrint {
return currencyMap;
}
protected void printMMQRReport(List<QRSettleData> qrList) {
protected void printMMQRReport(PayDetail payDetail, List<QRSettleData> qrList) {
if (qrList == null || qrList.isEmpty()) return;
long saleTotal = 0;
long refundTotal = 0;
String currencySign = currencyCodeToText(payDetail.getCurrencyCode());
emptyLine(1);
@ -322,7 +323,7 @@ public abstract class BaseXPrint {
printString("Status :" + data.getStatus());
printString("Date :" + data.getDate());
printString("Time :" + data.getTime());
printString("Amount : MMK "
printString("Amount : " + currencySign + " "
+ (data.getTransactionType() == TransactionsType.MMQR_REFUND.value ? "-" : "")
+ PrintUtils.getInstance().getSeparatorOnlyNumberFormat(data.getAmount()));
emptyLine(1);
@ -332,13 +333,13 @@ public abstract class BaseXPrint {
dotBreak();
// printer.appendPrnStr("Refund Total:MMK", "- " + PrintUtils.getInstance().getSeparatorOnlyNumberFormat(refundTotal) + " ", fontNormal, false);
print2ColumnsString("Refund Total:", "-" + PrintUtils.getInstance().getSeparatorOnlyNumberFormat(refundTotal) + "MMK");
print2ColumnsString("Refund Total:", "-" + PrintUtils.getInstance().getSeparatorOnlyNumberFormat(refundTotal) + currencySign);
dotBreak();
// printer.appendPrnStr("Sale Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(saleTotal) + " ", fontNormal, false);
print2ColumnsString("SALE TOTAL :", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(saleTotal) + "MMK");
print2ColumnsString("SALE TOTAL :", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(saleTotal) + currencySign);
dotBreak();
// printer.appendPrnStr("Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(grandTotal) + " ", fontNormal, false);
print2ColumnsString("GRAND TOTAL :", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(grandTotal) + "MMK");
print2ColumnsString("GRAND TOTAL :", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(grandTotal) + currencySign);
dashBreakEnding();
emptyLine(1);
}
@ -520,7 +521,7 @@ public abstract class BaseXPrint {
if (payDetail.getTradeAnswerCode().equals("00") || payDetail.getTradeAnswerCode().equals("000")) {
String currencySign = currencyCodeToText(payDetail.getCurrencyCode());
if (payDetail.getTransactionType() == TransactionType.BALANCE_INQUIRY) {
printer.appendPrnStr("MMK " + PrintUtils.getInstance().getBalanceInquiryNumberFormat(payDetail.getAmount()), fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr(currencySign + " " + PrintUtils.getInstance().getBalanceInquiryNumberFormat(payDetail.getAmount()), fontNormal, AlignEnum.LEFT, false);
} else if (payDetail.getTransactionType() == TransactionType.VOID || payDetail.getTransactionType() == TransactionType.REFUND || payDetail.getTransactionType() == TransactionType.PRE_SALE_CANCEL || payDetail.getTransactionType() == TransactionType.PRE_SALE_COMPLETE_VOID) {
print2SideString("AMT:" + currencySign, "- " + PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isDecimalEnabled));
@ -682,7 +683,7 @@ public abstract class BaseXPrint {
String currencySign = currencyCodeToText(payDetail.getCurrencyCode());
// CurrencyType currencySign = currencyTextToCurrencyType(payDetail.getCurrencyCode());
if (payDetail.getTransactionType() == TransactionType.BALANCE_INQUIRY) {
printer.appendPrnStr("MMK " + PrintUtils.getInstance().getBalanceInquiryNumberFormat(payDetail.getAmount()), fontNormal, AlignEnum.LEFT, true);
printer.appendPrnStr(currencySign + " " + PrintUtils.getInstance().getBalanceInquiryNumberFormat(payDetail.getAmount()), fontNormal, AlignEnum.LEFT, true);
} else {
print2SideString("AMT:" + currencySign, PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isDecimalEnabled));
// printer.appendPrnStr("AMOUNT:" + currencySign + " " + PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount()), fontNormal, AlignEnum.LEFT,true);
@ -716,7 +717,7 @@ public abstract class BaseXPrint {
protected void printTransDetailSummary(PayDetail payDetail) {
String MMK = "MMK";
String currencySign = currencyCodeToText(payDetail.getCurrencyCode());
SettleData settleData = payDetail.getSettleDataObj();
boolean isQrDecimalEnabled = SystemParamsOperation.getInstance().isQrDecimalEnable();
boolean isWallet = "WALLET".equalsIgnoreCase(payDetail.getAccountType());
@ -742,7 +743,7 @@ public abstract class BaseXPrint {
// emptyLine(1);
emptyLine(1);
printer.appendPrnStr("(COUNT)TRANS", "AMOUNT(MMK)", fontNormal, false);
printer.appendPrnStr("(COUNT)TRANS", "AMOUNT(" + currencySign + ")", fontNormal, false);
if (!isWallet) {
boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable();
@ -1390,11 +1391,12 @@ public abstract class BaseXPrint {
}
}
protected void printQRSettlementTransDetail(List<QRSettleData> lists) {
protected void printQRSettlementTransDetail(PayDetail payDetail, List<QRSettleData> lists) {
long totalAmount = 0;
long refundTotal = 0;
String currencySign = currencyCodeToText(payDetail.getCurrencyCode());
for (QRSettleData pay : lists) {
@ -1408,7 +1410,7 @@ public abstract class BaseXPrint {
printString("Status :" + pay.getStatus());
printString("Date :" + pay.getDate());
printString("Time :" + pay.getTime());
printString("Amount : MMK "
printString("Amount : " + currencySign + " "
+ (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value ? "-" : "")
+ PrintUtils.getInstance().getSeparatorOnlyNumberFormat(pay.getAmount()));
@ -1424,13 +1426,13 @@ public abstract class BaseXPrint {
dashBreak();
// print2ColumnsString("Refund Total:MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(refundTotal));
printer.appendPrnStr("Refund Total:MMK", "- " + PrintUtils.getInstance().getSeparatorOnlyNumberFormat(refundTotal) + " ", fontNormal, false);
printer.appendPrnStr("Refund Total:" + currencySign, "- " + PrintUtils.getInstance().getSeparatorOnlyNumberFormat(refundTotal) + " ", fontNormal, false);
dashBreak();
// print2ColumnsString("Sale Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount));
printer.appendPrnStr("Sale Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount) + " ", fontNormal, false);
printer.appendPrnStr("Sale Total :" + currencySign, PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount) + " ", fontNormal, false);
dashBreak();
// print2ColumnsString("Grand Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount - refundTotal));
printer.appendPrnStr("Grand Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount - refundTotal) + " ", fontNormal, false);
printer.appendPrnStr("Grand Total :" + currencySign, PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount - refundTotal) + " ", fontNormal, false);
dashBreakEnding();
// emptyLine(2);
}
@ -1646,6 +1648,7 @@ public abstract class BaseXPrint {
if (printer.getStatus() != SdkResult.Success) {
callbackStatus.onFailure();
return;
}
printer.startPrint(true, new OnPrintListener() {

View File

@ -112,6 +112,9 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
}
} catch (Exception e) {
e.printStackTrace();
if (callbackStatus != null) {
callbackStatus.onFailure();
}
}
}
@ -177,6 +180,9 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
} catch (RemoteException | NullPointerException e) {
e.printStackTrace();
if (callbackStatus != null) {
callbackStatus.onFailure();
}
}
}
@ -216,7 +222,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
printMerchantHeader();
printTransHeader(payDetail);
printTransDetailSettlement(payDetail);
printMMQRReport(qrList);
printMMQRReport(payDetail, qrList);
printTransFooterForSettlement();
emptyLine(1);
@ -237,7 +243,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
printLogo();
printMerchantHeader();
printTransHeader(payDetail, HostType.QR);
printQRSettlementTransDetail(list);
printQRSettlementTransDetail(payDetail, list);
printTransFooterSummary();
emptyLine(1);
@ -305,6 +311,9 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
} catch (RemoteException | NullPointerException e) {
e.printStackTrace();
if (callbackStatus != null) {
callbackStatus.onFailure();
}
}
}
@ -371,9 +380,10 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
boolean isNeedMinusSign = payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value;
boolean isQrDecimalEnable = SystemParamsOperation.getInstance().isQrDecimalEnable();
String currencySign = POSUtil.getInstance().currencyCodeToText(payDetail.getCurrencyCode());
dotBreak();
print2ColumnsStringBoldCenter("AMOUNT :", isNeedMinusSign? "- "+PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isQrDecimalEnable) + " MMK": PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isQrDecimalEnable) + " MMK",fontLarge, AlignEnum.LEFT);
print2ColumnsStringBoldCenter("AMOUNT :", isNeedMinusSign? "- "+PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isQrDecimalEnable) + " " + currencySign: PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isQrDecimalEnable) + " " + currencySign,fontLarge, AlignEnum.LEFT);
dotBreak();
// if(payDetail.getTransactionType() == TransactionsType.MMQR.value) {
// String data = payDetail.getReferNo()+"-"+payDetail.getAmount()+"-"+payDetail.getQrTransId()+"-"+payDetail.getMerchantNo()+"-"+payDetail.getCustomerMobile().toUpperCase()+"-"+payDetail.getOriginalTransDate();

View File

@ -385,7 +385,7 @@ public class POSUtil {
return "Success";
}*/
String currencySign = SystemParamsOperation.getInstance().getCurrencyType().name;
String currencySign = currencyCodeToText(payDetail.getCurrencyCode());
if(payDetail.getTransactionType() == TransactionsType.VOID.value ) {
return "Transaction for Amount \n"+getDecimalAmountFormat(payDetail.getAmount()) +" "+currencySign+" Voided.";
@ -410,7 +410,7 @@ public class POSUtil {
}
} else if(TextUtils.equals(payDetail.getAccountType(),"WALLET")) {
if(payDetail.getQrTransStatus() == 1) {
return "Transaction for Amount \n"+getDecimalAmountFormat(payDetail.getAmount()) +" MMK Received.";
return "Transaction for Amount \n"+getDecimalAmountFormat(payDetail.getAmount()) +" "+currencyCodeToText(payDetail.getCurrencyCode())+" Received.";
} else if(payDetail.getQrTransStatus() == 3){
return "Declined \n COMMUNICATION ERROR";
} else if(payDetail.getQrTransStatus() == 2) {