From 476e1d9eaa8f57ce08dc406cc59c05ef11cae011 Mon Sep 17 00:00:00 2001 From: kizzy Date: Thu, 13 Nov 2025 02:49:21 +0700 Subject: [PATCH] corrected refund flow --- .idea/migrations.xml | 10 + .../kbz/ui/core_ui/InputPasswordFragment.java | 2 +- .../com/utsmm/kbz/ui/kpay/KPayViewModel.java | 12 + .../utsmm/kbz/ui/qr_pay/QRPayFragment.java | 4 +- .../com/utsmm/kbz/ui/qr_pay/QRRefund.java | 49 ++++ .../kbz/ui/qr_pay/QRRefundDetailFragment.java | 179 +++------------ .../ui/qr_pay/QRRefundProcessFragment.java | 215 ++++++++++++++++++ .../res/layout/fragment_qr_refund_process.xml | 44 ++++ .../main/res/navigation/mobile_navigation.xml | 28 ++- app/src/main/res/values/strings.xml | 1 + 10 files changed, 386 insertions(+), 158 deletions(-) create mode 100644 .idea/migrations.xml create mode 100644 app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefund.java create mode 100644 app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundProcessFragment.java create mode 100644 app/src/main/res/layout/fragment_qr_refund_process.xml diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputPasswordFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputPasswordFragment.java index 45496fe..d81fc00 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputPasswordFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputPasswordFragment.java @@ -144,7 +144,7 @@ public class InputPasswordFragment extends DataBindingFragment implements DataBi switch (Objects.requireNonNull(sharedViewModel.transactionsType.getValue())) { case MMQR_REFUND: inputPasswordViewModel.passwordType.setValue(InputPasswordType.SYSTEM); - routeId = R.id.action_inputPasswordFragment_to_qrRefundList; + routeId = R.id.action_inputPasswordFragment_to_QRRefundProcessFragment; break; case PRE_AUTH_COMPLETE_VOID: inputPasswordViewModel.passwordType.setValue(InputPasswordType.SYSTEM); diff --git a/app/src/main/java/com/utsmm/kbz/ui/kpay/KPayViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/kpay/KPayViewModel.java index 4d715b0..063bdf8 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/kpay/KPayViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/kpay/KPayViewModel.java @@ -13,6 +13,7 @@ import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import com.kizzy.xpay.util.Sign; +import com.utsmm.kbz.ui.qr_pay.QRRefund; import com.utsmyanmar.baselib.network.model.DemoQRRequest; import com.utsmyanmar.baselib.network.model.DemoQRResponse; import com.utsmyanmar.baselib.network.model.DemoQRReturnRequest; @@ -66,6 +67,7 @@ public class KPayViewModel extends ViewModel { + private String generateRandomTwoChars() { // You can reuse the existing character set and SecureRandom instance StringBuilder randomChars = new StringBuilder(3); @@ -292,6 +294,16 @@ public class KPayViewModel extends ViewModel { private TradeData tradeData; private PayDetail payDetail; + private QRRefund qrRefund; + + public QRRefund getQrRefund() { + return qrRefund; + } + + public void setQrRefund(QRRefund qrRefund) { + this.qrRefund = qrRefund; + } + public void setTradeData(TradeData tradeData){ this.tradeData = tradeData; } diff --git a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRPayFragment.java b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRPayFragment.java index c4b697b..9ee8141 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRPayFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRPayFragment.java @@ -136,8 +136,8 @@ public class QRPayFragment extends DataBindingFragment { private void onClickRefund(){ sharedViewModel.setTransactionsType(TransactionsType.MMQR_REFUND); -// routeId = R.id.action_qrFragment_to_qr_refund_list; - routeId = R.id.action_qrFragment_to_inputPasswordFragment; + routeId = R.id.action_qrFragment_to_qr_refund_list; +// routeId = R.id.action_qrFragment_to_inputPasswordFragment; safeNavigateToRouteId(); } diff --git a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefund.java b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefund.java new file mode 100644 index 0000000..05efe08 --- /dev/null +++ b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefund.java @@ -0,0 +1,49 @@ +package com.utsmm.kbz.ui.qr_pay; + +public class QRRefund { + + private String referenceNo; + private String refundAmount; + private String originalAmount; + private String reason; + + public QRRefund(String referenceNo, String refundAmount, String originalAmount, String reason) { + this.referenceNo = referenceNo; + this.refundAmount = refundAmount; + this.originalAmount = originalAmount; + this.reason = reason; + } + + public String getReferenceNo() { + return referenceNo; + } + + public void setReferenceNo(String referenceNo) { + this.referenceNo = referenceNo; + } + + public String getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(String refundAmount) { + this.refundAmount = refundAmount; + } + + public String getOriginalAmount() { + return originalAmount; + } + + public void setOriginalAmount(String originalAmount) { + this.originalAmount = originalAmount; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + +} diff --git a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundDetailFragment.java b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundDetailFragment.java index fb0c98d..3dbd4c6 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundDetailFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundDetailFragment.java @@ -13,12 +13,9 @@ import androidx.annotation.Nullable; import com.utsmm.kbz.ui.kpay.KPayViewModel; import com.utsmyanmar.baselib.fragment.DataBindingFragment; -import com.utsmyanmar.baselib.network.model.KPayRefund; import com.utsmyanmar.baselib.util.DataBindingConfig; import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.model.TradeData; -import com.utsmyanmar.paylibs.system.SystemDateTime; -import com.utsmyanmar.paylibs.utils.POSUtil; import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType; import com.utsmm.kbz.BR; @@ -31,14 +28,13 @@ import com.utsmm.kbz.util.ecr.CoreUtils; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.disposables.CompositeDisposable; -import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.schedulers.Schedulers; import com.utsmyanmar.paylibs.utils.LogUtil; public class QRRefundDetailFragment extends DataBindingFragment { private SharedViewModel sharedViewModel; - private KPayViewModel KPayViewModel; + private KPayViewModel kPayViewModel; private int routeId; @@ -53,8 +49,7 @@ public class QRRefundDetailFragment extends DataBindingFragment { private boolean isPartialRefund = false; - CompositeDisposable refundDisposable = new CompositeDisposable(); - CompositeDisposable retrieveUpdateDisposable = new CompositeDisposable(); + private static final String TAG = com.utsmm.kbz.ui.kpay.QRRefundFragment.class.getSimpleName(); @@ -64,13 +59,13 @@ public class QRRefundDetailFragment extends DataBindingFragment { @Override protected void initViewModel() { sharedViewModel = getFragmentScopeViewModel(SharedViewModel.class); - KPayViewModel = getFragmentScopeViewModel(KPayViewModel.class); + kPayViewModel = getFragmentScopeViewModel(KPayViewModel.class); } @Override protected DataBindingConfig getDataBindingConfig() { return new DataBindingConfig(R.layout.fragment_qr_refund_detail, BR.sharedViewModel, sharedViewModel) - .addBindingParam(BR.kPayViewModel, KPayViewModel) + .addBindingParam(BR.kPayViewModel, kPayViewModel) .addBindingParam(BR.click, new ClickEvent()); } @@ -101,15 +96,10 @@ public class QRRefundDetailFragment extends DataBindingFragment { public void onResume() { super.onResume(); setToolBarTitleWithBackIcon("KPay Refund"); - KPayViewModel.invalidAmountMsg.setValue(""); + kPayViewModel.invalidAmountMsg.setValue(""); } - @Override - public void onDestroyView() { - super.onDestroyView(); - refundDisposable.dispose(); - retrieveUpdateDisposable.dispose(); - } + @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { @@ -165,130 +155,6 @@ public class QRRefundDetailFragment extends DataBindingFragment { }); } - private void processKPayRefund(String referenceNo, String refundAmount, String originalAmount, String reason) { - String merchantId = TransactionUtil.getInstance().getQRMerchantId(); - - // Generate unique refund request ID - String refundRequestId = referenceNo + "R"; - - showLoadingDialog("Processing refund..."); - - // Create KPay refund request - KPayRefund.RefundRequest refundRequest = KPayViewModel.createRefundRequest( - refundRequestId, - referenceNo, - merchantId, - refundAmount, - reason != null ? reason : "Refund request" - ); - - Disposable refundDi = KPayViewModel.kPayRefund(refundRequest) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - response -> { - dismissLoadingDialog(); - handleRefundResponse(response, referenceNo); - }, - throwable -> { - dismissLoadingDialog(); - LogUtil.e(TAG, "Refund error: " + throwable.getMessage()); - showDeclineDialog("Refund failed!\nCommunication Error!"); - ecrActionCancel("Refund failed"); - navigateToMain(); - }, - () -> LogUtil.d(TAG, "Refund request completed") - ); - - refundDisposable.add(refundDi); - } - - private void handleRefundResponse(KPayRefund.RefundResponse response, String referenceNo) { - if (response != null && response.getResponse() != null && "REFUND_SUCCESS".equalsIgnoreCase(response.getResponse().getRefundStatus())) { - LogUtil.d(TAG, "Refund successful!"); - - String refundAmount = response.getResponse().getRefundAmount(); - - String dateTime = SystemDateTime.getTodayDateFormat() + " " + SystemDateTime.getTodayTimeFormat(); - payDetail.setAmount(refundAmount == null ? 0 : POSUtil.getInstance().convertAmount(refundAmount)); - payDetail.setOriginalTransDate(dateTime); - payDetail.setQrTransStatus(1); - payDetail.setQrReferNo(referenceNo); - payDetail.setReferNo(referenceNo); - payDetail.setIsCanceled(true); - - retrievedUpdatePayDetail(referenceNo); - - } else { - LogUtil.d(TAG, "Refund failed!"); - payDetail.setQrTransStatus(-1); - payDetail.setQrReferNo(referenceNo); - payDetail.setReferNo(referenceNo); - - String errorMsg = "Refund failed"; - if (response != null && response.getResponse() != null && response.getResponse().getMsg() != null) { - errorMsg = response.getResponse().getMsg(); - } - payDetail.setTradeResultDes(errorMsg); - - sharedViewModel.payDetail.setValue(payDetail); - navigateToNext(); - } - } - - private void retrievedUpdatePayDetail(String refNum) { - LogUtil.d(TAG, "Trying to update Database!"); - retrieveUpdateDisposable.add(KPayViewModel.searchPayByRefNum(refNum) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(oldPay -> { - LogUtil.d(TAG, "Inside the subscribe!"); - if (oldPay != null) { - oldPay.setIsCanceled(true); - payDetail.setQrTransId(oldPay.getQrTransId()); - payDetail.setCustomerMobile(oldPay.getCustomerMobile()); - sharedViewModel.updatePayDetail(oldPay); - } - updateData(); - navigateToNext(); - }, - onError -> { - LogUtil.d(TAG, "On error Unable to retrieve PayDetail"); - updateData(); - navigateToNext(); - }, - () -> { - LogUtil.d(TAG, "No data found! navigating to Result Page!"); - updateData(); - navigateToNext(); - } - )); - } - - private void updateData() { - KPayViewModel.insertPayDetail(payDetail); - sharedViewModel.payDetail.postValue(payDetail); - } - - private void navigateToMain() { - routeId = R.id.action_QRRefundDetail_to_nav_main; - safeNavigateToRouteId(); - } - - private void navigateToNext() { - routeId = R.id.action_QRRefundDetail_to_transactionResultFragment; - safeNavigateToRouteId(); - } - - private void ecrActionCancel(String msg) { - if (sharedViewModel.isEcr.getValue() != null) { - if (sharedViewModel.isEcr.getValue()) { - sharedViewModel.isEcr.postValue(false); - CoreUtils.getInstance(sharedViewModel).responseRejectMsg(msg); - sharedViewModel.isEcrFinished.postValue(true); - } - } - } public class ClickEvent { @@ -297,14 +163,14 @@ public class QRRefundDetailFragment extends DataBindingFragment { } public void onConfirm() { - KPayViewModel.invalidAmountMsg.setValue(""); + kPayViewModel.invalidAmountMsg.setValue(""); String referenceNo = etReferenceNo.getText().toString().trim(); String refundReason = etRefundReason.getText().toString().trim(); // Validate reference number if (referenceNo.isEmpty()) { - KPayViewModel.invalidAmountMsg.setValue("Enter reference number"); + kPayViewModel.invalidAmountMsg.setValue("Enter reference number"); return; } @@ -314,12 +180,12 @@ public class QRRefundDetailFragment extends DataBindingFragment { String refundAmountStr = etRefundAmount.getText().toString().trim(); if (originalAmountStr.isEmpty()) { - KPayViewModel.invalidAmountMsg.setValue("Enter original amount"); + kPayViewModel.invalidAmountMsg.setValue("Enter original amount"); return; } if (refundAmountStr.isEmpty()) { - KPayViewModel.invalidAmountMsg.setValue("Enter refund amount"); + kPayViewModel.invalidAmountMsg.setValue("Enter refund amount"); return; } @@ -327,31 +193,38 @@ public class QRRefundDetailFragment extends DataBindingFragment { double refundAmount = Double.parseDouble(refundAmountStr); if (originalAmount <= 0) { - KPayViewModel.invalidAmountMsg.setValue("Enter valid original amount"); + kPayViewModel.invalidAmountMsg.setValue("Enter valid original amount"); return; } if (refundAmount <= 0) { - KPayViewModel.invalidAmountMsg.setValue("Enter valid refund amount"); + kPayViewModel.invalidAmountMsg.setValue("Enter valid refund amount"); return; } if (refundAmount > originalAmount) { - KPayViewModel.invalidAmountMsg.setValue("Refund amount cannot exceed original amount"); + kPayViewModel.invalidAmountMsg.setValue("Refund amount cannot exceed original amount"); return; } - processKPayRefund(referenceNo, refundAmountStr, originalAmountStr, refundReason); + + QRRefund qrRefund = new QRRefund(referenceNo, refundAmountStr, originalAmountStr, refundReason); + + kPayViewModel.setQrRefund(qrRefund); } else { - // Original amount refund - no amount validation needed - processKPayRefund(referenceNo, "0", String.valueOf( etOriginalAmount.getText().toString().trim()), refundReason); + QRRefund qrRefund = new QRRefund(referenceNo, "0", etOriginalAmount.getText().toString().trim(), refundReason); + + kPayViewModel.setQrRefund(qrRefund); } + + kPayViewModel.setPayDetail(payDetail); + + navigateToPassword(); } } public void navigateToPassword(){ - sharedViewModel.transactionsType.setValue(TransactionsType.MMQR_REFUND); - routeId = R.id.action_qrRefundPasswordFragment_to_inputPasswordFragment; - safeRouteTo(currentId,routeId,hostId); + routeId = R.id.action_QRRefundDetail_to_inputPasswordFragment; + safeNavigateToRouteId(); } } diff --git a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundProcessFragment.java b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundProcessFragment.java new file mode 100644 index 0000000..f2e680e --- /dev/null +++ b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundProcessFragment.java @@ -0,0 +1,215 @@ +package com.utsmm.kbz.ui.qr_pay; + +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +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.kpay.KPayViewModel; +import com.utsmm.kbz.ui.kpay.QRRefundFragment; +import com.utsmm.kbz.util.TransactionUtil; +import com.utsmm.kbz.util.ecr.CoreUtils; +import com.utsmyanmar.baselib.fragment.DataBindingFragment; +import com.utsmyanmar.baselib.network.model.KPayRefund; +import com.utsmyanmar.baselib.util.DataBindingConfig; +import com.utsmyanmar.paylibs.model.PayDetail; +import com.utsmyanmar.paylibs.system.SystemDateTime; +import com.utsmyanmar.paylibs.utils.LogUtil; +import com.utsmyanmar.paylibs.utils.POSUtil; + +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.disposables.CompositeDisposable; +import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.schedulers.Schedulers; + +public class QRRefundProcessFragment extends DataBindingFragment { + + private static final String TAG = QRRefundProcessFragment.class.getSimpleName(); + private SharedViewModel sharedViewModel; + private KPayViewModel kPayViewModel; + + private PayDetail payDetail; + + private QRRefund qrRefund; + private static final int hostId = Constants.NAV_HOST_ID; + private int routeId; + private static final int currentId = R.id.QRRefundProcessFragment; + + CompositeDisposable retrieveUpdateDisposable = new CompositeDisposable(); + CompositeDisposable refundDisposable = new CompositeDisposable(); + + @Override + protected void initViewModel() { + sharedViewModel = getFragmentScopeViewModel(SharedViewModel.class); + kPayViewModel = getFragmentScopeViewModel(KPayViewModel.class); + } + + @Override + protected DataBindingConfig getDataBindingConfig() { + return new DataBindingConfig(R.layout.fragment_qr_refund_process, BR.sharedViewModel, sharedViewModel) + .addBindingParam(BR.kPayViewModel, kPayViewModel); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + retrieveUpdateDisposable.dispose(); + refundDisposable.dispose(); + } + + @Override + protected int currentId() { + return currentId; + } + + @Override + protected int hostId() { + return hostId; + } + + @Override + protected int routeId() { + return routeId; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + initData(); + + processKPayRefund(qrRefund.getReferenceNo(), qrRefund.getRefundAmount(), qrRefund.getOriginalAmount(), qrRefund.getReason()); + } + + private void initData() { + payDetail = kPayViewModel.getPayDetail(); + qrRefund = kPayViewModel.getQrRefund(); + } + + private void processKPayRefund(String referenceNo, String refundAmount, String originalAmount, String reason) { + String merchantId = TransactionUtil.getInstance().getQRMerchantId(); + + // Generate unique refund request ID + String refundRequestId = referenceNo + "R"; + + + // Create KPay refund request + KPayRefund.RefundRequest refundRequest = kPayViewModel.createRefundRequest( + refundRequestId, + referenceNo, + merchantId, + refundAmount, + reason != null ? reason : "Refund request" + ); + + Disposable refundDi = kPayViewModel.kPayRefund(refundRequest) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + response -> { + handleRefundResponse(response, referenceNo); + }, + throwable -> { + LogUtil.e(TAG, "Refund error: " + throwable.getMessage()); + showDeclineDialog("Refund failed!\nCommunication Error!"); + ecrActionCancel("Refund failed"); + navigateToMain(); + }, + () -> LogUtil.d(TAG, "Refund request completed") + ); + + refundDisposable.add(refundDi); + } + + private void handleRefundResponse(KPayRefund.RefundResponse response, String referenceNo) { + if (response != null && response.getResponse() != null && "REFUND_SUCCESS".equalsIgnoreCase(response.getResponse().getRefundStatus())) { + LogUtil.d(TAG, "Refund successful!"); + + String refundAmount = response.getResponse().getRefundAmount(); + + String dateTime = SystemDateTime.getTodayDateFormat() + " " + SystemDateTime.getTodayTimeFormat(); + payDetail.setAmount(refundAmount == null ? 0 : POSUtil.getInstance().convertAmount(refundAmount)); + payDetail.setOriginalTransDate(dateTime); + payDetail.setQrTransStatus(1); + payDetail.setQrReferNo(referenceNo); + payDetail.setReferNo(referenceNo); + payDetail.setIsCanceled(true); + + retrievedUpdatePayDetail(referenceNo); + + } else { + LogUtil.d(TAG, "Refund failed!"); + payDetail.setQrTransStatus(-1); + payDetail.setQrReferNo(referenceNo); + payDetail.setReferNo(referenceNo); + + String errorMsg = "Refund failed"; + if (response != null && response.getResponse() != null && response.getResponse().getMsg() != null) { + errorMsg = response.getResponse().getMsg(); + } + payDetail.setTradeResultDes(errorMsg); + + sharedViewModel.payDetail.setValue(payDetail); + navigateToNext(); + } + } + + private void retrievedUpdatePayDetail(String refNum) { + LogUtil.d(TAG, "Trying to update Database!"); + retrieveUpdateDisposable.add(kPayViewModel.searchPayByRefNum(refNum) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(oldPay -> { + LogUtil.d(TAG, "Inside the subscribe!"); + if (oldPay != null) { + oldPay.setIsCanceled(true); + payDetail.setQrTransId(oldPay.getQrTransId()); + payDetail.setCustomerMobile(oldPay.getCustomerMobile()); + sharedViewModel.updatePayDetail(oldPay); + } + updateData(); + navigateToNext(); + }, + onError -> { + LogUtil.d(TAG, "On error Unable to retrieve PayDetail"); + updateData(); + navigateToNext(); + }, + () -> { + LogUtil.d(TAG, "No data found! navigating to Result Page!"); + updateData(); + navigateToNext(); + } + )); + } + + private void updateData() { + kPayViewModel.insertPayDetail(payDetail); + sharedViewModel.payDetail.postValue(payDetail); + } + + private void navigateToNext() { + routeId = R.id.action_QRRefundProcessFragment_to_transactionResultFragment; + safeNavigateToRouteId(); + } + + private void navigateToMain() { + routeId = R.id.action_QRRefundProcessFragment_to_nav_main; + safeNavigateToRouteId(); + } + + private void ecrActionCancel(String msg) { + if (sharedViewModel.isEcr.getValue() != null) { + if (sharedViewModel.isEcr.getValue()) { + sharedViewModel.isEcr.postValue(false); + CoreUtils.getInstance(sharedViewModel).responseRejectMsg(msg); + sharedViewModel.isEcrFinished.postValue(true); + } + } + } +} diff --git a/app/src/main/res/layout/fragment_qr_refund_process.xml b/app/src/main/res/layout/fragment_qr_refund_process.xml new file mode 100644 index 0000000..baabe78 --- /dev/null +++ b/app/src/main/res/layout/fragment_qr_refund_process.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 387d79e..ae32018 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -341,6 +341,12 @@ app:popUpToInclusive="true" android:id="@+id/action_inputPasswordFragment_to_qrRefundList" app:destination="@id/qrRefundList" /> + @@ -1148,9 +1154,27 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9d4e84e..641da3b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -362,6 +362,7 @@ Alert Sound Echo Test Processing card, please wait... + Processing refund, please wait... Processing Card Log-On Log-Off