From 1aac919c47a40d93433bed772e3916019f0c3867 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Tue, 31 Mar 2026 21:24:58 +0630 Subject: [PATCH] duel currency fix for detail report --- .../res/layout/item_view_detail_report.xml | 29 ++++ .../paylibs/print/printx/BaseXPrint.java | 139 +++++++++++------- 2 files changed, 114 insertions(+), 54 deletions(-) diff --git a/app/src/main/res/layout/item_view_detail_report.xml b/app/src/main/res/layout/item_view_detail_report.xml index ca3e691..80a1ec1 100644 --- a/app/src/main/res/layout/item_view_detail_report.xml +++ b/app/src/main/res/layout/item_view_detail_report.xml @@ -77,6 +77,35 @@ tools:text="000045" /> + + + + + + + lists, HostType hostType) { - - if (hostType == HostType.MPU || hostType == HostType.VISA_MASTER) { - // Use the same line-by-line style as QR detail report - } else if (hostType == HostType.QR) { -// print2ColumnsString("PAYMENT NAME", ""); -// print2ColumnsString("DATE", "TIME"); -// print2ColumnsString("TRANSACTION", "TRACE NO"); -// print2ColumnsString("TRXN ID", ""); -// print2ColumnsString("AMOUNT", ""); + // ✅ Summary holder (total + count per currency) + class CurrencySummary { + long total = 0; + int count = 0; } - -// breakingLine(); - - long totalAmount = 0; + Map currencyMap = new HashMap<>(); 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(); + boolean isNeedMinusSign = + pay.getTransactionType() == TransactionsType.VOID.value || + pay.getTransactionType() == TransactionsType.REFUND.value || + pay.getTransactionType() == TransactionsType.MMQR_REFUND.value; + + boolean isDecimalEnabledQr = SystemParamsOperation.getInstance().isQrDecimalEnable(); + String currency = currencyCodeToText(pay.getCurrencyCode()); + + // ============================= + // PRINT DETAIL + // ============================= if (hostType == HostType.MPU || hostType == HostType.VISA_MASTER) { + boolean isDecimalEnabledCard = SystemParamsOperation.getInstance().getDecimalEnable(); + printString("CARD TYPE:" + pay.getAccountType()); printString("CARD NO :" + PrintUtils.getInstance().maskCardNumberPciDss(pay.getCardNo())); printString("TRACE NO :" + pay.getVoucherNo()); @@ -887,12 +895,11 @@ public abstract class BaseXPrint { printString("DATE :" + POSUtil.getInstance().formatDisplayDate(pay.getTransDate()) + " " + pay.getTransTime()); printString("TYPE :" + pay.getTransType().replace("_", " ")); printString("AMOUNT :" + - (isNeedMinusSign - ? "-" + PrintUtils.getInstance() - .getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabledCard) - : PrintUtils.getInstance() - .getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabledCard)) - + " " + "MMK"); + (isNeedMinusSign + ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabledCard) + : PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabledCard)) + + " " + currency); + dotBreak(); } else if (hostType == HostType.QR) { @@ -900,64 +907,88 @@ public abstract class BaseXPrint { printString("TRANS ID:" + pay.getQrTransId()); printString("STATUS :" + pay.getTC()); printString("SOURCE :" + - (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value - ? "QR PAYMENT" - : pay.getCustomerMobile()) - ); -// printString("TXN NAME:" + pay.getTransType().replace("_", " ")); + (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value + ? "QR PAYMENT" + : pay.getCustomerMobile())); printString("DATE :" + POSUtil.getInstance().formatDisplayDate(pay.getTransDate()) + " " + pay.getTransTime()); printString("TRACE NO:" + pay.getVoucherNo()); + if (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value) { printString("RRN :" + pay.getReferNo()); } + printString("AMOUNT :" + - (isNeedMinusSign - ? "-" + PrintUtils.getInstance() - .getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) - : PrintUtils.getInstance() - .getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled)) - + " " +"MMK"); + (isNeedMinusSign + ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabledQr) + : PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabledQr)) + + " " + currency); + dotBreak(); - -// if (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value) { -// print2ColumnsString("QR PAYMENT", ""); -// } else { -// print2ColumnsString(pay.getCustomerMobile(), ""); -// } -// print2ColumnsString(pay.getTransDate(), pay.getTransTime()); -// print2ColumnsString(pay.getTransType().replace("_", " "), pay.getVoucherNo()); -// if (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value) { -// print2ColumnsString(pay.getReferNo() + "(RRN)", ""); -// print2ColumnsString(isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled), ""); -// } else { -// print2ColumnsString(pay.getQrTransId(), ""); -// print2ColumnsString(isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) , ""); -// } - } emptyLine(1); + // ============================= + // ✅ ACCUMULATE TOTAL + COUNT PER CURRENCY + // ============================= + CurrencySummary summary = currencyMap.getOrDefault(currency, new CurrencySummary()); + if (isNeedMinusSign) { - totalAmount -= pay.getAmount(); + summary.total -= pay.getAmount(); } else { - totalAmount += pay.getAmount(); + summary.total += pay.getAmount(); } + + summary.count++; // ✅ count per currency + + currencyMap.put(currency, summary); } + // ============================= + // PRINT SUMMARY + // ============================= if (hostType == HostType.MPU || hostType == HostType.VISA_MASTER) { + boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable(); + print2ColumnsString("CARD", ""); print3ColumnsString("TYPE ", "COUNT", "AMOUNT"); - print3ColumnsString("CARD", " " + countStringFormat(lists.size()), "MMK " + PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled), true); + + for (Map.Entry entry : currencyMap.entrySet()) { + + String currency = entry.getKey(); + CurrencySummary summary = entry.getValue(); + + print3ColumnsString( + "CARD", + " " + countStringFormat(summary.count), + currency + " " + PrintUtils.getInstance() + .getSeparatorNumberFormat(summary.total, isDecimalEnabled), + true + ); + } + } else if (hostType == HostType.QR) { + boolean isDecimalEnabled = SystemParamsOperation.getInstance().isQrDecimalEnable(); + print2ColumnsString("PAYMENT", ""); print3ColumnsString("TYPE ", "COUNT", "AMOUNT"); -// emptyLine(1); - print3ColumnsString("QR PAY", " "+ countStringFormat(lists.size()), "MMK " + PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled), true); + + for (Map.Entry entry : currencyMap.entrySet()) { + + String currency = entry.getKey(); + CurrencySummary summary = entry.getValue(); + + print3ColumnsString( + "QR PAY", + " " + countStringFormat(summary.count), + currency + " " + PrintUtils.getInstance() + .getSeparatorNumberFormat(summary.total, isDecimalEnabled), + true + ); + } } -// emptyLine(2); } protected void printQRSettlementTransDetail(List lists) {