Терминальный проект КиберПлат [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.

313 lines
20KB

  1. /* @file Константы, коды команд и ответов протокола ФР Штрих онлайн. */
  2. #pragma once
  3. // Modules
  4. #include "Hardware/Common/WaitingData.h"
  5. // Project
  6. #include "../ShtrihFRConstants.h"
  7. //--------------------------------------------------------------------------------
  8. namespace CShtrihOnlineFR
  9. {
  10. /// Формат представления даты [активизации] ФН в ответе на длинный запрос статуса ФН.
  11. const char DateFormat[] = "yyyyMMdd";
  12. /// Размер сектора на SD-карте, [байт].
  13. const int SectorSizeSD = 512;
  14. /// Количество секторов в 1 МБ.
  15. const int SectorsInMB = 1024 * 1024 / SectorSizeSD;
  16. /// Статус SD - недоступна.
  17. const char SDNotConnected = '\xFE';
  18. /// Минимальные даты прошивкок, начиная с которых возможно выполнение определенного функционала.
  19. namespace MinFWDate
  20. {
  21. /// Снятие Z-отчетов в буфер.
  22. const QDate ZBuffer = QDate(2017, 6, 29);
  23. /// Флаги агента для продажи.
  24. const QDate AgentFlagOnSale = QDate(2017, 12, 29);
  25. /// Операции V2.
  26. const QDate V2 = QDate(2017, 5, 17);
  27. }
  28. /// Данные налога для продажи - налог вычисляется ФР.
  29. const char FiscalTaxData[] = "\xFF\xFF\xFF\xFF\xFF";
  30. /// Сервисные команды (параметры).
  31. namespace Service
  32. {
  33. /// Cофтварная перезагрузка.
  34. const QByteArray Reboot = QByteArray::fromRawData("\xF3\x00\x00\x00\x00", 5);
  35. /// Прошивка загрузчика.
  36. const QByteArray BootFirmware = QByteArray::fromRawData("\xEC\x00\x00\x00\x00", 5);
  37. }
  38. /// Минимально рекомендованная версия загрузчика.
  39. const uint MinBootFirmware = 133;
  40. /// Пауза после софтварной перезагрузки ФР, [мс].
  41. const int RebootPause = 5 * 1000;
  42. /// Таймаут открытия TCP-порта после перезагрузки ФР, [мс].
  43. const int TCPReopeningTimeout = 30 * 1000;
  44. /// Печатать все реквизиты пользователя (название юр. лица, адрес и место расчетов).
  45. const int PrintFullUserData = 7;
  46. /// Ряд кассира по умолчанию (сисадмин).
  47. const int CashierSeries = 30;
  48. /// Количество типов оплаты.
  49. const int PayTypeQuantity = 16;
  50. /// Налоги на закрытии чека по количеству налоговых групп. Фиктивные, т.к. используются налоги на позицию.
  51. const QByteArray ClosingFiscalTaxes = QByteArray(6 * 5, ASCII::NUL);
  52. /// Ожидание готовности, [мс].
  53. const SWaitingData ReadyWaiting = SWaitingData(200, 15 * 1000);
  54. /// Максимальный ожидания допечати отчета по отделам.
  55. const int MaxWaitForPrintingSectionReport = 20 * 1000;
  56. /// Максимальный ожидания допечати отчета по налогам.
  57. const int MaxWaitForPrintingTaxReport = 20 * 1000;
  58. /// Максимальный ожидания допечати отчета по кассирам.
  59. const int MaxWaitForPrintingCashierReport = 20 * 1000;
  60. /// Маски для парсинга режимо работы.
  61. namespace OperationModeMask
  62. {
  63. const char ExcisableUnitMode = '\x01'; // Торговля подакцизными товарами (1207).
  64. const char GamblingMode = '\x02'; // Проведение азартных игр (1193).
  65. const char LotteryMode = '\x04'; // Проведение лотереи (1126).
  66. const char InAutomateMode = '\x08'; // Признак установки в автомате (1221).
  67. }
  68. /// Параметры ФР.
  69. namespace FRParameters
  70. {
  71. using namespace CShtrihFR::FRParameters;
  72. const SData Cashier = SData( 2, 2); /// Кассир по умолчанию (сисадмин).
  73. const SData NotPrintDocument = SData( 7, 17); /// Настройка печати любого документа.
  74. const SData PrintEndToEndNumber = SData( 9, 17); /// Печатать сквозной номер документа.
  75. const SData PrintOFDData = SData(10, 17); /// Печатать данные ОФД.
  76. const SData PrintUserData = SData(12, 17); /// Печатать реквизиты [суб]дилера.
  77. const SData FFDFR = SData(17, 17); /// ФФД ФР.
  78. const SData PrintCustomFields = SData(25, 17); /// Автопечать тегов, вводимых на платеже.
  79. const SData SetCustomFields = SData(28, 17); /// Установка тегов, вводимых на платеже.
  80. const SData SerialNumber = SData( 1, 18); /// Серийный номер.
  81. const SData INN = SData( 2, 18); /// ИНН.
  82. const SData RNM = SData( 3, 18); /// РНМ.
  83. const SData TaxSystem = SData( 5, 18); /// СНО.
  84. const SData LegalOwner = SData( 7, 18); /// Наименование юр. лица владельца.
  85. const SData PayOffAddress = SData( 9, 18); /// Адрес расчетов.
  86. const SData OFDName = SData(10, 18); /// Наименование ОФД.
  87. const SData OFDURL = SData(11, 18); /// Aдрес сайта ОФД.
  88. const SData FTSURL = SData(13, 18); /// Адрес сайта ФНС.
  89. const SData PayOffPlace = SData(14, 18); /// Место расчетов.
  90. const SData AgentFlag = SData(16, 18); /// Признак агента.
  91. const SData OperationModes = SData(21, 18); /// Режимы работы.
  92. const SData OFDAddress = SData( 1, 19); /// Aдрес ОФД.
  93. const SData OFDPort = SData( 2, 19); /// Порт ОФД.
  94. const SData AutomaticNumber = SData( 1, 24); /// Номер автомата.
  95. const SData PrinterModel = SData( 2, 24); /// Модель подключенного принтера.
  96. const SData QRCode = SData( 8, 24); /// Формировать QR-код (средствами ФР, а не принтера).
  97. /// Параметры автообновления.
  98. namespace FirmwareUpdating
  99. {
  100. const SData Working = SData(1, 23); /// Работать/не работать с сервером.
  101. const SData Interval = SData(3, 23); /// Период опроса сервера.
  102. const SData Enabling = SData(5, 23); /// Включить/выключить.
  103. const SData Single = SData(6, 23); /// Однократное/неоднократное обновление.
  104. }
  105. /// Параметры SD-карты.
  106. namespace SD
  107. {
  108. const SData Status = SData( 1, 14); /// Статус.
  109. const SData ClusterSize = SData( 2, 14); /// Размер кластера.
  110. const SData TotalSize = SData( 3, 14); /// Общий размер.
  111. const SData FreeSize = SData( 4, 14); /// Размер свободного места.
  112. const SData IOErrors = SData( 5, 14); /// Количество ошибок чтения/записи.
  113. const SData RetryCount = SData( 6, 14); /// Количество попыток доступа (?).
  114. }
  115. /// Не передавать признак предмета расчета в ФН на платеже.
  116. const char DontSendPayOffSubjectType = 0x20;
  117. }
  118. /// Параметры автообновления.
  119. namespace FirmwareUpdating
  120. {
  121. const int Working = 1; /// Работать с сервером автообновления.
  122. const int Interval = 600; /// Интервал опроса сервера автообновления, [c].
  123. const int Enabling = 1; /// Разрешить автообновление.
  124. const int Single = 0; /// Многократное обновление.
  125. }
  126. /// Коды команд.
  127. namespace Commands
  128. {
  129. const char GetPrinterStatus = '\xD1'; /// Получить статус принтера.
  130. const char Service = '\xFE'; /// Сервисная команда.
  131. /// Коды команд ФН.
  132. namespace FS
  133. {
  134. const char GetStatus[] = "\xFF\x01"; /// Получить статус ФН.
  135. const char GetNumber[] = "\xFF\x02"; /// Получить номер ФН.
  136. const char GetValidity[] = "\xFF\x03"; /// Получить срок действия ФН.
  137. const char GetVersion[] = "\xFF\x04"; /// Получить версию ФН.
  138. const char GetFiscalizationTotal[] = "\xFF\x09"; /// Получить итог фискализации.
  139. const char GetFDbyNumber[] = "\xFF\x0A"; /// Получить фискальный документ по его номеру.
  140. const char SetOFDParameter[] = "\xFF\x0C"; /// Передать произвольную TLV структуру (реквизит для ОФД).
  141. const char GetOFDInterchangeStatus[] = "\xFF\x39"; /// Получить статус информационного обмена c ОФД.
  142. const char StartFiscalTLVData[] = "\xFF\x3A"; /// Начать получение данных фискального документа в TLV-формате.
  143. const char GetFiscalTLVData[] = "\xFF\x3B"; /// Получить данные фискального документа в TLV-формате.
  144. const char GetSessionParameters[] = "\xFF\x40"; /// Получить параметры текущей смены.
  145. const char CloseDocument[] = "\xFF\x45"; /// Закрыть фискальный чек.
  146. const char Sale[] = "\xFF\x46"; /// Продажа.
  147. const char SetOFDParameterLinked[] = "\xFF\x4D"; /// Передать произвольную TLV структуру (реквизит для ОФД), привязанную к операции.
  148. }
  149. }
  150. /// Коды ошибок (некоторых).
  151. namespace Errors
  152. {
  153. const char WrongFSState = '\x02'; /// Неверное состояние ФН.
  154. const char NoRequiedDataInFS = '\x08'; /// Нет запрошенных данных.
  155. const char FSOfflineEnd = '\x14'; /// ФН Исчерпан ресурс хранения.
  156. const char NeedZReport = '\x16'; /// ФН Продолжительность смены более 24 часов.
  157. class Data : public FRError::Data
  158. {
  159. public:
  160. Data()
  161. {
  162. using namespace FRError;
  163. add('\x01', "Неизвестная команда, неверный формат посылки или неизвестные параметры");
  164. add('\x02', "Неверное состояние ФН");
  165. add('\x03', "Ошибка ФН", EType::FS);
  166. add('\x04', "Ошибка КС", EType::FS);
  167. add('\x05', "Закончен срок эксплуатации ФН", EType::FS);
  168. add('\x06', "Архив ФН переполнен", EType::FS);
  169. add('\x07', "ФН Неверные дата и/или время");
  170. add('\x08', "Нет запрошенных данных");
  171. add('\x09', "Некорректное значение параметров команды");
  172. add('\x10', "Превышение размеров TLV данных");
  173. add('\x11', "Нет транспортного соединения");
  174. add('\x12', "ФН Исчерпан ресурс КС", EType::FS);
  175. add('\x14', "ФН Исчерпан ресурс хранения");
  176. add('\x15', "ФН Исчерпан ресурс ожидания передачи сообщения");
  177. add('\x16', "ФН Продолжительность смены более 24 часов");
  178. add('\x17', "ФН Неверная разница во времени между 2 операцими");
  179. add('\x20', "ФН Сообщение от ОФД не может быть принято");
  180. add('\x2F', "Таймаут обмена с ФН", EType::FS);
  181. add('\x30', "ФН не отвечает", EType::FS);
  182. add('\x33', "Некорректные параметры в команде");
  183. add('\x34', "Нет данных");
  184. add('\x35', "Некорректный параметр при данных настройках");
  185. add('\x36', "Некорректные параметры в команде для данной реализации ККТ");
  186. add('\x37', "Команда не поддерживается в данной реализации ККТ");
  187. add('\x38', "Ошибка в ПЗУ", EType::FR);
  188. add('\x39', "Внутренняя ошибка ПО ККТ", EType::FR);
  189. add('\x3A', "Переполнение накопления по надбавкам в смене");
  190. add('\x3C', "Смена открыта – операция не возможна");
  191. add('\x3D', "Смена не открыта – операция не возможна");
  192. add('\x3E', "Переполнение накопления по секциям в смене");
  193. add('\x3F', "Переполнение накопления по скидкам в смене");
  194. add('\x40', "Переполнение диапазона скидок");
  195. add('\x41', "Переполнение диапазона оплаты наличными");
  196. add('\x42', "Переполнение диапазона оплаты типом 2");
  197. add('\x43', "Переполнение диапазона оплаты типом 3");
  198. add('\x44', "Переполнение диапазона оплаты типом 4");
  199. add('\x45', "Сумма всех типов оплаты меньше итога чека");
  200. add('\x46', "Не хватает наличности в кассе");
  201. add('\x47', "Переполнение накопления по налогам в смене");
  202. add('\x48', "Переполнение итога чека");
  203. add('\x49', "Операция невозможна в открытом чеке данного типа");
  204. add('\x4A', "Открыт чек – операция невозможна");
  205. add('\x4B', "Буфер чека переполнен");
  206. add('\x4C', "Переполнение накопления по обороту налогов в смене");
  207. add('\x4D', "Вносимая безналичной оплатой сумма больше суммы чека");
  208. add('\x4E', "Смена превысила 24 часа");
  209. add('\x4F', "Неверный пароль");
  210. add('\x50', "Идет печать результатов выполнения предыдущей команды");
  211. add('\x51', "Переполнение накоплений наличными в смене");
  212. add('\x52', "Переполнение накоплений по типу оплаты 2 в смене");
  213. add('\x53', "Переполнение накоплений по типу оплаты 3 в смене");
  214. add('\x54', "Переполнение накоплений по типу оплаты 4 в смене");
  215. add('\x55', "Чек закрыт – операция невозможна");
  216. add('\x56', "Нет документа для повтора");
  217. add('\x58', "Ожидание команды продолжения печати");
  218. add('\x59', "Документ открыт другим оператором");
  219. add('\x5B', "Переполнение диапазона надбавок");
  220. add('\x5C', "Понижено напряжение 24В");
  221. add('\x5D', "Таблица не определена");
  222. add('\x5E', "Неверная операция");
  223. add('\x5F', "Отрицательный итог чека");
  224. add('\x60', "Переполнение при умножении");
  225. add('\x61', "Переполнение диапазона цены");
  226. add('\x62', "Переполнение диапазона количества");
  227. add('\x63', "Переполнение диапазона отдела");
  228. add('\x65', "Не хватает денег в секции");
  229. add('\x66', "Переполнение денег в секции");
  230. add('\x68', "Не хватает денег по обороту налогов");
  231. add('\x69', "Переполнение денег по обороту налогов");
  232. add('\x6A', "Ошибка питания в момент ответа по I2C", EType::FR);
  233. add('\x6B', "Нет чековой ленты");
  234. add('\x6D', "Не хватает денег по налогу");
  235. add('\x6E', "Переполнение денег по налогу");
  236. add('\x6F', "Переполнение по выплате в смене");
  237. add('\x71', "Ошибка отрезчика");
  238. add('\x72', "Команда не поддерживается в данном подрежиме");
  239. add('\x73', "Команда не поддерживается в данном режиме");
  240. add('\x74', "Ошибка ОЗУ", EType::FR);
  241. add('\x75', "Ошибка питания", EType::FR);
  242. add('\x77', "Ошибка принтера: нет сигнала с датчиков", EType::FR);
  243. add('\x78', "Замена ПО", EType::FR);
  244. add('\x7A', "Поле не редактируется");
  245. add('\x7B', "Ошибка оборудования", EType::FR);
  246. add('\x7C', "Не совпадает дата");
  247. add('\x7D', "Неверный формат даты");
  248. add('\x7E', "Неверное значение в поле длины");
  249. add('\x7F', "Переполнение диапазона итога чека");
  250. add('\x84', "Переполнение наличности");
  251. add('\x85', "Переполнение по продажам в смене");
  252. add('\x86', "Переполнение по покупкам в смене");
  253. add('\x87', "Переполнение по возвратам продаж в смене");
  254. add('\x88', "Переполнение по возвратам покупок в смене");
  255. add('\x89', "Переполнение по внесению в смене");
  256. add('\x8A', "Переполнение по надбавкам в чеке");
  257. add('\x8B', "Переполнение по скидкам в чеке");
  258. add('\x8C', "Отрицательный итог надбавки в чеке");
  259. add('\x8D', "Отрицательный итог скидки в чеке");
  260. add('\x8E', "Нулевой итог чека");
  261. add('\x90', "Поле превышает размер, установленный в настройках");
  262. add('\x91', "Выход за границу поля печати при данных настройках шрифта");
  263. add('\x92', "Наложение полей");
  264. add('\x93', "Восстановление ОЗУ прошло успешно");
  265. add('\x94', "Исчерпан лимит операций в чеке");
  266. add('\xC0', "Контроль даты и времени (подтвердите дату и время)");
  267. add('\xC2', "Превышение напряжения в блоке питания", EType::FR);
  268. add('\xC4', "Несовпадение номеров смен");
  269. add('\xC7', "Поле не редактируется в данном режиме");
  270. add('\xC8', "Нет связи с принтером или отсутствуют импульсы от таходатчика", EType::Printer);
  271. }
  272. };
  273. }
  274. }
  275. //--------------------------------------------------------------------------------