From 2dd686d513a5c1df1e1acfbb968d65818b507ddc Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Wed, 17 Jun 2026 21:01:30 +0630 Subject: [PATCH] ereceipt push logic changed in signature receipt --- .../kbz/ui/core_ui/ProcessingFragment.java | 8 +- .../kbz/ui/core_ui/SignatureFragment.java | 16 +- .../utsmm/kbz/util/helper/EReceiptHelper.java | 137 ++++++++++++++++++ .../utsmyanmar/baselib/TerminalKeyUtil.java | 2 +- 4 files changed, 157 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/utsmm/kbz/util/helper/EReceiptHelper.java diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java index 488529d..1d4edb5 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java @@ -345,8 +345,12 @@ public class ProcessingFragment extends DataBindingFragment { handleAfterTransaction(); break; case SUCCESS: - sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, true, BaseErrorCode.getCode(payDetail.getTradeAnswerCode()))); - handleAfterTransaction(); + if(requiresSignature()){ + handleAfterTransaction(); + }else{ + sharedViewModel.pushReceipt(buildEReceiptCardReceipt(payDetail, true, BaseErrorCode.getCode(payDetail.getTradeAnswerCode()))); + handleAfterTransaction(); + } break; case OFFLINE_SUCCESS: if(SystemParamsOperation.getInstance().getDemoStatus()) { diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/SignatureFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/SignatureFragment.java index 627f0dd..e061114 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/SignatureFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/SignatureFragment.java @@ -9,6 +9,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.github.gcacace.signaturepad.views.SignaturePad; +import com.utsmm.kbz.util.helper.EReceiptHelper; import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.util.DataBindingConfig; 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.print.printx.PrintX; import com.utsmyanmar.paylibs.print.printx.PrintXReceipt; +import com.utsmyanmar.paylibs.system.BaseErrorCode; import com.utsmyanmar.paylibs.utils.LogUtil; import com.utsmyanmar.paylibs.utils.print_utils.BitmapUtils; @@ -44,8 +46,8 @@ public class SignatureFragment extends DataBindingFragment { @Override protected DataBindingConfig getDataBindingConfig() { - return new DataBindingConfig(R.layout.fragment_signature_view, BR.vm,sharedViewModel) - .addBindingParam(BR.click,new ClickEvent()); + return new DataBindingConfig(R.layout.fragment_signature_view, BR.vm, sharedViewModel) + .addBindingParam(BR.click, new ClickEvent()); } @Override @@ -127,7 +129,7 @@ public class SignatureFragment extends DataBindingFragment { setToolBarTitleWithoutBackIcon(getResourceString(R.string.signature_title)); } - private void callNextScreen(){ + private void callNextScreen() { routeId = R.id.action_signatureFragment_to_transactionResultFragment; safeNavigateToRouteId(); } @@ -139,6 +141,14 @@ public class SignatureFragment extends DataBindingFragment { payDetail.setESignBlob(blob); sharedViewModel.payDetail.setValue(payDetail); sharedViewModel.updateESignBlob(payDetail.voucherNo, blob); + sharedViewModel.pushReceipt(EReceiptHelper.buildEReceiptCardReceipt( + requireContext(), + payDetail, + true, + BaseErrorCode.getCode(payDetail.getTradeAnswerCode()), + blob) + ); + } public class ClickEvent { diff --git a/app/src/main/java/com/utsmm/kbz/util/helper/EReceiptHelper.java b/app/src/main/java/com/utsmm/kbz/util/helper/EReceiptHelper.java new file mode 100644 index 0000000..3683475 --- /dev/null +++ b/app/src/main/java/com/utsmm/kbz/util/helper/EReceiptHelper.java @@ -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 + } +} diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java index 7e3c49b..20426c7 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java @@ -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_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[] work_key_data = new byte[16]; public static void initNexKey() {