Мало кто задумывается, делая покупки в магазине, как работает техника кассира. На самом деле это хорошо отлаженный механизм не только с технической точки зрения, но и с точки зрения законодательства. Все знают, что главное получить чек, а вот почему чек является фискальным документом, подтверждающим покупку — в основном знают только сами предприниматели.
В этой статье мы поделимся опытом разработки кассового аппарата и расскажем, как там всё устроено изнутри.
Старинный кассовый аппарат
1. Система: железо + софт у кассира
Весь программно-аппаратный комплекс, который установлен на рабочем месте кассира, может называться POS-системой или POS-терминалом, от английского Point of sale — место продажи.
Рассмотрим, как работает POS-система. Так как принципиальное отличие системы от терминала — это расположение фискальной памяти (ФП) или фискального накопителя (ФН): у POS-системы она встроена в печатающее устройство, а у POS-терминала находится в компьютерном блоке.
Типовой кассовый аппарат. POS-система российской компании «ШТРИХ-М»
POS-система – программно-аппаратный комплекс, который работает на базе фискального регистратора. Обычно состоит из POS-компьютера, монитора и клавиатуры, чекового принтера, фискального регистратора, дисплея покупателя, денежного ящика и считывателя банковских карт. Типичный набор кассовых функций: учет и отпуск товара, прием и выдача денег, аннулирование покупки.
Самая интересная часть POS-системы — фискальный регистратор — это сердце системы и один из классов контрольно-кассовых машин (ККМ).
В роли фискального регистратора выступает чековый принтер с встроенной фискальной памятью. Он получает информацию по каналу связи, обрабатывает её и выводит на печать. Данные о кассовых операциях могут храниться в фискальной памяти сколь угодно долго, пока не понадобится их обнулить.
Для прямой передачи данных фискального регистратора в налоговую службу используется сервер оператора фискальных данных — ОФД — специального юрлица, которое отвечает за прием, обработку, хранение и передачу фискальных данных в налоговую службу.
В прошлом году российские предприниматели активно обсуждали переход на онлайн-кассы и отправку чеков в налоговую через ОФД в связи с принятием закона 54-ФЗ «О применении контрольно-кассовой техники».
Роль ОФД. Схема из статьи о 54-ФЗ и переходе на онлайн-кассы
ФНС — это Федеральная налоговая служба Российской Федерации. В Казахстане эту функцию выполняет Комитет государственных доходов Министерства финансов. А в Беларуси – Министерство по налогам и сборам.
В РФ работает несколько ОФД, а в Казахстане – всего один, АО «Казахтелеком».
2. Законодательство: мировой онлайн-контроль касс
Онлайн-контроль за работой розничной торговли уже работает во многих странах: Южная Корея (2005 г.), Швеция (2008 г.), Канада (2010 г.), Польша (2011 г.), Хорватия (2013 г.). В 2015 году такой подход начал внедряться в Казахстане. А в Беларуси крайний срок подключения касс к системе дистанционного контроля выручки перенесли на 1 июля 2018 года (такой же срок намечен в России).
Применение онлайн-касс в Казахстане регулируется главой 90 Налогового кодекса. С 2015 года передачу чеков в налоговую по интернету начали продавцы топлива и алкоголя. На втором этапе – с 2016 года – к системе подключили тех, кто занимается оптовой торговлей различными материалами и оборудованием; розничной продажей мебели, ПО и электроники; владельцев гостиниц, ресторанов, парикмахерских и кинотеатров. Предусмотрен третий этап проекта.
Мы ссылаемся на законы не просто так, в них описаны обязательные технические требования к программно-аппаратным системам для сбора и отправки данных в налоговую, которые ложатся в основу тех. задания для инженеров-разработчиков. Так, например, в приказе министра финансов Республики Казахстан был опубликован список требований к контрольно-кассовой машине для передачи сведений о денежных расчетах, который нам очень пригодился для разработки фискального регистратора.
3. Устройство и бизнес-логика фискального регистратора
Наше базовое устройство для разработки – термальный принтер для печати чеков. Сборочная система – Buildroot. Программирование — на Qt.
В рамках проекта требовалось разработать:
1) техническое задание;
2) протокол обмена с POS-компьютером, условно назовем его протокол POS-C;
3) приложение-демон, управляющее устройством:
- модуль обмена данными с сервером ОФД по протоколу ККТ (контрольно-кассовая техника);
- модуль обмена данными с POS-компьютером по протоколу POS-C;
- модуль управления печатью;
- модуль управления интерфейсами связи;
- модуль взаимодействия с базой данных;
- веб-сервер.
1) Модуль обмена данными с сервером ОФД
Обмен устройства с сервером осуществляется по TCP/IP-протоколу. При этом взаимодействии устройство является клиентом, а ОФД – сервером. В качестве основы для кодирования и декодирования информации, передаваемой по протоколу ККТ, используется Protocol Buffers.
Protocol Buffers (Protobuf) – протокол сериализации (передачи) структурированных данных, предложенный Google в качестве эффективной бинарной альтернативы текстовому формату XML. Разработчики сообщают, что их Protocol Buffers проще, компактнее и быстрее, чем XML, поскольку передает бинарные данные, которые оптимизированы под минимальный размер сообщения.
Формат сообщений в Protobuf описывается на специальном декларативном языке, который в чём-то напоминает декларацию структур в языке C++. Эти декларации сохраняются в файл с расширением .proto и компилируются в исходные коды на выбранном языке с помощью компилятора protoc.
Протокол ККТ позволяет:
- получать служебную информацию, информацию о кассе, номенклатурные данные;
- отправлять данные фискального чека и отменять его;
- получать отчеты о проделанных операциях;
- контролировать денежные средства в кассе (изъять или внести наличные) и состояние смены (открыть или закрыть смену);
- авторизовать оператора-кассира.
2) Модуль обмена данными с POS-компьютером
Общение с POS-компьютером реализовано по протоколам TCP/IP или HTTP, в зависимости от настроек в веб-интерфейсе, через порт USB Type-B с использованием технологии USB over Ethernet. При этом взаимодействии устройство является сервером, а POS-компьютер – клиентом. В случае использования TCP-соединения данные представлены в формате XML. А в случае HTTP-соединения используется POST-запрос, телом которого являются те же данные, что и при TCP-соединении.
Протокол POS-C позволяет:
- настроить и протестировать связь с сервером ОФД;
- получить информацию о состоянии устройства;
- управлять периферией устройства (печать текста, звуковой сигнал, открытие или закрытие денежного ящика);
- распечатать фискальный чек;
- распечатывать отчеты о проделанных операциях;
- контролировать денежные средства в кассе (изъять или внести наличные) и состояние смены (открыть или закрыть смену).
3) Модуль управления печатью
Взаимодействие с печатающим механизмом, звукоизлучателем и портом управления денежным ящиком проводится через библиотеку Python-ESCPOS, которая реализует протокол ESC/POS.
ESC/P (Epson Standard Code for Printers) — язык команд, разработанный Epson, для управления принтерами. ESC/POS — один из вариантов ESC/P, разработанный для использования в POS-оборудовании.
Виды печатаемых документов:
- тестовая печать;
- тестовый фискальный чек;
- фискальный чек;
- отмененный фискальный чек;
- отчеты (Х-отчет, Z-отчет, полная контрольная лента, сокращенная контрольная лента, отчет по кассира, отчет по секциям);
- внесение или изъятие наличных;
- открытие смены;
- информирование о состоянии устройства;
- результат тестирования устройства;
- чек регистрации устройства.
Тестирование принтера. Примеры чеков
4) Модуль управления интерфейсами связи
На борту устройства имеется DHCP-сервер для USB-интерфейса для связи с POS-компьютером. А для соединения с сервером ОФД могут использоваться интерфейсы LAN, WiFi и GPRS, переключение между которыми реализует демон управления сетевыми соединениями ConnMan. Он позволяет настроить соединения по каждому интерфейсу, чтобы в случае обрыва связи по активному интерфейсу быстро переключиться на другое соединение с меньшим приоритетом. Такое решение стабилизирует соединение с сервером ОФД в точках продажи с плохим подключением к интернету.
5) Модуль взаимодействия с базой данных
Хранение данных реализовано с использованием компактной встраиваемой СУБД SQLite и организовано в виде следующих таблиц:
- данные по произведенным операциям;
- авторизационные данные;
- настройки секций;
- настройки налогов;
- настройки клише и подвала чека;
- информационные сообщения от сервера ОФД.
6) Веб-сервер
Для реализации веб-сервера была выбрана библиотека Wt, C++ WebToolkit в силу следующих преимуществ:
- это кроссплатформенная свободная библиотека с поддержкой C++;
- малый размер web-сервера на C++ и низкое потребление ресурсов;
- удобство интеграции с существующими настольными приложениями и библиотеками C++;
- нет нужды в использовании HTML, CSS, JavaScript и др. технологиях, т.к. можно программировать с использованием виджетов, наподобие Qt;
- безопасность и кросс-браузерность web-приложений.
Весьма полезным для быстрого старта оказался WtDesigner.
Предназначение веб-интерфейса:
- настройка параметров;
- просмотр состояния устройства;
- обновление ПО.
Веб-интерфейс
4. Заключение
На базе перечисленных технологий мы разработали устройство с массой функций и настройками через веб-интерфейс, поддержкой различных протоколов обмена с POS-компьютером и возможностью обновления ПО.
И теперь кажется, что наша инженерная команда уже никогда не сможет просто так прийти в магазин и что-то купить, не думая обо всех этих внутренностях онлайн-касс, протоколах для передачи данных, требованиях законодательства и выводе всей этой кухни на печать:
— Возьмите чек, пожалуйста!
— Спасибо, не надо! :-)
P.S. И напоследок минутка юмора: британские уфологи из команды ArtAlienTV обнаружили на снимках марсохода Curiosity предмет, напоминающий старый кассовый аппарат.
Автор: Команда компании Promwad