e-receipt for qr fixed
This commit is contained in:
parent
90c9a48197
commit
2441ba5141
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -4,15 +4,15 @@
|
|||||||
"type": "APK",
|
"type": "APK",
|
||||||
"kind": "Directory"
|
"kind": "Directory"
|
||||||
},
|
},
|
||||||
"applicationId": "com.utsmm.kbz.mpu",
|
"applicationId": "com.utsmm.kbz",
|
||||||
"variantName": "release",
|
"variantName": "release",
|
||||||
"elements": [
|
"elements": [
|
||||||
{
|
{
|
||||||
"type": "SINGLE",
|
"type": "SINGLE",
|
||||||
"filters": [],
|
"filters": [],
|
||||||
"attributes": [],
|
"attributes": [],
|
||||||
"versionCode": 8,
|
"versionCode": 10,
|
||||||
"versionName": "1.08",
|
"versionName": "1.10",
|
||||||
"outputFile": "app-release.apk"
|
"outputFile": "app-release.apk"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@ -144,10 +144,10 @@ public class SettingsFragment extends DataBindingFragment {
|
|||||||
|
|
||||||
private void updateDemoSettings() {
|
private void updateDemoSettings() {
|
||||||
boolean isDemo = SystemParamsOperation.getInstance().getDemoStatus();
|
boolean isDemo = SystemParamsOperation.getInstance().getDemoStatus();
|
||||||
// binding.demoSwitch.setChecked(isDemo);
|
binding.demoSwitch.setChecked(isDemo);
|
||||||
// binding.demoSummary.setText(isDemo ?
|
binding.demoSummary.setText(isDemo ?
|
||||||
// "Demo mode active - Test transactions without real processing" :
|
"Demo mode active - Test transactions without real processing" :
|
||||||
// "Simulator mode active - Real transaction processing");
|
"Simulator mode active - Real transaction processing");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateAlertSoundSettings() {
|
private void updateAlertSoundSettings() {
|
||||||
|
|||||||
@ -9,7 +9,9 @@ import androidx.annotation.Nullable;
|
|||||||
import androidx.navigation.NavController;
|
import androidx.navigation.NavController;
|
||||||
import androidx.navigation.NavDestination;
|
import androidx.navigation.NavDestination;
|
||||||
|
|
||||||
|
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.e_receipt.EReceiptCardRequest;
|
||||||
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.utils.core_utils.SystemParamsOperation;
|
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
|
||||||
@ -25,6 +27,8 @@ import com.utsmm.kbz.util.ecr.CoreUtils;
|
|||||||
|
|
||||||
import com.utsmyanmar.paylibs.utils.LogUtil;
|
import com.utsmyanmar.paylibs.utils.LogUtil;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
|
||||||
public class ProcessingFragment extends DataBindingFragment {
|
public class ProcessingFragment extends DataBindingFragment {
|
||||||
|
|
||||||
private static final String TAG = ProcessingFragment.class.getSimpleName();
|
private static final String TAG = ProcessingFragment.class.getSimpleName();
|
||||||
@ -248,11 +252,22 @@ public class ProcessingFragment extends DataBindingFragment {
|
|||||||
|
|
||||||
private void observeData(ProcessingTransaction processingTransaction) {
|
private void observeData(ProcessingTransaction processingTransaction) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
processingTransaction.getTransStatus().observe(getViewLifecycleOwner(), transResultStatus -> {
|
processingTransaction.getTransStatus().observe(getViewLifecycleOwner(), transResultStatus -> {
|
||||||
LogUtil.d(TAG,"Transaction RESULT :"+transResultStatus);
|
LogUtil.d(TAG,"Transaction RESULT :"+transResultStatus);
|
||||||
|
PayDetail payDetail = isEmvTrans()
|
||||||
|
? emvTransactionProcessViewModel.payDetailResult.getValue()
|
||||||
|
: transProcessViewModel.payDetailResult.getValue();
|
||||||
|
LogUtil.d(TAG, "PayDetail from VM: " + payDetail);
|
||||||
|
|
||||||
switch (transResultStatus) {
|
switch (transResultStatus) {
|
||||||
case FAIL:
|
case FAIL:
|
||||||
|
sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, false, "FAILED"));
|
||||||
case SUCCESS:
|
case SUCCESS:
|
||||||
|
sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, true, "SUCCESS"));
|
||||||
case OFFLINE_SUCCESS:
|
case OFFLINE_SUCCESS:
|
||||||
if(SystemParamsOperation.getInstance().getDemoStatus()) {
|
if(SystemParamsOperation.getInstance().getDemoStatus()) {
|
||||||
delayFunctionCall(()->{
|
delayFunctionCall(()->{
|
||||||
@ -365,4 +380,108 @@ public class ProcessingFragment extends DataBindingFragment {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String mapDE3ToShortCode(String de3) {
|
||||||
|
if (de3 == null) return "UNK";
|
||||||
|
|
||||||
|
switch (de3) {
|
||||||
|
case "000000": return "S"; // Sale
|
||||||
|
case "020000": return "V"; // Void
|
||||||
|
case "200000": return "R"; // Refund
|
||||||
|
case "030000": return "P"; // Preauth
|
||||||
|
case "310000": return "PC"; // Preauth Complete
|
||||||
|
}
|
||||||
|
return "UNK"; // Unknown
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String mapTransactionType(int type) {
|
||||||
|
switch (type) {
|
||||||
|
case 1: // SALE
|
||||||
|
return "S";
|
||||||
|
|
||||||
|
case 2: // VOID SALE
|
||||||
|
return "V";
|
||||||
|
|
||||||
|
case 4: // REFUND
|
||||||
|
return "R";
|
||||||
|
|
||||||
|
case 5: // PRE-AUTH
|
||||||
|
return "P";
|
||||||
|
|
||||||
|
case 6: // PRE-AUTH VOID
|
||||||
|
return "PV";
|
||||||
|
|
||||||
|
case 7: // PRE-AUTH COMPLETE
|
||||||
|
return "PC";
|
||||||
|
|
||||||
|
case 8: // PRE-AUTH COMPLETE VOID
|
||||||
|
return "PCV";
|
||||||
|
|
||||||
|
case 9: // CASH OUT
|
||||||
|
return "CAV";
|
||||||
|
|
||||||
|
case 18: // TIP ADJUST
|
||||||
|
return "TA";
|
||||||
|
|
||||||
|
case 20: // QR PAYMENT
|
||||||
|
return "QR";
|
||||||
|
|
||||||
|
case 34: // QR REFUND
|
||||||
|
return "QRV";
|
||||||
|
|
||||||
|
default:
|
||||||
|
return "UNK";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private String mapCurrency(String currency) {
|
||||||
|
if (currency == null) return "MMK";
|
||||||
|
|
||||||
|
switch (currency) {
|
||||||
|
case "104": return "MMK";
|
||||||
|
case "840": return "USD";
|
||||||
|
case "764": return "THB";
|
||||||
|
case "702": return "SGD";
|
||||||
|
case "978": return "EUR";
|
||||||
|
default: return currency; // Already alphabetic? return as-is
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private EReceiptCardRequest buildEReceiptCardReceipt(PayDetail payDetail, boolean isSuccess, String reason){
|
||||||
|
//current timestamp
|
||||||
|
String currentTimestamp = new java.text.SimpleDateFormat(
|
||||||
|
"MMddHHmmss", java.util.Locale.getDefault()
|
||||||
|
).format(new java.util.Date());
|
||||||
|
|
||||||
|
//DeviceInfo
|
||||||
|
String serial = TMSUtil.getInstance().getSerialNumber();
|
||||||
|
String appId = requireActivity().getPackageName();
|
||||||
|
|
||||||
|
//TerminalInfo
|
||||||
|
String terminalId = SystemParamsOperation.getInstance().getTerminalId();
|
||||||
|
String merchantId = SystemParamsOperation.getInstance().getMerchantId();
|
||||||
|
|
||||||
|
double realAmount = payDetail.getAmount() / 100.0;
|
||||||
|
DecimalFormat df = new DecimalFormat("0.00");
|
||||||
|
String amount = df.format(realAmount);
|
||||||
|
|
||||||
|
EReceiptCardRequest request = new EReceiptCardRequest();
|
||||||
|
request.setDE2(payDetail.getCardNo());
|
||||||
|
request.setDE3(mapDE3ToShortCode(payDetail.getProcessCode()));
|
||||||
|
request.setDE4(amount);
|
||||||
|
request.setDE7(currentTimestamp);
|
||||||
|
request.setDE11(payDetail.getVoucherNo());
|
||||||
|
request.setDE22(mapTransactionType(payDetail.getTransactionType()));
|
||||||
|
request.setDE37(payDetail.getReferNo());
|
||||||
|
request.setDE38(payDetail.getAuthNo());
|
||||||
|
request.setDE39(isSuccess ? "A" : "E");
|
||||||
|
request.setDE41(terminalId);
|
||||||
|
request.setDE42(merchantId);
|
||||||
|
request.setDE49(mapCurrency(payDetail.getCurrencyCode()));
|
||||||
|
request.setSerial(serial);
|
||||||
|
request.setInvoiceNumber(payDetail.getInvoiceNo());
|
||||||
|
request.setAppId(appId);
|
||||||
|
request.setDescription(reason);
|
||||||
|
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -425,6 +425,7 @@ public class SharedViewModel extends ViewModel {
|
|||||||
|
|
||||||
|
|
||||||
public void pushReceipt(Object body){
|
public void pushReceipt(Object body){
|
||||||
|
Log.d("push receipt", new Gson().toJson(body));
|
||||||
repository.sendReceipt(body)
|
repository.sendReceipt(body)
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
|||||||
@ -11,8 +11,10 @@ import android.widget.LinearLayout;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
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.KPayRefund;
|
import com.utsmyanmar.baselib.network.model.KPayRefund;
|
||||||
|
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptQRRequest;
|
||||||
import com.utsmyanmar.baselib.util.DataBindingConfig;
|
import com.utsmyanmar.baselib.util.DataBindingConfig;
|
||||||
import com.utsmyanmar.paylibs.model.PayDetail;
|
import com.utsmyanmar.paylibs.model.PayDetail;
|
||||||
import com.utsmyanmar.paylibs.model.TradeData;
|
import com.utsmyanmar.paylibs.model.TradeData;
|
||||||
@ -34,6 +36,8 @@ import io.reactivex.rxjava3.disposables.Disposable;
|
|||||||
import io.reactivex.rxjava3.schedulers.Schedulers;
|
import io.reactivex.rxjava3.schedulers.Schedulers;
|
||||||
import com.utsmyanmar.paylibs.utils.LogUtil;
|
import com.utsmyanmar.paylibs.utils.LogUtil;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
|
||||||
public class QRRefundFragment extends DataBindingFragment {
|
public class QRRefundFragment extends DataBindingFragment {
|
||||||
|
|
||||||
private SharedViewModel sharedViewModel;
|
private SharedViewModel sharedViewModel;
|
||||||
@ -196,6 +200,8 @@ public class QRRefundFragment extends DataBindingFragment {
|
|||||||
payDetail.setReferNo(referenceNo);
|
payDetail.setReferNo(referenceNo);
|
||||||
payDetail.setIsCanceled(true);
|
payDetail.setIsCanceled(true);
|
||||||
|
|
||||||
|
// sharedViewModel.pushReceipt(buildEReceiptQRReceipt(payDetail, true, "Refund success"));
|
||||||
|
|
||||||
retrievedUpdatePayDetail(referenceNo);
|
retrievedUpdatePayDetail(referenceNo);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -210,6 +216,8 @@ public class QRRefundFragment extends DataBindingFragment {
|
|||||||
}
|
}
|
||||||
payDetail.setTradeResultDes(errorMsg);
|
payDetail.setTradeResultDes(errorMsg);
|
||||||
|
|
||||||
|
// sharedViewModel.pushReceipt(buildEReceiptQRReceipt(payDetail, true, "RESP CODE [68]\n Refund Failed"));
|
||||||
|
|
||||||
sharedViewModel.payDetail.setValue(payDetail);
|
sharedViewModel.payDetail.setValue(payDetail);
|
||||||
navigateToNext();
|
navigateToNext();
|
||||||
}
|
}
|
||||||
@ -328,4 +336,6 @@ public class QRRefundFragment extends DataBindingFragment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -315,29 +315,7 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi
|
|||||||
|
|
||||||
retrievedUpdatePayDetail(refLabel, payDetail,false);
|
retrievedUpdatePayDetail(refLabel, payDetail,false);
|
||||||
|
|
||||||
double realAmount = payDetail.getAmount() / 100.0;
|
sharedViewModel.pushReceipt(buildEReceiptQRReceipt(payDetail, true, "QR Pay Success"));
|
||||||
DecimalFormat df = new DecimalFormat("0.00");
|
|
||||||
String amount = df.format(realAmount);
|
|
||||||
|
|
||||||
String currentTimeStamp = new java.text.SimpleDateFormat("MMddHHmmss", java.util.Locale.getDefault())
|
|
||||||
.format(new java.util.Date());
|
|
||||||
String serial = TMSUtil.getInstance().getSerialNumber();
|
|
||||||
String packageName = getActivity().getPackageName();
|
|
||||||
EReceiptQRRequest request = new EReceiptQRRequest();
|
|
||||||
request.setDE3("QR");
|
|
||||||
request.setDE4(amount);
|
|
||||||
request.setDE7(currentTimeStamp);
|
|
||||||
request.setDE37(payDetail.getReferNo());
|
|
||||||
request.setDE39("A");
|
|
||||||
request.setDE49("MMK");
|
|
||||||
request.setSerial(serial);
|
|
||||||
request.setAppId(packageName);
|
|
||||||
request.setDE41(terminalId);
|
|
||||||
request.setDE42(merchantId);
|
|
||||||
request.setInvoiceNumber(payDetail.getInvoiceNo());
|
|
||||||
request.setDE11(payDetail.getVoucherNo());
|
|
||||||
request.setDescription("qr pay success");
|
|
||||||
sharedViewModel.pushReceipt(request);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -348,26 +326,6 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi
|
|||||||
payDetail.setQrTransStatus(2);
|
payDetail.setQrTransStatus(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
String currentTimeStamp = new java.text.SimpleDateFormat("MMddHHmmss", java.util.Locale.getDefault())
|
|
||||||
.format(new java.util.Date());
|
|
||||||
String serial = SystemParamsOperation.getInstance().getCurrentSerialNum();
|
|
||||||
String packageName = getActivity().getPackageName();
|
|
||||||
EReceiptQRRequest request = new EReceiptQRRequest();
|
|
||||||
request.setDE3("QR");
|
|
||||||
request.setDE4("0");
|
|
||||||
request.setDE7(currentTimeStamp);
|
|
||||||
request.setDE37(payDetail.getReferNo());
|
|
||||||
request.setDE39("D");
|
|
||||||
request.setDE49("MMK");
|
|
||||||
request.setSerial(serial);
|
|
||||||
request.setAppId(packageName);
|
|
||||||
request.setDE41(terminalId);
|
|
||||||
request.setDE42(merchantId);
|
|
||||||
request.setInvoiceNumber(payDetail.getInvoiceNo());
|
|
||||||
request.setDE11(payDetail.getVoucherNo());
|
|
||||||
request.setDescription("qr timeout");
|
|
||||||
sharedViewModel.pushReceipt(request);
|
|
||||||
|
|
||||||
sharedViewModel.payDetail.postValue(payDetail);
|
sharedViewModel.payDetail.postValue(payDetail);
|
||||||
safeNavigateToRouteId();
|
safeNavigateToRouteId();
|
||||||
|
|
||||||
@ -376,25 +334,6 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LogUtil.d(TAG, "On Exception::");
|
LogUtil.d(TAG, "On Exception::");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
String currentTimeStamp = new java.text.SimpleDateFormat("MMddHHmmss", java.util.Locale.getDefault())
|
|
||||||
.format(new java.util.Date());
|
|
||||||
String serial = SystemParamsOperation.getInstance().getCurrentSerialNum();
|
|
||||||
String packageName = getActivity().getPackageName();
|
|
||||||
EReceiptQRRequest request = new EReceiptQRRequest();
|
|
||||||
request.setDE3("QR");
|
|
||||||
request.setDE4("0");
|
|
||||||
request.setDE7(currentTimeStamp);
|
|
||||||
request.setDE37(payDetail.getReferNo());
|
|
||||||
request.setDE39("D");
|
|
||||||
request.setDE49("MMK");
|
|
||||||
request.setSerial(serial);
|
|
||||||
request.setAppId(packageName);
|
|
||||||
request.setDE41(terminalId);
|
|
||||||
request.setDE42(merchantId);
|
|
||||||
request.setInvoiceNumber(payDetail.getInvoiceNo());
|
|
||||||
request.setDE11(payDetail.getVoucherNo());
|
|
||||||
request.setDescription("qr failed");
|
|
||||||
sharedViewModel.pushReceipt(request);
|
|
||||||
|
|
||||||
if (count == totalCount) {
|
if (count == totalCount) {
|
||||||
if(payDetail.getQrTransStatus() != -1) {
|
if(payDetail.getQrTransStatus() != -1) {
|
||||||
@ -487,4 +426,58 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String mapCurrency(String currency) {
|
||||||
|
if (currency == null) return "MMK";
|
||||||
|
|
||||||
|
switch (currency) {
|
||||||
|
case "104": return "MMK";
|
||||||
|
case "840": return "USD";
|
||||||
|
case "764": return "THB";
|
||||||
|
case "702": return "SGD";
|
||||||
|
case "978": return "EUR";
|
||||||
|
default: return currency; // Already alphabetic? return as-is
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private EReceiptQRRequest buildEReceiptQRReceipt(PayDetail payDetail, boolean isSuccess, String reason) {
|
||||||
|
|
||||||
|
// Timestamp (MMddHHmmss)
|
||||||
|
String currentTimestamp = new java.text.SimpleDateFormat(
|
||||||
|
"MMddHHmmss", java.util.Locale.getDefault()
|
||||||
|
).format(new java.util.Date());
|
||||||
|
|
||||||
|
// Device Info
|
||||||
|
String serial = TMSUtil.getInstance().getSerialNumber();
|
||||||
|
String appId = requireActivity().getPackageName();
|
||||||
|
|
||||||
|
// Terminal Info
|
||||||
|
// String terminalId = SystemParamsOperation.getInstance().getTerminalId();
|
||||||
|
// String merchantId = SystemParamsOperation.getInstance().getMerchantId();
|
||||||
|
|
||||||
|
|
||||||
|
// Amount convert (long cents → double → 0.00)
|
||||||
|
double realAmount = payDetail.getAmount() / 100.0;
|
||||||
|
DecimalFormat df = new DecimalFormat("0.00");
|
||||||
|
String amount = df.format(realAmount);
|
||||||
|
|
||||||
|
EReceiptQRRequest request = new EReceiptQRRequest();
|
||||||
|
request.setDE3("QR"); // QR Process Code
|
||||||
|
request.setDE4(amount); // Amount
|
||||||
|
request.setDE7(currentTimestamp); // Timestamp
|
||||||
|
request.setDE37(payDetail.getReferNo()); // Reference No
|
||||||
|
request.setDE39(isSuccess ? "A" : "E"); // A=Approved, D=Declined/Timeout
|
||||||
|
request.setDE41(terminalId);
|
||||||
|
request.setDE42(merchantId);
|
||||||
|
request.setDE49(mapCurrency(payDetail.getCurrencyCode())); // Currency
|
||||||
|
request.setSerial(serial);
|
||||||
|
request.setInvoiceNumber(payDetail.getInvoiceNo());
|
||||||
|
request.setDE11(payDetail.getVoucherNo()); // STAN
|
||||||
|
request.setAppId(appId);
|
||||||
|
request.setDescription(reason); // Anything: success / timeout / error message
|
||||||
|
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,14 +14,18 @@ import com.utsmm.kbz.ui.kpay.KPayViewModel;
|
|||||||
import com.utsmm.kbz.ui.kpay.QRRefundFragment;
|
import com.utsmm.kbz.ui.kpay.QRRefundFragment;
|
||||||
import com.utsmm.kbz.util.TransactionUtil;
|
import com.utsmm.kbz.util.TransactionUtil;
|
||||||
import com.utsmm.kbz.util.ecr.CoreUtils;
|
import com.utsmm.kbz.util.ecr.CoreUtils;
|
||||||
|
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.KPayRefund;
|
import com.utsmyanmar.baselib.network.model.KPayRefund;
|
||||||
|
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptQRRequest;
|
||||||
import com.utsmyanmar.baselib.util.DataBindingConfig;
|
import com.utsmyanmar.baselib.util.DataBindingConfig;
|
||||||
import com.utsmyanmar.paylibs.model.PayDetail;
|
import com.utsmyanmar.paylibs.model.PayDetail;
|
||||||
import com.utsmyanmar.paylibs.system.SystemDateTime;
|
import com.utsmyanmar.paylibs.system.SystemDateTime;
|
||||||
import com.utsmyanmar.paylibs.utils.LogUtil;
|
import com.utsmyanmar.paylibs.utils.LogUtil;
|
||||||
import com.utsmyanmar.paylibs.utils.POSUtil;
|
import com.utsmyanmar.paylibs.utils.POSUtil;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||||
import io.reactivex.rxjava3.disposables.CompositeDisposable;
|
import io.reactivex.rxjava3.disposables.CompositeDisposable;
|
||||||
import io.reactivex.rxjava3.disposables.Disposable;
|
import io.reactivex.rxjava3.disposables.Disposable;
|
||||||
@ -140,10 +144,13 @@ public class QRRefundProcessFragment extends DataBindingFragment {
|
|||||||
payDetail.setReferNo(referenceNo);
|
payDetail.setReferNo(referenceNo);
|
||||||
payDetail.setIsCanceled(true);
|
payDetail.setIsCanceled(true);
|
||||||
|
|
||||||
|
sharedViewModel.pushReceipt(buildEReceiptQRReceipt(payDetail, true, "Refund success"));
|
||||||
|
|
||||||
retrievedUpdatePayDetail(referenceNo);
|
retrievedUpdatePayDetail(referenceNo);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
LogUtil.d(TAG, "Refund failed!");
|
LogUtil.d(TAG, "Refund failed!");
|
||||||
|
|
||||||
payDetail.setQrTransStatus(-1);
|
payDetail.setQrTransStatus(-1);
|
||||||
payDetail.setQrReferNo(referenceNo);
|
payDetail.setQrReferNo(referenceNo);
|
||||||
payDetail.setReferNo(referenceNo);
|
payDetail.setReferNo(referenceNo);
|
||||||
@ -212,4 +219,58 @@ public class QRRefundProcessFragment extends DataBindingFragment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String mapCurrency(String currency) {
|
||||||
|
if (currency == null) return "MMK";
|
||||||
|
|
||||||
|
switch (currency) {
|
||||||
|
case "104": return "MMK";
|
||||||
|
case "840": return "USD";
|
||||||
|
case "764": return "THB";
|
||||||
|
case "702": return "SGD";
|
||||||
|
case "978": return "EUR";
|
||||||
|
default: return currency; // Already alphabetic? return as-is
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private EReceiptQRRequest buildEReceiptQRReceipt(PayDetail payDetail, boolean isSuccess, String reason) {
|
||||||
|
|
||||||
|
// Timestamp (MMddHHmmss)
|
||||||
|
String currentTimestamp = new java.text.SimpleDateFormat(
|
||||||
|
"MMddHHmmss", java.util.Locale.getDefault()
|
||||||
|
).format(new java.util.Date());
|
||||||
|
|
||||||
|
// Device Info
|
||||||
|
String serial = TMSUtil.getInstance().getSerialNumber();
|
||||||
|
String appId = requireActivity().getPackageName();
|
||||||
|
|
||||||
|
|
||||||
|
// Terminal Info
|
||||||
|
// String terminalId = SystemParamsOperation.getInstance().getTerminalId();
|
||||||
|
// String merchantId = SystemParamsOperation.getInstance().getMerchantId();
|
||||||
|
String terminalId = TransactionUtil.getInstance().getQRTerminalId();
|
||||||
|
String merchantId = TransactionUtil.getInstance().getQRMerchantId();
|
||||||
|
|
||||||
|
// Amount convert (long cents → double → 0.00)
|
||||||
|
double realAmount = payDetail.getAmount() / 100.0;
|
||||||
|
DecimalFormat df = new DecimalFormat("0.00");
|
||||||
|
String amount = df.format(realAmount);
|
||||||
|
|
||||||
|
EReceiptQRRequest request = new EReceiptQRRequest();
|
||||||
|
request.setDE3("QRV"); // QR Process Code(fix later with get from config)
|
||||||
|
request.setDE4(amount); // Amount
|
||||||
|
request.setDE7(currentTimestamp); // Timestamp
|
||||||
|
request.setDE37(payDetail.getReferNo()); // Reference No
|
||||||
|
request.setDE39(isSuccess ? "A" : "E"); // A=Approved, E=Error/Declined/Timeout
|
||||||
|
request.setDE41(terminalId);
|
||||||
|
request.setDE42(merchantId);
|
||||||
|
request.setDE49(mapCurrency(payDetail.getCurrencyCode())); // Currency(fix later with get from config)
|
||||||
|
request.setSerial(serial);
|
||||||
|
request.setInvoiceNumber(payDetail.getInvoiceNo());
|
||||||
|
request.setDE11(payDetail.getVoucherNo()); // STAN
|
||||||
|
request.setAppId(appId);
|
||||||
|
request.setDescription(reason); // Anything: success / timeout / error message
|
||||||
|
|
||||||
|
return request;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -233,11 +233,11 @@ public class TMSUtil {
|
|||||||
String secHostIp = SystemParamsOperation.getInstance().getSecIpAddress();
|
String secHostIp = SystemParamsOperation.getInstance().getSecIpAddress();
|
||||||
String keyIndex = SystemParamsOperation.getInstance().getTMKIndex();
|
String keyIndex = SystemParamsOperation.getInstance().getTMKIndex();
|
||||||
|
|
||||||
if(tid.length() == 8 && mid.length() == 15 && !hostIp.isEmpty() && !keyIndex.isEmpty()) {
|
if(tid.length() == 8 && (mid.length() == 11 || mid.length() == 15) && !hostIp.isEmpty() && !keyIndex.isEmpty()) {
|
||||||
tmsValidity = new TMSValidity(ValidityStatus.SUCCESS,"Success");
|
tmsValidity = new TMSValidity(ValidityStatus.SUCCESS,"Success");
|
||||||
} else if(tid.length() != 8) {
|
} else if(tid.length() != 8) {
|
||||||
tmsValidity = new TMSValidity(ValidityStatus.FAILURE,"Tid is invalid!");
|
tmsValidity = new TMSValidity(ValidityStatus.FAILURE,"Tid is invalid!");
|
||||||
} else if(mid.length() != 15) {
|
} else if(mid.length() != 15 && mid.length() != 11 ) {
|
||||||
tmsValidity = new TMSValidity(ValidityStatus.FAILURE,"Mid is invalid!");
|
tmsValidity = new TMSValidity(ValidityStatus.FAILURE,"Mid is invalid!");
|
||||||
} else if(hostIp.isEmpty()) {
|
} else if(hostIp.isEmpty()) {
|
||||||
tmsValidity = new TMSValidity(ValidityStatus.FAILURE,"Pri-Ip is invalid!");
|
tmsValidity = new TMSValidity(ValidityStatus.FAILURE,"Pri-Ip is invalid!");
|
||||||
|
|||||||
@ -316,82 +316,82 @@
|
|||||||
<!-- </androidx.cardview.widget.CardView>-->
|
<!-- </androidx.cardview.widget.CardView>-->
|
||||||
|
|
||||||
<!-- Demo Mode Card -->
|
<!-- Demo Mode Card -->
|
||||||
<!-- <androidx.cardview.widget.CardView-->
|
<androidx.cardview.widget.CardView
|
||||||
<!-- android:id="@+id/demoCard"-->
|
android:id="@+id/demoCard"
|
||||||
<!-- android:layout_width="match_parent"-->
|
android:layout_width="match_parent"
|
||||||
<!-- android:layout_height="wrap_content"-->
|
android:layout_height="wrap_content"
|
||||||
<!-- android:layout_marginBottom="12dp"-->
|
android:layout_marginBottom="12dp"
|
||||||
<!-- android:clickable="true"-->
|
android:clickable="true"
|
||||||
<!-- android:foreground="?android:attr/selectableItemBackground"-->
|
android:foreground="?android:attr/selectableItemBackground"
|
||||||
<!-- android:onClick="@{()->click.onDemoClick()}"-->
|
android:onClick="@{()->click.onDemoClick()}"
|
||||||
<!-- app:cardBackgroundColor="@color/white"-->
|
app:cardBackgroundColor="@color/white"
|
||||||
<!-- app:cardCornerRadius="16dp"-->
|
app:cardCornerRadius="16dp"
|
||||||
<!-- app:cardElevation="2dp">-->
|
app:cardElevation="2dp">
|
||||||
|
|
||||||
<!-- <LinearLayout-->
|
<LinearLayout
|
||||||
<!-- android:layout_width="match_parent"-->
|
android:layout_width="match_parent"
|
||||||
<!-- android:layout_height="wrap_content"-->
|
android:layout_height="wrap_content"
|
||||||
<!-- android:gravity="center_vertical"-->
|
android:gravity="center_vertical"
|
||||||
<!-- android:orientation="horizontal"-->
|
android:orientation="horizontal"
|
||||||
<!-- android:padding="20dp">-->
|
android:padding="20dp">
|
||||||
|
|
||||||
<!-- <androidx.cardview.widget.CardView-->
|
<androidx.cardview.widget.CardView
|
||||||
<!-- android:layout_width="48dp"-->
|
android:layout_width="48dp"
|
||||||
<!-- android:layout_height="48dp"-->
|
android:layout_height="48dp"
|
||||||
<!-- android:layout_marginEnd="16dp"-->
|
android:layout_marginEnd="16dp"
|
||||||
<!-- app:cardBackgroundColor="@color/colorPrimary"-->
|
app:cardBackgroundColor="@color/colorPrimary"
|
||||||
<!-- app:cardCornerRadius="24dp"-->
|
app:cardCornerRadius="24dp"
|
||||||
<!-- app:cardElevation="0dp">-->
|
app:cardElevation="0dp">
|
||||||
|
|
||||||
<!-- <ImageView-->
|
<ImageView
|
||||||
<!-- android:layout_width="24dp"-->
|
android:layout_width="24dp"
|
||||||
<!-- android:layout_height="24dp"-->
|
android:layout_height="24dp"
|
||||||
<!-- android:layout_gravity="center"-->
|
android:layout_gravity="center"
|
||||||
<!-- android:src="@drawable/ic_swap"-->
|
android:src="@drawable/ic_swap"
|
||||||
<!-- app:tint="@color/white" />-->
|
app:tint="@color/white" />
|
||||||
|
|
||||||
<!-- </androidx.cardview.widget.CardView>-->
|
</androidx.cardview.widget.CardView>
|
||||||
|
|
||||||
<!-- <LinearLayout-->
|
<LinearLayout
|
||||||
<!-- android:layout_width="0dp"-->
|
android:layout_width="0dp"
|
||||||
<!-- android:layout_height="wrap_content"-->
|
android:layout_height="wrap_content"
|
||||||
<!-- android:layout_weight="1"-->
|
android:layout_weight="1"
|
||||||
<!-- android:orientation="vertical">-->
|
android:orientation="vertical">
|
||||||
|
|
||||||
<!-- <TextView-->
|
<TextView
|
||||||
<!-- android:layout_width="wrap_content"-->
|
android:layout_width="wrap_content"
|
||||||
<!-- android:layout_height="wrap_content"-->
|
android:layout_height="wrap_content"
|
||||||
<!-- android:fontFamily="@font/rubik_medium"-->
|
android:fontFamily="@font/rubik_medium"
|
||||||
<!-- android:text="Demo Mode"-->
|
android:text="Demo Mode"
|
||||||
<!-- android:textColor="@color/colorTextTitle"-->
|
android:textColor="@color/colorTextTitle"
|
||||||
<!-- android:textSize="18sp"-->
|
android:textSize="18sp"
|
||||||
<!-- android:textStyle="bold"-->
|
android:textStyle="bold"
|
||||||
<!-- tools:fontFamily="sans-serif-medium" />-->
|
tools:fontFamily="sans-serif-medium" />
|
||||||
|
|
||||||
<!-- <TextView-->
|
<TextView
|
||||||
<!-- android:id="@+id/demoSummary"-->
|
android:id="@+id/demoSummary"
|
||||||
<!-- android:layout_width="wrap_content"-->
|
android:layout_width="wrap_content"
|
||||||
<!-- android:layout_height="wrap_content"-->
|
android:layout_height="wrap_content"
|
||||||
<!-- android:layout_marginTop="2dp"-->
|
android:layout_marginTop="2dp"
|
||||||
<!-- android:fontFamily="@font/rubik_regular"-->
|
android:fontFamily="@font/rubik_regular"
|
||||||
<!-- android:text="Demo mode active - Test transactions"-->
|
android:text="Demo mode active - Test transactions"
|
||||||
<!-- android:textColor="@color/colorTextContent"-->
|
android:textColor="@color/colorTextContent"
|
||||||
<!-- android:textSize="14sp"-->
|
android:textSize="14sp"
|
||||||
<!-- tools:fontFamily="sans-serif" />-->
|
tools:fontFamily="sans-serif" />
|
||||||
|
|
||||||
<!-- </LinearLayout>-->
|
</LinearLayout>
|
||||||
|
|
||||||
<!-- <Switch-->
|
<Switch
|
||||||
<!-- android:id="@+id/demoSwitch"-->
|
android:id="@+id/demoSwitch"
|
||||||
<!-- android:layout_width="wrap_content"-->
|
android:layout_width="wrap_content"
|
||||||
<!-- android:layout_height="wrap_content"-->
|
android:layout_height="wrap_content"
|
||||||
<!-- android:layout_marginStart="8dp"-->
|
android:layout_marginStart="8dp"
|
||||||
<!-- android:clickable="false"-->
|
android:clickable="false"
|
||||||
<!-- android:focusable="false" />-->
|
android:focusable="false" />
|
||||||
|
|
||||||
<!-- </LinearLayout>-->
|
</LinearLayout>
|
||||||
|
|
||||||
<!-- </androidx.cardview.widget.CardView>-->
|
</androidx.cardview.widget.CardView>
|
||||||
|
|
||||||
<!-- Sound Alerts Card -->
|
<!-- Sound Alerts Card -->
|
||||||
<!-- <androidx.cardview.widget.CardView-->
|
<!-- <androidx.cardview.widget.CardView-->
|
||||||
|
|||||||
@ -0,0 +1,135 @@
|
|||||||
|
package com.utsmyanmar.baselib.network.model.e_receipt;
|
||||||
|
|
||||||
|
public class EReceiptCardRequest {
|
||||||
|
|
||||||
|
private String DE2;
|
||||||
|
private String DE22;
|
||||||
|
private String DE3;
|
||||||
|
private String DE39;
|
||||||
|
private String DE41;
|
||||||
|
private String DE42;
|
||||||
|
private String serial;
|
||||||
|
private String DE49;
|
||||||
|
private String DE37;
|
||||||
|
private String DE7;
|
||||||
|
private String DE4;
|
||||||
|
private String appId;
|
||||||
|
private String invoiceNumber;
|
||||||
|
private String DE11;
|
||||||
|
private String description;
|
||||||
|
private String DE38;
|
||||||
|
|
||||||
|
public EReceiptCardRequest() {}
|
||||||
|
|
||||||
|
// GETTERS
|
||||||
|
public String getDE3() {
|
||||||
|
return DE3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDE39() {
|
||||||
|
return DE39;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDE41() {
|
||||||
|
return DE41;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDE42() {
|
||||||
|
return DE42;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSerial() {
|
||||||
|
return serial;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDE49() {
|
||||||
|
return DE49;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDE37() {
|
||||||
|
return DE37;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDE7() {
|
||||||
|
return DE7;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDE4() {
|
||||||
|
return DE4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppId(){
|
||||||
|
return appId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getInvoiceNumber(){
|
||||||
|
return invoiceNumber;
|
||||||
|
}
|
||||||
|
public String getDE11(){
|
||||||
|
return DE11;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription(){
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
public String getDE2(){ return DE2; }
|
||||||
|
public String getDE38(){ return DE38; }
|
||||||
|
public String getDE22(){ return DE22; }
|
||||||
|
// SETTERS
|
||||||
|
public void setDE3(String DE3) {
|
||||||
|
this.DE3 = DE3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDE39(String DE39) {
|
||||||
|
this.DE39 = DE39;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDE41(String DE41) {
|
||||||
|
this.DE41 = DE41;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDE42(String DE42) {
|
||||||
|
this.DE42 = DE42;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSerial(String serial) {
|
||||||
|
this.serial = serial;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDE49(String DE49) {
|
||||||
|
this.DE49 = DE49;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDE37(String DE37) {
|
||||||
|
this.DE37 = DE37;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDE7(String DE7) {
|
||||||
|
this.DE7 = DE7;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDE4(String DE4) {
|
||||||
|
this.DE4 = DE4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppId(String appId){
|
||||||
|
this.appId = appId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInvoiceNumber(String invoiceNumber){
|
||||||
|
this.invoiceNumber = invoiceNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDE11(String DE11){
|
||||||
|
this.DE11 = DE11;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description){
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDE2(String DE2){ this.DE2 = DE2; }
|
||||||
|
|
||||||
|
public void setDE38(String DE38){ this.DE38 = DE38; }
|
||||||
|
public void setDE22(String DE22){ this.DE22 = DE22; }
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user