Интеграция сайта и прочего ПО с онлайн-кассами

в 15:21, , рубрики: C#, VikiPrint, Драйвер, онлайн-кассы, разработка под windows, ФЗ54

Онлайн касса Хочу поделиться опытом разработки ПО для бюджетной онлайн-кассы VikiPrint 57. В связи с вступлением в силу закона ФЗ-54, это может быть актуально и полезно техническим специалистам, которые впервые в жизни выполняют задачу по интеграции ПО или сайта с физическим оборудованием. Особенно с этих онлайн-касс «бзднут» вебмастеры, разрабатывающие на WordPress магазины и по-другому понимающие термин «онлайн».

Да, судя по всему, когда вы что-то заказываете в Интернет-магазине, в каком-то бутике в ТЦ сам по себе будет «вылазить» чек из кассы. Иначе владельца магазина оштрафуют. Если, конечно, ничего не изменится в головах тех людей, кто это придумал. Просто чудо как оно есть!

Тезисы для тех, кто не понимает о чем речь:

  • Через месяц федеральный закон 54 обязует перейти весь бизнес со старых ККМ на новые, с приставкой онлайн;
  • Через год, в 2018 году, онлайн-кассу обязуют купить даже тех, чей тип налогооблажения позволяет сейчас не использовать ККМ совсем (например — ЕНВД);
  • Стоимость онлайн кассы — от 20 тыс. рублей; Из них 7 тысяч рублей — это, собственно, инновации в виде встроенной флешки и шифрующего устройства;
  • Онлайн-кассы шлют данные о каждой продаже операторам фискальных данных (ОФД) — это посредники между налоговым органом и бизнесом, стоимость столь нужной услуги — от 3 тыс. рублей в год;
  • В целом, новые онлайн кассы — это старые кассы в новом корпусе и с новым видом фискального накопителя. Просто все упаковано маркетологами в «продукт». Нередко в «продукт» к онлайн-кассе упаковывается китайский планшет, который служит интерфейсом взаимодействия с кассой.

Устройство онлайн-кассы

Итак, изменилось лишь устройство хранения информации внутри кассы, формат корпуса и названия юрлиц, которые производят и продают эти кассы (сами организации физически не поменялись). Теперь устройство умеет получать, шифровать и отдавать данные. Онлайн онлайном, а данные о покупках все равно хранятся внутри устройства. Черный ящик с данными стоимостью 7 тыс. рублей нужно менять раз в 13-36 месяцев. Теперь в нем хранятся еще наименования продуктов и артикул, наценка, скидка, тип налога и т.д. До 2021 года точные данные не обязательны, можно продавать товары вида «LOL — 10 рублей.», все пока по-игрушечному.

Подключение онлайн-кассы к компьютеру

Касса подключается к компьютеру через COM-порт. Никто из производителей не хочет дорабатывать все, что внутри корпуса, поэтому нормальных касс для компьютера с USB интерфейсов нет, все ориентировано на старые POS-терминалы. Если COM-порта в вашем компьютере нет, на сайте производителя сайта можно скачать костыль, эмулятор COM-порта для USB, большинство касс продаются с USB проводом в комплекте.

Если работаете с USB VikiPrint, обязательно прочитайте про танцы с бубном чуть ниже. Как взаимодействует с ОФД АТОЛ и Штрих-М — пока не могу сказать.

После подключения, с кассой можно взаимодействовать напрямую через команды, переданные на виртуальный COM порт (они должны быть описанные в документации). На сайте производителя можно скачать высокоуровневый драйвер для вашей ОС, — с ним, конечно, будет повеселее.

Принцип работы кассы

Принцип работы, в целом, одинаков для всех касс (и онлайн и не онлайн). Чтобы пробить чек, нужно:

  1. Открыть документ определенного типа (сервисный, регистрация продажи, отмена покупки и т.д.);
  2. Занести в документ позиции: артикул, наименование, цена, количество;
  3. Внести деньги в кассу;
  4. Внести скидку в кассу, если это необходимо. Есть два вида скидки: процент и фиксированная сумма;
  5. Вывести итог;
  6. Закрыть документ.

Так оно все работало и раньше, но теперь онлайн-кассы печатают также QR код при закрытии документа и появилась возможность указать E-mail покупателя. Кассы, с которыми я работал, не умеют отправлять чек ни по СМС ни по почте. Пока что это задача кассира, программы или ОФД. Хотя, возможно, скоро появятся варианты со встроенной СИМ-картой.

На основании внесенных данных, касса формирует чек и печатает его на термопринтере. Далее, отправляет в ОФД. ОФД моментально перенаправляет данные в налоговый орган.

Интеграция ПО с онлайн кассой

Порядок действий таков:

  1. Скачать на сайте производителя нужный тип драйвера (для Windows, как правило, выпущен обычный dll);
  2. Скачать документацию на драйвер, ознакомиться с основными публичными интерфейсами. Реально все не очень сложно, быстро сможет разобраться даже веб-разработчик, далекий от физического оборудования;
  3. Импортировать dll в ЯП, на котором вы пишите. Это возможно даже в PHP, особенно удобно работать с Active-X драйверами.
  4. Слать COM-порту через высокоуровневый драйвер нужные команды. Для некоторых ОС некоторые производители касс еще не выпустили драйверы, — в этом случае придется писать свой драйвер или ждать;
  5. Скачать сервисную утилиту (в случае с VikiPrint — Fito), через нее подключиться к кассе и задать в настройках ОФД нужные URL и порт. Все настройки можно найти на сайте ОФД.

При этом нужно иметь в виду, что:

  • В документации может быть одно, в примерах второе, а по факту вообще третье. В случае с VikiPrint, разработку я вел методом тыка. У АТОЛ сравнительно хорошие драйвера и документация почти всегда соответствует действительности. Кстати, Эвотор — это по факту Атол с упаковкой от маркетологов Сбербанка;
  • Мир драйверов выглядит так, как UI на скриншоте ниже. Любителям мира продуманных интерфейсов лучше держаться подальше от этого наркоманского района:

    Интеграция сайта и прочего ПО с онлайн-кассами - 2

Пример интеграции с программой на C#

Далеко не всем магазинам нужны POS-терминалы. Тем людям, которые сейчас не используют кассовую технику (в том числе владельцы ИМ без офлайн точки совсем), придется таки купить кассовый аппарат до июня 2018 года, закон больнее всего ударит именно по таким предпринимателям. Также, скорее всего, придется почесать репу и нам, разработчикам, чтобы заинтегрировать онлайн-кассу в бизнес, которому чужда кассовая техника.

Опенсорс-часть компании, где я тружусь, решила поиграть в Win-Lose игре на стороне лузера и приступила к разработке бесплатной программы без лишнего функционала для тех, кому все это навязывают. Программа подойдет тем, у кого уже стоит компьютер в торговом зале для выполнения повседневных задач администратора — общение с клиентами в соц. сетях, использование программ подбора товара и т.д. Чуть позже добавим функционал взаимодействия с Интернет-магазином и пример модуля для какой-нибудь популярной CMS.

Программа называется Движ.Кассир, исходный код на C# открыт. Нас интересует папка drivers, в ней лежат классы, реализующие интерфейс взаимодействия с драйвером: Atol.cs и VikiPrint.cs. Первый использует высокоуровевый драйвер в виде Active-X компонента, все достаточно просто и соответствует документации на сайте производителя. Второй может оказаться более полезным для разработчиков, потому что работает со свеженаписанным драйвером, который опубликовали на сайте и закрыли там комментарии. И никто, видимо, не может теперь сказать им там, что инструкция к этому файлу не соответствует действительности. Тех. поддержка работает по скрипту и всех отшивает со словами «все заняты, мы вам перезвоним.» Думаю, к 2018 году все будет работать более стабильно, понятно и надежно, а пока пришлось немного попотеть и применить методы тыка, чтобы импортировать эту dll в C# класс.

Примерно вот так DLL любого драйвера кассы импортируется в C#, см. PiritLib.cs:

//openPort
[DllImport("PiritLib.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int openPort(string fileName, int speed);

//commandStart
[DllImport("PiritLib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int commandStart();

[DllImport("PiritLib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int libAddDiscount(byte typeDiscount, string nameDiscount, int sum);

Далее, с PiritLib можно удобно работать через более дружелюбный класс VikiPrint.cs, который наследует PiritLib и в конструкторе сам на автомате открывает порт.

    //Создаем объект драйвера, передавая имя COM порта и его скорость
    drivers.FiscalInterface driver = new VikiPrint("COM5", 57600);
    //Открываем документ типа регистрации покупки:
    driver.OpenDocument(2); 
    //Регистрируем нужный товар (название, артикул, кол-во, цена, номер позиции):
    driver.RegisterProduct("Кроссовки", "33111", 1, 2099, 1);
    //Регистрируем скидку (тип, примечание и размер). Типы: 0 - процент, 1 - фикс.
    driver.RegisterDiscount(1, "За то, что ты был хорошим поцом", 1);
    //Выводим итог
    driver.PrintTotal();
    //Регистрируем занесение в кассу денег (сумма, тип оплаты)
    driver.RegisterPayment(2099, 0);
    //Закрываем документ. При этом печатаетcя QR код
    driver.CloseDocument();

Теперь нужно собрать вашу программу и настроить взаимодействие с кассиром через GUI или с сайтом через REST. Обмен должен происходить раз в N минутчасовнедель, касса должна слатьпечатать все чеки скопом. Формально чек должен отправиться в ОФД сразу, но, понятно, из-за отсутствия Интернета или по другим техническим причинам, это может произойти через какой-то промежуток времени. Никакой конкретики в законе пока нет, все очень сыро. Есть еще такой нюанс — если в течение месяца касса не отправила ни одного чека, фискальная память блокируется (во всяком случает, так хотят законотворцы).

Если программа напечатала первый чек — я вас поздравляю. Дальше нужно потанцевать с бубном, чтобы чек отправился еще и в ОФД через Интернет.

Танцы с бубном

Большинство бюджетных онлайн-касс — это старые кассы без возможности соединения с Интернетом напрямую (нет нужного порта). Поэтому существует костыль под названием ComProxy. Данная программа запускает сервис, который служит прокси для дополнительных виртуальных COM-портов, именно через эти порты касса получает Интернет с компьютера и отправляет свои данные в ОФД. Танцы с бубном описаны в этой статье.

В итоге, после недели фейспалма, мне удалось все настроить — после обмена данными между цепочкой физических устройств и серверов, я увидел тестовые покупки в личном кабинете в ОФД. Надеюсь, статья будет полезна другим. Скидывайте, пожалуйста, в комменты примеры интеграции на других ЯП и с другим оборудованием.

Автор: Илья

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js