From 997aa33d9897f802720b227f3012e1fbc1ac11be Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Tue, 21 Jul 2026 14:46:31 +0630 Subject: [PATCH] settlement detail changed --- CHANGELOG.md | 13 +- .../paylibs/print/printx/BaseXPrint.java | 173 +++++++++++++----- 2 files changed, 143 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9289af1..425c163 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## [2.12] - 06-05-2026 -- **Pinpad Sound Toggle** +- **Pin pad Sound Toggle** - Beep is ON by default - Can Toggle PinPad sound on Side Navigation ( Under SystemManagement Tab) @@ -49,4 +49,13 @@ ## [2.38] - 06-07-2026 - **General** - SETTLEMENT both in one click -- showing each transaction detail when SETTLE \ No newline at end of file +- showing each transaction detail when SETTLE +- +## [2.39] - 19-07-2026 +- **General** +- New E-receipt for settlement + +## [2.39] - +- **General** +- show total for each currency for duel currency +- void, pre-auth, cash adv, refund can now control from TMS for paper receipt \ No newline at end of file diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index 010c752..253acde 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -218,14 +218,24 @@ public abstract class BaseXPrint { printTransDetailSettlement(payDetail, cardSettleDataList); return; } + SystemParamsOperation sp = SystemParamsOperation.getInstance(); SettleData settleData = payDetail.getSettleDataObj(); print3ColumnsString("TRX TYPE ", "CNT", "AMOUNT"); print3ColumnsString("SALE ", countStringFormat(settleData.getSaleCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getSaleAmount(), SystemParamsOperation.getInstance().getDecimalEnable())); - print3ColumnsString("VOID SALE ", countStringFormat(settleData.getVoidSaleCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getVoidSaleAmount(), SystemParamsOperation.getInstance().getDecimalEnable())); - print3ColumnsString("PREAUTH COMP ", countStringFormat(settleData.getPreAuthCompCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getPreAuthCompAmount(), SystemParamsOperation.getInstance().getDecimalEnable())); - print3ColumnsString("CASH ADV ", countStringFormat(settleData.getCashAdvanceCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getCashAdvanceAmount(), SystemParamsOperation.getInstance().getDecimalEnable())); - print3ColumnsString("REFUND ", countStringFormat(settleData.getRefundCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getRefundAmount(), SystemParamsOperation.getInstance().getDecimalEnable())); + if(sp.getVoidStatus()){ + print3ColumnsString("VOID SALE ", countStringFormat(settleData.getVoidSaleCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getVoidSaleAmount(), SystemParamsOperation.getInstance().getDecimalEnable())); + } + if(sp.getPreAuthStatus()){ + print3ColumnsString("PREAUTH COMP ", countStringFormat(settleData.getPreAuthCompCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getPreAuthCompAmount(), SystemParamsOperation.getInstance().getDecimalEnable())); + } + if(sp.getCashAdvanceStatus()){ + print3ColumnsString("CASH ADV ", countStringFormat(settleData.getCashAdvanceCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getCashAdvanceAmount(), SystemParamsOperation.getInstance().getDecimalEnable())); + } + if(sp.getRefundStatus()){ + print3ColumnsString("REFUND ", countStringFormat(settleData.getRefundCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getRefundAmount(), SystemParamsOperation.getInstance().getDecimalEnable())); + } + dotBreak(); long totalAmount = settleData.getSaleAmount() + settleData.getPreAuthCompAmount() + settleData.getCashAdvanceAmount() - settleData.getVoidSaleAmount() - settleData.getRefundAmount(); @@ -254,23 +264,93 @@ public abstract class BaseXPrint { } dotBreak(); - SettleData settleData = payDetail.getSettleDataObj(); - long totalAmount = settleData.getSaleAmount() + settleData.getPreAuthCompAmount() + settleData.getCashAdvanceAmount() - - settleData.getVoidSaleAmount() - settleData.getRefundAmount(); + + boolean isDuelCurrency = SystemParamsOperation.getInstance().getDuelCurrencyStatus(); printer.appendPrnStr("GRAND TOTAL", fontLarge, AlignEnum.LEFT, true); emptyLine(1); - print3ColumnsString("TRX TYPE ", "CNT", "AMOUNT"); - print3ColumnsString("SALE ", countStringFormat(settleData.getSaleCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getSaleAmount(), isDecimalEnabled)); - print3ColumnsString("VOID SALE ", countStringFormat(settleData.getVoidSaleCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getVoidSaleAmount(), isDecimalEnabled)); - print3ColumnsString("PREAUTH COMP ", countStringFormat(settleData.getPreAuthCompCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getPreAuthCompAmount(), isDecimalEnabled)); - print3ColumnsString("CASH ADV ", countStringFormat(settleData.getCashAdvanceCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getCashAdvanceAmount(), isDecimalEnabled)); - print3ColumnsString("REFUND ", countStringFormat(settleData.getRefundCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getRefundAmount(), isDecimalEnabled)); - dotBreak(); - print2ColumnsString("TOTAL", PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled)); + + if (isDuelCurrency) { + Map currencyMap = buildCurrencySummaries(cardSettleDataList); + if (currencyMap.size() > 1) { + for (Map.Entry entry : currencyMap.entrySet()) { + printSettlementCurrencySection(entry.getKey(), entry.getValue()); + } + dotBreak(); + } else { + printSingleSettleSummary(cardSettleDataList, isDecimalEnabled); + } + } else { + printSingleSettleSummary(cardSettleDataList, isDecimalEnabled); + } emptyLine(1); } + private void printSingleSettleSummary(List cardSettleDataList, boolean isDecimalEnabled) { + Map currencyMap = buildCurrencySummaries(cardSettleDataList); + SystemParamsOperation sp = SystemParamsOperation.getInstance(); + if (currencyMap.size() == 1) { + Map.Entry entry = currencyMap.entrySet().iterator().next(); + printSettlementCurrencySection(entry.getKey(), entry.getValue()); + } else { + SettleData settleData = new SettleData(); + for (CardSettleData csd : cardSettleDataList) { + applyCardSettlementSummary(settleData, csd); + } + print3ColumnsString("TRX TYPE ", "CNT", "AMOUNT"); + print3ColumnsString("SALE ", countStringFormat(settleData.getSaleCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getSaleAmount(), isDecimalEnabled)); + if(sp.getVoidStatus()){ + print3ColumnsString("VOID SALE ", countStringFormat(settleData.getVoidSaleCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getVoidSaleAmount(), isDecimalEnabled)); + } + if(sp.getPreAuthStatus()){ + print3ColumnsString("PREAUTH COMP ", countStringFormat(settleData.getPreAuthCompCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getPreAuthCompAmount(), isDecimalEnabled)); + } + if(sp.getCashAdvanceStatus()){ + print3ColumnsString("CASH ADV ", countStringFormat(settleData.getCashAdvanceCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getCashAdvanceAmount(), isDecimalEnabled)); + } + if(sp.getRefundStatus()){ + print3ColumnsString("REFUND ", countStringFormat(settleData.getRefundCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getRefundAmount(), isDecimalEnabled)); + } + dotBreak(); + long totalAmount = settleData.getSaleAmount() + settleData.getPreAuthCompAmount() + settleData.getCashAdvanceAmount() + - settleData.getVoidSaleAmount() - settleData.getRefundAmount(); + print2ColumnsString("TOTAL", PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled)); + } + } + + private Map buildCurrencySummaries(List cardSettleDataList) { + Map currencyMap = new LinkedHashMap<>(); + for (CardSettleData csd : cardSettleDataList) { + String currency = normalizeSettlementCurrency(csd.getCurrencyCode()); + CurrencySettlementSummary summary = currencyMap.get(currency); + if (summary == null) { + summary = new CurrencySettlementSummary(); + currencyMap.put(currency, summary); + } + applyCardSettlementSummary(summary, csd); + } + return currencyMap; + } + + private void applyCardSettlementSummary(SettleData settleData, CardSettleData cardSettleData) { + String transType = cardSettleData.getTransType() == null ? "" : cardSettleData.getTransType().trim().toUpperCase(Locale.getDefault()); + long amount = cardSettleData.getAmount(); + + if ("SALE".equals(transType)) { + settleData.setSaleCount(settleData.getSaleCount() + 1); + settleData.setSaleAmount(settleData.getSaleAmount() + amount); + } else if ("PREAUTH COMPLETION".equals(transType) || "PRE_AUTH_COMPLETE".equals(transType)) { + settleData.setPreAuthCompCount(settleData.getPreAuthCompCount() + 1); + settleData.setPreAuthCompAmount(settleData.getPreAuthCompAmount() + amount); + } else if ("REFUND".equals(transType)) { + settleData.setRefundCount(settleData.getRefundCount() + 1); + settleData.setRefundAmount(settleData.getRefundAmount() + amount); + } else if ("CASH_OUT".equals(transType) || "CASH_ADVANCE".equals(transType)) { + settleData.setCashAdvanceCount(settleData.getCashAdvanceCount() + 1); + settleData.setCashAdvanceAmount(settleData.getCashAdvanceAmount() + amount); + } + } + protected void printMMQRReport(List qrList) { if (qrList == null || qrList.isEmpty()) return; @@ -319,18 +399,25 @@ public abstract class BaseXPrint { // return; // } boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable(); + SystemParamsOperation sp = SystemParamsOperation.getInstance(); int totalCount = summary.saleCount + summary.preAuthCompCount + summary.refundCount + summary.cashAdvanceCount; long totalAmount = summary.saleAmount + summary.preAuthCompAmount + summary.cashAdvanceAmount - summary.refundAmount; - + emptyLine(1); printString("CURRENCY : " + currencyLabel, true); print3ColumnsString("TRX TYPE ", "CNT", "AMOUNT"); print3ColumnsString("SALE ", countStringFormat(summary.saleCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.saleAmount, isDecimalEnabled)); - print3ColumnsString("PREAUTH COMP ", countStringFormat(summary.preAuthCompCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.preAuthCompAmount, isDecimalEnabled)); - if (summary.cashAdvanceCount != 0) { - print3ColumnsString("CASH ADVANCE ", countStringFormat(summary.cashAdvanceCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.cashAdvanceAmount, isDecimalEnabled)); + if(sp.getPreAuthStatus()){ + print3ColumnsString("PREAUTH COMP ", countStringFormat(summary.preAuthCompCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.preAuthCompAmount, isDecimalEnabled)); + } + if (summary.cashAdvanceCount != 0) { + if(sp.getCashAdvanceStatus()){ + print3ColumnsString("CASH ADV ", countStringFormat(summary.cashAdvanceCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.cashAdvanceAmount, isDecimalEnabled)); + } + } + if(sp.getRefundStatus()){ + print3ColumnsString("REFUND ", countStringFormat(summary.refundCount), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(summary.refundAmount, isDecimalEnabled)); } - print3ColumnsString("REFUND ", countStringFormat(summary.refundCount), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(summary.refundAmount, isDecimalEnabled)); print3ColumnsString("TOTAL(" + currencyLabel + ") ", countStringFormat(totalCount), PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled)); } @@ -969,6 +1056,8 @@ public abstract class BaseXPrint { return; } + SystemParamsOperation sp = SystemParamsOperation.getInstance(); + Map currencyMap = new HashMap<>(); for (PayDetail item : list) { @@ -1029,47 +1118,49 @@ public abstract class BaseXPrint { fontNormal, false); } - if (data.voidSaleCount > 0) { + if (data.voidSaleCount > 0 && sp.getVoidStatus()) { print3ColumnsStringWithAlign("(" + data.voidSaleCount + ")", "VOID", "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.voidSaleAmount, isDecimalEnabled), fontNormal, false); } - if (data.cashOutCount > 0) { + if (data.cashOutCount > 0 && sp.getCashAdvanceStatus()) { print3ColumnsStringWithAlign("(" + data.cashOutCount + ")", "CASH ADV", PrintUtils.getInstance().getSeparatorNumberFormat(data.cashOutAmount, isDecimalEnabled), fontNormal, false); } - if (data.preAuthSaleCount > 0) { - print3ColumnsStringWithAlign("(" + data.preAuthSaleCount + ")", - "PRE-AUTH", - PrintUtils.getInstance().getSeparatorNumberFormat(data.preAuthSaleAmount, isDecimalEnabled), - fontNormal, false); - } +// if (data.preAuthSaleCount > 0) { +// print3ColumnsStringWithAlign("(" + data.preAuthSaleCount + ")", +// "PRE-AUTH", +// PrintUtils.getInstance().getSeparatorNumberFormat(data.preAuthSaleAmount, isDecimalEnabled), +// fontNormal, false); +// } +// +// if (data.preAuthVoidCount > 0) { +// print3ColumnsStringWithAlign("(" + data.preAuthVoidCount + ")", +// "PREAUTH VOID", +// "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.preAuthVoidAmount, isDecimalEnabled), +// fontNormal, false); +// } - if (data.preAuthVoidCount > 0) { - print3ColumnsStringWithAlign("(" + data.preAuthVoidCount + ")", - "PREAUTH VOID", - "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.preAuthVoidAmount, isDecimalEnabled), - fontNormal, false); - } - if (data.refundCount > 0) { - print3ColumnsStringWithAlign("(" + data.refundCount + ")", - "REFUND", - "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.refundAmount, isDecimalEnabled), - fontNormal, false); - } - if (data.preAuthCompCount > 0) { + if (data.preAuthCompCount > 0 && sp.getPreAuthStatus()) { print3ColumnsStringWithAlign("(" + data.preAuthCompCount + ")", "PREAUTH COMP", PrintUtils.getInstance().getSeparatorNumberFormat(data.preAuthCompAmount, isDecimalEnabled), fontNormal, false); } + + if (data.refundCount > 0 && sp.getRefundStatus()) { + print3ColumnsStringWithAlign("(" + data.refundCount + ")", + "REFUND", + "- " + PrintUtils.getInstance().getSeparatorNumberFormat(data.refundAmount, isDecimalEnabled), + fontNormal, false); + } } dotBreak();