Browse Source

refs #1 Synchronize with release commit: 59ea77a3c3

master
parent
commit
3bfc8b70b1
100 changed files with 1905 additions and 1357 deletions
  1. +5
    -3
      3.0/scripts/build/runtimes/terminal_ru.xml
  2. +1
    -1
      3.0/src/apps/PaymentProcessor/src/Services/CashDispenserManager.cpp
  3. +28
    -15
      3.0/src/apps/PaymentProcessor/src/Services/SchedulerService.cpp
  4. +0
    -21
      3.0/src/apps/PaymentProcessor/src/Services/SchedulerService.h
  5. +6
    -0
      3.0/src/apps/PaymentProcessor/src/Services/ServiceController.cpp
  6. +3
    -0
      3.0/src/apps/PaymentProcessor/src/Services/ServiceController.h
  7. +21
    -1
      3.0/src/includes/Hardware/Acceptors/CCTalkAcceptorConstants.h
  8. +0
    -1
      3.0/src/includes/Hardware/Acceptors/CCTalkModelData.h
  9. +19
    -0
      3.0/src/includes/Hardware/CardReaders/MifareReaderModelDataTypes.h
  10. +27
    -26
      3.0/src/includes/Hardware/CashAcceptors/CashAcceptorStatusCodes.h
  11. +1
    -0
      3.0/src/includes/Hardware/CashAcceptors/CashAcceptorStatusesDescriptions.h
  12. +1
    -1
      3.0/src/includes/Hardware/CashAcceptors/ModelData.h
  13. +8
    -1
      3.0/src/includes/Hardware/CashAcceptors/SerialCashAcceptor.h
  14. +5
    -4
      3.0/src/includes/Hardware/CashDevices/CCTalkData.h
  15. +1
    -0
      3.0/src/includes/Hardware/CashDevices/CCTalkDeviceBase.h
  16. +33
    -37
      3.0/src/includes/Hardware/CashDevices/CCTalkDeviceConstants.h
  17. +1
    -0
      3.0/src/includes/Hardware/CashDevices/CCTalkModelData.h
  18. +1
    -42
      3.0/src/includes/Hardware/CoinAcceptors/CoinAcceptorBase.h
  19. +1
    -0
      3.0/src/includes/Hardware/Common/CommandResults.h
  20. +38
    -0
      3.0/src/includes/Hardware/Common/ConfigCleaner.h
  21. +29
    -0
      3.0/src/includes/Hardware/Common/ContainerProxy.h
  22. +5
    -5
      3.0/src/includes/Hardware/Common/DataPointer.h
  23. +6
    -0
      3.0/src/includes/Hardware/Common/DeviceDataConstants.h
  24. +21
    -0
      3.0/src/includes/Hardware/Common/DeviceModelDataTypes.h
  25. +13
    -8
      3.0/src/includes/Hardware/Common/HardwareConstants.h
  26. +1
    -0
      3.0/src/includes/Hardware/Common/LibUSBDeviceBase.h
  27. +44
    -13
      3.0/src/includes/Hardware/Common/Specifications.h
  28. +1
    -54
      3.0/src/includes/Hardware/Common/USBDeviceModelData.h
  29. +41
    -0
      3.0/src/includes/Hardware/Common/USBDeviceModelDataTypes.h
  30. +22
    -0
      3.0/src/includes/Hardware/Common/USBDeviceVendors.h
  31. +7
    -0
      3.0/src/includes/Hardware/Dispensers/DispenserStatusCodes.h
  32. +3
    -0
      3.0/src/includes/Hardware/Dispensers/DispenserStatusesDescriptions.h
  33. +21
    -0
      3.0/src/includes/Hardware/Dispensers/PortDispenser.h
  34. +1
    -1
      3.0/src/includes/Hardware/Dispensers/ProtoDispenser.h
  35. +8
    -0
      3.0/src/includes/Hardware/Dispensers/SerialDispenser.h
  36. +80
    -0
      3.0/src/includes/Hardware/FR/FFDataTypes.h
  37. +47
    -82
      3.0/src/includes/Hardware/FR/FRBaseConstants.h
  38. +53
    -0
      3.0/src/includes/Hardware/FR/FRDataTypes.h
  39. +1
    -0
      3.0/src/includes/Hardware/FR/FSSerialData.h
  40. +1
    -299
      3.0/src/includes/Hardware/FR/FiscalFieldDescriptions.h
  41. +5
    -2
      3.0/src/includes/Hardware/IOPorts/LibUSBDeviceDataTypes.h
  42. +58
    -20
      3.0/src/includes/Hardware/Plugins/CommonParameters.h
  43. +42
    -0
      3.0/src/includes/Hardware/Printers/PortPOSPrinters.h
  44. +0
    -1
      3.0/src/includes/Hardware/Printers/PortPrinterBase.h
  45. +5
    -7
      3.0/src/includes/Hardware/Printers/PortPrintersBase.h
  46. +1
    -0
      3.0/src/includes/Hardware/Printers/PrinterDevices.h
  47. +0
    -1
      3.0/src/includes/Hardware/Printers/SerialPrinterBase.h
  48. +1
    -0
      3.0/src/includes/Hardware/Protocols/CashAcceptor/SSPDataTypes.h
  49. +7
    -3
      3.0/src/includes/Hardware/Protocols/Common/ProtocolNames.h
  50. +1
    -0
      3.0/src/includes/Hardware/Protocols/Dispensers/Puloon.h
  51. +1
    -97
      3.0/src/includes/SDK/Drivers/CashAcceptor/Par.h
  52. +33
    -14
      3.0/src/includes/SDK/Drivers/FR/FiscalDataTypes.h
  53. +2
    -0
      3.0/src/includes/SDK/Drivers/HardwareConstants.h
  54. +4
    -1
      3.0/src/includes/SDK/Drivers/ICashAcceptor.h
  55. +1
    -1
      3.0/src/includes/SDK/Drivers/IDispenser.h
  56. +17
    -0
      3.0/src/includes/SDK/Drivers/IIOPort.h
  57. +4
    -0
      3.0/src/includes/SDK/PaymentProcessor/Core/ICore.h
  58. +33
    -0
      3.0/src/includes/SDK/PaymentProcessor/Core/ISchedulerService.h
  59. +17
    -0
      3.0/src/includes/SDK/PaymentProcessor/Scripting/PaymentService.h
  60. +3
    -0
      3.0/src/includes/SDK/PaymentProcessor/Scripting/PrinterService.h
  61. +22
    -2
      3.0/src/interface/modern/scenario/card_ucs_charge_scenario.js
  62. +2
    -1
      3.0/src/interface/modern/scenario/constants.js
  63. +3
    -1
      3.0/src/interface/modern/scenario/payment_scenario.js
  64. +31
    -22
      3.0/src/modules/DeviceManager/src/DeviceManager.cpp
  65. +9
    -0
      3.0/src/modules/Hardware.sln
  66. +1
    -18
      3.0/src/modules/Hardware/Acceptors/msvc/Acceptors.vcxproj
  67. +1
    -10
      3.0/src/modules/Hardware/Acceptors/msvc/Acceptors.vcxproj.filters
  68. +40
    -274
      3.0/src/modules/Hardware/Acceptors/src/CCTalk/CCTalkAcceptorBase.cpp
  69. +5
    -56
      3.0/src/modules/Hardware/Acceptors/src/CCTalk/CCTalkAcceptorBase.h
  70. +2
    -8
      3.0/src/modules/Hardware/Acceptors/src/CCTalk/CCTalkComplexEnableAcceptor.cpp
  71. +1
    -7
      3.0/src/modules/Hardware/Cardreaders/msvc/CardReaders.vcxproj
  72. +1
    -1
      3.0/src/modules/Hardware/Cardreaders/msvc/CardReaders.vcxproj.filters
  73. +3
    -13
      3.0/src/modules/Hardware/Cardreaders/src/Creator/CreatorReader.cpp
  74. +2
    -9
      3.0/src/modules/Hardware/Cardreaders/src/Creator/CreatorReaderDetectingData.h
  75. +0
    -6
      3.0/src/modules/Hardware/CashAcceptors/msvc/CashAcceptors.vcxproj
  76. +0
    -42
      3.0/src/modules/Hardware/CashAcceptors/src/CCNet/CCNetCashAcceptorBase.cpp
  77. +1
    -11
      3.0/src/modules/Hardware/CashAcceptors/src/CCNet/CCNetCashAcceptorBase.h
  78. +4
    -10
      3.0/src/modules/Hardware/CashAcceptors/src/CCTalk/CCTalkCashAcceptor.cpp
  79. +1
    -6
      3.0/src/modules/Hardware/CashAcceptors/src/CCTalk/CCTalkCashAcceptor.h
  80. +2
    -2
      3.0/src/modules/Hardware/CashAcceptors/src/CCTalk/CCTalkCashAcceptorConstants.h
  81. +1
    -2
      3.0/src/modules/Hardware/CashAcceptors/src/CCTalk/CCTalkCashAcceptorModelData.h
  82. +20
    -5
      3.0/src/modules/Hardware/CashAcceptors/src/CashAcceptorBase.cpp
  83. +5
    -3
      3.0/src/modules/Hardware/CashAcceptors/src/CashAcceptorBase.h
  84. +1
    -1
      3.0/src/modules/Hardware/CashAcceptors/src/EBDS/EBDSCashAcceptor.h
  85. +1
    -1
      3.0/src/modules/Hardware/CashAcceptors/src/ICT/ICTCashAcceptor.h
  86. +1
    -1
      3.0/src/modules/Hardware/CashAcceptors/src/ID003/ID003CashAcceptor.h
  87. +52
    -6
      3.0/src/modules/Hardware/CashAcceptors/src/PortCashAcceptor.cpp
  88. +14
    -2
      3.0/src/modules/Hardware/CashAcceptors/src/PortCashAcceptor.h
  89. +161
    -33
      3.0/src/modules/Hardware/CashAcceptors/src/SSP/SSPCashAcceptor.cpp
  90. +16
    -1
      3.0/src/modules/Hardware/CashAcceptors/src/SSP/SSPCashAcceptor.h
  91. +91
    -11
      3.0/src/modules/Hardware/CashAcceptors/src/SSP/SSPCashAcceptorConstants.h
  92. +40
    -20
      3.0/src/modules/Hardware/CashAcceptors/src/SSP/SSPModelData.h
  93. +1
    -1
      3.0/src/modules/Hardware/CashAcceptors/src/V2e/V2eCashAcceptor.h
  94. +134
    -0
      3.0/src/modules/Hardware/CashDevices/msvc/CashDevices.vcxproj
  95. +35
    -0
      3.0/src/modules/Hardware/CashDevices/msvc/CashDevices.vcxproj.filters
  96. +261
    -0
      3.0/src/modules/Hardware/CashDevices/src/CCTalk/CCTalkDeviceBase.cpp
  97. +87
    -0
      3.0/src/modules/Hardware/CashDevices/src/CCTalk/CCTalkDeviceBase.h
  98. +2
    -1
      3.0/src/modules/Hardware/CashDevices/src/CCTalk/CCTalkModelData.cpp
  99. +2
    -2
      3.0/src/modules/Hardware/CashDevices/src/CCTalk/CCTalkModelData.h
  100. +9
    -6
      3.0/src/modules/Hardware/CashDispensers/msvc/CashDispensers.vcxproj

+ 5
- 3
3.0/scripts/build/runtimes/terminal_ru.xml View File

@@ -59,6 +59,9 @@
<!-- UCS plugin -->
<option target="user/user/plugins/ucs.ini" key="PaymentProcessor.ChargeProvider.UcsChargeProvider.configuration_singleton/ucs_runtime_path" value="C:/UCS/BIN" />
<file if="{CYBERPLAT_BUILD}" source="{QBS_RESULT_PATH}/plugins/ucs.dll" target="plugins/plugins/ucs.dll"/>
<!-- PCS plugin -->
<file if="{CYBERPLAT_BUILD}" source="{QBS_RESULT_PATH}/plugins/payment_customizer_scenario.dll" target="plugins/plugins/payment_customizer_scenario.dll"/>

<!-- Драйверы, компонент drivers -->
<file source="{QBS_RESULT_PATH}/plugins/drivers/fr.dll" target="drivers/plugins/drivers/fr.dll"/>
@@ -89,9 +92,8 @@
<file if="{CYBERPLAT_BUILD}" source="{QBS_RESULT_PATH}/locale/cyberplat_monitoring_ru.qm" target="locale/plugins/cyberplat_monitoring_ru.qm"/>
<file if="{CYBERPLAT_BUILD}" source="{QBS_RESULT_PATH}/locale/platru_ru.qm" target="locale/plugins/platru_ru.qm"/>
<file if="{CYBERPLAT_BUILD}" source="{QBS_RESULT_PATH}/locale/cyberchange_ru.qm" target="locale/plugins/cyberchange_ru.qm"/>
<!-- <file if="{CYBERPLAT_BUILD}" source="{QBS_RESULT_PATH}/locale/uniteller_ru.qm" target="locale/plugins/uniteller_ru.qm"/> -->
<file if="{CYBERPLAT_BUILD}" source="{QBS_RESULT_PATH}/locale/ucs_ru.qm" target="locale/plugins/ucs_ru.qm"/> -->
<file if="{CYBERPLAT_BUILD}" source="{QBS_RESULT_PATH}/locale/payment_customizer_scenario_ru.qm" target="locale/plugins/payment_customizer_scenario_ru.qm"/>

<!-- ###################################################################################### -->

<!-- Шрифты для терминалов Beeline -->


+ 1
- 1
3.0/src/apps/PaymentProcessor/src/Services/CashDispenserManager.cpp View File

@@ -207,7 +207,7 @@ void CashDispenserManager::setCashList(DSDK::IDispenser * aDispenser)
unitData << cashUnit.count;
}

aDispenser->setCashList(unitData);
aDispenser->setUnitList(unitData);
}

//---------------------------------------------------------------------------


+ 28
- 15
3.0/src/apps/PaymentProcessor/src/Services/SchedulerService.cpp View File

@@ -110,7 +110,7 @@ bool SchedulerService::initialize()

Item item(taskName, settings, userSettings);

if (!mFactory.contains(item.type()))
if (!mFactory.contains(item.type()) && !mExternalTasks.contains(item.name()))
{
toLog(LogLevel::Error, QString("[%1]: Unknown task type '%2'.").arg(item.name()).arg(item.type()));
}
@@ -416,8 +416,18 @@ void SchedulerService::execute()
{
SchedulerService::Item & item = mItems[timer->objectName()];
timer->deleteLater();
SDK::PaymentProcessor::ITask * task;

SDK::PaymentProcessor::ITask * task = mFactory[item.type()](item.name(), CScheduler::LogName, item.params());
// Проверим, что таск может быть пользовательским
if (mExternalTasks[item.name()])
{
task = mExternalTasks[item.name()];
}
else
{
task = mFactory[item.type()](item.name(), CScheduler::LogName, item.params());
}

if (task)
{
@@ -450,22 +460,25 @@ void SchedulerService::onTaskComplete(const QString & aName, bool aComplete)
mWorkingTasks.remove(aName);
}

try
if (task && task != mExternalTasks[aName])
{
QObject * taskObject = dynamic_cast<QObject *>(task);
if (taskObject)
try
{
taskObject->deleteLater();
}
else
{
delete task;
}
QObject * taskObject = dynamic_cast<QObject *>(task);

task = nullptr;
}
catch(...) {}
if (taskObject)
{
taskObject->deleteLater();
}
else
{
delete task;
}

task = nullptr;
}
catch (...) {}
}

mItems[aName].complete(aComplete);



+ 0
- 21
3.0/src/apps/PaymentProcessor/src/Services/SchedulerService.h View File

@@ -158,27 +158,6 @@ private:
QMap<QString, Item> mItems;
QMap<QString, SDK::PaymentProcessor::ITask *> mWorkingTasks;
QReadWriteLock mLock;

protected:
typedef boost::function<SDK::PaymentProcessor::ITask *(const QString & aName, const QString & aLogName, const QString & aParams)> TTaskCreator;

/// зарегистрировать тип задачи в фабрике классов
template <class C>
void registerTaskType(const QString & aType)
{
auto taskCreator = [](const QString & aName, const QString & aLogName, const QString & aParams) -> SDK::PaymentProcessor::ITask *
{
return new C(aName, aLogName, aParams);
};

if (!mFactory.contains(aType))
{
mFactory[aType] = TTaskCreator(taskCreator);
}
}

protected:
QMap<QString, TTaskCreator> mFactory;
};

//---------------------------------------------------------------------------

+ 6
- 0
3.0/src/apps/PaymentProcessor/src/Services/ServiceController.cpp View File

@@ -518,6 +518,12 @@ SDK::PaymentProcessor::ITerminalService * ServiceController::getTerminalService(
}

//---------------------------------------------------------------------------
SDK::PaymentProcessor::ISchedulerService * ServiceController::getSchedulerService() const
{
return boost::polymorphic_cast<PP::ISchedulerService *>(mRegisteredServices.value(CServices::SchedulerService));
}

//---------------------------------------------------------------------------
SDK::PaymentProcessor::IService * ServiceController::getService(const QString & aServiceName) const
{
if (mRegisteredServices.contains(aServiceName))


+ 3
- 0
3.0/src/apps/PaymentProcessor/src/Services/ServiceController.h View File

@@ -125,6 +125,9 @@ protected:
/// Возвращает интерфейс управления терминалом.
virtual SDK::PaymentProcessor::ITerminalService * getTerminalService() const;

/// Возвращает интерфейс управления планировщиком заданий.
virtual SDK::PaymentProcessor::ISchedulerService * getSchedulerService() const;

/// Возвращает сервис с заданным именем.
virtual SDK::PaymentProcessor::IService * getService(const QString & aServiceName) const;



+ 21
- 1
3.0/src/includes/Hardware/Acceptors/CCTalkAcceptorConstants.h View File

@@ -1 +1,21 @@
#include "../../../modules/Hardware/Acceptors/src/CCTalk/CCTalkAcceptorConstants.h"
/* @file Константы устройств на протоколе ccTalk. */

#pragma once

#include "Hardware/CashDevices/CCTalkDeviceConstants.h"

//--------------------------------------------------------------------------------
namespace CCCTalk
{
/// Маска для сортировщика по умолчанию (использовать предустановленные настройки).
const char DefaultSorterMask = '\xFF';

/// Количество номиналов.
const int NominalCount = 16;

/// Фиктивныe девайс-коды устройства, для функционала, связанного с повтором таких статус-кодов
const uchar EscrowDeviceCode = 200;
const uchar StackedDeviceCode = 201;
}

//--------------------------------------------------------------------------------

+ 0
- 1
3.0/src/includes/Hardware/Acceptors/CCTalkModelData.h View File

@@ -1 +0,0 @@
#include "../../../modules/Hardware/Acceptors/src/CCTalk/CCTalkModelData.h"

+ 19
- 0
3.0/src/includes/Hardware/CardReaders/MifareReaderModelDataTypes.h View File

@@ -0,0 +1,19 @@
/* @file Типы данных моделей Mifare-ридеров ACS. */
#pragma once

#include "Hardware/Common/USBDeviceModelData.h"

//------------------------------------------------------------------------------
namespace CMifareReader
{
struct SModelData: public CUSBDevice::SProductData
{
int SAM;
bool CCID;

SModelData() : SAM(0), CCID(true) {}
SModelData(const QString & aModel, int aSAM, bool aCCID, bool aVerified) : CUSBDevice::SProductData(aModel, aVerified), SAM(aSAM), CCID(aCCID) {}
};
}

//------------------------------------------------------------------------------

+ 27
- 26
3.0/src/includes/Hardware/CashAcceptors/CashAcceptorStatusCodes.h View File

@@ -134,32 +134,33 @@ namespace BillAcceptorStatusCode
/// Выброс. Предупреждение, но если долго висит - ошибка.
namespace Reject
{
const int Insertion = 750; /// Купюра неверно вставлена.
const int Dielectric = 751; /// Выброс по диэлектрическому каналу.
const int PreviousOperating = 752; /// Идет прием предыдущей купюры или монеты.
const int Compensation = 753; /// Засунуто несколько купюр.
const int Transport = 754; /// Помеха на конвейере.
const int Identification = 755; /// Идентификация купюры. TODO: прояснить режекты в CCNet.
const int Verification = 756; /// Верификация купюры. TODO: прояснить режекты в CCNet.
const int InhibitNote = 757; /// Запрещенная купюра.
const int Operation = 758; /// Ошибка операции.
const int DataProcessing = 759; /// Ошибка обработки данных.
const int Length = 760; /// Ошибка длины купюры.
const int LengthDoubling = 761; /// Задваивание по длине до эскроу на аппаратах с 2-мя моторами.
const int Width = 762; /// Ошибка ширины купюры.
const int WidthDoubling = 763; /// Задваивание по ширине.
const int Unrecognised = 764; /// Не распознана. TODO: прояснить режекты в CCNet.
const int MagneticSensor = 765; /// Магнитный канал.
const int CapacitanceSensor = 766; /// Емкостный канал.
const int OpticalSensor = 767; /// Оптический канал.
const int UVSensor = 768; /// Ультрафиолетовый канал.
const int DoubleCorrelation = 769; /// Двойная корреляция.
const int Barcode = 770; /// Не совпадает штрих-код с номиналом.
const int Diverter = 771; /// Ошибка направляющих конвейера.
const int UserDefined = 772; /// Инициирован пользователем.
const int Cheated = 773; /// Попытка мошенничества.
const int EscrowTimeout = 774; /// Таймаут ожидания действий после эскроу.
const int Unknown = 775; /// Причина неизвестна.
const int Rejecting = 750; /// В процессе выброса.
const int Insertion = 751; /// Купюра неверно вставлена.
const int Dielectric = 752; /// Выброс по диэлектрическому каналу.
const int PreviousOperating = 753; /// Идет прием предыдущей купюры или монеты.
const int Compensation = 754; /// Засунуто несколько купюр.
const int Transport = 755; /// Помеха на конвейере.
const int Identification = 756; /// Идентификация купюры. TODO: прояснить режекты в CCNet.
const int Verification = 757; /// Верификация купюры. TODO: прояснить режекты в CCNet.
const int InhibitNote = 758; /// Запрещенная купюра.
const int Operation = 759; /// Ошибка операции.
const int DataProcessing = 760; /// Ошибка обработки данных.
const int Length = 761; /// Ошибка длины купюры.
const int LengthDoubling = 762; /// Задваивание по длине до эскроу на аппаратах с 2-мя моторами.
const int Width = 763; /// Ошибка ширины купюры.
const int WidthDoubling = 764; /// Задваивание по ширине.
const int Unrecognised = 765; /// Не распознана. TODO: прояснить режекты в CCNet.
const int MagneticSensor = 766; /// Магнитный канал.
const int CapacitanceSensor = 767; /// Емкостный канал.
const int OpticalSensor = 768; /// Оптический канал.
const int UVSensor = 769; /// Ультрафиолетовый канал.
const int DoubleCorrelation = 770; /// Двойная корреляция.
const int Barcode = 771; /// Не совпадает штрих-код с номиналом.
const int Diverter = 772; /// Ошибка направляющих конвейера.
const int UserDefined = 773; /// Инициирован пользователем.
const int Cheated = 774; /// Попытка мошенничества.
const int EscrowTimeout = 775; /// Таймаут ожидания действий после эскроу.
const int Unknown = 776; /// Причина неизвестна.
}
}



+ 1
- 0
3.0/src/includes/Hardware/CashAcceptors/CashAcceptorStatusesDescriptions.h View File

@@ -171,6 +171,7 @@ namespace BillAcceptorStatusCode
ADD_CA_ERROR(Calibration, QCoreApplication::translate("ValidatorStatuses", "#calibration_error"));

/// Выбросы (в большинстве случае - нормальное состояние).
ADD_CA_STATUS_DATA(Reject, Rejecting, Rejected, Warning, "Rejecting", QCoreApplication::translate("ValidatorStatuses", "#rejecting"));
ADD_CA_REJECT(Insertion);
ADD_CA_REJECT(Dielectric);
ADD_CA_REJECT(PreviousOperating);


+ 1
- 1
3.0/src/includes/Hardware/CashAcceptors/ModelData.h View File

@@ -17,7 +17,7 @@ struct SBaseModelData
bool verified;
bool updatable;

SBaseModelData() : verified(false), updatable(false) {}
SBaseModelData(const QString & aName = "") : name(aName), verified(false), updatable(false) {}
SBaseModelData(const QString & aName, bool aVerified, bool aUpdatable = false) : name(aName), verified(aVerified), updatable(aUpdatable) {}
};



+ 8
- 1
3.0/src/includes/Hardware/CashAcceptors/SerialCashAcceptor.h View File

@@ -1 +1,8 @@
#include "../../../modules/Hardware/CashAcceptors/src/SerialCashAcceptor.h"
#include "Hardware/Common/PortPollingDeviceBase.h"
#include "Hardware/Common/SerialDeviceBase.h"
#include "Hardware/CashAcceptors/PortCashAcceptor.h"

//--------------------------------------------------------------------------------
typedef PortCashAcceptor<SerialDeviceBase<PortPollingDeviceBase<ProtoCashAcceptor>>> TSerialCashAcceptor;

//--------------------------------------------------------------------------------

3.0/src/includes/Hardware/Acceptors/CCTalkData.h → 3.0/src/includes/Hardware/CashDevices/CCTalkData.h View File

@@ -19,15 +19,16 @@ namespace CCCTalk
const uchar Common = 0; /// Широкополосная команда.
const uchar Host = 1; /// Хост.
const uchar CoinAcceptor = 2; /// Монетоприемник.
const uchar Payout = 3; /// Хоппер.
const uchar Hopper = 3; /// Хоппер.
const uchar Hopper2 = 6; /// Тоже хоппер.
const uchar BillAcceptor = 40; /// Купюроприемник.
const uchar CardReader = 50; /// Кардридер.
}

const QStringList ProtocolTypes = QStringList()
<< CHardware::CashAcceptor::CCTalkTypes::CRC8
<< CHardware::CashAcceptor::CCTalkTypes::CRC16;
// << CHardware::CashAcceptor::CCTalkTypes::CRC16Encrypted;
<< CHardware::CashDevice::CCTalkTypes::CRC8
<< CHardware::CashDevice::CCTalkTypes::CRC16;
// << CHardware::CashDevice::CCTalkTypes::CRC16Encrypted;
}

//--------------------------------------------------------------------------------

+ 1
- 0
3.0/src/includes/Hardware/CashDevices/CCTalkDeviceBase.h View File

@@ -0,0 +1 @@
#include "../../../modules/Hardware/CashDevices/src/CCTalk/CCTalkDeviceBase.h"

3.0/src/modules/Hardware/Acceptors/src/CCTalk/CCTalkAcceptorConstants.h → 3.0/src/includes/Hardware/CashDevices/CCTalkDeviceConstants.h View File

@@ -9,11 +9,10 @@

// Modules
#include "Hardware/Common/Specifications.h"
#include "Hardware/Common/WaitingData.h"

// Project
#include "Hardware/CashAcceptors/CashAcceptorStatusCodes.h"
#include "Hardware/Acceptors/CCTalkData.h"
#include "Hardware/CashDevices/CCTalkData.h"

//--------------------------------------------------------------------------------
namespace CCCTalk
@@ -21,22 +20,17 @@ namespace CCCTalk
/// ACK.
const char ACK = '\x00';

/// Маска для сортировщика по умолчанию (использовать предустановленные настройки).
const char DefaultSorterMask = '\xFF';

/// Пауза перед идентификацией.
const int IdentificationPause = 100;

/// Количество номиналов.
const int NominalCount = 16;

class CDeviceTypeIds : public CDescription<char>
{
public:
CDeviceTypeIds()
{
append(Address::CoinAcceptor, "coinacceptor");
append(Address::Payout, "");
append(Address::Hopper, "payout");
append(Address::Hopper2, "payout");
append(Address::BillAcceptor, "billvalidator");
append(Address::CardReader, "");
}
@@ -48,25 +42,20 @@ namespace CCCTalk
namespace Command
{
/// Общие.
namespace Core
{
const uchar SimplePoll = 254;
const uchar VendorID = 246;
const uchar DeviceTypeID = 245;
const uchar ModelName = 244;
const uchar BuildCode = 192;
}
const uchar SimplePoll = 254;
const uchar VendorID = 246;
const uchar DeviceTypeID = 245;
const uchar ProductCode = 244;
const uchar BuildCode = 192;

/// Общие +.
namespace CorePlus
{
const uchar Serial = 242;
const uchar SoftVersion = 241;
const uchar ProtocolID = 4;
const uchar Reset = 1;
}
const uchar Serial = 242;
const uchar SoftVersion = 241;
const uchar ProtocolID = 4;
const uchar Reset = 1;

const uchar Status = 248;
const uchar GetVariables = 247;
const uchar DBVersion = 243;
const uchar TestCoils = 240;
const uchar SelfCheck = 232;
@@ -78,6 +67,11 @@ namespace CCCTalk
const uchar GetCoinID = 184;
const uchar SetSecurity = 181;
const uchar BaseYear = 170;
const uchar Dispense = 167;
const uchar GetHopperStatus = 166;
const uchar SetVariables = 165;
const uchar EnableHopper = 164;
const uchar TestHopper = 163;
const uchar ModifyInhibitsAndRegesters = 162;
const uchar GetBufferedBillStatuses = 159;
const uchar GetBillID = 157;
@@ -112,18 +106,19 @@ namespace CCCTalk
public:
CDescriptions()
{
append(Core::SimplePoll, EAnswerType::ACK, "perform simple poll");
append(Core::VendorID, EAnswerType::ASCII, "get vendor ID");
append(Core::DeviceTypeID, EAnswerType::ASCII, "get device type ID");
append(Core::ModelName, EAnswerType::ASCII, "get model name");
append(Core::BuildCode, EAnswerType::ASCII, "get build code");
append(SimplePoll, EAnswerType::ACK, "perform simple poll");
append(VendorID, EAnswerType::ASCII, "get vendor ID");
append(DeviceTypeID, EAnswerType::ASCII, "get device type ID");
append(ProductCode, EAnswerType::ASCII, "get product code");
append(BuildCode, EAnswerType::ASCII, "get build code");

append(CorePlus::Serial, EAnswerType::Data, "get serial number", 3);
append(CorePlus::SoftVersion, EAnswerType::ASCII, "get soft version");
append(CorePlus::ProtocolID, EAnswerType::Data, "get protocol ID", 3);
append(CorePlus::Reset, EAnswerType::ACK, "perform reset");
append(Serial, EAnswerType::Data, "get serial number", 3);
append(SoftVersion, EAnswerType::ASCII, "get soft version");
append(ProtocolID, EAnswerType::Data, "get protocol ID", 3);
append(Reset, EAnswerType::ACK, "perform reset");

append(Status, EAnswerType::Data, "get generic status", 1);
append(GetVariables, EAnswerType::Data, "get variables", 4);
append(DBVersion, EAnswerType::Data, "get DB version", 1);
append(TestCoils, EAnswerType::ACK, "test coils");
append(SelfCheck, EAnswerType::Data, "perform selfcheck", 1);
@@ -135,6 +130,11 @@ namespace CCCTalk
append(GetCoinID, EAnswerType::Data, "get coin nominal data", 6);
append(SetSecurity, EAnswerType::ACK, "set security level");
append(BaseYear, EAnswerType::Data, "get a year, which is the base for other dates", 4);
append(Dispense, EAnswerType::Data, "dispense hopper coins", 1);
append(GetHopperStatus, EAnswerType::Data, "get hopper status", 4);
append(SetVariables, EAnswerType::ACK, "set variables");
append(EnableHopper, EAnswerType::ACK, "enable/disable hopper");
append(TestHopper, EAnswerType::Data, "test hopper", 1);
append(ModifyInhibitsAndRegesters, EAnswerType::ACK, "modify inhibits and override registers for sequence of coins");
append(GetBufferedBillStatuses, EAnswerType::Data, "get buffered bill statuses", 1);
append(GetBillID, EAnswerType::Data, "get bill nominal data", 7);
@@ -187,10 +187,6 @@ namespace CCCTalk
}
};

/// Фиктивныe девайс-коды устройства, для функционала, связанного с повтором таких статус-кодов
const uchar EscrowDeviceCode = 200;
const uchar StackedDeviceCode = 201;

//--------------------------------------------------------------------------------
/// Неисправности.
struct SFault

+ 1
- 0
3.0/src/includes/Hardware/CashDevices/CCTalkModelData.h View File

@@ -0,0 +1 @@
#include "../../../modules/Hardware/CashDevices/src/CCTalk/CCTalkModelData.h"

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

@@ -1,42 +1 @@
/* @file Базовый класс монетоприемников. */

#pragma once

#include "Hardware/CashAcceptors/PortCashAcceptor.h"

//--------------------------------------------------------------------------------
namespace CCoinAcceptor
{
/// Таймаут отсылки сигнала об отключении монетника, [мс].
const int DisablingTimeout = 600;
}

//--------------------------------------------------------------------------------
class CoinAcceptorBase : public TSerialCashAcceptor
{
SET_DEVICE_TYPE(CoinAcceptor)

public:
CoinAcceptorBase()
{
mDeviceType = CHardware::Types::CoinAcceptor;
setConfigParameter(CHardware::CashAcceptor::DisablingTimeout, CCoinAcceptor::DisablingTimeout);
setConfigParameter(CHardware::CashAcceptor::StackedFilter, true);
}

/// Принять купюру.
virtual bool stack()
{
// у монетоприемника нет стека
return true;
}

/// Вернуть купюру. Правильный термин - return (ключевое слово).
virtual bool reject()
{
// у монетоприемника нет режекта
return true;
}
};

//--------------------------------------------------------------------------------
#include "../../../modules/Hardware/CoinAcceptors/src/CoinAcceptorBase.h"

+ 1
- 0
3.0/src/includes/Hardware/Common/CommandResults.h View File

@@ -29,6 +29,7 @@ namespace CommandResult

typedef QSet<int> TResults;
const TResults ProtocolErrors = TResults() << Port << Transport << Protocol << Driver << NoAnswer << Id << CRC;
const TResults PresenceErrors = TResults() << OK << Id << CRC << Answer << Device; // Устройство присутствует.
}

#define CORRECT(aResult) !CommandResult::ProtocolErrors.contains(aResult)


+ 38
- 0
3.0/src/includes/Hardware/Common/ConfigCleaner.h View File

@@ -0,0 +1,38 @@
/* @file Config сleaner */

#pragma once

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

// Project
#include "DeviceConfigManager.h"

//---------------------------------------------------------------------------
class ConfigCleaner
{
public:
ConfigCleaner(DeviceConfigManager * aConfigManager, const QStringList & aKeys) : mPerformer(aConfigManager), mKeys(aKeys) {}

~ConfigCleaner()
{
if (mPerformer)
{
foreach (const QString & key, mKeys)
{
mPerformer->removeConfigParameter(key);
}
}
}

private:
/// Класс-владелец конфига.
DeviceConfigManager * mPerformer;

/// Список ключей конфига для удаления данных.
QStringList mKeys;
};

//--------------------------------------------------------------------------------

+ 29
- 0
3.0/src/includes/Hardware/Common/ContainerProxy.h View File

@@ -0,0 +1,29 @@
/* @file Прокси-класс для использования константы контейнера в виде класса для статитических вызовов. */

#pragma once

//---------------------------------------------------------------------------
template<class T>
class ContainerProxy: public T
{
public:
ContainerProxy() {}
ContainerProxy(const T & aOther)
{
operator = (aOther);
}

const T & operator= (const T & aOther)
{
this->append(aOther);

return *this;
}

T & data()
{
return * dynamic_cast<T *>(this);
}
};

//---------------------------------------------------------------------------

+ 5
- 5
3.0/src/includes/Hardware/Common/DataPointer.h View File

@@ -7,21 +7,21 @@ template <class T>
struct SPData
{
public:
SPData<T>() : mData(nullptr) {}
SPData<T>() : mData(0) {}

operator T * ()
operator T ()
{
return mData;
}

SPData<T> & operator = (T * aResult)
SPData<T> & operator = (T aResult)
{
mData = aResult;

return *this;
}

T ** operator & ()
T * operator & ()
{
return &mData;
}
@@ -32,7 +32,7 @@ public:
}

private:
T * mData;
T mData;
};

//--------------------------------------------------------------------------------

+ 6
- 0
3.0/src/includes/Hardware/Common/DeviceDataConstants.h View File

@@ -27,6 +27,7 @@ namespace CDeviceData
const char Date[] = "date";
const char FirmwareUpdatable[] = "firmware_updatable";
const char ProjectNumber[] = "project_number";
const char ProductCode[] = "product_code";
const char Vendor[] = "vendor";
const char ProtocolVersion[] = "protocol_version";
const char SDCard[] = "sd_card";
@@ -38,6 +39,7 @@ namespace CDeviceData
const char InternalHardware[] = "device_id_value";
const char ControllerBuild[] = "controller_build";
const char Count[] = "count";
const char Number[] = "number";

/// Общие значения.
namespace Values
@@ -244,6 +246,10 @@ namespace CDeviceData
const char ValidityData[] = "fs_validity_data";
const char DifferenceDT[] = "fs_difference_date_time";
const char Version[] = "fs_version";
const char Expiration[] = "fs_expiration";
const char FFD[] = "fs_ffd";
const char Provider[] = "fs_provider";
const char Revision[] = "fs_revision";
}

/// Сторожевые таймеры.


+ 21
- 0
3.0/src/includes/Hardware/Common/DeviceModelDataTypes.h View File

@@ -0,0 +1,21 @@
/* @file Типы данных моделей устройств. */

#pragma once

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

//--------------------------------------------------------------------------------
/// Данные устройства.
struct SModelDataBase
{
QString model;
bool verified;

SModelDataBase(): verified(false) {}
SModelDataBase(const QString & aModel, bool aVerified): model(aModel), verified(aVerified) {}
};

//--------------------------------------------------------------------------------

+ 13
- 8
3.0/src/includes/Hardware/Common/HardwareConstants.h View File

@@ -61,6 +61,7 @@ namespace CHardware
const char OpeningTimeout[] = "opening_timeout";
const char OpeningContext[] = "port_opening_context";
const char Suspended[] = "suspended";
const char JustConnected[] = "just_connected";

/// Константы COM-порта.
namespace COM
@@ -91,6 +92,18 @@ namespace CHardware
const char Track3[] = "track3";
}

/// Константы устройства работы с деньгами.
namespace CashDevice
{
/// Типы протокола CCTalk.
namespace CCTalkTypes
{
const char CRC8[] = "CRC8";
const char CRC16[] = "CRC16";
const char CRC16Encrypted[] = "CRC16 Encrypted";
}
}

/// Константы устройства приема денег.
namespace CashAcceptor
{
@@ -103,14 +116,6 @@ namespace CHardware
const char ProcessEnabling[] = "process_enabling";
const char ProcessDisabling[] = "process_disabling";
const char StackedFilter[] = "stacked_filter";

/// Типы протокола CCTalk.
namespace CCTalkTypes
{
const char CRC8[] = "CRC8";
const char CRC16[] = "CRC16";
const char CRC16Encrypted[] = "CRC16 Encrypted";
}
}

/// Константы виртуального устройства приема денег.


+ 1
- 0
3.0/src/includes/Hardware/Common/LibUSBDeviceBase.h View File

@@ -0,0 +1 @@
#include "../../../modules/Hardware/Common/src/Port/LibUSB/LibUSBDeviceBase.h"

+ 44
- 13
3.0/src/includes/Hardware/Common/Specifications.h View File

@@ -10,35 +10,64 @@
#include <Common/QtHeadersEnd.h>

//--------------------------------------------------------------------------------
// базовый класс для хранения данных в виде пар ключ-значение
// Базовый класс для хранения данных в виде пар ключ-значение
template <class T1, class T2>
class CSpecification
{
public:
CSpecification(const T2 & aDefault = T2()) : mDefaultValue(aDefault) {}
const T2 operator[](const T1 & aKey) const {return value(aKey);}
T1 key(const T2 & aValue) {return mBuffer.key(aValue);}
virtual T2 value(const T1 & aKey) const {return mBuffer.value(aKey, mDefaultValue);}
void append(const T1 & aKey, const T2 & aParameter) {mBuffer.insert(aKey, aParameter);}
QMap<T1, T2> & data() {return mBuffer;}
void setDefault(const T2 & aDefaultValue) {mDefaultValue = aDefaultValue;}
T2 getDefault() {return mDefaultValue;}
const T2 operator[](const T1 & aKey) const { return value(aKey); }
T1 key(const T2 & aValue) { return mBuffer.key(aValue); }
virtual T2 value(const T1 & aKey) const { return mBuffer.value(aKey, mDefaultValue); }
void append(const T1 & aKey, const T2 & aParameter) { mBuffer.insert(aKey, aParameter); }
QMap<T1, T2> & data() { return mBuffer; }
QMap<T1, T2> constData() const { return mBuffer; }
void setDefault(const T2 & aDefaultValue) { mDefaultValue = aDefaultValue; }
T2 getDefault() { return mDefaultValue; }

protected:
QMap<T1, T2> mBuffer;
T2 mDefaultValue;
};

// класс для хранения произвольных описателей данных
//--------------------------------------------------------------------------------
// Класс для хранения произвольных описателей данных
template <class T>
class CDescription : public CSpecification<T, QString>
{
public:
void append(const T & aKey, const char * aParameter) {mBuffer.insert(aKey, QString::fromUtf8(aParameter));}
void append(const T & aKey, const QString & aParameter) {mBuffer.insert(aKey, aParameter);}
void append(const T & aKey, const char * aParameter) { mBuffer.insert(aKey, QString::fromUtf8(aParameter)); }
void append(const T & aKey, const QString & aParameter) { mBuffer.insert(aKey, aParameter); }
void setDefault(const char * aDefaultValue) { mDefaultValue = QString::fromUtf8(aDefaultValue); }
};

//--------------------------------------------------------------------------------
// Базовый класс для хранения данных в виде пар ключ-значение со статическим заполнением.
// При использовании для хранения статических сущностей следить за временем их создания.
template <class T1, class T2>
class CStaticSpecification : public CSpecification<T1, T2>
{
public:
CStaticSpecification()
{
mBuffer = process(T1(), T2(), true);
}

static QMap<T1, T2> & process(const T1 & aKey, const T2 aValue, bool aControl = false)
{
static QMap<T1, T2> data;

if (!aControl)
{
data.insert(aKey, aValue);
}

return data;
}
};

// класс для хранения произвольных описателей данных в виде битовой маски
//--------------------------------------------------------------------------------
// Класс для хранения произвольных описателей данных в виде битовой маски
template <class T>
class CBitmapDescription : public CDescription<T>
{
@@ -65,10 +94,12 @@ protected:
}
};

//--------------------------------------------------------------------------------
#define APPEND(aKey) append(aKey, #aKey)
#define ADD(aKey) add(aKey, #aKey)

// базовый класс для хранения данных в виде пар ключ-значение со статическим заполнением данных
//--------------------------------------------------------------------------------
// Базовый класс для хранения данных в виде пар ключ-значение со статическим заполнением данных
template <class T1, class T2>
class CSSpecification: public CSpecification<T1, T2>
{


+ 1
- 54
3.0/src/includes/Hardware/Common/USBDeviceModelData.h View File

@@ -1,54 +1 @@
/* @file Спецификация данных моделей USB-устройств для автопоиска. */

#pragma once

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

// Modules
#include "Hardware/Common/Specifications.h"

//--------------------------------------------------------------------------------
namespace CUSBDevice
{
/// Данные устройства.
struct SData
{
QString model;
bool verified;

SData(): verified(false) {}
SData(const QString & aModel, bool aVerified): model(aModel), verified(aVerified) {}
};

/// данные моделей по PID-ам.
class CData : public CSpecification<quint16, SData>
{
public:
void add(quint16 aPID, const QString & aModel, bool aVerified = false)
{
append(aPID, SData(aModel, aVerified));
}

void setDefaultModel(const QString & aModel)
{
setDefault(SData(aModel, false));
}
};

/// Данные моделей по VID-ам.
class CDetectingData : public CSpecification<quint16, CData>
{
public:
void add(quint16 aVID, quint16 aPID, const QString & aModel, bool aVerified = false)
{
data()[aVID].append(aPID, SData(aModel, aVerified));
}
};

typedef QSharedPointer<CDetectingData> PDetectingData;
}

//--------------------------------------------------------------------------------
#include "../../../modules/Hardware/Common/src/Port/USB/USBDeviceModelData.h"

+ 41
- 0
3.0/src/includes/Hardware/Common/USBDeviceModelDataTypes.h View File

@@ -0,0 +1,41 @@
/* @file Типы данных моделей USB-устройств. */

#pragma once

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

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

//--------------------------------------------------------------------------------
namespace CUSBDevice
{
typedef SModelDataBase SProductData;
typedef QMap<quint16, SProductData> TProductData;

//--------------------------------------------------------------------------------
struct SDetectingData
{
QString vendor;
quint16 PID;
QString model;

SDetectingData(): PID(0) {}
SDetectingData(const QString & aVendor, quint16 aPID, const QString & aModel): vendor(aVendor), PID(aPID), model(aModel) {}

QString getModel() const
{
return vendor + " " + model;
}
};

/// Вызывается из статического функционала. Если будет константа - на момент вызова она не будет создана.
#define DECLARE_USB_MODEL(aVar, aVendor, aPID, aName) struct aVar: public CUSBDevice::SDetectingData \
{ aVar() : CUSBDevice::SDetectingData(CUSBVendors::aVendor, aPID, aName) {} };
}

//--------------------------------------------------------------------------------

+ 22
- 0
3.0/src/includes/Hardware/Common/USBDeviceVendors.h View File

@@ -0,0 +1,22 @@
/* @file Спецификация производителей USB-устройств. */

#pragma once

#include "Hardware/Common/Specifications.h"

//--------------------------------------------------------------------------------
namespace CUSBVendors
{
class Data : public CStaticSpecification<QString, quint16> {};

#define ADD_USB_VENDOR(aName, aVID) const char aName[] = #aName; namespace VID { const quint16 aName = CUSBVendors::Data::process(#aName, aVID).value(#aName); }

ADD_USB_VENDOR(ACS, 0x072F); // Advanced Card Systems Ltd.
ADD_USB_VENDOR(HHP, 0x0536); // Hand Held Products, Inc
ADD_USB_VENDOR(Creator, 0x23d8);
ADD_USB_VENDOR(Custom, 0x0dd4);
ADD_USB_VENDOR(Citizen1, 0x1d90);
ADD_USB_VENDOR(Citizen2, 0x2730);
}

//--------------------------------------------------------------------------------

+ 7
- 0
3.0/src/includes/Hardware/Dispensers/DispenserStatusCodes.h View File

@@ -7,6 +7,13 @@
//--------------------------------------------------------------------------------
namespace DispenserStatusCode
{
/// OK.
namespace OK
{
const int SingleMode = 800; /// Выдача по 1 монете.
const int Locked = 801; /// Аппарата заблокирован, ждет ввода PIN-кода.
}

/// Предупреждения.
namespace Warning
{


+ 3
- 0
3.0/src/includes/Hardware/Dispensers/DispenserStatusesDescriptions.h View File

@@ -13,6 +13,9 @@ namespace DispenserStatusCode
public:
CSpecifications()
{
ADD_OK_STATUS(SingleMode, "");
ADD_OK_STATUS(Locked, "");

/// Предупреждения.
ADD_WARNING_STATUS(Unit0NearEmpty, QCoreApplication::translate("DispenserStatuses", "#unit_0_near_empty"));
ADD_WARNING_STATUS(Unit1NearEmpty, QCoreApplication::translate("DispenserStatuses", "#unit_1_near_empty"));


+ 21
- 0
3.0/src/includes/Hardware/Dispensers/PortDispenser.h View File

@@ -0,0 +1,21 @@
/* @file Диспенсер на порту. */

#pragma once

// Project
#include "Hardware/Dispensers/SerialDispenser.h"

//--------------------------------------------------------------------------------
class PortDispenser : public TSerialDispenser
{
public:
PortDispenser()
{
mIOMessageLogging = ELoggingType::None;
mMaxBadAnswers = 2;
mPollingInterval = CDispensers::IdlingPollingInterval;
mForceNotWaitFirst = true;
}
};

//--------------------------------------------------------------------------------

+ 1
- 1
3.0/src/includes/Hardware/Dispensers/ProtoDispenser.h View File

@@ -30,7 +30,7 @@ signals:

protected slots:
/// Применить конфигурацию кассет.
virtual void applyCashList() {};
virtual void applyUnitList() {};

/// Выдать.
virtual void dispense(int /*aUnit*/, int /*aItems*/) {};


+ 8
- 0
3.0/src/includes/Hardware/Dispensers/SerialDispenser.h View File

@@ -0,0 +1,8 @@
#include "Hardware/Common/PortPollingDeviceBase.h"
#include "Hardware/Common/SerialDeviceBase.h"
#include "DispenserBase.h"

//--------------------------------------------------------------------------------
typedef DispenserBase<SerialDeviceBase<PortPollingDeviceBase<ProtoDispenser>>> TSerialDispenser;

//--------------------------------------------------------------------------------

+ 80
- 0
3.0/src/includes/Hardware/FR/FFDataTypes.h View File

@@ -0,0 +1,80 @@
/* @file Типы данных для движка фискальных тегов. */

#pragma once

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

//---------------------------------------------------------------------------
namespace CFR { namespace FiscalFields
{
// Типы данных.
namespace ETypes
{
enum Enum
{
None = 0,
String,
Byte,
ByteArray,
UnixTime,
VLN,
FVLN,
STLV,
UINT32,
UINT16
};
};

// Описатель типов данных.
namespace Types
{
struct SData
{
int minSize;
bool fixSize;
QString description;

SData(): minSize(0), fixSize(false) {}
SData(int aMinSize, const QString & aDescription, bool aFixSize = false): minSize(aMinSize), fixSize(aFixSize), description(aDescription) {}
};
}

//---------------------------------------------------------------------------
// Обязательность параметра
namespace ERequired
{
enum Enum
{
No = 0,
PM,
Yes
};
}

//---------------------------------------------------------------------------
// Структура описателя.
struct SData
{
ETypes::Enum type;
QString textKey;
QString translationPF;
ERequired::Enum required;
bool isMoney;

SData(): type(ETypes::None), required(ERequired::No), isMoney(false) {}
SData(ETypes::Enum aType, const QString & aTextKey, ERequired::Enum aRequired):
type(aType), textKey(aTextKey), translationPF(""), required(aRequired), isMoney(false) {}
SData(ETypes::Enum aType, const QString & aTextKey, const QString & aTranslationPF = ""):
type(aType), textKey(aTextKey), translationPF(aTranslationPF), required(ERequired::No), isMoney(false) {}
SData(ETypes::Enum aType, const QString & aTextKey, const QString & aTranslationPF, bool aIsMoney):
type(aType), textKey(aTextKey), translationPF(aTranslationPF), required(ERequired::No), isMoney(aIsMoney) {}
SData(ETypes::Enum aType, const QString & aTextKey, const QString & aTranslationPF, ERequired::Enum aRequired):
type(aType), textKey(aTextKey), translationPF(aTranslationPF), required(aRequired), isMoney(false) {}
};

}} // namespace CFR::FiscalFields

//---------------------------------------------------------------------------

+ 47
- 82
3.0/src/includes/Hardware/FR/FRBaseConstants.h View File

@@ -23,54 +23,7 @@
// Project
#include "Hardware/FR/FRStatusesDescriptions.h"
#include "Hardware/FR/FiscalFieldDescriptions.h"

//--------------------------------------------------------------------------------
/// Режим работы ФР
namespace EFRMode
{
enum Enum
{
Fiscal,
Printer
};
}

//--------------------------------------------------------------------------------
/// Регион (для налоговых ставок).
namespace ERegion
{
enum Enum
{
RF,
KZ
};
}

//--------------------------------------------------------------------------------
/// Типы ФР.
namespace EFRType
{
enum Enum
{
EKLZ, // Старый ФР с ЭКЛЗ
NoEKLZ, // Старый ФР без ЭКЛЗ (для ЕНВД)
FS // Онлайновый ФР с ФН
};
}

//--------------------------------------------------------------------------------
/// Форматы ФФД.
namespace EFFD
{
enum Enum
{
Unknown = -1, // Неизвестная
F10Beta, // 1.0 Beta
F10, // 1.0
F105, // 1.05
F11 // 1.1
};
}
#include "Hardware/FR/FRDataTypes.h"

//--------------------------------------------------------------------------------
/// Общие константы ФР.
@@ -103,12 +56,15 @@ namespace CFR
/// Количество миллисекунд в сутках.
const int MSecsInDay = SecsInDay * 1000;

/// Признак способа расчета по умолчанию для платежей (тег 1214) (не интернет-магазинов) - Полный расчет.
const SDK::Driver::EPayOffSubjectMethodTypes::Enum PayOffSubjectMethodType = SDK::Driver::EPayOffSubjectMethodTypes::Full;

/// Дата и время одноразового закрытия смены перед применением НДС 20% в 2019 году.
const QDateTime ClosingSessionDTVAT20 = QDateTime(QDate(2018, 12, 31), QTime(23, 57));

/// Формальная дата окончания ФН.
inline QString FSValidityDateOff(const QDate & aDate) { return aDate.addDays(-3).toString(CFR::DateLogFormat); }

/// Срок годности обычной (на 13 месяцев) ФН в днях - так фактически, у всех производителей.
const int SimpleFSValidityDays = 410;

/// Результаты запроса статуса.
namespace Result
{
@@ -347,14 +303,37 @@ namespace CFR
{
using namespace SDK::Driver::EPayOffSubjectTypes;

append(Unit, "ТОВАР");
append(Payment, "ПЛАТЕЖ");
append(AgentFee, "АГЕНТСКОЕ ВОЗНАГРАЖДЕНИЕ");
append(Unit, "ТОВАР");
append(ExciseUnit, "ПОДАКЦИЗНЫЙ ТОВАР");
append(Job, "РАБОТА");
append(Service, "УСЛУГА");
append(GamblingBet, "СТАВКА АЗАРТНОЙ ИГРЫ");
append(GamblingWin, "ВЫИГРЫШ АЗАРТНОЙ ИГРЫ");
append(LotteryTicket, "ЛОТЕРЕЙНЫЙ БИЛЕТ");
append(LotteryWin, "ВЫИГРЫШ ЛОТЕРЕИ");
append(RIARightsProvision, "ПРЕДОСТАВЛЕНИЕ РИД");
append(Payment, "ПЛАТЕЖ");
append(AgentFee, "АГЕНТСКОЕ ВОЗНАГРАЖДЕНИЕ");
append(Composite, "СОСТАВНОЙ ПРЕДМЕТ РАСЧЕТА");
append(Other, "ИНОЙ ПРЕДМЕТ РАСЧЕТА");
append(PropertyRight, "ИМУЩЕСТВЕННОЕ ПРАВО");
append(NonSalesIncome, "ВНЕРЕАЛИЗАЦИОННЫЙ ДОХОД");
append(InsuranceСontribution, "СТРАХОВЫЕ ВЗНОСЫ");
append(TradeTax, "ТОРГОВЫЙ СБОР");
append(ResortTax, "КУРОРТНЫЙ СБОР");
append(Deposit, "ЗАЛОГ");
}
};

static CPayOffSubjectTypes PayOffSubjectTypes;

typedef QSet<SDK::Driver::EPayOffSubjectTypes::Enum> TPayOffSubjectTypes;

/// Признаки предмета расчета, работа с которыми невозможна с ФН 36 месяцев и СНО == ОСН.
const TPayOffSubjectTypes PayOffSubjectTypesNo36 = TPayOffSubjectTypes()
<< SDK::Driver::EPayOffSubjectTypes::Unit
<< SDK::Driver::EPayOffSubjectTypes::AgentFee;

//--------------------------------------------------------------------------------
/// Типы систем налогообложения (1062, 1055)
class CTaxSystems : public CBitmapDescription<char>
@@ -448,6 +427,20 @@ namespace CFR
static CPayOffTypes PayOffTypes;

//--------------------------------------------------------------------------------
/// Операция платежного агента (1044).
namespace AgentOperation
{
const char Payment[] = "Платеж";
const char Payout[] = "Выдача наличных";
}

/// Банковский платежный агент?
inline bool isBankAgent(SDK::Driver::EAgentFlags::Enum aAgentFlag) { return (aAgentFlag == SDK::Driver::EAgentFlags::BankAgent) || (aAgentFlag == SDK::Driver::EAgentFlags::BankSubagent); }

/// Обыкновенный платежный агент?
inline bool isPaymentAgent(SDK::Driver::EAgentFlags::Enum aAgentFlag) { return (aAgentFlag == SDK::Driver::EAgentFlags::PaymentAgent) || (aAgentFlag == SDK::Driver::EAgentFlags::PaymentSubagent); }

//--------------------------------------------------------------------------------
/// Ставка НДС (1199).
class CVATRates: public CDescription<char>
{
@@ -515,34 +508,6 @@ namespace CFR
static COperationModeData OperationModeData;

//---------------------------------------------------------------------------
class ConfigCleaner
{
public:
ConfigCleaner(DeviceConfigManager * aConfigManager) : mPerformer(aConfigManager) {}

~ConfigCleaner()
{
if (mPerformer)
{
QStringList fieldNames = QStringList()
<< CFiscalSDK::Cashier
<< CFiscalSDK::CashierINN
<< CFiscalSDK::UserContact
<< CFiscalSDK::TaxSystem
<< CFiscalSDK::AgentFlag;

foreach (const QString & fieldName, fieldNames)
{
mPerformer->removeConfigParameter(fieldName);
}
}
}

private:
DeviceConfigManager * mPerformer;
};

//---------------------------------------------------------------------------
class DealerDataManager
{
public:


+ 53
- 0
3.0/src/includes/Hardware/FR/FRDataTypes.h View File

@@ -0,0 +1,53 @@
/* @file Основные типы данных, используемых в ФР. */

#pragma once

//--------------------------------------------------------------------------------
/// Режим работы ФР
namespace EFRMode
{
enum Enum
{
Fiscal,
Printer
};
}

//--------------------------------------------------------------------------------
/// Регион (для налоговых ставок).
namespace ERegion
{
enum Enum
{
RF,
KZ
};
}

//--------------------------------------------------------------------------------
/// Типы ФР.
namespace EFRType
{
enum Enum
{
EKLZ, // Старый ФР с ЭКЛЗ
NoEKLZ, // Старый ФР без ЭКЛЗ (для ЕНВД)
FS // Онлайновый ФР с ФН
};
}

//--------------------------------------------------------------------------------
/// Форматы ФФД.
namespace EFFD
{
enum Enum
{
Unknown = -1, // Неизвестная
F10Beta, // 1.0 Beta
F10, // 1.0
F105, // 1.05
F11 // 1.1
};
}

//--------------------------------------------------------------------------------

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

@@ -0,0 +1 @@
#include "../../../modules/Hardware/FR/src/Base/FSSerialData.h"

+ 1
- 299
3.0/src/includes/Hardware/FR/FiscalFieldDescriptions.h View File

@@ -1,299 +1 @@
/* @file Описатель фискальных реквизитов, используется в драйверах). */

// Qt
#include <Common/QtHeadersBegin.h>
#include <QtCore/QCoreApplication>
#include <QtCore/QDate>
#include <Common/QtHeadersEnd.h>

// SDK
#include <SDK/Drivers/FR/FiscalFields.h>

// Modules
#include "Hardware/Common/Specifications.h"

#pragma once

//---------------------------------------------------------------------------
namespace CFR
{
/// Сменилась ли ставка НДС с 18% на 20% в РФ.
inline bool isRFVAT20() { return QDate::currentDate() >= QDate(2019, 1, 1); }
}

//---------------------------------------------------------------------------
namespace CFR { namespace FiscalFields
{
// Типы данных.
namespace ETypes
{
enum Enum
{
None = 0,
String,
Byte,
ByteArray,
UnixTime,
VLN,
FVLN,
STLV,
UINT32,
UINT16
};
};

namespace Types
{
struct SData
{
int minSize;
bool fixSize;
QString description;

SData(): minSize(0), fixSize(false) {}
SData(int aMinSize, const QString & aDescription, bool aFixSize = false): minSize(aMinSize), fixSize(aFixSize), description(aDescription) {}
};

#define ADD_FISCAL_TYPE(aType, aMinSize, ...) append(ETypes::aType, SData(aMinSize, #aType, __VA_ARGS__))

class CData: public CSpecification<ETypes::Enum, SData>
{
public:
CData()
{
ADD_FISCAL_TYPE(String, 0);
ADD_FISCAL_TYPE(Byte, 1, true);
ADD_FISCAL_TYPE(ByteArray, 1);
ADD_FISCAL_TYPE(UnixTime, 4, true);
ADD_FISCAL_TYPE(VLN, 1);
ADD_FISCAL_TYPE(FVLN, 2);
ADD_FISCAL_TYPE(STLV, 5);
ADD_FISCAL_TYPE(UINT32, 4, true);
ADD_FISCAL_TYPE(UINT16, 2, true);
}
};

static CData Data;
}

//---------------------------------------------------------------------------
// Обязательность параметра
namespace ERequired
{
enum Enum
{
No = 0,
PM,
Yes
};
}

//---------------------------------------------------------------------------
// Структура описателя.
struct SData
{
ETypes::Enum type;
QString textKey;
QString translationPF;
ERequired::Enum required;
bool isMoney;

SData(): type(ETypes::None), required(ERequired::No), isMoney(false) {}
SData(ETypes::Enum aType, const QString & aTextKey, const QString & aTranslationPF = "", bool aIsMoney = false):
type(aType), textKey(aTextKey), translationPF(aTranslationPF), required(ERequired::No), isMoney(aIsMoney) {}
};

/// Список фискальных тегов.
typedef QList<int> TFields;

typedef QMap<int, SData> TData;
typedef QMap<int, QString> TDescriptionData;
typedef QPair<TData, TDescriptionData> TAllData;

//---------------------------------------------------------------------------
class Data: public CSpecification<int, SData>
{
public:
Data()
{
TAllData allData = process(0);
mBuffer = allData.first;
mDescriptionData = allData.second;

for (auto it = mBuffer.begin(); it != mBuffer.end(); ++it)
{
it->translationPF = QCoreApplication::translate("FiscalFields", it->translationPF.toLatin1());
}

foreach(int field, mBuffer.keys())
{
checkRFVAT20(field);
}
}

static TAllData process(int aField, const SData & aData = SData())
{
static TData data;
static TDescriptionData descriptionData;

if (!aField)
{
return TAllData(data, descriptionData);
}

data.insert(aField, aData);
descriptionData.insert(aField, aData.textKey);

return TAllData();
}

int getKey(const QString & aTextKey) const { return mDescriptionData.values().contains(aTextKey) ? mDescriptionData.key(aTextKey) : 0; }
QString getTextLog(int aField) const { return QString("fiscal field %1 (%2)").arg(aField).arg(value(aField).textKey.replace("_", " ")); }
QString getLogFromList(const TFields & aFields) const { QStringList data; foreach(int field, aFields) data << getTextLog(field); return data.join(", ").replace("fiscal field ", ""); }

private:
inline void checkRFVAT20(int aField);
QMap<int, QString> mDescriptionData;
};

#define ADD_FISCAL_FIELD(aField, aName, aType, ...) const int aName = [] () -> int { CFR::FiscalFields::Data::process(aField, CFR::FiscalFields::SData(CFR::FiscalFields::ETypes::aType, CFiscalSDK::aName, __VA_ARGS__)); return aField; } ();

ADD_FISCAL_FIELD(1000, FDName, String, QCoreApplication::translate("FiscalFields", "#fd_name")); // 1000 (Наименование фискального документа).
ADD_FISCAL_FIELD(1008, UserContact, String, QCoreApplication::translate("FiscalFields", "#user_contact")); // 1008 (Телефон или электронный адрес покупателя).
ADD_FISCAL_FIELD(1009, PayOffAddress, String); // 1009 (Адрес расчетов).
ADD_FISCAL_FIELD(1012, FDDateTime, UnixTime); // 1012 (Дата и время ФД).
ADD_FISCAL_FIELD(1013, SerialFRNumber, String, QCoreApplication::translate("FiscalFields", "#serial_fr_number")); // 1013 (Заводской номер ФР).
ADD_FISCAL_FIELD(1017, OFDINN, String, QCoreApplication::translate("FiscalFields", "#ofd_inn")); // 1017 (ИНН ОФД).
ADD_FISCAL_FIELD(1018, INN, String, QCoreApplication::translate("FiscalFields", "#inn")); // 1018 (ИНН пользователя).
ADD_FISCAL_FIELD(1020, PayOffAmount, VLN, QCoreApplication::translate("FiscalFields", "#payoff_amount"), true); // 1020 (Сумма расчета в чеке).
ADD_FISCAL_FIELD(1021, Cashier, String, QCoreApplication::translate("FiscalFields", "#cashier")); // 1021 (Кассир).
ADD_FISCAL_FIELD(1030, UnitName, String); // 1030 (Наименование товара).
ADD_FISCAL_FIELD(1036, AutomaticNumber, String, QCoreApplication::translate("FiscalFields", "#automatic_number")); // 1036 (Номер автомата).
ADD_FISCAL_FIELD(1037, RNM, String, QCoreApplication::translate("FiscalFields", "#rnm")); // 1037 (Регистрационный номер ККТ).
ADD_FISCAL_FIELD(1038, SessionNumber, UINT32, QCoreApplication::translate("FiscalFields", "#session_number")); // 1038 (Номер смены).
ADD_FISCAL_FIELD(1040, FDNumber, UINT32, QCoreApplication::translate("FiscalFields", "#fd_number")); // 1040 (Номер ФД).
ADD_FISCAL_FIELD(1041, SerialFSNumber, String, QCoreApplication::translate("FiscalFields", "#serial_fs_number")); // 1041 (Заводской номер ФН).
ADD_FISCAL_FIELD(1042, DocumentNumber, UINT32, QCoreApplication::translate("FiscalFields", "#document_number")); // 1042 (Номер чека за смену).
ADD_FISCAL_FIELD(1046, OFDName, String, QCoreApplication::translate("FiscalFields", "#ofd_name")); // 1046 (Наименование ОФД).
ADD_FISCAL_FIELD(1048, LegalOwner, String); // 1048 (Наименование юр. лица владельца).
ADD_FISCAL_FIELD(1054, PayOffType, Byte); // 1054 (Признак расчета).
ADD_FISCAL_FIELD(1055, TaxSystem, Byte, QCoreApplication::translate("FiscalFields", "#tax_system")); // 1055 (СНО на платеже).
ADD_FISCAL_FIELD(1060, FTSURL, String, QCoreApplication::translate("FiscalFields", "#fts_url")); // 1060 (Адрес сайта ФНС).
ADD_FISCAL_FIELD(1062, TaxSystemsReg, Byte, QCoreApplication::translate("FiscalFields", "#tax_systems_reg")); // 1062 (СНО из итогов регистрации).
ADD_FISCAL_FIELD(1074, ProcessingPhone, String, QCoreApplication::translate("FiscalFields", "#processing_phone")); // 1074 (Телефон оператора по приему платежей).
ADD_FISCAL_FIELD(1077, FDSign, ByteArray, QCoreApplication::translate("FiscalFields", "#fd_sign")); // 1077 (Фискальный признак документа).
ADD_FISCAL_FIELD(1097, OFDNotSentFDQuantity, UINT32, QCoreApplication::translate("FiscalFields", "#ofd_not_sent_fd_quantity")); // 1097 (Количество непереданных ФД).
ADD_FISCAL_FIELD(1098, OFDNotSentFDDateTime, UnixTime, QCoreApplication::translate("FiscalFields", "#ofd_not_sent_fd_date_time")); // 1098 (Дата и время первого из непереданных ФД).
ADD_FISCAL_FIELD(1101, ReregistrationCause, Byte, QCoreApplication::translate("FiscalFields", "#reregistration_cause")); // 1101 (Код причины перерегистрации).
ADD_FISCAL_FIELD(1111, FDForSessionTotal, UINT32, QCoreApplication::translate("FiscalFields", "#fd_for_session_total")); // 1111 (Общее количество ФД за смену).
ADD_FISCAL_FIELD(1117, SenderMail, String, QCoreApplication::translate("FiscalFields", "#sender_mail")); // 1117 (Электронная почта отправителя чека).
ADD_FISCAL_FIELD(1118, FiscalsForSessionTotal, UINT32, QCoreApplication::translate("FiscalFields", "#fiscals_for_session_total")); // 1118 (Количество кассовых чеков (БСО) за смену).
ADD_FISCAL_FIELD(1187, PayOffPlace, String, QCoreApplication::translate("FiscalFields", "#payoff_place")); // 1187 (Место расчетов).
ADD_FISCAL_FIELD(1188, ModelVersion, String, QCoreApplication::translate("FiscalFields", "#model_version")); // 1188 (Версия модели ККТ).
ADD_FISCAL_FIELD(1189, FFDFR, Byte, QCoreApplication::translate("FiscalFields", "#ffd_fr")); // 1189 (Версия ФФД ФР).
ADD_FISCAL_FIELD(1190, FFDFS, Byte, QCoreApplication::translate("FiscalFields", "#ffd_fs")); // 1190 (Версия ФФД ФН).
ADD_FISCAL_FIELD(1199, VATRate, Byte); // 1199 (Ставка НДС).
ADD_FISCAL_FIELD(1203, CashierINN, String, QCoreApplication::translate("FiscalFields", "#cashier_inn")); // 1203 (ИНН кассира).
ADD_FISCAL_FIELD(1208, OFDURL, String, QCoreApplication::translate("FiscalFields", "#ofd_url")); // 1208 (Адрес сайта для получения чека).
ADD_FISCAL_FIELD(1209, FFD, Byte); // 1209 (Версия ФФД).

// Данные оператора перевода
ADD_FISCAL_FIELD(1005, TransferOperatorAddress, String, QCoreApplication::translate("FiscalFields", "#transfer_operator_address")); // 1005 (Адрес оператора перевода).
ADD_FISCAL_FIELD(1016, TransferOperatorINN, String, QCoreApplication::translate("FiscalFields", "#transfer_operator_inn")); // 1016 (ИНН оператора перевода).
ADD_FISCAL_FIELD(1026, TransferOperatorName, String, QCoreApplication::translate("FiscalFields", "#transfer_operator_name")); // 1026 (Наименование оператора перевода).
ADD_FISCAL_FIELD(1075, TransferOperatorPhone, String, QCoreApplication::translate("FiscalFields", "#transfer_operator_phone")); // 1075 (Телефон оператора перевода).

// Данные поставщика
ADD_FISCAL_FIELD(1171, ProviderPhone, String, QCoreApplication::translate("FiscalFields", "#provider_phone")); // 1171 (Телефон поставщика).
ADD_FISCAL_FIELD(1226, ProviderINN, String, QCoreApplication::translate("FiscalFields", "#provider_inn")); // 1226 (ИНН поставщика).

// Данные платежного агента
ADD_FISCAL_FIELD(1044, AgentOperation, String, QCoreApplication::translate("FiscalFields", "#agent_operation")); // 1044 (Операция платежного агента).
ADD_FISCAL_FIELD(1057, AgentFlagsReg, Byte); // 1057 (Признак(и) платежного агента из итогов регистрации и на платеже).
ADD_FISCAL_FIELD(1073, AgentPhone, String, QCoreApplication::translate("FiscalFields", "#agent_phone")); // 1073 (Телефон платежного агента).
ADD_FISCAL_FIELD(1222, AgentFlag, Byte); // 1222 (Признак платежного агента на платеже).

// Статусы
ADD_FISCAL_FIELD(1050, FSExpiredStatus, Byte, QCoreApplication::translate("FiscalFields", "#fs_expired_status")); // 1050 (Признак исчерпания ресурса ФН).
ADD_FISCAL_FIELD(1051, FSNeedChangeStatus, Byte, QCoreApplication::translate("FiscalFields", "#fs_need_change_status")); // 1051 (Признак необходимости срочной замены ФН).
ADD_FISCAL_FIELD(1052, FSMemoryEnd, Byte, QCoreApplication::translate("FiscalFields", "#fs_memory_end_status")); // 1052 (Признак заполнения памяти ФН).
ADD_FISCAL_FIELD(1053, OFDNoConnection, Byte, QCoreApplication::translate("FiscalFields", "#ofd_no_connection_status")); // 1053 (Признак превышения времени ожидания ответа ОФД).

// Режимы работы
ADD_FISCAL_FIELD(1001, AutomaticMode, Byte, QCoreApplication::translate("FiscalFields", "#automatic_mode")); // 1001 (Признак автоматического режима).
ADD_FISCAL_FIELD(1002, AutonomousMode, Byte, QCoreApplication::translate("FiscalFields", "#autonomous_mode")); // 1002 (Признак автономного режима).
ADD_FISCAL_FIELD(1056, EncryptionMode, Byte, QCoreApplication::translate("FiscalFields", "#encryption_mode")); // 1056 (Признак шифрования).
ADD_FISCAL_FIELD(1108, InternetMode, Byte, QCoreApplication::translate("FiscalFields", "#internet_mode")); // 1108 (Признак работы с интернет (без принтера).
ADD_FISCAL_FIELD(1109, ServiceAreaMode, Byte, QCoreApplication::translate("FiscalFields", "#service_area_mode")); // 1109 (Признак применения в сфере услуг).
ADD_FISCAL_FIELD(1110, FixedReportingMode, Byte, QCoreApplication::translate("FiscalFields", "#fixed_reporting_mode")); // 1110 (Признак работы с бланками строгой отчетности (БСО).
ADD_FISCAL_FIELD(1126, LotteryMode, Byte, QCoreApplication::translate("FiscalFields", "#lottery_mode")); // 1126 (Признак проведения лотереи).
ADD_FISCAL_FIELD(1193, GamblingMode, Byte, QCoreApplication::translate("FiscalFields", "#gambling_mode")); // 1193 (Признак проведения азартных игр).
ADD_FISCAL_FIELD(1207, ExcisableUnitMode, Byte, QCoreApplication::translate("FiscalFields", "#excisable_unit_mode")); // 1207 (Признак торговли подакцизными товарами).
ADD_FISCAL_FIELD(1221, InAutomateMode, Byte, QCoreApplication::translate("FiscalFields", "#in_automate_mode")); // 1221 (Признак установки в автомате).

// Предмет расчета (на конкретную продажу)
ADD_FISCAL_FIELD(1023, PayOffSubjectQuantity, FVLN); // 1023 (Количество предмета расчета).
ADD_FISCAL_FIELD(1043, PayOffSubjectAmount, VLN, "", true); // 1043 (Стоимость предмета расчета).
ADD_FISCAL_FIELD(1059, PayOffSubject, STLV); // 1059 (Предмет расчета).
ADD_FISCAL_FIELD(1079, PayOffSubjectUnitPrice, VLN, "", true); // 1079 (Цена за единицу предмета расчета с учетом скидок и наценок).
ADD_FISCAL_FIELD(1200, PayOffSubjectTaxAmount, VLN, "", true); // 1200 (Сумма НДС за предмет расчета).
ADD_FISCAL_FIELD(1212, PayOffSubjectType, Byte); // 1212 (Признак предмета расчета).
ADD_FISCAL_FIELD(1214, PayOffSubjectMethodType, Byte); // 1214 (Признак способа расчета).

// Суммы по способу расчета (на весь чек)
ADD_FISCAL_FIELD(1031, CashFiscalTotal, VLN, QCoreApplication::translate("FiscalFields", "#cash_fiscal_total"), true); // 1031 (Сумма по чеку (БСО) наличными).
ADD_FISCAL_FIELD(1081, CardFiscalTotal, VLN, QCoreApplication::translate("FiscalFields", "#card_fiscal_total"), true); // 1081 (Сумма по чеку (БСО) электронными).
ADD_FISCAL_FIELD(1215, PrePaymentFiscalTotal, VLN, QCoreApplication::translate("FiscalFields", "#prepayment_fiscal_total"), true); // 1215 (Сумма по чеку (БСО) предоплатой (зачетом аванса).
ADD_FISCAL_FIELD(1216, PostPaymentFiscalTotal, VLN, QCoreApplication::translate("FiscalFields", "#postpayment_fiscal_total"), true); // 1216 (Сумма по чеку (БСО) постоплатой (в кредит).
ADD_FISCAL_FIELD(1217, CounterOfferFiscalTotal, VLN, QCoreApplication::translate("FiscalFields", "#counter_offer_fiscal_total"), true); // 1217 (Сумма по чеку (БСО) встречным предоставлением).

// Налоги (на весь чек)
ADD_FISCAL_FIELD(1102, TaxAmount02, VLN, QCoreApplication::translate("FiscalFields", "#tax_amount_02"), true); // 1102 (Сумма НДС чека по ставке 18(20)%).
ADD_FISCAL_FIELD(1103, TaxAmount03, VLN, QCoreApplication::translate("FiscalFields", "#tax_amount_03"), true); // 1103 (Сумма НДС чека по ставке 10%).
ADD_FISCAL_FIELD(1104, TaxAmount04, VLN, QCoreApplication::translate("FiscalFields", "#tax_amount_04"), true); // 1104 (Сумма расчета по чеку с НДС по ставке 0%).
ADD_FISCAL_FIELD(1105, TaxAmount05, VLN, QCoreApplication::translate("FiscalFields", "#tax_amount_05"), true); // 1105 (Сумма расчета по чеку без НДС).
ADD_FISCAL_FIELD(1106, TaxAmount06, VLN, QCoreApplication::translate("FiscalFields", "#tax_amount_06"), true); // 1106 (Сумма НДС чека по расчетной ставке 18/118 (20/120)).
ADD_FISCAL_FIELD(1107, TaxAmount07, VLN, QCoreApplication::translate("FiscalFields", "#tax_amount_07"), true); // 1107 (Сумма НДС чека по расчетной ставке 10/110).

//---------------------------------------------------------------------------
// Список полей итогов для контроля 0-х сумм.
const QSet<int> FiscalTotals = QSet<int>()
<< CFR::FiscalFields::CashFiscalTotal
<< CFR::FiscalFields::CardFiscalTotal
<< CFR::FiscalFields::PrePaymentFiscalTotal
<< CFR::FiscalFields::PostPaymentFiscalTotal
<< CFR::FiscalFields::CounterOfferFiscalTotal;

//---------------------------------------------------------------------------
// Список полей предмета расчета.
const QSet<int> PayOffSubjectFields = QSet<int>()
<< CFR::FiscalFields::UnitName
<< CFR::FiscalFields::VATRate
<< CFR::FiscalFields::PayOffSubjectQuantity
<< CFR::FiscalFields::PayOffSubjectAmount
<< CFR::FiscalFields::PayOffSubjectUnitPrice
<< CFR::FiscalFields::PayOffSubjectTaxAmount
<< CFR::FiscalFields::PayOffSubjectType
<< CFR::FiscalFields::PayOffSubjectMethodType;

//---------------------------------------------------------------------------
// Список полей налогов.
const QSet<int> TaxAmountFields = QSet<int>()
<< CFR::FiscalFields::TaxAmount02
<< CFR::FiscalFields::TaxAmount03
<< CFR::FiscalFields::TaxAmount04
<< CFR::FiscalFields::TaxAmount05
<< CFR::FiscalFields::TaxAmount06
<< CFR::FiscalFields::TaxAmount07;

void Data::checkRFVAT20(int aField)
{
if (isRFVAT20() && TaxAmountFields.contains(aField))
{
mBuffer[aField].translationPF.replace("18", "20");
mDescriptionData[aField].replace("18", "20");
}
}
}} // namespace CFR::FiscalFields

//---------------------------------------------------------------------------
#include "../../../modules/Hardware/FR/src/Base/FiscalFieldDescriptions.h"

+ 5
- 2
3.0/src/includes/Hardware/IOPorts/LibUSBDeviceDataTypes.h View File

@@ -20,6 +20,8 @@

namespace CLibUSB
{
typedef int (LIBUSB_CALL * TProcessIO) (libusb_device_handle *, unsigned char, unsigned char *, int, int *, unsigned int);

/// Данные конечной точки.
struct SEndPoint
{
@@ -27,13 +29,14 @@ namespace CLibUSB
char data;
int maxPacketSize;
int pollingInterval;
TProcessIO processIO;

SEndPoint(): transferType(LIBUSB_TRANSFER_TYPE_CONTROL), data(ASCII::NUL), maxPacketSize(0), pollingInterval(0) {}
SEndPoint(): transferType(LIBUSB_TRANSFER_TYPE_CONTROL), data(ASCII::NUL), maxPacketSize(0), pollingInterval(0), processIO(nullptr) {}
SEndPoint(libusb_transfer_type aTransferType, char aData, int aMaxPacketSize, int aPollingInterval):
transferType(aTransferType), data(aData), maxPacketSize(aMaxPacketSize), pollingInterval(aPollingInterval) {}

bool getDirection() { return bool(data & LIBUSB_ENDPOINT_DIR_MASK); }
bool valid() { return maxPacketSize && ~(data & (LIBUSB_ENDPOINT_DIR_MASK | LIBUSB_ENDPOINT_ADDRESS_MASK)) &&
bool valid() { return maxPacketSize && processIO && ~(data & (LIBUSB_ENDPOINT_DIR_MASK | LIBUSB_ENDPOINT_ADDRESS_MASK)) &&
((transferType == LIBUSB_TRANSFER_TYPE_BULK) || (transferType == LIBUSB_TRANSFER_TYPE_INTERRUPT)); }
char operator()() { return data; }
};


+ 58
- 20
3.0/src/includes/Hardware/Plugins/CommonParameters.h View File

@@ -77,6 +77,38 @@ inline QStringList sortParameters(QStringList (* aGetParameters)())
}

//------------------------------------------------------------------------------
inline TParameterList modifyValue(const TParameterList & aParameterList, const QString & aName, const QVariant & aValue, const QString & aOldValue = "")
{
TParameterList parameterList(aParameterList);

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

if (it != parameterList.end())
{
it->defaultValue = aValue;
QVariantMap & possibleValues = it->possibleValues;

if (possibleValues.contains(aName))
{
possibleValues[aName] = aValue;
}
else if (possibleValues.contains(aOldValue) && (possibleValues[aOldValue] == aOldValue))
{
possibleValues.remove(aOldValue);
possibleValues.insert(aValue.toString(), aValue);
}
}

return parameterList;
}

//------------------------------------------------------------------------------
inline TParameterList modifyPriority(const TParameterList & aParameterList, SDK::Driver::EDetectingPriority::Enum aPriority)
{
return modifyValue(aParameterList, CHardwareSDK::DetectingPriority, aPriority);
}

//------------------------------------------------------------------------------
/// Создать список параметров с именем модели.
template <class T>
inline TParameterList createNamedList(const QStringList & aModels, const QString & aDefault)
@@ -137,6 +169,17 @@ struct SNamedList<T1, DSDKIT::ItUSB>

//------------------------------------------------------------------------------
template <class T1>
struct SNamedList<T1, DSDKIT::ItLibUSB>
{
TParameterList create(const QStringList & aModels, const QString & aDefault)
{
return modifyValue(createSimpleNamedList<T1>(aModels, aDefault), CHardwareSDK::InteractionType, CInteractionTypes::USB, CInteractionTypes::LibUSB)
<< setMultipleExistence();
}
};

//------------------------------------------------------------------------------
template <class T1>
struct SNamedList<T1, DSDKIT::ItTCP>
{
TParameterList create(const QStringList & aModels, const QString & aDefault)
@@ -194,19 +237,14 @@ inline SPluginParameter setNormalPriority()
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)
//------------------------------------------------------------------------------
/// Модифицированные имена ключей.
inline SPluginParameter setModifiedKeys(const QString & aOldParameterName, const QString & aNewParameterName)
{
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;
}
QVariantMap modifiedKeys;
modifiedKeys.insert(aOldParameterName, aNewParameterName);

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

//------------------------------------------------------------------------------
@@ -217,20 +255,20 @@ inline SPluginParameter setModifiedValues(const QString & aParameterValue, const
}

//------------------------------------------------------------------------------
/// Множественный тип атвопоиска устройства.
inline SPluginParameter setMultipleExistence()
/// Модифицированные значения параметров.
inline SPluginParameter setModifiedValues(const QString & aParameterValue, const QString & aValueFrom, const QString & aValueTo)
{
return SPluginParameter(CHardwareSDK::Existence, false, QString(), QString(), CHardwareSDK::ExistenceTypes::Multiple, QStringList() << CHardwareSDK::ExistenceTypes::Multiple, true);
QVariantMap possibleValues;
possibleValues.insert(aValueFrom, aValueTo);

return SPluginParameter(CPlugin::ModifiedValues, SPluginParameter::Set, false, aParameterValue, QString(), QString(), possibleValues, true);
}

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

return SPluginParameter(CPlugin::ModifiedKeys, SPluginParameter::Set, false, QString(), QString(), QString(), modifiedKeys, true);
return SPluginParameter(CHardwareSDK::Existence, false, QString(), QString(), CHardwareSDK::ExistenceTypes::Multiple, QStringList() << CHardwareSDK::ExistenceTypes::Multiple, true);
}

//------------------------------------------------------------------------------


+ 42
- 0
3.0/src/includes/Hardware/Printers/PortPOSPrinters.h View File

@@ -0,0 +1,42 @@
/* @file POS-принтер на COM-порту. */

#pragma once

#include "POSPrinter.h"

//--------------------------------------------------------------------------------
template <class T>
class SerialPOSPrinter: public T
{
public:
SerialPOSPrinter()
{
using namespace SDK::Driver::IOPort::COM;

// параметры порта
mPortParameters.clear();
mPortParameters.insert(EParameters::BaudRate, POSPrinters::TSerialDevicePortParameter()
<< EBaudRate::BR115200
<< EBaudRate::BR19200
<< EBaudRate::BR57600
<< EBaudRate::BR38400
<< EBaudRate::BR9600
<< EBaudRate::BR4800);
mPortParameters.insert(EParameters::Parity, POSPrinters::TSerialDevicePortParameter()
<< EParity::No
<< EParity::Even
<< EParity::Odd);
mPortParameters.insert(EParameters::ByteSize, POSPrinters::TSerialDevicePortParameter()
<< 8);
mPortParameters.insert(EParameters::RTS, POSPrinters::TSerialDevicePortParameter()
<< ERTSControl::Toggle);
mPortParameters.insert(EParameters::DTR, POSPrinters::TSerialDevicePortParameter()
<< EDTRControl::Handshake);
}
};

//--------------------------------------------------------------------------------
typedef SerialPOSPrinter<POSPrinter<TSerialPrinterBase>> TSerialPOSPrinter;
typedef POSPrinter<TLibUSBPrinterBase> TLibUSBPOSPrinter;

//--------------------------------------------------------------------------------

+ 0
- 1
3.0/src/includes/Hardware/Printers/PortPrinterBase.h View File

@@ -1 +0,0 @@
#include "../../../modules/Hardware/Printers/src/Base/Port/PortPrinterBase.h"

3.0/src/modules/Hardware/Printers/src/Base/Port/Serial/SerialPrinterBase.h → 3.0/src/includes/Hardware/Printers/PortPrintersBase.h View File

@@ -1,19 +1,15 @@
/* @file Базовый принтер � COM-портовой реализацией протокола. */
/* @file Áŕçîâűĺ ďđčíňĺđű ń ďîđňîâűěč đĺŕëčçŕöč˙ěč ďđîňîęîëîâ. */

#pragma once

// Modules
#include "Hardware/FR/ProtoFR.h"

// Project
#include "Hardware/Printers/PortPrinterBase.h"
#include "../../../modules/Hardware/Printers/src/Base/Port/PortPrinterBase.h"

//--------------------------------------------------------------------------------
template <class T>
class SerialPrinterBase : public PortPrinterBase<T>
{
public:
/// Пол�чение �пи�ка на�троек порта, необязательных для редактирования пользователем.
/// Ďîëó÷ĺíčĺ ńďčńęŕ íŕńňđîĺę ďîđňŕ, íĺîá˙çŕňĺëüíűő äë˙ đĺäŕęňčđîâŕíč˙ ďîëüçîâŕňĺëĺě.
static QStringList getOptionalPortSettings()
{
return QStringList()
@@ -25,6 +21,8 @@ public:
}
};

//--------------------------------------------------------------------------------
typedef SerialPrinterBase<PrinterBase<SerialDeviceBase<PortPollingDeviceBase<ProtoPrinter>>>> TSerialPrinterBase;
typedef PortPrinterBase<PrinterBase<LibUSBDeviceBase<PortPollingDeviceBase<ProtoPrinter>>>> TLibUSBPrinterBase;

//--------------------------------------------------------------------------------

+ 1
- 0
3.0/src/includes/Hardware/Printers/PrinterDevices.h View File

@@ -1,4 +1,5 @@
#include "../../../../modules/Hardware/Printers/src/POSPrinters/Common/POSPrinter.h"
#include "../../../../includes/Hardware/Printers/PortPOSPrinters.h"
#include "../../../../modules/Hardware/Printers/src/POSPrinters/Citizen/CitizenPPU700/CitizenPPU700.h"
#include "../../../../modules/Hardware/Printers/src/POSPrinters/Citizen/CitizenCPP8001.h"
#include "../../../../modules/Hardware/Printers/src/POSPrinters/Citizen/CitizenCBM1000II.h"