diff --git a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java index 7c8db08..81b9759 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java @@ -32,6 +32,7 @@ import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel; import com.utsmm.kbz.util.ecr.CoreUtils; import java.util.List; +import java.util.Locale; public class SettlementTransactionFragment extends DataBindingFragment implements DataBindingFragment.BackPressCallback{ @@ -54,6 +55,20 @@ public class SettlementTransactionFragment extends DataBindingFragment implement long refundAmount = 0; long caAmount = 0; + private static class CurrencyBucket { + int saleCount; + long saleAmount; + int preCount; + long preAmount; + int refundCount; + long refundAmount; + int caCount; + long caAmount; + } + + private final CurrencyBucket mmkBucket = new CurrencyBucket(); + private final CurrencyBucket usdBucket = new CurrencyBucket(); + @Override protected void initViewModel() { settlementViewModel = getFragmentScopeViewModel(SettlementViewModel.class); @@ -174,6 +189,7 @@ public class SettlementTransactionFragment extends DataBindingFragment implement caCount = payDetail.getSettleDataObj().getCashAdvanceCount(); caAmount = payDetail.getSettleDataObj().getCashAdvanceAmount(); + applyStoredCurrencyBreakdown(payDetail); settlementViewModel.isNoData.setValue(false); @@ -226,20 +242,24 @@ public class SettlementTransactionFragment extends DataBindingFragment implement if((transType == TransactionType.SALE || "SALE".equalsIgnoreCase(transName)) && !payDetail.isCanceled){ saleCount ++; saleAmount += payDetail.getAmount(); + addToCurrencyBucket(payDetail, BucketType.SALE); } else if((transType == TransactionType.PRE_SALE_COMPLETE || "PREAUTH COMPLETION".equalsIgnoreCase(transName) || "PRE_AUTH_COMPLETE".equalsIgnoreCase(transName)) && !payDetail.isCanceled){ preCount ++; preAmount += payDetail.getAmount(); + addToCurrencyBucket(payDetail, BucketType.PRE_AUTH_COMPLETE); } else if(transType == TransactionType.REFUND || "REFUND".equalsIgnoreCase(transName)){ refundCount ++; refundAmount += payDetail.getAmount(); + addToCurrencyBucket(payDetail, BucketType.REFUND); }else if(transType == TransactionType.CASH_ADVANCE || "CASH_OUT".equalsIgnoreCase(transName) || "CASH_ADVANCE".equalsIgnoreCase(transName)){ caCount ++; caAmount += payDetail.getAmount(); + addToCurrencyBucket(payDetail, BucketType.CASH_ADVANCE); } } long totalAmount = saleAmount + preAmount + caAmount; @@ -280,6 +300,8 @@ public class SettlementTransactionFragment extends DataBindingFragment implement preAmount = 0L; refundAmount = 0L; caAmount = 0L; + resetCurrencyBucket(mmkBucket); + resetCurrencyBucket(usdBucket); } private void setSettlementViewModelData(int saleCount,long saleAmount,int preCount,long preAmount,int refundCount,long refundAmount,int caCount,long caAmount) { @@ -291,6 +313,10 @@ public class SettlementTransactionFragment extends DataBindingFragment implement settlementViewModel.refund_amount.setValue(refundAmount); settlementViewModel.ca_count.setValue(caCount); settlementViewModel.ca_amount.setValue(caAmount); + settlementViewModel.sale_breakdown.setValue(buildBreakdownText(mmkBucket.saleCount, mmkBucket.saleAmount, usdBucket.saleCount, usdBucket.saleAmount)); + settlementViewModel.pre_breakdown.setValue(buildBreakdownText(mmkBucket.preCount, mmkBucket.preAmount, usdBucket.preCount, usdBucket.preAmount)); + settlementViewModel.refund_breakdown.setValue(buildBreakdownText(mmkBucket.refundCount, mmkBucket.refundAmount, usdBucket.refundCount, usdBucket.refundAmount)); + settlementViewModel.ca_breakdown.setValue(buildBreakdownText(mmkBucket.caCount, mmkBucket.caAmount, usdBucket.caCount, usdBucket.caAmount)); if(sharedViewModel.getTransMenu().getValue() == TransMenu.REVIEW_BATCH) { SettleData settleData = new SettleData(saleCount,saleAmount,preCount,preAmount,refundCount,refundAmount,caCount,caAmount); @@ -304,6 +330,116 @@ public class SettlementTransactionFragment extends DataBindingFragment implement } + private enum BucketType { + SALE, + PRE_AUTH_COMPLETE, + REFUND, + CASH_ADVANCE + } + + private void resetCurrencyBucket(CurrencyBucket bucket) { + bucket.saleCount = 0; + bucket.saleAmount = 0L; + bucket.preCount = 0; + bucket.preAmount = 0L; + bucket.refundCount = 0; + bucket.refundAmount = 0L; + bucket.caCount = 0; + bucket.caAmount = 0L; + } + + private void addToCurrencyBucket(PayDetail payDetail, BucketType bucketType) { + CurrencyBucket bucket = getCurrencyBucket(payDetail.getCurrencyCode()); + long amount = payDetail.getAmount(); + switch (bucketType) { + case SALE: + bucket.saleCount++; + bucket.saleAmount += amount; + break; + case PRE_AUTH_COMPLETE: + bucket.preCount++; + bucket.preAmount += amount; + break; + case REFUND: + bucket.refundCount++; + bucket.refundAmount += amount; + break; + case CASH_ADVANCE: + bucket.caCount++; + bucket.caAmount += amount; + break; + } + } + + private CurrencyBucket getCurrencyBucket(String currencyCode) { + return "USD".equals(normalizeCurrency(currencyCode)) ? usdBucket : mmkBucket; + } + + private void applyStoredCurrencyBreakdown(PayDetail payDetail) { + resetCurrencyBucket(mmkBucket); + resetCurrencyBucket(usdBucket); + + List cardSettleDataList = payDetail.getCardSettleData(); + if (cardSettleDataList != null && !cardSettleDataList.isEmpty()) { + for (com.utsmyanmar.paylibs.model.CardSettleData item : cardSettleDataList) { + applyStoredCardSettle(item); + } + return; + } + + String normalizedCurrency = normalizeCurrency(payDetail.getCurrencyCode()); + CurrencyBucket bucket = "USD".equals(normalizedCurrency) ? usdBucket : mmkBucket; + bucket.saleCount = saleCount; + bucket.saleAmount = saleAmount; + bucket.preCount = preCount; + bucket.preAmount = preAmount; + bucket.refundCount = refundCount; + bucket.refundAmount = refundAmount; + bucket.caCount = caCount; + bucket.caAmount = caAmount; + } + + private void applyStoredCardSettle(com.utsmyanmar.paylibs.model.CardSettleData item) { + CurrencyBucket bucket = getCurrencyBucket(item.getCurrencyCode()); + String transType = item.getTransType() == null ? "" : item.getTransType().trim().toUpperCase(Locale.getDefault()); + + if ("SALE".equals(transType)) { + bucket.saleCount++; + bucket.saleAmount += item.getAmount(); + } else if ("PREAUTH COMPLETION".equals(transType) || "PRE_AUTH_COMPLETE".equals(transType)) { + bucket.preCount++; + bucket.preAmount += item.getAmount(); + } else if ("REFUND".equals(transType)) { + bucket.refundCount++; + bucket.refundAmount += item.getAmount(); + } else if ("CASH_OUT".equals(transType) || "CASH_ADVANCE".equals(transType)) { + bucket.caCount++; + bucket.caAmount += item.getAmount(); + } + } + + private String buildBreakdownText(int mmkCount, long mmkAmount, int usdCount, long usdAmount) { + return "MMK " + mmkCount + " / " + POSUtil.getInstance().getDecimalAmountSeparatorFormat(mmkAmount) + + " USD " + usdCount + " / " + POSUtil.getInstance().getDecimalAmountSeparatorFormat(usdAmount); + } + + private String normalizeCurrency(String currencyCode) { + if (currencyCode == null) { + return "MMK"; + } + + String value = currencyCode.trim().toUpperCase(Locale.getDefault()); + switch (value) { + case "840": + case "USD": + return "USD"; + case "104": + case "MMK": + default: + return "MMK"; + } + } + private void navigateMainScreen(){ routeId = R.id.action_settlementTransactionFragment_to_nav_main; diff --git a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java index 0dbf281..d0746f1 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java @@ -75,15 +75,19 @@ public class SettlementViewModel extends ViewModel { public SingleLiveEvent sale_count = new SingleLiveEvent<>(); public SingleLiveEvent sale_amount = new SingleLiveEvent<>(); + public SingleLiveEvent sale_breakdown = new SingleLiveEvent<>(); public SingleLiveEvent pre_count = new SingleLiveEvent<>(); public SingleLiveEvent pre_amount = new SingleLiveEvent<>(); + public SingleLiveEvent pre_breakdown = new SingleLiveEvent<>(); public SingleLiveEvent refund_count = new SingleLiveEvent<>(); public SingleLiveEvent refund_amount = new SingleLiveEvent<>(); + public SingleLiveEvent refund_breakdown = new SingleLiveEvent<>(); public SingleLiveEvent ca_count = new SingleLiveEvent<>(); public SingleLiveEvent ca_amount = new SingleLiveEvent<>(); + public SingleLiveEvent ca_breakdown = new SingleLiveEvent<>(); public SingleLiveEvent settlementType = new SingleLiveEvent<>(); @@ -117,12 +121,16 @@ public class SettlementViewModel extends ViewModel { sale_count.setValue(0); sale_amount.setValue(0L); + sale_breakdown.setValue(""); pre_count.setValue(0); pre_amount.setValue(0L); + pre_breakdown.setValue(""); refund_count.setValue(0); refund_amount.setValue(0L); + refund_breakdown.setValue(""); ca_count.setValue(0); ca_amount.setValue(0L); + ca_breakdown.setValue(""); isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.BOTH_HEADER_TPDU,HostName.BPC) .build(); diff --git a/app/src/main/res/layout/fragment_view_batch_screen.xml b/app/src/main/res/layout/fragment_view_batch_screen.xml index 3b9329b..7643b27 100644 --- a/app/src/main/res/layout/fragment_view_batch_screen.xml +++ b/app/src/main/res/layout/fragment_view_batch_screen.xml @@ -74,41 +74,56 @@ android:layout_marginTop="19dp" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal" + android:orientation="vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - + android:orientation="horizontal"> + + + + + + + - - + android:text="@{settleViewModel.sale_breakdown}" + android:textColor="@color/colorTextContent" + android:textSize="12sp" + tools:text="MMK 2 / 10,000.00 USD 1 / 25.00" /> @@ -122,41 +137,56 @@ android:layout_marginTop="19dp" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal" + android:orientation="vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - + android:orientation="horizontal"> + + + + + + + - - + android:text="@{settleViewModel.pre_breakdown}" + android:textColor="@color/colorTextContent" + android:textSize="12sp" + tools:text="MMK 1 / 8,000.00 USD 1 / 15.00" /> @@ -170,42 +200,56 @@ android:layout_marginTop="19dp" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal" + android:orientation="vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - + android:orientation="horizontal"> + + + + + + + - - + android:text="@{settleViewModel.refund_breakdown}" + android:textColor="@color/colorTextContent" + android:textSize="12sp" + tools:text="MMK 0 / 0.00 USD 1 / 10.00" /> @@ -219,43 +263,57 @@ android:layout_marginTop="19dp" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal" + android:orientation="vertical" android:visibility="@{settleViewModel.ca_count > 0 ? 0 : 8}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - + android:orientation="horizontal"> + + + + + + + - - + android:text="@{settleViewModel.ca_breakdown}" + android:textColor="@color/colorTextContent" + android:textSize="12sp" + tools:text="MMK 1 / 5,000.00 USD 0 / 0.00" /> diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/model/CardSettleData.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/model/CardSettleData.java index 29105c7..c06a2f5 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/model/CardSettleData.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/model/CardSettleData.java @@ -11,6 +11,7 @@ public class CardSettleData implements Serializable { private String expDate; private String invoiceNum; private String transType; + private String currencyCode; private long amount; @@ -22,12 +23,13 @@ public class CardSettleData implements Serializable { public CardSettleData() { } - public CardSettleData(String cardType, String cardNum, String expDate, String invoiceNum, String transType, long amount, String transDate, String transTime, String approvalCode) { + public CardSettleData(String cardType, String cardNum, String expDate, String invoiceNum, String transType, String currencyCode, long amount, String transDate, String transTime, String approvalCode) { this.cardType = cardType; this.cardNum = cardNum; this.expDate = expDate; this.invoiceNum = invoiceNum; this.transType = transType; + this.currencyCode = currencyCode; this.amount = amount; this.transDate = transDate; this.transTime = transTime; @@ -54,6 +56,10 @@ public class CardSettleData implements Serializable { this.transType = transType; } + public void setCurrencyCode(String currencyCode) { + this.currencyCode = currencyCode; + } + public void setAmount(long amount) { this.amount = amount; } @@ -86,6 +92,10 @@ public class CardSettleData implements Serializable { return transType; } + public String getCurrencyCode() { + return currencyCode; + } + public long getAmount() { return amount; } @@ -115,6 +125,7 @@ public class CardSettleData implements Serializable { cardSettleData.setExpDate(pay.getEXPDate()); cardSettleData.setInvoiceNum(pay.getInvoiceNo()); cardSettleData.setTransType(pay.getTransType()); + cardSettleData.setCurrencyCode(pay.getCurrencyCode()); cardSettleData.setAmount(pay.getAmount()); cardSettleData.setTransDate(pay.getTransDate()); cardSettleData.setTransTime(pay.getTransTime()); 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 a37416d..5c1d487 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 @@ -212,23 +212,34 @@ public abstract class BaseXPrint { } protected void printTransDetailSettlement(PayDetail payDetail) { - - SettleData settleData = payDetail.getSettleDataObj(); - int totalCount = settleData.getSaleCount() + settleData.getPreAuthCompCount() + settleData.getRefundCount() + settleData.getCashAdvanceCount(); - long totalAmount = settleData.getSaleAmount() + settleData.getPreAuthCompAmount() + settleData.getCashAdvanceAmount(); + List cardSettleDataList = payDetail.getCardSettleData(); + CurrencySettlementSummary mmkSummary = new CurrencySettlementSummary(); + CurrencySettlementSummary usdSummary = new CurrencySettlementSummary(); - print3ColumnsString("TRX TYPE ", "CNT", "AMOUNT"); - print3ColumnsString("SALE ", countStringFormat(settleData.getSaleCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getSaleAmount())); - print3ColumnsString("PREAUTH COMP ", countStringFormat(settleData.getPreAuthCompCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getPreAuthCompAmount())); - if (settleData.getCashAdvanceCount() != 0) - print3ColumnsString("CASH ADVANCE ", countStringFormat(settleData.getCashAdvanceCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getCashAdvanceAmount())); - print3ColumnsString("REFUND ", countStringFormat(settleData.getRefundCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getRefundAmount())); - print3ColumnsString("TOTAL"+ "(" + "MMK" +")" + " ", countStringFormat(totalCount), PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount)); + if (cardSettleDataList != null && !cardSettleDataList.isEmpty()) { + for (CardSettleData cardSettleData : cardSettleDataList) { + CurrencySettlementSummary summary = "USD".equals(normalizeSettlementCurrency(cardSettleData.getCurrencyCode())) ? usdSummary : mmkSummary; + applyCardSettlementSummary(summary, cardSettleData); + } + } else { + mmkSummary.saleCount = settleData.getSaleCount(); + mmkSummary.saleAmount = settleData.getSaleAmount(); + mmkSummary.preAuthCompCount = settleData.getPreAuthCompCount(); + mmkSummary.preAuthCompAmount = settleData.getPreAuthCompAmount(); + mmkSummary.refundCount = settleData.getRefundCount(); + mmkSummary.refundAmount = settleData.getRefundAmount(); + mmkSummary.cashAdvanceCount = settleData.getCashAdvanceCount(); + mmkSummary.cashAdvanceAmount = settleData.getCashAdvanceAmount(); + } + + printSettlementCurrencySection("MMK", mmkSummary); + if (usdSummary.hasAnyValue()) { + emptyLine(1); + printSettlementCurrencySection("USD", usdSummary); + } emptyLine(2); - - } protected void printTransDetailSettlement(PayDetail payDetail, List cardSettleDataList) { @@ -276,6 +287,72 @@ public abstract class BaseXPrint { } + private void printSettlementCurrencySection(String currencyLabel, CurrencySettlementSummary summary) { + if (!summary.hasAnyValue()) { + return; + } + + int totalCount = summary.saleCount + summary.preAuthCompCount + summary.refundCount + summary.cashAdvanceCount; + long totalAmount = summary.saleAmount + summary.preAuthCompAmount + summary.cashAdvanceAmount - summary.refundAmount; + + printString("CURRENCY : " + currencyLabel, true); + print3ColumnsString("TRX TYPE ", "CNT", "AMOUNT"); + print3ColumnsString("SALE ", countStringFormat(summary.saleCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.saleAmount)); + print3ColumnsString("PREAUTH COMP ", countStringFormat(summary.preAuthCompCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.preAuthCompAmount)); + if (summary.cashAdvanceCount != 0) { + print3ColumnsString("CASH ADVANCE ", countStringFormat(summary.cashAdvanceCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.cashAdvanceAmount)); + } + print3ColumnsString("REFUND ", countStringFormat(summary.refundCount), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(summary.refundAmount)); + print3ColumnsString("TOTAL(" + currencyLabel + ")", countStringFormat(totalCount), PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount)); + } + + private void applyCardSettlementSummary(CurrencySettlementSummary summary, CardSettleData cardSettleData) { + String transType = cardSettleData.getTransType() == null ? "" : cardSettleData.getTransType().trim().toUpperCase(Locale.getDefault()); + long amount = cardSettleData.getAmount(); + + if ("SALE".equals(transType)) { + summary.saleCount++; + summary.saleAmount += amount; + } else if ("PREAUTH COMPLETION".equals(transType) || "PRE_AUTH_COMPLETE".equals(transType)) { + summary.preAuthCompCount++; + summary.preAuthCompAmount += amount; + } else if ("REFUND".equals(transType)) { + summary.refundCount++; + summary.refundAmount += amount; + } else if ("CASH_OUT".equals(transType) || "CASH_ADVANCE".equals(transType)) { + summary.cashAdvanceCount++; + summary.cashAdvanceAmount += amount; + } + } + + private String normalizeSettlementCurrency(String currencyCode) { + if (currencyCode == null) { + return "MMK"; + } + + String value = currencyCode.trim().toUpperCase(Locale.getDefault()); + if ("840".equals(value) || "USD".equals(value)) { + return "USD"; + } + return "MMK"; + } + + private static class CurrencySettlementSummary { + int saleCount; + long saleAmount; + int preAuthCompCount; + long preAuthCompAmount; + int refundCount; + long refundAmount; + int cashAdvanceCount; + long cashAdvanceAmount; + + boolean hasAnyValue() { + return saleCount > 0 || preAuthCompCount > 0 || refundCount > 0 || cashAdvanceCount > 0 + || saleAmount > 0 || preAuthCompAmount > 0 || refundAmount > 0 || cashAdvanceAmount > 0; + } + } + private String currencyCodeToText(String currencyCode) { String currencyText = "MMK";