Added QR Last Settlement - final

This commit is contained in:
kizzy 2025-12-30 03:09:33 +07:00
parent 4c77b376f0
commit 14fe578bce
19 changed files with 289 additions and 131 deletions

View File

@ -39,6 +39,7 @@ import com.utsmyanmar.paylibs.isobuilder.builderx.ISOMsgX;
import com.utsmyanmar.paylibs.isobuilder.builderx.ISOVersion; import com.utsmyanmar.paylibs.isobuilder.builderx.ISOVersion;
import com.utsmyanmar.paylibs.model.MsgField; import com.utsmyanmar.paylibs.model.MsgField;
import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.QRSettleData;
import com.utsmyanmar.paylibs.model.SettleData; import com.utsmyanmar.paylibs.model.SettleData;
import com.utsmyanmar.paylibs.model.TradeData; import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.network.ISOCallback; import com.utsmyanmar.paylibs.network.ISOCallback;
@ -388,7 +389,7 @@ public class AutoSettleService extends Service {
payDetail.setAmount(totalAmount); payDetail.setAmount(totalAmount);
payDetail.setTradeAnswerCode("000"); payDetail.setTradeAnswerCode("000");
payDetail.setBatchNo(SystemParamsOperation.getInstance().getCurrentBatchNum()); payDetail.setBatchNo(SystemParamsOperation.getInstance().getCurrentBatchNum());
payDetail.setQrSettleData(QRSettleData.convertFromPayDetail(qrTransactionsList));
// Insert QR settlement record // Insert QR settlement record
repository.insertPayDetail(payDetail); repository.insertPayDetail(payDetail);
@ -404,7 +405,7 @@ public class AutoSettleService extends Service {
// Push e-receipt data using repository directly // Push e-receipt data using repository directly
try { try {
EReceiptRequest request = EReceiptUtil.getInstance().generateQRSettlement(payDetail, qrTransactionsList); EReceiptRequest request = EReceiptUtil.getInstance().generateQRSettlement(payDetail, QRSettleData.convertFromPayDetail(qrTransactionsList));
sendEReceipt(request); sendEReceipt(request);
LogUtil.d(TAG, "QR Settlement e-receipt data prepared and sent"); LogUtil.d(TAG, "QR Settlement e-receipt data prepared and sent");
} catch (Exception e) { } catch (Exception e) {

View File

@ -17,6 +17,7 @@ import com.utsmyanmar.baselib.util.TerminalUtil;
import com.utsmyanmar.ecr.data.TransType; import com.utsmyanmar.ecr.data.TransType;
import com.utsmyanmar.ecr.data.model.Transactions; import com.utsmyanmar.ecr.data.model.Transactions;
import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.QRSettleData;
import com.utsmyanmar.paylibs.print.printx.PrintXReceipt; import com.utsmyanmar.paylibs.print.printx.PrintXReceipt;
import com.utsmyanmar.paylibs.print.printx.PrintXStatus; import com.utsmyanmar.paylibs.print.printx.PrintXStatus;
import com.utsmyanmar.paylibs.system.SingleLiveEvent; import com.utsmyanmar.paylibs.system.SingleLiveEvent;
@ -418,7 +419,7 @@ public class SharedViewModel extends ViewModel {
if(payDetail.getValue() == null && payDetails.getValue() == null) return; if(payDetail.getValue() == null && payDetails.getValue() == null) return;
PrintXReceipt.getInstance().printQRSettlementReport(payDetail.getValue(),payDetails.getValue(), printXStatus); PrintXReceipt.getInstance().printQRSettlementReport(payDetail.getValue(), QRSettleData.convertFromPayDetail(payDetails.getValue()), printXStatus);
} }

View File

@ -13,6 +13,7 @@ import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.util.DataBindingConfig; import com.utsmyanmar.baselib.util.DataBindingConfig;
import com.utsmyanmar.baselib.util.DialogCallback; import com.utsmyanmar.baselib.util.DialogCallback;
import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.QRSettleData;
import com.utsmyanmar.paylibs.print.PrintHelper; import com.utsmyanmar.paylibs.print.PrintHelper;
import com.utsmyanmar.paylibs.print.PrintReceipt; import com.utsmyanmar.paylibs.print.PrintReceipt;
import com.utsmyanmar.paylibs.print.printx.PrintXReceipt; import com.utsmyanmar.paylibs.print.printx.PrintXReceipt;
@ -26,6 +27,7 @@ import com.utsmm.kbz.ui.core_viewmodel.TransProcessViewModel;
import java.util.List; import java.util.List;
import com.utsmyanmar.paylibs.utils.LogUtil; import com.utsmyanmar.paylibs.utils.LogUtil;
import com.utsmyanmar.paylibs.utils.enums.HostType;
public class ReprintReceiptFragment extends DataBindingFragment { public class ReprintReceiptFragment extends DataBindingFragment {
@ -108,7 +110,7 @@ public class ReprintReceiptFragment extends DataBindingFragment {
private void updateUIPrintReceiptFailure(PayDetail payDetail) { private void updateUIPrintReceiptFailure(PayDetail payDetail) {
sharedViewModel.printReceiptMsg.postValue(getString(R.string.txt_printing_settlement_report_failure)); sharedViewModel.printReceiptMsg.postValue(getString(R.string.txt_printing_settlement_report_failure));
sharedViewModel.reprintBtnLayout.postValue(0); sharedViewModel.reprintBtnLayout.postValue(0);
ReprintReceiptFragment.this.payDetail = payDetail; // ReprintReceiptFragment.this.payDetail = payDetail;
} }
private void checkPaperExists(PayDetail payDetail) { private void checkPaperExists(PayDetail payDetail) {
@ -142,42 +144,56 @@ public class ReprintReceiptFragment extends DataBindingFragment {
} }
private void observeLastSettlement() { private void observeLastSettlement() {
managementViewModel.getLastSettlement(SystemParamsOperation.getInstance().getCurrentSerialNum()).observe(getViewLifecycleOwner(), new Observer<List<PayDetail>>() {
@Override
public void onChanged(List<PayDetail> payDetails) {
if (payDetails != null) {
if (payDetails.size() != 0) {
PayDetail payDetail = payDetails.get(payDetails.size() - 1);
payDetail.setTransType( payDetail.getTransType()+"(REPRINT)");
checkPaperExists(payDetail);
payDetail = sharedViewModel.payDetail.getValue();
} else { payDetail.setTransType( payDetail.getTransType()+"(REPRINT)");
showSingleInfoDialog(getString(R.string.txt_no_trans_to_print)); checkPaperExists(payDetail);
navigateMainScreen(); // managementViewModel.payDetail.observe(getViewLifecycleOwner(), new Observer<PayDetail>() {
} // @Override
// public void onChanged(PayDetail pay) {
} // if (pay != null) {
} //
}); // payDetail = pay;
//
//
//
//
//
// } else {
// showSingleInfoDialog(getString(R.string.txt_no_trans_to_print));
// navigateMainScreen();
// }
// }
// });
} }
private void printReceipt(PayDetail payDetail) { private void printReceipt(PayDetail payDetail) {
PrintXReceipt.getInstance().printSmileSettlementReport(payDetail, new PrintXStatus() {
@Override
public void onSuccess() {
delayFunctionCall(ReprintReceiptFragment.this::navigateMainScreen);
}
@Override if(sharedViewModel.hostType.getValue() == HostType.QR) {
public void onFailure() {
updateUIPrintReceiptFailure(payDetail); PrintXReceipt.getInstance().printQRSettlementReport(payDetail, payDetail.getQrSettleData(), printXStatus);
} else {
PrintXReceipt.getInstance().printSmileSettlementReport(payDetail, printXStatus);
}
checkPaperExists(payDetail);
}
});
} }
private PrintXStatus printXStatus = new PrintXStatus() {
@Override
public void onSuccess() {
delayFunctionCall(ReprintReceiptFragment.this::navigateMainScreen);
}
@Override
public void onFailure() {
updateUIPrintReceiptFailure(payDetail);
// checkPaperExists(payDetail);
}
};
@SuppressWarnings("ConstantConditions") @SuppressWarnings("ConstantConditions")
private void navigateMainScreen() { private void navigateMainScreen() {

View File

@ -174,7 +174,7 @@ public class SelectHostFragment extends DataBindingFragment implements DataBindi
} }
private void checkQRButtonVisibility() { private void checkQRButtonVisibility() {
if(sharedViewModel.getTransMenu().getValue() == TransMenu.VOID || sharedViewModel.getTransMenu().getValue() == TransMenu.PRE_AUTH_COMPLETE_VOID || sharedViewModel.getTransMenu().getValue() == TransMenu.REVERSAL || sharedViewModel.getTransMenu().getValue() == TransMenu.PRE_AUTH_FULL_VOID || sharedViewModel.getTransMenu().getValue() == TransMenu.LAST_SETTLEMENT) { if(sharedViewModel.getTransMenu().getValue() == TransMenu.VOID || sharedViewModel.getTransMenu().getValue() == TransMenu.PRE_AUTH_COMPLETE_VOID || sharedViewModel.getTransMenu().getValue() == TransMenu.REVERSAL || sharedViewModel.getTransMenu().getValue() == TransMenu.PRE_AUTH_FULL_VOID ) {
sharedViewModel.qrPayVisibility.setValue(8); sharedViewModel.qrPayVisibility.setValue(8);
} else { } else {
sharedViewModel.qrPayVisibility.setValue(0); sharedViewModel.qrPayVisibility.setValue(0);
@ -272,7 +272,19 @@ public class SelectHostFragment extends DataBindingFragment implements DataBindi
if (payDetails != null) { if (payDetails != null) {
if (!payDetails.isEmpty()) { if (!payDetails.isEmpty()) {
managementViewModel.payDetails.setValue(payDetails); managementViewModel.payDetails.setValue(payDetails);
routeId = R.id.action_selectHostFragment_to_settlementTransactionFragment;
PayDetail payDetail = payDetails.get(payDetails.size() - 1);
if(sharedViewModel.hostType.getValue() == HostType.QR && payDetail.getTransactionType() == TransactionsType.MMQR_SETTLEMENT.value) {
routeId = R.id.action_selectHostFragment_to_QRSettlementTransactionFragment;
} else if(sharedViewModel.hostType.getValue() != HostType.MPU && payDetail.getTransactionType() == TransactionsType.SETTLEMENT.value) {
routeId = R.id.action_selectHostFragment_to_settlementTransactionFragment;
} else {
showSingleInfoDialog(getString(R.string.txt_no_trans_to_print));
routeId = R.id.action_selectHostFragment_to_nav_main;
}
} else { } else {
showSingleInfoDialog(getString(R.string.txt_no_trans_to_print)); showSingleInfoDialog(getString(R.string.txt_no_trans_to_print));
routeId = R.id.action_selectHostFragment_to_nav_main; routeId = R.id.action_selectHostFragment_to_nav_main;

View File

@ -13,6 +13,7 @@ import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest; import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest;
import com.utsmyanmar.baselib.util.DataBindingConfig; import com.utsmyanmar.baselib.util.DataBindingConfig;
import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.QRSettleData;
import com.utsmyanmar.paylibs.model.SettleData; import com.utsmyanmar.paylibs.model.SettleData;
import com.utsmyanmar.paylibs.model.TradeData; import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.utils.LogUtil; import com.utsmyanmar.paylibs.utils.LogUtil;
@ -205,43 +206,46 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
private void observeQRLastSettlementTransactions() { private void observeQRLastSettlementTransactions() {
List<PayDetail> payDetailList = managementViewModel.payDetails.getValue(); List<PayDetail> payDetailList = managementViewModel.payDetails.getValue();
if( payDetailList != null) { if( payDetailList != null) {
qrTransactionsList.clear(); PayDetail payDetail = payDetailList.get(payDetailList.size() - 1);
qrTransListAll.clear();
int qrSaleCount = 0;
long qrSaleAmount = 0;
int qrRefundCount = 0;
long qrRefundAmount = 0;
count = 0; count = 0;
totalAmount = 0; totalAmount = 0;
try { SettleData settleData = payDetail.getSettleDataObj();
for (PayDetail payDetail : payDetailList) { qrSaleCount = settleData.getSaleCount();
// Filter for QR transactions only qrSaleAmount = settleData.getSaleAmount();
if ((payDetail.getTransactionType() == TransactionsType.MMQR.value
|| payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value)
&& payDetail.getQrTransStatus() == 1
&& POSUtil.getInstance().getYesterdayDate().compareTo(POSUtil.getInstance().getDateByString(payDetail.transDate)) < 1) {
boolean isNeedMinusSign = payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value; qrRefundAmount = settleData.getRefundAmount();
qrTransactionsList.add(payDetail); qrRefundCount = settleData.getRefundCount();
count++;
if (isNeedMinusSign) {
totalAmount -= payDetail.getAmount();
} else {
totalAmount += payDetail.getAmount();
}
}
}
} catch (IllegalStateException e) {
LogUtil.e(TAG,"QRSettlement : Database cursor error in last settlement - likely due to large data size:"+ e);
showEmptyDataView();
settlementViewModel.isNoData.setValue(true);
return;
}
if (qrTransactionsList.isEmpty()) { totalAmount = qrSaleAmount - qrRefundAmount;
showEmptyDataView(); count = qrSaleCount + qrRefundCount;
settlementViewModel.isNoData.setValue(true);
} else { settlementViewModel.sale_count.setValue(qrSaleCount);
showDataView(); settlementViewModel.sale_amount.setValue(qrSaleAmount);
settlementViewModel.isNoData.setValue(false); settlementViewModel.refund_count.setValue(qrRefundCount);
} settlementViewModel.refund_amount.setValue(qrRefundAmount);
managementViewModel.totalAmountDR.setValue(totalAmount);
managementViewModel.trnxCountDR.setValue(String.valueOf(count));
sharedViewModel.setAmount(POSUtil.getInstance().getDecimalAmountSeparatorFormat(totalAmount));
sharedViewModel.payDetail.setValue(payDetail);
showDataView();
settlementViewModel.isNoData.setValue(false);
// if (qrTransactionsList.isEmpty()) {
// showEmptyDataView();
// settlementViewModel.isNoData.setValue(true);
// } else {
// showDataView();
// settlementViewModel.isNoData.setValue(false);
// }
} else { } else {
showEmptyDataView(); showEmptyDataView();
@ -310,6 +314,7 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
payDetail.setAmount(totalAmount); payDetail.setAmount(totalAmount);
payDetail.setTradeAnswerCode("000"); payDetail.setTradeAnswerCode("000");
payDetail.setBatchNo(SystemParamsOperation.getInstance().getCurrentBatchNum()); payDetail.setBatchNo(SystemParamsOperation.getInstance().getCurrentBatchNum());
payDetail.setQrSettleData(QRSettleData.convertFromPayDetail(qrTransactionsList));
if(sharedViewModel.getTransMenu().getValue() != TransMenu.LAST_SETTLEMENT) { if(sharedViewModel.getTransMenu().getValue() != TransMenu.LAST_SETTLEMENT) {
sharedViewModel.insertPayDetail(payDetail); sharedViewModel.insertPayDetail(payDetail);
@ -331,7 +336,7 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
} }
private void updateData() { private void updateData() {
// EReceiptRequest request = EReceiptUtil.getInstance().generateMPUReceipt(sharedViewModel.payDetail.getValue()); // EReceiptRequest request = EReceiptUtil.getInstance().generateMPUReceipt(sharedViewModel.payDetail.getValue());
EReceiptRequest request = EReceiptUtil.getInstance().generateQRSettlement(sharedViewModel.payDetail.getValue(), qrTransactionsList); EReceiptRequest request = EReceiptUtil.getInstance().generateQRSettlement(sharedViewModel.payDetail.getValue(), QRSettleData.convertFromPayDetail(qrTransactionsList));
sharedViewModel.pushReceipt(request); sharedViewModel.pushReceipt(request);
} }

View File

@ -8,6 +8,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import com.utsmm.kbz.ui.management.ManagementViewModel;
import com.utsmm.kbz.util.EReceiptUtil; import com.utsmm.kbz.util.EReceiptUtil;
import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest; import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest;
@ -39,6 +40,8 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
private SettlementViewModel settlementViewModel; private SettlementViewModel settlementViewModel;
private SharedViewModel sharedViewModel; private SharedViewModel sharedViewModel;
private ManagementViewModel managementViewModel;
private int routeId; private int routeId;
int saleCount = 0; int saleCount = 0;
@ -54,12 +57,14 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
protected void initViewModel() { protected void initViewModel() {
settlementViewModel = getFragmentScopeViewModel(SettlementViewModel.class); settlementViewModel = getFragmentScopeViewModel(SettlementViewModel.class);
sharedViewModel = getFragmentScopeViewModel(SharedViewModel.class); sharedViewModel = getFragmentScopeViewModel(SharedViewModel.class);
managementViewModel = getFragmentScopeViewModel(ManagementViewModel.class);
} }
@Override @Override
protected DataBindingConfig getDataBindingConfig() { protected DataBindingConfig getDataBindingConfig() {
return new DataBindingConfig(R.layout.fragment_view_batch_screen, BR.settleViewModel,settlementViewModel) return new DataBindingConfig(R.layout.fragment_view_batch_screen, BR.settleViewModel,settlementViewModel)
.addBindingParam(BR.sharedViewModel,sharedViewModel) .addBindingParam(BR.sharedViewModel,sharedViewModel)
.addBindingParam(BR.managementViewModel,managementViewModel)
.addBindingParam(BR.click,new ClickEvent()); .addBindingParam(BR.click,new ClickEvent());
} }
@ -157,6 +162,9 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
setSettlementViewModelData(saleCount, saleAmount, preCount, preAmount, refundCount, refundAmount, caCount, caAmount); setSettlementViewModelData(saleCount, saleAmount, preCount, preAmount, refundCount, refundAmount, caCount, caAmount);
settlementViewModel.setPayDetails(payDetails); settlementViewModel.setPayDetails(payDetails);
managementViewModel.payDetail.setValue(payDetail);
} }
} else { } else {

View File

@ -6,6 +6,7 @@ import com.utsmm.kbz.util.tms.TMSUtil;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest; import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest;
import com.utsmyanmar.baselib.network.model.e_receipt.Transaction; import com.utsmyanmar.baselib.network.model.e_receipt.Transaction;
import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.QRSettleData;
import com.utsmyanmar.paylibs.model.SettleData; import com.utsmyanmar.paylibs.model.SettleData;
import com.utsmyanmar.paylibs.system.BaseErrorCode; import com.utsmyanmar.paylibs.system.BaseErrorCode;
import com.utsmyanmar.paylibs.utils.POSUtil; import com.utsmyanmar.paylibs.utils.POSUtil;
@ -228,7 +229,7 @@ public class EReceiptUtil {
return request; return request;
} }
public EReceiptRequest generateQRSettlement(PayDetail payDetail, List<PayDetail> transactions) { public EReceiptRequest generateQRSettlement(PayDetail payDetail, List<QRSettleData> transactions) {
double realAmount = payDetail.getAmount() / 100.0; double realAmount = payDetail.getAmount() / 100.0;
DecimalFormat df = new DecimalFormat("0.00"); DecimalFormat df = new DecimalFormat("0.00");
@ -278,25 +279,25 @@ public class EReceiptUtil {
return request; return request;
} }
private static List<Transaction> buildTransactions(List<PayDetail> payDetails) { private static List<Transaction> buildTransactions(List<QRSettleData> qrSettleData) {
List<Transaction> list = new ArrayList<>(); List<Transaction> list = new ArrayList<>();
for (PayDetail pay : payDetails) { for (QRSettleData pay : qrSettleData) {
double realAmount = pay.getAmount() / 100.0; double realAmount = pay.getAmount() / 100.0;
DecimalFormat df = new DecimalFormat("0.00"); DecimalFormat df = new DecimalFormat("0.00");
String amount = df.format(realAmount); String amount = df.format(realAmount);
Transaction txn = new Transaction(); Transaction txn = new Transaction();
txn.setTran_id(pay.getQrTransId()); // or ref no txn.setTran_id(pay.getTransId()); // or ref no
txn.setStatus( txn.setStatus(
pay.getTransactionType() == TransactionsType.MMQR_REFUND.value pay.getTransactionType() == TransactionsType.MMQR_REFUND.value
? "REFUND_SUCCESS" ? "REFUND_SUCCESS"
: "PAY_SUCCESS" : "PAY_SUCCESS"
); );
txn.setDate(pay.getTransDate()); // yyyyMMdd txn.setDate(pay.getDate()); // yyyyMMdd
txn.setTime(pay.getTransTime()); // HHmmss txn.setTime(pay.getTime()); // HHmmss
txn.setAmount(amount); txn.setAmount(amount);
list.add(txn); list.add(txn);

View File

@ -84,21 +84,11 @@
</LinearLayout> </LinearLayout>
<!-- Status Indicator -->
<TextView
android:layout_width="24dp"
android:layout_height="24dp"
android:text="✓"
android:textColor="@color/white"
android:textSize="16sp"
android:gravity="center"
android:alpha="0.8" />
</LinearLayout> </LinearLayout>
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<!-- Transaction Summary Area - EMPHASIZED FOR BETTER VISIBILITY -->
<TextView <TextView
android:id="@+id/summaryTitle" android:id="@+id/summaryTitle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -212,11 +202,10 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="SETTLEMENT (REPRINT)" android:text="SETTLEMENT (REPRINT)"
android:textColor="@color/white" android:textColor="@color/black"
android:textSize="16sp" android:textSize="16sp"
android:textStyle="bold" android:textStyle="bold"
android:fontFamily="@font/rubik_medium" android:fontFamily="@font/rubik_medium"
android:background="@color/colorPrimary"
android:paddingHorizontal="12dp" android:paddingHorizontal="12dp"
android:paddingVertical="6dp" /> android:paddingVertical="6dp" />
@ -255,38 +244,6 @@
</LinearLayout> </LinearLayout>
<!-- Transaction ID Section -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Trans ID"
android:textColor="@android:color/darker_gray"
android:textSize="14sp"
android:fontFamily="@font/rubik_regular" />
<View
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_weight="1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="000123"
android:textColor="@color/colorTextTitle"
android:textSize="14sp"
android:fontFamily="@font/rubik_medium"
android:fontFeatureSettings="mono"
tools:text="123456" />
</LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -10,6 +10,9 @@
<variable <variable
name="sharedViewModel" name="sharedViewModel"
type="com.utsmm.kbz.ui.core_viewmodel.SharedViewModel" /> type="com.utsmm.kbz.ui.core_viewmodel.SharedViewModel" />
<variable
name="managementViewModel"
type="com.utsmm.kbz.ui.management.ManagementViewModel" />
<variable <variable
name="click" name="click"
type="com.utsmm.kbz.ui.settlement.SettlementTransactionFragment.ClickEvent" /> type="com.utsmm.kbz.ui.settlement.SettlementTransactionFragment.ClickEvent" />

View File

@ -6,6 +6,7 @@ import androidx.room.RoomDatabase;
import androidx.room.TypeConverters; import androidx.room.TypeConverters;
import com.utsmyanmar.baselib.db.converter.CardSchemeConverter; import com.utsmyanmar.baselib.db.converter.CardSchemeConverter;
import com.utsmyanmar.baselib.db.converter.QRSettleDataConverter;
import com.utsmyanmar.baselib.db.converter.SettleDataConverter; import com.utsmyanmar.baselib.db.converter.SettleDataConverter;
import com.utsmyanmar.baselib.db.converter.TransCVMConverter; import com.utsmyanmar.baselib.db.converter.TransCVMConverter;
import com.utsmyanmar.baselib.db.dao.BinDao; import com.utsmyanmar.baselib.db.dao.BinDao;
@ -43,10 +44,10 @@ import com.utsmyanmar.paylibs.model.PayDetail;
MPUCtlsEntity.class, MPUCtlsEntity.class,
BinEntity.class BinEntity.class
}, },
version = 11, version = 12,
exportSchema = false exportSchema = false
) )
@TypeConverters({SettleDataConverter.class, TransCVMConverter.class, CardSchemeConverter.class}) @TypeConverters({SettleDataConverter.class, TransCVMConverter.class, CardSchemeConverter.class, QRSettleDataConverter.class})
public abstract class AppDatabase extends RoomDatabase { public abstract class AppDatabase extends RoomDatabase {
public abstract PayDetailDao payDetailDao(); public abstract PayDetailDao payDetailDao();

View File

@ -0,0 +1,31 @@
package com.utsmyanmar.baselib.db.converter;
import androidx.room.TypeConverter;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.utsmyanmar.paylibs.model.QRSettleData;
import java.lang.reflect.Type;
import java.util.List;
public class QRSettleDataConverter {
private static final Gson gson = new Gson();
@TypeConverter
public static List<QRSettleData> fromString(String value) {
if (value == null || value.isEmpty()) {
return null;
}
Type listType = new TypeToken<List<QRSettleData>>(){}.getType();
return gson.fromJson(value, listType);
}
@TypeConverter
public static String toString(List<QRSettleData> qrSettleDataList) {
if (qrSettleDataList == null) {
return null;
}
return gson.toJson(qrSettleDataList);
}
}

View File

@ -124,7 +124,7 @@ public interface PayDetailDao {
@Query(("SELECT * FROM paydetail WHERE transactionType = 3 AND voucherNo IN(:voucherNo)")) @Query(("SELECT * FROM paydetail WHERE transactionType = 3 AND voucherNo IN(:voucherNo)"))
LiveData<PayDetail> checkLastSettlement(String voucherNo); LiveData<PayDetail> checkLastSettlement(String voucherNo);
@Query("SELECT * FROM paydetail WHERE transactionType = 3 AND voucherNo <= :voucherNo") @Query("SELECT * FROM paydetail WHERE transactionType = 3 OR transactionType = 35 AND voucherNo <= :voucherNo")
LiveData<List<PayDetail>> getLastSettlement(String voucherNo); LiveData<List<PayDetail>> getLastSettlement(String voucherNo);
@Query("SELECT * FROM paydetail WHERE transactionType = 35 AND voucherNo <= :voucherNo") @Query("SELECT * FROM paydetail WHERE transactionType = 35 AND voucherNo <= :voucherNo")

View File

@ -307,6 +307,16 @@ public class DatabaseModule {
} }
}; };
static final Migration MIGRATION_11_12 = new Migration(11, 12) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE paydetail "
+ " ADD COLUMN qrSettleData TEXT");
}
};
@Provides @Provides
@Singleton @Singleton
@ -317,6 +327,7 @@ public class DatabaseModule {
.addMigrations(MIGRATION_8_9) .addMigrations(MIGRATION_8_9)
.addMigrations(MIGRATION_9_10) .addMigrations(MIGRATION_9_10)
.addMigrations(MIGRATION_10_11) .addMigrations(MIGRATION_10_11)
.addMigrations(MIGRATION_11_12)
.allowMainThreadQueries() .allowMainThreadQueries()
.addCallback(new RoomDatabase.Callback() { .addCallback(new RoomDatabase.Callback() {
@Override @Override

View File

@ -10,6 +10,7 @@ import androidx.room.PrimaryKey;
import com.utsmyanmar.paylibs.model.enums.TransCVM; import com.utsmyanmar.paylibs.model.enums.TransCVM;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
@SuppressWarnings("serial") @SuppressWarnings("serial")
@Entity(tableName = "paydetail") @Entity(tableName = "paydetail")
@ -161,6 +162,7 @@ public class PayDetail implements Serializable {
public String transId = ""; public String transId = "";
public SettleData settleDataObj; public SettleData settleDataObj;
public TransCVM transCVM; public TransCVM transCVM;
public List<QRSettleData> qrSettleData;
@ -185,7 +187,7 @@ public class PayDetail implements Serializable {
boolean isPrinted, boolean eSignIsUploaded, boolean isFreePWD, boolean isFreeSign, String tempKSN, String tempMerchantNo, boolean isPrinted, boolean eSignIsUploaded, boolean isFreePWD, boolean isFreeSign, String tempKSN, String tempMerchantNo,
String tempMerchantName, String tempTerminalNo, long transNum, String customOrderNo, String approvalCode, boolean isSettle, String tempMerchantName, String tempTerminalNo, long transNum, String customOrderNo, String approvalCode, boolean isSettle,
String settleData, String settleList, String otherCardNo, String tradeDateAndTime, String tradeDateTime, String hostName, String settleData, String settleList, String otherCardNo, String tradeDateAndTime, String tradeDateTime, String hostName,
String transDate, String transTime, String invoiceNo, String transId, String qrReferNo, String customerMobile, SettleData settleDataObj,boolean isSettlementEnabled,TransCVM transCVM) { String transDate, String transTime, String invoiceNo, String transId, String qrReferNo, String customerMobile, SettleData settleDataObj,boolean isSettlementEnabled,TransCVM transCVM,List<QRSettleData> qrSettleData) {
this.PID = PID; this.PID = PID;
this.sendBag = sendBag; this.sendBag = sendBag;
this.receiverBag = receiverBag; this.receiverBag = receiverBag;
@ -299,6 +301,7 @@ public class PayDetail implements Serializable {
this.customerMobile = customerMobile; this.customerMobile = customerMobile;
this.settleDataObj = settleDataObj; this.settleDataObj = settleDataObj;
this.isSettlementEnabled = isSettlementEnabled; this.isSettlementEnabled = isSettlementEnabled;
this.qrSettleData = qrSettleData;
} }
public boolean isSettle() { public boolean isSettle() {
@ -1363,4 +1366,12 @@ public class PayDetail implements Serializable {
this.currency = currency; this.currency = currency;
} }
public List<QRSettleData> getQrSettleData() {
return qrSettleData;
}
public void setQrSettleData(List<QRSettleData> qrSettleData) {
this.qrSettleData = qrSettleData;
}
} }

View File

@ -0,0 +1,91 @@
package com.utsmyanmar.paylibs.model;
import java.util.ArrayList;
import java.util.List;
public class QRSettleData {
private String transId;
private String date;
private String time;
private String status;
private long amount;
private int transactionType;
public QRSettleData() {}
public QRSettleData(String transId, String date, String time, String status, long amount,int transactionType) {
this.transId = transId;
this.date = date;
this.time = time;
this.status = status;
this.amount = amount;
this.transactionType = transactionType;
}
public void setTransId(String transId) {
this.transId = transId;
}
public void setDate(String date) {
this.date = date;
}
public void setTime(String time) {
this.time = time;
}
public void setStatus(String status) {
this.status = status;
}
public void setAmount(long amount) {
this.amount = amount;
}
public void setTransactionType(int transactionType) {
this.transactionType = transactionType;
}
public int getTransactionType() {
return transactionType;
}
public String getTransId() {
return transId;
}
public String getDate() {
return date;
}
public String getTime() {
return time;
}
public String getStatus() {
return status;
}
public long getAmount() {
return amount;
}
public static List<QRSettleData> convertFromPayDetail(List<PayDetail> payDetails) {
List<QRSettleData> qrSettleDataList = new ArrayList<>();
for (PayDetail pay : payDetails) {
QRSettleData qrSettleData = new QRSettleData();
qrSettleData.setAmount(pay.getAmount());
qrSettleData.setTransId(pay.getQrTransId());
qrSettleData.setStatus(pay.getTC());
qrSettleData.setDate(pay.getTransDate());
qrSettleData.setTime(pay.getTransTime());
qrSettleData.setTransactionType(pay.getTransactionType());
qrSettleDataList.add(qrSettleData);
}
return qrSettleDataList;
}
}

View File

@ -27,6 +27,7 @@ import com.utsmyanmar.paylibs.PayLibsUtils;
import com.utsmyanmar.paylibs.R; import com.utsmyanmar.paylibs.R;
import com.utsmyanmar.paylibs.model.MsgField; import com.utsmyanmar.paylibs.model.MsgField;
import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.QRSettleData;
import com.utsmyanmar.paylibs.model.SettleData; import com.utsmyanmar.paylibs.model.SettleData;
import com.utsmyanmar.paylibs.print.PrintUtils; import com.utsmyanmar.paylibs.print.PrintUtils;
import com.utsmyanmar.paylibs.system.BaseErrorCode; import com.utsmyanmar.paylibs.system.BaseErrorCode;
@ -732,19 +733,24 @@ public abstract class BaseXPrint {
emptyLine(2); emptyLine(2);
} }
protected void printQRSettlementTransDetail(List<PayDetail> lists) { protected void printQRSettlementTransDetail(List<QRSettleData> lists) {
long totalAmount = 0; long totalAmount = 0;
long refundTotal = 0; long refundTotal = 0;
for (PayDetail pay : lists) { for (QRSettleData pay : lists) {
printString("Trans Id:" + pay.getQrTransId()); // printString("Trans Id:" + pay.getQrTransId());
printString("Status :" + pay.getTC()); // printString("Status :" + pay.getTC());
// printString("Date : " + PrintUtils.getInstance().formatTimestamp(Long.parseLong(pay.getTradeDateAndTime()))); //// printString("Date : " + PrintUtils.getInstance().formatTimestamp(Long.parseLong(pay.getTradeDateAndTime())));
printString("Date :" + pay.getTransDate()); // printString("Date :" + pay.getTransDate());
printString("Time :" + pay.getTransTime()); // printString("Time :" + pay.getTransTime());
printString("Trans Id:" + pay.getTransId());
printString("Status :" + pay.getStatus());
printString("Date :" + pay.getDate());
printString("Time :" + pay.getTime());
printString("Amount :" + "MMK " + PrintUtils.getInstance().getSeparatorOnlyNumberFormat(pay.getAmount())); printString("Amount :" + "MMK " + PrintUtils.getInstance().getSeparatorOnlyNumberFormat(pay.getAmount()));

View File

@ -3,6 +3,7 @@ package com.utsmyanmar.paylibs.print.printx;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.QRSettleData;
import com.utsmyanmar.paylibs.utils.enums.HostType; import com.utsmyanmar.paylibs.utils.enums.HostType;
import java.util.List; import java.util.List;
@ -21,7 +22,7 @@ public interface PrintX {
void printSmileSettlementReport(PayDetail payDetail,PrintXStatus printXStatus); void printSmileSettlementReport(PayDetail payDetail,PrintXStatus printXStatus);
void printQRSettlementReport(PayDetail payDetail,List<PayDetail> list,PrintXStatus printXStatus); void printQRSettlementReport(PayDetail payDetail, List<QRSettleData> list, PrintXStatus printXStatus);
void printDetailReport(PayDetail payDetail, List<PayDetail> lists, HostType hostType,PrintXStatus printXStatus); void printDetailReport(PayDetail payDetail, List<PayDetail> lists, HostType hostType,PrintXStatus printXStatus);

View File

@ -14,6 +14,7 @@ import com.utsmyanmar.paylibs.isobuilder.builderx.ISOMsgX;
import com.utsmyanmar.paylibs.isobuilder.builderx.ISOVersion; import com.utsmyanmar.paylibs.isobuilder.builderx.ISOVersion;
import com.utsmyanmar.paylibs.model.MsgField; import com.utsmyanmar.paylibs.model.MsgField;
import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.QRSettleData;
import com.utsmyanmar.paylibs.print.PrintUtils; import com.utsmyanmar.paylibs.print.PrintUtils;
import com.utsmyanmar.paylibs.utils.POSUtil; import com.utsmyanmar.paylibs.utils.POSUtil;
import com.utsmyanmar.paylibs.utils.core_utils.ByteUtil; import com.utsmyanmar.paylibs.utils.core_utils.ByteUtil;
@ -203,7 +204,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
} }
@Override @Override
public void printQRSettlementReport(PayDetail payDetail, List<PayDetail> list, PrintXStatus printXStatus) { public void printQRSettlementReport(PayDetail payDetail, List<QRSettleData> list, PrintXStatus printXStatus) {
this.callbackStatus = printXStatus; this.callbackStatus = printXStatus;
try { try {

View File

@ -3,6 +3,7 @@ package com.utsmyanmar.paylibs.print.printx;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.QRSettleData;
import com.utsmyanmar.paylibs.utils.enums.HostType; import com.utsmyanmar.paylibs.utils.enums.HostType;
import java.util.List; import java.util.List;
@ -35,7 +36,7 @@ public class PrintXReceipt {
printX.printSmileSettlementReport(payDetail,printXStatus); printX.printSmileSettlementReport(payDetail,printXStatus);
} }
public void printQRSettlementReport(PayDetail payDetail,List<PayDetail> lists,PrintXStatus printXStatus) { public void printQRSettlementReport(PayDetail payDetail, List<QRSettleData> lists, PrintXStatus printXStatus) {
printX.printQRSettlementReport(payDetail,lists,printXStatus); printX.printQRSettlementReport(payDetail,lists,printXStatus);
} }