Compare commits

..

No commits in common. "22d60669332fde46139574bfa28e0943b96b51a2" and "1e29fd9fab677019e677f7954ce430ee932de5e4" have entirely different histories.

21 changed files with 31 additions and 371 deletions

View File

@ -13,39 +13,6 @@
</DropdownSelection> </DropdownSelection>
<DialogSelection /> <DialogSelection />
</SelectionState> </SelectionState>
<SelectionState runConfigName="unitTest">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2026-01-20T10:19:44.274945Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="PhysicalDevice" identifier="serial=0123456789ABCDEF" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="androidTest">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2026-01-20T10:19:44.274945Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="PhysicalDevice" identifier="serial=0123456789ABCDEF" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="main">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2026-01-20T10:19:44.274945Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="PhysicalDevice" identifier="serial=0123456789ABCDEF" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection />
</SelectionState>
</selectionStates> </selectionStates>
</component> </component>
</project> </project>

View File

@ -128,8 +128,8 @@ public class MainViewModel extends ViewModel {
public LiveData<List<PayDetail>> getDeleteTrans() { public LiveData<List<PayDetail>> getDeleteTrans(String batchNo) {
return repository.getDeleteTrans(); return repository.getDeleteTrans(batchNo);
} }
private LiveData<List<PayDetail>> getPreAuthTrans() { private LiveData<List<PayDetail>> getPreAuthTrans() {
@ -171,7 +171,7 @@ public class MainViewModel extends ViewModel {
settlementPOS.postValue(payDetails); settlementPOS.postValue(payDetails);
} }
}); });
getDeleteTrans().observeForever(new Observer<List<PayDetail>>() { getDeleteTrans(SystemParamsOperation.getInstance().getCurrentBatchNum()).observeForever(new Observer<List<PayDetail>>() {
@Override @Override
public void onChanged(List<PayDetail> payDetails) { public void onChanged(List<PayDetail> payDetails) {
deleteTrans.postValue(payDetails); deleteTrans.postValue(payDetails);

View File

@ -116,14 +116,7 @@ public class InputTraceNoFragment extends DataBindingFragment {
clearInputView(); clearInputView();
TransactionsType currentTransType = sharedViewModel.transactionsType.getValue(); setToolBarTitleWithBackIcon(getResourceString(R.string.title_trace_number));
if (currentTransType == TransactionsType.VOID
|| currentTransType == TransactionsType.TIP_ADJUSTMENT
|| currentTransType == TransactionsType.PRE_AUTH_COMPLETE_VOID) {
setToolBarTitleWithBackIcon(getResourceString(R.string.title_invoice_number));
} else {
setToolBarTitleWithBackIcon(getResourceString(R.string.title_trace_number));
}
if (sharedViewModel.isEcr.getValue() != null) { if (sharedViewModel.isEcr.getValue() != null) {
if (sharedViewModel.isEcr.getValue()) { if (sharedViewModel.isEcr.getValue()) {
@ -158,9 +151,10 @@ public class InputTraceNoFragment extends DataBindingFragment {
configTime = "23:00"; configTime = "23:00";
} }
LogUtil.d(TAG,"Input invoice :"+traceNo); LogUtil.d(TAG,"Input trace :"+traceNo);
voidViewModel.getVoidTransByInvoice(transType, POSUtil.getInstance().formatTrace(traceNo)).observe(getViewLifecycleOwner(), new Observer<PayDetail>() { // voidViewModel.getGenericVoidTransactions(transType,POSUtil.getInstance().formatTrace(traceNo),isEmv).observe(getViewLifecycleOwner(), new Observer<PayDetail>() {
voidViewModel.getVoidTrans(transType,POSUtil.getInstance().formatTrace(traceNo)).observe(getViewLifecycleOwner(), new Observer<PayDetail>() {
@Override @Override
public void onChanged(PayDetail payDetail) { public void onChanged(PayDetail payDetail) {

View File

@ -11,7 +11,6 @@ import androidx.annotation.Nullable;
import com.github.gcacace.signaturepad.views.SignaturePad; import com.github.gcacace.signaturepad.views.SignaturePad;
import com.utsmm.kbz.util.helper.EReceiptHelper; import com.utsmm.kbz.util.helper.EReceiptHelper;
import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptCardRequest;
import com.utsmyanmar.baselib.util.DataBindingConfig; import com.utsmyanmar.baselib.util.DataBindingConfig;
import com.utsmm.kbz.BR; import com.utsmm.kbz.BR;
import com.utsmm.kbz.R; import com.utsmm.kbz.R;
@ -142,13 +141,14 @@ public class SignatureFragment extends DataBindingFragment {
payDetail.setESignBlob(blob); payDetail.setESignBlob(blob);
sharedViewModel.payDetail.setValue(payDetail); sharedViewModel.payDetail.setValue(payDetail);
sharedViewModel.updateESignBlob(payDetail.voucherNo, blob); sharedViewModel.updateESignBlob(payDetail.voucherNo, blob);
EReceiptCardRequest request = EReceiptHelper.buildEReceiptCardReceipt( sharedViewModel.pushReceipt(EReceiptHelper.buildEReceiptCardReceipt(
requireContext(), requireContext(),
payDetail, payDetail,
true, true,
BaseErrorCode.getCode(payDetail.getTradeAnswerCode()), BaseErrorCode.getCode(payDetail.getTradeAnswerCode()),
null); blob)
sharedViewModel.pushReceiptWithImage(request, blob); );
} }
public class ClickEvent { public class ClickEvent {

View File

@ -12,7 +12,6 @@ import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModel;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptCardRequest;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptResponse; import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptResponse;
import com.utsmyanmar.baselib.network.model.sirius.SiriusRequest; import com.utsmyanmar.baselib.network.model.sirius.SiriusRequest;
import com.utsmyanmar.baselib.network.model.sirius.SiriusResponse; import com.utsmyanmar.baselib.network.model.sirius.SiriusResponse;
@ -536,38 +535,6 @@ public class SharedViewModel extends ViewModel {
); );
} }
@SuppressLint("CheckResult")
public void pushReceiptWithImage(EReceiptCardRequest request, byte[] imageBytes) {
Log.d("push receipt", new Gson().toJson(request));
repository.sendReceiptWithImage(request, imageBytes)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
response -> {
Log.d("E-Receipt", "Success =>" + response.getMessage());
postToastMsg("E-Receipt saved successfully");
},
error -> {
if (error instanceof HttpException) {
HttpException httpEx = (HttpException) error;
try {
String errorJson = httpEx.response().errorBody().string();
Log.e("E-Receipt", "Raw error JSON => " + errorJson);
EReceiptResponse res = new Gson().fromJson(errorJson, EReceiptResponse.class);
Log.e("E-Receipt", "Parsed Error => " + res.getMessage());
postToastMsg("E-Receipt could not save!");
} catch (Exception e) {
e.printStackTrace();
postToastMsg("E-Receipt could not save!");
}
} else {
Log.e("E-Receipt", "Unexpected error => " + error.getMessage());
postToastMsg("E-Receipt could not save!");
}
}
);
}
public void printTerminalHostConfigs(){ public void printTerminalHostConfigs(){
PrintXReceipt.getInstance().printTerminalHostConfig(new PrintXStatus() { PrintXReceipt.getInstance().printTerminalHostConfig(new PrintXStatus() {

View File

@ -446,46 +446,4 @@ public class KPayViewModel extends ViewModel {
return repository.qrCloseOrder(request); return repository.qrCloseOrder(request);
} }
public KPayQRRequest.QRQueryRefundRequest getQueryRefundRequest(String merchOrderId, String mid) {
String currentTime = String.valueOf(System.currentTimeMillis());
String nonceStr = generateNonceStr();
Map<String, Object> bizContentMap = new HashMap<>();
bizContentMap.put("appid", appId);
bizContentMap.put("merch_code", mid);
bizContentMap.put("merch_order_id", merchOrderId);
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("timestamp", currentTime);
requestMap.put("nonce_str", nonceStr);
requestMap.put("method", "kbz.payment.queryrefund");
requestMap.put("sign_type", "SHA256");
requestMap.put("version", "1.0");
requestMap.put("biz_content", bizContentMap);
String sign = Sign.INSTANCE.generateSign(requestMap, appKey);
KPayQRRequest.QRQueryRefundRequest.Request.BizContent bizContent =
new KPayQRRequest.QRQueryRefundRequest.Request.BizContent(appId, mid, merchOrderId);
KPayQRRequest.QRQueryRefundRequest.Request requestBody =
new KPayQRRequest.QRQueryRefundRequest.Request(
currentTime,
nonceStr,
"kbz.payment.queryrefund",
"SHA256",
sign,
"1.0",
bizContent
);
return new KPayQRRequest.QRQueryRefundRequest(requestBody);
}
public Observable<KPayRefund.RefundResponse> checkRefundStatus(KPayQRRequest.QRQueryRefundRequest request) {
return repository.checkRefundStatus(request);
}
} }

View File

@ -13,7 +13,6 @@ import androidx.annotation.Nullable;
import com.utsmm.kbz.util.tms.TMSUtil; import com.utsmm.kbz.util.tms.TMSUtil;
import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.network.model.KPayQRRequest;
import com.utsmyanmar.baselib.network.model.KPayRefund; import com.utsmyanmar.baselib.network.model.KPayRefund;
//import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptQRRequest; //import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptQRRequest;
import com.utsmyanmar.baselib.util.DataBindingConfig; import com.utsmyanmar.baselib.util.DataBindingConfig;
@ -57,8 +56,6 @@ public class QRRefundFragment extends DataBindingFragment {
private boolean isPartialRefund = false; private boolean isPartialRefund = false;
CompositeDisposable refundDisposable = new CompositeDisposable(); CompositeDisposable refundDisposable = new CompositeDisposable();
CompositeDisposable refundStatusDisposable = new CompositeDisposable();
CompositeDisposable retrieveUpdateDisposable = new CompositeDisposable(); CompositeDisposable retrieveUpdateDisposable = new CompositeDisposable();
private static final String TAG = QRRefundFragment.class.getSimpleName(); private static final String TAG = QRRefundFragment.class.getSimpleName();
@ -102,7 +99,6 @@ public class QRRefundFragment extends DataBindingFragment {
public void onDestroyView() { public void onDestroyView() {
super.onDestroyView(); super.onDestroyView();
refundDisposable.dispose(); refundDisposable.dispose();
refundStatusDisposable.dispose();
retrieveUpdateDisposable.dispose(); retrieveUpdateDisposable.dispose();
} }
@ -175,7 +171,7 @@ public class QRRefundFragment extends DataBindingFragment {
.subscribe( .subscribe(
response -> { response -> {
dismissLoadingDialog(); dismissLoadingDialog();
handleRefundResponse(response, referenceNo, originalAmount); handleRefundResponse(response, referenceNo);
}, },
throwable -> { throwable -> {
dismissLoadingDialog(); dismissLoadingDialog();
@ -190,39 +186,7 @@ public class QRRefundFragment extends DataBindingFragment {
refundDisposable.add(refundDi); refundDisposable.add(refundDi);
} }
private void callQueryRefund(String referenceNo, String orgAmount) { private void handleRefundResponse(KPayRefund.RefundResponse response, String referenceNo) {
String mid = payDetail.getMerchantNo();
KPayQRRequest.QRQueryRefundRequest request = KPayViewModel.getQueryRefundRequest(referenceNo, mid);
showLoadingDialog("Checking refund...");
refundStatusDisposable.add(KPayViewModel.checkRefundStatus(request)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(response -> {
dismissLoadingDialog();
if (response == null || response.getResponse() == null) {
LogUtil.d(TAG, "Query refund: null response");
sharedViewModel.payDetail.setValue(payDetail);
navigateToNext();
return;
}
LogUtil.d(TAG, "Query refund result: " + response.getResponse().getResult());
LogUtil.d(TAG, "Query refund status: " + response.getResponse().getRefundStatus());
handleRefundResponse(response, referenceNo, orgAmount);
}, throwable -> {
throwable.printStackTrace();
dismissLoadingDialog();
sharedViewModel.payDetail.setValue(payDetail);
navigateToNext();
}));
}
private void handleRefundResponse(KPayRefund.RefundResponse response, String referenceNo, String orgAmount) {
if (response != null && response.getResponse() != null && "REFUND_SUCCESS".equalsIgnoreCase(response.getResponse().getRefundStatus())) { if (response != null && response.getResponse() != null && "REFUND_SUCCESS".equalsIgnoreCase(response.getResponse().getRefundStatus())) {
LogUtil.d(TAG, "Refund successful!"); LogUtil.d(TAG, "Refund successful!");
@ -239,16 +203,7 @@ public class QRRefundFragment extends DataBindingFragment {
retrievedUpdatePayDetail(referenceNo); retrievedUpdatePayDetail(referenceNo);
} else if (response != null && response.getResponse() != null } else {
&& "DUPLICATED_REFUND_REQ_NO".equalsIgnoreCase(response.getResponse().getCode())){
LogUtil.d(TAG, "Duplicated refund request, querying actual result...");
callQueryRefund(referenceNo , orgAmount);
} else if (response != null && response.getResponse() != null
&& "REFUNDING".equalsIgnoreCase(response.getResponse().getRefundStatus())){
LogUtil.d(TAG, "Refunding refund request, querying actual result...");
callQueryRefund(referenceNo , orgAmount);
}
else {
LogUtil.d(TAG, "Refund failed!"); LogUtil.d(TAG, "Refund failed!");
payDetail.setQrTransStatus(-1); payDetail.setQrTransStatus(-1);
payDetail.setReferNo(referenceNo); payDetail.setReferNo(referenceNo);

View File

@ -309,14 +309,8 @@ public class ReprintAnyTransactionFragment extends DataBindingFragment {
if(sharedViewModel.transactionsType.getValue() != null && sharedViewModel.transactionsType.getValue() == TransactionsType.MMQR_HISTORY) { if(sharedViewModel.transactionsType.getValue() != null && sharedViewModel.transactionsType.getValue() == TransactionsType.MMQR_HISTORY) {
// Wave Inquiry Status:: // Wave Inquiry Status::
// April 2, 2024 QR Inquiry status check is for unsuccessful transactions. // April 2, 2024 QR Inquiry status check is for unsuccessful transactions.
// if(yesterday.compareTo(transDate) <= 0 && (pay.getTransactionType() == TransactionsType.MMQR.value || pay.getTransactionType() == TransactionsType.MMQR_REFUND.value) ) { if(yesterday.compareTo(transDate) <= 0 && (pay.getTransactionType() == TransactionsType.MMQR.value || pay.getTransactionType() == TransactionsType.MMQR_REFUND.value) ) {
//
// filteredLists.add(pay);
// }
if(yesterday.compareTo(transDate) <= 0
&& (pay.getTransactionType() == TransactionsType.MMQR.value
|| pay.getTransactionType() == TransactionsType.MMQR_REFUND.value)
&& pay.getQrTransStatus() == 1) {
filteredLists.add(pay); filteredLists.add(pay);
} }

View File

@ -173,10 +173,7 @@ public class QRRefundProcessFragment extends DataBindingFragment {
retrievedUpdatePayDetail(referenceNo); retrievedUpdatePayDetail(referenceNo);
} else if (response != null && response.getResponse() != null && "DUPLICATED_REFUND_REQ_NO".equalsIgnoreCase(response.getResponse().getRefundStatus())) { } else {
}
else {
LogUtil.d(TAG, "Refund failed!"); LogUtil.d(TAG, "Refund failed!");
payDetail.setQrTransStatus(-1); payDetail.setQrTransStatus(-1);
payDetail.setReferNo(referenceNo); payDetail.setReferNo(referenceNo);

View File

@ -39,10 +39,6 @@ public class VoidViewModel extends ViewModel {
return repository.getVoidTransaction(transType,voucherNo); return repository.getVoidTransaction(transType,voucherNo);
} }
public LiveData<PayDetail> getVoidTransByInvoice(int transType, String invoiceNo) {
return repository.getVoidTransactionByInvoice(transType, invoiceNo);
}
public void observeVoidTrans(int transType) { public void observeVoidTrans(int transType) {
getVoidTransactions(transType).observeForever(new Observer<List<PayDetail>>() { getVoidTransactions(transType).observeForever(new Observer<List<PayDetail>>() {

View File

@ -278,7 +278,7 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
} }
}); });
settlementViewModel.getDeleteTrans().observe(getViewLifecycleOwner(), new Observer<List<PayDetail>>() { settlementViewModel.getDeleteTrans(SystemParamsOperation.getInstance().getCurrentBatchNum()).observe(getViewLifecycleOwner(), new Observer<List<PayDetail>>() {
@Override @Override
public void onChanged(List<PayDetail> payDetails) { public void onChanged(List<PayDetail> payDetails) {
settlementViewModel.deleteTrans.clear(); settlementViewModel.deleteTrans.clear();

View File

@ -159,8 +159,8 @@ public class SettlementViewModel extends ViewModel {
return repository.getSettlementPOS(); return repository.getSettlementPOS();
} }
public LiveData<List<PayDetail>> getDeleteTrans() { public LiveData<List<PayDetail>> getDeleteTrans(String batchNo) {
return repository.getDeleteTrans(); return repository.getDeleteTrans(batchNo);
} }
public LiveData<List<PayDetail>> getAdditionalSettlementPOS() { public LiveData<List<PayDetail>> getAdditionalSettlementPOS() {

View File

@ -67,9 +67,7 @@ public class EReceiptHelper {
request.setDE14(PrintUtils.getInstance().getFormatExpDate(payDetail.getEXPDate())); request.setDE14(PrintUtils.getInstance().getFormatExpDate(payDetail.getEXPDate()));
request.setDE43(formatDE43(cardHolderName)); request.setDE43(formatDE43(cardHolderName));
request.setDE48(payDetail.getAID()); request.setDE48(payDetail.getAID());
if (signature != null) { request.setDE115(signature != null ? Base64.encodeToString(signature, Base64.NO_WRAP) : "");
request.setDE115(Base64.encodeToString(signature, Base64.NO_WRAP));
}
return request; return request;
} }
@ -134,6 +132,6 @@ public class EReceiptHelper {
return value.substring(0, 40); return value.substring(0, 40);
} }
return String.format("%-40s", value).trim(); return String.format("%-40s", value); // right pad with space
} }
} }

View File

@ -8,7 +8,6 @@
<domain includeSubdomains="true">api.kbzpay.com</domain> <domain includeSubdomains="true">api.kbzpay.com</domain>
<domain includeSubdomains="true">api-uat.kbzpay.com</domain> <domain includeSubdomains="true">api-uat.kbzpay.com</domain>
<domain includeSubdomains="true">sirius-nest.utsmyanmar.com</domain> <domain includeSubdomains="true">sirius-nest.utsmyanmar.com</domain>
<domain includeSubdomains="true">192.168.10.105</domain>
</domain-config> </domain-config>
<domain-config cleartextTrafficPermitted="true"> <domain-config cleartextTrafficPermitted="true">

View File

@ -78,11 +78,10 @@ public interface PayDetailDao {
LiveData<List<PayDetail>> getSettlementPOSClearBatch(); LiveData<List<PayDetail>> getSettlementPOSClearBatch();
// 6 = PRE AUTH CANCEL, 7= PRE_AUTH_COMPLETE , 5 = PRE AUTH // 6 = PRE AUTH CANCEL, 7= PRE_AUTH_COMPLETE , 5 = PRE AUTH
// Note: type 20 (MMQR) and type 34 (MMQR_REFUND) are intentionally excluded — QR records are managed separately by QR settlement only
// @Query(("SELECT * FROM paydetail WHERE transactionType = 1 AND isCanceled = 1 OR transactionType = 2 AND isCanceled = 0 OR transactionType = 18 AND isCanceled = 0 AND batchNo IN(:batchNo)")) // @Query(("SELECT * FROM paydetail WHERE transactionType = 1 AND isCanceled = 1 OR transactionType = 2 AND isCanceled = 0 OR transactionType = 18 AND isCanceled = 0 AND batchNo IN(:batchNo)"))
// @Query(("SELECT * FROM paydetail WHERE transactionType = 1 AND isCanceled = 1 OR transactionType = 5 AND isCanceled = 1 OR transactionType = 7 AND isCanceled = 1 OR transactionType = 8 OR transactionType = 6 OR transactionType = 10 OR transactionType = 2 AND isCanceled = 0 OR transactionType = 18 AND isCanceled = 0 OR transactionType = 20 AND isCanceled = 0 OR transactionType = 34 AND isCanceled = 1 AND batchNo IN(:batchNo)")) // @Query(("SELECT * FROM paydetail WHERE transactionType = 1 AND isCanceled = 1 OR transactionType = 5 AND isCanceled = 1 OR transactionType = 7 AND isCanceled = 1 OR transactionType = 8 OR transactionType = 6 OR transactionType = 10 OR transactionType = 2 AND isCanceled = 0 OR transactionType = 18 AND isCanceled = 0 OR transactionType = 20 AND isCanceled = 0 OR transactionType = 34 AND isCanceled = 1 AND batchNo IN(:batchNo)"))
@Query(("SELECT * FROM paydetail WHERE transactionType = 1 AND isCanceled = 1 OR transactionType = 5 AND isCanceled = 1 OR transactionType = 7 AND isCanceled = 1 OR transactionType = 8 OR transactionType = 6 OR transactionType = 10 OR transactionType = 2 AND isCanceled = 0 OR transactionType = 18 AND isCanceled = 0")) @Query(("SELECT * FROM paydetail WHERE transactionType = 1 AND isCanceled = 1 OR transactionType = 5 AND isCanceled = 1 OR transactionType = 7 AND isCanceled = 1 OR transactionType = 8 OR transactionType = 6 OR transactionType = 10 OR transactionType = 2 AND isCanceled = 0 OR transactionType = 18 AND isCanceled = 0 OR transactionType = 20 OR transactionType = 34 AND isCanceled = 1 AND batchNo IN(:batchNo)"))
LiveData<List<PayDetail>> getDeleteTrans(); LiveData<List<PayDetail>> getDeleteTrans(String batchNo);
@Query("SELECT * FROM paydetail WHERE transactionType = 5 AND isCanceled = 0") @Query("SELECT * FROM paydetail WHERE transactionType = 5 AND isCanceled = 0")
LiveData<List<PayDetail>> getPreAuthTrans(); LiveData<List<PayDetail>> getPreAuthTrans();
@ -121,9 +120,6 @@ public interface PayDetailDao {
@Query("SELECT * FROM paydetail WHERE isSettle = 0 AND transactionType IN(:transType) AND voucherNo IN(:voucherNo)") @Query("SELECT * FROM paydetail WHERE isSettle = 0 AND transactionType IN(:transType) AND voucherNo IN(:voucherNo)")
LiveData<PayDetail> getVoidTrans(int transType,String voucherNo); LiveData<PayDetail> getVoidTrans(int transType,String voucherNo);
@Query("SELECT * FROM paydetail WHERE isSettle = 0 AND transactionType IN(:transType) AND invoiceNo IN(:invoiceNo)")
LiveData<PayDetail> getVoidTransByInvoice(int transType, String invoiceNo);
// 5 = PRE_SALE // 5 = PRE_SALE
@Query("SELECT * FROM paydetail WHERE isCanceled = 0 AND transactionType = 5 AND voucherNo IN(:voucherNo) AND accountType != 'MPU'") @Query("SELECT * FROM paydetail WHERE isCanceled = 0 AND transactionType = 5 AND voucherNo IN(:voucherNo) AND accountType != 'MPU'")

View File

@ -415,9 +415,7 @@ public Retrofit provideKPayRefundRetrofit(@ApplicationContext Context context) {
@Singleton @Singleton
public EReceiptApiService provideEReceiptApiService(){ public EReceiptApiService provideEReceiptApiService(){
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor( HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
message -> LogUtil.d("HTTP", message)
);
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder() OkHttpClient client = new OkHttpClient.Builder()

View File

@ -1,16 +1,13 @@
package com.utsmyanmar.baselib.network; package com.utsmyanmar.baselib.network;
import com.google.gson.JsonElement;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptResponse; import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptResponse;
import java.util.Map;
import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Observable;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import retrofit2.http.Body; import retrofit2.http.Body;
import retrofit2.http.Header; import retrofit2.http.Header;
import retrofit2.http.Multipart;
import retrofit2.http.POST; import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
public interface EReceiptApiService { public interface EReceiptApiService {
@ -20,13 +17,4 @@ public interface EReceiptApiService {
@Header("x-api-key") String apiKey, @Header("x-api-key") String apiKey,
@Body Object body @Body Object body
); );
@Multipart
@POST("transaction")
Observable<EReceiptResponse> sendReceiptMultipart(
@Header("x-timestamp") String timestamp,
@Header("x-api-key") String apiKey,
@PartMap Map<String, RequestBody> fields,
@Part MultipartBody.Part de115Image
);
} }

View File

@ -3,7 +3,6 @@ package com.utsmyanmar.baselib.network;
import com.utsmyanmar.baselib.network.model.KPayQRQueryRequest; import com.utsmyanmar.baselib.network.model.KPayQRQueryRequest;
import com.utsmyanmar.baselib.network.model.KPayQRRequest; import com.utsmyanmar.baselib.network.model.KPayQRRequest;
import com.utsmyanmar.baselib.network.model.KPayQRResponse; import com.utsmyanmar.baselib.network.model.KPayQRResponse;
import com.utsmyanmar.baselib.network.model.KPayRefund;
import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.Body; import retrofit2.http.Body;
@ -28,6 +27,4 @@ public interface KPayApiService {
@POST("closeorder") @POST("closeorder")
Observable<KPayQRRequest.CloseOrderResponse> closeOrder(@Body KPayQRRequest.CloseOrderRequest closeOrderRequest); Observable<KPayQRRequest.CloseOrderResponse> closeOrder(@Body KPayQRRequest.CloseOrderRequest closeOrderRequest);
@POST("queryrefund")
Observable<KPayRefund.RefundResponse> checkRefundStatus(@Body KPayQRRequest.QRQueryRefundRequest request);
} }

View File

@ -575,82 +575,4 @@ public class KPayQRRequest {
} }
} }
public static class QRQueryRefundRequest {
@SerializedName("Request")
private Request request;
public QRQueryRefundRequest() {}
public QRQueryRefundRequest(Request request) {
this.request = request;
}
public Request getRequest() { return request; }
public void setRequest(Request request) { this.request = request; }
public static class Request {
@SerializedName("timestamp")
private String timestamp;
@SerializedName("nonce_str")
private String nonceStr;
@SerializedName("method")
private String method;
@SerializedName("sign_type")
private String signType;
@SerializedName("sign")
private String sign;
@SerializedName("version")
private String version;
@SerializedName("biz_content")
private BizContent bizContent;
public Request(String timestamp, String nonceStr, String method,
String signType, String sign, String version, BizContent bizContent) {
this.timestamp = timestamp;
this.nonceStr = nonceStr;
this.method = method;
this.signType = signType;
this.sign = sign;
this.version = version;
this.bizContent = bizContent;
}
public String getTimestamp() { return timestamp; }
public String getNonceStr() { return nonceStr; }
public String getMethod() { return method; }
public String getSignType() { return signType; }
public String getSign() { return sign; }
public String getVersion() { return version; }
public BizContent getBizContent() { return bizContent; }
public static class BizContent {
@SerializedName("appid")
private String appId;
@SerializedName("merch_code")
private String merchCode;
@SerializedName("merch_order_id")
private String merchOrderId;
public BizContent(String appId, String merchCode, String merchOrderId) {
this.appId = appId;
this.merchCode = merchCode;
this.merchOrderId = merchOrderId;
}
public String getAppId() { return appId; }
public String getMerchCode() { return merchCode; }
public String getMerchOrderId() { return merchOrderId; }
}
}
}
} }

View File

@ -165,7 +165,6 @@ public class EReceiptCardRequest {
public void setDE43(String DE43){ public void setDE43(String DE43){
this.DE43 = DE43; this.DE43 = DE43;
} }
public String getDE48(){ return DE48; }
public void setDE48(String DE48){ public void setDE48(String DE48){
this.DE48 = DE48; this.DE48 = DE48;
} }

View File

@ -17,7 +17,6 @@ import com.utsmyanmar.baselib.network.KPayApiService;
import com.utsmyanmar.baselib.network.KPayRefundApiService; import com.utsmyanmar.baselib.network.KPayRefundApiService;
import com.utsmyanmar.baselib.network.SiriusApiService; import com.utsmyanmar.baselib.network.SiriusApiService;
import com.utsmyanmar.baselib.network.model.DemoQRRequest; import com.utsmyanmar.baselib.network.model.DemoQRRequest;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptCardRequest;
import com.utsmyanmar.baselib.network.model.DemoQRResponse; import com.utsmyanmar.baselib.network.model.DemoQRResponse;
import com.utsmyanmar.baselib.network.model.DemoQRReturnRequest; import com.utsmyanmar.baselib.network.model.DemoQRReturnRequest;
import com.utsmyanmar.baselib.network.model.DemoQRReturnResponse; import com.utsmyanmar.baselib.network.model.DemoQRReturnResponse;
@ -43,17 +42,12 @@ import com.utsmyanmar.baselib.util.EReceiptHelper;
import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.utils.LogUtil; import com.utsmyanmar.paylibs.utils.LogUtil;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Provider; import javax.inject.Provider;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.core.Flowable;
import io.reactivex.rxjava3.core.Maybe; import io.reactivex.rxjava3.core.Maybe;
@ -134,58 +128,6 @@ public class Repository {
return eReceiptApiService.sendReceipt(timestamp, signature, body); return eReceiptApiService.sendReceipt(timestamp, signature, body);
} }
public Observable<EReceiptResponse> sendReceiptWithImage(EReceiptCardRequest request, byte[] imageBytes) {
String apiSecret = BuildConfig.ERECEIPT_SECRET;
String timestamp = String.valueOf(System.currentTimeMillis());
request.setDE115(null);
String bodyString = new Gson().toJson(request);
String dataToHash = bodyString + apiSecret + timestamp;
LogUtil.d("HTTP", dataToHash);
String apiKey = EReceiptHelper.sha256(dataToHash);
Map<String, RequestBody> fields = buildFormFields(request);
MultipartBody.Part imagePart = null;
if (imageBytes != null) {
RequestBody imageBody = RequestBody.create(MediaType.parse("image/png"), imageBytes);
imagePart = MultipartBody.Part.createFormData("DE115", "signature.png", imageBody);
}
return eReceiptApiService.sendReceiptMultipart(timestamp, apiKey, fields, imagePart);
}
private Map<String, RequestBody> buildFormFields(EReceiptCardRequest request) {
Map<String, RequestBody> map = new HashMap<>();
putField(map, "DE2", request.getDE2());
putField(map, "DE3", request.getDE3());
putField(map, "DE4", request.getDE4());
putField(map, "DE7", request.getDE7());
putField(map, "DE11", request.getDE11());
putField(map, "DE14", request.getDE14());
putField(map, "DE22", request.getDE22());
putField(map, "DE37", request.getDE37());
putField(map, "DE38", request.getDE38());
putField(map, "DE39", request.getDE39());
putField(map, "DE41", request.getDE41());
putField(map, "DE42", request.getDE42());
putField(map, "DE43", request.getDE43());
putField(map, "DE48", request.getDE48());
putField(map, "DE49", request.getDE49());
putField(map, "DE55", request.getDE55());
putField(map, "appId", request.getAppId());
putField(map, "batchNumber", request.getBatchNumber());
putField(map, "cardLabel", request.getCardLabel());
putField(map, "description", request.getDescription());
putField(map, "invoiceNumber", request.getInvoiceNumber());
putField(map, "serial", request.getSerial());
return map;
}
private void putField(Map<String, RequestBody> map, String key, String value) {
if (value != null && !value.isEmpty()) {
map.put(key, RequestBody.create(MediaType.parse("text/plain"), value));
}
}
public void insertPayDetail(PayDetail payDetail){ payDetailDao.insert(payDetail);} public void insertPayDetail(PayDetail payDetail){ payDetailDao.insert(payDetail);}
public Completable insertPay(PayDetail payDetail) { return payDetailDao.insertPay(payDetail); } public Completable insertPay(PayDetail payDetail) { return payDetailDao.insertPay(payDetail); }
@ -243,10 +185,7 @@ public class Repository {
public LiveData<PayDetail> getVoidTransaction(int transType,String voucherNo) { public LiveData<PayDetail> getVoidTransaction(int transType,String voucherNo) {
return payDetailDao.getVoidTrans(transType,voucherNo); return payDetailDao.getVoidTrans(transType,voucherNo);
}
public LiveData<PayDetail> getVoidTransactionByInvoice(int transType, String invoiceNo) {
return payDetailDao.getVoidTransByInvoice(transType, invoiceNo);
} }
@ -307,8 +246,8 @@ public class Repository {
return payDetailDao.getSettlementPOSClearBatch(); return payDetailDao.getSettlementPOSClearBatch();
} }
public LiveData<List<PayDetail>> getDeleteTrans() { public LiveData<List<PayDetail>> getDeleteTrans(String batchNo) {
return payDetailDao.getDeleteTrans(); return payDetailDao.getDeleteTrans(batchNo);
} }
public LiveData<List<PayDetail>> getPreAuthTrans() { public LiveData<List<PayDetail>> getPreAuthTrans() {
@ -328,8 +267,4 @@ public class Repository {
public LiveData<List<PayDetail>> getAllQRHistory(){ return payDetailDao.getAllQRHistory();} public LiveData<List<PayDetail>> getAllQRHistory(){ return payDetailDao.getAllQRHistory();}
public LiveData<List<PayDetail>> getRefundableQRHistory(){ return payDetailDao.getRefundableQRHistory(); } public LiveData<List<PayDetail>> getRefundableQRHistory(){ return payDetailDao.getRefundableQRHistory(); }
public Observable<KPayRefund.RefundResponse> checkRefundStatus(KPayQRRequest.QRQueryRefundRequest request) {
return kPayApiService.checkRefundStatus(request);
}
} }