From ef10080cd2eb3054bf521ac51ad1d24790042383 Mon Sep 17 00:00:00 2001 From: "Serik.Uvaissov" Date: Fri, 17 Jul 2020 21:06:48 +0600 Subject: [PATCH] add --- .../bank/ActivationCallbackHandlerImpl.java | 65 +++ .../AlipayPaymentCallbackHandlerImpl.java | 174 +++++++ .../AuthorizationCallbackHandlerImpl.java | 42 ++ .../bank/CardPaymentCallbackHandlerImpl.java | 463 ++++++++++++++++++ .../bank/CardReadingCallbackHandlerImpl.java | 215 ++++++++ .../bank/CardRefundCallbackHandlerImpl.java | 334 +++++++++++++ .../bank/CashPaymentCallbackHandlerImpl.java | 186 +++++++ .../CheckConnectionCallbackHandlerImpl.java | 24 + .../bank/CloseDayCallbackHandlerImpl.java | 54 ++ .../aman/kassa/bank/CustomApplication.java | 21 + .../kassa/bank/CustomSSLSocketFactory.java | 81 +++ .../aman/kassa/bank/CustomTrustManager.java | 40 ++ .../com/aman/kassa/bank/DataCreatorUtils.java | 144 ++++++ .../aman/kassa/bank/DeviceTypeDefiner.java | 29 ++ .../EasyAlipayRefundCallbackHandlerImpl.java | 152 ++++++ .../EasyCardReversalCallbackHandlerImpl.java | 363 ++++++++++++++ .../EasyCashRefundCallbackHandlerImpl.java | 152 ++++++ .../EasyEcomRefundCallbackHandlerImpl.java | 157 ++++++ .../bank/EasyReversalCallbackHandlerImpl.java | 176 +++++++ ...rsalSavedOperationCallbackHandlerImpl.java | 136 +++++ .../bank/EcomPaymentCallbackHandlerImpl.java | 173 +++++++ ...dReaderInformationCallbackHandlerImpl.java | 64 +++ .../bank/GetLicenseCallbackHandlerImpl.java | 34 ++ .../GetMerchantUsersCallbackHandlerImpl.java | 38 ++ ...TransactionDetailsCallbackHandlerImpl.java | 84 ++++ ...ctionListForRefundCallbackHandlerImpl.java | 62 +++ .../LoadTerminalKeysCallbackHandlerImpl.java | 133 +++++ .../kassa/bank/LogOutCallbackHandlerImpl.java | 29 ++ .../bank/PrintingCallbackHandlerImpl.java | 77 +++ .../ReconciliationPrinterDataBuilder.java | 73 +++ .../ResendReceiptCallbackHandlerImpl.java | 64 +++ .../bank/ReversalCallbackHandlerImpl.java | 153 ++++++ ...rtCurrentOperationCallbackHandlerImpl.java | 308 ++++++++++++ .../bank/ScanBarCodeCallbackHandlerImpl.java | 72 +++ ...endRegisterRequestCallbackHandlerImpl.java | 24 + .../SessionExpiringCallbackHandlerImpl.java | 11 + .../aman/kassa/bank/TerminalKeyTypeMpos.java | 5 + .../bank/XReportCallbackHandlerImpl.java | 72 +++ .../builders/SslConfigurationBuilder.java | 50 ++ .../kassa/bank/gui/CustomKeyBoardDilalog.java | 128 +++++ .../kassa/bank/gui/SelectDialogCallback.java | 10 + .../kassa/bank/gui/SelectElementDialog.java | 66 +++ .../bank/managing/PreferencesManager.java | 37 ++ .../bank/permissions/PermissionsManager.java | 11 + .../permissions/PermissionsManagerImpl.java | 65 +++ 45 files changed, 4851 insertions(+) create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/ActivationCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/AlipayPaymentCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/AuthorizationCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/CardPaymentCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/CardReadingCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/CardRefundCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/CashPaymentCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/CheckConnectionCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/CloseDayCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/CustomApplication.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/CustomSSLSocketFactory.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/CustomTrustManager.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/DataCreatorUtils.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/DeviceTypeDefiner.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/EasyAlipayRefundCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/EasyCardReversalCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/EasyCashRefundCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/EasyEcomRefundCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/EasyReversalCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/EasyReversalSavedOperationCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/EcomPaymentCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/GetCardReaderInformationCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/GetLicenseCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/GetMerchantUsersCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/GetTransactionDetailsCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/GetTransactionListForRefundCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/LoadTerminalKeysCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/LogOutCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/PrintingCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/ReconciliationPrinterDataBuilder.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/ResendReceiptCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/ReversalCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/RevertCurrentOperationCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/ScanBarCodeCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/SendRegisterRequestCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/SessionExpiringCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/TerminalKeyTypeMpos.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/XReportCallbackHandlerImpl.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/builders/SslConfigurationBuilder.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/gui/CustomKeyBoardDilalog.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/gui/SelectDialogCallback.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/gui/SelectElementDialog.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/managing/PreferencesManager.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/permissions/PermissionsManager.java create mode 100644 android/app/src/main/java/kz/com/aman/kassa/bank/permissions/PermissionsManagerImpl.java diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/ActivationCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/ActivationCallbackHandlerImpl.java new file mode 100644 index 0000000..f28a468 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/ActivationCallbackHandlerImpl.java @@ -0,0 +1,65 @@ +package kz.com.aman.kassa.bank; + +import android.app.AlertDialog; +import android.widget.EditText; +import android.widget.Toast; + +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.library.external.authorization.ActivationCallbackHandler; +import ru.m4bank.mpos.service.data.dynamic.objects.ActivationType; +import timber.log.Timber; + +public class ActivationCallbackHandlerImpl implements ActivationCallbackHandler { + private final M4BankActivity activity; + + public ActivationCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onActivationTypeAndInfoRequested() { + Timber.i("FIRST STEP STARTED"); + activity.getClientInterface().getAuthorizationManager().sendActivationFirstStepData(ActivationType.EMAIL, "dm@centercorptech.net"); + } + + @Override + public void onActivationCodeRequested(Integer codeLifetime) { + Timber.i("FIRST STEP COMPLETED"); + Timber.i("SECOND STEP STARTED"); + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("ADD activation code:"); + + EditText editext = new EditText(activity); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface().getAuthorizationManager().sendActivationCode(editext.getText().toString()); + dialog.dismiss(); + }); + + builder.setView(editext); + activity.runOnUiThread(() -> builder.create().show()); + } + + @Override + public void onActivationConfirmRequested() { + Timber.i("SECOND STEP COMPLETED"); + Timber.i("LAST STEP STARTED"); + activity.getClientInterface().getAuthorizationManager().confirmActivation("1234", null); + } + + + @Override + public void onCompleted(Result result) { + Timber.i("COMPLETED WITH RESULT - " + result.getResultType()); + } + + @Override + public void onWrongApiCalled() { + Timber.i("WRONG API CALLED"); + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/AlipayPaymentCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/AlipayPaymentCallbackHandlerImpl.java new file mode 100644 index 0000000..c2a7e6d --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/AlipayPaymentCallbackHandlerImpl.java @@ -0,0 +1,174 @@ +package kz.com.aman.kassa.bank; + +import android.app.AlertDialog; +import android.widget.EditText; +import android.widget.Toast; + +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.AlipayPaymentCallbackHandler; +import ru.m4bank.mpos.service.data.FiscalStatusData; +import ru.m4bank.mpos.service.data.dynamic.objects.AdditionalTransactionData; +import ru.m4bank.mpos.service.data.dynamic.objects.AlipayCodeType; +import ru.m4bank.mpos.service.data.dynamic.objects.IdentityCodeType; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.hardware.error.ErrorHandler; +import ru.m4bank.mpos.service.result.PrinterResult; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.TransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus; +import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData; +import timber.log.Timber; + +public class AlipayPaymentCallbackHandlerImpl implements AlipayPaymentCallbackHandler { + + private final M4BankActivity activity; + + public AlipayPaymentCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onWorkFlowDataRequested() { + Timber.d("WorkFlow requested"); + } + + @Override + public void onTransactionAmountRequested() { + activity.getClientInterface().getTransactionManager().setTransactionAmount(activity.getAmount()); + } + + @Override + public void onTransactionDataRequested() { + activity.getClientInterface().getTransactionManager().setAdditionalTransactionData(new AdditionalTransactionData.Builder(null).build()); + } + + @Override + public void onTransactionBarCodeRequested() { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("ADD QRCODE:"); + + EditText editext = new EditText(activity); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface().getTransactionManager().setTransactionBarCode(new IdentityCodeType(AlipayCodeType.QRCODE, editext.getText().toString())); + dialog.dismiss(); + }); + + builder.setView(editext); + activity.runOnUiThread(() -> builder.create().show()); + } + + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), + Toast.LENGTH_SHORT).show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionInit() { + activity.getClientInterface().getTransactionManager().processOnlineTransaction(false); + } + + @Override + public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) { + + } + + @Override + public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) { + + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription() == null ? "" : errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction(); + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + activity.getClientInterface() + .getTransactionManager() + .sendTransactionUserData("signature", "phone", "email"); + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionCompleted() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void notAuthorized() { + + } + + @Override + public void onTransactionDetailsReceived(Transaction transaction) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction details received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onSuccessStatusTransaction(Transaction transaction) { + + } + + @Override + public void onErrorStatusTransaction() { + + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRequestedReportZ() { + + } + + @Override + public void onCompletedPrinting(PrinterResult printerResult) { + + } + + @Override + public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) { + + } + + @Override + public void onPrinterForRegistrationGettingCompleted() { + + } + + @Override + public void onNoBoundedPrinterFound() { + + } + + @Override + public void onPrinterToUseSelectionRequested(List printerList) { + + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/AuthorizationCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/AuthorizationCallbackHandlerImpl.java new file mode 100644 index 0000000..1d7cfd7 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/AuthorizationCallbackHandlerImpl.java @@ -0,0 +1,42 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; +import ru.m4bank.mpos.library.external.authorization.AuthorizationCallbackHandler; +import ru.m4bank.mpos.service.authorization.network.AuthorizationResponse; + + +public class AuthorizationCallbackHandlerImpl implements AuthorizationCallbackHandler { + private final M4BankActivity activity; + + public AuthorizationCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onLoginAndPasswordRequested() { + activity.getClientInterface().getAuthorizationManager().sendLoginAndPassword(activity.getLogin(), activity.getPassword()); + } + + + @Override + public void onCompleted(ru.m4bank.mpos.service.result.Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), + Toast.LENGTH_SHORT).show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCompleted(ru.m4bank.mpos.service.result.Result result, AuthorizationResponse authorizationResponse) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), + Toast.LENGTH_SHORT).show()); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/CardPaymentCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/CardPaymentCallbackHandlerImpl.java new file mode 100644 index 0000000..f27abcb --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/CardPaymentCallbackHandlerImpl.java @@ -0,0 +1,463 @@ +package kz.com.aman.kassa.bank; + +import android.app.AlertDialog; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import kz.com.aman.kassa.bank.gui.CustomKeyBoardDilalog; +import ru.m4bank.mpos.library.external.transactions.CardPaymentCallbackHandler; +import ru.m4bank.mpos.service.commons.data.ResultType; +import ru.m4bank.mpos.service.data.FiscalStatusData; +import ru.m4bank.mpos.service.data.PrinterBaseData; +import ru.m4bank.mpos.service.data.PrinterErrorData; +import ru.m4bank.mpos.service.data.dynamic.objects.AdditionalTransactionData; +import ru.m4bank.mpos.service.data.dynamic.objects.GoodsData; +import ru.m4bank.mpos.service.data.dynamic.objects.Reader; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.data.dynamic.objects.VendorData; +import ru.m4bank.mpos.service.data.dynamic.objects.printer.enums.AccountingSubject; +import ru.m4bank.mpos.service.data.dynamic.objects.printer.enums.TaxRate; +import ru.m4bank.mpos.service.data.dynamic.objects.result.ResultCode; +import ru.m4bank.mpos.service.hardware.error.AllError; +import ru.m4bank.mpos.service.hardware.error.ErrorHandler; +import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.ApplicationIdConv; +import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.TransactionTypeConv; +import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.VirtualKeyboardStyleTypeConv; +import ru.m4bank.mpos.service.result.PrinterResult; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.ButtonKeyboardDto; +import ru.m4bank.mpos.service.transactions.data.MessageButtonData; +import ru.m4bank.mpos.service.transactions.data.TransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus; +import ru.m4bank.mpos.service.transactions.data.VirtualPinKeyboardData; +import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData; +import ru.m4bank.mpos.service.transactions.dto.OnlineCardDataDto; +import timber.log.Timber; + +public class CardPaymentCallbackHandlerImpl implements CardPaymentCallbackHandler { + private final M4BankActivity activity; + private CustomKeyBoardDilalog customKeyBoardDilalog; + private TransactionTypeConv transactionTypeConv; + + public CardPaymentCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + customKeyBoardDilalog = new CustomKeyBoardDilalog(); + transactionTypeConv = TransactionTypeConv.UNKNOWN; + } + + public CardPaymentCallbackHandlerImpl setTransactionTypeConv(TransactionTypeConv transactionTypeConv) { + this.transactionTypeConv = transactionTypeConv; + return this; + } + + @Override + public void onDeviceToConnectSelectionRequested(List deviceList) { + Timber.d("onDeviceToConnectSelectionRequested"); + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose device"); + + Spinner deviceListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, deviceList); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + deviceListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface() + .getTransactionManager() + .selectCardReader(deviceListSpinner.getSelectedItem().toString()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + builder.create().show(); + }); + } + + @Override + public void onCardReaderForTransactionGettingCompleted() { + Timber.d("Reader has been received"); + } + + @Override + public void onNoBoundedDevicesFound() { + Timber.d("No bounded readers"); + } + + @Override + public void onDeviceToUseSelectionRequested(List deviceList) { + Timber.d("onDeviceToUseSelectionRequested"); + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose device"); + + Spinner deviceListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(deviceList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + deviceListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface() + .getTransactionManager() + .setCardReaderToUse((Reader) deviceListSpinner.getSelectedItem()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + builder.create().show(); + }); + } + + @Override + public void onTransactionAmountRequested() { + Timber.d("onTransactionAmountRequested"); + activity.getClientInterface().getTransactionManager().setTransactionAmount(activity.getAmount()); + } + + @Override + public void onTransactionDataRequested() { + Timber.d("onTransactionDataRequested"); + List goodsDataList = new ArrayList<>(); + goodsDataList.add(new GoodsData.Builder() + .setOriginalPrice(100000L) + .setRealPrice(100000L) + .setName("Принтер") + .setQuantity(1) + .setCode("000001") + .setUnits("00") + .setDiscount(0L) + .setTaxRate(TaxRate.Tax_18) + .setExponent(2) + .setAccountingSubject(AccountingSubject.PRODUCT) + .build()); + goodsDataList.add(new GoodsData.Builder() + .setOriginalPrice(30065L) + .setRealPrice(30065L) + .setName("Услуга") + .setQuantity(3) + .setCode("000002") + .setUnits("00") + .setDiscount(0L) + .setTaxRate(TaxRate.Tax_18) + .setExponent(2) + .setAccountingSubject(AccountingSubject.PRODUCT) + .build()); + + HashMap vendorDescription = new HashMap<>(); + vendorDescription.put("vendor", "description"); + vendorDescription.put("vendor1", "description1"); + vendorDescription.put("vendor2", "description2"); + vendorDescription.put("vendor3", "description3"); + VendorData vendorData = new VendorData(vendorDescription); + + AdditionalTransactionData additionalTransactionData = new AdditionalTransactionData.Builder(goodsDataList).vendorData(vendorData).build(); + activity.getClientInterface().getTransactionManager().setAdditionalTransactionData(additionalTransactionData); + } + + @Override + public void onWorkFlowDataRequested() { + Timber.d("WorkFlow requested"); + } + + @Override + public void onCompleted(Result result) { + Timber.d("onCompleted"); + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + Timber.d("onWrongApiCalled"); + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onReceiveCardData(OnlineCardDataDto data, boolean shouldConfirmBeManuallyCalled) { + Timber.d("onReceiveCardData"); + if (shouldConfirmBeManuallyCalled) { + activity.getClientInterface().getTransactionManager().processOnlineTransaction(false); + } + } + + @Override + public void onTransactionInit() { + //Impossible + activity.getClientInterface().getTransactionManager().processOnlineTransaction(false); + } + + @Override + public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) { + Timber.d("onTransactionExecutionStatusChanged: " + newStatus.name()); + activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) { + if (transactionErrorData.getError() != null) { + activity.runOnUiThread(() -> Toast.makeText(activity, transactionErrorData.getError().getDescription(), Toast.LENGTH_LONG).show()); + } else { + Timber.d("onError: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getDescription()); + activity.runOnUiThread(() -> Toast.makeText(activity, String.format("onError: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getFinalDescription()), Toast.LENGTH_LONG).show()); + } + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + Timber.d("onErrorWithPossibilityToRetry: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getDescription()); + activity.runOnUiThread(() -> Toast.makeText(activity, String.format("onError: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getFinalDescription()), Toast.LENGTH_LONG).show()); + activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction(); + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + Timber.d("onTransactionDataReceivedError"); + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + Timber.d("onUserInformationRequested"); + if (transactionTypeConv != TransactionTypeConv.CANCEL) { + activity.getClientInterface() + .getTransactionManager() + .sendTransactionUserData("signature", "phone", "vsa@centercorptech.net"); + } else { + onTransactionCompleted(); + } + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + Timber.d("onTransactionDataReceived"); + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionCompleted() { + Timber.d("onTransactionCompleted"); + activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onRequiredHostAddress() { + Timber.d("onRequiredHostAddress"); + activity.runOnUiThread(() -> Toast.makeText(activity, "Set Host Address", Toast.LENGTH_LONG) + .show()); + activity.getClientInterface().getTransactionManager().setHostAddress("213.79.122.128", "8011"); + } + + @Override + public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) { + Timber.d("onDisconnectedEventReceivedOrCanNotEstablishConnection"); + if (reconnectAvailable) { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setMessage("Connection to cardreader has been lost, try to reconnect and repeat last operation?"); + builder.setCancelable(false); + builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().tryToReconnectAndRepeatLast()); + builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel()); + builder.create().show(); + }); + } + } + + @Override + public void onConnectingProcessStarted(String deviceName) { + Timber.d("Connecting process started: %s", deviceName); + } + + @Override + public void onReconnectNeededToProcess() { + Timber.d("onReconnectNeededToProcess"); + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setMessage("Connection to cardreader has been lost, try to reconnect and continue?"); + builder.setCancelable(false); + builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().getTransactionManager().tryToReconnectToCardReader()); + builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel()); + builder.create().show(); + }); + } + + @Override + public void onReconciliationRequiredToProcess() { + Timber.d("onReconciliationRequiredToProcess"); + Timber.d("Reconciliation required!!!"); + activity.getClientInterface().getTransactionManager().makeReconciliationDuringTransaction(); + } + + @Override + public void onReconciliationCompleted(Result result) { + Timber.d("onReconciliationCompleted"); + Timber.d("Reconciliation completed!!!"); + if (result.getResultType() == ResultType.SUCCESSFUL) { + activity.getClientInterface().getTransactionManager().continueTransactionAfterReconciliation(); + } else { + activity.runOnUiThread(() -> Toast.makeText(activity, "Reconciliation failed " + result.getDescription(), Toast.LENGTH_LONG) + .show()); + } + } + + @Override + public void notAuthorized() { + Timber.d("notAuthorized"); + activity.runOnUiThread(() -> Toast.makeText(activity, "notAuthorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionDetailsReceived(Transaction transaction) { + Timber.d("onTransactionDetailsReceived"); + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction details received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onSuccessStatusTransaction(Transaction transaction) { + Timber.d("onSuccessStatusTransaction"); + } + + @Override + public void onErrorStatusTransaction() { + Timber.d("onErrorStatusTransaction"); + } + + @Override + public void onRepeat(int attemptNumber) { + Timber.d("onRepeat"); + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRequestedReportZ() { + Timber.d("onRequestedReportZ"); + } + + @Override + public void onCompletedPrinting(PrinterResult printerErrorDataPrinterBaseDataPrinterResult) { + Timber.d("onCompletedPrinting"); + } + + @Override + public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) { + Timber.d("onStatusFiscalModule"); + } + + @Override + public void onPrinterForRegistrationGettingCompleted() { + Timber.d("onPrinterForRegistrationGettingCompleted"); + } + + @Override + public void onNoBoundedPrinterFound() { + Timber.d("onNoBoundedPrinterFound"); + + } + + @Override + public void onPrinterToUseSelectionRequested(List printerList) { + Timber.d("onPrinterToUseSelectionRequested"); + } + + @Override + public void onRequiredReversal(String description, ResultCode resultCode) { + Timber.d("onRequiredReversal: %s, resultCode: %s", description, resultCode.name()); + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setMessage("Revert last of operation?"); + builder.setCancelable(false); + builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().getTransactionManager().revertCurrentOperation(new RevertCurrentOperationCallbackHandlerImpl(activity))); + builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().getTransactionManager().clearLastTransactionInformation()); + builder.create().show(); + }); + } + + @Override + public void onRequiredApplicationSelection(List list) { + Timber.d("onRequiredApplicationSelection"); + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose application identifier"); + + Spinner deviceListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, list); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + deviceListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface() + .getTransactionManager() + .setTransactionApplicationIdentifier((ApplicationIdConv) deviceListSpinner.getSelectedItem()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + builder.create().show(); + }); + } + + + @Override + public void onActivityUpdateUiThread() { + Timber.d("onActivityUpdateUiThread"); + activity.getClientInterface().getTransactionManager().addPinpadClickListener(activity); + } + + @Override + public void onCreatePinPadButtons() { + Timber.d("onCreatePinPadButtons"); + customKeyBoardDilalog.createDialog(activity); + customKeyBoardDilalog.show(activity); + ButtonKeyboardDto buttonKeyboardDto = new ButtonKeyboardDto.Build( + customKeyBoardDilalog.getBtnb1(), + customKeyBoardDilalog.getBtnb2(), + customKeyBoardDilalog.getBtnb3(), + customKeyBoardDilalog.getBtnb4(), + customKeyBoardDilalog.getBtnb5(), + customKeyBoardDilalog.getBtnb6(), + customKeyBoardDilalog.getBtnb7(), + customKeyBoardDilalog.getBtnb8(), + customKeyBoardDilalog.getBtnb9(), + customKeyBoardDilalog.getBtnb0(), + customKeyBoardDilalog.getBtncancel(), + customKeyBoardDilalog.getBtnconfirm(), + customKeyBoardDilalog.getBtnclean(), + activity.getWindowManager().getDefaultDisplay().getRotation() + ).build(); + activity.getClientInterface().getTransactionManager().addPinPadButtons(buttonKeyboardDto); + } + + @Override + public void onShowPinPadKeyBoard(MessageButtonData messageButtonData) { + Timber.d("onShowPinPadKeyBoard"); + customKeyBoardDilalog.setText(messageButtonData); + } + + @Override + public void onUpdateElementPin(int count) { + Timber.d("onUpdateElementPin"); + activity.runOnUiThread(() -> Toast.makeText(activity, "count = " + count, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCloseKeyboard() { + Timber.d("onCloseKeyboard"); + customKeyBoardDilalog.close(activity); + } + + @Override + public void onRequiredAdditionalVirtualKeyboardSettings(VirtualKeyboardStyleTypeConv virtualKeyboardStyleTypeConv) { + activity.showSelectStyleDialog(additionalData -> + activity.getClientInterface().getTransactionManager().addVirtualPinKeyboardData(additionalData)); + } + + public interface SelectStyleListener { + void onSelectStyle(VirtualPinKeyboardData virtualPinKeyboardData); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/CardReadingCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/CardReadingCallbackHandlerImpl.java new file mode 100644 index 0000000..5bf2734 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/CardReadingCallbackHandlerImpl.java @@ -0,0 +1,215 @@ +package kz.com.aman.kassa.bank; + +import android.app.AlertDialog; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; + +import java.util.List; + +import kz.com.aman.kassa.bank.gui.CustomKeyBoardDilalog; +import ru.m4bank.mpos.library.external.transactions.CardReadingCallbackHandler; +import ru.m4bank.mpos.service.commons.utils.ArrayUtils; +import ru.m4bank.mpos.service.data.dynamic.objects.Reader; +import ru.m4bank.mpos.service.hardware.error.ErrorHandler; +import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.ApplicationIdConv; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.SimpleCardTransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus; +import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData; +import timber.log.Timber; + +public class CardReadingCallbackHandlerImpl implements CardReadingCallbackHandler { + private final M4BankActivity activity; + private CustomKeyBoardDilalog customKeyBoardDilalog; + + public CardReadingCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + customKeyBoardDilalog = new CustomKeyBoardDilalog(); + } + + @Override + public void onDeviceToConnectSelectionRequested(List deviceList) { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose device"); + + Spinner deviceListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, deviceList); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + deviceListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface() + .getTransactionManager() + .selectCardReader(deviceListSpinner.getSelectedItem().toString()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + builder.create().show(); + }); + } + + @Override + public void onCardReaderForTransactionGettingCompleted() { + Timber.d("Reader has been received"); + } + + @Override + public void onNoBoundedDevicesFound() { + Timber.d("No bounded readers"); + } + + @Override + public void onDeviceToUseSelectionRequested(List deviceList) { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose device"); + + Spinner deviceListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, ArrayUtils.newArrayList(deviceList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + deviceListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface() + .getTransactionManager() + .setCardReaderToUse((Reader) deviceListSpinner.getSelectedItem()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + builder.create().show(); + }); + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + result.getDescription(), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionInit() { + + } + + @Override + public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) { + activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onError(ErrorHandler errorHandler, TransactionErrorData errorData) { + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction(); + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + activity.getClientInterface() + .getTransactionManager() + .sendTransactionUserData("signature", "phone", "vsa@centercorptech.net"); + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionCompleted() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) { + if (reconnectAvailable) { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setMessage("Connection to cardreader has been lost, try to reconnect and repeat last operation?"); + builder.setCancelable(false); + builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().tryToReconnectAndRepeatLast()); + builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel()); + builder.create().show(); + }); + } + } + + @Override + public void onConnectingProcessStarted(String deviceName) { + Timber.d("Connecting process started"); + } + + @Override + public void onReconnectNeededToProcess() { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setMessage("Connection to cardreader has been lost, try to reconnect and continue?"); + builder.setCancelable(false); + builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().getTransactionManager().tryToReconnectToCardReader()); + builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel()); + builder.create().show(); + }); + } + + @Override + public void notAuthorized() { + + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onReceiveCommonCardData(SimpleCardTransactionData simpleCardTransactionData) { + String pan = simpleCardTransactionData.getCardNumber(); + String expDate = simpleCardTransactionData.getCardExpiryDate(); + String cardHolderName = simpleCardTransactionData.getCardHolderName(); + activity.runOnUiThread(() -> Toast.makeText(activity, "card data: " + pan + " - " + expDate + " - " + cardHolderName, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRequiredApplicationSelection(List applicationOfList) { + // activity.runOnUiThread(() -> { + // AlertDialog.Builder builder = new AlertDialog.Builder(activity); + // builder.setTitle("Choose application identifier"); + // + // Spinner deviceListSpinner = new Spinner(activity); + // ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, applicationOfList); + // adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + // deviceListSpinner.setAdapter(adapter); + // + // builder.setPositiveButton("OK", (dialog, which) -> { + // activity.getClientInterface() + // .getTransactionManager() + // .setTransactionApplicationIdentifier(deviceListSpinner.getSelectedItem().toString()); + // dialog.dismiss(); + // }); + // + // builder.setView(deviceListSpinner); + // builder.create().show(); + // }); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/CardRefundCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/CardRefundCallbackHandlerImpl.java new file mode 100644 index 0000000..c7dbfb0 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/CardRefundCallbackHandlerImpl.java @@ -0,0 +1,334 @@ +package kz.com.aman.kassa.bank; + +import android.app.AlertDialog; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import kz.com.aman.kassa.bank.gui.CustomKeyBoardDilalog; +import ru.m4bank.mpos.library.external.transactions.EasyCardRefundCallbackHandler; +import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler; +import ru.m4bank.mpos.service.data.FiscalStatusData; +import ru.m4bank.mpos.service.data.PrinterBaseData; +import ru.m4bank.mpos.service.data.PrinterErrorData; +import ru.m4bank.mpos.service.data.dynamic.objects.Reader; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.data.dynamic.objects.result.ResultCode; +import ru.m4bank.mpos.service.data.dynamic.objects.transaction.RefundType; +import ru.m4bank.mpos.service.hardware.error.AllError; +import ru.m4bank.mpos.service.hardware.error.ErrorHandler; +import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.ApplicationIdConv; +import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.VirtualKeyboardStyleTypeConv; +import ru.m4bank.mpos.service.result.PrinterResult; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.ButtonKeyboardDto; +import ru.m4bank.mpos.service.transactions.data.MessageButtonData; +import ru.m4bank.mpos.service.transactions.data.TransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus; +import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData; +import ru.m4bank.mpos.service.transactions.dto.OnlineCardDataDto; +import timber.log.Timber; + +public class CardRefundCallbackHandlerImpl implements EasyCardRefundCallbackHandler, GetTransactionsListCallbackHandler { + + private final M4BankActivity activity; + private Transaction transaction; + private CustomKeyBoardDilalog customKeyBoardDilalog; + + public CardRefundCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + customKeyBoardDilalog = new CustomKeyBoardDilalog(); + } + + @Override + public void onCardReaderForTransactionGettingCompleted() { + Timber.d("Reader has been received"); + } + + @Override + public void onNoBoundedDevicesFound() { + Timber.d("No bounded readers"); + } + + @Override + public void onDeviceToUseSelectionRequested(List deviceList) { + Timber.d("onDeviceToUseSelectionRequested"); + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose device"); + + Spinner deviceListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(deviceList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + deviceListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface().getTransactionManager().setCardReaderToUse((Reader) deviceListSpinner.getSelectedItem()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + activity.runOnUiThread(() -> builder.create().show()); + } + + @Override + public void onDeviceToConnectSelectionRequested(List deviceList) { + Timber.d("onDeviceToConnectSelectionRequested"); + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose device"); + + Spinner deviceListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, deviceList); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + deviceListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface().getTransactionManager().selectCardReader(deviceListSpinner.getSelectedItem().toString()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + activity.runOnUiThread(() -> builder.create().show()); + } + + @Override + public void onCompleted(Result result) { + Timber.d("onCompleted"); + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), + Toast.LENGTH_SHORT).show()); + } + + @Override + public void onWrongApiCalled() { + Timber.d("onWrongApiCalled"); + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onReceiveCardData(OnlineCardDataDto data, boolean shouldConfirmBeManuallyCalled) { + Timber.d("onReceiveCardData"); + if (shouldConfirmBeManuallyCalled) { + activity.getClientInterface().getTransactionManager().processOnlineTransaction(false); + } + } + + @Override + public void onRequiredReversal(String description, ResultCode resultCode) { + Timber.d("onRequiredReversal: %s, resultCode: %s", description, resultCode.name()); + } + + @Override + public void onRequiredApplicationSelection(List list) { + Timber.d("onRequiredApplicationSelection"); + } + + @Override + public void onTransactionInit() { + + } + + @Override + public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) { + Timber.d("onTransactionExecutionStatusChanged: %s", newStatus.name()); + activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) { + Timber.d("onError: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getDescription()); + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + Timber.d("onErrorWithPossibilityToRetry: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getDescription()); + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction(); + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + Timber.d("onTransactionDataReceivedError"); + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + Timber.d("onUserInformationRequested"); + activity.getClientInterface().getTransactionManager().sendTransactionUserData("signature", "phone", "email"); + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + Timber.d("onTransactionDataReceived"); + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionCompleted() { + Timber.d("onTransactionCompleted"); + activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) { + Timber.d("onDisconnectedEventReceivedOrCanNotEstablishConnection"); + } + + @Override + public void onConnectingProcessStarted(String name) { + Timber.d("onConnectingProcessStarted: %s", name); + } + + @Override + public void onReconnectNeededToProcess() { + Timber.d("onReconnectNeededToProcess"); + } + + @Override + public void onReconciliationRequiredToProcess() { + Timber.d("onReconciliationRequiredToProcess"); + Timber.d("Reconciliation required!!!"); + activity.getClientInterface().getTransactionManager().makeReconciliationDuringTransaction(); + } + + @Override + public void onReconciliationCompleted(Result result) { + Timber.d("onReconciliationCompleted"); + Timber.d("Reconciliation completed!!!"); + } + + @Override + public void notAuthorized() { + Timber.d("notAuthorized"); + activity.runOnUiThread(() -> Toast.makeText(activity, "notAuthorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRepeat(int attemptNumber) { + Timber.d("onRepeat"); + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRequestedReportZ() { + Timber.d("onRequestedReportZ"); + } + + @Override + public void onCompletedPrinting(PrinterResult printerErrorDataPrinterBaseDataPrinterResult) { + Timber.d("onCompletedPrinting"); + } + + @Override + public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) { + Timber.d("onStatusFiscalModule"); + } + + @Override + public void onPrinterForRegistrationGettingCompleted() { + Timber.d("onPrinterForRegistrationGettingCompleted"); + } + + @Override + public void onNoBoundedPrinterFound() { + Timber.d("onNoBoundedPrinterFound"); + } + + @Override + public void onPrinterToUseSelectionRequested(List printerList) { + Timber.d("onPrinterToUseSelectionRequested"); + } + + @Override + public void onRefundDataRequested() { + Timber.d("onRefundDataRequested"); + activity.getClientInterface().getTransactionManager().setRefundData(transaction, transaction.getAmount(), RefundType.General); + } + + @Override + public void onTransactionsListReceived(List transactionList) { + Timber.d("onTransactionsListReceived"); + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose transaction"); + + Spinner transactionListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + transactionListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + transaction = (Transaction) transactionListSpinner.getSelectedItem(); + activity.getClientInterface().getTransactionManager().makeCardRefund(this); + dialog.dismiss(); + }); + + builder.setView(transactionListSpinner); + activity.runOnUiThread(() -> builder.create().show()); + } + + @Override + public void onActivityUpdateUiThread() { + Timber.d("onActivityUpdateUiThread"); + activity.getClientInterface().getTransactionManager().addPinpadClickListener(activity); + } + + @Override + public void onCreatePinPadButtons() { + Timber.d("onCreatePinPadButtons"); + customKeyBoardDilalog.createDialog(activity); + customKeyBoardDilalog.show(activity); + ButtonKeyboardDto buttonKeyboardDto = new ButtonKeyboardDto.Build( + customKeyBoardDilalog.getBtnb1(), + customKeyBoardDilalog.getBtnb2(), + customKeyBoardDilalog.getBtnb3(), + customKeyBoardDilalog.getBtnb4(), + customKeyBoardDilalog.getBtnb5(), + customKeyBoardDilalog.getBtnb6(), + customKeyBoardDilalog.getBtnb7(), + customKeyBoardDilalog.getBtnb8(), + customKeyBoardDilalog.getBtnb9(), + customKeyBoardDilalog.getBtnb0(), + customKeyBoardDilalog.getBtncancel(), + customKeyBoardDilalog.getBtnconfirm(), + customKeyBoardDilalog.getBtnclean(), + activity.getWindowManager().getDefaultDisplay().getRotation() + ).build(); + activity.getClientInterface().getTransactionManager().addPinPadButtons(buttonKeyboardDto); + } + + @Override + public void onShowPinPadKeyBoard(MessageButtonData messageButtonData) { + Timber.d("onShowPinPadKeyBoard"); + customKeyBoardDilalog.setText(messageButtonData); + } + + @Override + public void onUpdateElementPin(int count) { + Timber.d("onUpdateElementPin"); + activity.runOnUiThread(() -> Toast.makeText(activity, "count = " + count, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCloseKeyboard() { + Timber.d("onCloseKeyboard"); + customKeyBoardDilalog.close(activity); + } + + @Override + public void onRequiredAdditionalVirtualKeyboardSettings(VirtualKeyboardStyleTypeConv virtualKeyboardStyleTypeConv) { + activity.showSelectStyleDialog(additionalData -> + activity.getClientInterface().getTransactionManager().addVirtualPinKeyboardData(additionalData)); + } + + @Override + public void onRequiredHostAddress() { + Timber.d("onRequiredHostAddress"); + activity.runOnUiThread(() -> Toast.makeText(activity, "Set Host Address", Toast.LENGTH_LONG) + .show()); + activity.getClientInterface().getTransactionManager().setHostAddress("213.79.122.128", "8011"); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/CashPaymentCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/CashPaymentCallbackHandlerImpl.java new file mode 100644 index 0000000..cb99bc0 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/CashPaymentCallbackHandlerImpl.java @@ -0,0 +1,186 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.CashPaymentCallbackHandler; +import ru.m4bank.mpos.service.data.FiscalStatusData; +import ru.m4bank.mpos.service.data.dynamic.objects.AdditionalTransactionData; +import ru.m4bank.mpos.service.data.dynamic.objects.GoodsData; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.data.dynamic.objects.printer.enums.AccountingSubject; +import ru.m4bank.mpos.service.data.dynamic.objects.printer.enums.TaxRate; +import ru.m4bank.mpos.service.hardware.error.ErrorHandler; +import ru.m4bank.mpos.service.result.PrinterResult; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.TransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus; +import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData; +import timber.log.Timber; + +public class CashPaymentCallbackHandlerImpl implements CashPaymentCallbackHandler { + + private final M4BankActivity activity; + + public CashPaymentCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onWorkFlowDataRequested() { + Timber.d("WorkFlow requested"); + } + + @Override + public void onTransactionAmountRequested() { + activity.getClientInterface().getTransactionManager().setTransactionAmount(activity.getAmount()); + } + + @Override + public void onTransactionDataRequested() { + List goodsDataList = new ArrayList<>(); + goodsDataList.add(new GoodsData.Builder() + .setOriginalPrice(100000L) + .setRealPrice(100000L) + .setName("Принтер") + .setQuantity(1) + .setCode("000001") + .setUnits("00") + .setDiscount(0L) + .setTaxRate(TaxRate.Tax_18) + .setExponent(2) + .setAccountingSubject(AccountingSubject.PRODUCT) + .build()); + goodsDataList.add(new GoodsData.Builder() + .setOriginalPrice(30065L) + .setRealPrice(30065L) + .setName("Услуга") + .setQuantity(3) + .setCode("000002") + .setUnits("00") + .setDiscount(0L) + .setTaxRate(TaxRate.Tax_18) + .setExponent(2) + .setAccountingSubject(AccountingSubject.PRODUCT) + .build()); + + AdditionalTransactionData additionalTransactionData = new AdditionalTransactionData.Builder(goodsDataList).build(); + activity.getClientInterface().getTransactionManager().setAdditionalTransactionData(additionalTransactionData); + } + + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), + Toast.LENGTH_SHORT).show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionInit() { + Timber.d("onTransactionInit"); + activity.getClientInterface().getTransactionManager().processOnlineTransaction(false); + } + + @Override + public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) { + + } + + @Override + public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) { + + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction(); + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + activity.getClientInterface() + .getTransactionManager() + .sendTransactionUserData("signature", "phone", "email"); + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionCompleted() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "notAuthorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionDetailsReceived(Transaction transaction) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction details received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onSuccessStatusTransaction(Transaction transaction) { + + } + + @Override + public void onErrorStatusTransaction() { + + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRequestedReportZ() { + + } + + @Override + public void onCompletedPrinting(PrinterResult printerResult) { + + } + + @Override + public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) { + + } + + @Override + public void onPrinterForRegistrationGettingCompleted() { + + } + + @Override + public void onNoBoundedPrinterFound() { + + } + + @Override + public void onPrinterToUseSelectionRequested(List printerList) { + + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/CheckConnectionCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/CheckConnectionCallbackHandlerImpl.java new file mode 100644 index 0000000..1b76a15 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/CheckConnectionCallbackHandlerImpl.java @@ -0,0 +1,24 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; + +import ru.m4bank.mpos.library.external.configuration.CheckConnectionCallbackHandler; +import ru.m4bank.mpos.service.result.CheckConnectionExternalResult; + +public class CheckConnectionCallbackHandlerImpl implements CheckConnectionCallbackHandler { + private final M4BankActivity activity; + + public CheckConnectionCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onCompleted(CheckConnectionExternalResult result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()) + " " + result.isOnlineRegistration(), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/CloseDayCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/CloseDayCallbackHandlerImpl.java new file mode 100644 index 0000000..95d6923 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/CloseDayCallbackHandlerImpl.java @@ -0,0 +1,54 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; + +import com.landicorp.uns.result; + +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.CloseDayCallbackHandler; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.handling.result.CloseDayResult; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.network.closeday.CloseDayResponseInfo; + + +class CloseDayCallbackHandlerImpl implements CloseDayCallbackHandler { + private final M4BankActivity activity; + + CloseDayCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionsListReceived(List transactionList, List list1) { + activity.runOnUiThread(() -> Toast.makeText(activity, "onTransactionsListReceived - " + transactionList, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCompleted(CloseDayResult closeDayResult) { + activity.runOnUiThread(() -> Toast.makeText(activity, closeDayResult.getResultType() + " " + (closeDayResult.getDescription() == null ? "" : closeDayResult.getDescription()), Toast.LENGTH_SHORT) + .show()); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/CustomApplication.java b/android/app/src/main/java/kz/com/aman/kassa/bank/CustomApplication.java new file mode 100644 index 0000000..7ba15f2 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/CustomApplication.java @@ -0,0 +1,21 @@ +package kz.com.aman.kassa.bank; + +import android.app.Application; + + +import timber.log.Timber; + +public class CustomApplication extends Application { + @Override + public void onCreate() { + super.onCreate(); + Thread.setDefaultUncaughtExceptionHandler((thread, ex) -> { + Timber.v(ex.getMessage()); + for (StackTraceElement element : ex.getStackTrace()) { + Timber.v(element.toString()); + } + ex.printStackTrace(); + System.exit(0); + }); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/CustomSSLSocketFactory.java b/android/app/src/main/java/kz/com/aman/kassa/bank/CustomSSLSocketFactory.java new file mode 100644 index 0000000..df1654b --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/CustomSSLSocketFactory.java @@ -0,0 +1,81 @@ +package kz.com.aman.kassa.bank; + +import org.apache.http.conn.scheme.LayeredSocketFactory; +import org.apache.http.params.HttpConnectionParams; +import org.apache.http.params.HttpParams; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.security.KeyStore; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.TrustManager; + +public class CustomSSLSocketFactory implements LayeredSocketFactory { + private SSLContext sslcontext = null; + private KeyStore keyStore = null; + + public CustomSSLSocketFactory() { + } + + public CustomSSLSocketFactory(KeyStore keyStore) { + this.keyStore = keyStore; + } + + private SSLContext createEasySSLContext() throws IOException { + try { + SSLContext context = SSLContext.getInstance("TLS"); + context.init(null, new TrustManager[] { new CustomTrustManager(keyStore) }, null); + return context; + } catch (Exception e) { + throw new IOException(e.getMessage()); + } + } + + private SSLContext getSSLContext() throws IOException { + if (this.sslcontext == null) { + this.sslcontext = createEasySSLContext(); + } + return this.sslcontext; + } + + public Socket connectSocket(Socket sock, String host, int port, + InetAddress localAddress, int localPort, HttpParams params) + throws IOException { + int connTimeout = HttpConnectionParams.getConnectionTimeout(params); + int soTimeout = HttpConnectionParams.getSoTimeout(params); + + InetSocketAddress remoteAddress = new InetSocketAddress(host, port); + SSLSocket sslSocket = (SSLSocket) ((sock != null) ? sock : createSocket()); + + if ((localAddress != null) || (localPort > 0)) { + // we need to bind explicitly + if (localPort < 0) { + localPort = 0; // indicates "any" + } + InetSocketAddress isa = new InetSocketAddress(localAddress, + localPort); + sslSocket.bind(isa); + } + + sslSocket.connect(remoteAddress, connTimeout); + sslSocket.setSoTimeout(soTimeout); + return sslSocket; + } + + public Socket createSocket() throws IOException { + return getSSLContext().getSocketFactory().createSocket(); + } + + public boolean isSecure(Socket socket) throws IllegalArgumentException { + return true; + } + + public Socket createSocket(Socket socket, String host, int port, + boolean autoClose) throws IOException { + return getSSLContext().getSocketFactory().createSocket(socket, host, port, autoClose); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/CustomTrustManager.java b/android/app/src/main/java/kz/com/aman/kassa/bank/CustomTrustManager.java new file mode 100644 index 0000000..e419d65 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/CustomTrustManager.java @@ -0,0 +1,40 @@ +package kz.com.aman.kassa.bank; + +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509TrustManager; + +public class CustomTrustManager implements X509TrustManager { + private X509TrustManager standardTrustManager; + + public CustomTrustManager(KeyStore keystore) throws NoSuchAlgorithmException, KeyStoreException { + super(); + TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + factory.init(keystore); + TrustManager[] trustManagers = factory.getTrustManagers(); + if (trustManagers.length == 0) { + throw new NoSuchAlgorithmException("no trust manager found"); + } + standardTrustManager = (X509TrustManager)trustManagers[0]; + } + + public void checkClientTrusted(X509Certificate[] certificates, String authType) throws CertificateException { + standardTrustManager.checkClientTrusted(certificates, authType); + } + + public void checkServerTrusted(X509Certificate[] certificates, String authType) throws CertificateException { + if ((certificates != null) && (certificates.length == 1)) { + certificates[0].checkValidity(); + } + } + + public X509Certificate[] getAcceptedIssuers() { + return this.standardTrustManager.getAcceptedIssuers(); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/DataCreatorUtils.java b/android/app/src/main/java/kz/com/aman/kassa/bank/DataCreatorUtils.java new file mode 100644 index 0000000..59b1f88 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/DataCreatorUtils.java @@ -0,0 +1,144 @@ +package kz.com.aman.kassa.bank; + +import java.util.Calendar; +import java.util.Date; + +import ru.m4bank.mpos.service.commons.Lists; +import ru.m4bank.mpos.service.data.dynamic.objects.CurrencyEnum; +import ru.m4bank.mpos.service.data.dynamic.objects.ExternalVerificationType; +import ru.m4bank.mpos.service.data.dynamic.objects.GoodsData; +import ru.m4bank.mpos.service.data.dynamic.objects.ProductsAndTransactionData; +import ru.m4bank.mpos.service.data.dynamic.objects.TransactionStatus; +import ru.m4bank.mpos.service.data.dynamic.objects.printer.enums.AccountingSubject; +import ru.m4bank.mpos.service.data.dynamic.objects.printer.enums.TaxRate; +import ru.m4bank.mpos.service.data.dynamic.objects.printer.enums.TaxSystem; +import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.CardTransTypeConv; +import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.TransactionTypeConv; +import ru.m4bank.mpos.service.hardware.printer.dto.data.FiscalPrinterMerchantData; +import ru.m4bank.mpos.service.hardware.printer.dto.data.PrinterInformationCheck; +import ru.m4bank.mpos.service.hardware.printer.dto.data.TransactionSlipData; +import ru.m4bank.mpos.service.transactions.data.AccountingSign; +import ru.m4bank.mpos.service.transactions.data.CorrectionType; +import ru.m4bank.mpos.service.transactions.data.external.CurrencyAmount; +import ru.m4bank.mpos.service.transactions.data.external.ExternalCorrectionData; +import ru.m4bank.mpos.service.transactions.data.external.ExternalFiscalData; +import ru.m4bank.mpos.service.transactions.data.external.ExternalSlipData; +import ru.m4bank.mpos.service.transactions.data.external.ExternalStubData; + +public class DataCreatorUtils { + public static ExternalCorrectionData makeCorrectionData() { + Calendar date = Calendar.getInstance(); + date.set(2019, 3, 1); + return new ExternalCorrectionData.Builder() + .currencyAmount(makeCurrencyAmount()) + .calculationSign(AccountingSign.INCOMING) + .correctionType(CorrectionType.INDEPENDENTLY) + .taxRate(TaxRate.Tax_20) + .cash(true) + .docNumber("ПС345454") + .docDate(date) + .docDescription(" ") + .stubData(makeStubData()) + .build(); + } + + public static ExternalFiscalData makeFiscalData() { + return new ExternalFiscalData.Builder() + .cash(false) + .currency("643") + .phone("12345678") + .informationCheckData(makeInformationCheckData()) + .productsAndTransactionData(makeProductsAndTransactionData()) + .externalStubData(makeStubData()) + .transactionTypeConv(TransactionTypeConv.PAYMENT) + .build(); + } + + public static ExternalSlipData makeSlipData(boolean newCheck) { + return new ExternalSlipData.Builder() + .currencyAmount(makeCurrencyAmount()) + .cash(false) + .merchantData(makeMerchantData()) + .newCheck(newCheck) + .transactionData(makeTransactionData()) + .transactionType(TransactionTypeConv.PAYMENT) + .cashierName("Петров В.В.") + .build(); + } + + public static CurrencyAmount makeCurrencyAmount() { + return new CurrencyAmount.Builder().amount(10000).currencyCode(CurrencyEnum.RUS.getStringCurrency()).build(); + } + + public static FiscalPrinterMerchantData makeMerchantData() { + return new FiscalPrinterMerchantData.Builder() + .merchantAddress("улица Твардовского, Москва Россия") + .merchantId("1732056") + .merchantInn("123456489123") + .merchantName("Center of corporate technologies") + .build(); + } + + public static TransactionSlipData makeTransactionData() { + return new TransactionSlipData.Builder() + .applicationId("A40000100023056") + .authCode("447041") + .cardHolderName("IVANOV/I") + .currencyCode("643") + .hostResultCode("00") + .interaction(CardTransTypeConv.MAGNETIC_STRIPE) + .originalPan("************8888") + .pan("************8176") + .rrn("123456789") + .terminalNumber("00687879") + .terminalVerificationResults("00000") + .transactionDate(new Date()) + .transactionStatus(TransactionStatus.APPROVED) + .typeCard("Mastercard") + .typeVerification(ExternalVerificationType.PIN) + .phone("88008008008562") + .build(); + } + + public static ExternalStubData makeStubData() { + return new ExternalStubData.Builder() + .shiftNumber("0001") + .factoryNumberKKT("0000000000") + .registerNumberKKT("00000000000000000") + .fiscalDocNumber("2780") + .fiscalMemoryNumber("9999078900003063") + .fiscalSign("32323933373534383633") + .formOfTaxation("УСН") + .merchantData(makeMerchantData()) + .phone("12-12-12") + .productsAndTransactionData(makeProductsAndTransactionData()) + .build(); + } + + private static ProductsAndTransactionData makeProductsAndTransactionData() { + return new ProductsAndTransactionData( + Lists.newArrayList(new GoodsData.Builder() + .setOriginalPrice(1500L) + .setRealPrice(1400L) + .setName("Товар") + .setQuantity(1) + .setCode("1") + .setUnits("00") + .setExponent(2) + .setDiscount(100L) + .setTaxRate(TaxRate.Tax_10) + .setAccountingSubject(AccountingSubject.OTHER) + .build()), + 1400L, 100L, 1, CurrencyEnum.RUS, TaxSystem.Common); + } + + public static PrinterInformationCheck makeInformationCheckData() { + return new PrinterInformationCheck.Builder() + .setCheckNumber("00") + .setDocNumber("1") + .setPd("00") + .setDateAndTime(new Date()) + .setInn("7777777777") + .build(); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/DeviceTypeDefiner.java b/android/app/src/main/java/kz/com/aman/kassa/bank/DeviceTypeDefiner.java new file mode 100644 index 0000000..c21c059 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/DeviceTypeDefiner.java @@ -0,0 +1,29 @@ +package kz.com.aman.kassa.bank; + +import kz.com.aman.kassa.BuildConfig; +import ru.m4bank.mpos.service.commons.utils.VirtualDeviceUtils; +import ru.m4bank.mpos.service.data.dynamic.objects.DeviceType; + +public class DeviceTypeDefiner { + public DeviceType define() { + if (VirtualDeviceUtils.isDevice()) { + return DeviceType.SMART_POS; + } + + String[] supportedDevices = BuildConfig.SUPPORTED_DEVICES; + if (containsIgnoreCase(supportedDevices, "SoftPos")) { + return DeviceType.SOFT_POS; + } + + return DeviceType.PHONE; + } + + private boolean containsIgnoreCase(String[] array, String checkValue) { + for (String arrayValue : array) { + if (arrayValue.equalsIgnoreCase(checkValue)) { + return true; + } + } + return false; + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/EasyAlipayRefundCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/EasyAlipayRefundCallbackHandlerImpl.java new file mode 100644 index 0000000..322ade3 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/EasyAlipayRefundCallbackHandlerImpl.java @@ -0,0 +1,152 @@ +package kz.com.aman.kassa.bank; + +import android.app.AlertDialog; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.EasyAlipayRefundCallbackHandler; +import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler; +import ru.m4bank.mpos.service.data.FiscalStatusData; +import ru.m4bank.mpos.service.data.PrinterBaseData; +import ru.m4bank.mpos.service.data.PrinterErrorData; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.data.dynamic.objects.transaction.RefundType; +import ru.m4bank.mpos.service.hardware.error.ErrorHandler; +import ru.m4bank.mpos.service.result.PrinterResult; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.TransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus; +import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData; + +public class EasyAlipayRefundCallbackHandlerImpl implements EasyAlipayRefundCallbackHandler, GetTransactionsListCallbackHandler { + + private final M4BankActivity activity; + private Transaction transaction; + + public EasyAlipayRefundCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionInit() { + + } + + @Override + public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) { + activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) { + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction(); + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + activity.getClientInterface().getTransactionManager().sendTransactionUserData("signature", "phone", "email"); + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionCompleted() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onRefundDataRequested() { + activity.getClientInterface().getTransactionManager().setRefundData(transaction, transaction.getAmount(), RefundType.General); + } + + @Override + public void onTransactionsListReceived(List transactionList) { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose transaction"); + + Spinner transactionListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + transactionListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + transaction = (Transaction) transactionListSpinner.getSelectedItem(); + activity.getClientInterface().getTransactionManager().makeAlipayRefund(this); + dialog.dismiss(); + }); + + builder.setView(transactionListSpinner); + activity.runOnUiThread(() -> builder.create().show()); + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRequestedReportZ() { + + } + + @Override + public void onCompletedPrinting(PrinterResult printerErrorDataPrinterBaseDataPrinterResult) { + + } + + @Override + public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) { + + } + + @Override + public void onPrinterForRegistrationGettingCompleted() { + + } + + @Override + public void onNoBoundedPrinterFound() { + + } + + @Override + public void onPrinterToUseSelectionRequested(List printerList) { + + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/EasyCardReversalCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/EasyCardReversalCallbackHandlerImpl.java new file mode 100644 index 0000000..dbd8e1d --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/EasyCardReversalCallbackHandlerImpl.java @@ -0,0 +1,363 @@ +package kz.com.aman.kassa.bank; + +import android.app.AlertDialog; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.EasyReversalCardCallbackHandler; +import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler; +import ru.m4bank.mpos.service.commons.data.ResultType; +import ru.m4bank.mpos.service.data.FiscalStatusData; +import ru.m4bank.mpos.service.data.PrinterBaseData; +import ru.m4bank.mpos.service.data.PrinterErrorData; +import ru.m4bank.mpos.service.data.dynamic.objects.Reader; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.data.dynamic.objects.result.ResultCode; +import ru.m4bank.mpos.service.hardware.error.ErrorHandler; +import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.ApplicationIdConv; +import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.VirtualKeyboardStyleTypeConv; +import ru.m4bank.mpos.service.result.PrinterResult; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.MessageButtonData; +import ru.m4bank.mpos.service.transactions.data.TransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus; +import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData; +import ru.m4bank.mpos.service.transactions.dto.OnlineCardDataDto; +import timber.log.Timber; + +public class EasyCardReversalCallbackHandlerImpl implements EasyReversalCardCallbackHandler, GetTransactionsListCallbackHandler { + + private final M4BankActivity activity; + private Transaction transaction; + + public EasyCardReversalCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCardReaderForTransactionGettingCompleted() { + Timber.d("Reader has been received"); + } + + @Override + public void onNoBoundedDevicesFound() { + Timber.d("No bounded readers"); + } + + @Override + public void onConnectingProcessStarted(String deviceName) { + + } + + @Override + public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) { + if (reconnectAvailable) { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setMessage("Connection to cardreader has been lost, try to reconnect and repeat last operation?"); + builder.setCancelable(false); + builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().tryToReconnectAndRepeatLast()); + builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel()); + builder.create().show(); + }); + } + } + + @Override + public void onDeviceToConnectSelectionRequested(List deviceList) { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose device"); + + Spinner deviceListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, deviceList); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + deviceListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface() + .getTransactionManager() + .selectCardReader(deviceListSpinner.getSelectedItem().toString()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + builder.create().show(); + }); + } + + @Override + public void onWorkFlowDataRequested() { + + } + + @Override + public void onReceiveCardData(OnlineCardDataDto data, boolean shouldConfirmBeManuallyCalled) { + if (shouldConfirmBeManuallyCalled) { + activity.getClientInterface().getTransactionManager().processOnlineTransaction(false); + } + } + + @Override + public void onRequiredReversal(String description, ResultCode resultCode) { + activity.runOnUiThread(() -> Toast.makeText(activity, "onRequiredReversal", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onRequiredApplicationSelection(List list) { + + } + + @Override + public void onPrinterForRegistrationGettingCompleted() { + + } + + @Override + public void onNoBoundedPrinterFound() { + + } + + @Override + public void onTransactionDetailsReceived(Transaction transaction) { + activity.runOnUiThread(() -> Toast.makeText(activity, "onTransactionDetailsReceived", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onSuccessStatusTransaction(Transaction transaction) { + activity.runOnUiThread(() -> Toast.makeText(activity, "onSuccessStatusTransaction", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onErrorStatusTransaction() { + activity.runOnUiThread(() -> Toast.makeText(activity, "onErrorStatusTransaction", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onRequestedReportZ() { + + } + + @Override + public void onCompletedPrinting(PrinterResult printerErrorDataPrinterBaseDataPrinterResult) { + + } + + @Override + public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) { + + } + + @Override + public void onReconciliationRequiredToProcess() { + Timber.d("Reconciliation required!!!"); + activity.getClientInterface().getTransactionManager().makeReconciliationDuringTransaction(); + } + + @Override + public void onReconciliationCompleted(Result result) { + Timber.d("Reconciliation completed!!!"); + if (result.getResultType() == ResultType.SUCCESSFUL) { + activity.getClientInterface().getTransactionManager().continueTransactionAfterReconciliation(); + } else { + activity.runOnUiThread(() -> Toast.makeText(activity, "Reconciliation failed " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_LONG) + .show()); + } + } + + @Override + public void onRepeat(int attemptNumber) { + + } + + @Override + public void onTransactionAmountRequested() { + + } + + @Override + public void onTransactionDataRequested() { + + } + + @Override + public void onDeviceToUseSelectionRequested(List deviceList) { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose device"); + + Spinner deviceListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(deviceList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + deviceListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface() + .getTransactionManager() + .setCardReaderToUse((Reader) deviceListSpinner.getSelectedItem()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + activity.runOnUiThread(() -> builder.create().show()); + }); + } + + @Override + public void onPrinterToUseSelectionRequested(List printerList) { + + } + + @Override + public void onTransactionInit() { + + } + + @Override + public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) { + activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + + } + + @Override + public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) { + if (errorHandler.getCode() != null && errorHandler.getDescription() != null) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Error Code: " + errorHandler.getCode() + " error Description: " + + errorHandler.getDescription(), Toast.LENGTH_LONG) + .show()); + } else { + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getServerCode() + " " + + errorHandler.getServerDescription(), Toast.LENGTH_LONG) + .show()); + } + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction(); + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + activity.runOnUiThread(() -> Toast.makeText(activity, "onTransactionDataReceivedError", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionCompleted() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onReconnectNeededToProcess() { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setMessage("Connection to cardreader has been lost, try to reconnect and continue?"); + builder.setCancelable(false); + builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().getTransactionManager().tryToReconnectToCardReader()); + builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel()); + builder.create().show(); + }); + } + + @Override + public void onWrongTerminal() { + + } + + @Override + public void onSelectTransaction() { + activity.getClientInterface().getTransactionManager().selectTransaction(transaction); + } + + @Override + public void onTransactionsListReceived(List transactionList) { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose transaction"); + + Spinner transactionListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + transactionListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + transaction = (Transaction) transactionListSpinner.getSelectedItem(); + activity.getClientInterface().getTransactionManager().makeCardReversal(this); + dialog.dismiss(); + }); + + builder.setView(transactionListSpinner); + activity.runOnUiThread(() -> builder.create().show()); + } + + @Override + public void onTransactionSelectionRequested(List transactionList) { + + } + + @Override + public void onActivityUpdateUiThread() { + + } + + @Override + public void onCreatePinPadButtons() { + + } + + @Override + public void onShowPinPadKeyBoard(MessageButtonData messageButtonData) { + + } + + @Override + public void onUpdateElementPin(int i) { + + } + + @Override + public void onCloseKeyboard() { + + } + + @Override + public void onRequiredAdditionalVirtualKeyboardSettings(VirtualKeyboardStyleTypeConv virtualKeyboardStyleTypeConv) { + activity.showSelectStyleDialog(additionalData -> + activity.getClientInterface().getTransactionManager().addVirtualPinKeyboardData(additionalData)); + } +} \ No newline at end of file diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/EasyCashRefundCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/EasyCashRefundCallbackHandlerImpl.java new file mode 100644 index 0000000..e06a9d2 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/EasyCashRefundCallbackHandlerImpl.java @@ -0,0 +1,152 @@ +package kz.com.aman.kassa.bank; + +import android.app.AlertDialog; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.EasyCashRefundCallbackHandler; +import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler; +import ru.m4bank.mpos.service.data.FiscalStatusData; +import ru.m4bank.mpos.service.data.PrinterBaseData; +import ru.m4bank.mpos.service.data.PrinterErrorData; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.data.dynamic.objects.transaction.RefundType; +import ru.m4bank.mpos.service.hardware.error.ErrorHandler; +import ru.m4bank.mpos.service.result.PrinterResult; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.TransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus; +import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData; + +public class EasyCashRefundCallbackHandlerImpl implements EasyCashRefundCallbackHandler, GetTransactionsListCallbackHandler { + + private final M4BankActivity activity; + private Transaction transaction; + + public EasyCashRefundCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionInit() { + activity.getClientInterface().getTransactionManager().processOnlineTransaction(false); + } + + @Override + public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) { + activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) { + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction(); + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + activity.getClientInterface().getTransactionManager().sendTransactionUserData("signature", "phone", "email"); + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionCompleted() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onRefundDataRequested() { + activity.getClientInterface().getTransactionManager().setRefundData(transaction, transaction.getAmount(), RefundType.General); + } + + @Override + public void onTransactionsListReceived(List transactionList) { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose transaction"); + + Spinner transactionListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + transactionListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + transaction = (Transaction) transactionListSpinner.getSelectedItem(); + activity.getClientInterface().getTransactionManager().makeCashRefund(this); + dialog.dismiss(); + }); + + builder.setView(transactionListSpinner); + activity.runOnUiThread(() -> builder.create().show()); + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRequestedReportZ() { + + } + + @Override + public void onCompletedPrinting(PrinterResult printerErrorDataPrinterBaseDataPrinterResult) { + + } + + @Override + public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) { + + } + + @Override + public void onPrinterForRegistrationGettingCompleted() { + + } + + @Override + public void onNoBoundedPrinterFound() { + + } + + @Override + public void onPrinterToUseSelectionRequested(List printerList) { + + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/EasyEcomRefundCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/EasyEcomRefundCallbackHandlerImpl.java new file mode 100644 index 0000000..aa6513e --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/EasyEcomRefundCallbackHandlerImpl.java @@ -0,0 +1,157 @@ +package kz.com.aman.kassa.bank; + +import android.app.AlertDialog; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.EasyEcomRefundCallbackHandler; +import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler; +import ru.m4bank.mpos.service.data.FiscalStatusData; +import ru.m4bank.mpos.service.data.PrinterBaseData; +import ru.m4bank.mpos.service.data.PrinterErrorData; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.data.dynamic.objects.transaction.RefundType; +import ru.m4bank.mpos.service.hardware.error.ErrorHandler; +import ru.m4bank.mpos.service.result.PrinterResult; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.TransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus; +import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData; + +public class EasyEcomRefundCallbackHandlerImpl implements EasyEcomRefundCallbackHandler, GetTransactionsListCallbackHandler { + + private final M4BankActivity activity; + private Transaction transaction; + + public EasyEcomRefundCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionInit() { + + } + + @Override + public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) { + activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) { + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction(); + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + activity.getClientInterface().getTransactionManager().sendTransactionUserData("signature", "phone", "email"); + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionCompleted() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onRefundDataRequested() { + activity.getClientInterface().getTransactionManager().setRefundData(transaction, transaction.getAmount(), RefundType.General); + } + + @Override + public void onTransactionsListReceived(List transactionList) { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose transaction"); + + Spinner transactionListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + transactionListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + transaction = (Transaction) transactionListSpinner.getSelectedItem(); + activity.getClientInterface().getTransactionManager().makeEcomRefund(this); + dialog.dismiss(); + }); + + builder.setView(transactionListSpinner); + activity.runOnUiThread(() -> builder.create().show()); + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRequestedReportZ() { + + } + + @Override + public void onCompletedPrinting(PrinterResult printerErrorDataPrinterBaseDataPrinterResult) { + + } + + @Override + public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) { + + } + + @Override + public void onPrinterForRegistrationGettingCompleted() { + + } + + @Override + public void onNoBoundedPrinterFound() { + + } + + @Override + public void onPrinterToUseSelectionRequested(List printerList) { + + } + + @Override + public void onPreviewTransactionDataReceived(TransactionData transactionData) { + + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/EasyReversalCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/EasyReversalCallbackHandlerImpl.java new file mode 100644 index 0000000..5adceff --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/EasyReversalCallbackHandlerImpl.java @@ -0,0 +1,176 @@ +package kz.com.aman.kassa.bank; + +import android.app.AlertDialog; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler; +import ru.m4bank.mpos.library.external.transactions.ReversalCallbackHandler; +import ru.m4bank.mpos.service.data.FiscalStatusData; +import ru.m4bank.mpos.service.data.PrinterBaseData; +import ru.m4bank.mpos.service.data.PrinterErrorData; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.hardware.error.ErrorHandler; +import ru.m4bank.mpos.service.result.PrinterResult; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.TransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus; +import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData; + +public class EasyReversalCallbackHandlerImpl implements ReversalCallbackHandler, GetTransactionsListCallbackHandler { + + private final M4BankActivity activity; + private Transaction transaction; + + public EasyReversalCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onTransactionSelectionRequested(List transactionList) { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose transaction"); + + Spinner transactionListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + transactionListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface().getTransactionManager().selectTransaction((Transaction) transactionListSpinner.getSelectedItem()); + dialog.dismiss(); + }); + + builder.setView(transactionListSpinner); + activity.runOnUiThread(() -> builder.create().show()); + } + + @Override + public void onCardShortPanRequested() { + activity.getClientInterface().getTransactionManager().setCardShortPan("0069", 20, 0); + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionInit() { + activity.getClientInterface().getTransactionManager().processOnlineTransaction(false); + } + + @Override + public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) { + activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) { + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + //activity.getClientInterface().getTransactionManager().sendTransactionUserData(null, "phone", "email"); + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction reversal complete", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionCompleted() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onSelectTransaction() { + activity.getClientInterface().getTransactionManager().selectTransaction(transaction); + } + + @Override + public void onTransactionsListReceived(List transactionList) { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose transaction"); + + Spinner transactionListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + transactionListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + transaction = (Transaction) transactionListSpinner.getSelectedItem(); + activity.getClientInterface().getTransactionManager().makeEasyReversal(this); + dialog.dismiss(); + }); + + builder.setView(transactionListSpinner); + activity.runOnUiThread(() -> builder.create().show()); + } + + @Override + public void onRequestedReportZ() { + + } + + @Override + public void onCompletedPrinting(PrinterResult printerErrorDataPrinterBaseDataPrinterResult) { + + } + + @Override + public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) { + + } + + @Override + public void onPrinterForRegistrationGettingCompleted() { + + } + + @Override + public void onNoBoundedPrinterFound() { + + } + + @Override + public void onPrinterToUseSelectionRequested(List list) { + + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/EasyReversalSavedOperationCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/EasyReversalSavedOperationCallbackHandlerImpl.java new file mode 100644 index 0000000..406738b --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/EasyReversalSavedOperationCallbackHandlerImpl.java @@ -0,0 +1,136 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; + +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.EasyReversalSavedOperationCallbackHandler; +import ru.m4bank.mpos.service.data.FiscalStatusData; +import ru.m4bank.mpos.service.hardware.error.ErrorHandler; +import ru.m4bank.mpos.service.result.PrinterResult; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.TransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus; +import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData; + +public class EasyReversalSavedOperationCallbackHandlerImpl implements EasyReversalSavedOperationCallbackHandler { + private M4BankActivity activity; + + public EasyReversalSavedOperationCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onTransactionIsNotReversible() { + showMessage("onTransactionIsNotReversible"); + } + + @Override + public void onSelectTransaction() { + showMessage("onSelectTransaction"); + } + + @Override + public void onCompletedPrinting(PrinterResult result) { + showMessage("onCompletedPrinting"); + } + + @Override + public void onStatusFiscalModule(FiscalStatusData fiscalStatusDatat) { + showMessage("onStatusFiscalModule"); + } + + @Override + public void onTransactionSelectionRequested(List list) { + showMessage("onTransactionSelectionRequested"); + } + + @Override + public void onCardShortPanRequested() { + showMessage("onCardShortPanRequested"); + } + + @Override + public void notAuthorized() { + showMessage("notAuthorized"); + } + + @Override + public void onCompleted(Result result) { + showMessage("onCompleted"); + } + + @Override + public void onWrongApiCalled() { + showMessage("onWrongApiCalled"); + } + + @Override + public void onRequestedReportZ() { + showMessage("onRequestedReportZ"); + } + + @Override + public void onTransactionInit() { + showMessage("onTransactionInit"); + } + + @Override + public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) { + showMessage("onTransactionExecutionStatusChanged: "); + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + showMessage("onUserInformationRequested"); + } + + @Override + public void onError(ErrorHandler errorHandler, TransactionErrorData errorData) { + showMessage("onError"); + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + showMessage("onErrorWithPossibilityToRetry"); + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + showMessage("onTransactionDataReceivedError"); + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + showMessage("onTransactionDataReceived"); + } + + @Override + public void onTransactionCompleted() { + showMessage("onTransactionCompleted"); + } + + @Override + public void onRepeat(int attemptNumber) { + showMessage("onRepeat"); + } + + @Override + public void onPrinterForRegistrationGettingCompleted() { + showMessage("onPrinterForRegistrationGettingCompleted"); + } + + @Override + public void onNoBoundedPrinterFound() { + showMessage("onNoBoundedPrinterFound"); + } + + @Override + public void onPrinterToUseSelectionRequested(List printerList) { + showMessage("onPrinterToUseSelectionRequested"); + } + + private void showMessage(String message) { + activity.runOnUiThread(() -> Toast.makeText(activity, message, Toast.LENGTH_LONG).show()); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/EcomPaymentCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/EcomPaymentCallbackHandlerImpl.java new file mode 100644 index 0000000..b5a853c --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/EcomPaymentCallbackHandlerImpl.java @@ -0,0 +1,173 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; + +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.EcomPaymentCallbackHandler; +import ru.m4bank.mpos.service.data.FiscalStatusData; +import ru.m4bank.mpos.service.data.dynamic.objects.AdditionalTransactionData; +import ru.m4bank.mpos.service.data.dynamic.objects.EmailStatus; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.hardware.error.ErrorHandler; +import ru.m4bank.mpos.service.result.PrinterResult; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.TransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus; +import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData; +import timber.log.Timber; + +public class EcomPaymentCallbackHandlerImpl implements EcomPaymentCallbackHandler { + + private final M4BankActivity activity; + + public EcomPaymentCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onWorkFlowDataRequested() { + Timber.d("WorkFlow requested"); + } + + @Override + public void onTransactionAmountRequested() { + activity.getClientInterface().getTransactionManager().setTransactionAmount(activity.getAmount()); + } + + @Override + public void onTransactionDataRequested() { + activity.getClientInterface().getTransactionManager().setAdditionalTransactionData(new AdditionalTransactionData.Builder(null).build()); + } + + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionInit() { + activity.getClientInterface().getTransactionManager().processOnlineTransaction(false); + } + + @Override + public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) { + + } + + @Override + public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) { + + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction(); + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + activity.getClientInterface() + .getTransactionManager() + .sendTransactionUserData("signature", "phone", "email"); + } + + @Override + public void onFormUrlRequested(String formUrl) { + + activity.getClientInterface() + .getTransactionManager() + .sendEcomEmail("qrCode", null, "ap@m4bank.com", EmailStatus.SEND); + + activity.runOnUiThread(() -> Toast.makeText(activity, "onFormUrlRequested " + formUrl, Toast.LENGTH_LONG) + .show()); + + } + + @Override + public void onPreviewTransactionDataReceived(TransactionData data) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Preview Transaction data has been received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionCompleted() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionDetailsReceived(Transaction transaction) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction details received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onSuccessStatusTransaction(Transaction transaction) { + + } + + @Override + public void onErrorStatusTransaction() { + + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRequestedReportZ() { + + } + + @Override + public void onCompletedPrinting(PrinterResult printerResult) { + + } + + @Override + public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) { + + } + + @Override + public void onPrinterForRegistrationGettingCompleted() { + + } + + @Override + public void onNoBoundedPrinterFound() { + + } + + @Override + public void onPrinterToUseSelectionRequested(List printerList) { + + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/GetCardReaderInformationCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/GetCardReaderInformationCallbackHandlerImpl.java new file mode 100644 index 0000000..60aff3f --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/GetCardReaderInformationCallbackHandlerImpl.java @@ -0,0 +1,64 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; + +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.GetCardReaderInformationCallbackHandler; +import ru.m4bank.mpos.service.data.dynamic.objects.Reader; +import ru.m4bank.mpos.service.result.GetCardReaderInformationResult; +import timber.log.Timber; + +public class GetCardReaderInformationCallbackHandlerImpl implements GetCardReaderInformationCallbackHandler { + private final M4BankActivity activity; + + public GetCardReaderInformationCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onCardReaderForTransactionGettingCompleted() { + + } + + @Override + public void onNoBoundedDevicesFound() { + + } + + @Override + public void onConnectingProcessStarted(String deviceName) { + + } + + @Override + public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) { + + } + + @Override + public void onDeviceToUseSelectionRequested(List deviceList) { + + } + + @Override + public void notAuthorized() { + + } + + @Override + public void onDeviceToConnectSelectionRequested(List deviceList) { + + } + + @Override + public void onCompleted(GetCardReaderInformationResult result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.toString(), Toast.LENGTH_LONG).show()); + Timber.d("GetCardReaderInformationResult : " + result); + } + + @Override + public void onWrongApiCalled() { + + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/GetLicenseCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/GetLicenseCallbackHandlerImpl.java new file mode 100644 index 0000000..a828867 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/GetLicenseCallbackHandlerImpl.java @@ -0,0 +1,34 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; + +import ru.m4bank.mpos.library.external.configuration.GetLicenseCallbackHandler; +import ru.m4bank.mpos.service.result.Result; + +public class GetLicenseCallbackHandlerImpl implements GetLicenseCallbackHandler { + private final M4BankActivity activity; + + public GetLicenseCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onLicenseReceived(String license) { + activity.runOnUiThread(() -> Toast.makeText(activity, license, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/GetMerchantUsersCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/GetMerchantUsersCallbackHandlerImpl.java new file mode 100644 index 0000000..8945a3f --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/GetMerchantUsersCallbackHandlerImpl.java @@ -0,0 +1,38 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; + +import java.util.List; + +import ru.m4bank.mpos.library.external.authorization.GetMerchantUsersCallbackHandler; +import ru.m4bank.mpos.service.data.dynamic.objects.MerchantUser; +import ru.m4bank.mpos.service.result.Result; + +public class GetMerchantUsersCallbackHandlerImpl implements GetMerchantUsersCallbackHandler { + private final M4BankActivity activity; + + public GetMerchantUsersCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onListOfUsersRequested(List userList) { + activity.runOnUiThread(() -> Toast.makeText(activity, "loaded list of merchant users", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/GetTransactionDetailsCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/GetTransactionDetailsCallbackHandlerImpl.java new file mode 100644 index 0000000..6360623 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/GetTransactionDetailsCallbackHandlerImpl.java @@ -0,0 +1,84 @@ +package kz.com.aman.kassa.bank; + +import android.app.AlertDialog; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.GetTransactionDetailsCallbackHandler; +import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.result.Result; + +class GetTransactionDetailsCallbackHandlerImpl implements GetTransactionDetailsCallbackHandler, GetTransactionsListCallbackHandler { + private final M4BankActivity activity; + + GetTransactionDetailsCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onTransactionDetailsReceived(Transaction transaction) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction details received: " + transaction, Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onSuccessStatusTransaction(Transaction transaction) { + + } + + @Override + public void onErrorStatusTransaction() { + + } + + @Override + public void onTransactionsListReceived(List transactionList) { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose transaction"); + + Spinner transactionListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + transactionListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + Transaction transaction = (Transaction) transactionListSpinner.getSelectedItem(); + activity.getClientInterface() + .getTransactionManager() + .getTransactionDetails(this, transaction.getOperationalDayNumber(), transaction + .getTransactionNumber(), transaction.getMobileTerminalId()); + dialog.dismiss(); + }); + + builder.setView(transactionListSpinner); + builder.create().show(); + }); + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/GetTransactionListForRefundCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/GetTransactionListForRefundCallbackHandlerImpl.java new file mode 100644 index 0000000..2547e82 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/GetTransactionListForRefundCallbackHandlerImpl.java @@ -0,0 +1,62 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; + +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.GetTransactionDetailsCallbackHandler; +import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.result.Result; + +class GetTransactionListForRefundCallbackHandlerImpl implements GetTransactionDetailsCallbackHandler, GetTransactionsListCallbackHandler { + private final M4BankActivity activity; + private final CardRefundCallbackHandlerImpl cardRefundCallbackHandler; + + GetTransactionListForRefundCallbackHandlerImpl(M4BankActivity activity, CardRefundCallbackHandlerImpl cardRefundCallbackHandler) { + this.cardRefundCallbackHandler = cardRefundCallbackHandler; + this.activity = activity; + } + + @Override + public void onTransactionDetailsReceived(Transaction transaction) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction details received: " + transaction, Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onSuccessStatusTransaction(Transaction transaction) { + + } + + @Override + public void onErrorStatusTransaction() { + + } + + @Override + public void onTransactionsListReceived(List transactionList) { + cardRefundCallbackHandler.onTransactionsListReceived(transactionList); + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/LoadTerminalKeysCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/LoadTerminalKeysCallbackHandlerImpl.java new file mode 100644 index 0000000..01098c6 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/LoadTerminalKeysCallbackHandlerImpl.java @@ -0,0 +1,133 @@ +package kz.com.aman.kassa.bank; + + +import android.app.AlertDialog; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.LoadTerminalKeysCallbackHandler; +import ru.m4bank.mpos.service.data.dynamic.objects.Reader; +import ru.m4bank.mpos.service.data.dynamic.objects.result.ResultCode; +import ru.m4bank.mpos.service.hardware.network.external.TerminalKeyType; +import ru.m4bank.mpos.service.result.Result; +import timber.log.Timber; + +class LoadTerminalKeysCallbackHandlerImpl implements LoadTerminalKeysCallbackHandler { + + private final M4BankActivity activity; + + public LoadTerminalKeysCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void notAuthorized() { + Timber.d("Not authorized"); + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onKeyLoad(TerminalKeyType terminalKeyType, String description, ResultCode resultCode) { + Timber.d("key loaded".concat(terminalKeyType.name())); + } + + @Override + public void onKeyReceived(TerminalKeyType terminalKeyType, String description, ResultCode resultCode) { + Timber.d("key loaded".concat(terminalKeyType.name())); + } + + @Override + public void onError(String description, ResultCode resultCode) { + Timber.d("key loaded" + " onError"); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCardReaderForTransactionGettingCompleted() { + Timber.d("Reader has been received"); + } + + @Override + public void onDeviceToConnectSelectionRequested(List deviceList) { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose device"); + + Spinner deviceListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, deviceList); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + deviceListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface() + .getCardReaderManager() + .selectCardReader(deviceListSpinner.getSelectedItem().toString()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + builder.create().show(); + }); + } + + @Override + public void onDeviceToUseSelectionRequested(List deviceList) { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose device"); + + Spinner deviceListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(deviceList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + deviceListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface() + .getCardReaderManager() + .setCardReaderToUse((Reader) deviceListSpinner.getSelectedItem()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + builder.create().show(); + }); + } + + @Override + public void onNoBoundedDevicesFound() { + Timber.d("No bounded readers"); + } + + @Override + public void onConnectingProcessStarted(String deviceName) { + Timber.d("onConnectingProcessStarted"); + } + + @Override + public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) { + if (reconnectAvailable) { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setMessage("Connection to cardreader has been lost, try to reconnect and repeat last operation?"); + builder.setCancelable(false); + builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().tryToReconnectAndRepeatLast()); + builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel()); + builder.create().show(); + }); + } + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/LogOutCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/LogOutCallbackHandlerImpl.java new file mode 100644 index 0000000..17ea1cc --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/LogOutCallbackHandlerImpl.java @@ -0,0 +1,29 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; + +import ru.m4bank.mpos.library.external.authorization.LogOutCallbackHandler; +import ru.m4bank.mpos.service.result.Result; + +public class LogOutCallbackHandlerImpl implements LogOutCallbackHandler { + private final M4BankActivity activity; + + public LogOutCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/PrintingCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/PrintingCallbackHandlerImpl.java new file mode 100644 index 0000000..ecd9f07 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/PrintingCallbackHandlerImpl.java @@ -0,0 +1,77 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; + +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.PrintingCallbackHandler; +import ru.m4bank.mpos.service.data.FiscalStatusData; +import ru.m4bank.mpos.service.data.PrinterBaseData; +import ru.m4bank.mpos.service.data.PrinterErrorData; +import ru.m4bank.mpos.service.hardware.printer.dto.data.PrintingType; +import ru.m4bank.mpos.service.result.PrinterResult; +import ru.m4bank.mpos.service.result.Result; +import timber.log.Timber; + +public class PrintingCallbackHandlerImpl implements PrintingCallbackHandler> { + + private final M4BankActivity activity; + + public PrintingCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onRequestedReportZ() { + Timber.i("onRequestedReportZ"); + activity.getClientInterface().getPrinterManager().printReport(this, PrintingType.Z_REPORT); + } + + @Override + public void onCompletedPrinting(PrinterResult printerResult) { + Timber.i("onCompletedPrinting = " + printerResult); + activity.runOnUiThread(() -> Toast.makeText(activity, "onCompletedPrinting = " + printerResult, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) { + + } + + @Override + public void onPrinterForRegistrationGettingCompleted() { + Timber.i("onPrinterForRegistrationGettingCompleted"); + activity.runOnUiThread(() -> Toast.makeText(activity, "Saved printer - " + activity.getClientInterface().getPrinterManager().isSavedPrinterName(), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onNoBoundedPrinterFound() { + Timber.i("onNoBoundedPrinterFound"); + } + + @Override + public void onPrinterToUseSelectionRequested(List printerList) { + Timber.i("printerList = " + printerList); + activity.getClientInterface().getPrinterManager().selectPrinter(printerList.get(0).toString()); + } + + @Override + public void onCompleted(Result result) { + Timber.i("onCompleted = " + result.getResultType().toString()); + } + + @Override + public void onWrongApiCalled() { + Timber.i("onWrongApiCalled"); + } + + @Override + public void onRepeat(int attemptNumber) { + Timber.i("onRepeat"); + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/ReconciliationPrinterDataBuilder.java b/android/app/src/main/java/kz/com/aman/kassa/bank/ReconciliationPrinterDataBuilder.java new file mode 100644 index 0000000..3663741 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/ReconciliationPrinterDataBuilder.java @@ -0,0 +1,73 @@ +package kz.com.aman.kassa.bank; + +import java.util.ArrayList; +import java.util.List; +import ru.m4bank.mpos.service.data.dynamic.objects.CurrencyEnum; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.hardware.printer.dto.data.ReconciliationData; +import ru.m4bank.mpos.service.hardware.printer.dto.data.ReconciliationOperationData; +import ru.m4bank.mpos.service.hardware.printer.dto.data.TransactionType; +import ru.m4bank.mpos.service.transactions.data.TransactionMoneyInteractionType; + + +public class ReconciliationPrinterDataBuilder { + + public ReconciliationData build(List transactionList, boolean closeDay) { + ArrayList reconciliationOperationDataList = new ArrayList(); + if (transactionList == null) return null; + for (Transaction transaction : transactionList) { + if (!isErrorStatus(transaction)) { + reconciliationOperationDataList.add(buildOneElement(transaction)); + } + } + return new ReconciliationData(reconciliationOperationDataList, closeDay); + } + + private ReconciliationOperationData buildOneElement(Transaction transaction) { + return new ReconciliationOperationData.Builder( + transaction.getAmount(), + transaction.getMaskedPan(), + CurrencyEnum.getCurrencyEnum(Integer.parseInt(transaction.getCurrency3DigitCode())), + getPrinterOperationType(transaction.getTransactionType()), + transaction.getExternalTerminalId(), transaction.getPiDataType().getTypePIData().equals(TransactionMoneyInteractionType.CASH.toString())) + .cardType(transaction.getCardType()) + .date(transaction.getTransactionDate()) + .checkId(transaction.getCheck()) + .externalMerchantId(transaction.getExternalMerchantId()) + .externalMerchantName(transaction.getExternalMerchantName()) + .externalMerchantAdress(transaction.getExternalMerchantAddress()) + .authorizationCode(transaction.getAuthorizationCode()) + .refNumber(transaction.getRrn()) + .time(transaction.getTransactionTime()) + .build(); + } + + private TransactionType getPrinterOperationType(String type) { + if (type == null) return null; + switch (type.toUpperCase()) { + case "PAYMENT": + return TransactionType.INCOMING; + case "REFUND": + return TransactionType.INCOMING_REFUND; + case "REVERSAL": + return TransactionType.REVERSAL; + } + return null; + } + + public static boolean isErrorStatus(Transaction transaction) { + if (transaction == null || transaction.getOperationStatus() == null) { + return true; + } + + switch (transaction.getOperationStatus()) { + case COMPLETED: + case REVERSED: + case READER_TIMEOUT: + return false; + + default: + return true; + } + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/ResendReceiptCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/ResendReceiptCallbackHandlerImpl.java new file mode 100644 index 0000000..83990c3 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/ResendReceiptCallbackHandlerImpl.java @@ -0,0 +1,64 @@ +package kz.com.aman.kassa.bank; + +import android.app.AlertDialog; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler; +import ru.m4bank.mpos.library.external.transactions.ResendReceiptCallbackHandler; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.result.Result; + +class ResendReceiptCallbackHandlerImpl implements ResendReceiptCallbackHandler, + GetTransactionsListCallbackHandler { + private final M4BankActivity activity; + + ResendReceiptCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionsListReceived(List transactionList) { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose transaction"); + + Spinner transactionListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + transactionListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + Transaction transaction = (Transaction) transactionListSpinner.getSelectedItem(); + activity.getClientInterface().getTransactionManager().resendReceipt(this, transaction, "vsa@centercorptech.net", null); + dialog.dismiss(); + }); + + builder.setView(transactionListSpinner); + activity.runOnUiThread(() -> builder.create().show()); + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/ReversalCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/ReversalCallbackHandlerImpl.java new file mode 100644 index 0000000..adee544 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/ReversalCallbackHandlerImpl.java @@ -0,0 +1,153 @@ +package kz.com.aman.kassa.bank; + +import android.app.AlertDialog; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.ReversalCallbackHandler; +import ru.m4bank.mpos.service.data.FiscalStatusData; +import ru.m4bank.mpos.service.data.PrinterBaseData; +import ru.m4bank.mpos.service.data.PrinterErrorData; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.hardware.error.ErrorHandler; +import ru.m4bank.mpos.service.result.PrinterResult; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.TransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus; +import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData; + +public class ReversalCallbackHandlerImpl implements ReversalCallbackHandler { + + private final M4BankActivity activity; + + public ReversalCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onTransactionSelectionRequested(List transactionList) { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose transaction"); + + Spinner transactionListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(transactionList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + transactionListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface().getTransactionManager().selectTransaction((Transaction) transactionListSpinner.getSelectedItem()); + dialog.dismiss(); + }); + + builder.setView(transactionListSpinner); + activity.runOnUiThread(() -> builder.create().show()); + } + + @Override + public void onCardShortPanRequested() { + activity.getClientInterface().getTransactionManager().setCardShortPan("0069", 20, 0); + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionInit() { + + } + + + @Override + public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) { + activity.runOnUiThread(() -> Toast.makeText(activity, newStatus.name(), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) { + activity.runOnUiThread(() -> Toast.makeText(activity, errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + activity.getClientInterface().getTransactionManager().sendTransactionUserData(null, "phone", "email"); + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Transaction data has been received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionCompleted() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Operation has been successfully completed", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRepeat(int attemptNumber) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onSelectTransaction() { + + } + + @Override + public void onRequestedReportZ() { + + } + + @Override + public void onCompletedPrinting(PrinterResult printerErrorDataPrinterBaseDataPrinterResult) { + + } + + @Override + public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) { + + } + + @Override + public void onPrinterForRegistrationGettingCompleted() { + + } + + @Override + public void onNoBoundedPrinterFound() { + + } + + @Override + public void onPrinterToUseSelectionRequested(List list) { + + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/RevertCurrentOperationCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/RevertCurrentOperationCallbackHandlerImpl.java new file mode 100644 index 0000000..c4a0e0d --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/RevertCurrentOperationCallbackHandlerImpl.java @@ -0,0 +1,308 @@ +package kz.com.aman.kassa.bank; + +import android.app.AlertDialog; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.LastReversalCardPaymentCallbackHandler; +import ru.m4bank.mpos.service.commons.data.ResultType; +import ru.m4bank.mpos.service.data.FiscalStatusData; +import ru.m4bank.mpos.service.data.dynamic.objects.Reader; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.data.dynamic.objects.result.ResultCode; +import ru.m4bank.mpos.service.hardware.error.ErrorHandler; +import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.VirtualKeyboardStyleTypeConv; +import ru.m4bank.mpos.service.result.PrinterResult; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.MessageButtonData; +import ru.m4bank.mpos.service.transactions.data.TransactionData; +import ru.m4bank.mpos.service.transactions.data.TransactionExecutionStatus; +import ru.m4bank.mpos.service.transactions.data.error.TransactionErrorData; +import ru.m4bank.mpos.service.transactions.dto.OnlineCardDataDto; +import timber.log.Timber; + +public class RevertCurrentOperationCallbackHandlerImpl implements LastReversalCardPaymentCallbackHandler { + + private final M4BankActivity activity; + + public RevertCurrentOperationCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCardReaderForTransactionGettingCompleted() { + + } + + @Override + public void onNoBoundedDevicesFound() { + + } + + @Override + public void onConnectingProcessStarted(String deviceName) { + + } + + @Override + public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) { + if (reconnectAvailable) { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setMessage("Connection to cardreader has been lost, try to reconnect and repeat last operation?"); + builder.setCancelable(false); + builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().tryToReconnectAndRepeatLast()); + builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel()); + builder.create().show(); + }); + } + } + + @Override + public void onDeviceToConnectSelectionRequested(List deviceList) { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose device"); + + Spinner deviceListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, deviceList); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + deviceListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface() + .getTransactionManager() + .selectCardReader(deviceListSpinner.getSelectedItem().toString()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + builder.create().show(); + }); + } + + @Override + public void onWorkFlowDataRequested() { + + } + + @Override + public void onReceiveCardData(OnlineCardDataDto data, boolean shouldConfirmBeManuallyCalled) { + + } + + @Override + public void onRequiredReversal(String description, ResultCode resultCode) { + + } + + @Override + public void onRequiredApplicationSelection(List applicationOfList) { + + } + + @Override + public void onPrinterForRegistrationGettingCompleted() { + + } + + @Override + public void onNoBoundedPrinterFound() { + + } + + @Override + public void onTransactionDetailsReceived(Transaction transaction) { + + } + + @Override + public void onSuccessStatusTransaction(Transaction transaction) { + + } + + @Override + public void onErrorStatusTransaction() { + + } + + @Override + public void onRequestedReportZ() { + + } + + @Override + public void onCompletedPrinting(PrinterResult printerResult) { + + } + + @Override + public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) { + + } + + @Override + public void onReconciliationRequiredToProcess() { + Timber.d("Reconciliation required!!!"); + activity.getClientInterface().getTransactionManager().makeReconciliationDuringTransaction(); + } + + @Override + public void onReconciliationCompleted(Result result) { + Timber.d("Reconciliation completed!!!"); + if (result.getResultType() == ResultType.SUCCESSFUL) { + activity.getClientInterface().getTransactionManager().continueTransactionAfterReconciliation(); + } else { + activity.runOnUiThread(() -> Toast.makeText(activity, "Reconciliation failed " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_LONG) + .show()); + } + } + + @Override + public void onRepeat(int attemptNumber) { + + } + + @Override + public void onTransactionAmountRequested() { + + } + + @Override + public void onTransactionDataRequested() { + + } + + @Override + public void onDeviceToUseSelectionRequested(List deviceList) { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle("Choose device"); + + Spinner deviceListSpinner = new Spinner(activity); + ArrayAdapter adapter = new ArrayAdapter<>(activity, android.R.layout.simple_spinner_item, new ArrayList<>(deviceList)); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + deviceListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + activity.getClientInterface() + .getTransactionManager() + .setCardReaderToUse((Reader) deviceListSpinner.getSelectedItem()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + activity.runOnUiThread(() -> builder.create().show()); + } + + @Override + public void onPrinterToUseSelectionRequested(List printerList) { + + } + + @Override + public void onTransactionInit() { + + } + + @Override + public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) { + + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + + } + + @Override + public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) { + + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + activity.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction(); + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + + } + + @Override + public void onTransactionCompleted() { + + } + + @Override + public void onReconnectNeededToProcess() { + activity.runOnUiThread(() -> { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setMessage("Connection to cardreader has been lost, try to reconnect and continue?"); + builder.setCancelable(false); + builder.setPositiveButton("Yes", (dialog, which) -> activity.getClientInterface().getTransactionManager().tryToReconnectToCardReader()); + builder.setNegativeButton("No", (dialog, which) -> activity.getClientInterface().cancel()); + builder.create().show(); + }); + } + + @Override + public void onWrongTerminal() { + + } + + @Override + public void onActivityUpdateUiThread() { + + } + + @Override + public void onCreatePinPadButtons() { + + } + + @Override + public void onShowPinPadKeyBoard(MessageButtonData messageButtonData) { + + } + + @Override + public void onUpdateElementPin(int i) { + + } + + @Override + public void onCloseKeyboard() { + + } + + @Override + public void onRequiredAdditionalVirtualKeyboardSettings(VirtualKeyboardStyleTypeConv virtualKeyboardStyleTypeConv) { + + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/ScanBarCodeCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/ScanBarCodeCallbackHandlerImpl.java new file mode 100644 index 0000000..db96133 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/ScanBarCodeCallbackHandlerImpl.java @@ -0,0 +1,72 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; + +import java.util.List; + +import ru.m4bank.mpos.library.external.transactions.ScanBarCodeCallbackHandler; +import ru.m4bank.mpos.service.result.Result; + +public class ScanBarCodeCallbackHandlerImpl implements ScanBarCodeCallbackHandler { + + private final M4BankActivity activity; + + public ScanBarCodeCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onCompleteBarCode(String result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onError(String result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCardReaderForTransactionGettingCompleted() { + + } + + @Override + public void onNoBoundedDevicesFound() { + + } + + @Override + public void onConnectingProcessStarted(String s) { + + } + + @Override + public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean b, String s) { + + } + + @Override + public void onDeviceToUseSelectionRequested(List list) { + + } + + @Override + public void notAuthorized() { + + } + + @Override + public void onDeviceToConnectSelectionRequested(List list) { + + } + + @Override + public void onCompleted(Result result) { + activity.runOnUiThread(() -> Toast.makeText(activity, (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onWrongApiCalled() { + + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/SendRegisterRequestCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/SendRegisterRequestCallbackHandlerImpl.java new file mode 100644 index 0000000..1fea624 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/SendRegisterRequestCallbackHandlerImpl.java @@ -0,0 +1,24 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; + +import ru.m4bank.mpos.library.external.configuration.SendRegisterRequestCallbackHandler; +import ru.m4bank.mpos.service.result.SendRegisterRequestExternalResult; + +public class SendRegisterRequestCallbackHandlerImpl implements SendRegisterRequestCallbackHandler { + private final M4BankActivity activity; + + public SendRegisterRequestCallbackHandlerImpl(M4BankActivity activity) { + this.activity = activity; + } + + @Override + public void onCompleted(SendRegisterRequestExternalResult result) { + activity.runOnUiThread(() -> Toast.makeText(activity, result.getResultType() + " " + result.getRequestCode() + " " + result.getStatus(), Toast.LENGTH_SHORT).show()); + } + + @Override + public void onWrongApiCalled() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/SessionExpiringCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/SessionExpiringCallbackHandlerImpl.java new file mode 100644 index 0000000..4c49899 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/SessionExpiringCallbackHandlerImpl.java @@ -0,0 +1,11 @@ +package kz.com.aman.kassa.bank; + +import ru.m4bank.mpos.library.external.SessionExpiringCallbackHandler; +import timber.log.Timber; + +public class SessionExpiringCallbackHandlerImpl implements SessionExpiringCallbackHandler { + @Override + public void onSessionExpired() { + Timber.w("SESSION EXPIRED!"); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/TerminalKeyTypeMpos.java b/android/app/src/main/java/kz/com/aman/kassa/bank/TerminalKeyTypeMpos.java new file mode 100644 index 0000000..f2ca89c --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/TerminalKeyTypeMpos.java @@ -0,0 +1,5 @@ +package kz.com.aman.kassa.bank; + +public enum TerminalKeyTypeMpos { + Tmp, Tpk, Tak +} \ No newline at end of file diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/XReportCallbackHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/XReportCallbackHandlerImpl.java new file mode 100644 index 0000000..366b578 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/XReportCallbackHandlerImpl.java @@ -0,0 +1,72 @@ +package kz.com.aman.kassa.bank; + +import android.widget.Toast; + +import java.util.List; + +import ru.m4bank.mpos.library.M4BankMposClientInterfaceFacade; +import ru.m4bank.mpos.library.external.transactions.XReportCallbackHandler; +import ru.m4bank.mpos.service.commons.data.ResultType; +import ru.m4bank.mpos.service.data.dynamic.objects.Transaction; +import ru.m4bank.mpos.service.hardware.printer.dto.data.PrintingType; +import ru.m4bank.mpos.service.result.Result; +import ru.m4bank.mpos.service.transactions.data.external.ExternalReconciliationData; + +public class XReportCallbackHandlerImpl implements XReportCallbackHandler { + + private PrintingType reportType; + private M4BankActivity activity; + private M4BankMposClientInterfaceFacade clientInterface; + + public XReportCallbackHandlerImpl(M4BankMposClientInterfaceFacade clientInterface, PrintingType reportType, M4BankActivity activity) { + this.reportType = reportType; + this.activity = activity; + this.clientInterface = clientInterface; + } + + @Override + public void onTransactionsListReceived(List list) { + if(list == null || list.isEmpty()) { + activity.runOnUiThread(() -> Toast.makeText(activity, "list of transaction is empty", Toast.LENGTH_SHORT).show()); + } else { + ExternalReconciliationData data = new ExternalReconciliationData.Builder() + .reconciliationData(new ReconciliationPrinterDataBuilder().build(list, false)) + .build(); + printReport(clientInterface, reportType, data); + } + } + + @Override + public void notAuthorized() { + activity.runOnUiThread(() -> Toast.makeText(activity, "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCompleted(Result result) { + if(result == null || result.getResultType() != ResultType.SUCCESSFUL) { + activity.runOnUiThread(() -> Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show()); + }else if(result.getResultType() == ResultType.SUCCESSFUL){ + // if code is successful and list is empty -> reconciliation is already done + activity.runOnUiThread(() -> Toast.makeText(activity, "list of transaction is empty", Toast.LENGTH_SHORT).show()); + } + } + + @Override + public void onWrongApiCalled() { + + } + + @Override + public void onRepeat(int i) { + + } + + private void printReport(M4BankMposClientInterfaceFacade clientInterface, PrintingType reportType, ExternalReconciliationData data) { + clientInterface.cancel(); + if(reportType == PrintingType.RECONCILIATION_FULL_REPORT) { + clientInterface.getPrinterManager().printReconciliationReportFull(new PrintingCallbackHandlerImpl(activity), data); + } else { + clientInterface.getPrinterManager().printReconciliationReportShort(new PrintingCallbackHandlerImpl(activity), data); + } + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/builders/SslConfigurationBuilder.java b/android/app/src/main/java/kz/com/aman/kassa/bank/builders/SslConfigurationBuilder.java new file mode 100644 index 0000000..ca167c6 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/builders/SslConfigurationBuilder.java @@ -0,0 +1,50 @@ +package kz.com.aman.kassa.bank.builders; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.X509TrustManager; + +import ru.m4bank.mpos.service.network.retrofit.SSLConfiguration; + +public class SslConfigurationBuilder { + public static SSLConfiguration buildAllTrustConfiguration(String serverAddress) { + X509TrustManager[] trustManager = getTrustManagers(); + return new SSLConfiguration.Builder() + .trustManager(trustManager[0]) + .hostnameVerifier(getHostnameVerifier(serverAddress)) + .socketFactory(getSSLSocketFactory(trustManager)) + .build(); + } + + private static HostnameVerifier getHostnameVerifier(String serverUrl) { + return (hostname, session) -> true; + } + + private static X509TrustManager[] getTrustManagers() { + return new X509TrustManager[]{new X509TrustManager() { + @Override + public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) { + } + + @Override + public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) { + } + + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return new java.security.cert.X509Certificate[]{}; + } + }}; + } + + private static SSLSocketFactory getSSLSocketFactory(X509TrustManager[] trustManager) { + try { + final SSLContext sslContext = SSLContext.getInstance("SSL"); + sslContext.init(null, trustManager, new java.security.SecureRandom()); + return sslContext.getSocketFactory(); + } catch (Exception e) { + return null; + } + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/gui/CustomKeyBoardDilalog.java b/android/app/src/main/java/kz/com/aman/kassa/bank/gui/CustomKeyBoardDilalog.java new file mode 100644 index 0000000..fefee59 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/gui/CustomKeyBoardDilalog.java @@ -0,0 +1,128 @@ +package kz.com.aman.kassa.bank.gui; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; + +import kz.com.aman.kassa.R; +import ru.m4bank.mpos.service.transactions.data.MessageButtonData; + + +public class CustomKeyBoardDilalog { + + Button btnb1, btnb2, btnb3, btnb4, btnb5, btnb6, btnb7, btnb8, btnb9, btnb0, + btncancel, btnconfirm, btnclean; + View view; + Dialog dialog; + + public void createDialog(Context context) { + + dialog = new Dialog(context); + view = LayoutInflater.from(context).inflate(R.layout.layout_pin, null); + btnb1 = (Button) view.findViewById(R.id.button1); + btnb2 = (Button) view.findViewById(R.id.button2); + btnb3 = (Button) view.findViewById(R.id.button3); + btnb4 = (Button) view.findViewById(R.id.button4); + btnb5 = (Button) view.findViewById(R.id.button5); + btnb6 = (Button) view.findViewById(R.id.button6); + btnb7 = (Button) view.findViewById(R.id.button7); + btnb8 = (Button) view.findViewById(R.id.button8); + btnb9 = (Button) view.findViewById(R.id.button9); + btnb0 = (Button) view.findViewById(R.id.button0); + btncancel = (Button) view.findViewById(R.id.buttoncan); + btnconfirm = (Button) view.findViewById(R.id.buttonconfirm); + btnclean = (Button) view.findViewById(R.id.buttonclean); + Window dialogWindow = dialog.getWindow(); + dialogWindow.setGravity( Gravity.BOTTOM); + + WindowManager.LayoutParams lp = dialogWindow.getAttributes(); + lp.x = 0; + lp.y = 0; + view.measure(0, 0); + lp.height = view.getMeasuredHeight(); + lp.alpha = 9f; + dialogWindow.setAttributes(lp); + dialog.setContentView(view); + } + + public void show(Activity activity) { + if (!activity.isFinishing()) + dialog.show(); + } + + public void close(Activity activity) { + if (!activity.isFinishing() && dialog != null && dialog.isShowing()) + dialog.dismiss(); + } + + public void setText(MessageButtonData messageButtonData) { + btnb1.setText("" + messageButtonData.getBtnb1()); + btnb2.setText("" + messageButtonData.getBtnb2()); + btnb3.setText("" + messageButtonData.getBtnb3()); + btnb4.setText("" + messageButtonData.getBtnb4()); + btnb5.setText("" + messageButtonData.getBtnb5()); + btnb6.setText("" + messageButtonData.getBtnb6()); + btnb7.setText("" + messageButtonData.getBtnb7()); + btnb8.setText("" + messageButtonData.getBtnb8()); + btnb9.setText("" + messageButtonData.getBtnb9()); + btnb0.setText("" + messageButtonData.getBtnb0()); + } + + public Button getBtnb1() { + return btnb1; + } + + public Button getBtnb2() { + return btnb2; + } + + public Button getBtnb3() { + return btnb3; + } + + public Button getBtnb4() { + return btnb4; + } + + public Button getBtnb5() { + return btnb5; + } + + public Button getBtnb6() { + return btnb6; + } + + public Button getBtnb7() { + return btnb7; + } + + public Button getBtnb8() { + return btnb8; + } + + public Button getBtnb9() { + return btnb9; + } + + public Button getBtnb0() { + return btnb0; + } + + public Button getBtncancel() { + return btncancel; + } + + public Button getBtnconfirm() { + return btnconfirm; + } + + public Button getBtnclean() { + return btnclean; + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/gui/SelectDialogCallback.java b/android/app/src/main/java/kz/com/aman/kassa/bank/gui/SelectDialogCallback.java new file mode 100644 index 0000000..e203b25 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/gui/SelectDialogCallback.java @@ -0,0 +1,10 @@ +package kz.com.aman.kassa.bank.gui; + +/** + * Created by pppoo on 27.02.2018. + */ + +public interface SelectDialogCallback { + void onElementSelected(ElementType element); + void onCancelSelection(); +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/gui/SelectElementDialog.java b/android/app/src/main/java/kz/com/aman/kassa/bank/gui/SelectElementDialog.java new file mode 100644 index 0000000..607a0be --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/gui/SelectElementDialog.java @@ -0,0 +1,66 @@ +package kz.com.aman.kassa.bank.gui; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.view.ViewGroup.LayoutParams; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.TextView; + +import java.util.List; + +import kz.com.aman.kassa.R; + + +public class SelectElementDialog extends Dialog { + private Context context; + ArrayAdapter listAdapter; + private TextView labelTitle; + private ListView list; + private SelectDialogCallback selectDialogCallback; + + public SelectElementDialog(final Context context, List elements, SelectDialogCallback selectDialogCallback) { + super(context); + this.context = context; + this.selectDialogCallback = selectDialogCallback; + setCancelable(false); + setCanceledOnTouchOutside(false); + init(elements); + list.setAdapter(listAdapter); + getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + + list.setOnItemClickListener((arg0, arg1, arg2, arg3) -> { + ElementType element = (ElementType) arg0.getItemAtPosition(arg2); + selectDialogCallback.onElementSelected(element); + ((Activity) context).runOnUiThread(this::dismiss); + }); + } + + private void init(List elements) { + setContentView(R.layout.custom_dialog_list); + labelTitle = findViewById(R.id.labelMessage); + list = findViewById(R.id.list); + listAdapter = new ArrayAdapter(context, R.layout.list_item, R.id.itemView, elements); + } + + @Override + public void onBackPressed() { + super.onBackPressed(); + } + + public void setTitle(String text) { + if (null != labelTitle) + labelTitle.setText(text); + } + + public static void showError(Context context, String message) { + try { + Dialog dialog = new Dialog(context); + dialog.setTitle(message); + dialog.show(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/managing/PreferencesManager.java b/android/app/src/main/java/kz/com/aman/kassa/bank/managing/PreferencesManager.java new file mode 100644 index 0000000..0943c5a --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/managing/PreferencesManager.java @@ -0,0 +1,37 @@ +package kz.com.aman.kassa.bank.managing; + +import android.content.Context; +import android.content.SharedPreferences; + +import static android.content.Context.MODE_PRIVATE; + +public class PreferencesManager { + public enum Field { + LOGIN("Login"), PASSWORD("Password"), SERVER_URL("ServerUrl"); + + private String code; + + Field(String code) { + this.code = code; + } + + public String getCode() { + return code; + } + } + + public static void saveStringField(Context context, Field field, String value) { + SharedPreferences preferences = context.getSharedPreferences("preferences", MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putString(field.getCode(), value).apply(); + } + + public static String loadStringField(Context context, Field field) { + return loadStringField(context, field, null); + } + + public static String loadStringField(Context context, Field field, String defaultValue) { + SharedPreferences preferences = context.getSharedPreferences("preferences", MODE_PRIVATE); + return preferences.getString(field.getCode(), defaultValue); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/permissions/PermissionsManager.java b/android/app/src/main/java/kz/com/aman/kassa/bank/permissions/PermissionsManager.java new file mode 100644 index 0000000..4b04714 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/permissions/PermissionsManager.java @@ -0,0 +1,11 @@ +package kz.com.aman.kassa.bank.permissions; + +public interface PermissionsManager { + void checkPermissions(PermissionsCheckResultHandler handler); + void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults); + + interface PermissionsCheckResultHandler { + void onPermissionsGranted(); + void onPermissionsDeclined(); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/bank/permissions/PermissionsManagerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/bank/permissions/PermissionsManagerImpl.java new file mode 100644 index 0000000..9bbe419 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/bank/permissions/PermissionsManagerImpl.java @@ -0,0 +1,65 @@ +package kz.com.aman.kassa.bank.permissions; + +import android.Manifest; +import android.app.Activity; +import android.content.pm.PackageManager; + +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +public class PermissionsManagerImpl implements PermissionsManager { + private static final int MY_PERMISSIONS_REQUEST = 107; + private static final String[] PERMISSIONS_LIST = new String[]{ + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.CAMERA, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + }; + + private final Activity activity; + private PermissionsCheckResultHandler permissionsCheckResultHandler; + + public PermissionsManagerImpl(Activity activity) { + this.activity = activity; + } + + @Override + public void checkPermissions(PermissionsCheckResultHandler permissionsCheckResultHandler) { + for (String permission : PERMISSIONS_LIST) { + if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) { + this.permissionsCheckResultHandler = permissionsCheckResultHandler; + ActivityCompat.requestPermissions(activity, PERMISSIONS_LIST, MY_PERMISSIONS_REQUEST); + return; + } + } + + permissionsCheckResultHandler.onPermissionsGranted(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, + String permissions[], int[] grantResults) { + switch (requestCode) { + case MY_PERMISSIONS_REQUEST: { + if (grantResults.length == PERMISSIONS_LIST.length) { + if (arePermissionsGranted(grantResults)) { + permissionsCheckResultHandler.onPermissionsGranted(); + } else { + permissionsCheckResultHandler.onPermissionsDeclined(); + } + } + } + } + } + + private boolean arePermissionsGranted(int[] grantResults) { + boolean access = true; + for (int grantResult : grantResults) { + if (grantResult != PackageManager.PERMISSION_GRANTED) + access = false; + } + return access; + } +}