added auto reversal

This commit is contained in:
kizzy 2026-03-26 16:04:14 +07:00
parent c503b95027
commit 01043dbbca
7 changed files with 188 additions and 15 deletions

View File

@ -327,6 +327,17 @@ public class SettingsFragment extends DataBindingFragment {
} }
} }
public void onClearReversalClick() {
try {
sharedViewModel.transactionsType.postValue(TransactionsType.CLEAR_REVERSAL);
sharedViewModel.setTransMenu(TransMenu.CLEAR_REVERSAL);
Navigation.findNavController(requireActivity(), R.id.nav_host_fragment)
.navigate(R.id.inputPasswordFragment);
} catch (Exception e) {
LogUtil.e(TAG, "Error in clear reversal click: " + e.getMessage());
}
}
public void onTmsConfigClick() { public void onTmsConfigClick() {
try { try {
LogUtil.d(TAG, "TMS Config clicked"); LogUtil.d(TAG, "TMS Config clicked");

View File

@ -6,6 +6,7 @@ import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import androidx.navigation.NavController; import androidx.navigation.NavController;
import androidx.navigation.NavDestination; import androidx.navigation.NavDestination;
@ -17,6 +18,9 @@ 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.baselib.util.TimeoutCallback; import com.utsmyanmar.baselib.util.TimeoutCallback;
import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.reversal.ReversalAction;
import com.utsmyanmar.paylibs.reversal.ReversalListener;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmm.kbz.BR; import com.utsmm.kbz.BR;
import com.utsmm.kbz.R; import com.utsmm.kbz.R;
@ -104,6 +108,17 @@ public class ProcessingFragment extends DataBindingFragment {
setToolBarTitleWithoutBackIcon(getResourceString(R.string.title_processing)); setToolBarTitleWithoutBackIcon(getResourceString(R.string.title_processing));
checkReversal();
// disableNavigationBar();
getNavController(Constants.NAV_HOST_ID).addOnDestinationChangedListener(listener);
}
private void startTransactionProcess() {
if(isEmvTrans()) { if(isEmvTrans()) {
startTransactionProcess(emvTransactionProcessViewModel); startTransactionProcess(emvTransactionProcessViewModel);
} else { } else {
@ -111,11 +126,44 @@ public class ProcessingFragment extends DataBindingFragment {
} }
sharedViewModel.loadingMsg(getResourceString(R.string.txt_sending)); sharedViewModel.loadingMsg(getResourceString(R.string.txt_sending));
}
// disableNavigationBar(); private void checkReversal() {
sharedViewModel.getLastReversalTransaction().observe(getViewLifecycleOwner(), new Observer<PayDetail>() {
@Override
public void onChanged(PayDetail payDetail) {
if(payDetail != null) {
TradeData tradeData = new TradeData();
tradeData.setPayDetail(payDetail);
LogUtil.d(TAG,"Sending Reversal!");
sharedViewModel.loadingMsg(getResourceString(R.string.txt_sending_reversal));
getNavController(Constants.NAV_HOST_ID).addOnDestinationChangedListener(listener); ReversalAction.getInstance().setData(tradeData).enqueue().startReversal(new ReversalListener() {
@Override
public void onSuccessReversal() {
LogUtil.d(TAG,"Reversal Success!");
payDetail.setIsNeedReversal(false);
sharedViewModel.updatePayDetail(payDetail);
startTransactionProcess();
}
@Override
public void onNetworkFail(String msg) {
LogUtil.d(TAG,"Reversal Network Fail!"+msg);
startTransactionProcess();
}
@Override
public void onFailReversal(String msg) {
LogUtil.d(TAG,"Reversal Fail!"+msg);
startTransactionProcess();
}
});
} else {
startTransactionProcess();
}
}
});
} }
private boolean isEmvTrans() { private boolean isEmvTrans() {

View File

@ -2,6 +2,7 @@ package com.utsmm.kbz.ui.core_viewmodel;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.util.Log; import android.util.Log;
import android.widget.ListView;
import dagger.hilt.android.lifecycle.HiltViewModel; import dagger.hilt.android.lifecycle.HiltViewModel;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
@ -447,6 +448,14 @@ public class SharedViewModel extends ViewModel {
return repository.getReversalTransaction(voucherNo); return repository.getReversalTransaction(voucherNo);
} }
public LiveData<PayDetail> getLastReversalTransaction() {
return repository.getLastReversalTransaction();
}
public LiveData<List<PayDetail>> getAllReversalTransaction() {
return repository.getAllReversalTransactions();
}
public void updatePayDetail(PayDetail payDetail){ public void updatePayDetail(PayDetail payDetail){
repository.updatePayDetail(payDetail); repository.updatePayDetail(payDetail);
} }

View File

@ -210,13 +210,35 @@ public class SelectHostFragment extends DataBindingFragment implements DataBindi
private void clearReversal() { private void clearReversal() {
checkPointReversal = false; checkPointReversal = false;
sharedViewModel.getReversalTransaction(SystemParamsOperation.getInstance().getCurrentSerialNum()).observe(getViewLifecycleOwner(), payDetail -> { // sharedViewModel.getReversalTransaction(SystemParamsOperation.getInstance().getCurrentSerialNum()).observe(getViewLifecycleOwner(), payDetail -> {
if (payDetail != null) { // if (payDetail != null) {
if (!checkPointReversal) { // if (!checkPointReversal) {
// payDetail.setIsNeedReversal(false);
// sharedViewModel.updatePayDetail(payDetail);
// checkPointReversal = true;
//
// showSuccessDialog("Clear reversal success!");
// }
// } else {
// if (!checkPointReversal) {
// showInfoDialog("Clear reversal", "No reversal found!");
// checkPointReversal = true;
// }
//
// }
// });
sharedViewModel.getAllReversalTransaction().observe(getViewLifecycleOwner(), new Observer<List<PayDetail>>() {
@Override
public void onChanged(List<PayDetail> payDetails) {
if(payDetails != null && !payDetails.isEmpty()) {
if(!checkPointReversal) {
for (PayDetail payDetail : payDetails) {
payDetail.setIsNeedReversal(false); payDetail.setIsNeedReversal(false);
sharedViewModel.updatePayDetail(payDetail); sharedViewModel.updatePayDetail(payDetail);
checkPointReversal = true;
}
checkPointReversal = true;
showSuccessDialog("Clear reversal success!"); showSuccessDialog("Clear reversal success!");
} }
} else { } else {
@ -224,7 +246,7 @@ public class SelectHostFragment extends DataBindingFragment implements DataBindi
showInfoDialog("Clear reversal", "No reversal found!"); showInfoDialog("Clear reversal", "No reversal found!");
checkPointReversal = true; checkPointReversal = true;
} }
}
} }
}); });
} }

View File

@ -969,6 +969,81 @@
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<!-- Clear Reversal Card -->
<androidx.cardview.widget.CardView
android:id="@+id/clearReversalCard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
android:onClick="@{()->click.onClearReversalClick()}"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="16dp"
app:cardElevation="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="20dp">
<androidx.cardview.widget.CardView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginEnd="16dp"
app:cardBackgroundColor="@color/colorPrimary"
app:cardCornerRadius="24dp"
app:cardElevation="0dp">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center"
android:src="@drawable/ic_clear_all"
app:tint="@color/white" />
</androidx.cardview.widget.CardView>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/rubik_medium"
android:text="@string/title_clear_reversal"
android:textColor="@color/colorTextTitle"
android:textSize="18sp"
android:textStyle="bold"
tools:fontFamily="sans-serif-medium" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:fontFamily="@font/rubik_regular"
android:text="@string/clear_reversal_description"
android:textColor="@color/colorTextContent"
android:textSize="14sp"
tools:fontFamily="sans-serif" />
</LinearLayout>
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/ic_right_arrow"
app:tint="@color/colorPrimary" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<!-- TMS Server URL Card --> <!-- TMS Server URL Card -->
<!-- android:onClick="@{()->click.onTmsAddressClick()}"--> <!-- android:onClick="@{()->click.onTmsAddressClick()}"-->
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView

View File

@ -97,6 +97,12 @@ public interface PayDetailDao {
@Query("SELECT * FROM paydetail WHERE transactionType = 10 AND isNeedReversal = 1 AND voucherNo IN(:voucherNo)") @Query("SELECT * FROM paydetail WHERE transactionType = 10 AND isNeedReversal = 1 AND voucherNo IN(:voucherNo)")
LiveData<PayDetail> getReversalTransaction(String voucherNo); LiveData<PayDetail> getReversalTransaction(String voucherNo);
@Query("SELECT * FROM PayDetail WHERE isNeedReversal = 1 ORDER BY PID DESC LIMIT 1")
LiveData<PayDetail> getLastReversalTransactionLive();
@Query("SELECT * FROM PayDetail WHERE isNeedReversal = 1 ORDER BY PID DESC")
LiveData<List<PayDetail>> getAllReversalTransactionsLive();
// @Query("SELECT * FROM paydetail WHERE transactionType != 10 ORDER BY PID DESC") // @Query("SELECT * FROM paydetail WHERE transactionType != 10 ORDER BY PID DESC")
@Query("SELECT * FROM paydetail ORDER BY PID DESC") @Query("SELECT * FROM paydetail ORDER BY PID DESC")
LiveData<List<PayDetail>> getTransactionHistory(); LiveData<List<PayDetail>> getTransactionHistory();

View File

@ -146,6 +146,8 @@ public class Repository {
public void updatePayDetail(PayDetail payDetail){payDetailDao.update(payDetail);} public void updatePayDetail(PayDetail payDetail){payDetailDao.update(payDetail);}
public LiveData<PayDetail> getReversalTransaction(String voucherNo) { return payDetailDao.getReversalTransaction(voucherNo);} public LiveData<PayDetail> getReversalTransaction(String voucherNo) { return payDetailDao.getReversalTransaction(voucherNo);}
public LiveData<PayDetail> getLastReversalTransaction() { return payDetailDao.getLastReversalTransactionLive();}
public LiveData<List<PayDetail>> getAllReversalTransactions() { return payDetailDao.getAllReversalTransactionsLive();}
public LiveData<List<PayDetail>> getTransactionHistory(){ return payDetailDao.getTransactionHistory();} public LiveData<List<PayDetail>> getTransactionHistory(){ return payDetailDao.getTransactionHistory();}