Browse Source

refs #1 Syncronizing with release commit: 0dd089c19f

qt5
parent
commit
ef320a62b4
100 changed files with 8726 additions and 8423 deletions
  1. +1
    -0
      3.0/scripts/build/runtimes/terminal_ru.xml
  2. +0
    -2
      3.0/src/apps/PaymentProcessor/src/Services/DeviceService.cpp
  3. +547
    -542
      3.0/src/apps/PaymentProcessor/src/Services/ServiceController.cpp
  4. +42
    -0
      3.0/src/includes/Hardware/CoinAcceptors/CoinAcceptorBase.h
  5. +0
    -11
      3.0/src/includes/Hardware/Common/HardwareConstants.h
  6. +24
    -8
      3.0/src/includes/Hardware/FR/FRBaseConstants.h
  7. +1
    -0
      3.0/src/includes/Hardware/FR/FRStatusCodes.h
  8. +1
    -0
      3.0/src/includes/Hardware/FR/FRStatusesDescriptions.h
  9. +250
    -247
      3.0/src/includes/Hardware/Plugins/CommonParameters.h
  10. +111
    -111
      3.0/src/includes/Hardware/Plugins/DevicePluginBase.h
  11. +1
    -1
      3.0/src/includes/SDK/Drivers/FR/FiscalDataTypes.h
  12. +6
    -6
      3.0/src/includes/SDK/Drivers/FR/FiscalFields.h
  13. +8
    -0
      3.0/src/includes/SDK/Drivers/HardwareConstants.h
  14. +178
    -189
      3.0/src/includes/SDK/PaymentProcessor/Scripting/Core.h
  15. +69
    -61
      3.0/src/includes/SDK/PaymentProcessor/Scripting/GUIService.h
  16. +5
    -5
      3.0/src/interface/modern/PaySceneItem.qml
  17. +40
    -40
      3.0/src/interface/modern/ResultSceneItem.qml
  18. +107
    -107
      3.0/src/interface/modern/ad_popup.qml
  19. +3
    -3
      3.0/src/interface/modern/denom_info_scene.qml
  20. +76
    -76
      3.0/src/interface/modern/edit_pin_scene.qml
  21. +103
    -103
      3.0/src/interface/modern/html_popup.qml
  22. +123
    -123
      3.0/src/interface/modern/info_content/terminal_info.qml
  23. +293
    -293
      3.0/src/interface/modern/info_popup.qml
  24. +160
    -160
      3.0/src/interface/modern/info_scene.qml
  25. +2
    -2
      3.0/src/interface/modern/main_menu_scene.qml
  26. +28
    -28
      3.0/src/interface/modern/pay_scene.qml
  27. +89
    -89
      3.0/src/interface/modern/payment_method_selector_scene.qml
  28. +196
    -196
      3.0/src/interface/modern/platru_fill_amount_scene.qml
  29. +4
    -4
      3.0/src/interface/modern/platru_history_scene.qml
  30. +277
    -277
      3.0/src/interface/modern/platru_login_scene.qml
  31. +385
    -385
      3.0/src/interface/modern/platru_menu_scene.qml
  32. +179
    -179
      3.0/src/interface/modern/provider_info_popup.qml
  33. +115
    -115
      3.0/src/interface/modern/provider_selector_popup.qml
  34. +5
    -5
      3.0/src/interface/modern/result_scene.qml
  35. +2
    -0
      3.0/src/interface/modern/scenario/payment_scenario.js
  36. +211
    -211
      3.0/src/interface/modern/search_scene.qml
  37. +28
    -28
      3.0/src/interface/modern/widgets/animate_button.qml
  38. +36
    -36
      3.0/src/interface/modern/widgets/animation_sequence.qml
  39. +17
    -0
      3.0/src/interface/modern/widgets/border_image2.qml
  40. +138
    -138
      3.0/src/interface/modern/widgets/button.qml
  41. +89
    -89
      3.0/src/interface/modern/widgets/checkbox.qml
  42. +1
    -1
      3.0/src/interface/modern/widgets/checklist_editor.qml
  43. +104
    -104
      3.0/src/interface/modern/widgets/de_keyboard.qml
  44. +6
    -6
      3.0/src/interface/modern/widgets/editor_description.qml
  45. +104
    -104
      3.0/src/interface/modern/widgets/en_keyboard.qml
  46. +1
    -1
      3.0/src/interface/modern/widgets/enum_editor.qml
  47. +2
    -2
      3.0/src/interface/modern/widgets/fallback_editor.qml
  48. +2
    -2
      3.0/src/interface/modern/widgets/flash_container.qml
  49. +2
    -2
      3.0/src/interface/modern/widgets/html_editor.qml
  50. +2
    -2
      3.0/src/interface/modern/widgets/icon.qml
  51. +17
    -0
      3.0/src/interface/modern/widgets/image2.qml
  52. +37
    -37
      3.0/src/interface/modern/widgets/input_field.qml
  53. +1
    -1
      3.0/src/interface/modern/widgets/keyboard.qml
  54. +74
    -74
      3.0/src/interface/modern/widgets/keyboard_button.qml
  55. +3
    -3
      3.0/src/interface/modern/widgets/list.qml
  56. +45
    -45
      3.0/src/interface/modern/widgets/numeric_button.qml
  57. +1
    -1
      3.0/src/interface/modern/widgets/numeric_keyboard.qml
  58. +250
    -250
      3.0/src/interface/modern/widgets/operator_menu.qml
  59. +296
    -296
      3.0/src/interface/modern/widgets/operator_selector.qml
  60. +109
    -109
      3.0/src/interface/modern/widgets/pay_confirm_editor.qml
  61. +4
    -4
      3.0/src/interface/modern/widgets/platru_login_editor.qml
  62. +45
    -42
      3.0/src/interface/modern/widgets/qmldir
  63. +161
    -161
      3.0/src/interface/modern/widgets/root_groups.qml
  64. +107
    -107
      3.0/src/interface/modern/widgets/ru_keyboard.qml
  65. +151
    -151
      3.0/src/interface/modern/widgets/scene_base.qml
  66. +78
    -80
      3.0/src/interface/modern/widgets/scene_base2.qml
  67. +27
    -27
      3.0/src/interface/modern/widgets/scroll_bar.qml
  68. +51
    -51
      3.0/src/interface/modern/widgets/scroller.qml
  69. +29
    -29
      3.0/src/interface/modern/widgets/status_bar.qml
  70. +258
    -258
      3.0/src/interface/modern/widgets/table_editor.qml
  71. +46
    -48
      3.0/src/interface/modern/widgets/warning_panel.qml
  72. +352
    -327
      3.0/src/interface/plugins/Utils/msvc/Utils.vcxproj
  73. +167
    -158
      3.0/src/interface/plugins/Utils/msvc/Utils.vcxproj.filters
  74. +118
    -118
      3.0/src/interface/plugins/Utils/src/BarcodeProvider.cpp
  75. +71
    -69
      3.0/src/interface/plugins/Utils/src/Log.h
  76. +139
    -175
      3.0/src/interface/plugins/Utils/src/Skin.cpp
  77. +44
    -43
      3.0/src/interface/plugins/Utils/src/Skin.h
  78. +266
    -175
      3.0/src/interface/plugins/Utils/src/SkinProvider.cpp
  79. +49
    -36
      3.0/src/interface/plugins/Utils/src/SkinProvider.h
  80. +502
    -478
      3.0/src/interface/plugins/Utils/src/Utils.cpp
  81. +133
    -131
      3.0/src/interface/plugins/Utils/src/Utils.h
  82. +60
    -56
      3.0/src/interface/plugins/Utils/src/UtilsPlugin.cpp
  83. +2
    -2
      3.0/src/modules/Hardware/CashAcceptors/src/CCNet/FirmwareVersions.h
  84. +1
    -0
      3.0/src/modules/Hardware/CoinAcceptors/msvc/CoinAcceptors.vcxproj
  85. +84
    -78
      3.0/src/modules/Hardware/CoinAcceptors/msvc/CoinAcceptors.vcxproj.filters
  86. +0
    -17
      3.0/src/modules/Hardware/CoinAcceptors/src/CCTalk/CCTalkCoinAcceptorBase.cpp
  87. +80
    -87
      3.0/src/modules/Hardware/CoinAcceptors/src/CCTalk/CCTalkCoinAcceptorBase.h
  88. +0
    -3
      3.0/src/modules/Hardware/CoinAcceptors/src/CCTalk/CCTalkCoinAcceptorConstants.h
  89. +198
    -214
      3.0/src/modules/Hardware/CoinAcceptors/src/NPSTalk/NPSTalkCoinAcceptor.cpp
  90. +57
    -59
      3.0/src/modules/Hardware/CoinAcceptors/src/NPSTalk/NPSTalkCoinAcceptor.h
  91. +37
    -40
      3.0/src/modules/Hardware/CoinAcceptors/src/NPSTalk/NPSTalkCoinAcceptorConstants.h
  92. +1
    -1
      3.0/src/modules/Hardware/Common/src/Meta/MetaDevice.cpp
  93. +23
    -5
      3.0/src/modules/Hardware/Common/src/WorkingThreadProxy.cpp
  94. +10
    -0
      3.0/src/modules/Hardware/Common/src/WorkingThreadProxy.h
  95. +67
    -67
      3.0/src/modules/Hardware/FR/src/Atol/Base/Ejector/PayPPU700.cpp
  96. +198
    -198
      3.0/src/modules/Hardware/FR/src/Atol/Ejector/AtolVKP80BasedFR.cpp
  97. +1
    -1
      3.0/src/modules/Hardware/FR/src/Atol/Online/Paymaster.cpp
  98. +79
    -11
      3.0/src/modules/Hardware/FR/src/Base/FFEngine.cpp
  99. +3
    -0
      3.0/src/modules/Hardware/FR/src/Base/FFEngine.h
  100. +20
    -6
      3.0/src/modules/Hardware/FR/src/Base/FRBase.cpp

+ 1
- 0
3.0/scripts/build/runtimes/terminal_ru.xml View File

@@ -54,6 +54,7 @@
<file if="{CYBERPLAT_BUILD}" source="{QBS_RESULT_PATH}/plugins/cyberchange.dll" target="plugins/plugins/cyberchange.dll"/>
<!-- Uniteller plugin -->
<!-- <option target="user/user/plugins/uniteller.ini" key="PaymentProcessor.ChargeProvider.UnitellerChargeProvider.configuration_singleton/uniteller_runtime_path" value="C:/EFTPOS_3.0" /> -->
<!-- <file if="{CYBERPLAT_BUILD}" source="{QBS_RESULT_PATH}/plugins/uniteller.dll" target="plugins/plugins/uniteller.dll"/> -->
<!-- Драйверы, компонент drivers -->


+ 0
- 2
3.0/src/apps/PaymentProcessor/src/Services/DeviceService.cpp View File

@@ -333,8 +333,6 @@ PPSDK::IDeviceService::UpdateFirmwareResult DeviceService::updateFirmware(const
return IDeviceService::NoDevice;
}
QVariantMap config = device->getDeviceConfiguration();
if (!device->canUpdateFirmware())
{
LOG(mLog, LogLevel::Error, "The device cannot be updated.");


+ 547
- 542
3.0/src/apps/PaymentProcessor/src/Services/ServiceController.cpp
File diff suppressed because it is too large
View File


+ 42
- 0
3.0/src/includes/Hardware/CoinAcceptors/CoinAcceptorBase.h View File

@@ -0,0 +1,42 @@
/* @file Базовый класс монетоприемников. */
#pragma once
#include "Hardware/CashAcceptors/PortCashAcceptor.h"
//--------------------------------------------------------------------------------
namespace CCoinAcceptor
{
/// Таймаут отсылки сигнала об отключении монетника, [мс].
const int DisablingTimeout = 600;
}
//--------------------------------------------------------------------------------
class CoinAcceptorBase : public TSerialCashAcceptor
{
SET_DEVICE_TYPE(CoinAcceptor)
public:
CoinAcceptorBase()
{
//TODO: надо для всех монетников
setConfigParameter(CHardware::CashAcceptor::DisablingTimeout, CCoinAcceptor::DisablingTimeout);
setConfigParameter(CHardware::CashAcceptor::StackedFilter, true);
}
/// Принять купюру.
virtual bool stack()
{
// у монетоприемника нет стека
return true;
}
/// Вернуть купюру. Правильный термин - return (ключевое слово).
virtual bool reject()
{
// у монетоприемника нет режекта
return true;
}
};
//--------------------------------------------------------------------------------

+ 0
- 11
3.0/src/includes/Hardware/Common/HardwareConstants.h View File

@@ -50,17 +50,6 @@ namespace CHardware
const char CustomKZT[] = "CP866 (Kazakhstan)";
}
/// Варинатны использования настроек.
namespace Values
{
const char Use[] = "use";
const char NotUse[] = "not use";
const char NoChange[] = "no change";
const char Auto[] = "auto";
const char More[] = "more";
const char Less[] = "less";
}
/// Константы порта.
namespace Port
{


+ 24
- 8
3.0/src/includes/Hardware/FR/FRBaseConstants.h View File

@@ -103,17 +103,30 @@ namespace CFR
/// Количество миллисекунд в сутках.
const int MSecsInDay = SecsInDay * 1000;
/// Признак способа расчета по умолчанию для платежей (не интернет-магазинов) - Полный расчет.
/// Признак способа расчета по умолчанию для платежей (тег 1214) (не интернет-магазинов) - Полный расчет.
const SDK::Driver::EPayOffSubjectMethodTypes::Enum PayOffSubjectMethodType = SDK::Driver::EPayOffSubjectMethodTypes::Full;
/// Размеры ИНН.
namespace INNSize
/// ИНН.
namespace INN
{
/// Для юридического лица.
const int LegalPerson = 10;
/// Лицо и его размер.
namespace Person
{
const int Unknown = 0; /// Неизвестное.
const int Legal = 10; /// Юридическое.
const int Natural = 12; /// Физическое.
}
/// Коэффициенты контрольных чисел (КЧ)
namespace Factors
{
const int Legal[] = {2, 4, 10, 3, 5, 9, 4, 6, 8}; /// Коэффициенты КЧ для ИНН юр. лица.
const int Natural1[] = {7, 2, 4, 10, 3, 5, 9, 4, 6, 8}; /// Коэффициенты 1-го КЧ для ИНН физ. лица.
const int Natural2[] = {3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8}; /// Коэффициенты 2-го КЧ для ИНН физ. лица.
}
/// Для физического лица.
const int NaturalPerson = 12;
/// Делитель для вычисления проверочного числа.
const int Divider = 11;
}
/// Константные данные ФФД.
@@ -421,7 +434,7 @@ namespace CFR
class COperationModeData: public CSpecification<char, int>
{
public:
COperationModeData()
COperationModeData() : TrashMask('\x40')
{
#define ADD_OPERATION_MODE(aName) append(SDK::Driver::EOperationModes::aName, CFR::FiscalFields::aName##Mode)
@@ -432,6 +445,9 @@ namespace CFR
ADD_OPERATION_MODE(FixedReporting);
ADD_OPERATION_MODE(Internet);
}
/// Константа для очистки режимов работы от мусора из ФН (ранее это был призак банковского агента).
const char TrashMask;
};
static COperationModeData OperationModeData;


+ 1
- 0
3.0/src/includes/Hardware/FR/FRStatusCodes.h View File

@@ -42,6 +42,7 @@ namespace FRStatusCode
const int NoMoney = 280; /// Не хватает денег для какой-либо операции.
const int WrongDealerTaxSystem = 281; /// Неверно настроена СНО.
const int WrongDealerAgentFlag = 282; /// Неверно настроен признак агента.
const int CashierINN = 283; /// Неправильный ИНН кассира.
}
}


+ 1
- 0
3.0/src/includes/Hardware/FR/FRStatusesDescriptions.h View File

@@ -51,6 +51,7 @@ namespace FRStatusCode
ADD_FR_ERROR(NoMoney, QCoreApplication::translate("FRStatuses", "#no_money"));
ADD_FR_ERROR(WrongDealerTaxSystem, QCoreApplication::translate("FRStatuses", "#wrong_dealer_tax_system"));
ADD_FR_ERROR(WrongDealerAgentFlag, QCoreApplication::translate("FRStatuses", "#wrong_dealer_agent_flag"));
ADD_FR_ERROR(CashierINN, QCoreApplication::translate("FRStatuses", "#cashier_inn"));
}
TStatusCodes getFiscalStatusCodes()


+ 250
- 247
3.0/src/includes/Hardware/Plugins/CommonParameters.h View File

@@ -1,247 +1,250 @@
/* @file Общие параметры плагинов. */

#pragma once

// SDK
#include <SDK/Plugins/PluginParameters.h>
#include <SDK/Plugins/PluginInitializer.h>
#include <SDK/Drivers/Components.h>
#include <SDK/Drivers/InteractionTypes.h>
#include <SDK/Drivers/DetectingPriority.h>

// Modules
#include "Hardware/Plugins/DevicePluginBase.h"
#include "Hardware/Protocols/Common/ProtocolNames.h"

// Project
#include "Hardware/Common/HardwareConstants.h"

//------------------------------------------------------------------------
namespace CommonPluginParameterTranslations
{
static const char * ModelName = QT_TRANSLATE_NOOP("CommonParameters", "CommonParameters#model_name");
static const char * OPOSName = QT_TRANSLATE_NOOP("CommonParameters", "CommonParameters#opos_name");
static const char * RequiredResource = QT_TRANSLATE_NOOP("CommonParameters", "CommonParameters#required_resource");
static const char * InteractionType = QT_TRANSLATE_NOOP("CommonParameters", "CommonParameters#interaction_type");
static const char * ProtocolName = QT_TRANSLATE_NOOP("CommonParameters", "CommonParameters#protocol_name");
};

namespace CPPT = CommonPluginParameterTranslations;
namespace DSDKIT = SDK::Driver::CInteractionTypes;

namespace SDK {
namespace Plugin {

template <class T>
inline QString makeDriverPath()
{
QString result = makePath(SDK::Driver::Application, SDK::Driver::CComponents::Driver, T::getDeviceType(), T::getInteractionType());

QString series = T::getSeries();
QString subSeries = T::getSubSeries();

if (!series.isEmpty()) result += "." + series;
if (!subSeries.isEmpty()) result += "." + subSeries;

return result;
}

//------------------------------------------------------------------------------
template<class T>
inline QStringList sortParameters(QList<T> (* aGetParameters)())
{
QList<T> data = (*aGetParameters)();
QStringList result;

foreach(T item, data)
{
result << QString("%1").arg(item);
}

result.removeDuplicates();
qSort(result);

if (result.isEmpty())
{
result << "";
}

return result;
}

//------------------------------------------------------------------------------
inline QStringList sortParameters(QStringList (* aGetParameters)())
{
return sortParameters<QString>(reinterpret_cast<QList<QString> (* )()> (aGetParameters));
}

//------------------------------------------------------------------------------
/// Создать список параметров с именем модели.
template <class T>
inline TParameterList createNamedList(const QStringList & aModels, const QString & aDefault)
{
return SNamedList<T, T::TIType>().create(aModels, aDefault)
<< setNormalPriority();
}

//------------------------------------------------------------------------------
template <class T>
inline TParameterList createSimpleNamedList(const QStringList & aModels, const QString & aDefault)
{
QString interactionType = T::getInteractionType();

return TParameterList()
<< SPluginParameter(CHardwareSDK::ModelName, false, CPPT::ModelName, QString(), aDefault, aModels, true)
<< SPluginParameter(CHardwareSDK::InteractionType, true, CPPT::InteractionType, QString(), interactionType, QStringList() << interactionType)
<< setNormalPriority();
}

//------------------------------------------------------------------------------
template <class T1, class T2>
struct SNamedList
{
TParameterList create(const QStringList & aModels, const QString & aDefault)
{
return createSimpleNamedList<T1>(aModels, aDefault);
}
};

//------------------------------------------------------------------------------
template <class T1>
struct SNamedList<T1, DSDKIT::ItCOM>
{
TParameterList create(const QStringList & aModels, const QString & aDefault)
{
QStringList optionalPortSettings = sortParameters(&T1::getOptionalPortSettings);

return createSimpleNamedList<T1>(aModels, aDefault)
<< SPluginParameter(CHardwareSDK::RequiredResource, SPluginParameter::Text, false, CPPT::RequiredResource, QString(), "Common.Driver.IOPort.System.COM", QVariantMap(), true)
<< SPluginParameter(CHardwareSDK::OptionalPortSettings, false, QString(), QString(), optionalPortSettings[0], optionalPortSettings, true);
}
};

//------------------------------------------------------------------------------
template <class T1>
struct SNamedList<T1, DSDKIT::ItUSB>
{
TParameterList create(const QStringList & aModels, const QString & aDefault)
{
return createSimpleNamedList<T1>(aModels, aDefault)
<< setMultipleExistence();
}
};

//------------------------------------------------------------------------------
template <class T1>
struct SNamedList<T1, DSDKIT::ItTCP>
{
TParameterList create(const QStringList & aModels, const QString & aDefault)
{
return createSimpleNamedList<T1>(aModels, aDefault)
<< SPluginParameter(CHardwareSDK::RequiredResource, SPluginParameter::Text, false, CPPT::RequiredResource, QString(), "Common.Driver.IOPort.System.TCP", QVariantMap(), true)
<< setMultipleExistence();
}
};

//------------------------------------------------------------------------------
template <class T1>
struct SNamedList<T1, DSDKIT::ItOPOS>
{
TParameterList create(const QStringList & aModels, const QString & aDefault)
{
QStringList possibleNames = sortParameters(&T1::getProfileNames);

return createSimpleNamedList<T1>(aModels, aDefault)
<< setMultipleExistence()
<< SPluginParameter(CHardware::OPOSName, true, CPPT::OPOSName, QString(), possibleNames[0], possibleNames);
}
};

//------------------------------------------------------------------------------
/// Создать список параметров с именем модели.
template <class T>
inline TParameterList createNamedList(const QString & aModel, const QString & aDefault)
{
return createNamedList<T>(QStringList() << aModel, aDefault);
}

//------------------------------------------------------------------------------
/// Создать простой список параметров с именем модели.
template <class T>
inline TParameterList createNamedList(const QString & aModel)
{
return createNamedList<T>(aModel, aModel);
}

//------------------------------------------------------------------------------
/// Протокол.
inline SPluginParameter setProtocol(const QString & aProtocol)
{
return SPluginParameter(CHardwareSDK::ProtocolName, false, CPPT::ProtocolName, QString(), aProtocol, QStringList() << aProtocol);
}

//------------------------------------------------------------------------------
/// Приоритет при автопоиске.
inline SPluginParameter setNormalPriority()
{
QVariantMap possibleValues;
possibleValues.insert(CHardwareSDK::DetectingPriority, SDK::Driver::EDetectingPriority::Normal);

return SPluginParameter(CHardwareSDK::DetectingPriority, SPluginParameter::Text, false, QString(), QString(), SDK::Driver::EDetectingPriority::Normal, possibleValues, true);
}

inline TParameterList modifyPriority(const TParameterList & aParameterList, SDK::Driver::EDetectingPriority::Enum aPriority)
{
TParameterList parameterList(aParameterList);

auto it = std::find_if(parameterList.begin(), parameterList.end(), [] (const SPluginParameter & aParameter) { return aParameter.name == CHardwareSDK::DetectingPriority; });

if (it != parameterList.end())
{
it->defaultValue = aPriority;
it->possibleValues[CHardwareSDK::DetectingPriority] = aPriority;
}

return parameterList;
}

//------------------------------------------------------------------------------
/// Модифицированные значения параметров.
inline SPluginParameter setModifiedValues(const QString & aParameterValue, const QVariantMap & aPossibleValues)
{
return SPluginParameter(CPlugin::ModifiedValues, SPluginParameter::Set, false, aParameterValue, QString(), QString(), aPossibleValues, true);
}

//------------------------------------------------------------------------------
/// Множественный тип атвопоиска устройства.
inline SPluginParameter setMultipleExistence()
{
return SPluginParameter(CHardwareSDK::Existence, false, QString(), QString(), CHardwareSDK::ExistenceTypes::Multiple, QStringList() << CHardwareSDK::ExistenceTypes::Multiple, true);
}

//------------------------------------------------------------------------------
/// Модифицированные имена параметров.
inline SPluginParameter setModifiedKeys(const QString & aOldParameterName, const QString & aNewParameterName)
{
QVariantMap modifiedKeys;
modifiedKeys.insert(aOldParameterName, aNewParameterName);

return SPluginParameter(CPlugin::ModifiedKeys, SPluginParameter::Set, false, QString(), QString(), QString(), modifiedKeys, true);
}

//------------------------------------------------------------------------------
#define CREATE_PLUGIN(aPluginName, aClassName) IPlugin * CreatePlugin_##aClassName(IEnvironment * aEnvironment, const QString & aInstancePath) \
{ return new DevicePluginBase<aClassName>(aPluginName, aEnvironment, aInstancePath); }

#define REGISTER_DRIVER(aPluginName, aClassName, aParameters) CREATE_PLUGIN(aPluginName, aClassName) \
REGISTER_PLUGIN_WITH_PARAMETERS(makeDriverPath<aClassName>(), &CreatePlugin_##aClassName, aParameters)

#define REGISTER_DRIVER_WITH_PARAMETERS(aClassName, aConstructor, aParameters) REGISTER_PLUGIN_WITH_PARAMETERS(makeDriverPath<aClassName>(), aConstructor, aParameters)

#define COMMON_DRIVER_WITH_PARAMETERS(aClassName, aConstructor, aParameters) PLUGIN_WITH_PARAMETERS(makeDriverPath<aClassName>(), aConstructor, aParameters)
#define COMMON_DRIVER(aClassName, aParameters) COMMON_DRIVER_WITH_PARAMETERS(aClassName, &CreatePlugin<aClassName>, aParameters)
#define SIMPLE_COMMON_DRIVER(aClassName, aParameters) COMMON_DRIVER(aClassName, &aParameters<aClassName>)

}} // namespace SDK::Plugin

//------------------------------------------------------------------------------
/* @file Общие параметры плагинов. */
#pragma once
// SDK
#include <SDK/Plugins/PluginParameters.h>
#include <SDK/Plugins/PluginInitializer.h>
#include <SDK/Drivers/Components.h>
#include <SDK/Drivers/InteractionTypes.h>
#include <SDK/Drivers/DetectingPriority.h>
// Modules
#include "Hardware/Plugins/DevicePluginBase.h"
#include "Hardware/Protocols/Common/ProtocolNames.h"
// Project
#include "Hardware/Common/HardwareConstants.h"
//------------------------------------------------------------------------
namespace CommonPluginParameterTranslations
{
static const char * ModelName = QT_TRANSLATE_NOOP("CommonParameters", "CommonParameters#model_name");
static const char * OPOSName = QT_TRANSLATE_NOOP("CommonParameters", "CommonParameters#opos_name");
static const char * RequiredResource = QT_TRANSLATE_NOOP("CommonParameters", "CommonParameters#required_resource");
static const char * InteractionType = QT_TRANSLATE_NOOP("CommonParameters", "CommonParameters#interaction_type");
static const char * ProtocolName = QT_TRANSLATE_NOOP("CommonParameters", "CommonParameters#protocol_name");
};
namespace CPPT = CommonPluginParameterTranslations;
namespace DSDKIT = SDK::Driver::CInteractionTypes;
namespace SDK {
namespace Plugin {
template <class T>
inline QString makeDriverPath()
{
QString result = makePath(SDK::Driver::Application, SDK::Driver::CComponents::Driver, T::getDeviceType(), T::getInteractionType());
QString series = T::getSeries();
QString subSeries = T::getSubSeries();
if (!series.isEmpty()) result += "." + series;
if (!subSeries.isEmpty()) result += "." + subSeries;
return result;
}
//------------------------------------------------------------------------------
template<class T>
inline QStringList sortParameters(QList<T> (* aGetParameters)())
{
QList<T> data = (*aGetParameters)();
QStringList result;
foreach(T item, data)
{
result << QString("%1").arg(item);
}
result.removeDuplicates();
qSort(result);
if (result.isEmpty())
{
result << "";
}
return result;
}
//------------------------------------------------------------------------------
inline QStringList sortParameters(QStringList (* aGetParameters)())
{
return sortParameters<QString>(reinterpret_cast<QList<QString> (* )()> (aGetParameters));
}
//------------------------------------------------------------------------------
/// Создать список параметров с именем модели.
template <class T>
inline TParameterList createNamedList(const QStringList & aModels, const QString & aDefault)
{
return SNamedList<T, T::TIType>().create(aModels, aDefault);
}
//------------------------------------------------------------------------------
template <class T>
inline TParameterList createSimpleNamedList(const QStringList & aModels, const QString & aDefault)
{
QString interactionType = T::getInteractionType();
QVariantMap modifiedValues;
modifiedValues.insert("no change", CHardwareSDK::Values::Auto);
modifiedValues.insert("not use", CHardwareSDK::Values::NotUse);
return TParameterList()
<< SPluginParameter(CHardwareSDK::ModelName, false, CPPT::ModelName, QString(), aDefault, aModels, true)
<< SPluginParameter(CHardwareSDK::InteractionType, true, CPPT::InteractionType, QString(), interactionType, QStringList() << interactionType)
<< setModifiedValues("", modifiedValues)
<< setNormalPriority();
}
//------------------------------------------------------------------------------
template <class T1, class T2>
struct SNamedList
{
TParameterList create(const QStringList & aModels, const QString & aDefault)
{
return createSimpleNamedList<T1>(aModels, aDefault);
}
};
//------------------------------------------------------------------------------
template <class T1>
struct SNamedList<T1, DSDKIT::ItCOM>
{
TParameterList create(const QStringList & aModels, const QString & aDefault)
{
QStringList optionalPortSettings = sortParameters(&T1::getOptionalPortSettings);
return createSimpleNamedList<T1>(aModels, aDefault)
<< SPluginParameter(CHardwareSDK::RequiredResource, SPluginParameter::Text, false, CPPT::RequiredResource, QString(), "Common.Driver.IOPort.System.COM", QVariantMap(), true)
<< SPluginParameter(CHardwareSDK::OptionalPortSettings, false, QString(), QString(), optionalPortSettings[0], optionalPortSettings, true);
}
};
//------------------------------------------------------------------------------
template <class T1>
struct SNamedList<T1, DSDKIT::ItUSB>
{
TParameterList create(const QStringList & aModels, const QString & aDefault)
{
return createSimpleNamedList<T1>(aModels, aDefault)
<< setMultipleExistence();
}
};
//------------------------------------------------------------------------------
template <class T1>
struct SNamedList<T1, DSDKIT::ItTCP>
{
TParameterList create(const QStringList & aModels, const QString & aDefault)
{
return createSimpleNamedList<T1>(aModels, aDefault)
<< SPluginParameter(CHardwareSDK::RequiredResource, SPluginParameter::Text, false, CPPT::RequiredResource, QString(), "Common.Driver.IOPort.System.TCP", QVariantMap(), true)
<< setMultipleExistence();
}
};
//------------------------------------------------------------------------------
template <class T1>
struct SNamedList<T1, DSDKIT::ItOPOS>
{
TParameterList create(const QStringList & aModels, const QString & aDefault)
{
QStringList possibleNames = sortParameters(&T1::getProfileNames);
return createSimpleNamedList<T1>(aModels, aDefault)
<< setMultipleExistence()
<< SPluginParameter(CHardware::OPOSName, true, CPPT::OPOSName, QString(), possibleNames[0], possibleNames);
}
};
//------------------------------------------------------------------------------
/// Создать список параметров с именем модели.
template <class T>
inline TParameterList createNamedList(const QString & aModel, const QString & aDefault)
{
return createNamedList<T>(QStringList() << aModel, aDefault);
}
//------------------------------------------------------------------------------
/// Создать простой список параметров с именем модели.
template <class T>
inline TParameterList createNamedList(const QString & aModel)
{
return createNamedList<T>(aModel, aModel);
}
//------------------------------------------------------------------------------
/// Протокол.
inline SPluginParameter setProtocol(const QString & aProtocol)
{
return SPluginParameter(CHardwareSDK::ProtocolName, false, CPPT::ProtocolName, QString(), aProtocol, QStringList() << aProtocol);
}
//------------------------------------------------------------------------------
/// Приоритет при автопоиске.
inline SPluginParameter setNormalPriority()
{
QVariantMap possibleValues;
possibleValues.insert(CHardwareSDK::DetectingPriority, SDK::Driver::EDetectingPriority::Normal);
return SPluginParameter(CHardwareSDK::DetectingPriority, SPluginParameter::Text, false, QString(), QString(), SDK::Driver::EDetectingPriority::Normal, possibleValues, true);
}
inline TParameterList modifyPriority(const TParameterList & aParameterList, SDK::Driver::EDetectingPriority::Enum aPriority)
{
TParameterList parameterList(aParameterList);
auto it = std::find_if(parameterList.begin(), parameterList.end(), [] (const SPluginParameter & aParameter) { return aParameter.name == CHardwareSDK::DetectingPriority; });
if (it != parameterList.end())
{
it->defaultValue = aPriority;
it->possibleValues[CHardwareSDK::DetectingPriority] = aPriority;
}
return parameterList;
}
//------------------------------------------------------------------------------
/// Модифицированные значения параметров.
inline SPluginParameter setModifiedValues(const QString & aParameterValue, const QVariantMap & aPossibleValues)
{
return SPluginParameter(CPlugin::ModifiedValues, SPluginParameter::Set, false, aParameterValue, QString(), QString(), aPossibleValues, true);
}
//------------------------------------------------------------------------------
/// Множественный тип атвопоиска устройства.
inline SPluginParameter setMultipleExistence()
{
return SPluginParameter(CHardwareSDK::Existence, false, QString(), QString(), CHardwareSDK::ExistenceTypes::Multiple, QStringList() << CHardwareSDK::ExistenceTypes::Multiple, true);
}
//------------------------------------------------------------------------------
/// Модифицированные имена параметров.
inline SPluginParameter setModifiedKeys(const QString & aOldParameterName, const QString & aNewParameterName)
{
QVariantMap modifiedKeys;
modifiedKeys.insert(aOldParameterName, aNewParameterName);
return SPluginParameter(CPlugin::ModifiedKeys, SPluginParameter::Set, false, QString(), QString(), QString(), modifiedKeys, true);
}
//------------------------------------------------------------------------------
#define CREATE_PLUGIN(aPluginName, aClassName) IPlugin * CreatePlugin_##aClassName(IEnvironment * aEnvironment, const QString & aInstancePath) \
{ return new DevicePluginBase<aClassName>(aPluginName, aEnvironment, aInstancePath); }
#define REGISTER_DRIVER(aPluginName, aClassName, aParameters) CREATE_PLUGIN(aPluginName, aClassName) \
REGISTER_PLUGIN_WITH_PARAMETERS(makeDriverPath<aClassName>(), &CreatePlugin_##aClassName, aParameters)
#define REGISTER_DRIVER_WITH_PARAMETERS(aClassName, aConstructor, aParameters) REGISTER_PLUGIN_WITH_PARAMETERS(makeDriverPath<aClassName>(), aConstructor, aParameters)
#define COMMON_DRIVER_WITH_PARAMETERS(aClassName, aConstructor, aParameters) PLUGIN_WITH_PARAMETERS(makeDriverPath<aClassName>(), aConstructor, aParameters)
#define COMMON_DRIVER(aClassName, aParameters) COMMON_DRIVER_WITH_PARAMETERS(aClassName, &CreatePlugin<aClassName>, aParameters)
#define SIMPLE_COMMON_DRIVER(aClassName, aParameters) COMMON_DRIVER(aClassName, &aParameters<aClassName>)
}} // namespace SDK::Plugin
//------------------------------------------------------------------------------

+ 111
- 111
3.0/src/includes/Hardware/Plugins/DevicePluginBase.h View File

@@ -1,111 +1,111 @@
/* @file Шаблонный плагин для драйверов. */
#pragma once
// Plugin SDK
#include <SDK/Plugins/IPlugin.h>
#include <SDK/Plugins/IPluginFactory.h>
#include <SDK/Plugins/IPluginLoader.h>
#pragma warning ( disable : 4250 ) // warning 4250: 'class1' : inherits 'class2::member' via dominance
// Есть ветки наследования, интерфейсная и базовой реализации. Последняя содержит вызываемый функционал и
// сделана специально выше по уровню, чем соответствующий интерфейс, поэтому предупреждение подавлено и включается во все файлы.
//------------------------------------------------------------------------------
template <class T>
class DevicePluginBase : public SDK::Plugin::IPlugin, public T
{
public:
DevicePluginBase(const QString & aPluginName, SDK::Plugin::IEnvironment * aEnvironment, const QString & aInstancePath) :
mInstanceName(aInstancePath),
mEnvironment(aEnvironment)
{
mPluginName = aPluginName + " plugin";
setLog(aEnvironment->getLog(""));
if (mEnvironment)
{
SDK::Plugin::IPluginLoader * pluginLoader = mEnvironment->getPluginLoader();
if (pluginLoader)
{
QString path = mInstanceName.section(CPlugin::InstancePathSeparator, 0, 0);
SDK::Plugin::TParameterList parameterList = pluginLoader->getPluginParametersDescription(path);
QStringList pluginParameterNames;
QStringList requiredResourceNames;
foreach(const SDK::Plugin::SPluginParameter & parameter, parameterList)
{
if (parameter.name == CHardwareSDK::RequiredResource)
{
path = parameter.defaultValue.toString().section(CPlugin::InstancePathSeparator, 0, 0);
SDK::Plugin::TParameterList rrParameterList = pluginLoader->getPluginParametersDescription(path);
foreach(const SDK::Plugin::SPluginParameter & rrParameter, rrParameterList)
{
if (!rrParameter.readOnly)
{
requiredResourceNames << rrParameter.name;
}
}
}
else if (!parameter.readOnly || (parameter.name == CHardwareSDK::ModelName))
{
pluginParameterNames << parameter.name;
}
}
QVariantMap configuration;
configuration.insert(CHardware::PluginParameterNames, pluginParameterNames);
configuration.insert(CHardware::RequiredResourceNames, requiredResourceNames);
configuration.insert(CHardware::PluginPath, makeDriverPath<T>());
T::setDeviceConfiguration(configuration);
}
}
}
virtual ~DevicePluginBase() {}
/// Возвращает название плагина.
virtual QString getPluginName() const
{
return mPluginName;
}
/// Возвращает параметры плагина.
virtual QVariantMap getConfiguration() const
{
return T::getDeviceConfiguration();
}
/// Настраивает плагин.
virtual void setConfiguration(const QVariantMap & aParameters)
{
T::setDeviceConfiguration(aParameters);
}
/// Сохраняет конфигурацию плагина в постоянное хранилище (.ini файл или хранилище прикладной программы).
virtual bool saveConfiguration()
{
return mEnvironment->saveConfiguration(mInstanceName, T::getDeviceConfiguration());
}
/// Возвращает имя файла конфигурации без расширения (ключ + идентификатор).
virtual QString getConfigurationName() const
{
return mInstanceName;
}
/// Проверяет успешно ли инициализировался плагин при создании.
virtual bool isReady() const
{
return true;
}
private:
QString mPluginName;
QString mInstanceName;
SDK::Plugin::IEnvironment * mEnvironment;
};
//--------------------------------------------------------------------------------
/* @file Шаблонный плагин для драйверов. */
#pragma once
// Plugin SDK
#include <SDK/Plugins/IPlugin.h>
#include <SDK/Plugins/IPluginFactory.h>
#include <SDK/Plugins/IPluginLoader.h>
#pragma warning ( disable : 4250 ) // warning 4250: 'class1' : inherits 'class2::member' via dominance
// Есть ветки наследования, интерфейсная и базовой реализации. Последняя содержит вызываемый функционал и
// сделана специально выше по уровню, чем соответствующий интерфейс, поэтому предупреждение подавлено и включается во все файлы.
//------------------------------------------------------------------------------
template <class T>
class DevicePluginBase : public SDK::Plugin::IPlugin, public T
{
public:
DevicePluginBase(const QString & aPluginName, SDK::Plugin::IEnvironment * aEnvironment, const QString & aInstancePath) :
mInstanceName(aInstancePath),
mEnvironment(aEnvironment)
{
mPluginName = aPluginName + " plugin";
setLog(aEnvironment->getLog(""));
if (mEnvironment)
{
SDK::Plugin::IPluginLoader * pluginLoader = mEnvironment->getPluginLoader();
if (pluginLoader)
{
QString path = mInstanceName.section(CPlugin::InstancePathSeparator, 0, 0);
SDK::Plugin::TParameterList parameterList = pluginLoader->getPluginParametersDescription(path);
QStringList pluginParameterNames;
QStringList requiredResourceNames;
foreach(const SDK::Plugin::SPluginParameter & parameter, parameterList)
{
if (parameter.name == CHardwareSDK::RequiredResource)
{
path = parameter.defaultValue.toString().section(CPlugin::InstancePathSeparator, 0, 0);
SDK::Plugin::TParameterList rrParameterList = pluginLoader->getPluginParametersDescription(path);
foreach(const SDK::Plugin::SPluginParameter & rrParameter, rrParameterList)
{
if (!rrParameter.readOnly)
{
requiredResourceNames << rrParameter.name;
}
}
}
else
{
pluginParameterNames << parameter.name;
}
}
QVariantMap configuration;
configuration.insert(CHardware::PluginParameterNames, pluginParameterNames);
configuration.insert(CHardware::RequiredResourceNames, requiredResourceNames);
configuration.insert(CHardware::PluginPath, makeDriverPath<T>());
T::setDeviceConfiguration(configuration);
}
}
}
virtual ~DevicePluginBase() {}
/// Возвращает название плагина.
virtual QString getPluginName() const
{
return mPluginName;
}
/// Возвращает параметры плагина.
virtual QVariantMap getConfiguration() const
{
return T::getDeviceConfiguration();
}
/// Настраивает плагин.
virtual void setConfiguration(const QVariantMap & aParameters)
{
T::setDeviceConfiguration(aParameters);
}
/// Сохраняет конфигурацию плагина в постоянное хранилище (.ini файл или хранилище прикладной программы).
virtual bool saveConfiguration()
{
return mEnvironment->saveConfiguration(mInstanceName, T::getDeviceConfiguration());
}
/// Возвращает имя файла конфигурации без расширения (ключ + идентификатор).
virtual QString getConfigurationName() const
{
return mInstanceName;
}
/// Проверяет успешно ли инициализировался плагин при создании.
virtual bool isReady() const
{
return true;
}
private:
QString mPluginName;
QString mInstanceName;
SDK::Plugin::IEnvironment * mEnvironment;
};
//--------------------------------------------------------------------------------

+ 1
- 1
3.0/src/includes/SDK/Drivers/FR/FiscalDataTypes.h View File

@@ -166,7 +166,7 @@ struct SUnitData
TVAT VAT; /// НДС (value added tax).
QString name; /// Локализованное название платежа (товар).
QString providerINN; /// ИНН поставщика товара (оператор/дилер/Платина).
EPayOffSubjectTypes::Enum payOffSubjectType; /// Признак предмета расчета.
EPayOffSubjectTypes::Enum payOffSubjectType; /// Признак предмета расчета (1212).
int section; /// Отдел.
SUnitData() : sum(0), VAT(0), payOffSubjectType(EPayOffSubjectTypes::None), section(-1) {}


+ 6
- 6
3.0/src/includes/SDK/Drivers/FR/FiscalFields.h View File

@@ -62,12 +62,12 @@ namespace SDK { namespace Driver { namespace CAllHardware { namespace FiscalFiel
const char CounterOfferFiscalTotal[] = "counter_offer_fiscal_total"; // 1217 (Сумма по чеку (БСО) встречным предоставлением).
// Налоги (на весь чек)
const char TaxAmount02[] = "tax_amount_03"; // 1102 (Сумма НДС чека по ставке 18%).
const char TaxAmount03[] = "tax_amount_04"; // 1103 (Сумма НДС чека по ставке 10%).
const char TaxAmount04[] = "tax_amount_05"; // 1104 (Сумма расчета по чеку с НДС по ставке 0%).
const char TaxAmount05[] = "tax_amount_06"; // 1105 (Сумма расчета по чеку без НДС).
const char TaxAmount06[] = "tax_amount_07"; // 1106 (Сумма НДС чека по расчетной ставке 18/118).
const char TaxAmount07[] = "tax_amount_08"; // 1107 (Сумма НДС чека по расчетной ставке 10/110).
const char TaxAmount02[] = "tax_amount_02"; // 1102 (Сумма НДС чека по ставке 18%).
const char TaxAmount03[] = "tax_amount_03"; // 1103 (Сумма НДС чека по ставке 10%).
const char TaxAmount04[] = "tax_amount_04"; // 1104 (Сумма расчета по чеку с НДС по ставке 0%).
const char TaxAmount05[] = "tax_amount_05"; // 1105 (Сумма расчета по чеку без НДС).
const char TaxAmount06[] = "tax_amount_06"; // 1106 (Сумма НДС чека по расчетной ставке 18/118).
const char TaxAmount07[] = "tax_amount_07"; // 1107 (Сумма НДС чека по расчетной ставке 10/110).
}}}}


+ 8
- 0
3.0/src/includes/SDK/Drivers/HardwareConstants.h View File

@@ -27,6 +27,14 @@ namespace CAllHardware
const char SerialNumber[] = "serial_number";
const char CanOnline[] = "can_online";
/// Значения настроек.
namespace Values
{
const char Use[] = "use";
const char NotUse[] = "not_use";
const char Auto[] = "auto";
}
/// Типы поиска устройств.
namespace SearchingTypes
{


+ 178
- 189
3.0/src/includes/SDK/PaymentProcessor/Scripting/Core.h View File

@@ -1,189 +1,178 @@
/* @file Прокси класс для работы с объектами ядра в скриптах. */

#pragma once

// Qt
#include <Common/QtHeadersBegin.h>
#include <QtCore/QObject>
#include <QtCore/QMap>
#include <QtCore/QVariantMap>
#include <Common/QtHeadersEnd.h>

// SDK
#include <SDK/PaymentProcessor/Scripting/Settings.h>
#include <SDK/PaymentProcessor/Scripting/GUIService.h>
#include <SDK/PaymentProcessor/Scripting/AdService.h>
#include <SDK/PaymentProcessor/Scripting/PaymentService.h>
#include <SDK/PaymentProcessor/Scripting/PrinterService.h>
#include <SDK/PaymentProcessor/Scripting/FundsService.h>
#include <SDK/PaymentProcessor/Scripting/NetworkService.h>
#include <SDK/PaymentProcessor/Scripting/HIDService.h>
#include <SDK/PaymentProcessor/Scripting/DeviceService.h>

namespace SDK {
namespace PaymentProcessor {

class ICore;

namespace Scripting {

//------------------------------------------------------------------------------
/// Имена объектов для экспорта в скрипты.
namespace CProxyNames
{
const char Core[] = "Core";
const char EventType[] = "EventType";
const char PaymentStep[] = "PaymentStep";
const char PaymentStepResult[] = "PaymentStepResult";
const char Payment[] = "Payment";
}

//------------------------------------------------------------------------------
class Log : public QObject, public ILogable
{
Q_OBJECT

public slots:
void normal(const QString & aMessage) const { toLog(LogLevel::Normal, aMessage); }
void warning(const QString & aMessage) const { toLog(LogLevel::Warning, aMessage); }
void error(const QString & aMessage) const { toLog(LogLevel::Error, aMessage); }
void debug(const QString & aMessage) const { toLog(LogLevel::Debug, aMessage); }
};

//------------------------------------------------------------------------------
class Properties : public QObject
{
Q_OBJECT

public:
Properties(QVariantMap & aProperties): mProperties(aProperties) {}

public slots:
QVariant get(const QString & aName)
{
if (has(aName))
{
return mProperties[aName];
}

return QVariant();
}

void set(const QString & aName, const QVariant & aValue)
{
mProperties[aName] = aValue;
emit updated();
}

bool has(const QString & aName)
{
return mProperties.contains(aName);
}

signals:
void updated();

private:
QVariantMap & mProperties;
};

//------------------------------------------------------------------------------
class Core : public QObject
{
Q_OBJECT

Q_PROPERTY(QObject * payment READ getPayment CONSTANT)
Q_PROPERTY(QObject * printer READ getPrinter CONSTANT)
Q_PROPERTY(QObject * charge READ getCharge CONSTANT)
Q_PROPERTY(QObject * network READ getNetwork CONSTANT)
Q_PROPERTY(QObject * graphics READ getGraphics CONSTANT)
Q_PROPERTY(QObject * hardware READ getHardware CONSTANT)
Q_PROPERTY(QObject * hid READ getHID CONSTANT)
Q_PROPERTY(QObject * ad READ getAd CONSTANT)
Q_PROPERTY(QObject * environment READ getSettings CONSTANT)
Q_PROPERTY(QObject * log READ getLog CONSTANT)
Q_PROPERTY(QObject * userProperties READ getUserProperties NOTIFY userPropertiesUpdated)

public:
Core(ICore * aCore);

/// Возвращает ядро.
ICore * getCore() const;

/// Делает сервис aService доступным в скрипте под именем aName.
void installService(const QString & aName, QObject * aService);

/// Установить лог, который будет виден из скрипта.
void setLog(ILog * aLog);

public slots:
/// Возвращает указатель на сервис, который был добавлен с помощью функции installService.
QObject * getService(const QString & aName);

/// Уведомление владельца оболочки о некоем событии aEvent с параметрами aParameters.
void postEvent(int aEvent, QVariant aParameters);

/// Утилитный метод для подсчета md5.
QString getMD5Hash(const QString & aSource);

signals:
void userPropertiesUpdated();

protected:
/// Возвращает указатель на интерфейс работы с платежами.
QObject * getPayment();

/// Возвращает указатель на интерфейс работы с принтером.
QObject * getPrinter();

/// Возвращает указатель на интерфейс работы с валидатором.
QObject * getCharge();

/// Возвращает указатель на интерфейс работы со сканером
QObject * getHID();

/// Возвращает указатель на интерфейс работы с сетью.
QObject * getNetwork();

/// Возвращает указатель на интерфейс работы с графикой.
QObject * getGraphics();

/// Возвращает указатель на интерфейс работы с рекламным контентом.
QObject * getAd();

/// Возвращает указатель на интерфейс работы С устройствами.
QObject * getHardware();

/// Возвращает указатель на интерфейс работы с настройками.
QObject * getSettings();

/// Возвращает указатель на интерфейс работы с логом.
QObject * getLog();

/// Возвращает объект с пользовательскими настройками
QObject * getUserProperties();

private slots:
void onPostEvent(int aEvent, QVariant aParameters) const;

private:
ICore * mCore;

Properties mUserProperties;
QMap<QString, QObject *> mServices;

FundsService mFundsService;
PrinterService mPrinterService;
NetworkService mNetworkService;
PaymentService mPaymentService;
GUIService mGUIService;
AdService mAdService;
DeviceService mDeviceService;
Settings mSettings;
Log mLog;
HIDService mHID;
};

//------------------------------------------------------------------------------
}}} // SDK::PaymentProcessor::SDK

/* @file Прокси класс для работы с объектами ядра в скриптах. */
#pragma once
// Qt
#include <Common/QtHeadersBegin.h>
#include <QtCore/QObject>
#include <QtCore/QMap>
#include <QtCore/QVariantMap>
#include <Common/QtHeadersEnd.h>
// SDK
#include <SDK/PaymentProcessor/Scripting/Settings.h>
#include <SDK/PaymentProcessor/Scripting/GUIService.h>
#include <SDK/PaymentProcessor/Scripting/AdService.h>
#include <SDK/PaymentProcessor/Scripting/PaymentService.h>
#include <SDK/PaymentProcessor/Scripting/PrinterService.h>
#include <SDK/PaymentProcessor/Scripting/FundsService.h>
#include <SDK/PaymentProcessor/Scripting/NetworkService.h>
#include <SDK/PaymentProcessor/Scripting/HIDService.h>
#include <SDK/PaymentProcessor/Scripting/DeviceService.h>
namespace SDK {
namespace PaymentProcessor {
class ICore;
namespace Scripting {
//------------------------------------------------------------------------------
/// Имена объектов для экспорта в скрипты.
namespace CProxyNames
{
const char Core[] = "Core";
const char EventType[] = "EventType";
const char PaymentStep[] = "PaymentStep";
const char PaymentStepResult[] = "PaymentStepResult";
const char Payment[] = "Payment";
}
//------------------------------------------------------------------------------
class Log : public QObject, public ILogable
{
Q_OBJECT
public slots:
void normal(const QString & aMessage) const { toLog(LogLevel::Normal, aMessage); }
void warning(const QString & aMessage) const { toLog(LogLevel::Warning, aMessage); }
void error(const QString & aMessage) const { toLog(LogLevel::Error, aMessage); }
void debug(const QString & aMessage) const { toLog(LogLevel::Debug, aMessage); }
};
//------------------------------------------------------------------------------
class Properties : public QObject
{
Q_OBJECT
Q_PROPERTY(QVariantMap clone READ getAll CONSTANT)
public:
Properties(QVariantMap & aProperties): mProperties(aProperties) {}
public slots:
QVariant get(const QString & aName);
void set(const QString & aName, const QVariant & aValue);
bool has(const QString & aName);
QVariantMap getAll() const;
signals:
void updated();
private:
QVariantMap & mProperties;
};
//------------------------------------------------------------------------------
class Core : public QObject
{
Q_OBJECT
Q_PROPERTY(QObject * payment READ getPayment CONSTANT)
Q_PROPERTY(QObject * printer READ getPrinter CONSTANT)
Q_PROPERTY(QObject * charge READ getCharge CONSTANT)
Q_PROPERTY(QObject * network READ getNetwork CONSTANT)
Q_PROPERTY(QObject * graphics READ getGraphics CONSTANT)
Q_PROPERTY(QObject * hardware READ getHardware CONSTANT)
Q_PROPERTY(QObject * hid READ getHID CONSTANT)
Q_PROPERTY(QObject * ad READ getAd CONSTANT)
Q_PROPERTY(QObject * environment READ getSettings CONSTANT)
Q_PROPERTY(QObject * log READ getLog CONSTANT)
Q_PROPERTY(QObject * userProperties READ getUserProperties NOTIFY userPropertiesUpdated)
public:
Core(ICore * aCore);
/// Возвращает ядро.
ICore * getCore() const;
/// Делает сервис aService доступным в скрипте под именем aName.
void installService(const QString & aName, QObject * aService);
/// Установить лог, который будет виден из скрипта.
void setLog(ILog * aLog);
public slots:
/// Возвращает указатель на сервис, который был добавлен с помощью функции installService.
QObject * getService(const QString & aName);
/// Уведомление владельца оболочки о некоем событии aEvent с параметрами aParameters.
void postEvent(int aEvent, QVariant aParameters);
/// Утилитный метод для подсчета md5.
QString getMD5Hash(const QString & aSource);
signals:
void userPropertiesUpdated();
protected:
/// Возвращает указатель на интерфейс работы с платежами.
QObject * getPayment();
/// Возвращает указатель на интерфейс работы с принтером.
QObject * getPrinter();
/// Возвращает указатель на интерфейс работы с валидатором.
QObject * getCharge();
/// Возвращает указатель на интерфейс работы со сканером
QObject * getHID();
/// Возвращает указатель на интерфейс работы с сетью.
QObject * getNetwork();
/// Возвращает указатель на интерфейс работы с графикой.
QObject * getGraphics();
/// Возвращает указатель на интерфейс работы с рекламным контентом.
QObject * getAd();
/// Возвращает указатель на интерфейс работы С устройствами.
QObject * getHardware();
/// Возвращает указатель на интерфейс работы с настройками.
QObject * getSettings();
/// Возвращает указатель на интерфейс работы с логом.
QObject * getLog();
/// Возвращает объект с пользовательскими настройками
QObject * getUserProperties();
private slots:
void onPostEvent(int aEvent, QVariant aParameters) const;
private:
ICore * mCore;
Properties mUserProperties;
QMap<QString, QObject *> mServices;
FundsService mFundsService;
PrinterService mPrinterService;
NetworkService mNetworkService;
PaymentService mPaymentService;
GUIService mGUIService;
AdService mAdService;
DeviceService mDeviceService;
Settings mSettings;
Log mLog;
HIDService mHID;
};
//------------------------------------------------------------------------------
}}} // SDK::PaymentProcessor

+ 69
- 61
3.0/src/includes/SDK/PaymentProcessor/Scripting/GUIService.h View File

@@ -1,61 +1,69 @@
/* @file Прокси класс для работы с графическим движком в скриптах. */

#pragma once

// Qt
#include <Common/QtHeadersBegin.h>
#include <QtCore/QObject>
#include <QtCore/QVariantMap>
#include <Common/QtHeadersEnd.h>

namespace SDK {
namespace PaymentProcessor {

class ICore;
class IGUIService;

namespace Scripting {

//------------------------------------------------------------------------------
class GUIService : public QObject
{
Q_OBJECT

Q_PROPERTY(bool isDisabled READ isDisabled)
Q_PROPERTY(int width READ getWidth CONSTANT)
Q_PROPERTY(int height READ getHeight CONSTANT)
Q_PROPERTY(QVariantMap ui READ getParametersUI CONSTANT)
Q_PROPERTY(QVariantMap ad READ getParametersAd CONSTANT)

public:
GUIService(ICore * aCore);

public slots:
/// Отображает виджет.
bool show(const QString & aWidget, const QVariantMap & aParameters);

/// Отображает popup-виджет (на уровнь выше текущего).
bool showPopup(const QString & aWidget, const QVariantMap & aParameters);

/// Скрывает текущий popup или модальный виджет.
bool hidePopup(const QVariantMap & aParameters = QVariantMap());

/// Оповещает виджет.
void notify(const QString & aEvent, const QVariantMap & aParameters);

private:
QVariantMap getParametersUI() const;
QVariantMap getParametersAd() const;

private:
bool isDisabled() const;
int getWidth() const;
int getHeight() const;

private:
ICore * mCore;
IGUIService * mGUIService;
};

//------------------------------------------------------------------------------
}}} // Scripting::PaymentProcessor::SDK
/* @file Прокси класс для работы с графическим движком в скриптах. */
#pragma once
// Qt
#include <Common/QtHeadersBegin.h>
#include <QtCore/QObject>
#include <QtCore/QVariantMap>
#include <Common/QtHeadersEnd.h>
namespace SDK {
namespace PaymentProcessor {
class ICore;
class IGUIService;
namespace Scripting {
//------------------------------------------------------------------------------
class GUIService : public QObject
{
Q_OBJECT
Q_PROPERTY(bool isDisabled READ isDisabled)
Q_PROPERTY(int width READ getWidth CONSTANT)
Q_PROPERTY(int height READ getHeight CONSTANT)
Q_PROPERTY(QString topScene READ getTopWidget CONSTANT)
Q_PROPERTY(QVariantMap ui READ getParametersUI CONSTANT)
Q_PROPERTY(QVariantMap ad READ getParametersAd CONSTANT)
public:
GUIService(ICore * aCore);
public slots:
/// Отображает виджет.
bool show(const QString & aWidget, const QVariantMap & aParameters);
/// Отображает popup-виджет (на уровнь выше текущего).
bool showPopup(const QString & aWidget, const QVariantMap & aParameters);
/// Скрывает текущий popup или модальный виджет.
bool hidePopup(const QVariantMap & aParameters = QVariantMap());
/// Оповещает виджет.
void notify(const QString & aEvent, const QVariantMap & aParameters);
/// Вовзращает имя топового виджета
QString getTopWidget() const;
signals:
void topSceneChanged();
private:
QVariantMap getParametersUI() const;
QVariantMap getParametersAd() const;
private:
bool isDisabled() const;
int getWidth() const;
int getHeight() const;
private:
ICore * mCore;
IGUIService * mGUIService;
QString mTopWidgetName;
};
//------------------------------------------------------------------------------
}}} // Scripting::PaymentProcessor::SDK

+ 5
- 5
3.0/src/interface/modern/PaySceneItem.qml View File

@@ -1,7 +1,7 @@
import QtQuick 2.2
import QtQuick 2.2
import "widgets" 1.0 as Widgets
BorderImage {
Widgets.BorderImage2 {
id: rootItem
property variant amount
@@ -35,7 +35,7 @@ BorderImage {
height: parent.height
verticalAlignment: Text.AlignVCenter
wrapMode: Text.WordWrap
font: Utils.ui.font("font.panel.title")
font: Skin.ui.font("font.panel.title")
Rectangle {
width: parent.width
@@ -52,7 +52,7 @@ BorderImage {
height: parent.height
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignRight
font: Utils.ui.font("font.money")
font: Skin.ui.font("font.money")
Rectangle {
width: parent.width
@@ -72,7 +72,7 @@ BorderImage {
width: 84
height: parent.height
verticalAlignment: Text.AlignVCenter
font: Utils.ui.font("font.panel.title")
font: Skin.ui.font("font.panel.title")
}
}
}

+ 40
- 40
3.0/src/interface/modern/ResultSceneItem.qml View File

@@ -1,40 +1,40 @@
/* @Виджет для отображения плашки с иконкой и описанием. */
import QtQuick 2.2
import "widgets" 1.0 as Widgets
Item {
id: rootItem
property alias icon: i.icon
property alias text: description.text
height: 120
BorderImage {
anchors.fill: parent
border { left: 30; top: 84; right: 84; bottom: 30 }
horizontalTileMode: BorderImage.Stretch
verticalTileMode: BorderImage.Stretch
source: "image://ui/panel.secondary"
Row {
anchors { fill: parent; leftMargin: 10 }
Widgets.Icon { id: i; icon: 21 }
Widgets.Spacer { id: spacer; width: 10 }
Text {
id: description
anchors.verticalCenter: parent.verticalCenter
width: parent.width - (i.width + spacer.width) - 20
font: Utils.ui.font("font.panel.secondary")
color: Utils.ui.color("color.panel.primary")
wrapMode: Text.WordWrap
verticalAlignment: Text.AlignVCenter
}
}
}
}
/* @Виджет для отображения плашки с иконкой и описанием. */
import QtQuick 2.2
import "widgets" 1.0 as Widgets
Item {
id: rootItem
property alias icon: i.icon
property alias text: description.text
height: 120
Widgets.BorderImage2 {
anchors.fill: parent
border { left: 30; top: 84; right: 84; bottom: 30 }
horizontalTileMode: BorderImage.Stretch
verticalTileMode: BorderImage.Stretch
source: "image://ui/panel.secondary"
Row {
anchors { fill: parent; leftMargin: 10 }
Widgets.Icon { id: i; icon: 21 }
Widgets.Spacer { id: spacer; width: 10 }
Text {
id: description
anchors.verticalCenter: parent.verticalCenter
width: parent.width - (i.width + spacer.width) - 20
font: Skin.ui.font("font.panel.secondary")
color: Skin.ui.color("color.panel.primary")
wrapMode: Text.WordWrap
verticalAlignment: Text.AlignVCenter
}
}
}
}

+ 107
- 107
3.0/src/interface/modern/ad_popup.qml View File

@@ -1,107 +1,107 @@
/* @file Всплывающее окно с рекламным содержимым. */
import QtQuick 2.2
import Core.Types 1.0
import "widgets" 1.0 as Widgets
import "controls" 1.0 as Controls
import "scripts/gui.js" 1.0 as GUI
import "scenario/constants.js" as Scenario
Item {
id: rootItem
width: 1280
height: 1024
//ad
Widgets.Ad {
id: banner
type: "banner_window_popup"
anchors { horizontalCenter: parent.horizontalCenter; top: parent.top; topMargin: 197 }
width: 1211
height: 657
}
NumberAnimation {
id: showAnimation
target: rootItem
property: "opacity"
duration: 200
from: 0
to: 1
}
NumberAnimation {
id: hideAnimation
target: rootItem
property: "opacity"
duration: 200
from: 1
to: 0
onCompleted: hide()
}
Row {
anchors { horizontalCenter: parent.horizontalCenter; top: banner.bottom; topMargin: 21 }
// Button1
Widgets.Button {
id: button1
icon: 18
text: Utils.locale.tr(QT_TR_NOOP("info_popup#close"))
color: Utils.ui.color("color.button.secondary")
texture: "image://ui/button.secondary.normal"
texturePressed: "image://ui/button.secondary.pressed"
width: 407
onClicked: hideAnimation.start();
}
}
function hide() {
Core.graphics.hidePopup();
Core.postEvent(EventType.UpdateScenario, "");
}
Timer {
id: timer
onTriggered: hide()
}
QtObject {
id: global
}
function resetHandler(aParameters) {
if (timer.running) {
timer.stop();
}
timer.interval = 0;
if (aParameters.hasOwnProperty("timeout") && aParameters.timeout) {
timer.interval = aParameters.timeout;
timer.start();
}
}
function showHandler() {
showAnimation.start();
// Обновим статистику показа баннера
if (global.waiting) {
Core.ad.addEvent("banner_popup2", {});
}
}
function hideHandler() {
timer.stop();
}
}
/* @file Всплывающее окно с рекламным содержимым. */
import QtQuick 2.2
import Core.Types 1.0
import "widgets" 1.0 as Widgets
import "controls" 1.0 as Controls
import "scripts/gui.js" 1.0 as GUI
import "scenario/constants.js" as Scenario
Item {
id: rootItem
width: 1280
height: 1024
//ad
Widgets.Ad {
id: banner
type: "banner_window_popup"
anchors { horizontalCenter: parent.horizontalCenter; top: parent.top; topMargin: 197 }
width: 1211
height: 657
}
NumberAnimation {
id: showAnimation
target: rootItem
property: "opacity"
duration: 200
from: 0
to: 1
}
NumberAnimation {
id: hideAnimation
target: rootItem
property: "opacity"
duration: 200
from: 1
to: 0
onCompleted: hide()
}
Row {
anchors { horizontalCenter: parent.horizontalCenter; top: banner.bottom; topMargin: 21 }
// Button1
Widgets.Button {
id: button1
icon: 18
text: Utils.locale.tr(QT_TR_NOOP("info_popup#close"))
color: Skin.ui.color("color.button.secondary")
texture: "image://ui/button.secondary.normal"
texturePressed: "image://ui/button.secondary.pressed"
width: 407
onClicked: hideAnimation.start();
}
}
function hide() {
Core.graphics.hidePopup();
Core.postEvent(EventType.UpdateScenario, "");
}
Timer {
id: timer
onTriggered: hide()
}
QtObject {
id: global
}
function resetHandler(aParameters) {
if (timer.running) {
timer.stop();
}
timer.interval = 0;
if (aParameters.hasOwnProperty("timeout") && aParameters.timeout) {
timer.interval = aParameters.timeout;
timer.start();
}
}
function showHandler() {
showAnimation.start();
// Обновим статистику показа баннера
if (global.waiting) {
Core.ad.addEvent("banner_popup2", {});
}
}
function hideHandler() {
timer.stop();
}
}

+ 3
- 3
3.0/src/interface/modern/denom_info_scene.qml View File

@@ -13,7 +13,7 @@ Widgets.SceneBase2 {
leftButtonEnabled: true
rightButtonEnabled: !global.rightButtonDisabled
BorderImage {
Widgets.BorderImage2 {
anchors { horizontalCenter: parent.horizontalCenter }
width: 1218
height: 657
@@ -32,8 +32,8 @@ Widgets.SceneBase2 {
Text {
horizontalAlignment: Text.AlignHCenter
width: parent.width
font: Utils.ui.font("font.message")
color: Utils.ui.color("color.message")
font: Skin.ui.font("font.message")
color: Skin.ui.color("color.message")
wrapMode: Text.WordWrap
text: {
if (flowNotes.hasChildren && flowCoins.hasChildren) {


+ 76
- 76
3.0/src/interface/modern/edit_pin_scene.qml View File

@@ -1,76 +1,76 @@
/* @file Экран ввода пин-кода. */
import QtQuick 1.1
import Core.Types 1.0
import "widgets" as Widgets
import "controls" as Controls
import "scripts/gui.js" 1.0 as GUI
import "scenario/constants.js" as Scenario
import "plugins" 1.0
Widgets.SceneBase2 {
id: rootItem
topPanelText: Utils.locale.tr(QT_TR_NOOP("edit_pin_scene#scene_caption"))
topPanelImage: global.provider ? ("image://ui/logoprovider/" + global.provider.id + "/button.operator.blank/" + global.provider.name) : ""
leftButtonEnabled: false
rightButtonEnabled: false
// Название сцены
Text {
anchors { left: parent.left; leftMargin: 41; top: parent.top; topMargin: 230 }
font: Utils.ui.font("font.title")
color: Utils.ui.color("color.main.primary")
text: Utils.locale.tr(QT_TR_NOOP("edit_pin_scene#description"))
}
Column {
anchors { left: parent.left; leftMargin: 30; right: parent.right; rightMargin: 30; top: parent.top; topMargin: 311 }
Widgets.InputField {
id: editor
anchors { left: parent.left; right: parent.right }
focus: true
backspace: Item {}
}
Image {
source: "image://ui/pinpad"
anchors.horizontalCenter: parent.horizontalCenter
}
}
onBack: Core.postEvent(EventType.UpdateScenario, Scenario.Payment.Event.Abort)
onLeftClick: Core.postEvent(EventType.UpdateScenario, Scenario.Idle.Event.Back)
onRightClick: {
Core.postEvent(EventType.UpdateScenario, Scenario.Idle.Event.Forward)
}
QtObject {
id: global
property variant provider;
// Признак, что кнопка Next уже нажата
property bool rightButtonDisabled
}
function resetHandler(aParameters) {
global.provider = Core.payment.getProvider(aParameters.id);
editor.reset("");
}
function notifyHandler(aEvent, aParameters) {
if (aEvent === Scenario.Payment.Event.PinUpdated) {
editor.reset(aParameters.pin);
}
}
function showHandler() {
global.rightButtonDisabled = false;
}
}
/* @file Экран ввода пин-кода. */
import QtQuick 1.1
import Core.Types 1.0
import "widgets" as Widgets
import "controls" as Controls
import "scripts/gui.js" 1.0 as GUI
import "scenario/constants.js" as Scenario
import "plugins" 1.0
Widgets.SceneBase2 {
id: rootItem
topPanelText: Utils.locale.tr(QT_TR_NOOP("edit_pin_scene#scene_caption"))
topPanelImage: global.provider ? ("image://ui/logoprovider/" + global.provider.id + "/button.operator.blank/" + global.provider.name) : ""
leftButtonEnabled: false
rightButtonEnabled: false
// Название сцены
Text {
anchors { left: parent.left; leftMargin: 41; top: parent.top; topMargin: 230 }
font: Skin.ui.font("font.title")
color: Skin.ui.color("color.main.primary")
text: Utils.locale.tr(QT_TR_NOOP("edit_pin_scene#description"))
}
Column {
anchors { left: parent.left; leftMargin: 30; right: parent.right; rightMargin: 30; top: parent.top; topMargin: 311 }
Widgets.InputField {
id: editor
anchors { left: parent.left; right: parent.right }
focus: true
backspace: Item {}
}
Widgets.Image2 {
source: "image://ui/pinpad"
anchors.horizontalCenter: parent.horizontalCenter
}
}
onBack: Core.postEvent(EventType.UpdateScenario, Scenario.Payment.Event.Abort)
onLeftClick: Core.postEvent(EventType.UpdateScenario, Scenario.Idle.Event.Back)
onRightClick: {
Core.postEvent(EventType.UpdateScenario, Scenario.Idle.Event.Forward)
}
QtObject {
id: global
property variant provider;
// Признак, что кнопка Next уже нажата
property bool rightButtonDisabled
}
function resetHandler(aParameters) {
global.provider = Core.payment.getProvider(aParameters.id);
editor.reset("");
}
function notifyHandler(aEvent, aParameters) {
if (aEvent === Scenario.Payment.Event.PinUpdated) {
editor.reset(aParameters.pin);
}
}
function showHandler() {
global.rightButtonDisabled = false;
}
}

+ 103
- 103
3.0/src/interface/modern/html_popup.qml View File

@@ -1,103 +1,103 @@
/* @file Всплывающее окно ожидания завершения или уведомления у результате какой-либо операции. */
import QtQuick 2.2
import Core.Types 1.0
import "widgets" 1.0 as Widgets
import "controls" 1.0 as Controls
import "scripts/gui.js" 1.0 as GUI
import "plugins" 1.0
Item {
id: rootItem
width: 1280
height: 1024
Widgets.HtmlEditor {
id: html
anchors { horizontalCenter: parent.horizontalCenter; top: parent.top; topMargin: 196 }
}
// Кнопка закрыть
Widgets.Button {
icon: 18
text: Utils.locale.tr(QT_TR_NOOP("info_popup#close"))
color: Utils.ui.color("color.button.secondary")