fix detail report decimal

This commit is contained in:
MooN 2025-12-23 20:06:27 +06:30
parent 34b2fe8189
commit 063805e77a
7 changed files with 83 additions and 28 deletions

View File

@ -14,8 +14,8 @@ android {
applicationId "com.utsmm.kbz"
minSdk 24
targetSdk 33
versionCode 4
versionName "1.03"
versionCode 6
versionName "1.05"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

View File

@ -312,7 +312,7 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi
if(response.getResponse().getWalletIdentifier() != null) {
payDetail.setCustomerMobile(response.getResponse().getWalletIdentifier());
} else {
payDetail.setCustomerMobile("KBZ PAY");
payDetail.setCustomerMobile("KBZPay");
}
if(response.getResponse().getMmqrRef() != null) {

View File

@ -442,6 +442,8 @@ public class KPayRefund {
}
}
public static class CertificateDownloadRequest{
}
}

View File

@ -225,6 +225,16 @@ public class PrintUtils {
double amounts = Double.parseDouble(scaled.toString());
return formatter.format(amounts);
}
public String getSeparatorNumberFormat(long amount, boolean isDecimal) {
if (amount == 0) return isDecimal ? "0.00" : "0";
DecimalFormat formatter = new DecimalFormat(isDecimal ? "#,###.00" : "#,###");
int x = 2;
BigDecimal unscaled = new BigDecimal(amount);
BigDecimal scaled = unscaled.scaleByPowerOfTen(-x);
double amounts = Double.parseDouble(scaled.toString());
return formatter.format(amounts);
}
public String getSeparatorOnlyNumberFormat(long amount) {
if (amount == 0) return "0";

View File

@ -649,13 +649,15 @@ public abstract class BaseXPrint {
if (hostType == HostType.MPU || hostType == HostType.VISA_MASTER) {
print2ColumnsString("CARD NAME", "CARD NUMBER");
print2ColumnsString("EXP DATE", "TRACE NO");
print2ColumnsString("TRANSACTION", "AMOUNT");
print2ColumnsString("TRANSACTION", "");
print2ColumnsString("AMOUNT", "");
print2ColumnsString("REF NUM", "");
} else if (hostType == HostType.QR) {
print2ColumnsString("PAYMENT NAME", "");
print2ColumnsString("EXP DATE", "");
print2ColumnsString("TRANSACTION", "TRACE NO");
print2ColumnsString("TRXN ID", "AMOUNT");
print2ColumnsString("TRXN ID", "");
print2ColumnsString("AMOUNT", "");
}
@ -666,25 +668,26 @@ public abstract class BaseXPrint {
for (PayDetail pay : lists) {
boolean isNeedMinusSign = pay.getTransactionType() == TransactionsType.VOID.value || pay.getTransactionType() == TransactionsType.REFUND.value || pay.getTransactionType() == TransactionsType.MMQR_REFUND.value;
boolean isDecimalEnabled = SystemParamsOperation.getInstance().isQrDecimalEnable();
if (hostType == HostType.MPU || hostType == HostType.VISA_MASTER) {
print2ColumnsString(pay.getAccountType(), PrintUtils.getInstance().maskCardNumberPciDss(pay.getCardNo()));
print2ColumnsString("**/**", pay.getVoucherNo());
print2ColumnsString(pay.getTransType().replace("_", " "), isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount()) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount()));
print2ColumnsString(pay.getTransType().replace("_", " "), isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled));
print2ColumnsString(pay.getReferNo(), "");
} else if (hostType == HostType.QR) {
if (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value) {
print2ColumnsString("QR PAYMENT", "");
} else {
print2ColumnsString(pay.getCustomerMobile().toUpperCase(), "");
print2ColumnsString(pay.getCustomerMobile(), "");
}
print2ColumnsString("**/**", "");
print2ColumnsString(pay.getTransType().replace("_", " "), pay.getVoucherNo());
if (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value) {
print2ColumnsString(pay.getReferNo() + "(RRN)", isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount()) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount()));
print2ColumnsString(pay.getReferNo() + "(RRN)", isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled));
} else {
print2ColumnsString(pay.getQrTransId(), isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount()) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount()));
print2ColumnsString(pay.getQrTransId(), "");
print2ColumnsString(isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) , "");
}
}
@ -699,21 +702,20 @@ public abstract class BaseXPrint {
}
if (hostType == HostType.MPU || hostType == HostType.VISA_MASTER) {
boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable();
print2ColumnsString("MPU", "");
print2ColumnsString("CARD TYPE", "");
print3ColumnsString("", "COUNT", "AMT");
emptyLine(1);
print3ColumnsString("MPU", countStringFormat(lists.size()), "MMK " + PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount));
print3ColumnsString("MPU", countStringFormat(lists.size()), "MMK " + PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled));
} else if (hostType == HostType.QR) {
boolean isDecimalEnabled = SystemParamsOperation.getInstance().isQrDecimalEnable();
print2ColumnsString("PAYMENT", "");
print3ColumnsString("TYPE", "COUNT", "AMT");
emptyLine(1);
print3ColumnsString("QR PAY", countStringFormat(lists.size()), "MMK " + PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount));
print3ColumnsString("QR PAY", countStringFormat(lists.size()), "MMK " + PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled));
}
emptyLine(2);
}
protected void printQRSettlementTransDetail(List<PayDetail> lists) {
@ -806,9 +808,7 @@ public abstract class BaseXPrint {
emptyLine(0);
// printer.appendPrnStr("I AGREE TO PAY THE ABOVE TOTAL AMOUNT", fontSmall, AlignEnum.CENTER,false);
if (isQR) {
// printer.appendPrnStr("ACCORDING TO THE ISSUER AGREEMENT", fontSmall, AlignEnum.CENTER,false);
} else {
if (!isQR) {
printer.appendPrnStr("I AGREE TO PAY THE ABOVE TOTAL AMOUNT", fontSmall, AlignEnum.CENTER,false);
printer.appendPrnStr("ACCORDING TO THE CARD ISSUER AGREEMENT", fontSmall, AlignEnum.CENTER,false);
}
@ -818,7 +818,7 @@ public abstract class BaseXPrint {
} else {
printer.appendPrnStr("***** CUSTOMER COPY *****", fontSmall, AlignEnum.CENTER,false);
}
printer.appendPrnStr(finalVersion, fontSmall, AlignEnum.CENTER,false);
// printer.appendPrnStr(finalVersion, fontSmall, AlignEnum.CENTER,false);
printer.appendPrnStr(receiptFooter, fontSmall, AlignEnum.CENTER,false);
@ -885,11 +885,11 @@ public abstract class BaseXPrint {
if(TextUtils.equals(terminalName, "") || terminalName == null){
terminalName = "Terminal Name";
}
printer.appendPrnStr(receiptHeader, fontNormal, AlignEnum.CENTER,false);
emptyLine(1);
// printer.appendPrnStr(receiptHeader, fontNormal, AlignEnum.CENTER,false);
printer.appendPrnStr(terminalName, fontNormal, AlignEnum.CENTER, false);
printer.appendPrnStr(merchantAddress, fontNormal, AlignEnum.CENTER,false);
printer.appendPrnStr(merchantAddress2, fontNormal, AlignEnum.CENTER,false);
printer.appendPrnStr(terminalName, fontNormal, AlignEnum.LEFT, false);
// printer.appendPrnStr(merchantPhoneNo, fontNormal, AlignEnum.CENTER,false);
// emptyLine(1);
// dashBreak();
@ -982,6 +982,47 @@ public abstract class BaseXPrint {
}
protected void printTransHeader(PayDetail payDetail, HostType hostType) {
String invoiceNo = payDetail.getInvoiceNo().isEmpty() ? SystemParamsOperation.getInstance().getCurrentInvoiceNum() : payDetail.getInvoiceNo();
String transType = payDetail.getTransType();
String batchNum = "";
String traceNum = payDetail.getVoucherNo();
// String traceNum = SystemParamsOperation.getInstance().getCurrentSerialNum();
String shortCode = SystemParamsOperation.getInstance().getShortCode();
batchNum = payDetail.getBatchNo();
// printer.appendPrnStr("DATE :" + payDetail.getTransDate() + " TIME:" + payDetail.getTransTime(), fontNormal, AlignEnum.LEFT,false);
printer.appendPrnStr("DATE :" + POSUtil.getInstance().formatDisplayDate(payDetail.getTransDate()), fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("TIME :" + payDetail.getTransTime(), fontNormal, AlignEnum.LEFT, false);
if (payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == 1) {
printer.appendPrnStr("TRACE NO:" + traceNum + " INV NO:" + invoiceNo, fontNormal, AlignEnum.LEFT,false);
} else if (!payDetail.getTransType().equals(SETTLEMENT) && !payDetail.getTransType().equals(SUMMARY) && payDetail.getTransactionType() != TransactionsType.MMQR_REFUND.value && payDetail.getTransactionType() != TransactionsType.MMQR.value) {
printer.appendPrnStr("BTH NO :" + batchNum + " INV NO:" + invoiceNo, fontNormal, AlignEnum.LEFT,false);
} else if (payDetail.getTransType().equals(SUMMARY)) {
printer.appendPrnStr("HOST :" + HOST_NAME_MPU + "", fontNormal, AlignEnum.LEFT,false);
}
/* 17 Sept 2024 Yoma requested to changed slip design for QR*/
// printer.printColumnsString(new String[]{"MID :" + payDetail.getMerchantNo(), ""}, new int[]{3, 1}, new int[]{0, 2}, innerResultCallback);
// printer.printColumnsString(new String[]{"TID :" + payDetail.getTerminalNo(), ""}, new int[]{3, 1}, new int[]{0, 2}, innerResultCallback);
if (hostType == HostType.QR){
printer.appendPrnStr("SHORT CODE:" + shortCode, fontNormal, AlignEnum.LEFT,false);
}else{
printer.appendPrnStr("MID :" + payDetail.getMerchantNo(), fontNormal, AlignEnum.LEFT,false);
printer.appendPrnStr("TID :" + payDetail.getTerminalNo(), fontNormal, AlignEnum.LEFT,false);
}
emptyLine(1);
printer.appendPrnStr(transType.replace("_", " "),fontNormal, AlignEnum.CENTER,true);
if (!(payDetail.getQrTransStatus() != 1 && (payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value || payDetail.getTransactionType() == TransactionsType.MMQR.value))) {
printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false);
}
}
protected InnerResultCallback innerResultCallback = new InnerResultCallback() {
@Override
public void onRunResult(boolean isSuccess) throws RemoteException {

View File

@ -231,7 +231,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
setHeight(0x12);
printLogo();
printMerchantHeader();
printTransHeader(payDetail);
printTransHeader(payDetail, hostType);
printTransDetailReport(lists,hostType);
// emptyLine(1);
@ -311,7 +311,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
// payDetail.getCustomerMobile() // as channel type
if(payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == 1 ) {
print2ColumnsStringNoSpace("PAYMENT TYPE ",": "+ (payDetail.getCustomerMobile() == null || payDetail.getCustomerMobile().isEmpty() ? "-": payDetail.getCustomerMobile().toUpperCase()));
print2ColumnsStringNoSpace("PAYMENT TYPE ",": "+ (payDetail.getCustomerMobile() == null || payDetail.getCustomerMobile().isEmpty() ? "-": payDetail.getCustomerMobile()));
print2ColumnsStringNoSpace("TRXN REF ",": "+ payDetail.getReferNo());
if(payDetail.getQrReferNo() != null && !payDetail.getQrReferNo().isEmpty()) {
print2ColumnsStringNoSpace("MMQR REF ",": "+ payDetail.getQrReferNo());
@ -325,7 +325,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
print2ColumnsStringNoSpace("STATUS ",":"+ PrintUtils.getInstance().getQrTransStatus(payDetail.getQrTransStatus()));
} else if(payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == -1) {
print2ColumnsStringNoSpace("PAYMENT TYPE ",":"+ (payDetail.getCustomerMobile() == null || payDetail.getCustomerMobile().isEmpty() ? "-": payDetail.getCustomerMobile().toUpperCase()));
print2ColumnsStringNoSpace("PAYMENT TYPE ",":"+ (payDetail.getCustomerMobile() == null || payDetail.getCustomerMobile().isEmpty() ? "-": payDetail.getCustomerMobile()));
print2ColumnsStringNoSpace("TRXN REF ",":"+ payDetail.getReferNo());
print2ColumnsStringNoSpace("TXN TIME ",":"+ (payDetail.getOriginalTransDate() == null || payDetail.getOriginalTransDate().isEmpty() ? POSUtil.getInstance().getCurrentDateTimeForQR(): payDetail.getOriginalTransDate()));
}
@ -339,8 +339,10 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
if (payDetail.getQrTransStatus() == 1) {
boolean isNeedMinusSign = payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value;
boolean isQrDecimalEnable = SystemParamsOperation.getInstance().isQrDecimalEnable();
lineBreak();
print2ColumnsStringBoldCenter("TOTAL MMK", isNeedMinusSign? "- "+PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount()): PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount()),fontLarge, AlignEnum.LEFT);
print2ColumnsStringBoldCenter("TOTAL MMK", isNeedMinusSign? "- "+PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isQrDecimalEnable): PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isQrDecimalEnable),fontLarge, AlignEnum.LEFT);
lineBreak();
// if(payDetail.getTransactionType() == TransactionsType.MMQR.value) {

View File

@ -281,7 +281,7 @@ public class POSUtil {
if(payDetail != null) {
if(payDetail.getTransactionType() == TransactionsType.MMQR.value) {
return payDetail.getCustomerMobile().toUpperCase();
return payDetail.getCustomerMobile();
} else if(payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value) {
return "QR PAYMENT";
} else {
@ -555,7 +555,7 @@ public class POSUtil {
public String formatDisplayDate(String input){
SimpleDateFormat inputFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
SimpleDateFormat inputFormat = new SimpleDateFormat("dd/MM/yy", Locale.getDefault());
SimpleDateFormat outputFormat = new SimpleDateFormat("dd MMM yyyy", Locale.getDefault());
try {