- PVSM.RU - https://www.pvsm.ru -
Мало кто задумывается, делая покупки в магазине, как работает техника кассира. На самом деле это хорошо отлаженный механизм не только с технической точки зрения, но и с точки зрения законодательства. Все знают, что главное получить чек, а вот почему чек является фискальным документом, подтверждающим покупку — в основном знают только сами предприниматели.
В этой статье мы поделимся опытом разработки кассового аппарата и расскажем, как там всё устроено изнутри.
Старинный кассовый аппарат
Весь программно-аппаратный комплекс, который установлен на рабочем месте кассира, может называться POS-системой или POS-терминалом, от английского Point of sale — место продажи.
Рассмотрим, как работает POS-система. Так как принципиальное отличие системы от терминала — это расположение фискальной памяти (ФП) или фискального накопителя (ФН): у POS-системы она встроена в печатающее устройство, а у POS-терминала находится в компьютерном блоке.
Типовой кассовый аппарат. POS-система российской компании «ШТРИХ-М»
POS-система – программно-аппаратный комплекс, который работает на базе фискального регистратора. Обычно состоит из POS-компьютера, монитора и клавиатуры, чекового принтера, фискального регистратора, дисплея покупателя, денежного ящика и считывателя банковских карт. Типичный набор кассовых функций: учет и отпуск товара, прием и выдача денег, аннулирование покупки.
Самая интересная часть POS-системы — фискальный регистратор — это сердце системы и один из классов контрольно-кассовых машин (ККМ).
В роли фискального регистратора выступает чековый принтер с встроенной фискальной памятью. Он получает информацию по каналу связи, обрабатывает её и выводит на печать. Данные о кассовых операциях могут храниться в фискальной памяти сколь угодно долго, пока не понадобится их обнулить.
Для прямой передачи данных фискального регистратора в налоговую службу используется сервер оператора фискальных данных — ОФД — специального юрлица, которое отвечает за прием, обработку, хранение и передачу фискальных данных в налоговую службу.
В прошлом году российские предприниматели активно обсуждали переход на онлайн-кассы и отправку чеков в налоговую через ОФД в связи с принятием закона 54-ФЗ «О применении контрольно-кассовой техники».
Роль ОФД. Схема из статьи о 54-ФЗ и переходе на онлайн-кассы [1]
ФНС — это Федеральная налоговая служба Российской Федерации. В Казахстане эту функцию выполняет Комитет государственных доходов Министерства финансов. А в Беларуси – Министерство по налогам и сборам.
В РФ работает несколько ОФД, а в Казахстане – всего один, АО «Казахтелеком».
Онлайн-контроль за работой розничной торговли уже работает во многих странах: Южная Корея (2005 г.), Швеция (2008 г.), Канада (2010 г.), Польша (2011 г.), Хорватия (2013 г.). В 2015 году такой подход начал внедряться в Казахстане. А в Беларуси крайний срок подключения касс к системе дистанционного контроля выручки перенесли на 1 июля 2018 года (такой же срок намечен в России).
Применение онлайн-касс в Казахстане регулируется главой 90 Налогового кодекса [2]. С 2015 года передачу чеков в налоговую по интернету начали продавцы топлива и алкоголя. На втором этапе – с 2016 года – к системе подключили тех, кто занимается оптовой торговлей различными материалами и оборудованием; розничной продажей мебели, ПО и электроники; владельцев гостиниц, ресторанов, парикмахерских и кинотеатров. Предусмотрен третий этап проекта.
Мы ссылаемся на законы не просто так, в них описаны обязательные технические требования к программно-аппаратным системам для сбора и отправки данных в налоговую, которые ложатся в основу тех. задания для инженеров-разработчиков. Так, например, в приказе министра финансов Республики Казахстан [3] был опубликован список требований к контрольно-кассовой машине для передачи сведений о денежных расчетах, который нам очень пригодился для разработки фискального регистратора.
Наше базовое устройство для разработки – термальный принтер для печати чеков. Сборочная система – Buildroot. Программирование — на Qt.
В рамках проекта требовалось разработать:
1) техническое задание;
2) протокол обмена с POS-компьютером, условно назовем его протокол POS-C;
3) приложение-демон, управляющее устройством:
Обмен устройства с сервером осуществляется по TCP/IP-протоколу. При этом взаимодействии устройство является клиентом, а ОФД – сервером. В качестве основы для кодирования и декодирования информации, передаваемой по протоколу ККТ, используется Protocol Buffers.
Protocol Buffers [4] (Protobuf) – протокол сериализации (передачи) структурированных данных, предложенный Google в качестве эффективной бинарной альтернативы текстовому формату XML. Разработчики сообщают, что их Protocol Buffers проще, компактнее и быстрее, чем XML, поскольку передает бинарные данные, которые оптимизированы под минимальный размер сообщения.
Формат сообщений в Protobuf описывается на специальном декларативном языке, который в чём-то напоминает декларацию структур в языке C++. Эти декларации сохраняются в файл с расширением .proto и компилируются в исходные коды на выбранном языке с помощью компилятора protoc.
Протокол ККТ позволяет:
Общение с POS-компьютером реализовано по протоколам TCP/IP или HTTP, в зависимости от настроек в веб-интерфейсе, через порт USB Type-B с использованием технологии USB over Ethernet. При этом взаимодействии устройство является сервером, а POS-компьютер – клиентом. В случае использования TCP-соединения данные представлены в формате XML. А в случае HTTP-соединения используется POST-запрос, телом которого являются те же данные, что и при TCP-соединении.
Протокол POS-C позволяет:
Взаимодействие с печатающим механизмом, звукоизлучателем и портом управления денежным ящиком проводится через библиотеку Python-ESCPOS [5], которая реализует протокол ESC/POS.
ESC/P (Epson Standard Code for Printers) — язык команд, разработанный Epson, для управления принтерами. ESC/POS — один из вариантов ESC/P, разработанный для использования в POS-оборудовании.
Виды печатаемых документов:
Тестирование принтера. Примеры чеков
На борту устройства имеется DHCP-сервер для USB-интерфейса для связи с POS-компьютером. А для соединения с сервером ОФД могут использоваться интерфейсы LAN, WiFi и GPRS, переключение между которыми реализует демон управления сетевыми соединениями ConnMan. Он позволяет настроить соединения по каждому интерфейсу, чтобы в случае обрыва связи по активному интерфейсу быстро переключиться на другое соединение с меньшим приоритетом. Такое решение стабилизирует соединение с сервером ОФД в точках продажи с плохим подключением к интернету.
Хранение данных реализовано с использованием компактной встраиваемой СУБД SQLite [6] и организовано в виде следующих таблиц:
Для реализации веб-сервера была выбрана библиотека Wt, C++ WebToolkit [7] в силу следующих преимуществ:
Весьма полезным для быстрого старта оказался WtDesigner [8].
Предназначение веб-интерфейса:
Веб-интерфейс
На базе перечисленных технологий мы разработали устройство с массой функций и настройками через веб-интерфейс, поддержкой различных протоколов обмена с POS-компьютером и возможностью обновления ПО.
И теперь кажется, что наша инженерная команда уже никогда не сможет просто так прийти в магазин и что-то купить, не думая обо всех этих внутренностях онлайн-касс, протоколах для передачи данных, требованиях законодательства и выводе всей этой кухни на печать:
— Возьмите чек, пожалуйста!
— Спасибо, не надо! :-)
P.S. И напоследок минутка юмора: британские уфологи из команды ArtAlienTV обнаружили на снимках марсохода Curiosity предмет, напоминающий старый кассовый аппарат.
Автор: Команда компании Promwad
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/278900
Ссылки в тексте:
[1] из статьи о 54-ФЗ и переходе на онлайн-кассы: https://vc.ru/21624-new-trade-law
[2] главой 90 Налогового кодекса: https://online.zakon.kz/Document/?doc_id=30366217&doc_id2=30366217#pos=1039;5&pos2=22188;24
[3] в приказе министра финансов Республики Казахстан: http://adilet.zan.kz/rus/docs/V14E0009878
[4] Protocol Buffers: https://developers.google.com/protocol-buffers
[5] библиотеку Python-ESCPOS: https://github.com/python-escpos/python-escpos
[6] встраиваемой СУБД SQLite: http://sqlite.org/
[7] библиотека Wt, C++ WebToolkit: https://www.webtoolkit.eu/wt
[8] WtDesigner: https://github.com/juangburgos/WtDesigner
[9] Источник: https://habr.com/post/354442/?utm_source=habrahabr&utm_medium=rss&utm_campaign=354442
Нажмите здесь для печати.