ereceipt push logic changed in signature receipt

This commit is contained in:
moon 2026-06-17 21:01:30 +06:30
parent 4ffdc1f679
commit 2dd686d513
4 changed files with 157 additions and 6 deletions

View File

@ -345,8 +345,12 @@ public class ProcessingFragment extends DataBindingFragment {
handleAfterTransaction(); handleAfterTransaction();
break; break;
case SUCCESS: case SUCCESS:
if(requiresSignature()){
handleAfterTransaction();
}else{
sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, true, BaseErrorCode.getCode(payDetail.getTradeAnswerCode()))); sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, true, BaseErrorCode.getCode(payDetail.getTradeAnswerCode())));
handleAfterTransaction(); handleAfterTransaction();
}
break; break;
case OFFLINE_SUCCESS: case OFFLINE_SUCCESS:
if(SystemParamsOperation.getInstance().getDemoStatus()) { if(SystemParamsOperation.getInstance().getDemoStatus()) {

View File

@ -9,6 +9,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; 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.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.util.DataBindingConfig; import com.utsmyanmar.baselib.util.DataBindingConfig;
import com.utsmm.kbz.BR; import com.utsmm.kbz.BR;
@ -19,6 +20,7 @@ import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel;
import com.utsmyanmar.paylibs.model.PayDetail; 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.system.BaseErrorCode;
import com.utsmyanmar.paylibs.utils.LogUtil; import com.utsmyanmar.paylibs.utils.LogUtil;
import com.utsmyanmar.paylibs.utils.print_utils.BitmapUtils; import com.utsmyanmar.paylibs.utils.print_utils.BitmapUtils;
@ -139,6 +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);
sharedViewModel.pushReceipt(EReceiptHelper.buildEReceiptCardReceipt(
requireContext(),
payDetail,
true,
BaseErrorCode.getCode(payDetail.getTradeAnswerCode()),
blob)
);
} }
public class ClickEvent { public class ClickEvent {

View File

@ -0,0 +1,137 @@
package com.utsmm.kbz.util.helper;
import android.content.Context;
import android.util.Base64;
import com.utsmm.kbz.util.tms.TMSUtil;
import com.utsmyanmar.baselib.network.model.e_receipt.EReceiptCardRequest;
import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.print.PrintUtils;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import java.text.DecimalFormat;
public class EReceiptHelper {
public static EReceiptCardRequest buildEReceiptCardReceipt(Context context, PayDetail payDetail, boolean isSuccess, String reason , byte[] signature){
//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 = context.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);
String rawName = PrintUtils.getInstance()
.getCardHolderName(payDetail.getCardHolderName());
String secondLine = PrintUtils.getInstance()
.processNameSpaceSecondLine(rawName);
String firstLine = PrintUtils.getInstance()
.processNameSpaceFirstLine(rawName, secondLine);
String cardHolderName = firstLine +
(secondLine.isEmpty() ? "" : " " + secondLine);
EReceiptCardRequest request = new EReceiptCardRequest();
request.setDE2(PrintUtils.getInstance().maskCardNumberPciDss(payDetail.getCardNo()));
request.setDE3(mapTransactionType(payDetail.getTransactionType()));
request.setDE4(amount);
request.setDE7(currentTimestamp);
request.setDE11(payDetail.getVoucherNo());
// request.setDE22(mapTransactionType(payDetail.getTransactionType()));
request.setDE22(PrintUtils.getInstance().getEntryType(payDetail.getCardType()));
request.setDE37(payDetail.getReferNo());
request.setDE38(payDetail.getApprovalCode());
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);
request.setBatchNumber(payDetail.batchNo);
request.setDE55(payDetail.getAppLabel());
request.setCardLabel(payDetail.getAccountType());
request.setDE14(PrintUtils.getInstance().getFormatExpDate(payDetail.getEXPDate()));
request.setDE43(formatDE43(cardHolderName));
request.setDE48(payDetail.getAID());
request.setDE115(signature != null ? Base64.encodeToString(signature, Base64.NO_WRAP) : "");
return request;
}
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 static 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 static String formatDE43(String value) {
if (value == null) value = "";
if (value.length() > 40) {
return value.substring(0, 40);
}
return String.format("%-40s", value); // right pad with space
}
}

View File

@ -24,7 +24,7 @@ public final class TerminalKeyUtil {
// private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("B4D74774CC846CAFF6D1AAAC2EB79CFF".toUpperCase()); // KBZ UAT // private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("B4D74774CC846CAFF6D1AAAC2EB79CFF".toUpperCase()); // KBZ UAT
// private static final byte[] main_key_usd_data = ByteUtil.hexStr2Bytes("3f4bcac6cc559ab12bbbc5a51118f3f5".toUpperCase()); // KBZ UAT // private static final byte[] main_key_usd_data = ByteUtil.hexStr2Bytes("3f4bcac6cc559ab12bbbc5a51118f3f5".toUpperCase()); // KBZ UAT
private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("875f63741753d18811a3449090d1777b".toUpperCase()); private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("3F4BCAC6CC559AB12BBBC5A51118F3F5".toUpperCase());
// private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase()); // MPU // private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase()); // MPU
private static final byte[] work_key_data = new byte[16]; private static final byte[] work_key_data = new byte[16];
public static void initNexKey() { public static void initNexKey() {