settlement fix

This commit is contained in:
moon 2026-03-31 12:58:15 +06:30
parent 07227ca9bb
commit aabab54048
5 changed files with 410 additions and 120 deletions

View File

@ -32,6 +32,7 @@ import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel;
import com.utsmm.kbz.util.ecr.CoreUtils; import com.utsmm.kbz.util.ecr.CoreUtils;
import java.util.List; import java.util.List;
import java.util.Locale;
public class SettlementTransactionFragment extends DataBindingFragment implements DataBindingFragment.BackPressCallback{ public class SettlementTransactionFragment extends DataBindingFragment implements DataBindingFragment.BackPressCallback{
@ -54,6 +55,20 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
long refundAmount = 0; long refundAmount = 0;
long caAmount = 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 @Override
protected void initViewModel() { protected void initViewModel() {
settlementViewModel = getFragmentScopeViewModel(SettlementViewModel.class); settlementViewModel = getFragmentScopeViewModel(SettlementViewModel.class);
@ -174,6 +189,7 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
caCount = payDetail.getSettleDataObj().getCashAdvanceCount(); caCount = payDetail.getSettleDataObj().getCashAdvanceCount();
caAmount = payDetail.getSettleDataObj().getCashAdvanceAmount(); caAmount = payDetail.getSettleDataObj().getCashAdvanceAmount();
applyStoredCurrencyBreakdown(payDetail);
settlementViewModel.isNoData.setValue(false); settlementViewModel.isNoData.setValue(false);
@ -226,20 +242,24 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
if((transType == TransactionType.SALE || "SALE".equalsIgnoreCase(transName)) && !payDetail.isCanceled){ if((transType == TransactionType.SALE || "SALE".equalsIgnoreCase(transName)) && !payDetail.isCanceled){
saleCount ++; saleCount ++;
saleAmount += payDetail.getAmount(); saleAmount += payDetail.getAmount();
addToCurrencyBucket(payDetail, BucketType.SALE);
} else if((transType == TransactionType.PRE_SALE_COMPLETE } else if((transType == TransactionType.PRE_SALE_COMPLETE
|| "PREAUTH COMPLETION".equalsIgnoreCase(transName) || "PREAUTH COMPLETION".equalsIgnoreCase(transName)
|| "PRE_AUTH_COMPLETE".equalsIgnoreCase(transName)) && !payDetail.isCanceled){ || "PRE_AUTH_COMPLETE".equalsIgnoreCase(transName)) && !payDetail.isCanceled){
preCount ++; preCount ++;
preAmount += payDetail.getAmount(); preAmount += payDetail.getAmount();
addToCurrencyBucket(payDetail, BucketType.PRE_AUTH_COMPLETE);
} }
else if(transType == TransactionType.REFUND || "REFUND".equalsIgnoreCase(transName)){ else if(transType == TransactionType.REFUND || "REFUND".equalsIgnoreCase(transName)){
refundCount ++; refundCount ++;
refundAmount += payDetail.getAmount(); refundAmount += payDetail.getAmount();
addToCurrencyBucket(payDetail, BucketType.REFUND);
}else if(transType == TransactionType.CASH_ADVANCE }else if(transType == TransactionType.CASH_ADVANCE
|| "CASH_OUT".equalsIgnoreCase(transName) || "CASH_OUT".equalsIgnoreCase(transName)
|| "CASH_ADVANCE".equalsIgnoreCase(transName)){ || "CASH_ADVANCE".equalsIgnoreCase(transName)){
caCount ++; caCount ++;
caAmount += payDetail.getAmount(); caAmount += payDetail.getAmount();
addToCurrencyBucket(payDetail, BucketType.CASH_ADVANCE);
} }
} }
long totalAmount = saleAmount + preAmount + caAmount; long totalAmount = saleAmount + preAmount + caAmount;
@ -280,6 +300,8 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
preAmount = 0L; preAmount = 0L;
refundAmount = 0L; refundAmount = 0L;
caAmount = 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) { 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.refund_amount.setValue(refundAmount);
settlementViewModel.ca_count.setValue(caCount); settlementViewModel.ca_count.setValue(caCount);
settlementViewModel.ca_amount.setValue(caAmount); 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) { if(sharedViewModel.getTransMenu().getValue() == TransMenu.REVIEW_BATCH) {
SettleData settleData = new SettleData(saleCount,saleAmount,preCount,preAmount,refundCount,refundAmount,caCount,caAmount); 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<com.utsmyanmar.paylibs.model.CardSettleData> 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(){ private void navigateMainScreen(){
routeId = R.id.action_settlementTransactionFragment_to_nav_main; routeId = R.id.action_settlementTransactionFragment_to_nav_main;

View File

@ -75,15 +75,19 @@ public class SettlementViewModel extends ViewModel {
public SingleLiveEvent<Integer> sale_count = new SingleLiveEvent<>(); public SingleLiveEvent<Integer> sale_count = new SingleLiveEvent<>();
public SingleLiveEvent<Long> sale_amount = new SingleLiveEvent<>(); public SingleLiveEvent<Long> sale_amount = new SingleLiveEvent<>();
public SingleLiveEvent<String> sale_breakdown = new SingleLiveEvent<>();
public SingleLiveEvent<Integer> pre_count = new SingleLiveEvent<>(); public SingleLiveEvent<Integer> pre_count = new SingleLiveEvent<>();
public SingleLiveEvent<Long> pre_amount = new SingleLiveEvent<>(); public SingleLiveEvent<Long> pre_amount = new SingleLiveEvent<>();
public SingleLiveEvent<String> pre_breakdown = new SingleLiveEvent<>();
public SingleLiveEvent<Integer> refund_count = new SingleLiveEvent<>(); public SingleLiveEvent<Integer> refund_count = new SingleLiveEvent<>();
public SingleLiveEvent<Long> refund_amount = new SingleLiveEvent<>(); public SingleLiveEvent<Long> refund_amount = new SingleLiveEvent<>();
public SingleLiveEvent<String> refund_breakdown = new SingleLiveEvent<>();
public SingleLiveEvent<Integer> ca_count = new SingleLiveEvent<>(); public SingleLiveEvent<Integer> ca_count = new SingleLiveEvent<>();
public SingleLiveEvent<Long> ca_amount = new SingleLiveEvent<>(); public SingleLiveEvent<Long> ca_amount = new SingleLiveEvent<>();
public SingleLiveEvent<String> ca_breakdown = new SingleLiveEvent<>();
public SingleLiveEvent<SettlementType> settlementType = new SingleLiveEvent<>(); public SingleLiveEvent<SettlementType> settlementType = new SingleLiveEvent<>();
@ -117,12 +121,16 @@ public class SettlementViewModel extends ViewModel {
sale_count.setValue(0); sale_count.setValue(0);
sale_amount.setValue(0L); sale_amount.setValue(0L);
sale_breakdown.setValue("");
pre_count.setValue(0); pre_count.setValue(0);
pre_amount.setValue(0L); pre_amount.setValue(0L);
pre_breakdown.setValue("");
refund_count.setValue(0); refund_count.setValue(0);
refund_amount.setValue(0L); refund_amount.setValue(0L);
refund_breakdown.setValue("");
ca_count.setValue(0); ca_count.setValue(0);
ca_amount.setValue(0L); ca_amount.setValue(0L);
ca_breakdown.setValue("");
isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.BOTH_HEADER_TPDU,HostName.BPC) isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.BOTH_HEADER_TPDU,HostName.BPC)
.build(); .build();

View File

@ -74,41 +74,56 @@
android:layout_marginTop="19dp" android:layout_marginTop="19dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="vertical"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<TextView <LinearLayout
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="2" android:orientation="horizontal">
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular" <TextView
android:text="@string/txt_subtitle_sale" android:layout_width="0dp"
android:textSize="16sp" /> android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@string/txt_subtitle_sale"
android:textSize="16sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@={settleViewModel.sale_count+``}"
tools:text="5"
android:textSize="16sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@{POSUtil.getInstance().getDecimalAmountSeparatorFormat(settleViewModel.sale_amount)}"
tools:text="65.00"
android:textAlignment="textEnd"
android:textSize="16sp" />
</LinearLayout>
<TextView <TextView
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_marginTop="6dp"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular" android:fontFamily="@font/rubik_regular"
android:text="@={settleViewModel.sale_count+``}" android:text="@{settleViewModel.sale_breakdown}"
tools:text="5" android:textColor="@color/colorTextContent"
android:textSize="12sp"
android:textSize="16sp" /> tools:text="MMK 2 / 10,000.00 USD 1 / 25.00" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@{POSUtil.getInstance().getDecimalAmountSeparatorFormat(settleViewModel.sale_amount)}"
tools:text="65.00"
android:textAlignment="textEnd"
android:textSize="16sp" />
</LinearLayout> </LinearLayout>
@ -122,41 +137,56 @@
android:layout_marginTop="19dp" android:layout_marginTop="19dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="vertical"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<TextView <LinearLayout
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="2" android:orientation="horizontal">
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular" <TextView
android:text="@string/txt_subtitle_sale_completion" android:layout_width="0dp"
android:textSize="16sp" /> android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@string/txt_subtitle_sale_completion"
android:textSize="16sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@={settleViewModel.pre_count+``}"
tools:text="0"
android:textSize="16sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@{POSUtil.getInstance().getDecimalAmountSeparatorFormat(settleViewModel.pre_amount)}"
tools:text="0.00"
android:textAlignment="textEnd"
android:textSize="16sp" />
</LinearLayout>
<TextView <TextView
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_marginTop="6dp"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular" android:fontFamily="@font/rubik_regular"
android:text="@={settleViewModel.pre_count+``}" android:text="@{settleViewModel.pre_breakdown}"
tools:text="0" android:textColor="@color/colorTextContent"
android:textSize="12sp"
android:textSize="16sp" /> tools:text="MMK 1 / 8,000.00 USD 1 / 15.00" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@{POSUtil.getInstance().getDecimalAmountSeparatorFormat(settleViewModel.pre_amount)}"
tools:text="0.00"
android:textAlignment="textEnd"
android:textSize="16sp" />
</LinearLayout> </LinearLayout>
@ -170,42 +200,56 @@
android:layout_marginTop="19dp" android:layout_marginTop="19dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="vertical"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<TextView <LinearLayout
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="2" android:orientation="horizontal">
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular" <TextView
android:text="@string/txt_subtitle_refund" android:layout_width="0dp"
android:textSize="16sp" /> android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@string/txt_subtitle_refund"
android:textSize="16sp" />
<TextView
android:layout_width="0dp"
android:textColor="@color/black"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="@font/rubik_regular"
android:text="@={settleViewModel.refund_count+``}"
tools:text="0"
android:textSize="16sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@{POSUtil.getInstance().getDecimalAmountSeparatorFormat(settleViewModel.refund_amount)}"
tools:text="0.00"
android:textAlignment="textEnd"
android:textSize="16sp" />
</LinearLayout>
<TextView <TextView
android:layout_width="0dp" android:layout_width="match_parent"
android:textColor="@color/black"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_marginTop="6dp"
android:fontFamily="@font/rubik_regular" android:fontFamily="@font/rubik_regular"
android:text="@{settleViewModel.refund_breakdown}"
android:text="@={settleViewModel.refund_count+``}" android:textColor="@color/colorTextContent"
tools:text="0" android:textSize="12sp"
tools:text="MMK 0 / 0.00 USD 1 / 10.00" />
android:textSize="16sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@{POSUtil.getInstance().getDecimalAmountSeparatorFormat(settleViewModel.refund_amount)}"
tools:text="0.00"
android:textAlignment="textEnd"
android:textSize="16sp" />
</LinearLayout> </LinearLayout>
@ -219,43 +263,57 @@
android:layout_marginTop="19dp" android:layout_marginTop="19dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="vertical"
android:visibility="@{settleViewModel.ca_count > 0 ? 0 : 8}" android:visibility="@{settleViewModel.ca_count > 0 ? 0 : 8}"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<TextView <LinearLayout
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="2" android:orientation="horizontal">
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular" <TextView
android:text="@string/text_cash_advance" android:layout_width="0dp"
android:textSize="16sp" /> android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@string/text_cash_advance"
android:textSize="16sp" />
<TextView
android:layout_width="0dp"
android:textColor="@color/black"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="@font/rubik_regular"
android:text="@={settleViewModel.ca_count+``}"
tools:text="0"
android:textSize="16sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@{POSUtil.getInstance().getDecimalAmountSeparatorFormat(settleViewModel.ca_amount)}"
tools:text="0.00"
android:textAlignment="textEnd"
android:textSize="16sp" />
</LinearLayout>
<TextView <TextView
android:layout_width="0dp" android:layout_width="match_parent"
android:textColor="@color/black"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_marginTop="6dp"
android:fontFamily="@font/rubik_regular" android:fontFamily="@font/rubik_regular"
android:text="@{settleViewModel.ca_breakdown}"
android:text="@={settleViewModel.ca_count+``}" android:textColor="@color/colorTextContent"
tools:text="0" android:textSize="12sp"
tools:text="MMK 1 / 5,000.00 USD 0 / 0.00" />
android:textSize="16sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@{POSUtil.getInstance().getDecimalAmountSeparatorFormat(settleViewModel.ca_amount)}"
tools:text="0.00"
android:textAlignment="textEnd"
android:textSize="16sp" />
</LinearLayout> </LinearLayout>

View File

@ -11,6 +11,7 @@ public class CardSettleData implements Serializable {
private String expDate; private String expDate;
private String invoiceNum; private String invoiceNum;
private String transType; private String transType;
private String currencyCode;
private long amount; private long amount;
@ -22,12 +23,13 @@ public class CardSettleData implements Serializable {
public CardSettleData() { 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.cardType = cardType;
this.cardNum = cardNum; this.cardNum = cardNum;
this.expDate = expDate; this.expDate = expDate;
this.invoiceNum = invoiceNum; this.invoiceNum = invoiceNum;
this.transType = transType; this.transType = transType;
this.currencyCode = currencyCode;
this.amount = amount; this.amount = amount;
this.transDate = transDate; this.transDate = transDate;
this.transTime = transTime; this.transTime = transTime;
@ -54,6 +56,10 @@ public class CardSettleData implements Serializable {
this.transType = transType; this.transType = transType;
} }
public void setCurrencyCode(String currencyCode) {
this.currencyCode = currencyCode;
}
public void setAmount(long amount) { public void setAmount(long amount) {
this.amount = amount; this.amount = amount;
} }
@ -86,6 +92,10 @@ public class CardSettleData implements Serializable {
return transType; return transType;
} }
public String getCurrencyCode() {
return currencyCode;
}
public long getAmount() { public long getAmount() {
return amount; return amount;
} }
@ -115,6 +125,7 @@ public class CardSettleData implements Serializable {
cardSettleData.setExpDate(pay.getEXPDate()); cardSettleData.setExpDate(pay.getEXPDate());
cardSettleData.setInvoiceNum(pay.getInvoiceNo()); cardSettleData.setInvoiceNum(pay.getInvoiceNo());
cardSettleData.setTransType(pay.getTransType()); cardSettleData.setTransType(pay.getTransType());
cardSettleData.setCurrencyCode(pay.getCurrencyCode());
cardSettleData.setAmount(pay.getAmount()); cardSettleData.setAmount(pay.getAmount());
cardSettleData.setTransDate(pay.getTransDate()); cardSettleData.setTransDate(pay.getTransDate());
cardSettleData.setTransTime(pay.getTransTime()); cardSettleData.setTransTime(pay.getTransTime());

View File

@ -212,23 +212,34 @@ public abstract class BaseXPrint {
} }
protected void printTransDetailSettlement(PayDetail payDetail) { protected void printTransDetailSettlement(PayDetail payDetail) {
SettleData settleData = payDetail.getSettleDataObj(); SettleData settleData = payDetail.getSettleDataObj();
int totalCount = settleData.getSaleCount() + settleData.getPreAuthCompCount() + settleData.getRefundCount() + settleData.getCashAdvanceCount(); List<CardSettleData> cardSettleDataList = payDetail.getCardSettleData();
long totalAmount = settleData.getSaleAmount() + settleData.getPreAuthCompAmount() + settleData.getCashAdvanceAmount(); CurrencySettlementSummary mmkSummary = new CurrencySettlementSummary();
CurrencySettlementSummary usdSummary = new CurrencySettlementSummary();
print3ColumnsString("TRX TYPE ", "CNT", "AMOUNT"); if (cardSettleDataList != null && !cardSettleDataList.isEmpty()) {
print3ColumnsString("SALE ", countStringFormat(settleData.getSaleCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getSaleAmount())); for (CardSettleData cardSettleData : cardSettleDataList) {
print3ColumnsString("PREAUTH COMP ", countStringFormat(settleData.getPreAuthCompCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getPreAuthCompAmount())); CurrencySettlementSummary summary = "USD".equals(normalizeSettlementCurrency(cardSettleData.getCurrencyCode())) ? usdSummary : mmkSummary;
if (settleData.getCashAdvanceCount() != 0) applyCardSettlementSummary(summary, cardSettleData);
print3ColumnsString("CASH ADVANCE ", countStringFormat(settleData.getCashAdvanceCount()), PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getCashAdvanceAmount())); }
print3ColumnsString("REFUND ", countStringFormat(settleData.getRefundCount()), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getRefundAmount())); } else {
print3ColumnsString("TOTAL"+ "(" + "MMK" +")" + " ", countStringFormat(totalCount), PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount)); 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); emptyLine(2);
} }
protected void printTransDetailSettlement(PayDetail payDetail, List<CardSettleData> cardSettleDataList) { protected void printTransDetailSettlement(PayDetail payDetail, List<CardSettleData> 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) { private String currencyCodeToText(String currencyCode) {
String currencyText = "MMK"; String currencyText = "MMK";