Терминальный проект КиберПлат [open source]
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

151 lines
5.2KB

  1. /* @file Обработчик команд работы с устройствами выдачи наличных. */
  2. #pragma once
  3. // Qt
  4. #include <Common/QtHeadersBegin.h>
  5. #include <QtCore/QObject>
  6. #include <QtCore/QSet>
  7. #include <Common/QtHeadersEnd.h>
  8. // SDK
  9. #include <SDK/Drivers/IDispenser.h>
  10. #include <SDK/PaymentProcessor/Core/IFundsService.h>
  11. // Modules
  12. #include <Common/ILogable.h>
  13. // PP
  14. #include "DatabaseUtils/IPaymentDatabaseUtils.h"
  15. class IApplication;
  16. class IHardwareDatabaseUtils;
  17. namespace SDK { namespace PaymentProcessor {
  18. class IDeviceService;
  19. }}
  20. //---------------------------------------------------------------------------
  21. class CashDispenserManager : public SDK::PaymentProcessor::ICashDispenserManager, public ILogable
  22. {
  23. Q_OBJECT
  24. /// Данные выдаваемых объектов.
  25. struct SItemData
  26. {
  27. SDK::Driver::IDispenser * dispenser;
  28. int unit;
  29. int count;
  30. SItemData(): dispenser(nullptr), unit(0), count(0) {}
  31. SItemData(SDK::Driver::IDispenser * aDispenser, int aUnit, int aCount): dispenser(aDispenser), unit(aUnit), count(aCount) {}
  32. };
  33. typedef QList<SItemData> TItemData;
  34. typedef QMap<int, TItemData> TItemDataSet;
  35. typedef TItemDataSet::iterator TItemDataSetIt;
  36. struct SAmounts
  37. {
  38. SDK::PaymentProcessor::TPaymentAmount toDispensing; /// к выдаче
  39. SDK::PaymentProcessor::TPaymentAmount dispensed; /// выданное
  40. SAmounts(): toDispensing(0), dispensed(0) {}
  41. SAmounts(SDK::PaymentProcessor::TPaymentAmount aToDispensing, SDK::PaymentProcessor::TPaymentAmount aDispensed):
  42. toDispensing(aToDispensing), dispensed(aDispensed) {}
  43. SAmounts & operator+=(const SAmounts & aAmounts)
  44. {
  45. toDispensing += aAmounts.toDispensing;
  46. dispensed += aAmounts.dispensed;
  47. return *this;
  48. }
  49. };
  50. public:
  51. CashDispenserManager(IApplication * aApplication);
  52. /// Инициализация
  53. virtual bool initialize(IPaymentDatabaseUtils * aDatabase);
  54. /// Проверка, возможна ли выдача наличных средств
  55. virtual SDK::PaymentProcessor::TPaymentAmount canDispense(SDK::PaymentProcessor::TPaymentAmount aRequiredAmount);
  56. /// Выдать указанную сумму (асинхронная операция)
  57. virtual void dispense(SDK::PaymentProcessor::TPaymentAmount aAmount);
  58. /// Получить список номиналов и их кол-ва для всех устройств выдачи денег
  59. virtual SDK::PaymentProcessor::TCashUnitsState getCashUnitsState();
  60. /// Сохранить список номиналов и их кол-ва для всех устройств выдачи денег
  61. virtual bool setCashUnitsState(const QString & aDeviceConfigurationName, const SDK::PaymentProcessor::TCashUnitList & aCashUnitList);
  62. public slots:
  63. void shutdown();
  64. private slots:
  65. void updateHardwareConfiguration();
  66. void onUnitsDefined();
  67. void onDispensed(int aUnit, int aItems);
  68. void onRejected(int aUnit, int aItems);
  69. void onUnitEmpty(int aUnit);
  70. /// Изменение статуса диспенсера
  71. void onStatusChanged(SDK::Driver::EWarningLevel::Enum aWarningLevel, const QString & aTranslation, int aStatus);
  72. private:
  73. /// Загрузить содержимое диспенсеров из БД
  74. void loadCashList();
  75. /// Сохранить содержимое диспенсеров в БД
  76. void saveCashCount();
  77. /// Получить данные объектов для выдачи
  78. TItemDataSet getItemDataSet(SDK::PaymentProcessor::TPaymentAmount aAmount);
  79. /// Получить данные объектa для выдачи
  80. bool getItemData(SDK::PaymentProcessor::TPaymentAmount aAmount, TItemDataSet & aItemData, TItemDataSetIt & aItemDataSetIt);
  81. /// Проверить сигнал о результате выдачи денег
  82. SDK::PaymentProcessor::SCashUnit * checkSignal(QObject * aSender, const QString & aSignalName, int aUnit);
  83. /// Сохранить в базе информацию о выданных купюрах
  84. bool storeNotes(QObject * aSender, int aUnit, int aItems);
  85. /// Проверить и обработать сигнал о результате выдачи денег
  86. bool handleSignal(QObject * aSender, const QString & aSignalName, int aUnit, int aItemCount, SDK::PaymentProcessor::TPaymentAmount & aAmount);
  87. /// Установить конфигурацию кассет
  88. void setCashList(SDK::Driver::IDispenser * aDispenser);
  89. /// Валюта
  90. QString mCurrencyName;
  91. /// Приложение
  92. IApplication * mApplication;
  93. /// Девайс-сервис
  94. SDK::PaymentProcessor::IDeviceService * mDeviceService;
  95. /// Экземпляр девайс-сервиса
  96. IHardwareDatabaseUtils * mDatabase;
  97. IPaymentDatabaseUtils * mPaymentDatabase;
  98. /// Сумма для выдачи/выданная
  99. SAmounts mAmounts;
  100. /// Список всех устройств с их GUID
  101. QMap<SDK::Driver::IDispenser *, QString> mDispensers;
  102. /// Список сломанных устройств
  103. typedef QSet<SDK::Driver::IDispenser *> TDispensers;
  104. TDispensers mFailedDispensers;
  105. /// Актуальный список номиналов в каждом диспенсере
  106. SDK::PaymentProcessor::TCashUnitsState mCurrencyCashList;
  107. };
  108. //---------------------------------------------------------------------------