QR settlement need to adjust slip design.

This commit is contained in:
kizzy 2025-12-07 05:49:17 +07:00
parent eebe9ac2c6
commit f91ae09be7
23 changed files with 907 additions and 23 deletions

File diff suppressed because one or more lines are too long

View File

@ -11,7 +11,7 @@ android {
compileSdk 34
defaultConfig {
applicationId "com.utsmm.kbz.sit"
applicationId "com.utsmm.kbz"
minSdk 24
targetSdk 33
versionCode 1

View File

@ -178,7 +178,7 @@ public class EmvReadCardFragment extends DataBindingFragment {
if(payDetails.size() > 0) {
LogUtil.d(TAG,"Pre Auth Comp size :"+payDetails.size());
lists.addAll(payDetails);
sharedViewModel.payDetailList.postValue(payDetails);
// sharedViewModel.payDetailList.postValue(payDetails);
} else {
LogUtil.d(TAG,"Pre Auth Comp data not found!");
}

View File

@ -184,7 +184,7 @@ public class InputPasswordFragment extends DataBindingFragment implements DataBi
break;
case SETTLEMENT:
inputPasswordViewModel.passwordType.setValue(InputPasswordType.SETTLEMENT);
routeId = R.id.action_inputPasswordFragment_to_settlementTransactionFragment;
routeId = R.id.action_inputPasswordFragment_to_selectSettlementFragment;
break;
case SETTING:
inputPasswordViewModel.passwordType.setValue(InputPasswordType.SETTING);

View File

@ -319,7 +319,7 @@ public class TransactionResultFragment extends DataBindingFragment implements Da
@Override
public void printerReady() {
if(isSettlement) {
sharedViewModel.startPrintProcessSettlement();
sharedViewModel.startPrintSettlement();
return;
}
sharedViewModel.startPrintProcess();

View File

@ -64,14 +64,14 @@ public class SharedViewModel extends ViewModel {
public SingleLiveEvent<String> processCode = new SingleLiveEvent<>();
public SingleLiveEvent<PayDetail> payDetail = new SingleLiveEvent<>();
public SingleLiveEvent<List<PayDetail>> payDetails = new SingleLiveEvent<>();
public SingleLiveEvent<PrintStatus> printStatus = new SingleLiveEvent<>();
public SingleLiveEvent<String> merchantName = new SingleLiveEvent<>();
public SingleLiveEvent<String> transactionName = new SingleLiveEvent<>();
/*Apr 28 2022*/
public SingleLiveEvent<List<PayDetail>> payDetailList = new SingleLiveEvent<>();
/*May 16 2022*/
public SingleLiveEvent<Boolean> isEcr = new SingleLiveEvent<>();
@ -396,7 +396,16 @@ public class SharedViewModel extends ViewModel {
}
public void startPrintProcessSettlement() {
public void startPrintSettlement() {
if(payDetail.getValue() == null) return;
if(payDetail.getValue().getTransactionType() == TransactionsType.SETTLEMENT.value) {
startPrintProcessSettlement();
} else {
startPrintProcessQRSettlement();
}
}
private void startPrintProcessSettlement() {
if(payDetail.getValue() == null) return;
@ -411,8 +420,23 @@ public class SharedViewModel extends ViewModel {
}
});
/*POS */
// PrintReceipt.getInstance().printSettlementReceiptPOS(settleData.getSaleCount(), settleData.getSaleAmount(), settleData.getRefundCount(), settleData.getRefundAmount(), settleData.getPreAuthCount(), settleData.getPreAuthAmount(), true);
}
private void startPrintProcessQRSettlement() {
if(payDetail.getValue() == null && payDetails.getValue() == null) return;
PrintXReceipt.getInstance().printQRSettlementReport(payDetail.getValue(),payDetails.getValue(), new PrintXStatus() {
@Override
public void onSuccess() {
}
@Override
public void onFailure() {
}
});
}

View File

@ -0,0 +1,250 @@
package com.utsmm.kbz.ui.settlement;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import com.utsmm.kbz.util.EReceiptUtil;
import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest;
import com.utsmyanmar.baselib.util.DataBindingConfig;
import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.SettleData;
import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.utils.POSUtil;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.enums.HostType;
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
import com.utsmyanmar.paylibs.utils.params.Params;
import com.utsmm.kbz.BR;
import com.utsmm.kbz.R;
import com.utsmm.kbz.config.Constants;
import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel;
import com.utsmm.kbz.ui.management.ManagementViewModel;
import com.utsmm.kbz.util.ecr.CoreUtils;
import java.util.ArrayList;
import java.util.List;
public class QRSettlementTransactionFragment extends DataBindingFragment implements DataBindingFragment.BackPressCallback {
private SharedViewModel sharedViewModel;
private ManagementViewModel managementViewModel;
private SettlementViewModel settlementViewModel;
ArrayList<PayDetail> qrTransactionsList = new ArrayList<>();
private int routeId;
private int count = 0;
private long totalAmount = 0;
@Override
protected void initViewModel() {
sharedViewModel = getFragmentScopeViewModel(SharedViewModel.class);
managementViewModel = getFragmentScopeViewModel(ManagementViewModel.class);
settlementViewModel = getFragmentScopeViewModel(SettlementViewModel.class);
}
@Override
protected DataBindingConfig getDataBindingConfig() {
return new DataBindingConfig(R.layout.fragment_qr_settlement_screen, BR.sharedViewModel, sharedViewModel)
.addBindingParam(BR.manageViewModel, managementViewModel)
.addBindingParam(BR.settleViewModel, settlementViewModel)
.addBindingParam(BR.click, new ClickEvent());
}
@Override
protected int currentId() {
return R.id.QRSettlementTransactionFragment;
}
@Override
protected int hostId() {
return Constants.NAV_HOST_ID;
}
@Override
protected int routeId() {
return routeId;
}
@Override
public void onResume() {
super.onResume();
setToolBarTitleWithBackIcon(getString(R.string.title_qr_settlement));
String merchantName = SystemParamsOperation.getInstance().getMerchantName();
if (!TextUtils.equals(merchantName, "")) {
sharedViewModel.merchantName.postValue(merchantName);
} else {
sharedViewModel.merchantName.postValue("Default Value");
}
showLoadingView();
setupQRSettlementData();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setupBackButtonPressDetection(this);
observeQRTransactions();
}
private void showLoadingView() {
managementViewModel.detailReportLayoutLoadingVisibility.setValue(0);
managementViewModel.detailReportLayoutVisibility.setValue(8);
managementViewModel.detailReportLayoutViewVisibility.setValue(8);
managementViewModel.detailReportBottomLayoutVisibility.setValue(8);
}
private void showDataView() {
managementViewModel.detailReportLayoutLoadingVisibility.setValue(8);
managementViewModel.detailReportLayoutVisibility.setValue(8);
managementViewModel.detailReportLayoutViewVisibility.setValue(0);
managementViewModel.detailReportBottomLayoutVisibility.setValue(0);
}
private void showEmptyDataView() {
managementViewModel.detailReportLayoutLoadingVisibility.setValue(8);
managementViewModel.detailReportLayoutVisibility.setValue(0);
managementViewModel.detailReportLayoutViewVisibility.setValue(8);
managementViewModel.detailReportBottomLayoutVisibility.setValue(8);
}
private void setupQRSettlementData() {
managementViewModel.hostTypeDR.setValue("PAYMENT");
managementViewModel.cardTypeDR.setValue("QR PAY");
}
private void observeQRTransactions() {
managementViewModel.getTransactionHistory().observe(getViewLifecycleOwner(), payDetailList -> {
if (payDetailList != null) {
qrTransactionsList.clear();
count = 0;
totalAmount = 0;
for (PayDetail payDetail : payDetailList) {
// Filter for QR transactions only
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;
qrTransactionsList.add(payDetail);
count++;
if (isNeedMinusSign) {
totalAmount -= payDetail.getAmount();
} else {
totalAmount += payDetail.getAmount();
}
}
}
if (qrTransactionsList.isEmpty()) {
showEmptyDataView();
settlementViewModel.isNoData.setValue(true);
} else {
showDataView();
settlementViewModel.isNoData.setValue(false);
}
// Set settlement data for display
setupSettlementDisplayData();
} else {
showEmptyDataView();
settlementViewModel.isNoData.setValue(true);
}
});
}
private void setupSettlementDisplayData() {
// Calculate QR sale and refund counts/amounts
int qrSaleCount = 0;
long qrSaleAmount = 0;
int qrRefundCount = 0;
long qrRefundAmount = 0;
for (PayDetail payDetail : qrTransactionsList) {
if (payDetail.getTransactionType() == TransactionsType.MMQR.value) {
qrSaleCount++;
qrSaleAmount += payDetail.getAmount();
} else if (payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value) {
qrRefundCount++;
qrRefundAmount += payDetail.getAmount();
}
}
// Set values in settlement view model for display
settlementViewModel.sale_count.setValue(qrSaleCount);
settlementViewModel.sale_amount.setValue(qrSaleAmount);
settlementViewModel.refund_count.setValue(qrRefundCount);
settlementViewModel.refund_amount.setValue(qrRefundAmount);
managementViewModel.totalAmountDR.setValue(totalAmount);
managementViewModel.trnxCountDR.setValue(String.valueOf(count));
// Create settlement data for transaction result
SettleData settleData = new SettleData(qrSaleCount, qrSaleAmount, 0, 0L, qrRefundCount, qrRefundAmount, 0, 0L);
TradeData tradeData = Params.newTrade(false);
PayDetail payDetail = tradeData.getPayDetail();
payDetail.setSettleDataObj(settleData);
payDetail.setTransactionType(TransactionsType.MMQR_SETTLEMENT.value);
payDetail.setTransType(TransactionsType.MMQR_SETTLEMENT.name);
payDetail.setAmount(totalAmount);
sharedViewModel.payDetail.setValue(payDetail);
sharedViewModel.payDetails.setValue(qrTransactionsList);
}
private void finishECRProcess() {
CoreUtils.getInstance(sharedViewModel).responseRejectMsg(getString(R.string.txt_cancel_trans));
sharedViewModel.isEcrFinished.postValue(true);
sharedViewModel.isEcr.postValue(false);
}
private void navigateToResult() {
routeId = R.id.action_QRSettlementTransactionFragment_to_transactionResultFragment;
safeNavigateToRouteId();
}
private void updateData() {
EReceiptRequest request = EReceiptUtil.getInstance().generateMPUReceipt(sharedViewModel.payDetail.getValue());
sharedViewModel.pushReceipt(request);
}
@Override
public void onBackPress() {
if (sharedViewModel.isEcr.getValue() != null && sharedViewModel.isEcr.getValue()) {
finishECRProcess();
}
popBackStack();
}
public class ClickEvent {
public void onCancel() {
if (sharedViewModel.isEcr.getValue() != null && sharedViewModel.isEcr.getValue()) {
finishECRProcess();
}
popBackStack();
}
public void onConfirm() {
if (!qrTransactionsList.isEmpty()) {
for (PayDetail payDetail : qrTransactionsList) {
// Mark as settled or delete based on your business logic
settlementViewModel.deletePayDetail(payDetail);
}
updateData();
navigateToResult();
}
}
}
}

View File

@ -0,0 +1,98 @@
package com.utsmm.kbz.ui.settlement;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.util.DataBindingConfig;
import com.utsmyanmar.paylibs.utils.enums.HostType;
import com.utsmyanmar.paylibs.utils.enums.TransMenu;
import com.utsmm.kbz.BR;
import com.utsmm.kbz.R;
import com.utsmm.kbz.config.Constants;
import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel;
import com.utsmm.kbz.util.ecr.CoreUtils;
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
public class SelectSettlementFragment extends DataBindingFragment implements DataBindingFragment.BackPressCallback {
private SharedViewModel sharedViewModel;
private int routeId;
@Override
protected void initViewModel() {
sharedViewModel = getFragmentScopeViewModel(SharedViewModel.class);
}
@Override
protected DataBindingConfig getDataBindingConfig() {
return new DataBindingConfig(R.layout.fragment_select_settlement_screen, BR.sharedViewModel, sharedViewModel)
.addBindingParam(BR.click, new ClickEvent());
}
@Override
protected int currentId() {
return R.id.selectSettlementFragment;
}
@Override
protected int hostId() {
return Constants.NAV_HOST_ID;
}
@Override
protected int routeId() {
return routeId;
}
@Override
public void onResume() {
super.onResume();
setToolBarTitleWithBackIcon(getString(R.string.title_select_settlement_type));
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setupBackButtonPressDetection(this);
}
private void finishECRProcess() {
CoreUtils.getInstance(sharedViewModel).responseRejectMsg(getString(R.string.txt_cancel_trans));
sharedViewModel.isEcrFinished.postValue(true);
sharedViewModel.isEcr.postValue(false);
}
@Override
public void onBackPress() {
if (sharedViewModel.isEcr.getValue() != null && sharedViewModel.isEcr.getValue()) {
finishECRProcess();
}
popBackStack();
}
public class ClickEvent {
public void onCardSettlement() {
routeId = R.id.action_selectSettlementFragment_to_settlementTransactionFragment;
safeNavigateToRouteId();
}
public void onQRSettlement() {
sharedViewModel.hostType.setValue(HostType.QR);
routeId = R.id.action_selectSettlementFragment_to_QRSettlementTransactionFragment;
safeNavigateToRouteId();
}
public void onCancel() {
if (sharedViewModel.isEcr.getValue() != null && sharedViewModel.isEcr.getValue()) {
finishECRProcess();
}
popBackStack();
}
}
}

View File

@ -211,6 +211,10 @@ public class SettlementViewModel extends ViewModel {
repository.updatePayDetail(payDetail);
}
public void deletePayDetail(PayDetail payDetail){
repository.deletePayDetail(payDetail);
}
private void updateDB() {
if(payDetails != null && payDetails.size() > 0) {
@ -220,7 +224,8 @@ public class SettlementViewModel extends ViewModel {
// paydetail.setIsSettle(true);
// updatePayDetail(paydetail);
// } else {
repository.deletePayDetail(paydetail);
deletePayDetail(payDetail);
// repository.deletePayDetail(paydetail);
// }
@ -230,7 +235,8 @@ public class SettlementViewModel extends ViewModel {
for (PayDetail pay:deleteTrans
) {
repository.deletePayDetail(pay);
// repository.deletePayDetail(pay);
deletePayDetail(pay);
}
if (payDetails != null) {
payDetails.clear();
@ -247,6 +253,8 @@ public class SettlementViewModel extends ViewModel {
repository.insertPayDetail(payDetail);
}
@SuppressWarnings("ConstantConditions")
public void startSettlementProcess() {
saleCount = sale_count.getValue();

View File

@ -224,6 +224,8 @@ public class EReceiptUtil {
return "R";
} else if(transactionType == TransactionsType.SETTLEMENT.value) {
return "ST";
} else if(transactionType == TransactionsType.MMQR_SETTLEMENT.value) {
return "ST";
}
return "E";
}

View File

@ -0,0 +1,293 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="com.utsmyanmar.paylibs.utils.POSUtil" />
<variable
name="settleViewModel"
type="com.utsmm.kbz.ui.settlement.SettlementViewModel" />
<variable
name="sharedViewModel"
type="com.utsmm.kbz.ui.core_viewmodel.SharedViewModel" />
<variable
name="manageViewModel"
type="com.utsmm.kbz.ui.management.ManagementViewModel" />
<variable
name="click"
type="com.utsmm.kbz.ui.settlement.QRSettlementTransactionFragment.ClickEvent" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
<!-- &lt;!&ndash; Loading View &ndash;&gt;-->
<!-- <include-->
<!-- layout="@layout/layout_loading"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"-->
<!-- android:visibility="@{manageViewModel.detailReportLayoutLoadingVisibility}" />-->
<!-- No Data View -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:visibility="@{manageViewModel.detailReportLayoutVisibility}">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/txt_no_qr_transactions_to_settle"
android:textColor="@color/black"
android:textSize="16sp" />
</LinearLayout>
<!-- Data View -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="40dp"
android:paddingStart="17dp"
android:paddingEnd="17dp"
android:visibility="@{manageViewModel.detailReportLayoutViewVisibility}">
<!-- Header Info -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:gravity="center"
android:text="@string/txt_qr_settlement_summary"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold" />
<!-- Column Headers -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:layout_weight="2"
android:fontFamily="@font/rubik_regular"
android:text="@string/txt_title_transaction_type"
android:textSize="17sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="@font/rubik_regular"
android:text="@string/txt_title_count"
android:textColor="@color/black"
android:textSize="17sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:fontFamily="@font/rubik_regular"
android:textColor="@color/black"
android:text="@string/txt_title_totals"
android:textAlignment="textEnd"
android:textSize="17sp" />
</LinearLayout>
<FrameLayout
android:layout_marginTop="8dp"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/colorLightGray" />
<!-- QR Sale Row -->
<LinearLayout
android:layout_marginTop="19dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<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="@string/txt_qr_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>
<FrameLayout
android:layout_marginTop="15dp"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/colorLightGray" />
<!-- QR Refund Row -->
<LinearLayout
android:layout_marginTop="19dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<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="@string/txt_qr_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>
<FrameLayout
android:layout_marginTop="15dp"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/colorLightGray" />
<!-- Total Summary -->
<LinearLayout
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@color/colorLightBackground"
android:padding="12dp">
<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="@string/txt_total_qr_transactions"
android:textSize="16sp"
android:textStyle="bold" />
<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="@{manageViewModel.trnxCountDR}"
tools:text="5"
android:textSize="16sp"
android:textStyle="bold" />
<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(manageViewModel.totalAmountDR)}"
tools:text="65.00"
android:textAlignment="textEnd"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
<!-- Bottom Buttons -->
<LinearLayout
android:id="@+id/bottom_button_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="16dp"
android:orientation="horizontal"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:visibility="@{manageViewModel.detailReportBottomLayoutVisibility}">
<Button
android:id="@+id/btn_qr_settlement_cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:layout_weight="1"
android:background="@drawable/bg_rounded_btn_cancel_cv"
android:onClick="@{()->click.onCancel()}"
android:text="@string/layout_cancel"
android:textColor="@color/colorPrimary" />
<Button
android:id="@+id/btn_qr_settlement_confirm"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:layout_weight="1"
android:background="@drawable/bg_rounded_btn_cv"
android:onClick="@{()->click.onConfirm()}"
android:text="@string/txt_settle_qr_transactions"
android:textColor="@color/white" />
</LinearLayout>
</RelativeLayout>
</layout>

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="sharedViewModel"
type="com.utsmm.kbz.ui.core_viewmodel.SharedViewModel" />
<variable
name="click"
type="com.utsmm.kbz.ui.settlement.SelectSettlementFragment.ClickEvent" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
<LinearLayout
android:id="@+id/button_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginEnd="32dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<Button
android:id="@+id/btn_card_settlement"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginBottom="16dp"
android:backgroundTint="@color/primary_color"
android:onClick="@{()->click.onCardSettlement()}"
android:text="@string/txt_card_settlement"
android:textColor="@color/white"
android:textSize="16sp"
app:cornerRadius="8dp" />
<Button
android:id="@+id/btn_qr_settlement"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginBottom="16dp"
android:backgroundTint="@color/primary_color"
android:onClick="@{()->click.onQRSettlement()}"
android:text="@string/txt_qr_settlement"
android:textColor="@color/white"
android:textSize="16sp"
app:cornerRadius="8dp" />
<Button
android:id="@+id/btn_cancel"
android:layout_width="match_parent"
android:layout_height="60dp"
android:backgroundTint="@color/gray_500"
android:onClick="@{()->click.onCancel()}"
android:text="@string/txt_cancel"
android:textColor="@color/white"
android:textSize="16sp"
app:cornerRadius="8dp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<ProgressBar
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginBottom="16dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/loading"
android:textColor="@color/colorTextTitle"
android:textSize="16sp" />
</LinearLayout>

View File

@ -259,6 +259,26 @@
app:destination="@id/pinPadFragment" />
</fragment>
<!-- New SelectSettlementFragment -->
<fragment
android:id="@+id/selectSettlementFragment"
android:name="com.utsmm.kbz.ui.settlement.SelectSettlementFragment"
tools:layout="@layout/fragment_select_settlement_screen"
android:label="@string/title_select_settlement_type">
<action
android:id="@+id/action_selectSettlementFragment_to_settlementTransactionFragment"
app:destination="@id/settlementTransactionFragment" />
<action
android:id="@+id/action_selectSettlementFragment_to_QRSettlementTransactionFragment"
app:destination="@id/QRSettlementTransactionFragment" />
<action
android:id="@+id/action_selectSettlementFragment_to_nav_main"
app:launchSingleTop="true"
app:popUpTo="@+id/mobile_navigation"
app:popUpToInclusive="true"
app:destination="@id/nav_main" />
</fragment>
<fragment
tools:layout="@layout/fragment_view_batch_screen"
android:id="@+id/settlementTransactionFragment"
@ -283,6 +303,26 @@
android:id="@+id/action_settlementTransactionFragment_to_reprintReceiptFragment"
app:destination="@id/reprintReceiptFragment" />
</fragment>
<!-- New QRSettlementTransactionFragment -->
<fragment
android:id="@+id/QRSettlementTransactionFragment"
android:name="com.utsmm.kbz.ui.settlement.QRSettlementTransactionFragment"
tools:layout="@layout/fragment_qr_settlement_screen"
android:label="@string/title_qr_settlement">
<action
android:id="@+id/action_QRSettlementTransactionFragment_to_nav_main"
app:launchSingleTop="true"
app:popUpTo="@+id/mobile_navigation"
app:popUpToInclusive="true"
app:destination="@id/nav_main" />
<action
app:launchSingleTop="true"
app:popUpTo="@+id/mobile_navigation"
app:popUpToInclusive="true"
android:id="@+id/action_QRSettlementTransactionFragment_to_transactionResultFragment"
app:destination="@id/transactionResultFragment" />
</fragment>
<fragment
android:id="@+id/transactionHistoryFragment"
tools:layout="@layout/fragment_transaction_reprint_screen"
@ -321,8 +361,8 @@
app:launchSingleTop="true"
app:popUpTo="@+id/inputPasswordFragment"
app:popUpToInclusive="true"
android:id="@+id/action_inputPasswordFragment_to_settlementTransactionFragment"
app:destination="@id/settlementTransactionFragment" />
android:id="@+id/action_inputPasswordFragment_to_selectSettlementFragment"
app:destination="@id/selectSettlementFragment" />
<action
app:launchSingleTop="true"
app:popUpTo="@+id/inputPasswordFragment"
@ -661,7 +701,7 @@
app:destination="@id/selectHostFragment" />
<action
android:id="@+id/action_managementFunctionFragment_to_settlementTransactionFragment"
app:destination="@id/settlementTransactionFragment" />
app:destination="@id/selectSettlementFragment" />
<action
android:id="@+id/action_managementFunctionFragment_to_inputTraceFragment"
app:destination="@id/inputTraceFragment" />

View File

@ -96,4 +96,10 @@
<!-- Common Colors -->
<color name="transparent">#00000000</color>
<!-- Settlement Fragment Colors -->
<color name="primary_color">#2A60AF</color>
<color name="gray_500">#6B7280</color>
<color name="colorLightBackground">#F8F9FA</color>
</resources>

View File

@ -601,4 +601,19 @@
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<!-- Settlement Fragments Strings -->
<string name="title_select_settlement_type">Select Settlement Type</string>
<string name="txt_select_settlement_type">Choose Settlement Type</string>
<string name="txt_card_settlement">Card Settlement</string>
<string name="txt_qr_settlement">QR Settlement</string>
<string name="txt_cancel">Cancel</string>
<string name="title_qr_settlement">QR Settlement</string>
<string name="txt_qr_settlement_summary">QR Settlement Summary</string>
<string name="txt_title_transaction_type">Transaction Type</string>
<string name="txt_qr_sale">QR Sale</string>
<string name="txt_qr_refund">QR Refund</string>
<string name="txt_total_qr_transactions">Total QR Transactions</string>
<string name="txt_no_qr_transactions_to_settle">No QR transactions to settle</string>
<string name="txt_settle_qr_transactions">Confirm</string>
</resources>

View File

@ -285,8 +285,8 @@ public class NetworkModule {
tmsAddress = getTMSUrlFromNative();
}
// String baseUrl = tmsAddress.trim() + "/api/v1/";
String baseUrl = tmsAddress.trim() + "/";
String baseUrl = tmsAddress.trim() + "/api/v1/";
// String baseUrl = tmsAddress.trim() + "/";
final Gson gson =
new GsonBuilder().create();
@ -397,8 +397,8 @@ public class NetworkModule {
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.build();
// String baseUrl = "http://receipt-nest.utsmyanmar.com/";
String baseUrl = "https://api-tms-uat.kbzbank.com:8443/receipt/";
String baseUrl = "http://receipt-nest.utsmyanmar.com/";
// String baseUrl = "https://api-tms-uat.kbzbank.com:8443/receipt/";
return new Retrofit.Builder()
.baseUrl(baseUrl)

View File

@ -622,7 +622,7 @@ public abstract class BaseXPrint {
print2ColumnsString("PAYMENT NAME", "");
print2ColumnsString("EXP DATE", "");
print2ColumnsString("TRANSACTION", "TRACE NO");
print2ColumnsString("WAVE TRXN ID", "AMOUNT");
print2ColumnsString("TRXN ID", "AMOUNT");
}

View File

@ -19,6 +19,8 @@ public interface PrintX {
void printSmileSettlementReport(PayDetail payDetail,PrintXStatus printXStatus);
void printQRSettlementReport(PayDetail payDetail,List<PayDetail> list,PrintXStatus printXStatus);
void printDetailReport(PayDetail payDetail, List<PayDetail> lists, HostType hostType,PrintXStatus printXStatus);
void printKeyStatus();

View File

@ -203,6 +203,27 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
}
}
@Override
public void printQRSettlementReport(PayDetail payDetail, List<PayDetail> list, PrintXStatus printXStatus) {
this.callbackStatus = printXStatus;
try {
LogUtil.d(TAG, payDetail.getSettleDataObj().toString());
setHeight(0x12);
printLogo();
printMerchantHeader();
printTransHeader(payDetail);
printTransDetailReport(list,HostType.QR);
printTransFooterSummary();
emptyLine(1);
startPrintNex();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void printDetailReport(PayDetail payDetail, List<PayDetail> lists, HostType hostType,PrintXStatus printXStatus) {
this.callbackStatus = printXStatus;

View File

@ -35,6 +35,10 @@ public class PrintXReceipt {
printX.printSmileSettlementReport(payDetail,printXStatus);
}
public void printQRSettlementReport(PayDetail payDetail,List<PayDetail> lists,PrintXStatus printXStatus) {
printX.printQRSettlementReport(payDetail,lists,printXStatus);
}
public void printSmileSummaryReport(PayDetail payDetail,PrintXStatus printXStatus) {
printX.printSmileSummaryReport(payDetail,printXStatus);
}

View File

@ -42,8 +42,8 @@ public class SystemParamsSettings implements Serializable {
// private String tmsAddress = "https://tms.smile-mm.com";
// private String tmsAddress = "http://128.199.170.203";
// private String tmsAddress = "http://sirius-nest.utsmyanmar.com";
private String tmsAddress = "https://api-tms-uat.kbzbank.com:8443/sirius";
private String tmsAddress = "http://sirius-nest.utsmyanmar.com";
// private String tmsAddress = "https://api-tms-uat.kbzbank.com:8443/sirius";
private String ereceiptAddress = "http://receipt-nest.utsmyanmar.com";
private String terminalCapability = "E0E8C8";

View File

@ -48,7 +48,8 @@ public enum TransactionsType {
DETAIL_REPORT("DETAIL_REPORT",33,"000000"),
MMQR_REFUND("QR_REFUND",34,"000000");
MMQR_REFUND("QR_REFUND",34,"000000"),
MMQR_SETTLEMENT("QR_SETTLEMENT",35,"000000");
public final String name;