From a8624195b0d62ab020f395c933bf99262d0fac2d Mon Sep 17 00:00:00 2001 From: kizzy Date: Wed, 19 Nov 2025 02:07:54 +0700 Subject: [PATCH] mpu certi ready --- app/build.gradle | 4 + .../utsmm/kbz/ExampleInstrumentedTest.java | 150 ++++++++++++++++++ .../kbz/ui/core_ui/ProcessingFragment.java | 1 - .../ui/core_viewmodel/SharedViewModel.java | 9 ++ .../ui/dashboard/DashboardTransFragment.java | 19 ++- .../utsmm/kbz/ui/pinpad/PinPadViewModel.java | 5 + .../layout/fragment_input_invoice_screen.xml | 74 ++++----- .../java/com/utsmm/kbz/ExampleUnitTest.java | 3 + .../paylibs/isobuilder/EncodePackage.java | 31 ++-- .../paylibs/sign_on/SignOnProcess.java | 4 +- .../transactions/TransactionsOperation.java | 8 +- .../paylibs/utils/enums/TransMenu.java | 2 + .../paylibs/utils/iso_utils/FieldConfig.java | 8 +- .../paylibs/utils/iso_utils/FieldUtils.java | 24 ++- .../utils/iso_utils/TransactionsType.java | 6 +- 15 files changed, 273 insertions(+), 75 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ec5c354..070e1e2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -196,6 +196,10 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.3.0' + androidTestImplementation 'androidx.test:core:1.5.0' + androidTestImplementation 'androidx.test:runner:1.5.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + // Add Mockito dependency for mocking testImplementation 'org.mockito:mockito-core:3.12.4' androidTestImplementation 'org.mockito:mockito-android:3.12.4' diff --git a/app/src/androidTest/java/com/utsmm/kbz/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/utsmm/kbz/ExampleInstrumentedTest.java index fcfd4b7..b258c1b 100644 --- a/app/src/androidTest/java/com/utsmm/kbz/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/com/utsmm/kbz/ExampleInstrumentedTest.java @@ -10,6 +10,29 @@ import org.junit.runner.RunWith; import static org.junit.Assert.*; +import com.sunmi.pay.hardware.aidl.AidlConstants; +import com.utsmm.kbz.util.MockData; +import com.utsmm.kbz.util.TransactionUtil; +import com.utsmyanmar.checkxread.model.CardDataX; +import com.utsmyanmar.checkxread.util.CardTypeX; +import com.utsmyanmar.paylibs.Constant; +import com.utsmyanmar.paylibs.isobuilder.ISOMode; +import com.utsmyanmar.paylibs.isobuilder.builderx.ISOMsgX; +import com.utsmyanmar.paylibs.isobuilder.builderx.ISOVersion; +import com.utsmyanmar.paylibs.model.PayDetail; +import com.utsmyanmar.paylibs.model.TradeData; +import com.utsmyanmar.paylibs.model.enums.TransCVM; +import com.utsmyanmar.paylibs.utils.LogUtil; +import com.utsmyanmar.paylibs.utils.MessageType; +import com.utsmyanmar.paylibs.utils.core_utils.ByteUtil; +import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; +import com.utsmyanmar.paylibs.utils.enums.HostName; +import com.utsmyanmar.paylibs.utils.iso_utils.BitmapConfig; +import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType; +import com.utsmyanmar.paylibs.utils.params.Params; + +import java.util.Locale; + /** * Instrumented test, which will execute on an Android device. * @@ -23,4 +46,131 @@ public class ExampleInstrumentedTest { Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); assertEquals("com.utsmm.kbz", appContext.getPackageName()); } + + + @Test + public void testVoidPacket() { + + CardDataX cardDataX = MockData.getInstance().generateMPUCard(); + + TradeData tradeData = TransactionUtil.getInstance().initMPUTransaction(cardDataX, CardTypeX.IC); + + String bitmap = BitmapConfig.MPU_NEW_VOID; + MessageType messageType = MessageType.FINANCIAL; + + ISOMsgX isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1987, ISOMode.ONLY_HEADER, HostName.FINEXUS) + .build(); + + TradeData transTradeData = setUpRebuildTransactions(tradeData, TransactionsType.VOID, HostName.FINEXUS); + + transTradeData.getPayDetail().setAmount(50000); + PayDetail transPayDetail = transTradeData.getPayDetail(); + + byte[] sendBytes; + try { + sendBytes = isoMsgX.buildISOPackets(transTradeData, bitmap, messageType); + + System.out.println("Hex Str : "+ ByteUtil.bytes2HexStr(sendBytes)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + private TradeData setUpRebuildTransactions(TradeData tradeData, TransactionsType transactionsType, HostName hostName) { + LogUtil.d(Constant.TAG, "Starting Online Transaction--" + hostName + "--" + transactionsType); + + TradeData newTrade = Params.newTrade(true); + PayDetail newPay = newTrade.getPayDetail(); + PayDetail oldPay = tradeData.getPayDetail(); + + newPay.setCardType(100); + newPay.setPINCipher(""); + newPay.setHostName(hostName.name); + newPay.setTransType(transactionsType.name); + newPay.setProcessCode(transactionsType.processCode); + newPay.setCardNo(oldPay.getCardNo()); + newPay.setCardHolderName(oldPay.getCardHolderName()); + newPay.setEXPDate(oldPay.getEXPDate()); + newPay.setTradeDate(oldPay.getTradeDate()); + newPay.setTradeTime(oldPay.getTradeTime()); + newPay.setAmount(oldPay.getAmount()); + newPay.setTransactionType(transactionsType.value); + newPay.setAccountType(oldPay.getAccountType()); + + newPay.setCardInfo(oldPay.getCardInfo()); + + newPay.setSettlementEnabled(SystemParamsOperation.getInstance().getSettlementStatus()); + +// added on Nov, 13 2024 + newPay.setICC55(oldPay.getICC55()); + + if(newPay.getICC55() != null && !newPay.getICC55().isEmpty()) { + newPay.setAppLabel(oldPay.getAppLabel()); + newPay.setAppName(oldPay.getAppName()); + newPay.setTSI(oldPay.getTSI()); + newPay.setAID(oldPay.getAID()); + newPay.setArqC(oldPay.getArqC()); + newPay.setTVR(oldPay.getTVR()); + } + + if(transactionsType != TransactionsType.PRE_AUTH_COMPLETE) { + + newPay.setTradeDateTime(oldPay.getTradeDateTime()); + + } + + + if (transactionsType == TransactionsType.VOID || transactionsType == TransactionsType.REFUND) { + String field60; + if(hostName == HostName.BPC) { + field60 = String.format(Locale.getDefault(), "%010d00", oldPay.getAmount()); + } else { + field60 = String.format(Locale.getDefault(), "%012d", oldPay.getAmount()); + } +// String field60 = String.format(Locale.getDefault(), "%010d00", oldPay.getAmount()); + newPay.setReferNo(oldPay.getReferNo()); + newPay.setTransCVM(TransCVM.SIGNATURE); + newTrade.setField60(field60); + } else if (transactionsType == TransactionsType.PRE_AUTH_VOID) { + newPay.setCardType(oldPay.getCardType()); + newPay.setCustomOrderNo(oldPay.getVoucherNo()); + newPay.setReferNo(oldPay.getReferNo()); + newPay.setCardInfo(oldPay.getCardInfo()); + newPay.setPINCipher(oldPay.getPINCipher()); + newPay.setTempKSN(oldPay.getTempKSN()); + newPay.setTransCVM(TransCVM.SIGNATURE); + // for manual entry reversal which need de 35 + + } else if (transactionsType == TransactionsType.TIP_ADJUSTMENT ) { + newPay.setReferNo(oldPay.getReferNo()); + newPay.setApprovalCode(oldPay.getApprovalCode()); + } else if (transactionsType == TransactionsType.PRE_AUTH_COMPLETE) { + newPay.setCardType(oldPay.getCardType()); + newPay.setCardInfo(oldPay.getCardInfo()); + newPay.setPINCipher(oldPay.getPINCipher()); + newPay.setReferNo(oldPay.getReferNo()); + newPay.setTempKSN(oldPay.getTempKSN()); + } else if (transactionsType == TransactionsType.PRE_AUTH_COMPLETE_VOID) { + newPay.setVoucherNo(oldPay.getVoucherNo()); + newPay.setCustomOrderNo(oldPay.getVoucherNo()); + newPay.setReferNo(oldPay.getReferNo()); + newPay.setCardInfo(oldPay.getCardInfo()); + + /* + * new requirements */ + newPay.setCardType(AidlConstants.CardType.IC.getValue()); + newPay.setPINCipher("55"); + newPay.setTransCVM(TransCVM.SIGNATURE); + } + + + if(oldPay.getAccountType().equals("MPU")){ +// newPay.setIsFreeSign(true); + newPay.setTransCVM(TransCVM.SIGNATURE); + } + + newTrade.setPayDetail(newPay); + return newTrade; + } } \ No newline at end of file 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 91110b1..6f1df0b 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 @@ -254,7 +254,6 @@ public class ProcessingFragment extends DataBindingFragment { case FAIL: case SUCCESS: case OFFLINE_SUCCESS: - LogUtil.d(TAG,"This was called!"); if(SystemParamsOperation.getInstance().getDemoStatus()) { delayFunctionCall(()->{ // updateData(); diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java index 2837d45..496b73e 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java @@ -185,6 +185,15 @@ public class SharedViewModel extends ViewModel { printReceiptButtons.postValue(value); } + public void setTransactionsType(TransactionsType transactionsType) { + this.transactionsType.setValue(transactionsType); + } + + public SingleLiveEvent getTransactionsType() { + return transactionsType; + } + + public void setPrintReceiptMsg(String msg) { this.printReceiptMsg.setValue(msg);} public void postPrintReceiptMsg(String msg) { this.printReceiptMsg.postValue(msg);} public void setPrintStatus(PrintStatus printStatus) { this.printStatus.setValue(printStatus); } public void postPrintStatus(PrintStatus printStatus) { this.printStatus.postValue(printStatus); } diff --git a/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java b/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java index 18f8896..724c115 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java @@ -135,7 +135,7 @@ public class DashboardTransFragment extends DataBindingFragment { } else if (checkTid()) { showDeclineDialog("Please Download Config!"); } else { - sharedViewModel.transactionsType.setValue(TransactionsType.VOID); + sharedViewModel.setTransactionsType(TransactionsType.VOID); // sharedViewModel.transMenu.postValue(TransMenu.TRANSACTIONS); sharedViewModel.setTransMenu(TransMenu.TRANSACTIONS); @@ -147,16 +147,15 @@ public class DashboardTransFragment extends DataBindingFragment { public void onClickSettlement() { sharedViewModel.settlementType.setValue(SettlementType.NORMAL); - sharedViewModel.transactionsType.setValue(TransactionsType.SETTLEMENT); sharedViewModel.setTransMenu(TransMenu.SETTLEMENT); + sharedViewModel.setTransactionsType(TransactionsType.SETTLEMENT); routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment; safeRouteTo(currentId,routeId,hostId); } public void onClickRefund() { - sharedViewModel.transactionsType.setValue(TransactionsType.REFUND); - + sharedViewModel.setTransactionsType(TransactionsType.REFUND); routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment; safeRouteTo(currentId,routeId,hostId); } @@ -167,8 +166,7 @@ public class DashboardTransFragment extends DataBindingFragment { } else if (checkTid()) { showDeclineDialog("Please Download Config!"); } else { - sharedViewModel.transactionsType.setValue(TransactionsType.PRE_AUTH_SALE); - + sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_SALE); routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment; safeRouteTo(currentId,routeId,hostId); } @@ -176,7 +174,7 @@ public class DashboardTransFragment extends DataBindingFragment { } public void onClickPreAuthCancel () { - sharedViewModel.transactionsType.setValue(TransactionsType.PRE_AUTH_VOID); + sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_VOID); sharedViewModel.setTransMenu(TransMenu.PRE_AUTH_FULL_VOID); sharedViewModel.amount.postValue(null); routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment; @@ -185,14 +183,14 @@ public class DashboardTransFragment extends DataBindingFragment { } public void onClickPreAuthComp () { - sharedViewModel.transactionsType.setValue(TransactionsType.PRE_AUTH_COMPLETE); + sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_COMPLETE); routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment; safeRouteTo(currentId,routeId,hostId); } public void onClickPreAuthCompCancel () { - sharedViewModel.transactionsType.setValue(TransactionsType.PRE_AUTH_COMPLETE_VOID); + sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_COMPLETE_VOID); routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment; safeRouteTo(currentId,routeId,hostId); @@ -200,7 +198,8 @@ public class DashboardTransFragment extends DataBindingFragment { public void onClickCashAdvance() { - sharedViewModel.transactionsType.setValue(TransactionsType.CASH_OUT); + sharedViewModel.setTransactionsType(TransactionsType.CASH_OUT); + sharedViewModel.setTransMenu(TransMenu.CASH_OUT); routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment; safeRouteTo(currentId,routeId,hostId); diff --git a/app/src/main/java/com/utsmm/kbz/ui/pinpad/PinPadViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/pinpad/PinPadViewModel.java index a7893bc..1546e97 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/pinpad/PinPadViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/pinpad/PinPadViewModel.java @@ -13,6 +13,7 @@ import com.nexgo.oaf.apiv3.SdkResult; import com.nexgo.oaf.apiv3.device.pinpad.AlgorithmModeEnum; import com.nexgo.oaf.apiv3.device.pinpad.OnPinPadInputListener; import com.nexgo.oaf.apiv3.device.pinpad.PinAlgorithmModeEnum; +import com.nexgo.oaf.apiv3.device.pinpad.PinKeyboardModeEnum; import com.nexgo.oaf.apiv3.device.pinpad.PinKeyboardViewModeEnum; import com.nexgo.oaf.apiv3.device.pinpad.PinPad; import com.nexgo.oaf.apiv3.device.pinpad.PinPadKeyCode; @@ -322,6 +323,8 @@ public class PinPadViewModel extends ViewModel { r.bottom = customPinPadKeyboard.getKey_ok().getHeight() + r.top; pinpadLayout.setKeyConfirm(r); + + pinPad.setPinKeyboardMode(PinKeyboardModeEnum.FIXED); byte[] number = pinPad.setPinpadLayout(pinpadLayout); if(number != null) { @@ -336,6 +339,8 @@ public class PinPadViewModel extends ViewModel { byte[] panBytes = pan.substring(length - 13).getBytes(StandardCharsets.US_ASCII); // byte[] panBytes = pan.substring(length - 13, length - 1).getBytes(StandardCharsets.US_ASCII); pinPad.setPinKeyboardViewMode(PinKeyboardViewModeEnum.DEFAULT); + pinPad.setPinKeyboardMode(PinKeyboardModeEnum.FIXED); + // pinPad.setAlgorithmMode(AlgorithmModeEnum.DES); diff --git a/app/src/main/res/layout/fragment_input_invoice_screen.xml b/app/src/main/res/layout/fragment_input_invoice_screen.xml index 57e6a65..43c7ca4 100644 --- a/app/src/main/res/layout/fragment_input_invoice_screen.xml +++ b/app/src/main/res/layout/fragment_input_invoice_screen.xml @@ -32,21 +32,21 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="16dp" - android:paddingTop="24dp" + android:padding="10dp" + android:paddingTop="14dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -56,10 +56,10 @@ android:text="@string/enter_trace_text" android:textAlignment="center" android:textColor="@color/colorPrimary" - android:textSize="22sp" + android:textSize="17sp" android:textStyle="bold" android:fontFamily="sans-serif-medium" - android:layout_marginBottom="4dp" /> + android:layout_marginBottom="2dp" /> + android:layout_marginBottom="10dp" /> @@ -87,11 +87,11 @@ + android:padding="8dp"> + android:alpha="0.5" /> @@ -125,14 +125,14 @@ - + @@ -155,34 +155,34 @@