Merge branch 'merge-latest' into fix_

This commit is contained in:
MooN 2025-12-02 14:13:45 +06:30
commit a6db8970af
31 changed files with 414 additions and 62 deletions

File diff suppressed because one or more lines are too long

View File

@ -136,7 +136,6 @@ public class MainFragment extends DataBindingFragment {
sharedViewModel.setCardDataExist(false); sharedViewModel.setCardDataExist(false);
sharedViewModel.setTransMenu(null); sharedViewModel.setTransMenu(null);
PrintXReceipt.getInstance().setSignatureBitmap(null);
updateButtonStatus(); updateButtonStatus();
delayFunctionCall(this::checkTerminalStatus); delayFunctionCall(this::checkTerminalStatus);

View File

@ -224,8 +224,9 @@ public class InputRRNFragment extends DataBindingFragment {
newPay.setReferNo(rrnNo); newPay.setReferNo(rrnNo);
if(sharedViewModel.getTransMenu().getValue() == TransMenu.PRE_AUTH_FULL_VOID) { if(sharedViewModel.getTransMenu().getValue() == TransMenu.PRE_AUTH_FULL_VOID) {
newPay.setAmount(payDetail.getAmount()); newPay.setAmount(payDetail.getAmount());
}
}
sharedViewModel.setAmount(POSUtil.getInstance().getDecimalAmountFormat(payDetail.getAmount()));
newPay.setTradeDateTime(payDetail.getTradeDateTime()); newPay.setTradeDateTime(payDetail.getTradeDateTime());
if(isEmvTrans()) { if(isEmvTrans()) {

View File

@ -299,7 +299,7 @@ public class InputTraceNoFragment extends DataBindingFragment {
if(sharedViewModel.hostType.getValue() == HostType.MPU) { if(sharedViewModel.hostType.getValue() == HostType.MPU) {
sharedViewModel.isEmv.setValue(false); sharedViewModel.isEmv.setValue(false);
transProcessViewModel.transType.postValue(sharedViewModel.transactionsType.getValue()); transProcessViewModel.transType.setValue(sharedViewModel.transactionsType.getValue());
transProcessViewModel.setOldTransPayDetail(payDetail); transProcessViewModel.setOldTransPayDetail(payDetail);
transProcessViewModel.setPayDetail(payDetail); transProcessViewModel.setPayDetail(payDetail);
} else { } else {

View File

@ -130,18 +130,19 @@ public class ProcessingCardFragment extends DataBindingFragment {
public void onSuccess(CardDataX cardDataX) { public void onSuccess(CardDataX cardDataX) {
routeId = R.id.action_processingCardFragment_to_pinPadFragment; routeId = R.id.action_processingCardFragment_to_pinPadFragment;
transProcessViewModel.transType.postValue(sharedViewModel.transactionsType.getValue()); transProcessViewModel.transType.setValue(sharedViewModel.transactionsType.getValue());
pinPadViewModel.transType.postValue(sharedViewModel.transactionsType.getValue()); pinPadViewModel.transType.setValue(sharedViewModel.transactionsType.getValue());
TradeData tradeData = TransactionUtil.getInstance().initMPUTransaction(cardDataX, CardTypeX.IC); TradeData tradeData = TransactionUtil.getInstance().initMPUTransaction(cardDataX, CardTypeX.IC);
transProcessViewModel.setTradeData(tradeData); transProcessViewModel.setTradeData(tradeData);
pinPadViewModel.setTradeData(tradeData); pinPadViewModel.setTradeData(tradeData);
if(sharedViewModel.getTransMenu().getValue() == TransMenu.PRE_AUTH_PARTIAL_VOID ) { if(sharedViewModel.getTransactionsType().getValue() == TransactionsType.PRE_AUTH_VOID ) {
sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_function_not_supported)); sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_alert_pre_auth_cancel));
routeId = R.id.action_processingCardFragment_to_errorFragment; routeId = R.id.action_processingCardFragment_to_errorFragment;
safeNavigateToRouteId();
return;
} }
// else if(sharedViewModel.transactionsType.getValue() == TransactionsType.REFUND) { // else if(sharedViewModel.transactionsType.getValue() == TransactionsType.REFUND) {
// sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_card_not_supported)); // sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_card_not_supported));
@ -182,7 +183,7 @@ public class ProcessingCardFragment extends DataBindingFragment {
// pin required scenario // pin required scenario
routeId = R.id.action_processingCardFragment_to_pinPadFragment; routeId = R.id.action_processingCardFragment_to_pinPadFragment;
transProcessViewModel.transType.postValue(sharedViewModel.transactionsType.getValue()); transProcessViewModel.transType.setValue(sharedViewModel.transactionsType.getValue());
pinPadViewModel.transType.postValue(sharedViewModel.transactionsType.getValue()); pinPadViewModel.transType.postValue(sharedViewModel.transactionsType.getValue());
/* need to check card scheme according to card number --!^--- check below function*/ /* need to check card scheme according to card number --!^--- check below function*/
@ -207,10 +208,11 @@ public class ProcessingCardFragment extends DataBindingFragment {
} }
if(sharedViewModel.getTransMenu().getValue() == TransMenu.PRE_AUTH_PARTIAL_VOID ) { if(sharedViewModel.getTransactionsType().getValue() == TransactionsType.PRE_AUTH_VOID ) {
// sharedViewModel.transMenu.postValue(null);
sharedViewModel.setTransMenu(null); sharedViewModel.set_errorFragmentMsg(getResourceString(R.string.txt_alert_pre_auth_cancel));
routeId = R.id.action_processingCardFragment_to_errorFragment; routeId = R.id.action_processingCardFragment_to_errorFragment;
} }
// else if(sharedViewModel.transactionsType.getValue() == TransactionsType.REFUND) { // else if(sharedViewModel.transactionsType.getValue() == TransactionsType.REFUND) {
// routeId = R.id.action_processingCardFragment_to_errorFragment; // routeId = R.id.action_processingCardFragment_to_errorFragment;

View File

@ -12,6 +12,9 @@ import androidx.navigation.NavDestination;
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.e_receipt.EReceiptCardRequest; import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptCardRequest;
import com.utsmm.kbz.util.EReceiptUtil;
import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest;
import com.utsmyanmar.baselib.util.DataBindingConfig; import com.utsmyanmar.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;
@ -172,14 +175,17 @@ public class ProcessingFragment extends DataBindingFragment {
} else { } else {
LogUtil.d(TAG,"Updated sharedViewmodel payDetail for non emv"); LogUtil.d(TAG,"Updated sharedViewmodel payDetail for non emv");
sharedViewModel.payDetail.setValue(transProcessViewModel.payDetailResult.getValue()); sharedViewModel.payDetail.setValue(transProcessViewModel.payDetailResult.getValue());
} }
EReceiptRequest request = EReceiptUtil.getInstance().generateMPUReceipt(sharedViewModel.payDetail.getValue());
sharedViewModel.pushReceipt(request);
// transProcessViewModel.payDetailResult.observe(getViewLifecycleOwner(), payDetail -> sharedViewModel.payDetail.postValue(payDetail)); // transProcessViewModel.payDetailResult.observe(getViewLifecycleOwner(), payDetail -> sharedViewModel.payDetail.postValue(payDetail));
} }
private void callNextScreen(){ private void callNextScreen(){
updateData(); // updateData();
if (requiresSignature()) { if (requiresSignature()) {
routeId = R.id.action_processingFragment_to_signatureFragment; routeId = R.id.action_processingFragment_to_signatureFragment;
} else { } else {
@ -207,7 +213,7 @@ public class ProcessingFragment extends DataBindingFragment {
LogUtil.d(TAG,"tradeAnswerCode: "+payDetail.getTradeAnswerCode()); LogUtil.d(TAG,"tradeAnswerCode: "+payDetail.getTradeAnswerCode());
// For now, let's check if it's a card transaction and successful // For now, let's check if it's a card transaction and successful
boolean isSuccessful = "00".equals(payDetail.getTradeAnswerCode()); boolean isSuccessful = "00".equals(payDetail.getTradeAnswerCode()) || "000".equals(payDetail.getTradeAnswerCode());
// You can customize this logic based on your business requirements // You can customize this logic based on your business requirements
return isSuccessful && !isEmvTrans(); // Require signature for successful non-EMV transactions return isSuccessful && !isEmvTrans(); // Require signature for successful non-EMV transactions
@ -277,6 +283,7 @@ public class ProcessingFragment extends DataBindingFragment {
},1500); },1500);
} else { } else {
// updateData(); // updateData();
sharedViewModel.dismissLoadingMsg(); sharedViewModel.dismissLoadingMsg();
callNextScreen(); callNextScreen();
} }

View File

@ -16,9 +16,11 @@ import com.utsmm.kbz.R;
import com.utsmm.kbz.config.Constants; import com.utsmm.kbz.config.Constants;
import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel; import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel;
import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.print.printx.PrintX; import com.utsmyanmar.paylibs.print.printx.PrintX;
import com.utsmyanmar.paylibs.print.printx.PrintXReceipt; import com.utsmyanmar.paylibs.print.printx.PrintXReceipt;
import com.utsmyanmar.paylibs.utils.LogUtil; import com.utsmyanmar.paylibs.utils.LogUtil;
import com.utsmyanmar.paylibs.utils.print_utils.BitmapUtils;
public class SignatureFragment extends DataBindingFragment { public class SignatureFragment extends DataBindingFragment {
@ -132,6 +134,12 @@ public class SignatureFragment extends DataBindingFragment {
safeNavigateToRouteId(); safeNavigateToRouteId();
} }
private void updateData() {
PayDetail payDetail = sharedViewModel.payDetail.getValue();
payDetail.setESignHexData(BitmapUtils.bitmapToHexString(mSignaturePad.getSignatureBitmap()));
sharedViewModel.payDetail.setValue(payDetail);
}
public class ClickEvent { public class ClickEvent {
@ -140,7 +148,8 @@ public class SignatureFragment extends DataBindingFragment {
// Handle digital signature // Handle digital signature
if (isSigned) { if (isSigned) {
sharedViewModel.signBitmap = mSignaturePad.getSignatureBitmap(); sharedViewModel.signBitmap = mSignaturePad.getSignatureBitmap();
PrintXReceipt.getInstance().setSignatureBitmap(mSignaturePad.getSignatureBitmap());
updateData();
LogUtil.d(TAG, "Digital signature confirmed and stored"); LogUtil.d(TAG, "Digital signature confirmed and stored");
callNextScreen(); callNextScreen();
} else { } else {
@ -149,7 +158,6 @@ public class SignatureFragment extends DataBindingFragment {
} else { } else {
// Handle manual signature on paper // Handle manual signature on paper
sharedViewModel.signBitmap = null; // No digital signature sharedViewModel.signBitmap = null; // No digital signature
PrintXReceipt.getInstance().setSignatureBitmap(null);
LogUtil.d(TAG, "Manual signature on paper selected - no digital signature stored"); LogUtil.d(TAG, "Manual signature on paper selected - no digital signature stored");
callNextScreen(); callNextScreen();
} }

View File

@ -211,6 +211,14 @@ public class SharedViewModel extends ViewModel {
return transactionsType; return transactionsType;
} }
public void setAmount(String amount) {
this.amount.setValue(amount);
}
public SingleLiveEvent<String> getAmount() {
return amount;
}
public void setPrintReceiptMsg(String msg) { this.printReceiptMsg.setValue(msg);} public void setPrintReceiptMsg(String msg) { this.printReceiptMsg.setValue(msg);}
public void postPrintReceiptMsg(String msg) { this.printReceiptMsg.postValue(msg);} public void postPrintReceiptMsg(String msg) { this.printReceiptMsg.postValue(msg);}
public void setPrintStatus(PrintStatus printStatus) { this.printStatus.setValue(printStatus); } public void setPrintStatus(PrintStatus printStatus) { this.printStatus.setValue(printStatus); }

View File

@ -1,9 +1,7 @@
package com.utsmm.kbz.ui.kpay; package com.utsmm.kbz.ui.kpay;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
@ -11,11 +9,11 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.utsmm.kbz.util.tms.TMSUtil; import com.utsmm.kbz.util.EReceiptUtil;
import com.utsmm.kbz.util.enums.TransResultStatus;
import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.network.model.DemoQRStatusRequest;
import com.utsmyanmar.baselib.network.model.KPayQRQueryRequest; import com.utsmyanmar.baselib.network.model.KPayQRQueryRequest;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptQRRequest; 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.ecr.ECRHelper; import com.utsmyanmar.ecr.ECRHelper;
@ -30,10 +28,6 @@ import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel;
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 java.text.DecimalFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@ -130,6 +124,7 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi
terminalId = TransactionUtil.getInstance().getQRTerminalId(); terminalId = TransactionUtil.getInstance().getQRTerminalId();
merchantId = TransactionUtil.getInstance().getQRMerchantId(); merchantId = TransactionUtil.getInstance().getQRMerchantId();
refLabel = sharedViewModel.qrRefNum.getValue(); refLabel = sharedViewModel.qrRefNum.getValue();
// tradeData = waveViewModel.getTradeData(); // tradeData = waveViewModel.getTradeData();
@ -139,6 +134,7 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi
sharedViewModel.insertPayDetail(payDetail); sharedViewModel.insertPayDetail(payDetail);
} }
@ -191,6 +187,8 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi
setUpCountDown(); setUpCountDown();
} }
private void setUpCountDown() { private void setUpCountDown() {
@ -315,7 +313,8 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi
retrievedUpdatePayDetail(refLabel, payDetail,false); retrievedUpdatePayDetail(refLabel, payDetail,false);
sharedViewModel.pushReceipt(buildEReceiptQRReceipt(payDetail, true, "QR Pay Success")); EReceiptRequest request = EReceiptUtil.getInstance().generateQRReceipt(payDetail, TransResultStatus.SUCCESS);
sharedViewModel.pushReceipt(request);
return; return;
} }
@ -325,7 +324,10 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi
if(payDetail.getQrTransStatus() != -1) { if(payDetail.getQrTransStatus() != -1) {
payDetail.setQrTransStatus(2); payDetail.setQrTransStatus(2);
} }
sharedViewModel.pushReceipt(buildEReceiptQRReceipt(payDetail, false, "QR Expired!"));
EReceiptRequest request = EReceiptUtil.getInstance().generateQRReceipt(payDetail, TransResultStatus.FAIL);
sharedViewModel.pushReceipt(request);
sharedViewModel.payDetail.postValue(payDetail); sharedViewModel.payDetail.postValue(payDetail);
safeNavigateToRouteId(); safeNavigateToRouteId();
@ -335,6 +337,8 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi
LogUtil.d(TAG, "On Exception::"); LogUtil.d(TAG, "On Exception::");
sharedViewModel.pushReceipt(buildEReceiptQRReceipt(payDetail, false, "QR Failed! :" + e.getMessage())); sharedViewModel.pushReceipt(buildEReceiptQRReceipt(payDetail, false, "QR Failed! :" + e.getMessage()));
e.printStackTrace(); e.printStackTrace();
EReceiptRequest request = EReceiptUtil.getInstance().generateQRReceipt(payDetail, TransResultStatus.TIME_OUT);
sharedViewModel.pushReceipt(request);
if (count == totalCount) { if (count == totalCount) {
if(payDetail.getQrTransStatus() != -1) { if(payDetail.getQrTransStatus() != -1) {

View File

@ -8,7 +8,9 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import com.utsmm.kbz.util.EReceiptUtil;
import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest;
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;
@ -317,7 +319,7 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
updateData(); updateData();
if (!SystemParamsOperation.getInstance().getDemoStatus()) { if (!SystemParamsOperation.getInstance().getDemoStatus()) {
// networkCutOver(); // bpc networkCutOver(); // bpc
navigateToNext(); navigateToNext();
} else { } else {
navigateToNext(); navigateToNext();
@ -338,6 +340,10 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
private void updateData() { private void updateData() {
sharedViewModel.payDetail.setValue(settlementViewModel.getPayDetail()); sharedViewModel.payDetail.setValue(settlementViewModel.getPayDetail());
EReceiptRequest request = EReceiptUtil.getInstance().generateMPUReceipt(sharedViewModel.payDetail.getValue());
sharedViewModel.pushReceipt(request);
} }
@Override @Override

View File

@ -7,6 +7,8 @@ import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModel;
import com.utsmm.kbz.util.EReceiptUtil;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest;
import com.utsmyanmar.baselib.repo.Repository; import com.utsmyanmar.baselib.repo.Repository;
import com.utsmyanmar.paylibs.Constant; import com.utsmyanmar.paylibs.Constant;
import com.utsmyanmar.paylibs.batch_upload.BatchListener; import com.utsmyanmar.paylibs.batch_upload.BatchListener;
@ -499,8 +501,12 @@ public class SettlementViewModel extends ViewModel {
// to leave data for testing // to leave data for testing
// if (settlementType.getValue() == SettlementType.NORMAL) { // if (settlementType.getValue() == SettlementType.NORMAL) {
updateDB(); updateDB();
// } // }
insertPayDetail(payDetail); insertPayDetail(payDetail);
if (errorFlag) { if (errorFlag) {

View File

@ -0,0 +1,171 @@
package com.utsmm.kbz.util;
import com.utsmm.kbz.BuildConfig;
import com.utsmm.kbz.util.enums.TransResultStatus;
import com.utsmm.kbz.util.tms.TMSUtil;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptRequest;
import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.SettleData;
import com.utsmyanmar.paylibs.system.BaseErrorCode;
import com.utsmyanmar.paylibs.utils.POSUtil;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
import java.text.DecimalFormat;
public class EReceiptUtil {
private static EReceiptUtil instance;
public static EReceiptUtil getInstance(){
instance = new EReceiptUtil();
return instance;
}
private String terminalId;
private String merchantId;
private String traceNo;
private String invoiceNo;
private String serialNum;
private String batchNumber;
private String packageName;
private EReceiptUtil(){
terminalId = SystemParamsOperation.getInstance().getTerminalId();
merchantId = SystemParamsOperation.getInstance().getMerchantId();
traceNo = SystemParamsOperation.getInstance().getCurrentSerialNum();
invoiceNo = SystemParamsOperation.getInstance().getCurrentInvoiceNum();
batchNumber = SystemParamsOperation.getInstance().getCurrentBatchNum();
serialNum = TMSUtil.getInstance().getSerialNumber();
packageName = BuildConfig.APPLICATION_ID;
}
public EReceiptRequest generateQRReceipt(PayDetail payDetail, TransResultStatus status) {
double realAmount = payDetail.getAmount() / 100.0;
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());
EReceiptRequest request = new EReceiptRequest();
request.setDE3("QR");
request.setDE7(currentTimeStamp);
request.setDE37(payDetail.getReferNo());
request.setDE49("MMK");
request.setSerial(serialNum);
request.setAppId(packageName);
request.setDE41(terminalId);
request.setDE42(merchantId);
request.setInvoiceNumber(payDetail.getInvoiceNo());
request.setDE11(payDetail.getVoucherNo());
// need to add payment identifier field too
if(status == TransResultStatus.SUCCESS) {
request.setDE4(amount);
request.setDescription("qr pay success");
request.setDE39("A");
} else if(status == TransResultStatus.TIME_OUT) {
request.setDE4("0");
request.setDescription("qr timeout");
request.setDE39("D");
} else if(status == TransResultStatus.FAIL) {
request.setDE4("0");
request.setDescription("qr failed");
request.setDE39("E");
}
return request;
}
public EReceiptRequest generateMPUReceipt(PayDetail payDetail) {
double realAmount = payDetail.getAmount() / 100.0;
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());
EReceiptRequest request = new EReceiptRequest();
request.setDE3(convertTransactionType(payDetail.getTransactionType()));
if(payDetail.getTransactionType() == TransactionsType.SETTLEMENT.value) {
SettleData settleData = payDetail.getSettleDataObj();
request.setDE63_01(settleData.getSaleCount()+"");
request.setDE63_02(settleData.getSaleAmount()+"");
request.setDE63_03(settleData.getRefundCount()+"");
request.setDE63_04(settleData.getRefundAmount()+"");
request.setBatchNumber(batchNumber);
request.setDescription("success");
request.setDE39("A");
} else {
request.setDE2(POSUtil.getInstance().getCardNumMasking(payDetail.getCardNo()));
request.setDE4(amount);
request.setDE7(currentTimeStamp);
request.setDE11(payDetail.getVoucherNo());
request.setDE37(payDetail.getReferNo());
request.setDE38(payDetail.getApprovalCode());
// will check it later for currency code
request.setDE49("MMK");
request.setInvoiceNumber(payDetail.getInvoiceNo());
request.setCardLabel("MPU");
if(payDetail.getTradeAnswerCode().equals("000") || payDetail.getTradeAnswerCode().equals("00") ) {
request.setDescription("success");
request.setDE39("A");
} else {
request.setDescription(BaseErrorCode.getErrorMessage(payDetail.getTradeAnswerCode()));
request.setDE39("E");
}
}
request.setDE41(terminalId);
request.setDE42(merchantId);
request.setSerial(serialNum);
request.setAppId(packageName);
return request;
}
public String convertTransactionType(int transactionType) {
if(transactionType == TransactionsType.SALE.value) {
return "S";
} else if(transactionType == TransactionsType.VOID.value) {
return "V";
} else if(transactionType == TransactionsType.PRE_AUTH_SALE.value) {
return "P";
} else if(transactionType == TransactionsType.PRE_AUTH_VOID.value) {
return "PV";
} else if(transactionType == TransactionsType.PRE_AUTH_COMPLETE.value) {
return "PC";
} else if(transactionType == TransactionsType.PRE_AUTH_COMPLETE_VOID.value) {
return "PCV";
} else if(transactionType == TransactionsType.CASH_OUT.value) {
return "CAV";
} else if(transactionType == TransactionsType.REFUND.value) {
return "R";
} else if(transactionType == TransactionsType.SETTLEMENT.value) {
return "ST";
}
return "E";
}
}

View File

@ -26,6 +26,7 @@ public enum TransResultStatus {
RETRY_AGAIN, RETRY_AGAIN,
NEXT_SCREEN, NEXT_SCREEN,
EMPTY_PIN, EMPTY_PIN,
NETWORK_ERROR NETWORK_ERROR,
TIME_OUT
} }

View File

@ -212,12 +212,11 @@ public class TMSUtil {
settlementStatus = SystemParamsOperation.getInstance().getSettlementStatus(); settlementStatus = SystemParamsOperation.getInstance().getSettlementStatus();
featuresList.add(new Features(2, fragmentActivity.getString(R.string.menu_sale_void), R.drawable.ic_void_dash, FeaturesType.VOID, voidStatus)); featuresList.add(new Features(2, fragmentActivity.getString(R.string.menu_sale_void), R.drawable.ic_void_dash, FeaturesType.VOID, voidStatus));
featuresList.add(new Features(2, fragmentActivity.getString(R.string.menu_settlement), R.drawable.ic_settlement, FeaturesType.SETTLEMENT, settlementStatus)); // featuresList.add(new Features(2, fragmentActivity.getString(R.string.menu_settlement), R.drawable.ic_settlement, FeaturesType.SETTLEMENT, settlementStatus));
featuresList.add(new Features(4, fragmentActivity.getString(R.string.menu_refund), R.drawable.ic_refund, FeaturesType.REFUND, refundStatus)); featuresList.add(new Features(4, fragmentActivity.getString(R.string.menu_refund), R.drawable.ic_refund, FeaturesType.REFUND, refundStatus));
featuresList.add(new Features(3, fragmentActivity.getString(R.string.menu_preauth), R.drawable.ic_pre_auth_dash, FeaturesType.PRE_AUTH_SALE, preAuthStatus)); featuresList.add(new Features(3, fragmentActivity.getString(R.string.menu_preauth), R.drawable.ic_pre_auth_dash, FeaturesType.PRE_AUTH_SALE, preAuthStatus));
featuresList.add(new Features(6, fragmentActivity.getString(R.string.menu_preauth_cancellation), R.drawable.ic_pre_auth_dash, FeaturesType.PRE_AUTH_VOID, preAuthCancelStatus)); featuresList.add(new Features(6, fragmentActivity.getString(R.string.menu_preauth_cancellation), R.drawable.ic_pre_auth_dash, FeaturesType.PRE_AUTH_VOID, preAuthCancelStatus));
featuresList.add(new Features(6, fragmentActivity.getString(R.string.menu_preauth_completion), R.drawable.ic_pre_auth_dash, FeaturesType.PRE_AUTH_COMPLETE, preAuthCompleteStatus)); featuresList.add(new Features(6, fragmentActivity.getString(R.string.menu_preauth_completion), R.drawable.ic_pre_auth_dash, FeaturesType.PRE_AUTH_COMPLETE, preAuthCompleteStatus));
featuresList.add(new Features(6, fragmentActivity.getString(R.string.menu_preauth_comp_cancellation), R.drawable.ic_pre_auth_dash, FeaturesType.PRE_AUTH_COMPLETE_VOID, preAuthCompleteCancelStatus));
// featuresList.add(new Features(5, fragmentActivity.getString(R.string.menu_wavepay_inquiry), R.drawable.ic_wave_status_dash, FeaturesType.WAVE_PAY_INQUIRY, wavePayInquiryStatus)); // featuresList.add(new Features(5, fragmentActivity.getString(R.string.menu_wavepay_inquiry), R.drawable.ic_wave_status_dash, FeaturesType.WAVE_PAY_INQUIRY, wavePayInquiryStatus));
featuresList.add(new Features(1, fragmentActivity.getString(R.string.menu_cash_advance), R.drawable.ic_cash_advance, FeaturesType.CASH_ADVANCE, cashAdvanceStatus)); featuresList.add(new Features(1, fragmentActivity.getString(R.string.menu_cash_advance), R.drawable.ic_cash_advance, FeaturesType.CASH_ADVANCE, cashAdvanceStatus));
featuresList.add(new Features(9, fragmentActivity.getString(R.string.menu_history), R.drawable.ic_history, FeaturesType.HISTORY, true)); featuresList.add(new Features(9, fragmentActivity.getString(R.string.menu_history), R.drawable.ic_history, FeaturesType.HISTORY, true));

View File

@ -437,6 +437,7 @@
<string name="txt_printing_settlement_report">Printing Settlement Report</string> <string name="txt_printing_settlement_report">Printing Settlement Report</string>
<string name="txt_printing_settlement_report_failure">Printing Settlement Report Failed!\nPlease load paper roll.</string> <string name="txt_printing_settlement_report_failure">Printing Settlement Report Failed!\nPlease load paper roll.</string>
<string name="txt_function_not_supported">FUNCTION NOT SUPPORTED</string> <string name="txt_function_not_supported">FUNCTION NOT SUPPORTED</string>
<string name="txt_alert_pre_auth_cancel">ONLY ALLOWS MANUAL ENTRY</string>
<string name="txt_card_not_supported">CARD NOT SUPPORTED</string> <string name="txt_card_not_supported">CARD NOT SUPPORTED</string>
<string name="title_ecr">ECR</string> <string name="title_ecr">ECR</string>
<string name="txt_connect">Connect</string> <string name="txt_connect">Connect</string>

View File

@ -383,7 +383,7 @@ public abstract class DataBindingFragment extends Fragment {
getNavController(hostId()).popBackStack(); getNavController(hostId()).popBackStack();
} }
protected void safeNavigateToRouteId(){ protected void safeNavigateToRouteId(){
Activity activity = getActivity(); Activity activity = getActivity();
if(activity != null && isAdded()) { if(activity != null && isAdded()) {
NavDestination currentDestination = getNavController(hostId()).getCurrentDestination(); NavDestination currentDestination = getNavController(hostId()).getCurrentDestination();

View File

@ -1,23 +1,66 @@
package com.utsmyanmar.baselib.network.model.e_receipt; package com.utsmyanmar.baselib.network.model.e_receipt;
public class EReceiptQRRequest { public class EReceiptRequest {
private String DE2;
private String DE3; private String DE3;
private String DE4;
private String DE7;
private String DE11;
private String DE22;
private String DE37;
private String DE38;
private String DE39; private String DE39;
private String DE41; private String DE41;
private String DE42; private String DE42;
private String serial;
private String DE49; private String DE49;
private String DE37;
private String DE7; private String DE63_01;
private String DE4; private String DE63_02;
private String DE63_03;
private String DE63_04;
private String serial;
private String appId; private String appId;
private String invoiceNumber; private String invoiceNumber;
private String DE11;
private String description; private String description;
public EReceiptQRRequest() {} private String cardLabel;
private String batchNumber;
public EReceiptRequest() {}
// GETTERS // GETTERS
public String getDE2() {
return DE2;
}
public String getDE38() {
return DE38;
}
public String getDE22() {
return DE22;
}
public String getDE63_01() {
return DE63_01;
}
public String getDE63_02() {
return DE63_02;
}
public String getDE63_03() {
return DE63_03;
}
public String getDE63_04() {
return DE63_04;
}
public String getDE3() { public String getDE3() {
return DE3; return DE3;
} }
@ -68,6 +111,18 @@ public class EReceiptQRRequest {
public String getDescription(){ public String getDescription(){
return description; return description;
} }
public String getCardLabel() {
return cardLabel;
}
public String getBatchNumber() {
return batchNumber;
}
public void setBatchNumber(String batchNumber) {
this.batchNumber = batchNumber;
}
// SETTERS // SETTERS
public void setDE3(String DE3) { public void setDE3(String DE3) {
this.DE3 = DE3; this.DE3 = DE3;
@ -120,4 +175,34 @@ public class EReceiptQRRequest {
public void setDescription(String description){ public void setDescription(String description){
this.description = 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;
}
public void setDE63_01(String DE63_01) {
this.DE63_01 = DE63_01;
}
public void setDE63_02(String DE63_02) {
this.DE63_02 = DE63_02;
}
public void setDE63_03(String DE63_03) {
this.DE63_03 = DE63_03;
}
public void setDE63_04(String DE63_04) {
this.DE63_04 = DE63_04;
}
public void setCardLabel(String cardLabel) {
this.cardLabel = cardLabel;
}
} }

View File

@ -1,5 +1,7 @@
package com.utsmyanmar.paylibs.model; package com.utsmyanmar.paylibs.model;
import android.graphics.Bitmap;
import androidx.room.Embedded; import androidx.room.Embedded;
import androidx.room.Entity; import androidx.room.Entity;
import androidx.room.Ignore; import androidx.room.Ignore;
@ -698,6 +700,8 @@ public class PayDetail implements Serializable {
this.tradeDateTime = tradeDateTime; this.tradeDateTime = tradeDateTime;
} }
public long getAmount() { public long getAmount() {
return this.amount; return this.amount;
} }

View File

@ -71,7 +71,7 @@ public class PrintReceipt {
SimpleDateFormat dfm = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.getDefault()); SimpleDateFormat dfm = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.getDefault());
currentTime = dfm.format(new Date()); currentTime = dfm.format(new Date());
BitmapFactory.Options opts = new BitmapFactory.Options(); BitmapFactory.Options opts = new BitmapFactory.Options();
bitmap = BitmapFactory.decodeResource(resources, R.drawable.primary_print_logo_yoma_bank, opts); bitmap = BitmapFactory.decodeResource(resources, R.drawable.print_kbz_logo, opts);
} }

View File

@ -80,11 +80,9 @@ public abstract class BaseXPrint {
protected FontEntity fontBold = new FontEntity(DotMatrixFontEnum.CH_SONG_24X24, DotMatrixFontEnum.ASC_SONG_BOLD_16X24); protected FontEntity fontBold = new FontEntity(DotMatrixFontEnum.CH_SONG_24X24, DotMatrixFontEnum.ASC_SONG_BOLD_16X24);
protected FontEntity fontBig = new FontEntity(DotMatrixFontEnum.CH_SONG_24X24, DotMatrixFontEnum.ASC_SONG_12X24, false, true); protected FontEntity fontBig = new FontEntity(DotMatrixFontEnum.CH_SONG_24X24, DotMatrixFontEnum.ASC_SONG_12X24, false, true);
protected Bitmap signatureBitmap;
public void setSignatureBitmap(Bitmap signatureBitmap) {
this.signatureBitmap = signatureBitmap;
}
public static byte[] boldOn() { public static byte[] boldOn() {
byte[] result = new byte[3]; byte[] result = new byte[3];
@ -725,7 +723,7 @@ public abstract class BaseXPrint {
break; break;
} }
addSignatureBitmap(); addSignatureBitmap(payDetail);
printer.appendPrnStr(cvmText, fontBold, AlignEnum.CENTER); printer.appendPrnStr(cvmText, fontBold, AlignEnum.CENTER);
@ -757,8 +755,9 @@ public abstract class BaseXPrint {
} }
private void addSignatureBitmap() { private void addSignatureBitmap(PayDetail payDetail) {
if (signatureBitmap != null) { if (payDetail.getESignHexData() != null) {
Bitmap signatureBitmap = BitmapUtils.hexStringToBitmap(payDetail.getESignHexData());
printer.appendImage(signatureBitmap, AlignEnum.CENTER); printer.appendImage(signatureBitmap, AlignEnum.CENTER);
} }
} }

View File

@ -23,5 +23,4 @@ public interface PrintX {
void printKeyStatus(); void printKeyStatus();
void setSignatureBitmap(Bitmap signatureBitmap);
} }

View File

@ -41,15 +41,10 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
SimpleDateFormat dfm = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.getDefault()); SimpleDateFormat dfm = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.getDefault());
currentTime = dfm.format(new Date()); currentTime = dfm.format(new Date());
BitmapFactory.Options opts = new BitmapFactory.Options(); BitmapFactory.Options opts = new BitmapFactory.Options();
bitmap = BitmapFactory.decodeResource(resources, R.drawable.print_logo_mpu, opts); bitmap = BitmapFactory.decodeResource(resources, R.drawable.print_kbz_logo, opts);
} }
@Override
public void setSignatureBitmap(Bitmap signatureBitmap) {
super.setSignatureBitmap(signatureBitmap);
}
@Override @Override
public void printSimple() { public void printSimple() {

View File

@ -25,9 +25,7 @@ public class PrintXReceipt {
} }
public void setSignatureBitmap(Bitmap signatureBitmap) {
printX.setSignatureBitmap(signatureBitmap);
}
public void printSmileReceipt(PayDetail payDetail,boolean isMerchantCopy,PrintXStatus printXStatus) { public void printSmileReceipt(PayDetail payDetail,boolean isMerchantCopy,PrintXStatus printXStatus) {
printX.printSmileReceipt(payDetail,isMerchantCopy,printXStatus); printX.printSmileReceipt(payDetail,isMerchantCopy,printXStatus);

View File

@ -369,6 +369,8 @@ public class TransactionsOperation {
newPay.setPINCipher(oldPay.getPINCipher()); newPay.setPINCipher(oldPay.getPINCipher());
newPay.setTempKSN(oldPay.getTempKSN()); newPay.setTempKSN(oldPay.getTempKSN());
newPay.setTransCVM(TransCVM.SIGNATURE); newPay.setTransCVM(TransCVM.SIGNATURE);
newPay.setTradeDateTime(oldPay.getTradeDateTime());
newPay.setAmount(oldPay.getAmount());
// for manual entry reversal which need de 35 // for manual entry reversal which need de 35
} else if (transactionsType == TransactionsType.TIP_ADJUSTMENT ) { } else if (transactionsType == TransactionsType.TIP_ADJUSTMENT ) {

View File

@ -107,7 +107,8 @@ public class BitmapConfig {
// commented on Nov 13,2024 // commented on Nov 13,2024
// public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "7230058028C19800"; // added DE 2 // public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "7230058028C19800"; // added DE 2
// public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "7234058008C09000"; // for tmk MPU // public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "7234058008C09000"; // for tmk MPU
public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "7230058008C09000"; // for KBZ MPU // public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "7230058008C09000"; // for KBZ MPU
public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "7234058008C09000"; // for KBZ MPU added DE 14
// public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "3230058028C19800"; // public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "3230058028C19800";
// public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "3230058028C19A00"; //DE55 // public static final String BPC_PRE_AUTH_SALE_VOID_REVERSAL = "3230058028C19A00"; //DE55
// //

View File

@ -45,7 +45,7 @@ public class FieldConfig {
// /* FLD 12 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'}, // /* FLD 12 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_BCD, SDK_8583_ALIGN_L, '0'},
/* FLD 12 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, // BPC HOST /* FLD 12 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, // BPC HOST
/* FLD 13 */ {0, SDK_8583_LEN_BCD, 4, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, /* FLD 13 */ {0, SDK_8583_LEN_BCD, 4, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'},
/* FLD 14 */ {0, SDK_8583_LEN_BCD, 4, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, /* FLD 14 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'},
/* FLD 15 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, /* FLD 15 */ {0, SDK_8583_LEN_BCD, 6, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'},
/* FLD 16 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, /* FLD 16 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
/* FLD 17 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, /* FLD 17 */ {0, SDK_8583_LEN_BCD, 12, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
@ -295,7 +295,7 @@ public class FieldConfig {
/* FLD 62 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, // Jun 1 2023 /* FLD 62 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, // Jun 1 2023
// /* FLD 62 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '}, // /* FLD 62 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '},
// /* FLD 62 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'}, // /* FLD 62 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_BCD, SDK_8583_ALIGN_R, '0'},
/* FLD 63 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '}, /* FLD 63 */ {2, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, ' '},
// /* FLD 63 */ {3, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'}, // /* FLD 63 */ {3, SDK_8583_LEN_BCD, 255, SDK_8583_DATA_ASC, SDK_8583_ALIGN_L, '0'},
/* FLD 64 */ {0, SDK_8583_LEN_BCD, 8, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, 0}, /* FLD 64 */ {0, SDK_8583_LEN_BCD, 8, SDK_8583_DATA_BIT, SDK_8583_ALIGN_L, 0},

View File

@ -63,5 +63,6 @@ public enum TransactionsType {
} }
} }

View File

@ -1,11 +1,14 @@
package com.utsmyanmar.paylibs.utils.print_utils; package com.utsmyanmar.paylibs.utils.print_utils;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Matrix; import android.graphics.Matrix;
import android.graphics.Rect; import android.graphics.Rect;
import android.util.Log; import android.util.Log;
import java.io.ByteArrayOutputStream;
public class BitmapUtils { public class BitmapUtils {
private static final String TAG = "BitmapUtils"; private static final String TAG = "BitmapUtils";
@ -194,4 +197,55 @@ public class BitmapUtils {
} }
return yuv; return yuv;
} }
/**
* Converts a Bitmap to a hexadecimal string
* @param bitmap The bitmap to convert
* @return Hexadecimal string representation
*/
public static String bitmapToHexString(Bitmap bitmap) {
if (bitmap == null) {
return null;
}
// Compress bitmap to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] bytes = baos.toByteArray();
// Convert bytes to hex string
StringBuilder hexString = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(0xFF & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
}
/**
* Converts a hexadecimal string back to a Bitmap
* @param hexString The hex string to convert
* @return Bitmap object
*/
public static Bitmap hexStringToBitmap(String hexString) {
if (hexString == null || hexString.length() % 2 != 0) {
return null;
}
// Convert hex string to byte array
int len = hexString.length();
byte[] bytes = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4)
+ Character.digit(hexString.charAt(i + 1), 16));
}
// Decode byte array to bitmap
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB