diff --git a/android/app/src/main/java/kz/com/aman/kassa/handler/CardPaymentHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/handler/CardPaymentHandlerImpl.java index ee8b5c2..42b069b 100644 --- a/android/app/src/main/java/kz/com/aman/kassa/handler/CardPaymentHandlerImpl.java +++ b/android/app/src/main/java/kz/com/aman/kassa/handler/CardPaymentHandlerImpl.java @@ -14,6 +14,7 @@ import java.util.List; import io.flutter.plugin.common.MethodChannel; import kz.com.aman.kassa.bank.gui.CustomKeyBoardDilalog; import kz.com.aman.kassa.model.AmanDao; +import kz.com.aman.kassa.model.CardData; import kz.com.aman.kassa.plugins.BankNfcPlugins; import ru.m4bank.mpos.library.external.transactions.CardPaymentCallbackHandler; import ru.m4bank.mpos.service.commons.data.ResultType; @@ -274,11 +275,16 @@ public class CardPaymentHandlerImpl implements CardPaymentCallbackHandler---->---->onTransactionDataReceived"); - plugin.getActivity().runOnUiThread(() -> { - AmanDao dao = new AmanDao<>(); + CardData cardData = new CardData(); + cardData.setCardExpiryDate(data.getCardExpiryDate()); + cardData.setCardNumber(data.getCardNumber()); + cardData.setCardPaymentSystemType(data.getCardPaymentSystemType()); + cardData.setTransactionNumber(data.getTransactionNumber()); + cardData.setTransactionType(data.getTransactionType().getCode()); + AmanDao dao = new AmanDao<>(); dao.setSuccess(true); - dao.setMsg("OK"); + dao.setData(cardData); this.result.success(gson.toJson(dao)); Toast.makeText(plugin.getActivity(), "Transaction data has been received", Toast.LENGTH_LONG) .show(); diff --git a/android/app/src/main/java/kz/com/aman/kassa/handler/CardRefundAmanHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/handler/CardRefundAmanHandlerImpl.java new file mode 100644 index 0000000..dd5b0a3 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/handler/CardRefundAmanHandlerImpl.java @@ -0,0 +1,343 @@ +package kz.com.aman.kassa.handler; + +import android.app.AlertDialog; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.Toast; + +import com.google.gson.Gson; + +import java.util.ArrayList; +import java.util.List; + +import io.flutter.plugin.common.MethodChannel; +import kz.com.aman.kassa.MainActivity; +import kz.com.aman.kassa.bank.M4BankActivity; +import kz.com.aman.kassa.bank.gui.CustomKeyBoardDilalog; +import kz.com.aman.kassa.plugins.BankNfcPlugins; +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 CardRefundAmanHandlerImpl implements EasyCardRefundCallbackHandler, GetTransactionsListCallbackHandler { + + private final BankNfcPlugins plugin; + private final MethodChannel.Result result; + private final Gson gson = new Gson(); + private Transaction transaction; + private CustomKeyBoardDilalog customKeyBoardDilalog; + + public CardRefundAmanHandlerImpl(BankNfcPlugins plugin , MethodChannel.Result result) { + this.plugin = plugin; + this.result = result; + 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(plugin.getActivity()); + builder.setTitle("Choose device"); + + Spinner deviceListSpinner = new Spinner(plugin.getActivity()); + ArrayAdapter adapter = new ArrayAdapter<>(plugin.getActivity(), 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) -> { + plugin.getClientInterface().getTransactionManager().setCardReaderToUse((Reader) deviceListSpinner.getSelectedItem()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + plugin.getActivity().runOnUiThread(() -> builder.create().show()); + } + + @Override + public void onDeviceToConnectSelectionRequested(List deviceList) { + Timber.d("onDeviceToConnectSelectionRequested"); + AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity()); + builder.setTitle("Choose device"); + + Spinner deviceListSpinner = new Spinner(plugin.getActivity()); + ArrayAdapter adapter = new ArrayAdapter<>(plugin.getActivity(), android.R.layout.simple_spinner_item, deviceList); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + deviceListSpinner.setAdapter(adapter); + + builder.setPositiveButton("OK", (dialog, which) -> { + plugin.getClientInterface().getTransactionManager().selectCardReader(deviceListSpinner.getSelectedItem().toString()); + dialog.dismiss(); + }); + + builder.setView(deviceListSpinner); + plugin.getActivity().runOnUiThread(() -> builder.create().show()); + } + + @Override + public void onCompleted(Result result) { + Timber.d("onCompleted"); + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), + Toast.LENGTH_SHORT).show()); + } + + @Override + public void onWrongApiCalled() { + Timber.d("onWrongApiCalled"); + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onReceiveCardData(OnlineCardDataDto data, boolean shouldConfirmBeManuallyCalled) { + Timber.d("onReceiveCardData"); + if (shouldConfirmBeManuallyCalled) { + plugin.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()); + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), 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()); + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + } + + @Override + public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) { + Timber.d("onErrorWithPossibilityToRetry: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getDescription()); + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), errorHandler.getFinalDescription(), Toast.LENGTH_LONG).show()); + plugin.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction(); + } + + @Override + public void onTransactionDataReceivedError(TransactionData data) { + Timber.d("onTransactionDataReceivedError"); + } + + @Override + public void onUserInformationRequested(boolean signNeeded) { + Timber.d("onUserInformationRequested"); + plugin.getClientInterface().getTransactionManager().sendTransactionUserData("signature", "phone", "email"); + } + + @Override + public void onTransactionDataReceived(TransactionData data) { + Timber.d("onTransactionDataReceived"); + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "Transaction data has been received", Toast.LENGTH_LONG) + .show()); + } + + @Override + public void onTransactionCompleted() { + Timber.d("onTransactionCompleted"); + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "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!!!"); + plugin.getClientInterface().getTransactionManager().makeReconciliationDuringTransaction(); + } + + @Override + public void onReconciliationCompleted(Result result) { + Timber.d("onReconciliationCompleted"); + Timber.d("Reconciliation completed!!!"); + } + + @Override + public void notAuthorized() { + Timber.d("notAuthorized"); + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "notAuthorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRepeat(int attemptNumber) { + Timber.d("onRepeat"); + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "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"); + plugin.getClientInterface().getTransactionManager().setRefundData(transaction, transaction.getAmount(), RefundType.General); + } + + @Override + public void onTransactionsListReceived(List transactionList) { + Timber.d("onTransactionsListReceived"); + AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity()); + builder.setTitle("Choose transaction"); + + Spinner transactionListSpinner = new Spinner(plugin.getActivity()); + ArrayAdapter adapter = new ArrayAdapter<>(plugin.getActivity(), 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(); + plugin.getClientInterface().getTransactionManager().makeCardRefund(this); + dialog.dismiss(); + }); + + builder.setView(transactionListSpinner); + plugin.getActivity().runOnUiThread(() -> builder.create().show()); + } + + @Override + public void onActivityUpdateUiThread() { + Timber.d("onActivityUpdateUiThread"); + plugin.getClientInterface().getTransactionManager().addPinpadClickListener(plugin.getActivity()); + } + + @Override + public void onCreatePinPadButtons() { + Timber.d("onCreatePinPadButtons"); + customKeyBoardDilalog.createDialog(plugin.getActivity()); + customKeyBoardDilalog.show(plugin.getActivity()); + 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(), + plugin.getActivity().getWindowManager().getDefaultDisplay().getRotation() + ).build(); + plugin.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"); + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "count = " + count, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCloseKeyboard() { + Timber.d("onCloseKeyboard"); + customKeyBoardDilalog.close(plugin.getActivity()); + } + + @Override + public void onRequiredAdditionalVirtualKeyboardSettings(VirtualKeyboardStyleTypeConv virtualKeyboardStyleTypeConv) { +// activity.showSelectStyleDialog(additionalData -> +// plugin.getClientInterface().getTransactionManager().addVirtualPinKeyboardData(additionalData)); + } + + @Override + public void onRequiredHostAddress() { + Timber.d("onRequiredHostAddress"); + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "Set Host Address", Toast.LENGTH_LONG) + .show()); + plugin.getClientInterface().getTransactionManager().setHostAddress("213.79.122.128", "8011"); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/handler/CloseDayHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/handler/CloseDayHandlerImpl.java new file mode 100644 index 0000000..2e5b65a --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/handler/CloseDayHandlerImpl.java @@ -0,0 +1,70 @@ +package kz.com.aman.kassa.handler; + +import android.widget.Toast; + +import com.google.gson.Gson; + +import java.util.List; + +import io.flutter.plugin.common.MethodChannel; +import kz.com.aman.kassa.bank.M4BankActivity; +import kz.com.aman.kassa.model.AmanDao; +import kz.com.aman.kassa.plugins.BankNfcPlugins; +import ru.m4bank.mpos.library.external.transactions.CloseDayCallbackHandler; +import ru.m4bank.mpos.service.commons.data.ResultType; +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; + +//import com.landicorp.uns.result; + + +public class CloseDayHandlerImpl implements CloseDayCallbackHandler { + private final BankNfcPlugins plugin; + private final MethodChannel.Result result; + private final Gson gson = new Gson(); + + public CloseDayHandlerImpl(BankNfcPlugins plugin, MethodChannel.Result result) { + this.plugin = plugin; + this.result = result; + } + + @Override + public void notAuthorized() { + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "Not authorized", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCompleted(Result result) { + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT) + .show()); + } + + @Override + public void onWrongApiCalled() { + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "Wrong method has been called", Toast.LENGTH_SHORT).show()); + } + + @Override + public void onRepeat(int attemptNumber) { + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onTransactionsListReceived(List transactionList, List list1) { + plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "onTransactionsListReceived - " + transactionList, Toast.LENGTH_SHORT).show()); + } + + @Override + public void onCompleted(CloseDayResult closeDayResult) { + plugin.getActivity().runOnUiThread(() -> { + AmanDao dao = new AmanDao<>(); + dao.setSuccess(ResultType.SUCCESSFUL.equals(closeDayResult.getResultType())); + dao.setMsg((closeDayResult.getDescription() == null ? "" : closeDayResult.getDescription())); + this.result.success(gson.toJson(dao)); + Toast.makeText(plugin.getActivity(), closeDayResult.getResultType() + " " + (closeDayResult.getDescription() == null ? "" : closeDayResult.getDescription()), Toast.LENGTH_SHORT) + .show(); + }); + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/handler/TransactionDetailsHandlerImpl.java b/android/app/src/main/java/kz/com/aman/kassa/handler/TransactionDetailsHandlerImpl.java index 02acd59..a3e06d9 100644 --- a/android/app/src/main/java/kz/com/aman/kassa/handler/TransactionDetailsHandlerImpl.java +++ b/android/app/src/main/java/kz/com/aman/kassa/handler/TransactionDetailsHandlerImpl.java @@ -27,6 +27,16 @@ public class TransactionDetailsHandlerImpl implements GetTransactionDetailsCallb plugin.getActivity().runOnUiThread(() -> { System.out.println("getCheck:"+ transaction.getCheck()); System.out.println("getCheckNumber:"+ transaction.getCheckNumber()); + System.out.println("getAmount:"+ transaction.getAmount()); + System.out.println("getCardHolderName:"+ transaction.getCardHolderName()); + System.out.println("getCardType:"+ transaction.getCardType()); + System.out.println("getPrinterCheckNumber:"+ transaction.getPrinterCheckNumber()); + System.out.println("getTransactionNumber:"+ transaction.getTransactionNumber()); + System.out.println("getAdditionalAuthorizationCode:"+ transaction.getAdditionalAuthorizationCode()); + System.out.println("getAuthorizationCode:"+ transaction.getAuthorizationCode()); + System.out.println("getCardExpiryDate:"+ transaction.getCardExpiryDate()); + System.out.println("getTransactionType:"+ transaction.getTransactionType()); + System.out.println("getTransactionDate:"+ transaction.getTransactionDate()); Toast.makeText(plugin.getActivity(), "Transaction details received: " + transaction, Toast.LENGTH_SHORT) .show(); }); @@ -48,7 +58,6 @@ public class TransactionDetailsHandlerImpl implements GetTransactionDetailsCallb plugin.getActivity().runOnUiThread(() -> { AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity()); builder.setTitle("Choose transaction"); - Spinner transactionListSpinner = new Spinner(plugin.getActivity()); ArrayAdapter adapter = new ArrayAdapter<>(plugin.getActivity(), android.R.layout.simple_spinner_item, new ArrayList<>(transactionList)); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); diff --git a/android/app/src/main/java/kz/com/aman/kassa/model/CardData.java b/android/app/src/main/java/kz/com/aman/kassa/model/CardData.java new file mode 100644 index 0000000..9d8ab39 --- /dev/null +++ b/android/app/src/main/java/kz/com/aman/kassa/model/CardData.java @@ -0,0 +1,49 @@ +package kz.com.aman.kassa.model; + +public class CardData { + private Integer transactionNumber; + private String cardExpiryDate; + private String cardNumber; + private String transactionType; + private String cardPaymentSystemType; + + public String getCardExpiryDate() { + return cardExpiryDate; + } + + public void setCardExpiryDate(String cardExpiryDate) { + this.cardExpiryDate = cardExpiryDate; + } + + public String getCardNumber() { + return cardNumber; + } + + public void setCardNumber(String cardNumber) { + this.cardNumber = cardNumber; + } + + public String getTransactionType() { + return transactionType; + } + + public void setTransactionType(String transactionType) { + this.transactionType = transactionType; + } + + public String getCardPaymentSystemType() { + return cardPaymentSystemType; + } + + public void setCardPaymentSystemType(String cardPaymentSystemType) { + this.cardPaymentSystemType = cardPaymentSystemType; + } + + public Integer getTransactionNumber() { + return transactionNumber; + } + + public void setTransactionNumber(Integer transactionNumber) { + this.transactionNumber = transactionNumber; + } +} diff --git a/android/app/src/main/java/kz/com/aman/kassa/plugins/BankNfcPlugins.java b/android/app/src/main/java/kz/com/aman/kassa/plugins/BankNfcPlugins.java index bd27c7e..4ce915d 100644 --- a/android/app/src/main/java/kz/com/aman/kassa/plugins/BankNfcPlugins.java +++ b/android/app/src/main/java/kz/com/aman/kassa/plugins/BankNfcPlugins.java @@ -1,15 +1,11 @@ package kz.com.aman.kassa.plugins; import android.os.Build; -import android.widget.Toast; + import com.google.gson.Gson; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; @@ -24,13 +20,11 @@ import kz.com.aman.kassa.handler.AuthorizationHandlerImpl; import kz.com.aman.kassa.handler.CardPaymentHandlerImpl; import kz.com.aman.kassa.handler.ConnectionCheckHandlerImpl; import kz.com.aman.kassa.handler.TransactionDetailsHandlerImpl; +import kz.com.aman.kassa.handler.CloseDayHandlerImpl; import kz.com.aman.kassa.model.AmanDao; import ru.m4bank.mpos.library.M4BankMposClient; import ru.m4bank.mpos.library.M4BankMposClientInterfaceFacade; import ru.m4bank.mpos.library.M4BankMposParameters; -import ru.m4bank.mpos.library.external.authorization.AuthorizationCallbackHandler; -import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler; -import ru.m4bank.mpos.service.authorization.network.AuthorizationResponse; import ru.m4bank.mpos.service.commons.data.ConfigurationSettings; import ru.m4bank.mpos.service.commons.data.NetworkConfiguration; import ru.m4bank.mpos.service.commons.data.TerminalConfiguration; @@ -93,6 +87,9 @@ public class BankNfcPlugins implements MethodCallHandler { case "shutdown": shutdown(call, result); break; + case "closeDay": + closeDay(call, result); + break; case "transaction": showTransaction(call, result); break; @@ -253,6 +250,16 @@ public class BankNfcPlugins implements MethodCallHandler { } } + private void closeDay(MethodCall call, Result result) { + try { + clientInterface.cancel(); + clientInterface.getTransactionManager().closeDay(new CloseDayHandlerImpl(this, result)); + } catch (Exception e) { + System.out.println("=============>ERROR:"+e.getMessage()); + result.error("2", e.getMessage(), e.getLocalizedMessage()); + } + } + private void showTransaction(MethodCall call, Result result){ clientInterface.getTransactionManager() .getTransactionsList( diff --git a/lib/core/models/card_data.dart b/lib/core/models/card_data.dart new file mode 100644 index 0000000..edb5869 --- /dev/null +++ b/lib/core/models/card_data.dart @@ -0,0 +1,29 @@ +class CardData { + final int transactionNumber; + final String cardExpiryDate; + final String cardNumber; + final String transactionType; + final String cardPaymentSystemType; + + CardData({this.transactionNumber, this.cardExpiryDate, this.cardNumber, this.transactionType, this.cardPaymentSystemType}); + + static CardData fromJson(Map json) { + return json != null ? + CardData( + transactionNumber: json['transactionNumber'], + cardExpiryDate: json['cardExpiryDate'], + cardNumber: json['cardNumber'], + transactionType: json['transactionType'], + cardPaymentSystemType: json['cardPaymentSystemType'], + ) + : null; + } + Map toJson() => + { + 'transactionNumber': transactionNumber, + 'cardExpiryDate': cardExpiryDate, + 'cardNumber': cardNumber, + 'transactionType': transactionType, + 'cardPaymentSystemType': cardPaymentSystemType, + }; +} \ No newline at end of file diff --git a/lib/core/models/check_data.dart b/lib/core/models/check_data.dart index 954fd69..315b22a 100644 --- a/lib/core/models/check_data.dart +++ b/lib/core/models/check_data.dart @@ -1,22 +1,26 @@ +import 'package:aman_kassa_flutter/core/models/card_data.dart'; import 'package:aman_kassa_flutter/core/models/check_item.dart'; class CheckData { final String type; num card; final List items; - CheckData({this.type, this.card, this.items}); + CardData cardData; + CheckData({this.type, this.card, this.items, this.cardData}); static CheckData fromJson(Map json) { return CheckData( type: json['type'], card: json['card'], - items: json['items'], + items: (json['items'] as List).map((e) => CheckItem.fromJson(e)).toList(), + cardData: CardData.fromJson(json['cardData']) ); } Map toJson() => { 'type': type, 'card': card, - 'items': items.map((e) => e.toJson()).toList() + 'items': items.map((e) => e.toJson()).toList(), + 'cardData': cardData!=null ? cardData.toJson() : null }; } \ No newline at end of file diff --git a/lib/core/services/BankService.dart b/lib/core/services/BankService.dart index 8d52497..41d814e 100644 --- a/lib/core/services/BankService.dart +++ b/lib/core/services/BankService.dart @@ -95,6 +95,18 @@ class BankService extends BaseService { } } + Future closeDay() async { + try { + String response = await _channel.invokeMethod("closeDay"); + AmanDao dao = AmanDao.fromJson(json.decode(response)); + log.i('${dao.success} - ${dao.msg}'); + return dao; + } catch (e, stack) { + log.e("BankService", e, stack); + return new AmanDao(msg: 'Ошибка при закрытии дня'); + } + } + Future pay({double amount}) async { try { diff --git a/lib/core/services/DataService.dart b/lib/core/services/DataService.dart index c28b250..9347463 100644 --- a/lib/core/services/DataService.dart +++ b/lib/core/services/DataService.dart @@ -7,6 +7,7 @@ import 'package:aman_kassa_flutter/core/entity/Service.dart'; import 'package:aman_kassa_flutter/core/entity/Voucher.dart'; import 'package:aman_kassa_flutter/core/locator.dart'; import 'package:aman_kassa_flutter/core/models/calc_model.dart'; +import 'package:aman_kassa_flutter/core/models/card_data.dart'; import 'package:aman_kassa_flutter/core/models/check_data.dart'; import 'package:aman_kassa_flutter/core/models/check_item.dart'; import 'package:aman_kassa_flutter/core/models/product_dao.dart'; @@ -135,16 +136,19 @@ class DataService extends BaseService { List kassaItems, List calcItems, String operationType, - String mode}) async { + String mode, + CardData cardData}) async { try { String data; if (mode == SettingModeKassa) { CheckData checkData = _transformProductsToCheckData( paymentType: paymentType, tradeType: tradeType, items: kassaItems); + checkData.cardData = cardData; data = jsonEncode(checkData.toJson()); } else if (mode == SettingModeCalc) { CheckData checkData = _transformCalcModelToCheckData( paymentType: paymentType, tradeType: tradeType, items: calcItems); + checkData.cardData = cardData; data = jsonEncode(checkData.toJson()); } diff --git a/lib/views/bank_setting/bank_setting_view.dart b/lib/views/bank_setting/bank_setting_view.dart index fc83b71..1709fb3 100644 --- a/lib/views/bank_setting/bank_setting_view.dart +++ b/lib/views/bank_setting/bank_setting_view.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:aman_kassa_flutter/core/locator.dart'; +import 'package:aman_kassa_flutter/core/models/aman_dao.dart'; import 'package:aman_kassa_flutter/core/services/BankService.dart'; import 'package:aman_kassa_flutter/core/services/dialog_service.dart'; import 'package:aman_kassa_flutter/redux/actions/bank_actions.dart'; @@ -49,11 +50,51 @@ class _BankSettingViewState extends State { super.dispose(); } - void _saveData() async { + void _saveData(BuildContext _context) async { + FocusScope.of(_context).unfocus(); await Redux.store.dispatch(saveData(_emailController.text, _passwordController.text)); _dialogService.showDialog(description: 'Данные сохранены'); } + void _closeDay(BuildContext _context) async { + FocusScope.of(_context).unfocus(); + + //Инициализация + bool initialized = await _bankService.init(); + if (!initialized) { + return; + } + + + + //Проверка связи + bool connected = await _bankService.connect(); + if (!connected) { + return; + } + //Авторизация + BankState bankState = Redux.store.state.bankState; + AmanDao authDao = await _bankService.auth( + login: bankState.login, password: bankState.password); + if (!authDao.success) { + if (authDao.msg != null) { + _dialogService.showDialog(description: authDao.msg); + } + return; + } + + AmanDao closeDayDao = await _bankService.closeDay(); + + if (!closeDayDao.success) { + if (closeDayDao.msg != null) { + _dialogService.showDialog(description: closeDayDao.msg); + } + return; + } + + _dialogService.showDialog(description: 'Закрытие дня: операция прошла успешно!'); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -87,7 +128,7 @@ class _BankSettingViewState extends State { ), verticalSpaceMedium, RaisedButton( - onPressed: this._saveData, + onPressed: () => this._saveData(context), child: Text( 'Cохранить', style: TextStyle(color: whiteColor, fontSize: 25.0), @@ -95,6 +136,17 @@ class _BankSettingViewState extends State { color: primaryColor, padding: const EdgeInsets.symmetric(vertical: 5.0, horizontal: 20.0), + ), + verticalSpaceLarge, + RaisedButton( + onPressed: () => this._closeDay(context), + child: Text( + 'Закрыть день', + style: TextStyle(color: whiteColor, fontSize: 25.0), + ), + color: primaryColor, + padding: + const EdgeInsets.symmetric(vertical: 5.0, horizontal: 20.0), ) ], ), diff --git a/lib/views/bank_view/bank_view.dart b/lib/views/bank_view/bank_view.dart index c3eaafe..0c52932 100644 --- a/lib/views/bank_view/bank_view.dart +++ b/lib/views/bank_view/bank_view.dart @@ -24,6 +24,7 @@ class _BankViewState extends State { String shutdownValue; String versionValue; String transactionValue; + String closeDayValue; String getValue; String errorValue; bool loading = false; @@ -36,7 +37,7 @@ class _BankViewState extends State { initialize() async { String result = await _channel.invokeMethod('init', { - 'serverUrl': 'http://185.98.84.231:2000', + 'serverUrl': 'http://195.200.74.83:5000', }); setState(() { initValue = result ?? 'none'; @@ -66,7 +67,7 @@ class _BankViewState extends State { auth() async { String result = await _channel.invokeMethod("auth", - {'login': 'uvaissov@gmail.com', 'password': '1234'}); + {'login': 'uvaissov@gmail.com', 'password': '8147'}); setState(() { authValue = result; }); @@ -123,6 +124,20 @@ class _BankViewState extends State { }); } + closeDay() async { + String result; + try { + String response = await _channel.invokeMethod("closeDay"); + AmanDao dao = AmanDao.fromJson(json.decode(response)); + result = '${dao.data} - ${dao.msg}'; + } catch (e) { + result = (e.toString()); + } + setState(() { + closeDayValue = result; + }); + } + error() async { String result; try { @@ -158,77 +173,85 @@ class _BankViewState extends State { children: [ RaisedButton( child: Text('Activity m4Bank'), onPressed: activity), - Row( + Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - Text('version: $versionValue'), + Text('version: $versionValue', overflow: TextOverflow.clip, maxLines: 2, softWrap: false), RaisedButton( child: Text('Version'), onPressed: version), ], ), - Row( + Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - Text('init: $initValue'), + Text('init: $initValue' , overflow: TextOverflow.clip, maxLines: 2, softWrap: false), RaisedButton( child: Text('Init'), onPressed: initialize), ], ), - Row( + Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - Text('connection: $connectionValue'), + Text('connection: $connectionValue', overflow: TextOverflow.clip, maxLines: 2, softWrap: false), RaisedButton( child: Text('Connect'), onPressed: connect), ], ), - Row( + Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - Text('auth: $authValue'), + Text('auth: $authValue', overflow: TextOverflow.clip, maxLines: 2, softWrap: false), RaisedButton(child: Text('Auth'), onPressed: auth), ], ), - Row( + Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - Text('cancel: $cancelValue'), + Text('cancel: $cancelValue', overflow: TextOverflow.clip, maxLines: 2, softWrap: false), RaisedButton(child: Text('Cancel'), onPressed: cancel), ], ), - Row( + Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - Text('shutdown: $shutdownValue'), + Text('shutdown: $shutdownValue', overflow: TextOverflow.clip, maxLines: 2, softWrap: false), RaisedButton( child: Text('Shutdown'), onPressed: shutdown), ], ), - Row( + Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - Text('transaction: $transactionValue'), + Text('transaction: $transactionValue', overflow: TextOverflow.clip, maxLines: 2, softWrap: false), RaisedButton( child: Text('Transaction'), onPressed: transaction), ], ), - Row( + Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - Text('get: $getValue'), + Text('get: $getValue', overflow: TextOverflow.clip, maxLines: 2, softWrap: false), RaisedButton( child: Text('Get'), onPressed: get), ], ), - Row( + Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - Text('error: $errorValue'), + Text('error: $errorValue', overflow: TextOverflow.clip, maxLines: 2, softWrap: false), RaisedButton( child: Text('Error'), onPressed: error), ], ), - Text('pay: $payValue'), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Text('error: $closeDayValue', overflow: TextOverflow.clip, maxLines: 2, softWrap: false), + RaisedButton( + child: Text('CloseDay'), onPressed: closeDay), + ], + ), + Text('pay: $payValue', overflow: TextOverflow.clip, maxLines: 2, softWrap: false), RaisedButton(child: Text('Payment'), onPressed: pay), ], ), diff --git a/lib/views/history/history_view.dart b/lib/views/history/history_view.dart index a1635a7..e49359c 100644 --- a/lib/views/history/history_view.dart +++ b/lib/views/history/history_view.dart @@ -1,5 +1,9 @@ +import 'dart:convert'; + import 'package:aman_kassa_flutter/core/entity/Voucher.dart'; import 'package:aman_kassa_flutter/core/locator.dart'; +import 'package:aman_kassa_flutter/core/models/card_data.dart'; +import 'package:aman_kassa_flutter/core/models/check_data.dart'; import 'package:aman_kassa_flutter/core/route_names.dart'; import 'package:aman_kassa_flutter/core/services/DbService.dart'; import 'package:aman_kassa_flutter/core/services/navigator_service.dart'; @@ -62,6 +66,8 @@ class _HistoryViewState extends State { }, itemBuilder: (BuildContext context, int index) { Voucher voucher = data[index]; + CheckData checkData = CheckData.fromJson(json.decode(voucher.data)); + CardData cardData = checkData.cardData; return ListTile( onTap: () { _navigatorService.push(ImageShowRoute, @@ -71,7 +77,13 @@ class _HistoryViewState extends State { url: voucher.url)); }, title: buildText(voucher), - subtitle: Text(dateFormat.format(voucher.dateTime)), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(dateFormat.format(voucher.dateTime)), + cardData != null ? Text('№ ${cardData.cardNumber} exp: ${cardData.cardExpiryDate}') : Text(''), + ], + ), trailing: Icon(Icons.arrow_right), leading: voucher.type == VoucherTypePayment ? Icon( diff --git a/lib/views/home/components/popup_menu.dart b/lib/views/home/components/popup_menu.dart index f7dfb94..bf0b879 100644 --- a/lib/views/home/components/popup_menu.dart +++ b/lib/views/home/components/popup_menu.dart @@ -30,8 +30,8 @@ class _PopupMenuState extends State { List _choices = [ const Choice(title: 'Информация о ККМ', icon: Icons.info_outline, command: 'infokkm'), - //if (version >= 24 ) - // const Choice(title: 'Bank', icon: Icons.text_fields, command: 'bank'), + if (version >= 24 ) + const Choice(title: 'Bank', icon: Icons.text_fields, command: 'bank'), if (version >= 24 ) const Choice(title: 'Настройка Tap2Phone', icon: MdiIcons.nfc, command: 'tap2phone'), const Choice(title: 'Выйти', icon: Icons.exit_to_app, command: 'exit') diff --git a/lib/views/payment_nfc/payment_nfc_view.dart b/lib/views/payment_nfc/payment_nfc_view.dart index 62adc5d..6eb6b3e 100644 --- a/lib/views/payment_nfc/payment_nfc_view.dart +++ b/lib/views/payment_nfc/payment_nfc_view.dart @@ -2,6 +2,7 @@ import 'package:aman_kassa_flutter/core/locator.dart'; import 'package:aman_kassa_flutter/core/logger.dart'; import 'package:aman_kassa_flutter/core/models/aman_dao.dart'; import 'package:aman_kassa_flutter/core/models/calc_model.dart'; +import 'package:aman_kassa_flutter/core/models/card_data.dart'; import 'package:aman_kassa_flutter/core/models/product_dao.dart'; import 'package:aman_kassa_flutter/core/models/response.dart'; import 'package:aman_kassa_flutter/core/route_names.dart'; @@ -168,7 +169,7 @@ class _PaymentNfcViewState extends State { }); //check - pressPayment('card'); + pressPayment('card' , payDao.data); } cancel() async { @@ -176,7 +177,7 @@ class _PaymentNfcViewState extends State { _navigatorService.pop(); } - pressPayment(String type) async { + pressPayment(String type, dynamic cardDataDynamic) async { setState(() { isBusy = true; }); @@ -189,6 +190,8 @@ class _PaymentNfcViewState extends State { if (_mode == SettingModeCalc) { _tradeType = SettingTradeTypeGood; } + CardData cardData = cardDataDynamic != null ? CardData.fromJson(cardDataDynamic) : null; + List kassaItems = _state.kassaState.kassaItems; List calcItems = _state.calcState.calcItems; Response response = await _dataService.sellOrReturn( @@ -198,7 +201,9 @@ class _PaymentNfcViewState extends State { operationType: widget.model.operationType, tradeType: _tradeType, calcItems: calcItems, - mode: _mode); + mode: _mode, + cardData: cardData + ); setState(() { isBusy = false; });