clean bank

backend_nfc
suvaissov 2021-03-30 13:45:21 +06:00
commit 6d385d16e8
98 changed files with 2005 additions and 7803 deletions

View File

@ -34,7 +34,7 @@ if (keystorePropertiesFile.exists()) {
android {
compileSdkVersion 29
compileSdkVersion 30
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
@ -47,7 +47,7 @@ android {
defaultConfig {
applicationId "kz.com.aman.kassa"
minSdkVersion 21
targetSdkVersion 29
targetSdkVersion 30
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
multiDexEnabled true
@ -63,9 +63,9 @@ android {
}
}
buildTypes {
all {
buildConfigField ("String[]", "SUPPORTED_DEVICES", collectSupportedDevicesToArray())
}
// all {
// buildConfigField ("String[]", "SUPPORTED_DEVICES", collectSupportedDevicesToArray())
// }
debug {
shrinkResources false
minifyEnabled false
@ -116,37 +116,13 @@ dependencies {
implementation 'com.android.support:multidex:1.0.3'
//m4bank dependencies
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation deps.zlibrary
implementation deps.hardware.atol.values() //todo need delete this package
implementation deps.hardware.terminalCommon.values()
implementation deps.hardware.softpos.softpaylibrary
implementation deps.hardware.softpos.softpay_dependencies
//Implementation okhhtp library
implementation deps.okhttp.values()
//Implementation retrofit library
implementation deps.retrofit.values()
//Implementation rxJava library
implementation deps.rx.values()
//Implementation logback
implementation deps.logback.core
implementation(deps.logback.classic) {
exclude group: 'com.google.android', module: 'android'
}
//Implementation other libraries
implementation deps.timber
implementation deps.paperdb
implementation deps.greendao
implementation deps.retro_stream
implementation deps.websockets // Only for useWebsockets parameter
}
def collectSupportedDevicesToArray() {
return '{' + rootProject.ext."supportedDevices${getProject().name}".collect {
"\"${it}\""
}.join(",") + '}'
}
//def collectSupportedDevicesToArray() {
// return '{' + rootProject.ext."supportedDevices${getProject().name}".collect {
// "\"${it}\""
// }.join(",") + '}'
//}

View File

@ -1,65 +0,0 @@
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());
}
}

View File

@ -1,174 +0,0 @@
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<Result> {
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) {
}
}

View File

@ -1,42 +0,0 @@
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());
}
}

View File

@ -1,463 +0,0 @@
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<Result> {
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<String> deviceList) {
Timber.d("onDeviceToConnectSelectionRequested");
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<String> 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<Reader> deviceList) {
Timber.d("onDeviceToUseSelectionRequested");
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<Reader> 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<GoodsData> 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<String, String> 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<PrinterErrorData, PrinterBaseData> 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<String> 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<ApplicationIdConv> list) {
Timber.d("onRequiredApplicationSelection");
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose application identifier");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<ApplicationIdConv> 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);
}
}

View File

@ -1,215 +0,0 @@
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<Result> {
private final M4BankActivity activity;
private CustomKeyBoardDilalog customKeyBoardDilalog;
public CardReadingCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
customKeyBoardDilalog = new CustomKeyBoardDilalog();
}
@Override
public void onDeviceToConnectSelectionRequested(List<String> deviceList) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<String> 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<Reader> deviceList) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<Reader> 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<ApplicationIdConv> applicationOfList) {
// activity.runOnUiThread(() -> {
// AlertDialog.Builder builder = new AlertDialog.Builder(activity);
// builder.setTitle("Choose application identifier");
//
// Spinner deviceListSpinner = new Spinner(activity);
// ArrayAdapter<String> 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();
// });
}
}

View File

@ -1,334 +0,0 @@
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<Result>, GetTransactionsListCallbackHandler<Result> {
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<Reader> deviceList) {
Timber.d("onDeviceToUseSelectionRequested");
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<Reader> 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<String> deviceList) {
Timber.d("onDeviceToConnectSelectionRequested");
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<String> 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<ApplicationIdConv> 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<PrinterErrorData, PrinterBaseData> 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<String> 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<Transaction> transactionList) {
Timber.d("onTransactionsListReceived");
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> 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");
}
}

View File

@ -1,186 +0,0 @@
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<Result> {
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<GoodsData> 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) {
}
}

View File

@ -1,24 +0,0 @@
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());
}
}

View File

@ -1,54 +0,0 @@
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<Result> {
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<Transaction> transactionList, List<CloseDayResponseInfo> 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());
}
}

View File

@ -1,21 +0,0 @@
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);
});
}
}

View File

@ -1,81 +0,0 @@
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);
}
}

View File

@ -1,40 +0,0 @@
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();
}
}

View File

@ -1,144 +0,0 @@
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();
}
}

View File

@ -1,29 +0,0 @@
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;
}
}

View File

@ -1,152 +0,0 @@
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<Result>, GetTransactionsListCallbackHandler<Result> {
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<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> 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<PrinterErrorData, PrinterBaseData> printerErrorDataPrinterBaseDataPrinterResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onPrinterToUseSelectionRequested(List<String> printerList) {
}
}

View File

@ -1,363 +0,0 @@
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<Result>, GetTransactionsListCallbackHandler<Result> {
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<String> 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<ApplicationIdConv> 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<PrinterErrorData, PrinterBaseData> 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<Reader> 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<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> 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<Transaction> 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));
}
}

View File

@ -1,152 +0,0 @@
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<Result>, GetTransactionsListCallbackHandler<Result> {
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<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> 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<PrinterErrorData, PrinterBaseData> printerErrorDataPrinterBaseDataPrinterResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onPrinterToUseSelectionRequested(List<String> printerList) {
}
}

View File

@ -1,157 +0,0 @@
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<Result>, GetTransactionsListCallbackHandler<Result> {
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<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> 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<PrinterErrorData, PrinterBaseData> printerErrorDataPrinterBaseDataPrinterResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onPrinterToUseSelectionRequested(List<String> printerList) {
}
@Override
public void onPreviewTransactionDataReceived(TransactionData transactionData) {
}
}

View File

@ -1,176 +0,0 @@
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<Result>, GetTransactionsListCallbackHandler<Result> {
private final M4BankActivity activity;
private Transaction transaction;
public EasyReversalCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onTransactionSelectionRequested(List<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> 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<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> 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<PrinterErrorData, PrinterBaseData> printerErrorDataPrinterBaseDataPrinterResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onPrinterToUseSelectionRequested(List<String> list) {
}
}

View File

@ -1,136 +0,0 @@
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());
}
}

View File

@ -1,173 +0,0 @@
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<Result> {
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) {
}
}

View File

@ -1,64 +0,0 @@
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<Reader> deviceList) {
}
@Override
public void notAuthorized() {
}
@Override
public void onDeviceToConnectSelectionRequested(List<String> 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() {
}
}

View File

@ -1,34 +0,0 @@
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<Result> {
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());
}
}

View File

@ -1,38 +0,0 @@
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<Result> {
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<MerchantUser> 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());
}
}

View File

@ -1,84 +0,0 @@
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<Result>, GetTransactionsListCallbackHandler<Result> {
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<Transaction> transactionList) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> 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());
}
}

View File

@ -1,62 +0,0 @@
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<Result>, GetTransactionsListCallbackHandler<Result> {
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<Transaction> 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());
}
}

View File

@ -1,133 +0,0 @@
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<Result> {
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<String> deviceList) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<String> 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<Reader> deviceList) {
activity.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(activity);
ArrayAdapter<Reader> 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();
});
}
}
}

View File

@ -1,29 +0,0 @@
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());
}
}

View File

@ -1,833 +0,0 @@
package kz.com.aman.kassa.bank;
import android.app.AlertDialog;
import android.graphics.BitmapFactory;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.text.format.Formatter;
import android.view.View;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.annotation.NonNull;
import org.slf4j.LoggerFactory;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.android.LogcatAppender;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import io.flutter.app.FlutterActivity;
import kz.com.aman.kassa.R;
import kz.com.aman.kassa.bank.builders.SslConfigurationBuilder;
import kz.com.aman.kassa.bank.gui.SelectDialogCallback;
import kz.com.aman.kassa.bank.gui.SelectElementDialog;
import kz.com.aman.kassa.bank.managing.PreferencesManager;
import kz.com.aman.kassa.bank.permissions.PermissionsManager;
import kz.com.aman.kassa.bank.permissions.PermissionsManagerImpl;
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.ActivationCallbackHandler;
import ru.m4bank.mpos.library.external.authorization.AuthorizationCallbackHandler;
import ru.m4bank.mpos.library.external.authorization.GetMerchantUsersCallbackHandler;
import ru.m4bank.mpos.library.external.authorization.LogOutCallbackHandler;
import ru.m4bank.mpos.library.external.configuration.CheckConnectionCallbackHandler;
import ru.m4bank.mpos.library.external.configuration.GetLicenseCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.CardReadingCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.CashPaymentCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.EasyCardRefundCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.EasyCashRefundCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.EasyReversalSavedOperationCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.GetCardReaderInformationCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.GetTransactionDetailsCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.GetTransactionsListCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.LastReversalCardPaymentCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.ResendReceiptCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.ReversalCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.ScanBarCodeCallbackHandler;
import ru.m4bank.mpos.library.external.transactions.XReportCallbackHandler;
import ru.m4bank.mpos.service.commons.data.ConfigurationSettings;
import ru.m4bank.mpos.service.commons.data.NetworkConfiguration;
import ru.m4bank.mpos.service.commons.data.TerminalConfiguration;
import ru.m4bank.mpos.service.configuration.data.RegisterRequestData;
import ru.m4bank.mpos.service.data.dictionary.DictionaryCore;
import ru.m4bank.mpos.service.data.dictionary.LanguageCore;
import ru.m4bank.mpos.service.data.dictionary.MessageCore;
import ru.m4bank.mpos.service.data.dynamic.objects.GetOperationType;
import ru.m4bank.mpos.service.data.dynamic.objects.OperationType;
import ru.m4bank.mpos.service.data.dynamic.objects.PIDataType;
import ru.m4bank.mpos.service.data.dynamic.objects.ScanBarCodeScreenDataInput;
import ru.m4bank.mpos.service.data.dynamic.objects.TransactionFilterData;
import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.TransactionTypeConv;
import ru.m4bank.mpos.service.hardware.network.external.TerminalKeyType;
import ru.m4bank.mpos.service.hardware.printer.dto.data.PrinterSeries;
import ru.m4bank.mpos.service.hardware.printer.dto.data.PrintingType;
import ru.m4bank.mpos.service.hardware.printer.dto.data.enums.SlipType;
import ru.m4bank.mpos.service.hardware.printer.dto.template.Align;
import ru.m4bank.mpos.service.hardware.printer.dto.template.BarcodeCheckObject;
import ru.m4bank.mpos.service.hardware.printer.dto.template.ImageCheckObject;
import ru.m4bank.mpos.service.hardware.printer.dto.template.PrintingTemplate;
import ru.m4bank.mpos.service.hardware.printer.dto.template.QRCodeCheckObject;
import ru.m4bank.mpos.service.hardware.printer.dto.template.StringCheckObject;
import ru.m4bank.mpos.service.hardware.printer.dto.template.StringSpan;
import ru.m4bank.mpos.service.hardware.printer.dto.template.TextStyle;
import ru.m4bank.mpos.service.network.Format;
import ru.m4bank.mpos.service.network.ServerChoose;
import ru.m4bank.mpos.service.transactions.data.VirtualPinKeyboardData;
import ru.m4bank.mpos.service.transactions.data.external.ExternalTemplateData;
import timber.log.Timber;
public class M4BankActivity extends FlutterActivity {
private M4BankMposClientInterfaceFacade clientInterface;
private AuthorizationCallbackHandler authorizationCallbackHandler;
private LogOutCallbackHandler logOutCallbackHandler;
private CheckConnectionCallbackHandler checkConnectionCallbackHandler;
private CardPaymentCallbackHandlerImpl cardPaymentCallbackHandler;
private CardReadingCallbackHandler cardReadingCallbackHandler;
private CashPaymentCallbackHandler cashPaymentCallbackHandler;
private AlipayPaymentCallbackHandlerImpl alipayPaymentCallbackHandler;
private EcomPaymentCallbackHandlerImpl ecomPaymentCallbackHandler;
private EasyCardRefundCallbackHandler cardRefundCallbackHandler;
private EasyCashRefundCallbackHandler easyCashRefundCallbackHandler;
private EasyAlipayRefundCallbackHandlerImpl easyAlipayRefundCallbackHandler;
private EasyEcomRefundCallbackHandlerImpl easyEcomRefundCallbackHandler;
private ReversalCallbackHandler easyReversalCallbackHandler;
private GetMerchantUsersCallbackHandler getMerchantUsersCallbackHandler;
private ActivationCallbackHandler activationCallbackHandler;
private GetLicenseCallbackHandler getLicenseCallbackHandler;
private ResendReceiptCallbackHandler resendReceiptCallbackHandler;
private GetTransactionDetailsCallbackHandler getTransactionDetailsCallbackHandler;
private PrintingCallbackHandlerImpl printingCallbackHandler;
private XReportCallbackHandler xReportCallbackHandler;
private LastReversalCardPaymentCallbackHandler revertCurrentOperationCallbackHandler;
private GetCardReaderInformationCallbackHandler getCardReaderInformationCallbackHandler;
private EasyReversalSavedOperationCallbackHandler easyReversalSavedOperationCallbackHandler;
private GetTransactionListForRefundCallbackHandlerImpl getTransactionListForRefundCallbackHandler;
private SendRegisterRequestCallbackHandlerImpl sendRegisterRequestCallbackHandler;
private EasyCardReversalCallbackHandlerImpl easyCardReversalCallbackHandler;
private CloseDayCallbackHandlerImpl closeDayCallbackHandler;
private LoadTerminalKeysCallbackHandlerImpl loadTerminalKeysCallbackHandler;
private ScanBarCodeCallbackHandler scanBarCodeCallbackHandler;
public M4BankMposClientInterfaceFacade getClientInterface() {
return clientInterface;
}
private LogcatAppender appender;
private String login;
private String password;
private PermissionsManager permissionsManager;
public String getLogin() {
return login;
}
public String getPassword() {
return password;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Timber.plant(new Timber.DebugTree());
setContentView(R.layout.activity_main);
new Handler();
PermissionsManager.PermissionsCheckResultHandler permissionsCheckResultHandler =
new PermissionsManager.PermissionsCheckResultHandler() {
@Override
public void onPermissionsGranted() {
init();
}
@Override
public void onPermissionsDeclined() {
Toast.makeText(M4BankActivity.this,
"Application can work incorrectly caused by missing permissions", Toast.LENGTH_SHORT)
.show();
init();
}
};
permissionsManager = new PermissionsManagerImpl(this);
permissionsManager.checkPermissions(permissionsCheckResultHandler);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[],
@NonNull int[] grantResults) {
permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
private void init() {
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(lc);
encoder.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
encoder.start();
appender = new LogcatAppender();
appender.setContext(lc);
appender.setEncoder(encoder);
appender.start();
//слушатель активации
activationCallbackHandler = new ActivationCallbackHandlerImpl(this);
//слушатель авторизации
authorizationCallbackHandler = new AuthorizationCallbackHandlerImpl(this);
//слушатель завершения сессии
logOutCallbackHandler = new LogOutCallbackHandlerImpl(this);
//слушатель проверки коннекта с сервером и получения конфигурационных данных
checkConnectionCallbackHandler = new CheckConnectionCallbackHandlerImpl(this);
//слушатель получения данных карты
cardReadingCallbackHandler = new CardReadingCallbackHandlerImpl(this);
//слушатели для оплат
cardPaymentCallbackHandler = new CardPaymentCallbackHandlerImpl(this);
cashPaymentCallbackHandler = new CashPaymentCallbackHandlerImpl(this);
alipayPaymentCallbackHandler = new AlipayPaymentCallbackHandlerImpl(this);
ecomPaymentCallbackHandler = new EcomPaymentCallbackHandlerImpl(this);
//слушатели для возвратов
cardRefundCallbackHandler = new CardRefundCallbackHandlerImpl(this);
getTransactionListForRefundCallbackHandler = new GetTransactionListForRefundCallbackHandlerImpl(this,
(CardRefundCallbackHandlerImpl) cardRefundCallbackHandler);
easyCashRefundCallbackHandler = new EasyCashRefundCallbackHandlerImpl(this);
easyAlipayRefundCallbackHandler = new EasyAlipayRefundCallbackHandlerImpl(this);
//слушатели для отмен
//слушатель для отмены карточной операции без участия ридера
easyReversalCallbackHandler = new EasyReversalCallbackHandlerImpl(this);
//слушатель для отмены карточной операции с участием ридера
easyCardReversalCallbackHandler = new EasyCardReversalCallbackHandlerImpl(this);
//слушатель для отмены текущей операции, когда данные по транзакции сохранены в кеше и не производилась очистка или новая операция
revertCurrentOperationCallbackHandler = new RevertCurrentOperationCallbackHandlerImpl(this);
//слушатель для записи на терминал ключей
loadTerminalKeysCallbackHandler = new LoadTerminalKeysCallbackHandlerImpl(this);
//слушатель для получения списка мерчантов
getMerchantUsersCallbackHandler = new GetMerchantUsersCallbackHandlerImpl(this);
//слушатель получения лицензии
getLicenseCallbackHandler = new GetLicenseCallbackHandlerImpl(this);
//слушатель повторной отправки чека
resendReceiptCallbackHandler = new ResendReceiptCallbackHandlerImpl(this);
//слушатель получения информации о транзакциях и детальной информации по конкретной операции
getTransactionDetailsCallbackHandler = new GetTransactionDetailsCallbackHandlerImpl(this);
//заявка на mpos
sendRegisterRequestCallbackHandler = new SendRegisterRequestCallbackHandlerImpl(this);
//слушатель закрытия опер дня и сверки с сервером
closeDayCallbackHandler = new CloseDayCallbackHandlerImpl(this);
//слушатели печати
printingCallbackHandler = new PrintingCallbackHandlerImpl(this);
//слушатель для получения серийного номера
getCardReaderInformationCallbackHandler = new GetCardReaderInformationCallbackHandlerImpl(this);
//слушатель для считывания barcode
scanBarCodeCallbackHandler = new ScanBarCodeCallbackHandlerImpl(this);
// слушатель для отмены неуспешной операции, которая сохранена в холдере
easyReversalSavedOperationCallbackHandler = new EasyReversalSavedOperationCallbackHandlerImpl(this);
initLoginForm();
initButton(R.id.readerInformation, v -> getReaderInformation());
initButton(R.id.activate, v -> clientInterface.getAuthorizationManager().activate(activationCallbackHandler));
initButton(R.id.logout,
v -> clientInterface.getAuthorizationManager().logOut(logOutCallbackHandler));
initButton(R.id.checkConnection, v -> clientInterface.getConfigurationManager()
.checkConnection(
checkConnectionCallbackHandler));
initButton(R.id.checkAccess, v -> {
String result;
if (clientInterface.getConfigurationManager()
.isOperationAllowed(
OperationType.getByCode(((Spinner) findViewById(R.id.checkAccessSpinner))
.getSelectedItem()
.toString()))) {
result = "YES";
} else {
result = "NO";
}
Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
});
initButton(R.id.getAccesses, v -> {
StringBuilder result = new StringBuilder();
List<OperationType> availableOperations = clientInterface.getConfigurationManager()
.getAllowedOperationsList();
if (!availableOperations.isEmpty()) {
for (OperationType o : availableOperations) {
result.append(o.getCode()).append("\n");
}
} else {
result.append("No available operations");
}
Toast.makeText(this, result.toString(), Toast.LENGTH_SHORT).show();
});
initButton(R.id.getAccessPaymentInstruments, v -> {
boolean ecom = clientInterface.getConfigurationManager().isPaymentInstrumentsAllowed(PIDataType.ECOM);
boolean alipay =
clientInterface.getConfigurationManager().isPaymentInstrumentsAllowed(PIDataType.ALIPAY_STANDARD);
boolean card =
clientInterface.getConfigurationManager().isPaymentInstrumentsAllowed(PIDataType.CARD_STANDART);
boolean cash = clientInterface.getConfigurationManager().isPaymentInstrumentsAllowed(PIDataType.CASH);
});
initButton(R.id.cancel, v -> clientInterface.cancel());
initButton(R.id.getLicense, v -> {
clientInterface.cancel();
clientInterface.getConfigurationManager().getLicense(getLicenseCallbackHandler);
});
findViewById(R.id.getCommonCardData).setOnClickListener(v -> {
clientInterface.cancel();
clientInterface.getTransactionManager().getCommonCardData(cardReadingCallbackHandler);
});
//////////// вызовы оплат //////////////
initButton(R.id.makeCardPayment, v -> {
clientInterface.cancel();
cardPaymentCallbackHandler.setTransactionTypeConv(TransactionTypeConv.PAYMENT);
clientInterface.getTransactionManager().makeCardPayment(cardPaymentCallbackHandler);
});
initButton(R.id.makeCashPayment, v -> {
clientInterface.cancel();
clientInterface.getTransactionManager().makeCashPayment(cashPaymentCallbackHandler);
});
initButton(R.id.ecomPayment, v -> {
clientInterface.cancel();
clientInterface.getTransactionManager().makeEcomPayment(ecomPaymentCallbackHandler);
});
initButton(R.id.makeAlipayPayment,
v -> clientInterface.getTransactionManager().makeAlipayPayment(alipayPaymentCallbackHandler));
//////////// вызов подтверждения платежа и дисконнекта устройств//////////////
initButton(R.id.completePayment,
v -> clientInterface.getTransactionManager().completeTransaction());
//////////// вызовы отмен - хостовые терминалы//////////////
//////////// вызов отмены текущей транзакции с использованием слушателя оплаты (только во время транзакции)//////////////
initButton(R.id.makeReversalLast, v -> {
cardPaymentCallbackHandler.setTransactionTypeConv(TransactionTypeConv.CANCEL);
clientInterface.getTransactionManager().revertCurrentOperation(revertCurrentOperationCallbackHandler);
});
//////////// вызов отмены текущей транзакции с использованием нового слушателя (только во время транзакции) - хостовые терминалы//////////////
initButton(R.id.makeReversalLastWithCallback, v -> clientInterface.getTransactionManager()
.revertCurrentOperation(
revertCurrentOperationCallbackHandler));
/////////// вызовы отмены по карте//////////////
initButton(R.id.makeEasyCardReversal, v -> {
clientInterface.cancel();
clientInterface.getTransactionManager()
.getTransactionsList(easyCardReversalCallbackHandler, 20, 0, GetOperationType.SHOW, null);
});
/////////// вызовы отмены на сервере//////////////
initButton(R.id.makeEasyReversal, v -> clientInterface.getTransactionManager()
.getTransactionsList(
(GetTransactionsListCallbackHandler) easyReversalCallbackHandler,
20, 0, GetOperationType.SHOW,
null));
//////////// вызовы возвратов //////////////
initButton(R.id.makeCardRefund, v -> {
clientInterface.cancel();
clientInterface.getTransactionManager()
.getTransactionsList(getTransactionListForRefundCallbackHandler, 20, 0,
GetOperationType.SHOW, null);
});
initButton(R.id.makeCashRefund, v -> {
clientInterface.cancel();
clientInterface.getTransactionManager()
.getTransactionsList((GetTransactionsListCallbackHandler) easyCashRefundCallbackHandler, 20,
0, GetOperationType.SHOW, null);
});
initButton(R.id.makeAlipayRefund, v -> clientInterface.getTransactionManager()
.getTransactionsList(
(GetTransactionsListCallbackHandler) easyAlipayRefundCallbackHandler,
20, 0, GetOperationType.SHOW,
null));
//////////// получение списка мерчантов //////////////
initButton(R.id.getMerchantUsers, v -> clientInterface.getAuthorizationManager()
.getMerchantUsers(getMerchantUsersCallbackHandler, 1000,
0));
//////////// повторная отправка чека на почту //////////////
initButton(R.id.resendReceipt, v -> clientInterface.getTransactionManager()
.getTransactionsList(
(GetTransactionsListCallbackHandler) resendReceiptCallbackHandler,
20, 0, GetOperationType.SHOW,
null));
//////////// получение детальной информации о транзакции //////////////
initButton(R.id.getTransactionDetails, v -> clientInterface.getTransactionManager()
.getTransactionsList(
(GetTransactionsListCallbackHandler) getTransactionDetailsCallbackHandler,
20, 0,
GetOperationType.SHOW,
null));
//////////// получение детальной информации о текущей транзакции//////////////
initButton(R.id.getCurrentTransactionDetails,
v -> clientInterface.getTransactionManager().getTransactionDetails(false));
//////////// получение спика транзакций с использованием фильтра //////////////
initButton(R.id.getTransactionListFilter, v -> clientInterface.getTransactionManager()
.getTransactionsList(
(GetTransactionsListCallbackHandler) getTransactionDetailsCallbackHandler,
20, 0, GetOperationType.SEARCH,
new TransactionFilterData.Builder().setScanerCode(
"6354635635736647656").build()));
//////////// отправка данных для регистрации mpos - дополнительный функционал при активации//////////////
findViewById(R.id.sendRegisterRequest).setOnClickListener(v -> {
String url = "https://test.ponkratenko.ru";
clientInterface.getConfigurationManager()
.sendRegisterRequest(sendRegisterRequestCallbackHandler, getRegisterRequestData(), url);
});
//запись на терминал ключей tmk, tpk
findViewById(R.id.writeTerminalKeys).setOnClickListener(v -> {
String url = "https://test.ponkratenko.ru";
Set keysForDynamicUpdate = new HashSet<TerminalKeyType>() {{
add(TerminalKeyType.Tak);
add(TerminalKeyType.Tpk);
}};
clientInterface.getCardReaderManager()
.loadTerminalKeys(new LoadTerminalKeysCallbackHandlerImpl(this), keysForDynamicUpdate);
});
//////////// закрытие смены и сверка с сервером //////////////
initButton(R.id.closeDay,
v -> clientInterface.getTransactionManager().closeDay(closeDayCallbackHandler));
//////////// добавление принтера в систему с возможностью печати во время транзакций //////////////
initButton(R.id.addPrinter, v -> clientInterface.getPrinterManager()
.addNewPrinter(printingCallbackHandler,
PrinterSeries.NEW_PRINTER));
//////////// удаление принтера из системы //////////////
initButton(R.id.deletePrinter,
v -> clientInterface.getPrinterManager().clearSavedPrinterName());
initButton(R.id.printFiscal, v -> {
clientInterface.cancel();
clientInterface.getPrinterManager()
.printFiscalTransactionCheck(printingCallbackHandler, DataCreatorUtils.makeFiscalData());
});
initButton(R.id.printSlipCheck, v -> {
clientInterface.cancel();
clientInterface.getPrinterManager()
.printFirstSlipTransactionCheck(printingCallbackHandler, DataCreatorUtils.makeSlipData(true),
SlipType.ERROR);
});
initButton(R.id.printReportX, v1 -> {
clientInterface.cancel();
clientInterface.getPrinterManager().printReport(printingCallbackHandler, PrintingType.X_REPORT);
});
initButton(R.id.printReportZ, v2 -> {
clientInterface.cancel();
clientInterface.getPrinterManager().printReport(printingCallbackHandler, PrintingType.Z_REPORT);
});
initButton(R.id.printFullReport, v1 -> {
clientInterface.cancel();
xReportCallbackHandler =
new XReportCallbackHandlerImpl(clientInterface, PrintingType.RECONCILIATION_FULL_REPORT, this);
clientInterface.getPrinterManager().xReport(xReportCallbackHandler);
});
initButton(R.id.printShortReport, v2 -> {
clientInterface.cancel();
xReportCallbackHandler =
new XReportCallbackHandlerImpl(clientInterface, PrintingType.RECONCILIATION_SHORT_REPORT, this);
clientInterface.getPrinterManager().xReport(xReportCallbackHandler);
});
initButton(R.id.printTemplate, v -> {
clientInterface.cancel();
clientInterface.getPrinterManager().printTemplate(printingCallbackHandler,
new ExternalTemplateData.Builder().printingTemplate(buildPrintingTemplate()).build());
});
initButton(R.id.readBarCode, v2 -> showDialogScanner());
findViewById(R.id.versionStore).setOnClickListener(v -> {
String result = clientInterface.getExternalApiManager().getExternalStoreVersion();
Toast.makeText(this, result + "", Toast.LENGTH_SHORT).show();
});
findViewById(R.id.versionTracker).setOnClickListener(v -> {
String result = clientInterface.getExternalApiManager().getExternalTrackerVersion();
Toast.makeText(this, result + "", Toast.LENGTH_SHORT).show();
});
String savedServerUrl = PreferencesManager.loadStringField(this, PreferencesManager.Field.SERVER_URL,
getString(R.string.default_server_address_mpos_5_0_test));
String serverUrl;
if (savedServerUrl != null) {
serverUrl = savedServerUrl;
} else {
serverUrl = getString(R.string.default_server_address_mpos_5_0_test);
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Choose server");
EditText serverAddressForm = new EditText(this);
serverAddressForm.setText(serverUrl);
builder.setView(serverAddressForm);
builder.setPositiveButton("OK", (dialog, which) -> {
String model1 = Build.MODEL;
String brand2 = Build.BRAND;
String serverAddress = serverAddressForm.getText().toString();
PreferencesManager.saveStringField(M4BankActivity.this, PreferencesManager.Field.SERVER_URL, serverAddress);
clientInterface = M4BankMposClient.getInstance(
new M4BankMposParameters(
Format.JSON,
"rus",
null,
this,
new SessionExpiringCallbackHandlerImpl(),
"appName",
ServerChoose.API_5_0,
new ConfigurationSettings
.Builder()
.printerUsed(true)
.umkaEnabled(true)
.networkConfiguration(createNetworkConfiguration(serverAddress))
.terminalConfiguration(createTerminalConfiguration())
.build())
);
dialog.dismiss();
});
builder.create().show();
//Создание словаря
DictionaryCore aisinoDictionary =
new DictionaryCore(new HashMap<LanguageCore, HashMap<MessageCore, String>>() {{
put(LanguageCore.English, new HashMap<MessageCore, String>() {{
put(MessageCore.AisinoA90OfflinePin, "Please enter offline PIN");
put(MessageCore.AisinoA90OfflinePinRemain1, "Please enter offline PIN (Last try)");
put(MessageCore.AisinoA90OfflinePinRemain2, "Please enter offline PIN (Remain: 2)");
put(MessageCore.AisinoA90OfflinePinRemain3, "Please enter offline PIN (Remain: 3)");
put(MessageCore.AisinoA90OfflinePinRemain4, "Please enter offline PIN (Remain: 4)");
put(MessageCore.AisinoA90OnlinePin, "Please enter online PIN");
put(MessageCore.AisinoA90CompletingTransaction, "");
put(MessageCore.AisinoA90ContactlessMessage, "Please tap card");
put(MessageCore.AisinoA90ContactMessage, "Please insert card");
put(MessageCore.AisinoA90ReadSuccess, "PROCESSING");
put(MessageCore.AisinoA90InputPWD, "enter pin");
put(MessageCore.AisinoA90DefaultBottomButtonsText, "Cancel Clear Done");
put(MessageCore.AisinoPinpadCompleted, "COMPLETED");
put(MessageCore.AisinoPinpadDeclined, "DECLINED");
put(MessageCore.AisinoPinpadAmountHint, "");
put(MessageCore.KztCurrency, "KZT");
put(MessageCore.BynCurrency, "BYN");
put(MessageCore.EurCurrency, "EUR");
put(MessageCore.GelCurrency, "GEL");
put(MessageCore.JpyCurrency, "JPY");
put(MessageCore.KwdCurrency, "KWD");
put(MessageCore.RubCurrency, "RUB");
put(MessageCore.UsdCurrency, "USD");
put(MessageCore.AisinoPinpadScanning, "Text for test");
put(MessageCore.AisinoPinpadScanningCompleted, "Success for test");
}});
put(LanguageCore.Russian, new HashMap<MessageCore, String>() {{
put(MessageCore.AisinoA90OfflinePin, "Введите ПИН");
put(MessageCore.AisinoA90OfflinePinRemain1, "ПИН (Последняя попытка)");
put(MessageCore.AisinoA90OfflinePinRemain2, "ПИН (Осталось попыток: 2)");
put(MessageCore.AisinoA90OfflinePinRemain3, "ПИН (Осталось попыток: 3)");
put(MessageCore.AisinoA90OfflinePinRemain4, "ПИН (Осталось попыток: 4)");
put(MessageCore.AisinoA90OnlinePin, "Введите ПИН");
put(MessageCore.AisinoA90CompletingTransaction, "");
put(MessageCore.AisinoA90ContactlessMessage, "Предъявите карту");
put(MessageCore.AisinoA90ContactMessage, "Предъявите карту");
put(MessageCore.AisinoA90ReadSuccess, "ОБРАБОТКА");
put(MessageCore.AisinoA90InputPWD, "введите пин");
put(MessageCore.AisinoA90DefaultBottomButtonsText, "Отмена Очистить Готово");
put(MessageCore.AisinoPinpadCompleted, "ОДОБРЕНО");
put(MessageCore.AisinoPinpadDeclined, "ОТКЛОНЕНО");
put(MessageCore.AisinoPinpadAmountHint, "");
put(MessageCore.KztCurrency, "KZT");
put(MessageCore.BynCurrency, "BYN");
put(MessageCore.EurCurrency, "EUR");
put(MessageCore.GelCurrency, "GEL");
put(MessageCore.JpyCurrency, "JPY");
put(MessageCore.KwdCurrency, "KWD");
put(MessageCore.RubCurrency, "RUB");
put(MessageCore.UsdCurrency, "USD");
put(MessageCore.AisinoPinpadScanning, "Скан...");
put(MessageCore.AisinoPinpadScanningCompleted, "Успешно");
}});
}});
//обновление словаря в библиотеке ридера
initButton(R.id.updateDictionary, v -> updateDictionary(aisinoDictionary));
// отмена неуспешной операции, которая сохранена в холдере
initButton(R.id.makeReversalSavedUnsuccessfulOperation, v ->
clientInterface.getTransactionManager()
.makeReversalSavedUnsuccessfulOperation(easyReversalSavedOperationCallbackHandler));
}
private void initButton(int id, View.OnClickListener onClickListener) {
findViewById(id).setOnClickListener(onClickListener);
}
private void initLoginForm() {
EditText loginField = findViewById(R.id.login);
EditText passwordField = findViewById(R.id.password);
loginField.setText(
PreferencesManager.loadStringField(M4BankActivity.this, PreferencesManager.Field.LOGIN, login));
passwordField.setText(
PreferencesManager.loadStringField(M4BankActivity.this, PreferencesManager.Field.PASSWORD, password));
initButton(R.id.authorize, v -> {
login = loginField.getText().toString();
password = passwordField.getText().toString();
PreferencesManager.saveStringField(M4BankActivity.this, PreferencesManager.Field.LOGIN, login);
PreferencesManager.saveStringField(M4BankActivity.this, PreferencesManager.Field.PASSWORD, password);
clientInterface.getAuthorizationManager().authorize(authorizationCallbackHandler);
});
}
private TerminalConfiguration createTerminalConfiguration() {
return new TerminalConfiguration.Builder()
.energySaverModeTime(150)
.pinLengthsArray(new byte[]{4, 6})
.shutDownModeTime(300)
.deviceType(new DeviceTypeDefiner().define())
.build();
}
private NetworkConfiguration createNetworkConfiguration(String serverUrl) {
return new NetworkConfiguration.Builder()
.sslConfiguration(SslConfigurationBuilder.buildAllTrustConfiguration(serverUrl))
.serverUrl(serverUrl)
.build();
}
private void showDialogScanner() {
String[] listItems = {"custom", "default"};
AlertDialog.Builder builder = new AlertDialog.Builder(M4BankActivity.this);
builder.setTitle("Choose scanner:");
builder.setItems(listItems, (dialog, which) -> showScanner(which));
AlertDialog dialog = builder.create();
dialog.show();
}
private void showScanner(int which) {
boolean isCustom;
if (which == 0) {
isCustom = true;
} else {
isCustom = false;
}
clientInterface.getCardReaderManager().scanBarCode(scanBarCodeCallbackHandler,
new ScanBarCodeScreenDataInput.Builder()
.setShowCustom(isCustom)
.setShowNextButton("true")
.setNextButtonText("Next button")
.setNextButtonTextColor("#999888")
.setNextButtonTextSize("20")
.setTitleBarText("Qr Scanner")
.setTitleTextSize("20")
.setTitleTextColor("#123456")
.setTitleColor("#987123")
.setDescriptionText("Описание")
.setDescriptionTextColor("#564637")
.setDescriptionTextSize("20")
.setScanHeight("200")
.setScanWidth("600")
.setSummText("2000")
.setSummColor("#666777")
.setSummSize("20")
.build());
}
private void updateDictionary(DictionaryCore dictionaryCore) {
clientInterface.getConfigurationManager().updateDictionary(dictionaryCore);
}
private void getReaderInformation() {
clientInterface.getCardReaderManager().getCardReaderInformation(getCardReaderInformationCallbackHandler);
}
@Override
protected void onStart() {
super.onStart();
//
// ((EditText) findViewById(R.id.code)).setText("roam");
//// ((EditText) findViewById(R.id.code)).setText("201");
// ((EditText) findViewById(R.id.pin)).setText("1111");
//// ((EditText) findViewById(R.id.login)).setText("61");
//// ((EditText) findViewById(R.id.login)).setText("test2");
//// ((EditText) findViewById(R.id.login)).setText("dm@centercorptech.net");
// ((EditText) findViewById(R.id.login)).setText("ap@m4bank.com");
//// ((EditText) findViewById(R.id.password)).setText("qwer");
// ((EditText) findViewById(R.id.password)).setText("1111");
//// ((EditText) findViewById(R.id.password)).setText("1111");
}
@Override
protected void onDestroy() {
Timber.d("Shutdown");
if (clientInterface != null) {
clientInterface.shutdown();
}
super.onDestroy();
}
private RegisterRequestData getRegisterRequestData() {
String code = "1" + (int) (Math.random() * 1000) + "" + (int) (Math.random() * 1000) + "" +
(int) (Math.random() * 1000);
String date = new SimpleDateFormat("yyyy-MM-dd H:m:s").format(new Date());
String acquiringType = "mPOS";
String ip = "169.254.10.10";
try {
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
} catch (Exception e) {
e.printStackTrace();
}
RegisterRequestData result = new RegisterRequestData(code, date, acquiringType, ip);
result.setWebSite("http://fgfdgsfgsd.ru");
result.setRegion("г. Москва");
result.setCity("Moscow");
result.setOrganizationName("AlexCorp");
result.setInn("5785678");
result.setIndustry("dghdfgh");
result.setCellPointsCount("44");
result.setContactName("Alex");
result.setEmail("Alex@alex.com");
result.setPhone("+79859999999");
result.setUsingCard(true);
result.setAgreement(true);
return result;
}
public long getAmount() {
long amount;
try {
amount = Long.parseLong(((EditText) findViewById(R.id.amountField)).getText().toString());
} catch (Exception any) {
amount = 1;
}
return amount;
}
public HashMap<String, Object> getStyle(String style) {
HashMap<String, Object> style1 = new HashMap<>();
style1.put("TitleBackGroundColor", "#DB3F34");
style1.put("VirtualPinPadStyle", 6);
style1.put("PatternForAmountAndCurrency", "%s $");
style1.put("setBottomBtnText", new String[]{"Cancel", "Clear", "Done"});
HashMap<String, Object> style2 = new HashMap<>();
style2.put("TitleBackGroundColor", "#909090");
style2.put("VirtualPinPadStyle", 7);
style2.put("PatternForAmountAndCurrency", "$ %s");
style2.put("setBottomBtnText", new String[]{"Отмена", "Очистить", "Готово"});
style2.put("amountTextSize", 32);
style2.put("amountTextColor", "#333111");
style2.put("amountTextFont", "sans_serif_bold_italic");
style2.put("messageTextSize", 18);
style2.put("messageTextColor", "#333aaa");
style2.put("messageTextFont", "sans_serif_bold_italic");
style2.put("keyboardNumbersTextColor", "#111ccc");
style2.put("keyboardNumbersTextSize", 24);
style2.put("keyboardNumbersTextFont", "sans_serif_bold_italic");
style2.put("bottomButtonsTextSize", 14);
style2.put("bottomButtonsTextColor", "#ccc666");
style2.put("bottomButtonsTextFont", "sans_serif_bold_italic");
switch (style) {
case "Style 1":
return style1;
case "Style 2":
return style2;
default:
return style1;
}
}
public void showSelectStyleDialog(CardPaymentCallbackHandlerImpl.SelectStyleListener selectStyleListener) {
ArrayList<String> styles = new ArrayList<>();
styles.add("Style 1");
styles.add("Style 2");
runOnUiThread(() ->
new SelectElementDialog<>(M4BankActivity.this, styles, new SelectDialogCallback<String>() {
@Override
public void onElementSelected(String element) {
VirtualPinKeyboardData virtualPinKeyboardData =
new VirtualPinKeyboardData.Builder(getStyle(element)).build();
selectStyleListener.onSelectStyle(virtualPinKeyboardData);
}
@Override
public void onCancelSelection() {
}
}).show()
);
}
private PrintingTemplate buildPrintingTemplate() {
return new PrintingTemplate.Builder()
.append(new BarcodeCheckObject(Align.Center, 100, 300, true, "Hello kitty"))
.append(new StringCheckObject(new StringSpan.Builder("Test short simple string").build()))
.append(new StringCheckObject(new StringSpan.Builder(
"Test long simple string. It's a pretty long string for being more that check with.").build()))
.append(new StringCheckObject(new StringSpan.Builder("Test short italic center string.")
.alignment(Align.Center)
.textStyle(TextStyle.Italic)
.build()))
.append(new StringCheckObject(new StringSpan.Builder("Test bold italic right large font string.")
.alignment(Align.Right)
.fontSize(30)
.textStyle(TextStyle.ItalicBold)
.build()))
.append(new StringCheckObject(new StringSpan.Builder("Test gray left small string.")
.graylevel(5)
.fontSize(15)
.build()))
.append(new QRCodeCheckObject(Align.Center, 100, "Hello kitty"))
.append(new ImageCheckObject(
BitmapFactory.decodeResource(getResources(), android.R.drawable.ic_menu_call)))
.build();
}
}

View File

@ -1,77 +0,0 @@
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<Result, PrinterResult<PrinterErrorData, PrinterBaseData>> {
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());
}
}

View File

@ -1,73 +0,0 @@
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<Transaction> transactionList, boolean closeDay) {
ArrayList<ReconciliationOperationData> reconciliationOperationDataList = new ArrayList<ReconciliationOperationData>();
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;
}
}
}

View File

@ -1,64 +0,0 @@
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<Result>,
GetTransactionsListCallbackHandler<Result> {
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<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> 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());
}
}

View File

@ -1,153 +0,0 @@
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<Result> {
private final M4BankActivity activity;
public ReversalCallbackHandlerImpl(M4BankActivity activity) {
this.activity = activity;
}
@Override
public void onTransactionSelectionRequested(List<Transaction> transactionList) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(activity);
ArrayAdapter<Transaction> 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<PrinterErrorData, PrinterBaseData> printerErrorDataPrinterBaseDataPrinterResult) {
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
}
@Override
public void onNoBoundedPrinterFound() {
}
@Override
public void onPrinterToUseSelectionRequested(List<String> list) {
}
}

View File

@ -1,308 +0,0 @@
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<Result> {
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<String> 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<Reader> 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) {
}
}

View File

@ -1,72 +0,0 @@
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() {
}
}

View File

@ -1,24 +0,0 @@
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());
}
}

View File

@ -1,11 +0,0 @@
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!");
}
}

View File

@ -1,5 +0,0 @@
package kz.com.aman.kassa.bank;
public enum TerminalKeyTypeMpos {
Tmp, Tpk, Tak
}

View File

@ -1,72 +0,0 @@
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<Result> {
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<Transaction> 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);
}
}
}

View File

@ -1,50 +0,0 @@
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;
}
}
}

View File

@ -1,128 +0,0 @@
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;
}
}

View File

@ -1,10 +0,0 @@
package kz.com.aman.kassa.bank.gui;
/**
* Created by pppoo on 27.02.2018.
*/
public interface SelectDialogCallback<ElementType> {
void onElementSelected(ElementType element);
void onCancelSelection();
}

View File

@ -1,66 +0,0 @@
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<ElementType> extends Dialog {
private Context context;
ArrayAdapter<ElementType> listAdapter;
private TextView labelTitle;
private ListView list;
private SelectDialogCallback<ElementType> selectDialogCallback;
public SelectElementDialog(final Context context, List<ElementType> elements, SelectDialogCallback<ElementType> 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<ElementType> elements) {
setContentView(R.layout.custom_dialog_list);
labelTitle = findViewById(R.id.labelMessage);
list = findViewById(R.id.list);
listAdapter = new ArrayAdapter<ElementType>(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();
}
}
}

View File

@ -1,37 +0,0 @@
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);
}
}

View File

@ -1,11 +0,0 @@
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();
}
}

View File

@ -1,65 +0,0 @@
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;
}
}

View File

@ -1,71 +0,0 @@
package kz.com.aman.kassa.handler;
import android.widget.Toast;
import com.google.gson.Gson;
import io.flutter.plugin.common.MethodChannel;
import kz.com.aman.kassa.MainActivity;
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.authorization.AuthorizationCallbackHandler;
import ru.m4bank.mpos.service.authorization.network.AuthorizationResponse;
import ru.m4bank.mpos.service.commons.data.ResultType;
public class AuthorizationHandlerImpl implements AuthorizationCallbackHandler {
private final BankNfcPlugins plugin;
private final String login;
private final String password;
private final MethodChannel.Result result;
private final Gson gson = new Gson();
public AuthorizationHandlerImpl(BankNfcPlugins plugin, MethodChannel.Result result, String login, String password) {
this.plugin = plugin;
this.login = login;
this.password = password;
this.result =result;
}
@Override
public void onLoginAndPasswordRequested() {
plugin.getClientInterface().getAuthorizationManager().sendLoginAndPassword(this.login, this.password);
}
@Override
public void onCompleted(ru.m4bank.mpos.service.result.Result result) {
plugin.getActivity().runOnUiThread(() -> {
//Toast.makeText(plugin.getActivity(), result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT).show();
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(ResultType.SUCCESSFUL.equals(result.getResultType()));
dao.setMsg(result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()));
this.result.success(gson.toJson(dao));
});
}
@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 onCompleted(ru.m4bank.mpos.service.result.Result result, AuthorizationResponse authorizationResponse) {
plugin.getActivity().runOnUiThread(() -> {
//Toast.makeText(plugin.getActivity(), result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT).show();
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(ResultType.SUCCESSFUL.equals(result.getResultType()));
dao.setMsg(result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()));
this.result.success(gson.toJson(dao));
});
}
}

View File

@ -1,526 +0,0 @@
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.HashMap;
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;
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 CardPaymentHandlerImpl implements CardPaymentCallbackHandler<Result> {
private final BankNfcPlugins plugin;
private final MethodChannel.Result result;
private final Long amount;
private CustomKeyBoardDilalog customKeyBoardDilalog;
private TransactionTypeConv transactionTypeConv;
private final Gson gson = new Gson();
public CardPaymentHandlerImpl(BankNfcPlugins plugin, MethodChannel.Result result, long amount, TransactionTypeConv type) {
this.result = result;
this.plugin = plugin;
this.amount = amount;
customKeyBoardDilalog = new CustomKeyBoardDilalog();
transactionTypeConv = type;
}
public CardPaymentHandlerImpl setTransactionTypeConv(TransactionTypeConv transactionTypeConv) {
this.transactionTypeConv = transactionTypeConv;
return this;
}
@Override
public void onDeviceToConnectSelectionRequested(List<String> deviceList) {
System.out.println("----->---->---->onDeviceToConnectSelectionRequested");
plugin.getActivity().runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity());
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(plugin.getActivity());
ArrayAdapter<String> 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);
builder.create().show();
});
}
@Override
public void onCardReaderForTransactionGettingCompleted() {
System.out.println("----->---->---->Reader has been received");
}
@Override
public void onNoBoundedDevicesFound() {
System.out.println("----->---->---->No bounded readers");
}
@Override
public void onDeviceToUseSelectionRequested(List<Reader> deviceList) {
System.out.println("----->---->---->onDeviceToUseSelectionRequested");
plugin.getActivity().runOnUiThread(() -> {
// AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity());
// builder.setTitle("Choose device");
//
// Spinner deviceListSpinner = new Spinner(plugin.getActivity());
// ArrayAdapter<Reader> 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);
// builder.create().show();
if (deviceList != null && !deviceList.isEmpty()) {
for (Reader reader : deviceList) {
String name = reader.toString();
System.out.println("name: " + name);
if (name.contains("SOFT")) {
plugin.getClientInterface()
.getTransactionManager()
.setCardReaderToUse(reader);
break;
}
}
}
});
}
@Override
public void onTransactionAmountRequested() {
System.out.println("----->---->---->onTransactionAmountRequested");
plugin.getClientInterface().getTransactionManager().setTransactionAmount(this.amount);
}
@Override
public void onTransactionDataRequested() {
System.out.println("----->---->---->onTransactionDataRequested");
List<GoodsData> 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<String, String> 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();
plugin.getClientInterface().getTransactionManager().setAdditionalTransactionData(additionalTransactionData);
}
@Override
public void onWorkFlowDataRequested() {
System.out.println("----->---->---->WorkFlow requested");
}
@Override
public void onCompleted(Result result) {
System.out.println("----->---->---->onCompleted");
plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()), Toast.LENGTH_SHORT)
.show());
}
@Override
public void onWrongApiCalled() {
System.out.println("----->---->---->onWrongApiCalled");
plugin.getActivity().runOnUiThread(() -> {
//Toast.makeText(plugin.getActivity(), "Wrong method has been called", Toast.LENGTH_SHORT).show();
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(false);
dao.setMsg("onWrongApiCalled");
this.result.success(gson.toJson(dao));
});
}
@Override
public void onReceiveCardData(OnlineCardDataDto data, boolean shouldConfirmBeManuallyCalled) {
System.out.println("----->---->---->onReceiveCardData");
if (shouldConfirmBeManuallyCalled) {
plugin.getClientInterface().getTransactionManager().processOnlineTransaction(false);
}
}
@Override
public void onTransactionInit() {
//Impossible
plugin.getClientInterface().getTransactionManager().processOnlineTransaction(false);
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
System.out.println("----->---->---->onTransactionExecutionStatusChanged: " + newStatus.name());
plugin.getActivity().runOnUiThread(() -> {
if(newStatus!=null && newStatus.equals(TransactionExecutionStatus.TAP_CARD)) {
Toast.makeText(plugin.getActivity(), "Приложите карту", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) {
if (transactionErrorData.getError() != null) {
plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), transactionErrorData.getError().getDescription(), Toast.LENGTH_LONG).show());
} else {
plugin.getActivity().runOnUiThread(() -> {
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(false);
dao.setMsg(String.format("%s", errorHandler.getFinalDescription()));
this.result.success(gson.toJson(dao));
//Toast.makeText(plugin.getActivity(), String.format("onError: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getFinalDescription()), Toast.LENGTH_LONG).show();
});
}
}
@Override
public void onErrorWithPossibilityToRetry(ErrorHandler errorHandler) {
System.out.printf("----->---->---->onErrorWithPossibilityToRetry: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getDescription());
plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), String.format("onError: %s, description: %s", ((AllError) errorHandler).name(), errorHandler.getFinalDescription()), Toast.LENGTH_LONG).show());
plugin.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction();
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
System.out.println("----->---->---->onTransactionDataReceivedError");
}
@Override
public void onUserInformationRequested(boolean signNeeded) {
System.out.println("----->---->---->onUserInformationRequested");
if (transactionTypeConv != TransactionTypeConv.CANCEL) {
plugin.getClientInterface()
.getTransactionManager()
.sendTransactionUserData("signature", "phone", "vsa@centercorptech.net");
} else {
onTransactionCompleted();
}
}
@Override
public void onTransactionDataReceived(TransactionData data) {
System.out.println("----->---->---->onTransactionDataReceived");
plugin.getActivity().runOnUiThread(() -> {
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());
cardData.setAuthorizationCode(data.getAuthorizationCode());
AmanDao<CardData> dao = new AmanDao<>();
dao.setSuccess(true);
dao.setData(cardData);
this.result.success(gson.toJson(dao));
Toast.makeText(plugin.getActivity(), "Transaction data has been received", Toast.LENGTH_LONG)
.show();
});
}
@Override
public void onTransactionCompleted() {
System.out.println("----->---->---->onTransactionCompleted");
plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "Operation has been successfully completed", Toast.LENGTH_LONG)
.show());
}
@Override
public void onRequiredHostAddress() {
System.out.println("----->---->---->onRequiredHostAddress");
plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "Set Host Address", Toast.LENGTH_LONG)
.show());
plugin.getClientInterface().getTransactionManager().setHostAddress("213.79.122.128", "8011");
}
@Override
public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) {
System.out.println("----->---->---->onDisconnectedEventReceivedOrCanNotEstablishConnection");
if (reconnectAvailable) {
plugin.getActivity().runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity());
builder.setMessage("Connection to cardreader has been lost, try to reconnect and repeat last operation?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> plugin.getClientInterface().tryToReconnectAndRepeatLast());
builder.setNegativeButton("No", (dialog, which) -> plugin.getClientInterface().cancel());
builder.create().show();
});
}
}
@Override
public void onConnectingProcessStarted(String deviceName) {
System.out.printf("----->---->---->Connecting process started: %s\n", deviceName);
}
@Override
public void onReconnectNeededToProcess() {
System.out.println("----->---->---->onReconnectNeededToProcess");
plugin.getActivity().runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity());
builder.setMessage("Connection to cardreader has been lost, try to reconnect and continue?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> plugin.getClientInterface().getTransactionManager().tryToReconnectToCardReader());
builder.setNegativeButton("No", (dialog, which) -> plugin.getClientInterface().cancel());
builder.create().show();
});
}
@Override
public void onReconciliationRequiredToProcess() {
System.out.println("----->---->---->onReconciliationRequiredToProcess");
System.out.println("----->---->---->Reconciliation required!!!");
plugin.getClientInterface().getTransactionManager().makeReconciliationDuringTransaction();
}
@Override
public void onReconciliationCompleted(Result result) {
System.out.println("----->---->---->onReconciliationCompleted");
System.out.println("----->---->---->Reconciliation completed!!!");
if (result.getResultType() == ResultType.SUCCESSFUL) {
plugin.getClientInterface().getTransactionManager().continueTransactionAfterReconciliation();
} else {
plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "Reconciliation failed " + result.getDescription(), Toast.LENGTH_LONG)
.show());
}
}
@Override
public void notAuthorized() {
System.out.println("----->---->---->notAuthorized");
plugin.getActivity().runOnUiThread(() -> {
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(false);
dao.setMsg("notAuthorized");
this.result.success(gson.toJson(dao));
Toast.makeText(plugin.getActivity(), "notAuthorized", Toast.LENGTH_SHORT).show();
});
}
@Override
public void onTransactionDetailsReceived(Transaction transaction) {
System.out.println("----->---->---->onTransactionDetailsReceived");
plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "Transaction details received", Toast.LENGTH_LONG)
.show());
}
@Override
public void onSuccessStatusTransaction(Transaction transaction) {
System.out.println("----->---->---->onSuccessStatusTransaction");
}
@Override
public void onErrorStatusTransaction() {
System.out.println("----->---->---->onErrorStatusTransaction");
}
@Override
public void onRepeat(int attemptNumber) {
System.out.println("----->---->---->onRepeat");
plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "Repeat attempt number " + attemptNumber, Toast.LENGTH_SHORT).show());
}
@Override
public void onRequestedReportZ() {
System.out.println("----->---->---->onRequestedReportZ");
}
@Override
public void onCompletedPrinting(PrinterResult<PrinterErrorData, PrinterBaseData> printerErrorDataPrinterBaseDataPrinterResult) {
System.out.println("----->---->---->onCompletedPrinting");
}
@Override
public void onStatusFiscalModule(FiscalStatusData fiscalStatusData) {
System.out.println("----->---->---->onStatusFiscalModule");
}
@Override
public void onPrinterForRegistrationGettingCompleted() {
System.out.println("----->---->---->onPrinterForRegistrationGettingCompleted");
}
@Override
public void onNoBoundedPrinterFound() {
System.out.println("----->---->---->onNoBoundedPrinterFound");
}
@Override
public void onPrinterToUseSelectionRequested(List<String> printerList) {
System.out.println("----->---->---->onPrinterToUseSelectionRequested");
}
@Override
public void onRequiredReversal(String description, ResultCode resultCode) {
System.out.printf("----->---->---->onRequiredReversal: %s, resultCode: %s\n", description, resultCode.name());
plugin.getActivity().runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity());
builder.setMessage("Revert last of operation?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> plugin.getClientInterface().getTransactionManager().revertCurrentOperation(new RevertCurrentOperationHandlerImpl(plugin)));
builder.setNegativeButton("No", (dialog, which) -> plugin.getClientInterface().getTransactionManager().clearLastTransactionInformation());
builder.create().show();
});
}
@Override
public void onRequiredApplicationSelection(List<ApplicationIdConv> list) {
System.out.println("----->---->---->onRequiredApplicationSelection");
plugin.getActivity().runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity());
builder.setTitle("Choose application identifier");
Spinner deviceListSpinner = new Spinner(plugin.getActivity());
ArrayAdapter<ApplicationIdConv> adapter = new ArrayAdapter<>(plugin.getActivity(), android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
deviceListSpinner.setAdapter(adapter);
builder.setPositiveButton("OK", (dialog, which) -> {
plugin.getClientInterface()
.getTransactionManager()
.setTransactionApplicationIdentifier((ApplicationIdConv) deviceListSpinner.getSelectedItem());
dialog.dismiss();
});
builder.setView(deviceListSpinner);
builder.create().show();
});
}
@Override
public void onActivityUpdateUiThread() {
System.out.println("----->---->---->onActivityUpdateUiThread");
plugin.getClientInterface().getTransactionManager().addPinpadClickListener(plugin.getActivity());
}
@Override
public void onCreatePinPadButtons() {
System.out.println("----->---->---->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) {
System.out.println("----->---->---->onShowPinPadKeyBoard");
customKeyBoardDilalog.setText(messageButtonData);
}
@Override
public void onUpdateElementPin(int count) {
System.out.println("----->---->---->onUpdateElementPin");
plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "count = " + count, Toast.LENGTH_SHORT).show());
}
@Override
public void onCloseKeyboard() {
System.out.println("----->---->---->onCloseKeyboard");
customKeyBoardDilalog.close(plugin.getActivity());
}
@Override
public void onRequiredAdditionalVirtualKeyboardSettings(VirtualKeyboardStyleTypeConv virtualKeyboardStyleTypeConv) {
//TODO FIX
// plugin.getActivity().showSelectStyleDialog(additionalData ->
// plugin.getClientInterface().getTransactionManager().addVirtualPinKeyboardData(additionalData));
}
public interface SelectStyleListener {
void onSelectStyle(VirtualPinKeyboardData virtualPinKeyboardData);
}
}

View File

@ -1,431 +0,0 @@
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.model.AmanDao;
import kz.com.aman.kassa.model.CardData;
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.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.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<Result>, GetTransactionsListCallbackHandler<Result> {
private final BankNfcPlugins plugin;
private final MethodChannel.Result result;
private final Integer transactionNumber;
private String authorizationCode;
private final Gson gson = new Gson();
private Transaction transaction;
private CustomKeyBoardDilalog customKeyBoardDilalog;
public CardRefundAmanHandlerImpl(BankNfcPlugins plugin , MethodChannel.Result result, Integer transactionNumber, String authorizationCode,Transaction transaction) {
this.plugin = plugin;
this.result = result;
this.transactionNumber = transactionNumber;
this.authorizationCode = authorizationCode;
this.transaction = transaction;
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<Reader> deviceList) {
// Timber.d("onDeviceToUseSelectionRequested");
// AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity());
// builder.setTitle("Choose device");
//
// Spinner deviceListSpinner = new Spinner(plugin.getActivity());
// ArrayAdapter<Reader> 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());
System.out.println("----->---->---->onDeviceToUseSelectionRequested");
plugin.getActivity().runOnUiThread(() -> {
if (deviceList != null && !deviceList.isEmpty()) {
for (Reader reader : deviceList) {
String name = reader.toString();
System.out.println("name: " + name);
if (name.contains("SOFT")) {
plugin.getClientInterface()
.getTransactionManager()
.setCardReaderToUse(reader);
break;
}
}
}
});
}
@Override
public void onDeviceToConnectSelectionRequested(List<String> deviceList) {
Timber.d("onDeviceToConnectSelectionRequested");
AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity());
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(plugin.getActivity());
ArrayAdapter<String> 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() {
System.out.println("----->---->---->onWrongApiCalled");
plugin.getActivity().runOnUiThread(() -> {
//Toast.makeText(plugin.getActivity(), "Wrong method has been called", Toast.LENGTH_SHORT).show();
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(false);
dao.setMsg("Данная транзакция уже отменена или ее невозможно отменить через данный функционал");
this.result.success(gson.toJson(dao));
});
}
@Override
public void onReceiveCardData(OnlineCardDataDto data, boolean shouldConfirmBeManuallyCalled) {
System.out.println("----->---->---->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<ApplicationIdConv> list) {
Timber.d("onRequiredApplicationSelection");
}
@Override
public void onTransactionInit() {
}
@Override
public void onTransactionExecutionStatusChanged(TransactionExecutionStatus newStatus) {
System.out.println("----->---->---->onTransactionExecutionStatusChanged: " + newStatus.name());
plugin.getActivity().runOnUiThread(() -> {
if(newStatus!=null && newStatus.equals(TransactionExecutionStatus.TAP_CARD)) {
Toast.makeText(plugin.getActivity(), "Приложите карту", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onError(ErrorHandler errorHandler, TransactionErrorData transactionErrorData) {
if (transactionErrorData.getError() != null) {
plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), transactionErrorData.getError().getDescription(), Toast.LENGTH_LONG).show());
} else {
plugin.getActivity().runOnUiThread(() -> {
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(false);
dao.setMsg(String.format("%s", errorHandler.getFinalDescription()));
this.result.success(gson.toJson(dao));
//Toast.makeText(plugin.getActivity(), 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());
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) {
System.out.println("----->---->---->onTransactionDataReceived");
plugin.getActivity().runOnUiThread(() -> {
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<CardData> dao = new AmanDao<>();
dao.setSuccess(true);
dao.setData(cardData);
this.result.success(gson.toJson(dao));
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<PrinterErrorData, PrinterBaseData> 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<String> 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<Transaction> transactionList) {
// Timber.d("onTransactionsListReceived");
// AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity());
// builder.setTitle("Choose transaction");
//
// Spinner transactionListSpinner = new Spinner(plugin.getActivity());
// ArrayAdapter<Transaction> 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());
this.transaction = null;
this.plugin.setTransaction(null);
for(Transaction transaction : transactionList){
if(this.authorizationCode.equalsIgnoreCase(transaction.getAuthorizationCode())
&& transactionNumber.equals(transaction.getTransactionNumber())
&& transaction.getTransactionType().equalsIgnoreCase("PAYMENT")) {
// 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());
this.transaction = transaction;
break;
}
}
plugin.getActivity().runOnUiThread(() -> {
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(this.transaction !=null );
this.plugin.setTransaction(this.transaction);
dao.setMsg(this.transaction == null ? "Транзакция не может быть отозвана т.к. все операции оп ней закрыты" : null);
this.result.success(gson.toJson(dao));
});
}
@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");
}
}

View File

@ -1,90 +0,0 @@
package kz.com.aman.kassa.handler;
import android.widget.Toast;
import com.google.gson.Gson;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
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.model.TransactionDao;
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<Result> {
private final BankNfcPlugins plugin;
private final MethodChannel.Result result;
private final Gson gson = new Gson();
final SimpleDateFormat sdfDart = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
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<Transaction> transactionList, List<CloseDayResponseInfo> list1) {
plugin.getActivity().runOnUiThread(() -> {
AmanDao<TransactionDao> dao = new AmanDao<>();
dao.setSuccess(true);
dao.setMsg("list");
for(Transaction transaction: transactionList){
TransactionDao transactionDao = new TransactionDao();
transactionDao.setAmount(transaction.getAmount());
transactionDao.setCardExpireDate(transaction.getCardExpiryDate());
transactionDao.setCardNumber(transaction.getMaskedPan());
transactionDao.setCardType(transaction.getCardType());
transactionDao.setTransactionType(transaction.getTransactionType());
transactionDao.setDate(sdfDart.format(transaction.getDate()));
dao.getRows().add(transactionDao);
}
this.result.success(gson.toJson(dao));
// Toast.makeText(plugin.getActivity(), "На закрытие дня: - " + transactionList, Toast.LENGTH_SHORT).show();
});
}
@Override
public void onCompleted(CloseDayResult closeDayResult) {
plugin.getActivity().runOnUiThread(() -> {
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(ResultType.SUCCESSFUL.equals(closeDayResult.getResultType()));
dao.setMsg((closeDayResult.getDescription() == null ? "null" : closeDayResult.getDescription()));
this.result.success(gson.toJson(dao));
Toast.makeText(plugin.getActivity(), closeDayResult.getResultType() + " " + (closeDayResult.getDescription() == null ? "" : closeDayResult.getDescription()), Toast.LENGTH_SHORT)
.show();
});
}
}

View File

@ -1,47 +0,0 @@
package kz.com.aman.kassa.handler;
import android.widget.Toast;
import com.google.gson.Gson;
import io.flutter.plugin.common.MethodChannel;
import kz.com.aman.kassa.MainActivity;
import kz.com.aman.kassa.model.AmanDao;
import ru.m4bank.mpos.library.external.configuration.CheckConnectionCallbackHandler;
import ru.m4bank.mpos.service.result.CheckConnectionExternalResult;
public class ConnectionCheckHandlerImpl implements CheckConnectionCallbackHandler {
private final Gson gson = new Gson();
private final MainActivity activity;
private final MethodChannel.Result result;
public ConnectionCheckHandlerImpl(MainActivity activity, MethodChannel.Result result) {
this.activity = activity;
this.result = result;
}
@Override
public void onCompleted(CheckConnectionExternalResult result) {
activity.runOnUiThread(() -> {
//Toast.makeText(activity, result.getResultType() + " " + (result.getDescription() == null ? "" : result.getDescription()) + " " + result.isOnlineRegistration(), Toast.LENGTH_SHORT).show();
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(true);
dao.setMsg("OK");
this.result.success(gson.toJson(dao));
}
);
}
@Override
public void onWrongApiCalled() {
activity.runOnUiThread(() -> {
//Toast.makeText(activity, "Wrong method has been called", Toast.LENGTH_SHORT).show();
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(false);
dao.setMsg("error");
this.result.success(gson.toJson(dao));
});
}
}

View File

@ -1,311 +0,0 @@
package kz.com.aman.kassa.handler;
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.MainActivity;
import kz.com.aman.kassa.bank.M4BankActivity;
import kz.com.aman.kassa.plugins.BankNfcPlugins;
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 RevertCurrentOperationHandlerImpl implements LastReversalCardPaymentCallbackHandler<Result> {
private final BankNfcPlugins plugin;
public RevertCurrentOperationHandlerImpl(BankNfcPlugins plugin) {
this.plugin = plugin;
}
@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 onCardReaderForTransactionGettingCompleted() {
}
@Override
public void onNoBoundedDevicesFound() {
}
@Override
public void onConnectingProcessStarted(String deviceName) {
}
@Override
public void onDisconnectedEventReceivedOrCanNotEstablishConnection(boolean reconnectAvailable, String description) {
if (reconnectAvailable) {
plugin.getActivity().runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity());
builder.setMessage("Connection to cardreader has been lost, try to reconnect and repeat last operation?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> plugin.getClientInterface().tryToReconnectAndRepeatLast());
builder.setNegativeButton("No", (dialog, which) -> plugin.getClientInterface().cancel());
builder.create().show();
});
}
}
@Override
public void onDeviceToConnectSelectionRequested(List deviceList) {
plugin.getActivity().runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity());
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(plugin.getActivity());
ArrayAdapter<String> 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);
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!!!");
plugin.getClientInterface().getTransactionManager().makeReconciliationDuringTransaction();
}
@Override
public void onReconciliationCompleted(Result result) {
Timber.d("Reconciliation completed!!!");
if (result.getResultType() == ResultType.SUCCESSFUL) {
plugin.getClientInterface().getTransactionManager().continueTransactionAfterReconciliation();
} else {
plugin.getActivity().runOnUiThread(() -> Toast.makeText(plugin.getActivity(), "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(plugin.getActivity());
builder.setTitle("Choose device");
Spinner deviceListSpinner = new Spinner(plugin.getActivity());
ArrayAdapter<Reader> 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 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) {
plugin.getClientInterface().getTransactionManager().tryToRepeatExecuteLastRequestInTransaction();
}
@Override
public void onTransactionDataReceivedError(TransactionData data) {
}
@Override
public void onTransactionDataReceived(TransactionData data) {
}
@Override
public void onTransactionCompleted() {
}
@Override
public void onReconnectNeededToProcess() {
plugin.getActivity().runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity());
builder.setMessage("Connection to cardreader has been lost, try to reconnect and continue?");
builder.setCancelable(false);
builder.setPositiveButton("Yes", (dialog, which) -> plugin.getClientInterface().getTransactionManager().tryToReconnectToCardReader());
builder.setNegativeButton("No", (dialog, which) -> plugin.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) {
}
}

View File

@ -1,101 +0,0 @@
package kz.com.aman.kassa.handler;
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.M4BankActivity;
import kz.com.aman.kassa.plugins.BankNfcPlugins;
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;
public class TransactionDetailsHandlerImpl implements GetTransactionDetailsCallbackHandler<Result>, GetTransactionsListCallbackHandler<Result> {
private final BankNfcPlugins plugin;
public TransactionDetailsHandlerImpl(BankNfcPlugins plugin) {
this.plugin = plugin;
}
@Override
public void onTransactionDetailsReceived(Transaction transaction) {
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();
});
}
@Override
public void onSuccessStatusTransaction(Transaction transaction) {
}
@Override
public void onErrorStatusTransaction() {
}
@Override
public void onTransactionsListReceived(List<Transaction> transactionList) {
plugin.getActivity().runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(plugin.getActivity());
builder.setTitle("Choose transaction");
Spinner transactionListSpinner = new Spinner(plugin.getActivity());
ArrayAdapter<Transaction> 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 = (Transaction) transactionListSpinner.getSelectedItem();
plugin.getClientInterface()
.getTransactionManager()
.getTransactionDetails(this, transaction.getOperationalDayNumber(), transaction
.getTransactionNumber(), transaction.getMobileTerminalId());
dialog.dismiss();
});
builder.setView(transactionListSpinner);
builder.create().show();
});
}
@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());
}
}

View File

@ -11,32 +11,9 @@ import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import kz.com.aman.kassa.MainActivity;
import kz.com.aman.kassa.bank.DeviceTypeDefiner;
import kz.com.aman.kassa.bank.SessionExpiringCallbackHandlerImpl;
import kz.com.aman.kassa.bank.builders.SslConfigurationBuilder;
import kz.com.aman.kassa.bank.permissions.PermissionsManager;
import kz.com.aman.kassa.bank.permissions.PermissionsManagerImpl;
import kz.com.aman.kassa.handler.AuthorizationHandlerImpl;
import kz.com.aman.kassa.handler.CardPaymentHandlerImpl;
import kz.com.aman.kassa.handler.CardRefundAmanHandlerImpl;
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.transactions.GetTransactionsListCallbackHandler;
import ru.m4bank.mpos.service.commons.data.ConfigurationSettings;
import ru.m4bank.mpos.service.commons.data.NetworkConfiguration;
import ru.m4bank.mpos.service.commons.data.TerminalConfiguration;
import ru.m4bank.mpos.service.data.dynamic.CurrencyDataHolder;
import ru.m4bank.mpos.service.data.dynamic.objects.Currency;
import ru.m4bank.mpos.service.data.dynamic.objects.GetOperationType;
import ru.m4bank.mpos.service.data.dynamic.objects.Transaction;
import ru.m4bank.mpos.service.hardware.external.cardreaderlib.data.enums.TransactionTypeConv;
import ru.m4bank.mpos.service.network.Format;
import ru.m4bank.mpos.service.network.ServerChoose;
public class BankNfcPlugins implements MethodCallHandler {
@ -46,24 +23,6 @@ public class BankNfcPlugins implements MethodCallHandler {
//main activity
private MainActivity activity;
private Transaction transaction;
public Transaction getTransaction() {
return transaction;
}
public void setTransaction(Transaction transaction) {
this.transaction = transaction;
}
//main client all work with him
private M4BankMposClientInterfaceFacade clientInterface;
//permissions
private PermissionsManager permissionsManager;
public M4BankMposClientInterfaceFacade getClientInterface() {
return this.clientInterface;
}
public MainActivity getActivity() {
return this.activity;
@ -141,36 +100,36 @@ public class BankNfcPlugins implements MethodCallHandler {
}
private void permissions(Result result) {
try {
PermissionsManager.PermissionsCheckResultHandler permissionsCheckResultHandler =
new PermissionsManager.PermissionsCheckResultHandler() {
@Override
public void onPermissionsGranted() {
activity.runOnUiThread(() -> {
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(true);
dao.setMsg("OK");
result.success(gson.toJson(dao));
}
);
}
@Override
public void onPermissionsDeclined() {
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(false);
dao.setMsg("decline");
result.success(gson.toJson(dao));
}
};
permissionsManager = new PermissionsManagerImpl(this.activity);
permissionsManager.checkPermissions(permissionsCheckResultHandler);
} catch (Exception e) {
result.error("1", e.getMessage(), e.getLocalizedMessage());
}
// try {
// PermissionsManager.PermissionsCheckResultHandler permissionsCheckResultHandler =
// new PermissionsManager.PermissionsCheckResultHandler() {
// @Override
// public void onPermissionsGranted() {
// activity.runOnUiThread(() -> {
// AmanDao<String> dao = new AmanDao<>();
// dao.setSuccess(true);
// dao.setMsg("OK");
// result.success(gson.toJson(dao));
// }
// );
//
// }
//
// @Override
// public void onPermissionsDeclined() {
// AmanDao<String> dao = new AmanDao<>();
// dao.setSuccess(false);
// dao.setMsg("decline");
// result.success(gson.toJson(dao));
// }
// };
// permissionsManager = new PermissionsManagerImpl(this.activity);
// permissionsManager.checkPermissions(permissionsCheckResultHandler);
//
//
// } catch (Exception e) {
// result.error("1", e.getMessage(), e.getLocalizedMessage());
// }
}
@ -186,171 +145,152 @@ public class BankNfcPlugins implements MethodCallHandler {
//start after all permissions granted
private void start(String serverUrl) {
clientInterface = M4BankMposClient.getInstance(
new M4BankMposParameters(
Format.JSON,
"rus",
null,
this.activity,
new SessionExpiringCallbackHandlerImpl(),
"appName",
ServerChoose.API_5_0,
new ConfigurationSettings
.Builder()
.printerUsed(true)
.umkaEnabled(true)
.networkConfiguration(createNetworkConfiguration(serverUrl))
.terminalConfiguration(createTerminalConfiguration())
.build())
);
// clientInterface = M4BankMposClient.getInstance(
// new M4BankMposParameters(
// Format.JSON,
// "rus",
// null,
// this.activity,
// new SessionExpiringCallbackHandlerImpl(),
// "appName",
// ServerChoose.API_5_0,
// new ConfigurationSettings
// .Builder()
// .printerUsed(true)
// .umkaEnabled(true)
// .networkConfiguration(createNetworkConfiguration(serverUrl))
// .terminalConfiguration(createTerminalConfiguration())
// .build())
// );
}
private void connection(Result result) {
clientInterface.getConfigurationManager()
.checkConnection(
new ConnectionCheckHandlerImpl(this.activity, result));
// clientInterface.getConfigurationManager()
// .checkConnection(
// new ConnectionCheckHandlerImpl(this.activity, result));
}
private void currency(Result result) {
CurrencyDataHolder dataHolder = clientInterface.getConfigurationManager()
.getCurrencyDataHolder();
Currency currentCurrency = dataHolder.getCurrency();
if(currentCurrency!=null){
System.out.println(currentCurrency.getName());
System.out.println(currentCurrency.getCurrency3DigitCode());
} else {
System.out.println("currentCurrency is null");
}
System.out.println("===========================");
if(currentCurrency == null || !"398".equalsIgnoreCase(currentCurrency.getCurrency3DigitCode()) ){
List<Currency> currencies = dataHolder.getCurrencyList();
boolean changed = false;
for(Currency currency : currencies ){
System.out.println(currency.getName());
System.out.println(currency.getLetterCode());
System.out.println(currency.getCurrency3DigitCode());
if("398".equalsIgnoreCase(currency.getCurrency3DigitCode())){
dataHolder.setCurrency(currency);
changed = true;
break;
}
}
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(changed);
dao.setMsg("current currency " + (currentCurrency!=null ? currentCurrency.getLetterCode() : "NULL"));
result.success(gson.toJson(dao));
} else {
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(true);
dao.setMsg("exist");
result.success(gson.toJson(dao));
}
// CurrencyDataHolder dataHolder = clientInterface.getConfigurationManager()
// .getCurrencyDataHolder();
// Currency currentCurrency = dataHolder.getCurrency();
// if(currentCurrency!=null){
// System.out.println(currentCurrency.getName());
// System.out.println(currentCurrency.getCurrency3DigitCode());
// } else {
// System.out.println("currentCurrency is null");
// }
// System.out.println("===========================");
// if(currentCurrency == null || !"398".equalsIgnoreCase(currentCurrency.getCurrency3DigitCode()) ){
// List<Currency> currencies = dataHolder.getCurrencyList();
// boolean changed = false;
// for(Currency currency : currencies ){
// System.out.println(currency.getName());
// System.out.println(currency.getLetterCode());
// System.out.println(currency.getCurrency3DigitCode());
// if("398".equalsIgnoreCase(currency.getCurrency3DigitCode())){
// dataHolder.setCurrency(currency);
// changed = true;
// break;
// }
// }
// AmanDao<String> dao = new AmanDao<>();
// dao.setSuccess(changed);
// dao.setMsg("current currency " + (currentCurrency!=null ? currentCurrency.getLetterCode() : "NULL"));
// result.success(gson.toJson(dao));
// } else {
// AmanDao<String> dao = new AmanDao<>();
// dao.setSuccess(true);
// dao.setMsg("exist");
// result.success(gson.toJson(dao));
// }
}
private void authentication(MethodCall call, Result result) {
String login = call.argument("login");
String password = call.argument("password");
clientInterface.getAuthorizationManager().authorize(new AuthorizationHandlerImpl(this, result, login, password) );
// String login = call.argument("login");
// String password = call.argument("password");
// clientInterface.getAuthorizationManager().authorize(new AuthorizationHandlerImpl(this, result, login, password) );
}
private void pay(MethodCall call, Result result) {
try {
Integer value = call.argument("amount");
long amount = value.longValue();
clientInterface.cancel();
clientInterface.getTransactionManager().makeCardPayment(new CardPaymentHandlerImpl(this, result, amount, TransactionTypeConv.PAYMENT));
} catch (Exception e) {
System.out.println("=============>ERROR:"+e.getMessage());
result.error("2", e.getMessage(), e.getLocalizedMessage());
}
// try {
// Integer value = call.argument("amount");
// long amount = value.longValue();
// clientInterface.cancel();
// clientInterface.getTransactionManager().makeCardPayment(new CardPaymentHandlerImpl(this, result, amount, TransactionTypeConv.PAYMENT));
// } catch (Exception e) {
// System.out.println("=============>ERROR:"+e.getMessage());
// result.error("2", e.getMessage(), e.getLocalizedMessage());
// }
}
private void findTransaction(MethodCall call, Result result) {
try {
Integer transactionNumber = call.argument("transactionNumber");
String authorizationCode = call.argument("authorizationCode");
clientInterface.getTransactionManager()
.getTransactionsList(new CardRefundAmanHandlerImpl(this, result, transactionNumber, authorizationCode , transaction), 1000,
0, GetOperationType.SHOW, null);
} catch (Exception e) {
System.out.println("=============>ERROR:"+e.getMessage());
result.error("2", e.getMessage(), e.getLocalizedMessage());
}
// try {
// Integer transactionNumber = call.argument("transactionNumber");
// String authorizationCode = call.argument("authorizationCode");
// clientInterface.getTransactionManager()
// .getTransactionsList(new CardRefundAmanHandlerImpl(this, result, transactionNumber, authorizationCode , transaction), 1000,
// 0, GetOperationType.SHOW, null);
// } catch (Exception e) {
// System.out.println("=============>ERROR:"+e.getMessage());
// result.error("2", e.getMessage(), e.getLocalizedMessage());
// }
}
private void refund(MethodCall call, Result result) {
try {
clientInterface.getTransactionManager()
.makeCardRefund(new CardRefundAmanHandlerImpl(this, result, null, null, transaction));
} catch (Exception e) {
System.out.println("=============>ERROR:"+e.getMessage());
result.error("2", e.getMessage(), e.getLocalizedMessage());
}
// try {
// clientInterface.getTransactionManager()
// .makeCardRefund(new CardRefundAmanHandlerImpl(this, result, null, null, transaction));
// } catch (Exception e) {
// System.out.println("=============>ERROR:"+e.getMessage());
// result.error("2", e.getMessage(), e.getLocalizedMessage());
// }
}
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());
}
// 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(
new TransactionDetailsHandlerImpl(this),
20, 0,
GetOperationType.SHOW,
null);
// clientInterface.getTransactionManager()
// .getTransactionsList(
// new TransactionDetailsHandlerImpl(this),
// 20, 0,
// GetOperationType.SHOW,
// null);
}
private void cancel(MethodCall call, Result result) {
try {
clientInterface.cancel();
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(true);
dao.setMsg("OK");
result.success(gson.toJson(dao));
} catch (Exception e) {
System.out.println("=============>ERROR:"+e.getMessage());
result.error("2", e.getMessage(), e.getLocalizedMessage());
}
// try {
// clientInterface.cancel();
// AmanDao<String> dao = new AmanDao<>();
// dao.setSuccess(true);
// dao.setMsg("OK");
// result.success(gson.toJson(dao));
// } catch (Exception e) {
// System.out.println("=============>ERROR:"+e.getMessage());
// result.error("2", e.getMessage(), e.getLocalizedMessage());
// }
}
private void shutdown(MethodCall call, Result result) {
try {
clientInterface.shutdown();
AmanDao<String> dao = new AmanDao<>();
dao.setSuccess(true);
dao.setMsg("OK");
result.success(gson.toJson(dao));
} catch (Exception e) {
System.out.println("=============>ERROR:"+e.getMessage());
result.error("2", e.getMessage(), e.getLocalizedMessage());
}
}
//terminal config
private TerminalConfiguration createTerminalConfiguration() {
System.out.println("=============>createTerminalConfiguration:"+new DeviceTypeDefiner().define());
return new TerminalConfiguration.Builder()
.energySaverModeTime(150)
.pinLengthsArray(new byte[]{4, 6})
.shutDownModeTime(300)
.deviceType(new DeviceTypeDefiner().define())
.build();
}
//network config
private NetworkConfiguration createNetworkConfiguration(String serverUrl) {
return new NetworkConfiguration.Builder()
.sslConfiguration(SslConfigurationBuilder.buildAllTrustConfiguration(serverUrl))
.serverUrl(serverUrl)
.build();
// try {
// clientInterface.shutdown();
// AmanDao<String> dao = new AmanDao<>();
// dao.setSuccess(true);
// dao.setMsg("OK");
// result.success(gson.toJson(dao));
// } catch (Exception e) {
// System.out.println("=============>ERROR:"+e.getMessage());
// result.error("2", e.getMessage(), e.getLocalizedMessage());
// }
}

View File

@ -1,34 +0,0 @@
package kz.com.aman.kassa.activities;
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.View
import kz.com.aman.kassa.R
import io.flutter.app.FlutterActivity
class BankActivity : FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.i("BankActivity","onCreate")
setContentView(R.layout.activity_bank)
}
fun myClickHandler(view: View) {
Log.i("BankActivity","closed")
val returnIntent = Intent()
returnIntent.putExtra("result", "abrakadabra")
setResult(Activity.RESULT_OK, returnIntent)
finish()
}
override fun onDestroy() {
val returnIntent = Intent()
returnIntent.putExtra("result", "abrakadabra")
setResult(Activity.RESULT_CANCELED, returnIntent)
super.onDestroy()
}
}

View File

@ -11,124 +11,11 @@ buildscript {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
ext.buildType = [
'buildType': 'NFC'
]
ext.versions = [
'supportLibrary': '28.0.0',
'okhttp' : '3.8.1',
'retrofit' : '2.3.0',
'multidex' : '1.0.2',
'logback' : '1.1.1-6'
]
ext.deps = [
'support' : [
'appcompatV7': "com.android.support:appcompat-v7:${versions.supportLibrary}",
'multidex' : "com.android.support:multidex:${versions.multidex}",
],
'okhttp' : [
'core' : "com.squareup.okhttp3:okhttp:${versions.okhttp}",
'logger': "com.squareup.okhttp3:logging-interceptor:${versions.okhttp}",
],
'retrofit' : [
'core' : "com.squareup.retrofit2:retrofit:${versions.retrofit}",
'converterGson' : "com.squareup.retrofit2:converter-gson:${versions.retrofit}",
'rxjava2Adapter': 'com.squareup.retrofit2:adapter-rxjava2:2.3.0',
],
'rx' : [
'core' : 'io.reactivex.rxjava2:rxjava:2.1.7',
'android': 'io.reactivex.rxjava2:rxandroid:2.0.1',
],
'logback' : [
'core' : "com.github.tony19:logback-android-core:${versions.logback}",
'classic': "com.github.tony19:logback-android-classic:${versions.logback}",
],
'timber' : 'com.jakewharton.timber:timber:4.5.1',
'paperdb' : 'io.paperdb:paperdb:2.1',
'sdpAndroid' : 'com.intuit.sdp:sdp-android:1.0.4',
'slf4jApi' : 'org.slf4j:slf4j-api:1.7.21',
'greendao' : 'org.greenrobot:greendao:3.2.2',
'websockets' : 'org.java-websocket:Java-WebSocket:1.4.0',
'retro_stream': 'net.sourceforge.streamsupport:android-retrostreams:1.6.3',
'hardware' : [
"terminalCommon": [
"cardreaderlib" : "m4bank:cardreaderlib:759",
"connectionreaders": "m4bank:connectionreaders:759",
"emv_taglib" : "external:emv-taglib:2.5",
],
'aisino' : [
"aisino_common": "m4bank:aisino_common:140",
"vm20" : [
"vm20" : "external:vm20sdk:9",
"asinalib": "m4bank:asinalib:100"
],
"a90" : [
"aisinoprinterlib": "m4bank:aisinoprinterlib:153",
"aisino_a90lib" : "m4bank:aisino_a90lib:437",
"aisino_a90deps" : "m4bank:aisino_a90deps:master-1.1.43@aar",
],
],
'wangpos' : [
"wangposlib" : "m4bank:wangposlib:53",
"wangposprinterlibrary": "m4bank:wangposprinterlibrary:35",
"SDK4BaseBinder" : "external:SDK4BaseBinder:2.1.5",
"SDK4EmvBinder" : "external:SDK4EmvBinder:2.1.5",
"SDK4KeyManagerBinder" : "external:SDK4KeyManagerBinder:2.1.5"
],
'atol' : [
"fiscalprinterlibrary": "m4bank:fiscalprinterlibrary:93",
"atol_core" : "external:atol_core:1@aar"
],
'shtrih' : [
"FptrServiceAndroid": "m4bank:FptrServiceAndroid:3",
"shtrih_core" : "external:shtrihjpos:1"
],
"icmp" : [
"icmplibrary" : "m4bank:icmplibrary:16",
"icmp_dependencies": "m4bank:icmp_dependencies:1.1.1.2@aar"
],
"roam" : [
"roamlib" : "roamlib:roamlib2:207",
"roamreaderAAR": "external:roamreaderunifiedapiAAR:1@aar"
],
"spirelib" : "m4bank:spirelib:138",
"softpos" : [
"softpaylibrary" : "m4bank:softpaylibrary:52@aar",
"softpay_dependencies": "m4bank:softpay_dependencies:1.1.4.62@aar",
],
"sunmi" : "m4bank:sunmiv1printerlibrary:5",
"redlib" : "m4bank:redlib:1",
"d200lib" : "m4bank:d200lib:9",
],
"zlibrary" : "m4bank:zlibrary:2159@aar"
]
//TODO: 20.09.2019 for future refactoring: add gradle properties parameter to set supported device remotely
if (ext.buildType.buildType == 'NFC') {
//ext.supportedDevicesapp = ['SoftPos', 'Shtrih', 'Atol']
ext.supportedDevicesapp = ['SoftPos']
} else {
ext.supportedDevicesapp = ['Deftun', 'Singular', 'CctRed', 'RoamData', 'Rp350n', 'WisePad', 'RoamPad',
'Qpos', 'Icmp', 'Spire', 'D200', 'RoamPadNfc', 'IcmpUpos', 'WangPos',
'OrangeRoamPad', 'FakeReader', 'Aisino', 'AisinoA90',
'Shtrih', 'Sunmi', 'Atol', 'AisinoA70']
}
ext.currentRepository = "http://217.174.185.218:55555/artifactory/gradle-dev"
}
allprojects {
repositories {
maven {
url currentRepository
content {
includeGroupByRegex "external.*"
includeGroupByRegex "m4bank.*"
includeGroupByRegex "roamlib.*"
}
}
google()
jcenter()
}

BIN
assets/images/check.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
assets/images/finger.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
assets/images/secBg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -34,6 +34,7 @@ class SimpleLogPrinter extends LogPrinter {
}
String formatStackTrace(StackTrace stackTrace, int methodPosition) {
var lines = stackTrace.toString()?.split('\n');
var formatted = <String>[];
var count = 0;

View File

@ -0,0 +1,17 @@
class CheckImageModal {
final String base64Data;
final String textData;
CheckImageModal({this.base64Data, this.textData});
static CheckImageModal fromJson(Map<String, dynamic> json) {
return CheckImageModal(
base64Data: json['base64Data'],
textData: json['textData']
);
}
Map<String, dynamic> toJson() =>
{
'base64Data': base64Data,
'textData': textData
};
}

View File

@ -0,0 +1,19 @@
import 'package:intl/intl.dart';
class HalykPosSession {
const HalykPosSession(
{this.login, this.token, this.serverTime, this.tokenTimeout});
final String login;
final String token;
final DateTime serverTime;
final int tokenTimeout;
static HalykPosSession fromJson(Map<String, dynamic> data) => HalykPosSession(
login: data['login'],
token: data['token'],
serverTime: data['ServerTime'] != null
? new DateFormat("dd.MM.yyyy HH:mm:ss ZZZ").parse(data['ServerTime'])
: null,
tokenTimeout: data['TokenTimeout']);
}

View File

@ -0,0 +1,6 @@
class SettingModel {
const SettingModel({this.name, this.type, this.address});
final String type;
final String name;
final String address;
}

View File

@ -6,7 +6,14 @@ const String PaymentViewRoute = "PaymentView";
const String PaymentNfcViewRoute = "PaymentNfcViewRoute";
const String HistoryViewRoute = "HistoryView";
const String InfoKkmViewRoute = "InfoKkmViewRoute";
const String SettingsViewRoute = "SettingsViewRoute";
const String QrViewRoute = "QrViewRoute";
const String BankViewRoute = "BankViewRoute";
const String BankSettingViewRoute = "BankSettingViewRoute";
const String SettingsPrinterRoute = "SettingsPrinterRoute";
const String SettingsPrinterBTRoute = "SettingsPrinterBTRoute";
const String SettingsPrinterEncodingRoute = "SettingsPrinterEncodingRoute";
const String SettingsPrinterPaperRoute = "SettingsPrinterPaperRoute";
// Generate the views here

View File

@ -1,18 +1,23 @@
import 'package:flutter/material.dart';
import 'package:aman_kassa_flutter/core/models/close_day_data.dart';
import 'package:aman_kassa_flutter/views/bank_setting/bank_setting_view.dart';
import 'package:aman_kassa_flutter/views/bank_view/bank_view.dart';
import 'package:aman_kassa_flutter/views/check/image_show_container.dart';
import "package:aman_kassa_flutter/views/home/home_view_m.dart";
import 'package:aman_kassa_flutter/views/close_day_view/close_day_show_container.dart';
import 'package:aman_kassa_flutter/views/history/history_view.dart';
import 'package:aman_kassa_flutter/views/info_kkm/info_kkm_view.dart';
import 'package:aman_kassa_flutter/views/payment/payment_view.dart';
import 'package:aman_kassa_flutter/views/payment_nfc/payment_nfc_view.dart';
import 'package:aman_kassa_flutter/views/qr_view/qr_view.dart';
import './route_names.dart';
import 'package:aman_kassa_flutter/views/home/home_view.dart';
import 'package:aman_kassa_flutter/views/settings/printer/views/PrinterSelect.dart';
import 'package:aman_kassa_flutter/views/settings/settings_view.dart';
import 'package:aman_kassa_flutter/views/settings/printer/views/PrinterEncoding.dart';
import 'package:aman_kassa_flutter/views/settings/printer/views/PrinterPaperSize.dart';
import 'package:aman_kassa_flutter/views/settings/setting_printer_view.dart';
import 'package:aman_kassa_flutter/views/login/login_view.dart';
import 'package:flutter/material.dart';
import './route_names.dart';
Route<dynamic> generateRoute(RouteSettings settings) {
switch (settings.name) {
@ -51,6 +56,11 @@ Route<dynamic> generateRoute(RouteSettings settings) {
routeName: settings.name,
viewToShow: InfoKkmView(),
);
case SettingsViewRoute:
return _getPageRoute(
routeName: settings.name,
viewToShow: SettingView(),
);
case BankViewRoute:
return _getPageRoute(
routeName: settings.name,
@ -74,6 +84,26 @@ Route<dynamic> generateRoute(RouteSettings settings) {
routeName: settings.name,
viewToShow: ImageShowContainer(data),
);
case SettingsPrinterRoute:
return _getPageRoute(
routeName: settings.name,
viewToShow: SettingPrinterView(),
);
case SettingsPrinterBTRoute:
return _getPageRoute(
routeName: settings.name,
viewToShow: PrinterSelectView(),
);
case SettingsPrinterEncodingRoute:
return _getPageRoute(
routeName: settings.name,
viewToShow: PrinterEncodingView(),
);
case SettingsPrinterPaperRoute:
return _getPageRoute(
routeName: settings.name,
viewToShow: PrinterPaperView(),
);
case CloseDayShowRoute:
CloseDayData data = settings.arguments as CloseDayData;
return _getPageRoute(

View File

@ -2,6 +2,7 @@ import 'dart:convert';
import 'dart:io';
import 'package:aman_kassa_flutter/core/base/base_service.dart';
import 'package:aman_kassa_flutter/core/models/halyk_post_session.dart';
import 'package:aman_kassa_flutter/redux/state/user_state.dart';
import 'package:aman_kassa_flutter/redux/store.dart';
import 'package:aman_kassa_flutter/views/login/login_view.dart';
@ -17,12 +18,14 @@ import '../models/auth_response.dart';
import 'package:http/http.dart' as http;
/// The service responsible for networking requests
/// The service responsible fworking requests
class ApiService extends BaseService {
static const test_host = 'https://kassa-test.aman.com.kz';
static const test_endpoint = '$test_host/ru/api/v2';
static const host = 'https://kassa.aman.com.kz';
static const endpoint = '$host/ru/api/v2';
static const pos_endpoint = '$test_host/api';
final NavigatorService _navigatorService = locator<NavigatorService>();
final DialogService _dialogService = locator<DialogService>();
@ -63,6 +66,12 @@ class ApiService extends BaseService {
return Response.fromJsonDynamic(json.decode(response));
}
Future<HalykPosSession> halykPosToken(String token, login, password) async {
Map<String, String> requestBody = <String, String>{'login': login, 'password': password};
var response = await requestFormData('/getpostoken', requestBody, bodyEntry: true, posEndPoint: true, statusCheck: false);
return HalykPosSession.fromJson(jsonDecode(response));
}
Future<Response<dynamic>> money(String token) async {
Map<String, String> requestBody = <String, String>{'api_token': token};
var response = await requestFormData('/money', requestBody);
@ -124,15 +133,17 @@ class ApiService extends BaseService {
}
Future<String> requestFormData(String point, Map<String, String> requestBody, { bool statusCheck = true } ) async {
Future<String> requestFormData(String point, Map<String, dynamic> requestBody, { bool statusCheck = true, bool bodyEntry = false, bool posEndPoint= false } ) async {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
Map<String, String> headers = <String, String>{
HttpHeaders.contentTypeHeader: "multipart/form-data",
HttpHeaders.contentTypeHeader: bodyEntry ? "application/json" : "multipart/form-data",
HttpHeaders.cacheControlHeader: "no-cache"
};
if(Platform.isAndroid) {
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
headers.addAll(<String, String>{
@ -152,15 +163,27 @@ class ApiService extends BaseService {
String url = '$endpoint$point';
if(this._test) {
url = '$test_endpoint$point';
if(posEndPoint){
url = '$pos_endpoint$point';
}
}
var uri = Uri.parse(url);
var request = http.MultipartRequest('POST', uri)
..headers.addAll(headers)
..fields.addAll(requestBody);
var response = await request.send();
String body;
if(bodyEntry) {
http.Response res = await http.post(uri, body: jsonEncode(requestBody), headers: headers );
body = res.body;
} else {
var request = http.MultipartRequest('POST', uri)
..headers.addAll(headers)
..fields.addAll(requestBody);
var response = await request.send();
body = await response.stream.bytesToString();
}
String body = await response.stream.bytesToString();
if(statusCheck) { //Проверка на авторизованный запрос, необязательный параметр
Response check = Response.fromJsonDynamic(json.decode(body));
if (!check.operation && ( [401,402,403,412].contains(check.status) ) ) {

View File

@ -1,12 +1,17 @@
import 'dart:convert';
import 'package:aman_kassa_flutter/core/base/base_service.dart';
import 'package:aman_kassa_flutter/core/locator.dart';
import 'package:aman_kassa_flutter/core/models/aman_dao.dart';
import 'package:aman_kassa_flutter/core/models/close_day_data.dart';
import 'package:aman_kassa_flutter/core/models/halyk_post_session.dart';
import 'package:aman_kassa_flutter/core/models/response.dart';
import 'package:aman_kassa_flutter/core/models/transaction_item.dart';
import 'package:aman_kassa_flutter/core/services/ApiService.dart';
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';
class BankService extends BaseService {
final ApiService _api = locator<ApiService>();
static const String _url = 'http://195.200.74.83:5000';
final MethodChannel _channel = MethodChannel('channel:com.amanKassa/bank');
@ -23,18 +28,18 @@ class BankService extends BaseService {
return int.parse(result) ?? 0;
}
Future<String> imei() async {
String result;
Future<HalykPosSession> renewToken({String token, String login, String password}) async {
HalykPosSession result;
try {
result = await _channel.invokeMethod('imei');
result = await _api.halykPosToken(token, login, password);
} catch (e, stack) {
log.e("BankService", e, stack);
result = '0';
}
log.i(result);
return result;
}
Future<bool> init() async {
try {
String response = await _channel.invokeMethod('init', <String, dynamic>{

View File

@ -9,6 +9,7 @@ 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_image_modal.dart';
import 'package:aman_kassa_flutter/core/models/check_item.dart';
import 'package:aman_kassa_flutter/core/models/product_dao.dart';
import 'package:aman_kassa_flutter/core/models/response.dart';
@ -206,17 +207,26 @@ class DataService extends BaseService {
// log.i('response operation: ${response.operation}');
if (response.status == 200 && response.operation == true) {
User user = Redux.store.state.userState.user;
//check compare
String check = response?.body['check'];
var checkText = response?.body['check_text'];
CheckImageModal imageModal = new CheckImageModal( base64Data: check, textData: checkText !=null ? jsonEncode(checkText) : null );
// journal analyze
dynamic journal = response?.body['journal'];
String url = response?.body['link'];
int checkNum = journal['check_num'];
var summ = journal['summ'];
// short url
String url = response?.body['link'];
// total
double total = summ != null ? double.parse(summ.toString()) : 0.0;
//insert data to db
this.insertVoucher(
user: user,
name: 'Чек №$checkNum',
data: data,
base64Data: check,
base64Data: jsonEncode(imageModal.toJson()),
total: total,
url: url,
type: operationType == OperationTypeReturn

View File

@ -1,4 +1,5 @@
import 'package:aman_kassa_flutter/core/models/halyk_post_session.dart';
import 'package:aman_kassa_flutter/redux/state/bank_state.dart';
import 'package:meta/meta.dart';
import 'package:redux/redux.dart';
@ -17,3 +18,9 @@ ThunkAction<AppState> saveData(String login, String password) {
store.dispatch(SetBankStateAction(BankState(login: login, password: password)));
};
}
ThunkAction<AppState> setHalykSession(HalykPosSession session) {
return (Store<AppState> store) async {
store.dispatch(SetBankStateAction(BankState(session: session)));
};
}

View File

@ -3,7 +3,7 @@ import 'package:aman_kassa_flutter/redux/state/setting_state.dart';
import 'package:meta/meta.dart';
import 'package:redux/redux.dart';
import 'package:redux_thunk/redux_thunk.dart';
import 'package:flutter_bluetooth_basic/src/bluetooth_device.dart';
import '../store.dart';
@immutable
@ -23,4 +23,40 @@ ThunkAction<AppState> changeTradeTypeFromSetting(String tradeType) {
return (Store<AppState> store) async {
store.dispatch(SetSettingStateAction(SettingState(tradeType: tradeType )));
};
}
ThunkAction<AppState> changePinCodeFromSetting(String pinCode) {
return (Store<AppState> store) async {
store.dispatch(SetSettingStateAction(SettingState(pinCode: pinCode)));
};
}
ThunkAction<AppState> changePinLockedFromSetting(bool locked) {
return (Store<AppState> store) async {
store.dispatch(SetSettingStateAction(SettingState(pinLocked: locked)));
};
}
ThunkAction<AppState> changePinSkipFromSetting(bool skip) {
return (Store<AppState> store) async {
store.dispatch(SetSettingStateAction(SettingState(pinSkip: skip)));
};
}
ThunkAction<AppState> selectPrinterFromSetting(BluetoothDevice device) {
return (Store<AppState> store) async {
store.dispatch(SetSettingStateAction(SettingState(printerBT: device )));
};
}
ThunkAction<AppState> selectPrinterEncodingFromSetting(String encoding) {
return (Store<AppState> store) async {
store.dispatch(SetSettingStateAction(SettingState(printerEncoding: encoding )));
};
}
ThunkAction<AppState> selectPrinterPaperSizeFromSetting(String paperSize) {
return (Store<AppState> store) async {
store.dispatch(SetSettingStateAction(SettingState(printerPaperSize: paperSize )));
};
}

View File

@ -72,7 +72,7 @@ Future<void> logoutAction(Store<AppState> store) async {
UserState(
isLoading: false,
isAuthenticated: false,
user: User(),
user: User()
),
),
);

View File

@ -3,4 +3,17 @@ const String SettingModeCalc = 'calcMode';
const String SettingTradeTypeGood = 'g';
const String SettingTradeTypeService = 's';
const String SettingTradeTypeService = 's';
const String SettingPrinterEncodingCp866 = 'cp866';
const String SettingPrinterEncodingWin1251 = 'windows-1251';
const String SettingPrinterEncodingImage = 'image';
const String SettingPrinterPaperM58 = '58mm';
const String SettingPrinterPaperM80 = '80mm';

View File

@ -3,5 +3,5 @@ import 'package:aman_kassa_flutter/redux/state/bank_state.dart';
bankReducer(BankState prevState, SetBankStateAction action) {
final payload = action.bankState;
return prevState.copyWith(login: payload.login, password: payload.password);
return prevState.copyWith(login: payload.login, password: payload.password, session: payload.session);
}

View File

@ -5,6 +5,12 @@ settingReducer(SettingState prevState, SetSettingStateAction action) {
final payload = action.settingState;
return prevState.copyWith(
mode: payload.mode,
tradeType: payload.tradeType
tradeType: payload.tradeType,
pinCode: payload.pinCode,
pinLocked: payload.pinLocked,
pinSkip: payload.pinSkip,
printerBT: payload.printerBT,
printerEncoding: payload.printerEncoding,
printerPaperSize: payload.printerPaperSize,
);
}

View File

@ -1,3 +1,4 @@
import 'package:aman_kassa_flutter/core/models/halyk_post_session.dart';
import 'package:aman_kassa_flutter/redux/constants/setting_const.dart';
import 'package:meta/meta.dart';
@ -5,24 +6,29 @@ import 'package:meta/meta.dart';
class BankState {
final String login;
final String password;
final HalykPosSession session;
BankState({this.login, this.password});
BankState({this.login, this.password, this.session,});
//read hive
factory BankState.initial(BankState payload) {
return BankState(
login: payload?.login,
password: payload?.password);
password: payload?.password,
session: payload?.session
);
}
//write hive
BankState copyWith({
@required login,
@required password,
@required session,
}) {
return BankState(
login: login ?? this.login,
password: password ?? this.password,
session: session ?? this.session
);
}

View File

@ -1,28 +1,58 @@
import 'package:aman_kassa_flutter/redux/constants/setting_const.dart';
import 'package:meta/meta.dart';
import 'package:flutter_bluetooth_basic/src/bluetooth_device.dart';
@immutable
class SettingState {
final String mode;
final String tradeType;
final String pinCode;
final bool pinLocked;
final bool pinSkip;
final BluetoothDevice printerBT;
final String printerEncoding;
final String printerPaperSize;
SettingState({this.mode, this.tradeType});
SettingState({this.mode, this.tradeType, this.pinCode, this.pinLocked, this.pinSkip, this.printerBT,
this.printerEncoding,
this.printerPaperSize});
//read hive
factory SettingState.initial(SettingState payload) {
return SettingState(
mode: payload?.mode ?? SettingModeKassa,
tradeType: payload?.tradeType ?? SettingTradeTypeGood);
tradeType: payload?.tradeType ?? SettingTradeTypeGood,
pinCode: payload?.pinCode ?? null,
pinLocked: true,
pinSkip: false,
printerBT: payload?.printerBT ?? null,
printerEncoding:
payload?.printerEncoding ?? SettingPrinterEncodingCp866,
printerPaperSize: payload?.printerPaperSize ?? SettingPrinterPaperM58
);
}
//write hive
SettingState copyWith({
@required mode,
@required tradeType,
@required pinCode,
@required pinLocked,
@required pinSkip,
@required printerBT,
@required printerEncoding,
@required printerPaperSize,
}) {
return SettingState(
mode: mode ?? this.mode,
tradeType: tradeType ?? this.tradeType,
pinCode: pinCode ?? this.pinCode,
pinLocked: pinLocked ?? this.pinLocked,
pinSkip: pinSkip ?? this.pinSkip,
printerBT: printerBT ?? this.printerBT,
printerEncoding: printerEncoding ?? this.printerEncoding,
printerPaperSize: printerPaperSize ?? this.printerPaperSize
);
}
@ -31,11 +61,28 @@ class SettingState {
? SettingState(
tradeType: json['tradeType'],
mode: json['mode'],
pinCode: json['pinCode'],
pinLocked: json['pinLocked'],
pinSkip: json['pinSkip'],
printerEncoding: json['printerEncoding'],
printerPaperSize: json['printerPaperSize'],
printerBT: json['printerBT'] != null
? BluetoothDevice.fromJson(json['printerBT'])
: null,
)
: null;
}
dynamic toJson() {
return {"tradeType": tradeType, "mode": mode};
return {
"tradeType": tradeType,
"mode": mode,
"pinCode": pinCode,
"pinLocked" : pinLocked,
"pinSkip" : pinSkip,
"printerBT": printerBT != null ? printerBT.toJson() : null,
"printerEncoding": printerEncoding,
"printerPaperSize": printerPaperSize,
};
}
}

View File

@ -16,6 +16,7 @@ class UserState {
final Smena smena;
final Money money;
UserState(
{this.isError,
this.isLoading,
@ -26,7 +27,8 @@ class UserState {
this.user,
this.loginFormMessage,
this.smena,
this.money});
this.money,
});
factory UserState.initial(UserState payload) => UserState(
isLoading: false,
@ -73,7 +75,8 @@ class UserState {
user: User.fromJson(json['user']),
authenticateType: json['authenticateType'],
login: json['login'],
password: json['password'])
password: json['password'],
)
: null;
}

View File

@ -2,6 +2,7 @@ import 'dart:convert';
import 'dart:io';
import 'package:aman_kassa_flutter/core/entity/Voucher.dart';
import 'package:aman_kassa_flutter/core/locator.dart';
import 'package:aman_kassa_flutter/core/models/check_image_modal.dart';
import 'package:aman_kassa_flutter/core/models/aman_dao.dart';
import 'package:aman_kassa_flutter/core/models/card_data.dart';
import 'package:aman_kassa_flutter/core/models/dialog_models.dart';
@ -9,31 +10,109 @@ import 'package:aman_kassa_flutter/core/route_names.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/core/services/navigator_service.dart';
import 'package:aman_kassa_flutter/redux/constants/setting_const.dart';
import 'package:aman_kassa_flutter/redux/state/setting_state.dart';
import 'package:aman_kassa_flutter/redux/store.dart';
import 'package:aman_kassa_flutter/shared/app_colors.dart';
import 'package:aman_kassa_flutter/shared/ui_helpers.dart';
import 'package:aman_kassa_flutter/views/settings/printer/PrinterTest.dart';
import 'package:aman_kassa_flutter/views/payment/payment_view.dart';
import 'package:aman_kassa_flutter/widgets/fields/busy_button_icon.dart';
import 'package:esc_pos_bluetooth/esc_pos_bluetooth.dart';
import 'package:esc_pos_utils/esc_pos_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bluetooth_basic/flutter_bluetooth_basic.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:esys_flutter_share/esys_flutter_share.dart';
import 'package:url_launcher/url_launcher.dart';
class ImageShowContainer extends StatelessWidget {
final ImageShowModel data;
class ImageShowContainer extends StatefulWidget {
final ImageShowModel showModel;
ImageShowContainer(this.data);
ImageShowContainer(this.showModel);
@override
_ImageShowContainerState createState() => _ImageShowContainerState();
}
class _ImageShowContainerState extends State<ImageShowContainer> {
final PrinterBluetoothManager printerManager = PrinterBluetoothManager();
final DialogService _dialogService = locator<DialogService>();
final BluetoothDevice printerBtDevice = Redux.store.state.settingState.printerBT;
bool _printing = false;
void _print() async {
final SettingState state = Redux.store.state.settingState;
if(state.printerBT == null) {
_dialogService.showDialog(description: 'Укажите в настройках принтер для печати чеков');
return;
}
setState(() {
_printing = true;
});
try {
printerManager.selectPrinter(PrinterBluetooth(state.printerBT));
PaperSize paper = state.printerPaperSize == SettingPrinterPaperM80
? PaperSize.mm80
: PaperSize.mm58;
if (SettingPrinterEncodingImage == state.printerEncoding) {
final PosPrintResult res = await printerManager.printTicket(
await printImageCheck(paper, widget.showModel.data.base64Data),
chunkSizeBytes: 3096,
queueSleepTimeMs: 50);
if (res.value != 1) {
_dialogService.showDialog(description: res.msg);
}
} else {
final PosPrintResult res = await printerManager.printTicket(
await printTextCheck(
paper, state.printerEncoding,
jsonDecode(widget.showModel.data.textData)),
chunkSizeBytes: 3096,
queueSleepTimeMs: 50);
if (res.value != 1) {
_dialogService.showDialog(description: res.msg);
}
}
} finally {
setState(() {
_printing = false;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
//backgroundColor: fillColor,
title: Text(data.title),
title: Text(widget.showModel.title),
actions: [
if(_printing)
Padding(
padding: const EdgeInsets.only(right: 8.0),
child: SizedBox(
width: 36.0,
child: Center(
child: CircularProgressIndicator(
strokeWidth: 2,
valueColor: new AlwaysStoppedAnimation<Color>(
whiteColor),
),
),
),
)
else
IconButton(icon: Icon(Icons.print), onPressed: _print)
],
),
body: ListView(
children: <Widget>[imageFromBase64String(data.data)],
children: <Widget>[imageFromBase64String(widget.showModel.data.base64Data)],
),
floatingActionButton: MyFloatingActionButton(data),
floatingActionButton: MyFloatingActionButton(widget.showModel),
);
}
}
@ -46,7 +125,7 @@ Padding imageFromBase64String(String base64String) {
}
class ImageShowModel {
final String data;
final CheckImageModal data;
final String title;
final String url;
final CardData cardData;
@ -68,93 +147,71 @@ class _MyFloatingActionButtonState extends State<MyFloatingActionButton> {
NavigatorService _navigatorService = locator<NavigatorService>();
double sheetHeight = 260;
@override
Widget build(BuildContext context) {
if (showFab) {
return Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
if (widget.data.cardData != null && widget.data.cardData.transactionType == "payment") FloatingActionButton(
backgroundColor: redColor,
child: Icon(
Icons.settings_backup_restore,
color: whiteColor,
),
onPressed: () {
_navigatorService.replace(HomeViewRoute);
PaymentModel model = new PaymentModel(voucher: widget.data.voucher, cardData: widget.data.cardData);
_navigatorService.push(PaymentNfcViewRoute,
arguments: model);
},
heroTag: null,
) else SizedBox(
height: 0,
),
SizedBox(
height: 10,
),
FloatingActionButton(
child: Icon(Icons.share),
onPressed: () {
var bottomSheetController = showBottomSheet(
context: context,
builder: (bottomSheetContext) => Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(15)),
boxShadow: [
BoxShadow(
blurRadius: 10,
color: Colors.grey[300],
spreadRadius: 5)
]),
height: 260,
child: Column(
children: <Widget>[
verticalSpaceSmall,
BusyButtonIcon(
title: 'WhatsApp',
onPressed: callWhatsApp,
mainColor: greenColor,
icon: MdiIcons.whatsapp,
enabled: widget.data.url != null,
),
verticalSpaceSmall,
BusyButtonIcon(
title: 'QR-код чека',
onPressed: qrGenerate,
mainColor: primaryColor,
icon: MdiIcons.qrcode,
enabled: widget.data.url != null,
),
verticalSpaceSmall,
BusyButtonIcon(
title: 'Поделиться',
onPressed: shareFile,
mainColor: yellowColor,
icon: Icons.share,
),
],
)));
showFloatingActionButton(false);
bottomSheetController.closed.then((value) {
showFloatingActionButton(true);
});
},
),
],
);
} else {
return Container();
}
return showFab
? FloatingActionButton(
child: Icon(Icons.share),
onPressed: () {
var bottomSheetController = showBottomSheet(
context: context,
builder: (bottomSheetContext) => Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(15)),
boxShadow: [
BoxShadow(
blurRadius: 10,
color: Colors.grey[300],
spreadRadius: 5)
]),
height: sheetHeight,
child: Column(
children: <Widget>[
verticalSpaceSmall,
BusyButtonIcon(
title: 'WhatsApp',
onPressed: callWhatsApp,
mainColor: greenColor,
icon: MdiIcons.whatsapp,
enabled: widget.data.url != null,
),
verticalSpaceSmall,
BusyButtonIcon(
title: 'QR-код чека',
onPressed: qrGenerate,
mainColor: primaryColor,
icon: MdiIcons.qrcode,
enabled: widget.data.url != null,
),
verticalSpaceSmall,
BusyButtonIcon(
title: 'Поделиться',
onPressed: shareFile,
mainColor: redColor,
icon: Icons.share,
),
],
)));
bottomSheetController.closed.then((value) {
showFloatingActionButton(true);
});
},
)
: Container();
}
void shareFile() async {
try {
await Share.file('Aman Kassa', 'aman_kassa_check.png',
base64Decode(widget.data.data), 'image/png');
base64Decode(widget.data.data.base64Data), 'image/png');
} catch (e) {
print('error: $e');
}
@ -163,7 +220,7 @@ class _MyFloatingActionButtonState extends State<MyFloatingActionButton> {
void qrGenerate() async {
_navigatorService.push(QrViewRoute,
arguments:
ImageShowModel(data: widget.data.url, title: 'Спасибо за покупку'));
ImageShowModel(url: widget.data.url, title: 'Спасибо за покупку'));
}
void callWhatsApp() async {

View File

@ -2,6 +2,7 @@ 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/check_image_modal.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/close_day_data.dart';
@ -76,7 +77,13 @@ class _HistoryViewState extends State<HistoryView> {
cardData = checkData.cardData;
}
String base64Data = voucher.base64Data;
CheckImageModal checkImageData;
if(base64Data !=null && base64Data.startsWith('{')){
checkImageData = CheckImageModal.fromJson(jsonDecode(base64Data));
} else {
checkImageData = new CheckImageModal(base64Data: base64Data);
}
return ListTile(
onTap: () {
@ -86,7 +93,7 @@ class _HistoryViewState extends State<HistoryView> {
} else {
_navigatorService.push(ImageShowRoute,
arguments: ImageShowModel(
data: voucher.base64Data,
data: checkImageData,
title: voucher.name,
url: voucher.url,
cardData: cardData,

View File

@ -34,6 +34,8 @@ class _PopupMenuState extends State<PopupMenu> {
// const Choice(title: 'Bank', icon: Icons.text_fields, command: 'bank'),
if (version >= 24 )
const Choice(title: 'Настройка HalykPos', icon: Icons.phonelink_lock_outlined, command: 'tap2phone'),
const Choice(title: 'Настройки', icon: Icons.settings, command: 'settings'),
const Choice(title: 'Принтер', icon: Icons.print, command: 'print'),
const Choice(title: 'Выйти', icon: Icons.exit_to_app, command: 'exit')
];
setState(() {

View File

@ -6,31 +6,33 @@ import 'package:aman_kassa_flutter/core/route_names.dart';
import 'package:aman_kassa_flutter/core/services/ApiService.dart';
import 'package:aman_kassa_flutter/core/services/DataService.dart';
import 'package:aman_kassa_flutter/core/services/navigator_service.dart';
import 'package:aman_kassa_flutter/redux/actions/setting_actions.dart';
import 'package:aman_kassa_flutter/redux/actions/user_actions.dart';
import 'package:aman_kassa_flutter/redux/constants/setting_const.dart';
import 'package:aman_kassa_flutter/redux/state/setting_state.dart';
import 'package:aman_kassa_flutter/redux/store.dart';
import 'package:aman_kassa_flutter/shared/app_colors.dart';
import 'package:aman_kassa_flutter/views/home/components/header_title.dart';
import 'package:aman_kassa_flutter/views/lockscreen/passcodescreen.dart';
import 'package:aman_kassa_flutter/widgets/loader/Dialogs.dart';
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:logger/logger.dart';
import 'package:shared_preferences/shared_preferences.dart';
import './tabs/KassaTab.dart';
import './tabs/AdditionalTab.dart';
import './tabs/CalculatorTab.dart';
import './components/popup_menu.dart';
import 'components/bottom_bar.dart';
import './components/bottom_bar.dart';
class HomeView extends StatefulWidget {
@override
_HomeViewState createState() => _HomeViewState();
}
class _HomeViewState extends State<HomeView> {
class _HomeViewState extends State<HomeView> with WidgetsBindingObserver {
Logger log = getLogger('HomeView');
PageController pageController;
int selectedTabIndex;
@ -39,17 +41,101 @@ class _HomeViewState extends State<HomeView> {
NavigatorService _navigatorService = locator<NavigatorService>();
final GlobalKey<State> _keyLoader = new GlobalKey<State>();
final lastKnownStateKey = 'lastKnownStateKey';
final backgroundedTimeKey = 'backgroundedTimeKey';
final pinLockMillis = 2000; // 2 seconds
Future _paused() async {
final sp = await SharedPreferences.getInstance();
sp.setInt(lastKnownStateKey, AppLifecycleState.paused.index);
}
Future _inactive() async {
final sp = await SharedPreferences.getInstance();
final prevState = sp.getInt(lastKnownStateKey);
final prevStateIsNotPaused = prevState != null &&
AppLifecycleState.values[prevState] != AppLifecycleState.paused;
final bool pinIsExist = Redux.store.state.settingState?.pinCode?.isNotEmpty;
final bool pinSkipped = Redux.store.state.settingState.pinSkip;
print('prevStateIsNotPaused=$prevStateIsNotPaused, pinIsExist=$pinIsExist, pinSkipped=$pinSkipped');
if(prevStateIsNotPaused && pinSkipped == false && pinIsExist == true) {
// save App backgrounded time to Shared preferences
sp.setInt(backgroundedTimeKey, DateTime.now().millisecondsSinceEpoch);
}
// update previous state as inactive
sp.setInt(lastKnownStateKey, AppLifecycleState.inactive.index);
}
Future _resumed() async {
final sp = await SharedPreferences.getInstance();
final bgTime = sp.getInt(backgroundedTimeKey) ?? 0;
final allowedBackgroundTime = bgTime + pinLockMillis;
final shouldShowPIN = DateTime.now().millisecondsSinceEpoch > allowedBackgroundTime;
if(shouldShowPIN && bgTime > 0) {
await Redux.store.dispatch(changePinLockedFromSetting(true));
pushToLockScreen();
}
sp.remove(backgroundedTimeKey); // clean
sp.setInt(lastKnownStateKey, AppLifecycleState.resumed.index);// previous state
}
void pushToLockScreen() {
Navigator.of(context).push(MaterialPageRoute(
builder: (_) =>
WillPopScope(
onWillPop: () async {
return false;
},
child: PassCodeScreen( title: 'Безопасность',)
)
));
}
_checkLockPin () async {
final bool pinIsExist = Redux.store.state.settingState?.pinCode?.isNotEmpty;
final bool pinLocked = Redux.store.state.settingState?.pinLocked;
final sp = await SharedPreferences.getInstance();
sp.remove(backgroundedTimeKey);
sp.setInt(lastKnownStateKey, AppLifecycleState.resumed.index);// previous state
if ( pinIsExist == true && pinLocked == true ) {
await Future.delayed(Duration(milliseconds: 50));
pushToLockScreen();
}
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
selectedTabIndex = 0;
pageController = new PageController(initialPage: selectedTabIndex);
Redux.store.dispatch(checkSmena);
_dataService.checkDbFill(Redux.store.state.userState.user);
_checkLockPin();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
print('state = $state');
switch(state) {
case AppLifecycleState.resumed:
_resumed();
break;
case AppLifecycleState.paused:
_paused();
break;
case AppLifecycleState.inactive:
_inactive();
break;
default:
break;
}
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
pageController.dispose();
super.dispose();
}
@ -65,6 +151,10 @@ class _HomeViewState extends State<HomeView> {
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop();
} else if (choice.command == 'infokkm') {
_navigatorService.push(InfoKkmViewRoute);
} else if (choice.command == 'settings') {
_navigatorService.push(SettingsViewRoute);
} else if (choice.command == 'print') {
_navigatorService.push(SettingsPrinterRoute);
} else if (choice.command == 'bank') {
_navigatorService.push(BankViewRoute);
} else if (choice.command == 'tap2phone') {

View File

@ -6,6 +6,7 @@ import 'package:aman_kassa_flutter/core/services/DataService.dart';
import 'package:aman_kassa_flutter/core/services/dialog_service.dart';
import 'package:aman_kassa_flutter/core/services/navigator_service.dart';
import 'package:aman_kassa_flutter/redux/actions/kassa_actions.dart';
import 'package:aman_kassa_flutter/redux/actions/setting_actions.dart';
import 'package:aman_kassa_flutter/redux/constants/operation_const.dart';
import 'package:aman_kassa_flutter/redux/constants/setting_const.dart';
import 'package:aman_kassa_flutter/redux/state/kassa_state.dart';
@ -183,6 +184,7 @@ class KassaTab extends StatelessWidget {
Future<void> scan() async {
try {
await Redux.store.dispatch(changePinSkipFromSetting(true));
var options = ScanOptions(strings: {
"cancel": 'Отмена',
"flash_on": 'Вкл фонарик',
@ -217,7 +219,7 @@ class KassaTab extends StatelessWidget {
List<Good> goods =
await _dataService.getGoodsByBarcode(barcode: barcode);
if (goods != null && goods.isNotEmpty) {
Redux.store.dispatch(addProductToKassaItems(goods.first, dataMatrix));
await Redux.store.dispatch(addProductToKassaItems(goods.first, dataMatrix));
} else {
_dialogService.showDialog(
description: 'Товар не найден: $barcode');
@ -238,6 +240,8 @@ class KassaTab extends StatelessWidget {
result.rawContent = 'Unknown error: $e';
_dialogService.showDialog(description: 'Неизвестная ошибка: $e');
}
} finally {
await Redux.store.dispatch(changePinSkipFromSetting(false));
}
}

View File

@ -0,0 +1,79 @@
import 'package:aman_kassa_flutter/core/route_names.dart';
import 'package:aman_kassa_flutter/redux/actions/setting_actions.dart';
import 'package:aman_kassa_flutter/redux/store.dart';
import 'package:flutter/material.dart';
import 'package:flutter_lock_screen/flutter_lock_screen.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:aman_kassa_flutter/core/locator.dart';
import 'package:aman_kassa_flutter/core/services/navigator_service.dart';
class PassCodeScreen extends StatefulWidget {
PassCodeScreen({Key key, this.title}) : super(key: key);
final String title;
@override
_PassCodeScreenState createState() => new _PassCodeScreenState();
}
class _PassCodeScreenState extends State<PassCodeScreen> {
// bool isFingerprint = false;
NavigatorService _navigatorService = locator<NavigatorService>();
final backgroundedTimeKey = 'backgroundedTimeKey';
// Future<Null> biometrics() async {
// final LocalAuthentication auth = new LocalAuthentication();
// bool authenticated = false;
//
// try {
// authenticated = await auth.authenticateWithBiometrics(
// localizedReason: 'Scan your fingerprint to authenticate',
// useErrorDialogs: true,
// stickyAuth: false);
// } on PlatformException catch (e) {
// print(e);
// }
// if (!mounted) return;
// if (authenticated) {
// setState(() {
// isFingerprint = true;
// });
// }
// }
@override
Widget build(BuildContext context) {
var myPass = [];
String _pinCode = Redux.store.state.settingState.pinCode;
for (var i = 0; i < _pinCode.length; i++) {
myPass.add(int.parse(_pinCode[i]));
}
return LockScreen(
title: "Введите ПИН-код",
passLength: myPass.length,
bgImage: "assets/images/secBg.jpg",
// fingerPrintImage: "assets/images/finger.png",
// showFingerPass: true,
// fingerFunction: biometrics,
// fingerVerify: isFingerprint,
borderColor: Colors.white,
showWrongPassDialog: true,
wrongPassContent: "Неверный код, повторите попытку",
wrongPassTitle: "Aman Kassa",
wrongPassCancelButtonText: "Отмена",
passCodeVerify: (passcode) async {
for (int i = 0; i < myPass.length; i++) {
if (passcode[i] != myPass[i]) {
return false;
}
}
return true;
},
onSuccess: () {
Redux.store.dispatch(changePinLockedFromSetting(false));
_navigatorService.replace(HomeViewRoute);
});
}
}

View File

@ -1,6 +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/calc_model.dart';
import 'package:aman_kassa_flutter/core/models/check_image_modal.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';
@ -281,6 +284,7 @@ class _PaymentViewState extends State<PaymentView> {
if (response.operation) {
String message = response.body['message'];
String check = response.body['check'];
var checkText = response.body['check_text'];
String url = response?.body['link'];
print('url : $url');
if (_mode == SettingModeCalc) {
@ -293,9 +297,8 @@ class _PaymentViewState extends State<PaymentView> {
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop();
_navigatorService.pop();
_navigatorService.push(ImageShowRoute,
arguments: ImageShowModel(data: check, title: message, url: url));
} else if (!response.operation &&
![401, 402, 403, 412, 500].contains(response.status)) {
arguments: ImageShowModel(data:new CheckImageModal(base64Data: check, textData: checkText !=null ? jsonEncode(checkText) : null ), title: message, url: url ));
} else if (!response.operation && ![401, 402, 403, 412, 500].contains(response.status)) {
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop();
_dialogService.showDialog(description: response.body['message']);
} else if(!response.operation && response.body['message'] != null) {

View File

@ -7,6 +7,8 @@ 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/check_data.dart';
import 'package:aman_kassa_flutter/core/models/check_image_modal.dart';
import 'package:aman_kassa_flutter/core/models/halyk_post_session.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';
@ -70,6 +72,19 @@ class _PaymentNfcViewState extends State<PaymentNfcView> {
void start() async {
//Авторизация
String token = Redux.store.state.userState.user.token;
BankState bankState = Redux.store.state.bankState;
//права доступа
HalykPosSession session = await _bankService.renewToken(token: token, login: bankState.login, password: bankState.password);
log.i(session);
if ('1' == '1') {
setState(() {
status = 4;
});
return;
}
//права доступа
bool success = await _bankService.permissions();
@ -114,8 +129,7 @@ class _PaymentNfcViewState extends State<PaymentNfcView> {
});
return;
}
//Авторизация
BankState bankState = Redux.store.state.bankState;
AmanDao authDao = await _bankService.auth(
login: bankState.login, password: bankState.password);
if (!authDao.success) {
@ -276,6 +290,7 @@ class _PaymentNfcViewState extends State<PaymentNfcView> {
if (response.operation) {
String message = response.body['message'];
String check = response.body['check'];
var checkText = response.body['check_text'];
String url = response?.body['link'];
print('url : $url');
if (_mode == SettingModeCalc) {
@ -288,11 +303,11 @@ class _PaymentNfcViewState extends State<PaymentNfcView> {
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop();
_navigatorService.replace(HomeViewRoute);
_navigatorService.push(ImageShowRoute,
arguments: ImageShowModel(data: check, title: message, url: url));
arguments: ImageShowModel(data: new CheckImageModal(base64Data: check, textData: checkText !=null ? jsonEncode(checkText) : null ), title: message, url: url));
} else if (!response.operation &&
![401, 402, 403, 412, 500].contains(response.status)) {
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop();
_dialogService.showDialog(description: response.body['message']);
_dialogService.showDialog(description: response.body['message']);
} else {
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop();
}
@ -332,6 +347,7 @@ class _PaymentNfcViewState extends State<PaymentNfcView> {
if (response.operation) {
String message = response.body['message'];
String check = response.body['check'];
var checkText = response.body['check_text'];
String url = response?.body['link'];
print('url : $url');
Redux.store.dispatch(checkMoney);
@ -339,7 +355,7 @@ class _PaymentNfcViewState extends State<PaymentNfcView> {
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop();
_navigatorService.replace(HomeViewRoute);
_navigatorService.push(ImageShowRoute,
arguments: ImageShowModel(data: check, title: message, url: url));
arguments: ImageShowModel(data: new CheckImageModal(base64Data: check, textData: checkText !=null ? jsonEncode(checkText) : null ), title: message, url: url));
} else if (!response.operation &&
![401, 402, 403, 412, 500].contains(response.status)) {
Navigator.of(_keyLoader.currentContext, rootNavigator: true).pop();

View File

@ -27,7 +27,7 @@ class _QrViewState extends State<QrView> {
body: Container(
child: Center(
child: QrImage(
data: widget.data.data,
data: widget.data.url,
version: QrVersions.auto,
size: 220.0,
),

View File

@ -0,0 +1,37 @@
import 'package:flutter/material.dart';
class SettingItem extends StatefulWidget {
final String name;
final String value;
final String title;
final Function onTap;
SettingItem({Key key, this.name, this.value, this.onTap, this.title }) : super(key: key);
@override
_SettingItemState createState() => _SettingItemState();
}
class _SettingItemState extends State<SettingItem> {
@override
Widget build(BuildContext context) {
return Card(
child: ListTile(
title: Text(widget.title),
subtitle: Text.rich(
TextSpan(
text: widget.name,
style: TextStyle(fontWeight: FontWeight.w500),
children: <TextSpan>[
if(widget.value !=null)
TextSpan(text: ' ${widget.value}', style: TextStyle(fontStyle: FontStyle.italic)),
],
)
),
trailing: Icon(Icons.chevron_right),
onTap: widget.onTap,
),
);
}
}

View File

@ -0,0 +1,229 @@
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:aman_kassa_flutter/redux/constants/setting_const.dart';
import 'package:charset_converter/charset_converter.dart';
import 'package:esc_pos_utils/esc_pos_utils.dart';
import 'package:flutter/services.dart';
import 'package:image/image.dart' as Im;
import 'package:path_provider/path_provider.dart';
import 'package:qr_flutter/qr_flutter.dart';
Future<Ticket> testTicket(PaperSize paper) async {
final Ticket ticket = Ticket(paper);
//Uint8List encTxt11 = await CharsetConverter.encode("cp866", "Russian: Привет Мир!");
//ticket.textEncoded(encTxt11, styles: PosStyles(codeTable: PosCodeTable.pc866_2));
//ticket.textEncoded(encTxt11);
// ticket.text('Special 1: àÀ', styles: PosStyles(codeTable: PosCodeTable.westEur)); //А
// ticket.text('Special 1: á'.toUpperCase(), styles: PosStyles(codeTable: PosCodeTable.westEur));// Б
// ticket.text('Special 1: â', styles: PosStyles(codeTable: PosCodeTable.westEur)); //В
// ticket.text('Special 1: ã', styles: PosStyles(codeTable: PosCodeTable.westEur));// Г
// ticket.text('Special 1: äÄ', styles: PosStyles(codeTable: PosCodeTable.westEur)); //Д
// ticket.text('Special 1: å', styles: PosStyles(codeTable: PosCodeTable.westEur));// Е
// ticket.text('Special 1: æÆ', styles: PosStyles(codeTable: PosCodeTable.westEur));// Ж
// ticket.text('Special 1: ç', styles: PosStyles(codeTable: PosCodeTable.westEur));//З
// ticket.text('Special 1: èÈ', styles: PosStyles(codeTable: PosCodeTable.westEur)); // И
// ticket.text('Special 1: éÉ', styles: PosStyles(codeTable: PosCodeTable.westEur)); // Й
// ticket.text('Special 1: ê', styles: PosStyles(codeTable: PosCodeTable.westEur));//К
// ticket.text('Special 1: ëË', styles: PosStyles(codeTable: PosCodeTable.westEur)); // Л
// ticket.text('Special 1: ìÌ', styles: PosStyles(codeTable: PosCodeTable.westEur));// M
// ticket.text('Special 1: íÍ', styles: PosStyles(codeTable: PosCodeTable.westEur)); // Н
// ticket.text('Special 1: î', styles: PosStyles(codeTable: PosCodeTable.westEur));// О
// ticket.text('Special 1: ï', styles: PosStyles(codeTable: PosCodeTable.westEur)); // П
// ticket.text('Special 1: ð', styles: PosStyles(codeTable: PosCodeTable.westEur));// Р
// ticket.text('Special 1: ñ', styles: PosStyles(codeTable: PosCodeTable.westEur));// С
// ticket.text('Special 1: ò', styles: PosStyles(codeTable: PosCodeTable.westEur)); // Т
// ticket.text('Special 1: óÓ', styles: PosStyles(codeTable: PosCodeTable.westEur)); //У
// ticket.text('Special 1: ô', styles: PosStyles(codeTable: PosCodeTable.westEur));// Ф
// ticket.text('Special 1: õÕ', styles: PosStyles(codeTable: PosCodeTable.westEur));// Х
// ticket.text('Special 1: ö', styles: PosStyles(codeTable: PosCodeTable.westEur)); //Ц
// ticket.text('Special 1: ÷', styles: PosStyles(codeTable: PosCodeTable.westEur)); //Ч
// ticket.text('Special 1: ø', styles: PosStyles(codeTable: PosCodeTable.westEur));//Ш
// ticket.text('Special 1: ù', styles: PosStyles(codeTable: PosCodeTable.westEur)); //Щ
// ticket.text('Special 1: ú', styles: PosStyles(codeTable: PosCodeTable.westEur));//Ъ
// ticket.text('Special 1: û', styles: PosStyles(codeTable: PosCodeTable.westEur));//Ы
// ticket.text('Special 1: üÜ', styles: PosStyles(codeTable: PosCodeTable.westEur)); //Ь
// ticket.text('Special 1: ý', styles: PosStyles(codeTable: PosCodeTable.westEur)); //Э
// ticket.text('Special 1: þ', styles: PosStyles(codeTable: PosCodeTable.westEur)); // ю
// ticket.text('Special 1: ÿß', styles: PosStyles(codeTable: PosCodeTable.westEur)); //Я
// Uint8List encTxt11 = await CharsetConverter.encode("cp866", "Russian: Привет Мир!");
// //ticket.textEncoded(encTxt11, styles: PosStyles(codeTable: PosCodeTable.pc866_2));
// ticket.textEncoded(encTxt11);
ticket.text(
'Regular: aA bB cC dD eE fF gG hH iI jJ kK lL mM nN oO pP qQ rR sS tT uU vV wW xX yY zZ');
//ticket.text('Special 1: àÀ èÈ éÉ ûÛ üÜ çÇ ôÔ', styles: PosStyles(codeTable: PosCodeTable.westEur));
//ticket.text('Special 2: blåbærgrød', styles: PosStyles(codeTable: PosCodeTable.westEur));
ticket.text('Bold text', styles: PosStyles(bold: true));
ticket.text('Reverse text', styles: PosStyles(reverse: true));
ticket.text('Underlined text',
styles: PosStyles(underline: true), linesAfter: 1);
ticket.text('Align left', styles: PosStyles(align: PosAlign.left));
ticket.text('Align center', styles: PosStyles(align: PosAlign.center));
ticket.text('Align right',
styles: PosStyles(align: PosAlign.right), linesAfter: 1);
ticket.row([
PosColumn(
text: 'col3',
width: 3,
styles: PosStyles(align: PosAlign.center, underline: true),
),
PosColumn(
text: 'col6',
width: 6,
styles: PosStyles(align: PosAlign.center, underline: true),
),
PosColumn(
text: 'col3',
width: 3,
styles: PosStyles(align: PosAlign.center, underline: true),
),
]);
ticket.text('Text size 200%',
styles: PosStyles(
height: PosTextSize.size2,
width: PosTextSize.size2,
));
// Print image
//final ByteData data = await rootBundle.load('assets/images/logo.png');
//final Uint8List bytes = data.buffer.asUint8List();
// Print image using alternative commands
// ticket.imageRaster(image);
// ticket.imageRaster(image, imageFn: PosImageFn.graphics);
// Print barcode
final List<int> barData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 4];
ticket.barcode(Barcode.upcA(barData));
ticket.feed(2);
ticket.cut();
return ticket;
}
Future<Ticket> testTicketImage(PaperSize paper) async {
final Ticket ticket = Ticket(paper);
// Print image
final ByteData byteData = await rootBundle.load('assets/images/check.png');
final Uint8List bytes = byteData.buffer.asUint8List();
final Im.Image imagea = Im.decodeImage(bytes);
// Using `ESC *`
//ticket.image(imagea);
// Using `GS v 0` (obsolete)
//ticket.imageRaster(imagea);
// Using `GS ( L`
ticket.imageRaster(imagea, imageFn: PosImageFn.bitImageRaster);
ticket.feed(2);
ticket.cut();
return ticket;
}
Future<Ticket> printImageCheck(PaperSize paper, String base64Src) async {
final Ticket ticket = Ticket(paper);
final Uint8List bytes = base64Decode(base64Src);
final Im.Image image = Im.decodeImage(bytes);
//ticket.imageRaster(image, imageFn: PosImageFn.bitImageRaster);
ticket.image(image);
ticket.feed(2);
ticket.cut();
return ticket;
}
Future<Ticket> printTextCheck(PaperSize paper, String encoding, var data ) async {
final Ticket ticket = Ticket(paper);
PosCodeTable codeTable;
if(encoding == SettingPrinterEncodingCp866) {
codeTable = PosCodeTable.pc866_2;
} else if(encoding == SettingPrinterEncodingWin1251) {
codeTable = PosCodeTable.wpc1251;
}
ticket.setGlobalCodeTable(codeTable);
ticket.setGlobalFont(PosFontType.fontB);
String qr = data['qr'];
List<dynamic> rows = data['rows'] as List;
for(dynamic element in rows) {
var text = element['text'];
int size = element['size'] as int;
bool center = element['center'] !=null ? element['center'] as bool : false;
if(text is List) {
Uint8List firstCol = await CharsetConverter.encode(encoding, (text).first as String);
Uint8List lastCol = await CharsetConverter.encode(encoding, (text).last as String);
ticket.row([
PosColumn(
textEncoded: firstCol,
width: 6,
styles: PosStyles(align: PosAlign.left),
),
PosColumn(
textEncoded: lastCol,
width: 6,
styles: PosStyles(align: PosAlign.right),
),
]);
} else {
String line = text as String;
if(line == 'breakline') {
ticket.hr();
} else if(line == 'br') {
ticket.emptyLines(1);
} else {
Uint8List encTxt11 = await CharsetConverter.encode(encoding, line);
ticket.textEncoded( encTxt11, styles: PosStyles( align: center ? PosAlign.center : PosAlign.left ));
}
}
}
// Print barcode
//final List<int> barData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 4];
//ticket.barcode(Barcode.upcA(barData));
//ticket.qrcode(qr, align: PosAlign.center);
ticket.emptyLines(1);
const double qrSize = 200;
try {
final uiImg = await QrPainter(
data: qr,
version: QrVersions.auto,
gapless: false,
).toImageData(qrSize);
final dir = await getTemporaryDirectory();
final pathName = '${dir.path}/qr_tmp.png';
final qrFile = File(pathName);
final imgFile = await qrFile.writeAsBytes(uiImg.buffer.asUint8List());
final img = Im.decodeImage(imgFile.readAsBytesSync());
ticket.image(img);
} catch (e) {
print(e);
}
ticket.feed(2);
ticket.cut();
return ticket;
}

View File

@ -0,0 +1,12 @@
import 'package:aman_kassa_flutter/redux/constants/setting_const.dart';
var encoding = {
SettingPrinterEncodingCp866: "CP-866",
SettingPrinterEncodingWin1251: "Windows-1251",
SettingPrinterEncodingImage: "Big-Encoding",
};
var paperSize = {
SettingPrinterPaperM58: "58 мм",
SettingPrinterPaperM80: "80 мм"
};

View File

@ -0,0 +1,53 @@
var exampleJson = {
"check_text": {
"rows": [
{"size": 14, "text": "", "center": true},
{"size": 15, "text": "breakline", "center": true},
{"size": 14, "text": "ТОО «Aman Systems»"},
{"size": 14, "text": "ИИН/БИН: 180640018960"},
{"size": 14, "text": "Сер. номер ККМ: TEST00000005"},
{"size": 14, "text": "Регистрационный номер: 123132132323"},
{"size": 14, "text": "Коргальджинское шоссе, д.19 оф.308"},
{"size": 15, "text": "breakline", "center": true},
{"size": 14, "text": "Продажа,Наличные, ", "center": true},
{"size": 15, "text": "ФИСКАЛЬНЫЙ ЧЕК №16580", "center": true},
{"size": 15, "text": "ФП 471369529060", "center": true},
{"size": 15, "text": "Дата: 03.03.2021 23:16", "center": true},
{"size": 15, "text": "breakline", "center": true},
{"size": 14, "text": "Кассир: Амантай ИХ"},
{"size": 14, "text": "Касса: Касса 1"},
{"size": 15, "text": "breakline", "center": true},
{"size": 15, "text": "br"},
{"size": 14, "text": "1. test"},
{"size": 14, "text": "200,00 x 1 = 200,00"},
{"size": 10, "text": "br"},
{"size": 15, "text": "breakline"},
{
"size": 17,
"text": ["ИТОГО:", "200,00"]
},
{
"size": 14,
"text": ["Наличные", "200,00"]
},
{"size": 15, "text": "breakline"},
{"size": 17, "text": "В том числе НДС:"},
{
"size": 14,
"text": ["12 %", "21,43"]
},
{"size": 14, "text": ""},
{"size": 15, "text": "breakline"},
{"size": 15, "text": "ОФД АО \"Транстелеком\"", "center": true},
{"size": 15, "text": "ofd1.kz", "center": true},
{"size": 14, "text": ""},
{"size": 15, "text": "breakline"},
{"size": 14, "text": "", "center": true},
{"size": 13, "text": "порядковый номер чека:19800", "center": true},
{"size": 14, "text": "Онлайн касса Aman", "center": true},
{"size": 14, "text": "kassa.aman.com.kz", "center": true}
],
"qr":
"87.255.215.94:4000/t/?i=471369529060&f=123132132323&s=200.0&t=20210303T231651"
}
};

View File

@ -0,0 +1,94 @@
import 'dart:async';
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:aman_kassa_flutter/core/logger.dart';
import 'package:aman_kassa_flutter/redux/actions/setting_actions.dart';
import 'package:aman_kassa_flutter/redux/store.dart';
import 'package:esc_pos_bluetooth/esc_pos_bluetooth.dart';
import 'package:esc_pos_utils/esc_pos_utils.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart' hide Image;
import 'package:flutter/rendering.dart';
import 'package:flutter_bluetooth_basic/flutter_bluetooth_basic.dart';
import 'package:intl/intl.dart';
import 'package:logger/logger.dart';
import '../data/settings_envi.dart';
class PrinterEncodingView extends StatefulWidget {
PrinterEncodingView({Key key, this.title}) : super(key: key);
final String title;
@override
_PrinterEncodingViewState createState() => _PrinterEncodingViewState();
}
class _PrinterEncodingViewState extends State<PrinterEncodingView> {
Logger _logger = getLogger('PrinterEncodingView');
@override
void initState() {
super.initState();
}
void _selectPrinter(String encoding, BuildContext context, ) async {
_logger.i(encoding);
await Redux.store.dispatch(selectPrinterEncodingFromSetting(encoding));
Navigator.of(context).pop(false);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Выберите кодировку'),
),
body: ListView.builder(
itemCount: encoding.keys.length,
itemBuilder: (BuildContext _, int index) {
return InkWell(
onTap: () => _selectPrinter(encoding.keys.elementAt(index), context),
child: Column(
children: <Widget>[
Container(
height: 60,
padding: EdgeInsets.only(left: 10),
alignment: Alignment.centerLeft,
child: Row(
children: <Widget>[
Icon(Icons.sort_by_alpha_outlined),
SizedBox(width: 10),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(encoding.values.elementAt(index) ?? ''),
],
),
)
],
),
),
Divider(),
],
),
);
}),
);
}
}

View File

@ -0,0 +1,94 @@
import 'dart:async';
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:aman_kassa_flutter/core/logger.dart';
import 'package:aman_kassa_flutter/redux/actions/setting_actions.dart';
import 'package:aman_kassa_flutter/redux/store.dart';
import 'package:esc_pos_bluetooth/esc_pos_bluetooth.dart';
import 'package:esc_pos_utils/esc_pos_utils.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart' hide Image;
import 'package:flutter/rendering.dart';
import 'package:flutter_bluetooth_basic/flutter_bluetooth_basic.dart';
import 'package:intl/intl.dart';
import 'package:logger/logger.dart';
import '../data/settings_envi.dart';
class PrinterPaperView extends StatefulWidget {
PrinterPaperView({Key key, this.title}) : super(key: key);
final String title;
@override
_PrinterEncodingViewState createState() => _PrinterEncodingViewState();
}
class _PrinterEncodingViewState extends State<PrinterPaperView> {
Logger _logger = getLogger('PrinterEncodingView');
@override
void initState() {
super.initState();
}
void _selectPaper(String paperSize, BuildContext context, ) async {
_logger.i(encoding);
await Redux.store.dispatch(selectPrinterPaperSizeFromSetting(paperSize));
Navigator.of(context).pop(false);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Выберите ширину ленты'),
),
body: ListView.builder(
itemCount: paperSize.keys.length,
itemBuilder: (BuildContext _, int index) {
return InkWell(
onTap: () => _selectPaper(paperSize.keys.elementAt(index), context),
child: Column(
children: <Widget>[
Container(
height: 60,
padding: EdgeInsets.only(left: 10),
alignment: Alignment.centerLeft,
child: Row(
children: <Widget>[
Icon(Icons.sort_by_alpha_outlined),
SizedBox(width: 10),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(paperSize.values.elementAt(index) ?? ''),
],
),
)
],
),
),
Divider(),
],
),
);
}),
);
}
}

View File

@ -0,0 +1,324 @@
import 'dart:async';
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:aman_kassa_flutter/core/logger.dart';
import 'package:aman_kassa_flutter/redux/actions/setting_actions.dart';
import 'package:aman_kassa_flutter/redux/store.dart';
import 'package:esc_pos_bluetooth/esc_pos_bluetooth.dart';
import 'package:esc_pos_utils/esc_pos_utils.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart' hide Image;
import 'package:flutter/rendering.dart';
import 'package:flutter_bluetooth_basic/flutter_bluetooth_basic.dart';
import 'package:intl/intl.dart';
import 'package:logger/logger.dart';
import '../PrinterTest.dart';
class PrinterSelectView extends StatefulWidget {
PrinterSelectView({Key key, this.title}) : super(key: key);
final String title;
@override
_PrinterSelectViewState createState() => _PrinterSelectViewState();
}
class _PrinterSelectViewState extends State<PrinterSelectView> {
PrinterBluetoothManager printerManager = PrinterBluetoothManager();
List<PrinterBluetooth> _devices = [];
Logger _logger = getLogger('PrinterSelectView');
@override
void initState() {
super.initState();
printerManager.scanResults.listen((devices) async {
// print('UI: Devices found ${devices.length}');
setState(() {
_devices = devices;
});
});
_startScanDevices();
}
void _startScanDevices() {
setState(() {
_devices = [];
});
printerManager.startScan(Duration(seconds: 4));
}
void _stopScanDevices() {
printerManager.stopScan();
}
Future<Ticket> demoReceipt(PaperSize paper) async {
final Ticket ticket = Ticket(paper, );
// Print image
// final ByteData data = await rootBundle.load('assets/images/aman_kassa_check.png');
// final Uint8List bytes = data.buffer.asUint8List();
// final Im.Image image = Im.decodeImage(bytes);
// Im.Image thumbnail = Im.copyResize(image, width: 270);
// ticket.image(thumbnail, align: PosAlign.center);
//ticket.imageRaster(image, align: PosAlign.center);
ticket.text('AMAN-SATU',
styles: PosStyles(
align: PosAlign.center,
height: PosTextSize.size2,
width: PosTextSize.size2,
),
linesAfter: 1);
ticket.text('889 Watson Lane', styles: PosStyles(align: PosAlign.center));
ticket.text('Русский язык', styles: PosStyles(align: PosAlign.center, codeTable: PosCodeTable.westEur), containsChinese: true);
ticket.text('Русский язык', styles: PosStyles(align: PosAlign.center, fontType: PosFontType.fontA), containsChinese: true);
ticket.text('Русский язык', styles: PosStyles(align: PosAlign.center, fontType: PosFontType.fontB), containsChinese: true);
ticket.text('Русский язык', styles: PosStyles(align: PosAlign.center, height: PosTextSize.size1), containsChinese: true);
ticket.text('Русский язык', styles: PosStyles(align: PosAlign.center, width: PosTextSize.size2), containsChinese: true);
ticket.text('Русский язык', styles: PosStyles(align: PosAlign.center, width: PosTextSize.size3), containsChinese: true);
ticket.text('Русский язык', styles: PosStyles(align: PosAlign.center, width: PosTextSize.size4), containsChinese: true);
ticket.text('Tel: 830-221-1234', styles: PosStyles(align: PosAlign.center));
ticket.text('Web: www.example.com',
styles: PosStyles(align: PosAlign.center), linesAfter: 1);
ticket.hr();
ticket.row([
PosColumn(text: 'Qty', width: 1),
PosColumn(text: 'Item', width: 7),
PosColumn(
text: 'Price', width: 2, styles: PosStyles(align: PosAlign.right)),
PosColumn(
text: 'Total', width: 2, styles: PosStyles(align: PosAlign.right)),
]);
ticket.row([
PosColumn(text: '2', width: 1),
PosColumn(text: 'ONION RINGS', width: 7),
PosColumn(
text: '0.99', width: 2, styles: PosStyles(align: PosAlign.right)),
PosColumn(
text: '1.98', width: 2, styles: PosStyles(align: PosAlign.right)),
]);
ticket.row([
PosColumn(text: '1', width: 1),
PosColumn(text: 'PIZZA', width: 7),
PosColumn(
text: '3.45', width: 2, styles: PosStyles(align: PosAlign.right)),
PosColumn(
text: '3.45', width: 2, styles: PosStyles(align: PosAlign.right)),
]);
ticket.row([
PosColumn(text: '1', width: 1),
PosColumn(text: 'SPRING ROLLS', width: 7),
PosColumn(
text: '2.99', width: 2, styles: PosStyles(align: PosAlign.right)),
PosColumn(
text: '2.99', width: 2, styles: PosStyles(align: PosAlign.right)),
]);
ticket.row([
PosColumn(text: '3', width: 1),
PosColumn(text: 'CRUNCHY STICKS', width: 7),
PosColumn(
text: '0.85', width: 2, styles: PosStyles(align: PosAlign.right)),
PosColumn(
text: '2.55', width: 2, styles: PosStyles(align: PosAlign.right)),
]);
ticket.hr();
ticket.row([
PosColumn(
text: 'TOTAL',
width: 6,
styles: PosStyles(
height: PosTextSize.size2,
width: PosTextSize.size2,
)),
PosColumn(
text: '\$10.97',
width: 6,
styles: PosStyles(
align: PosAlign.right,
height: PosTextSize.size2,
width: PosTextSize.size2,
)),
]);
ticket.hr(ch: '=', linesAfter: 1);
ticket.row([
PosColumn(
text: 'Cash',
width: 7,
styles: PosStyles(align: PosAlign.right, width: PosTextSize.size2)),
PosColumn(
text: '\$15.00',
width: 5,
styles: PosStyles(align: PosAlign.right, width: PosTextSize.size2)),
]);
ticket.row([
PosColumn(
text: 'Change',
width: 7,
styles: PosStyles(align: PosAlign.right, width: PosTextSize.size2)),
PosColumn(
text: '\$4.03',
width: 5,
styles: PosStyles(align: PosAlign.right, width: PosTextSize.size2)),
]);
ticket.feed(2);
ticket.text('Thank you!',
styles: PosStyles(align: PosAlign.center, bold: true));
final now = DateTime.now();
final formatter = DateFormat('MM/dd/yyyy H:m');
final String timestamp = formatter.format(now);
ticket.text(timestamp,
styles: PosStyles(align: PosAlign.center), linesAfter: 2);
// Print QR Code from image
// try {
// const String qrData = 'example.com';
// const double qrSize = 200;
// final uiImg = await QrPainter(
// data: qrData,
// version: QrVersions.auto,
// gapless: false,
// ).toImageData(qrSize);
// final dir = await getTemporaryDirectory();
// final pathName = '${dir.path}/qr_tmp.png';
// final qrFile = File(pathName);
// final imgFile = await qrFile.writeAsBytes(uiImg.buffer.asUint8List());
// final img = decodeImage(imgFile.readAsBytesSync());
// ticket.image(img);
// } catch (e) {
// print(e);
// }
// Print QR Code using native function
// ticket.qrcode('example.com');
ticket.feed(2);
ticket.cut();
return ticket;
}
void _selectPrinter(PrinterBluetooth printer, BuildContext context, ) async {
printerManager.selectPrinter(printer);
_logger.i(printer.name);
_logger.i(printer.address);
BluetoothDevice device = new BluetoothDevice()
..address = printer.address
..name=printer.name
..type=printer.type;
await Redux.store.dispatch(selectPrinterFromSetting(device));
Navigator.of(context).pop(false);
}
void _testPrint(PrinterBluetooth printer) async {
printerManager.selectPrinter(printer);
// TODO Don't forget to choose printer's paper
const PaperSize paper = PaperSize.mm58;
// TEST PRINT
// final PosPrintResult res =
// await printerManager.printTicket(await testTicket(paper), queueSleepTimeMs: 50);
final PosPrintResult res =
await printerManager.printTicket(
await testTicketImage(paper),
chunkSizeBytes: 1024,
queueSleepTimeMs: 50
);
// DEMO RECEIPT
// final PosPrintResult res =
// await printerManager.printTicket(await demoReceipt(paper) , queueSleepTimeMs: 50);
}
final key = GlobalKey();
@override
Widget build(BuildContext context) {
return RepaintBoundary(
key: key,
child: Scaffold(
appBar: AppBar(
title: Text('Выберите принтер'),
),
body: ListView.builder(
itemCount: _devices.length,
itemBuilder: (BuildContext _, int index) {
return InkWell(
onTap: () => _selectPrinter(_devices[index], context),
child: Column(
children: <Widget>[
Container(
height: 60,
padding: EdgeInsets.only(left: 10),
alignment: Alignment.centerLeft,
child: Row(
children: <Widget>[
Icon(Icons.print),
SizedBox(width: 10),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(_devices[index].name ?? ''),
Text(_devices[index].address),
Text(
'Click to print a test receipt',
style: TextStyle(color: Colors.grey[700]),
),
],
),
)
],
),
),
Divider(),
],
),
);
}),
floatingActionButton: StreamBuilder<bool>(
stream: printerManager.isScanningStream,
initialData: false,
builder: (c, snapshot) {
if (snapshot.data) {
return FloatingActionButton(
child: Icon(Icons.stop),
onPressed: _stopScanDevices,
backgroundColor: Colors.red,
);
} else {
return FloatingActionButton(
child: Icon(Icons.search),
onPressed: _startScanDevices,
);
}
},
),
),
);
}
}

View File

@ -0,0 +1,121 @@
import 'dart:typed_data';
import 'package:aman_kassa_flutter/core/locator.dart';
import 'package:aman_kassa_flutter/core/route_names.dart';
import 'package:aman_kassa_flutter/core/services/dialog_service.dart';
import 'package:aman_kassa_flutter/core/services/navigator_service.dart';
import 'package:aman_kassa_flutter/redux/constants/setting_const.dart';
import 'package:aman_kassa_flutter/redux/state/setting_state.dart';
import 'package:aman_kassa_flutter/redux/store.dart';
import 'package:aman_kassa_flutter/shared/app_colors.dart';
import 'package:aman_kassa_flutter/widgets/fields/aman_icon_button_horizontal.dart';
import 'package:esc_pos_bluetooth/esc_pos_bluetooth.dart';
import 'package:esc_pos_utils/esc_pos_utils.dart';
import 'package:flutter/material.dart';
import 'package:aman_kassa_flutter/views/settings/printer/PrinterTest.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'component/setting_item.dart';
import './printer/data/settings_envi.dart';
import './printer/example/check_test.dart';
class SettingPrinterView extends StatefulWidget {
@override
_SettingPrinterViewState createState() => _SettingPrinterViewState();
}
class _SettingPrinterViewState extends State<SettingPrinterView> {
NavigatorService _navigatorService = locator<NavigatorService>();
final DialogService _dialogService = locator<DialogService>();
PrinterBluetoothManager printerManager = PrinterBluetoothManager();
@override
void initState() {
super.initState();
}
void _testPrint() async {
final SettingState state = Redux.store.state.settingState;
printerManager.selectPrinter(PrinterBluetooth(state.printerBT));
// TODO Don't forget to choose printer's paper
PaperSize paper = state.printerPaperSize == SettingPrinterPaperM80 ? PaperSize.mm80 : PaperSize.mm58;
if(SettingPrinterEncodingImage == state.printerEncoding) {
final PosPrintResult res = await printerManager.printTicket(
await testTicketImage(paper),
chunkSizeBytes: 3096,
queueSleepTimeMs: 50
);
_dialogService.showDialog(description: res.msg);
} else {
final PosPrintResult res = await printerManager.printTicket(
await printTextCheck(paper, state.printerEncoding, exampleJson['check_text']),
chunkSizeBytes: 3096,
queueSleepTimeMs: 50
);
_dialogService.showDialog(description: res.msg);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Настройка принтера'),
),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: StoreConnector<AppState, SettingState>(
converter: (store) => store.state.settingState,
builder: (context, vm) {
return Column(
children: [
SettingItem(
title: 'Принтер',
name: vm.printerBT?.name,
value: vm.printerBT != null
? 'BT: ${vm.printerBT.address} '
: 'не выбран',
onTap: () {
_navigatorService.push(SettingsPrinterBTRoute);
}),
SettingItem(
title: 'Кодировка',
name: vm.printerEncoding != null ? encoding[vm.printerEncoding] : null ,
onTap: () {
_navigatorService.push(SettingsPrinterEncodingRoute);
}),
SettingItem(
title: 'Ширина ленты',
name: vm.printerPaperSize != null ? paperSize[vm.printerPaperSize] : null ,
onTap: () {
_navigatorService.push(SettingsPrinterPaperRoute);
}),
Expanded(
child: Padding(
padding: const EdgeInsets.only(bottom: 24.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
AmanIconButtonHorizontal(
icon: Icons.local_printshop_outlined,
title: 'Напечатать тестовую страницу',
activeColor: primaryColor,
selected: vm.printerBT != null,
onPressed: () {
_testPrint();
},
),
],
),
),
)
],
);
}),
),
);
}
}

View File

@ -0,0 +1,96 @@
import 'package:aman_kassa_flutter/core/locator.dart';
import 'package:aman_kassa_flutter/core/services/dialog_service.dart';
import 'package:aman_kassa_flutter/redux/actions/setting_actions.dart';
import 'package:aman_kassa_flutter/redux/state/setting_state.dart';
import 'package:aman_kassa_flutter/redux/store.dart';
import 'package:aman_kassa_flutter/shared/app_colors.dart';
import 'package:aman_kassa_flutter/shared/ui_helpers.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class SettingView extends StatefulWidget {
SettingView();
@override
_SettingViewState createState() => _SettingViewState();
}
class _SettingViewState extends State<SettingView> {
TextEditingController _pinController;
final DialogService _dialogService = locator<DialogService>();
@override
void initState() {
super.initState();
SettingState state = Redux.store.state.settingState;
_pinController = new TextEditingController(text: state.pinCode);
}
@override
void dispose() {
_pinController.dispose();
super.dispose();
}
void _setPinCode(BuildContext _context) async {
FocusScope.of(_context).unfocus();
var value = _pinController.text;
if(value.isNotEmpty && value.length !=4){
_dialogService.showDialog(description: 'Необходимо указать 4-х значный числовой код');
} else {
await Redux.store.dispatch(changePinCodeFromSetting(_pinController.text));
_dialogService.showDialog(description: 'Данные успешно сохранены');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text('Настройка приложения'),
),
body: SingleChildScrollView(
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 14.0),
child: Column(
children: <Widget>[
verticalSpaceTiny,
Text(
'Для блокировки приложения пин-кодом, укажите 4-х значный числовой код',
style: TextStyle(fontSize: 15.0),
textAlign: TextAlign.center,
),
verticalSpaceTiny,
TextField(
controller: _pinController,
maxLength: 4,
obscureText: true,
decoration: InputDecoration(
labelText: 'Пин-код', hintText: "Укажите пин-код"),
keyboardType: TextInputType.number,
),
verticalSpaceMedium,
RaisedButton(
onPressed: () => this._setPinCode(context),
child: Text(
'Cохранить настройки',
style: TextStyle(color: whiteColor, fontSize: 20.0),
),
color: primaryColor,
padding:
const EdgeInsets.symmetric(vertical: 5.0, horizontal: 20.0),
),
],
),
),
),
);
}
}

View File

@ -1,13 +1,27 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
archive:
dependency: transitive
description:
name: archive
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.13"
args:
dependency: transitive
description:
name: args
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.0"
async:
dependency: transitive
description:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.5.0-nullsafety.1"
version: "2.5.0"
auto_size_text:
dependency: "direct main"
description:
@ -28,35 +42,42 @@ packages:
name: boolean_selector
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0-nullsafety.1"
version: "2.1.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0-nullsafety.3"
version: "1.1.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0-nullsafety.1"
version: "1.2.0"
charset_converter:
dependency: "direct main"
description:
name: charset_converter
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.3"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0-nullsafety.1"
version: "1.1.0"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.dartlang.org"
source: hosted
version: "1.15.0-nullsafety.3"
version: "1.15.0"
convert:
dependency: transitive
description:
@ -71,6 +92,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.5"
csslib:
dependency: transitive
description:
name: csslib
url: "https://pub.dartlang.org"
source: hosted
version: "0.16.2"
cupertino_icons:
dependency: "direct main"
description:
@ -99,6 +127,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.5"
esc_pos_bluetooth:
dependency: "direct main"
description:
name: esc_pos_bluetooth
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.8"
esc_pos_utils:
dependency: "direct main"
description:
name: esc_pos_utils
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.6"
esys_flutter_share:
dependency: "direct main"
description:
@ -112,7 +154,7 @@ packages:
name: fake_async
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0-nullsafety.1"
version: "1.2.0"
ffi:
dependency: transitive
description:
@ -139,6 +181,27 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_bluetooth_basic:
dependency: "direct main"
description:
name: flutter_bluetooth_basic
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.5"
flutter_lock_screen:
dependency: "direct main"
description:
name: flutter_lock_screen
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.8"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.11"
flutter_redux:
dependency: "direct main"
description:
@ -163,6 +226,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
gbk_codec:
dependency: transitive
description:
name: gbk_codec
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.2"
get_it:
dependency: "direct main"
description:
@ -177,6 +247,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.1"
hex:
dependency: transitive
description:
name: hex
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.2"
html:
dependency: transitive
description:
name: html
url: "https://pub.dartlang.org"
source: hosted
version: "0.14.0+4"
http:
dependency: "direct main"
description:
@ -191,6 +275,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.4"
image:
dependency: transitive
description:
name: image
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.19"
intl:
dependency: "direct main"
description:
@ -198,6 +289,27 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.16.1"
js:
dependency: transitive
description:
name: js
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.3"
json_annotation:
dependency: transitive
description:
name: json_annotation
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.1"
local_auth:
dependency: "direct main"
description:
name: local_auth
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.3+4"
logger:
dependency: "direct main"
description:
@ -218,7 +330,7 @@ packages:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.10-nullsafety.1"
version: "0.12.10"
material_design_icons_flutter:
dependency: "direct main"
description:
@ -232,7 +344,7 @@ packages:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0-nullsafety.3"
version: "1.3.0"
nested:
dependency: transitive
description:
@ -246,7 +358,7 @@ packages:
name: path
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0-nullsafety.1"
version: "1.8.0"
path_provider:
dependency: "direct main"
description:
@ -289,6 +401,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.9.2"
petitparser:
dependency: transitive
description:
name: petitparser
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
platform:
dependency: transitive
description:
@ -373,8 +492,15 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.0"
shared_preferences:
rxdart:
dependency: transitive
description:
name: rxdart
url: "https://pub.dartlang.org"
source: hosted
version: "0.23.1"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
url: "https://pub.dartlang.org"
@ -426,7 +552,7 @@ packages:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0-nullsafety.2"
version: "1.8.0"
sqflite:
dependency: "direct main"
description:
@ -447,21 +573,21 @@ packages:
name: stack_trace
url: "https://pub.dartlang.org"
source: hosted
version: "1.10.0-nullsafety.1"
version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0-nullsafety.1"
version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0-nullsafety.1"
version: "1.1.0"
synchronized:
dependency: transitive
description:
@ -475,21 +601,21 @@ packages:
name: term_glyph
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0-nullsafety.1"
version: "1.2.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.19-nullsafety.2"
version: "0.2.19"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0-nullsafety.3"
version: "1.3.0"
url_launcher:
dependency: "direct main"
description:
@ -538,7 +664,7 @@ packages:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0-nullsafety.3"
version: "2.1.0"
win32:
dependency: transitive
description:
@ -553,6 +679,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.2"
xml:
dependency: transitive
description:
name: xml
url: "https://pub.dartlang.org"
source: hosted
version: "4.5.1"
sdks:
dart: ">=2.10.2 <2.11.0"
flutter: ">=1.22.2 <2.0.0"
dart: ">=2.12.0-0.0 <3.0.0"
flutter: ">=1.22.2"

View File

@ -31,6 +31,13 @@ dependencies:
qr_flutter: ^3.2.0
mask_text_input_formatter: ^1.2.1
flutter_screenutil: ^4.0.2+5
shared_preferences: ^0.5.12+4
flutter_lock_screen: ^1.0.8
local_auth: ^0.6.3+4
esc_pos_bluetooth: ^0.2.8
flutter_bluetooth_basic: ^0.1.5
esc_pos_utils: ^0.3.6 # no edit for esc_pos_bluetooth: ^0.2.8
charset_converter: ^1.0.3
dev_dependencies:
flutter_test:
sdk: flutter