settlement fix

This commit is contained in:
moon 2026-06-18 11:12:12 +06:30
parent 2dd686d513
commit 0289013a58
4 changed files with 182 additions and 137 deletions

View File

@ -54,10 +54,12 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
int preCount = 0;
int refundCount = 0;
int caCount = 0;
int voidCount = 0;
long saleAmount = 0;
long preAmount = 0;
long refundAmount = 0;
long caAmount = 0;
long voidAmount = 0;
private final CurrencyBucket mmkBucket = new CurrencyBucket();
private final CurrencyBucket usdBucket = new CurrencyBucket();
@ -279,8 +281,20 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
settlementViewModel.getDeleteTrans(SystemParamsOperation.getInstance().getCurrentBatchNum()).observe(getViewLifecycleOwner(), new Observer<List<PayDetail>>() {
@Override
public void onChanged(List<PayDetail> payDetails) {
settlementViewModel.deleteTrans.clear();
voidCount = 0;
voidAmount = 0L;
if(payDetails != null) {
settlementViewModel.deleteTrans.addAll(payDetails);
for (PayDetail pay : payDetails) {
if (pay.getTransactionType() == TransactionType.VOID && !pay.isCanceled) {
voidCount++;
voidAmount += pay.getAmount();
}
}
if (voidCount > 0 && Boolean.TRUE.equals(settlementViewModel.isNoData.getValue())) {
settlementViewModel.isNoData.setValue(false);
}
}
}
});
@ -291,10 +305,12 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
preCount = 0;
refundCount = 0;
caCount = 0;
voidCount = 0;
saleAmount = 0L;
preAmount = 0L;
refundAmount = 0L;
caAmount = 0L;
voidAmount = 0L;
resetCurrencyBucket(mmkBucket);
resetCurrencyBucket(usdBucket);
}

View File

@ -271,7 +271,12 @@ public class SettlementViewModel extends ViewModel {
this.isLast = isLast;
SystemParamsOperation.getInstance().getIncrementBatchNo();
if(SystemParamsOperation.getInstance().getDemoStatus()) {
boolean bucketIsEmpty = currencyBucket.saleCount == 0
&& currencyBucket.preCount == 0
&& currencyBucket.refundCount == 0
&& currencyBucket.caCount == 0;
if (bucketIsEmpty || SystemParamsOperation.getInstance().getDemoStatus()) {
requestDemoProcessSettlement(currencyBucket);
} else {
requestOnlineProcessSettlement(currencyBucket);
@ -318,7 +323,9 @@ public class SettlementViewModel extends ViewModel {
payDetail.setSettleList(currencyBucket.saleCount+ ":" + currencyBucket.saleAmount + "-" + currencyBucket.caCount + ":" + currencyBucket.caAmount + "-" + currencyBucket.refundCount + ":" + currencyBucket.refundAmount + "-" + currencyBucket.preCount + ":" + currencyBucket.preAmount); // for print receipt
/*POS*/
SettleData settleData = new SettleData(currencyBucket.saleCount, currencyBucket.saleAmount, currencyBucket.preCount, currencyBucket.preAmount, currencyBucket.refundCount, currencyBucket.refundAmount, currencyBucket.caCount, currencyBucket.caAmount);
enrichSettleDataWithVoids(settleData);
payDetail.setSettleDataObj(settleData);
payDetail.setCardSettleData(CardSettleData.convertFromPayDetail(buildCardPayDetailList()));
long totalAmount = currencyBucket.saleAmount + currencyBucket.preAmount + currencyBucket.refundAmount + currencyBucket.caAmount;
@ -409,10 +416,9 @@ public class SettlementViewModel extends ViewModel {
payDetail.setSettleList(currencyBucket.saleCount+ ":" + currencyBucket.saleAmount + "-" + currencyBucket.caCount + ":" + currencyBucket.caAmount + "-" + currencyBucket.refundCount + ":" + currencyBucket.refundAmount + "-" + currencyBucket.preCount + ":" + currencyBucket.preAmount); // for print receipt
/*POS*/
SettleData settleData = new SettleData(currencyBucket.saleCount, currencyBucket.saleAmount, currencyBucket.preCount, currencyBucket.preAmount, currencyBucket.refundCount, currencyBucket.refundAmount, currencyBucket.caCount, currencyBucket.caAmount);
enrichSettleDataWithVoids(settleData);
payDetail.setSettleDataObj(settleData);
if(payDetails != null)
payDetail.setCardSettleData(CardSettleData.convertFromPayDetail(payDetails));
payDetail.setCardSettleData(CardSettleData.convertFromPayDetail(buildCardPayDetailList()));
if(hostName == HostName.BPC) {
long totalAmount = currencyBucket.saleAmount + currencyBucket.preAmount + currencyBucket.refundAmount + currencyBucket.caAmount;
@ -539,6 +545,31 @@ public class SettlementViewModel extends ViewModel {
});
}
private void enrichSettleDataWithVoids(SettleData settleData) {
for (PayDetail pay : deleteTrans) {
if (pay.getTransactionType() == TransactionType.VOID && !pay.isCanceled) {
settleData.setVoidSaleCount(settleData.getVoidSaleCount() + 1);
settleData.setVoidSaleAmount(settleData.getVoidSaleAmount() + pay.getAmount());
} else if (pay.getTransactionType() == TransactionType.SALE && pay.isCanceled) {
settleData.setSaleCount(settleData.getSaleCount() + 1);
settleData.setSaleAmount(settleData.getSaleAmount() + pay.getAmount());
}
}
}
private List<PayDetail> buildCardPayDetailList() {
List<PayDetail> list = new ArrayList<>();
if (payDetails != null) list.addAll(payDetails);
for (PayDetail pay : deleteTrans) {
if (pay.getTransactionType() == TransactionType.VOID && !pay.isCanceled) {
list.add(pay);
} else if (pay.getTransactionType() == TransactionType.SALE && pay.isCanceled) {
list.add(pay);
}
}
return list;
}
private void batchUploadProcess(boolean isLast) {
resultString.postValue(TransactionStatus.ON_BATCH_UPLOAD);

View File

@ -255,35 +255,28 @@ public abstract class BaseXPrint {
for (CardSettleData cardSettleData : cardSettleDataList) {
print2SideStringMargin(cardSettleData.getCardType(), PrintUtils.getInstance().maskCardNumberPciDss(cardSettleData.getCardNum()));
print2SideStringMargin("XX/XX",cardSettleData.getInvoiceNum());
print2SideStringMargin(cardSettleData.getTransType(),"MMK "+PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isDecimalEnabled));
print2SideStringMargin("INV NO", cardSettleData.getInvoiceNum());
String cardCurrency = currencyCodeToText(cardSettleData.getCurrencyCode());
print2SideStringMargin(cardSettleData.getTransType(), cardCurrency + " " + PrintUtils.getInstance().getSeparatorNumberFormat(cardSettleData.getAmount(), isDecimalEnabled));
print2SideStringMargin(cardSettleData.getApprovalCode(), cardSettleData.getTransDate() + " " + cardSettleData.getTransTime());
emptyLine(1);
}
lineBreak();
SettleData settleData = payDetail.getSettleDataObj();
int totalCount = settleData.getSaleCount() + settleData.getPreAuthCompCount() + settleData.getRefundCount() + settleData.getCashAdvanceCount();
long totalAmount = settleData.getSaleAmount() + settleData.getPreAuthCompAmount() + settleData.getCashAdvanceAmount();
long totalAmount = settleData.getSaleAmount() + settleData.getPreAuthCompAmount() + settleData.getCashAdvanceAmount()
- settleData.getVoidSaleAmount() - settleData.getRefundAmount();
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));
if (settleData.getCashAdvanceCount() != 0)
print3ColumnsString("CASH ADV ", countStringFormat(settleData.getCashAdvanceCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getCashAdvanceAmount(), isDecimalEnabled));
print3ColumnsString("REFUND ", countStringFormat(settleData.getRefundCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getRefundAmount(), isDecimalEnabled));
emptyLine(1);
printer.appendPrnStr("GRAND TOTAL", fontLarge, AlignEnum.LEFT, true);
emptyLine(1);
// print3ColumnsString("TOTAL(MMK) ", countStringFormat(totalCount), PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount));
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("VOID SALE ", countStringFormat(settleData.getVoidSaleCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getVoidSaleAmount(), isDecimalEnabled));
print3ColumnsString("PREAUTH COMP ", countStringFormat(settleData.getPreAuthCompCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getPreAuthCompAmount(), isDecimalEnabled));
if (settleData.getCashAdvanceCount() != 0)
print3ColumnsString("CASH ADV ", countStringFormat(settleData.getCashAdvanceCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getCashAdvanceAmount(), isDecimalEnabled));
print3ColumnsString("REFUND ", countStringFormat(settleData.getRefundCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getRefundAmount(), isDecimalEnabled));
dotBreak();
print3ColumnsString("TOTAL ", "", PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled));
emptyLine(2);
@ -390,6 +383,7 @@ public abstract class BaseXPrint {
}
protected void printTransFooterForSettlement() {
String receiptFooter = SystemParamsOperation.getInstance().getReceiptFooter();
String finalVersion = SystemParamsOperation.getInstance().getFinalVersion();
@ -436,7 +430,6 @@ public abstract class BaseXPrint {
// }
boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable();
if (payDetail.getTradeAnswerCode().equals("00") || payDetail.getTradeAnswerCode().equals("000")) {
if (payDetail.getTransactionType() == TransactionType.CASH_ADVANCE) {
@ -1144,7 +1137,6 @@ public abstract class BaseXPrint {
}
protected void print3ColumnsString(String first, String second, String third) {
// printer.appendPrnStr(first + " " + second + " " + third, fontNormal, AlignEnum.LEFT,false);
printer.appendPrnStr(first + " " + second + " " + third, fontNormal, AlignEnum.LEFT, false);
@ -1168,6 +1160,7 @@ public abstract class BaseXPrint {
long total = 0;
int count = 0;
}
protected void printTransDetailReport(List<PayDetail> lists, HostType hostType) {
// ✅ Summary holder (total + count per currency)
@ -1552,7 +1545,6 @@ public abstract class BaseXPrint {
emptyLine(4);
}
protected void startPrintNex() {
@ -1667,6 +1659,7 @@ public abstract class BaseXPrint {
dotBreak();
}
protected void printTransHeader(PayDetail payDetail, HostType hostType) {
String invoiceNo = payDetail.getInvoiceNo().isEmpty() ? SystemParamsOperation.getInstance().getCurrentInvoiceNum() : payDetail.getInvoiceNo();
String transType = payDetail.getTransType();

View File

@ -192,7 +192,12 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
printLogo();
printMerchantHeader();
printTransHeader(payDetail);
List<com.utsmyanmar.paylibs.model.CardSettleData> cardSettleDataList = payDetail.getCardSettleData();
if (cardSettleDataList != null && !cardSettleDataList.isEmpty()) {
printTransDetailSettlement(payDetail, cardSettleDataList);
} else {
printTransDetailSettlement(payDetail);
}
// printTransFooterSummary();
printTransFooterForSettlement();