IceCash на Python. Сервис-сайт-касса и сервис-сайт-драйвер https://github.com/redeyser/IceCash2/wiki
Касса под Linux. Основой является программа - сервис dIceCash, написанная на Python. Эта программа фактически является вебсервером, содержащим один сайт - интерфейс кассовой программы. Сервис можно запустить вручную или проинсталлировать из подпапки /install. При загрузке системы этот сервис запускается автоматически и мы получаем доступ до интерфейса кассы с любого места в сети локальной или интернет. Авторизуясь на кассе, пользователь работает в сессии, которая действует только для этого пользователя. То есть, можно зайти на сайт под одним и тем же пользователем несколько раз, но режим регистрации и некоторые переменные пользователя будут общими. Данные хранятся в БД Mysql. Стандартный порт сервиса localhost:10110. Драйвер Штрих-М допилен под ФЗ-54. Атол еще в работе.
Кроме основной программы и mysql, для работы IceCash необходим сервис DTPrint. Этот сервис взаимодействует с термопринтерами и фискальниками. Фактически он лежит подкаталогом в dIceCash/DTPrint. Он тоже написан на python, имеет свой веб интерфейс, через который можно настроить подключение к принтеру. dIceCash взаимодействует с сервисом DTPrint для печати чеков. Пока DTPrint умеет обращаться с термопринтерами по протоколу escpos и с фискальниками ШТРИХ-М и FPRINT. Сервис также инсталлируется и запускается автоматически. Стандартный порт localhost:10111. Вообще он обменивается по протоколу HTTP/XML. Назрело переписать на json.
Это сервер. Тоже представляет из себя сервис-сайт. На котором можно настраивать фирмы, кассы входящие в эти фирмы, прайсы, группы товаров и группы касс, глобальные реплицирующиеся на кассы переменные, делать централизованный upgrade программы и upgrade окружения, настраивать акции (условия продаж). В IceServ реализован json (или xml, на выбор) протокол обмена данными с кассами и с бэкофисом. По сути, сервер собирает с касс чеки и зет.отчеты, а выдает прайсы, настройки, акции. Для бэкофиса сервер также может по запросу выдать сгруппированный зет отчет или все не выгруженные зет отчеты, чеки, сделать отметку о выгрузке зет отчетов. Ну и, конечно, он принимает от бэкофиса прайсы для раздачи кассам. Также можно использовать файловое хранилище, посмотреть первичные отчеты о чеках. На сассах реализована попытка отправки чеков каждую минуту, та что получается сборка онлайн если есть инет. Главным образом сервер разрабатыватся для сбора данных с торговых точек и обмена с бэкофисом (1с).
Разработка остановилась ввиду смены работы. Вообще планировался легкий сайт для более удобного управления кассами через IceServ и реализация подробных отчетов по чекам. Последнее сделано. Так что есть сайт с админкой и с единственным отчетом по чекам.
Это отдельный сервис-сайт, который реализует интерфейс под тачмонитор для работы с заказами (корзинами). То есть из наполнение и подготовка для загрузки в IceCash. Печатается номер заказа на фискальние или ином термопринтере. заполняется заказ пальцем :) или штрихкод-сканером. Несколько таких клиентов могут одновременно работать с заказами, заполняя их товаром, связывая заказы друг с другом. Далее ставится отметка о том, что он готов. После чего кассир в IceCash увидит этот готовый заказ и загрузит в кассу для дополнения и оплаты. Пока есть только один магазин, на котором это реально работает.
Протестировано только на Debian 8. То есть сначала ставим Debian. На Windows это работать не будет, хотя в теории можно и на винду запилить. Итак, сначала ставим Linux, желательно Debian или Ubuntu. При этом нужно сразу определиться с тем, какова icecash будет у вас. Возможны варианты.
Касса на Linux ОС, с иксами, рабочим столом, браузером и всем что может вам понадобиться на кассе.. Это как раз мой вариант, то есть для которого я все и делал. Если это ваш путь, то создавайте/собирайте ваш десктопный релиз. Браузер лучше chrome или chromium. на нем тестировалось. Я собирал кассу под минималку debian jessie + icewm. Получилось несколько аскетично, но очень быстро и легко администрируемо. Если кому нужно, могу выложить эту сборку. Второй вариант, это кассовый сервис на Linux машине (например на микрокомпьютере и ли сервере), до которого получают доступ пользователи с различных устройств в сети. То есть сервис один, он управляет Базой данных, дает доступ к кассовому интерфейсу для удаленных кассиров и взаимодействует с локально подключенными термопринтерами или сетевыми термопринтерами или с удаленным сервером термопринтеров (DTPrint). Такой вариант я тоже реализовывал. Его преимущества в том, что пользователям можно оставить удобные для них операционные системы и браузеры.
Пинтеры бывают разные. Сервис, с которым работает dIceCash - DTPrint. Этот сервис может управлять термопринтерами, поддерживающими протокол ESCPOS. Часто бывает, что принтер нужно переключить в режим поддержки ESCPOS, причем с помощью отвертки и рук, иногда с волшебными словами :) Способы подключения : SERIAL, USB, NET. Все были когдато оттестированы. На деле - использовались только SERIAL и NET. Фискальные регистраторы, конечно, работают по своему протоколу. С ними все гораздо сложнее. Благодаря двум драйверам (GPL): для Штрих-М и для Fprint взаимодействие с ФРК возможно. Один драйвер (fprint) написан мной с нуля, второй (shtrihm) изначально не мой, но мной дописывался (и не только моной, надо смерджить) На практике, fprint - стабильнее. Совсем новые FPRINT умеют взаимодействовать через NET, в драйвере я это реализовал (но внимание, не net over usb, а реальный Net). Также я сталкивался, с тем, что совсем новые fprint ATOL используют вместо обычных устройств SERIAL over USB ( /dev/serial/...) взаимодействие по USB каналам (in/out) - это в драйвере тоже не реализовано. Хотя реализовать не сложно, но некогда :)
Если принтер подключен по обычному serial, следовательно это один из портов /dev/ttyS*. Если serial over usb, то /dev/serial/by-... или /dev/ttyUSB или ttyACM. При подключении к компу эти устройства должны появиться. А дальше устанавливаем dIceCash. В нем уже содержится сервис DTPrint.
Получается, что первым делом нужно установить сервис термопринтеров DTPrint. Но он устанавливается сразу вместе с dIceCash. Скачиваем последнюю версию dIceCash и распаковываем ее в удобное для вас место. Для работы сервисов необходим MySQL. Первым делом установить mysql-server и введите пароль рута mysql1024 (чтобы не исправлять скрипты инсталляции). Далее заходим в каталог dIceCash/install и выполняем : sh install.sh Нужное доустановится, создадуться базы данных, сервисы пропишутся в systemd. Далее запуск сервиса
systemctl start dIceCash
systemctl start DTPrint
Если нужно посмотреть в консоли за работой сервиса, то останавливаем его и запусаем вручную
systemctl stop dIceCash
python dIceCash.py
Все это рассчитано на работу из под рута. Если вам это не нравится, можете переписать запуск сервиса от другого пользователя, но не забудте добавить права dialout для него. Если сервисы запустились, то по адресу localhost:10111 можно увидеть страницу dtprint, а по адресу localhost:10110 - dIceCash. На dtprint нужно указать пароль для входа : dtpadm. На dIceCash можно зайти под админом admin/678543 или под кассиром kassir/766766.
Вообще принтеры можно добавлять в DTPrint в любом количестве и для разных целей ( не обязательно кассовых ). DTPrint Это всего навсего менеджер управления этими принтерами с более менее унифицированным протоколом XML для всех моделей. Для добавления принтера заходим на вкладку "Принтеры". Жмем на кнопку "Создать новый" и в открывшейся форме вводим данные. Идентификация принтера всегда по наименованию. Выдумываем наименование, затем определяемся с типом соединения. Если у вас принтер подсоединен по реальному serial кабелю или по usb кабелю, который определяется как serial устройство, то это SERIAL :) Принтеры работающие через USB устройства обычно фискальниками не являются. Хотя, недавно столкнулся с таким экземпляром. Сетевые принтеры обычно имеют открытый порт (чтонибудь типа 9100). Ваша задача предварительно настроить ваш на нужный интерфейс. Переключить его в нужный режим, задать ip адрес и порт, перевести в протокол ESCPOS. Указываем serial-порт (они автоматически появляются в списке), скорость, кодировку. Обычно подходит все, что стоит по умолчанию. И жмем сохранить. Принтер появится в списке. Кстати, чтобы это работало, должна быть установлена утилита lsusb (излишество которое можно было бы обойти).
Если это фискальник, то можно сразу попытаться считать статусную информацию на нем, нажав кнопку статус. Если вы увидите таблицу значений, значит фискальник отвечает и подключен правильно, иначе играйтесь со скоростью, портами или паролями пользователя/админа. По кномпке ТЕКСТ можно посмотреть и отредактировать текст в чеке. Кнопка "таблицы" покажет настройки таблиц Штрих-М. Все это можно отредактировать -тыкайте в значения параметров. Также действуют сервисные кнопки синхронизации даты и времени, технологическое обнуление и установка скорости устройства. Еще одно важное дополнение. На Linux вы можете установить тест драйвера от АТОЛ. С его помощью можно настроить принтер. Но сам драйвер с IceCash не совместим, его я использовать не стал - он закрытый и платный.
Можно не настраивать фискальник вручную, а просто выполнить поиск и автоматическую установку в настройках IceCash. Но об этом читайте ниже.
В DTPrint есть вкладка печати, на которой можно выбрать принтер и накидать программу печати, добавляя доступные команды. Затем по кнопке "Печать" выполнить эту программу и оценить результаты. Но эту часть я давно не поддерживаю, драйвера видоизменялись и есть вероятность что, там не все будет работать. По фискальникам так вообще можно только beep проиграть. Но отклик какой-нибудь получить все-же можно. В каталоге dIceCash/utils есть полезные скрипты. Для проверки печати там есть скрипт _sendFAX.py. Пример печати:
echo "12314" | python _sendFAX.py localhost 10111 PrinterName
То есть это будет печатать все что подадите на входной поток. Можно использовать стили печати если добавить последний параметр (просто набор символов, значение каждого ниже)
echo "12314" | python _sendFAX.py localhost 10111 PrinterName bihfw+-*
b - жирная печать
i - инверсная
h - Высокие буквы
w - Широкие буквы
f - Мелкий шрифт
+ - Заголовок со временем
- отрезка бумаги
* гудок
Сервис IceCash будет работать по адресу *:10110. Если вы его установили на микрокомпьютере или сервере, то подключайтесь по его адресу на указанный порт. Пароль админа по умолчанию 678543. Первым делом нужно зайти в настройки. Сейчас они (на момент написания) выглядят весьма хаотично. В самой таблице mysql tb_sets разбиты на категории. Все основные записи настроек создаются при инсталляции. Бывает так, что новая версия (ребилд) требует какой-нибудь настройки, а ее нет. И из за этого версия не работает. В этом случае лучше заглянуть в файл dbIceCash.py в метод _create. Там прописано создание всей базы данных и, в частности - настнроек. Посмотрите все ли настройки есть в вашей рабочей таблице, добавьте нужные. Или пересоздайте базу.
Настройки клиента самые простые. Тут вообще действуют только префиксы бонусных и дисконтных карт, а также site. Префиксы указывают на первые цифры считываемые при сканировании. Если они совпадут с указанными, то касса будет запрашивать бонусную карту с сервера (его бы тоже надо описать) или искать дисконтную в своей базе. SITE - этот параметр указывает какой оснасткой будет пользоваться клиент. Все оснастки должны быть оформлены в виде каталогов внутри icecash. На момент написания этой статьи - оснастки две. site и site_icerest. Последняя была сделана в связи с образовавшимся расширением IceRest. Это касса заказа, которая связана с IceCash.
В настройках ПОЛЬЗОВАТЕЛИ. Можно добавить/удалить пользователей. Есть три уровня доступа. Админский, который предполагает возможность менять настройки, добавлять/удалять пользователей, пароли, выполнять сервисные функции, обмениваться файлами с сайтом. Кассир может частично менять настройки, свой пароль, полноценно работать с регистрацией продаж. Продавец может лишь набить чек, отложить его или загрузить, но не может его платить. Также пользователю можно прописать свой css, который должен лежать в каталоге site/css. Например, в IceCash есть два css файла blue.css - он по умолчанию, и black.css. Если название файла прописать в окошке пользователя css и сохранить, он тутже применится. В mysql таблице пользователей есть поле printer. А в альтерналивной оснастке site_icerest это поле можно заполнять в настройках пользователя. В IceRest таким образом реализована печать на дополнительных термопринтерах, закрепленных за пользователями.
В этих настройках можно осуществить автоматический поиск ФРК. Для этого в системе нужно установить lsusb. Конечно, правильнее было бы сделать все средствами python, но сделано уже так :). Поиск устройств будет происходить только serial over usb АТОЛ и ШТРИХ-М. Нажмите на автоматический поиск принтеров. Если DTPrint найдет что-либо, то в списке доступных принтеров появятся новые позиции. По сути DTPrint сам создаст эти принтеры в своей базе. Скорость можно настроить только используя интерфейс DTPrint. Если у вас принтер подключен не по usb, то все настройки нужно производить в DTPrint.
Если нужно работать без фискальника, то можно выбрать принтер None. Чеки просто будут писаться в базу транзакций, зет отчеты будут обнулять наличность и создавать соотвествующие записи в БД. Если при выборе принтера вы видите информацию о дате, времени, заводском номере - значит принтер определился правильно. Если все таки фискальник выдает ошибку, вполне возможно, что не верно введены пароли.
Еще один важный момент. В DTPrint все АТОЛЫ настраиваются по ширине символов автоматически, а Штрих-М нужно выставлять ширину самостоятельно (бывают 30,36,42,48 символов). Если вам удалось подключиться к ФРК, то можно взглянуть на некоторые внутренние настройки принтера через меню Статус. Также будет доступно редактирование Текста в чеке через пункт Текст в чеке.
В пункте настроек Магазин желательно ввести ИНН, КПП, Адрес ТТ, Наименование организации (KPP,INN,placename,orgname). Эти данные могут выводится в заголовке чека, если установить соотвествующую настройку в пункте настроек Оборудование. Также эти данные используются при отсылке чека в ЕГАИС (если он у вас есть).
Важно ввести номер точки (idplace) и номер кассы (nkassa) эти два идентификатора свяжут эту кассу с IceServ. Все транзакции локально тоже будут писаться с этими идентификаторами. Если они сменятся, то в БД с этого же момента будут добавляться новые записи с новыми идентификаторами. Это можно было бы использовать, если окончательно развести несколько касс внутри одного интерфейса. То есть, если привязать номер кассы к кассиру одной и той же БД (экземпляра dIceCash). Но этого в IceCash реализовано не было. Экземпляр dIceCash работает только с одним общим номером кассы, который одинаков для всех пользователей. Кому хочется, может легко поправить алгоритм. Правильная идентификация при взаимодействии с IceServ позволит получать точную, адресную информацию. Прайс точки, Акции точки.
Поле pricenum содержит идентификатор подгруженного прайса (дата+время). Дополнительные настройки, которые обновляются с сервера IceServ, могут находится как в этом, так и в других разделах настроек. Например, я обновляю уличную температуру (temperature). И версию самого IceCash, (version) которая доступна для обновления (Свою версию экземпляр берет из констант в программе). Система репликации настроек с сервера подразумевает параметр sets в настройках - по сути это id последнего изменения на сервере.
Еще имеет смысл обратить внимание на параметр begin_time. По умолчанию здесь указано 6:00 - время пересменка. Это нужно для того, чтобы снятый зет отчет вычислил дату суток к которым он относится. То есть если снят до 6:00, то это предыдущая дата. С этой датой он выгрузится на сервер.
- server_port - Порт, котором будет висеть сервис dIceCash
- egais_ip - Адрес по которому расположен сервис УТМ ЕГАИС. То есть это может быть удаленный комп. Если УТМ на кассе, то этот параметр равен localhost.
- backoffice_ip,backoffice_port - Это адрес и порт dIceServ. Также предполагается, что бонусный сервер расположен на backoffice_ip.
- dtprint_ip,dtprint_port,dtprint_passwd - Стандартные настройки сервиса DTPrint. Понятно, что он тоже может находится на другом компьютере (даже не обязательно рядом с принтерами, если последние NET)
- bonus_port - Порт, на котором висит сервер бонусов dIceBonus. Это отдельный сервис, он не входит в IceServ. Его можно тоже найти на git
- icerest_ip - Адрес, на котором висит сервис касс заказов dIceRest. IceCash в связке с IceRest может добавлять набранные заказы в чек.
- regid,reg_password - Авторизация на IceServ. regid - единый на филиал/организацию, reg_password также единый клиентский пароль.
- version,upgrade,temperature - обновляемые серверные переменные. Таких может быть сколько угодно, их можно добавить в IceServ.
В разделе Оборудование можно настроить сканер если он не клавиатурный, а serial. Выбираем устройство из списка. Такой сканер заработает только после перезапуска сервиса systemctl restart dIceCash. И при условии что была установлена утилита xvkbd . В конце файлика dIceCash.py вот такие строки
if db.sets['dev_scanner']!='None' and db.sets['dev_scanner']!='':
startservice("su kassir -c \"python serialtokbd.py %s\"" % db.sets['dev_scanner'])
Это предпоЛАГАЕТ что у вас есть пользователь иксовый kassir. Но это может быть не так и тогда не заработает. Поэтому, можно тупо запустить в вашей сессии автозапуском после иксов чтото типа: python serialtokbd.py /dev/ttyS0&
Согласен, что это совсем не изящный подход и можно сделать лучше. Но у меня и сканеров таких-то уже нет :).
Из остального в этих настройках действуют только следующие:
- "Использовать нож" - влияет только на свободную печать (то есть если у вас не ФРК) и на печать копии чека
- "Игнорировать ошибки" - лучше всегда выставлять НЕТ. Игнорить фискальник не желательно, будут расхождения.
- "Не печатать номер чека" - В заголовке не будет выводится номер.
- "ОФД" - Да это оно самое. Включает алгоритм по которому задействуются другие методы драйвера.
В сервисе можно проверить обмен данными. Принять прайс, выгрузить транзакции, зет-отчеты. То есть разово и вручную. Но вообще-то лучше это настроить в crontab и все обмены будут делаться автоматически и с некоторой регулярностью. При таком обмене сначала будет запрашиваться номер последних изменений - копеечный объем информации, и только если есть необходимость - будут загружены/выгружены новые данные. Пример файла crontab должен лежать в этом же каталоге. Вот его содержимое:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
ICEDIR=/home/kassir/dIceCash
# upload
# Каждую минуту выгружать чеки
*/1 * * * * kassir cd $ICEDIR && python dUpload.py dw_checks
#Каждые пять минут выгружать зет отчеты
*/5 * * * * kassir cd $ICEDIR && python dUpload.py dw_zets
#Каждые 10 минут проверять и загружать прайс
*/10 * * * * kassir cd $ICEDIR && python dUpload.py dw_price
#Каждые 12 минут проверять и загружать акции
*/12 * * * * kassir cd $ICEDIR && python dUpload.py dw_actions
#Каждые 14 минут проверять и обновлять серверные переменные
*/14 * * * * kassir cd $ICEDIR && python dUpload.py dw_sets
#upgrade
#Каждые 15 минут проверять и обновлять программу
15 * * * * root cd $ICEDIR && python dUpload.py dw_upgrade_prog
#Каждые 15 минут проверять и обновлять систему
16 * * * * root cd $ICEDIR && python dUpload.py dw_upgrade_base
#egais
#Каждые 10 минут проверять работает ли УТМ ЕГАИС и перезапускать его если не работает
*/10 * * * * kassir cd $ICEDIR && python dUpload.py restart_egais
#Каждые 15 минут производить обмен окументами с УТМ ЕГАИС
*/15 * * * * kassir cd $ICEDIR && python dUpload.py ex_egais
#Каждые 30 минут проверять есть ли новые документы ЕГАИС и оповещать пользователя о них. (нужна утилита gmessage)
30 * * * * kassir cd $ICEDIR && python dUpload.py vf_egais
То есть все обращения к скрипту dUpload.py, который входит в IceCash. Если у вас нет ЕГАИС или вы не используете Акции, обновления, то это можно отключить.
Чеки накапливаются в БД и имеют структуру в виде заголовка и его содержимого. То есть это не совсем транзакции, в обычном понимании. Каждый чек (конкретно его заголовок) после добавления в БД имеет флаг выгрузки равный нулю (up=0). Если вы вручную или через скрипт выгружаете чеки в бэкофис (не обязательно IceServ), то из IceCash при разовом обращении будут выгружаться первые 100 из невыгруженных чеков. Если накопилось много, то постепенно, по 100 чеков в минуту, они все выгрузятся. Если выгрузка прошла успешно, то чеки помечаются как выгруженные (up=1) и больше не выпадают в запрос о выгрузке. Чеки содержат много подробной информации, их сборка на сервере позволяет делать оперативные отчеты о чеках/выручке. Для человеческого взаимодействия с разного рода IceServ информацией , я начал писать IceSITE.
Реализовал один сложный отчет по чекам, на этом благополучно закончил, уволился и улетел работать в другой регион :) (но это уже другая история).
Просмотреть чеки, конечно, можно и в самом IceCash и в IceServ, но выборки там очень примитивные.
Отчеты создаются, когда вы их снимаете. Вы можете это сделать с фискальником или без него. Но зет отчет при этом появится в БД, сумма наличности обнулится. В разделе отчетов можно сделать выборку и посмотреть список зет отчетов и их содержимое - детально по товарам. Зет отчеты, также, как и чеки имеют флаг о выгрузке, который выставляется в закрытое (up=1) положение при удачной выгрузке на сервер. То есть здесь сама касса производит полный расчет зет отчета и отсылает его в виде xml или json по простому запросу. Подробнее об этом читайте в разделе "Обмен данными". Моя схема такова, что все собирается в IceServ, а уже из IceServ можно получать зет отчеты в 1c. Я не сильно шарю в 1с, обработку по загрузке и выгрузке из 1с писал знакомый 1с овщик. Думаю, можно будет выложить примеры этих обработок.
Это самая сложная часть. На сервере IceServ создаются идентификаторы прайсов и, скажем некая 1C (very.back.office) выгружает конкретный прайс в IceServ. тот его упаковывает и параллельно обновляет в mysql (для запросов по чекам). Также, каждая выгрузка меняет время прайса и таким образом он становится востребованным для скачивания торговой точкой. Каждая касса, созданная в IceServ привязывается к конкретному прайсу. Когда точка обращается к IceServ за прайсом, то сервер выдает по необходимости ей тот прайс, который закреплен за ней. то есть прайсовых настроек на кассе вообще нет, они на сервере. И меняются там-же. Файл загружается в zip, поэтому в вашей системе должен быть unzip. Далее он распаковывается и обновляется. Подробно о структуре прайса и его загрузки/выгрузке читайте в разделе "Обмен данными".
Акция - это условия и алгоритмы наложения изменений на чек до или после его расчета. Оформлено оnдельным модулем actIceCAsh.py, имеет свои таблицы и язык. То есть команды, параметры, описанные в модуле. Все это, с примерами смотрите в разделе "Акции".
Переменные на сервере создаются с разной целью. Это связано с какими-то нововведениями в программу, имеющими глобальный характер. Например, у меня была акция, которая ориентировалась на текущую температуру. Температура в виде переменной раздавалась с сервера. Также я храню версию последнего релиза на сервере и это позволяет делать автоматическое обновление программы или окружения.
Вообще, когда часто дорабатываешь проект нужно первым делом озаботится обновлением. У меня обновление происходит путем обновления переменной version с сервера и сравнивания ее с текущей версией программы. Если версия устарела, то отдельным процессом останавливаются сервисы dIceCash,DTPrint и каталог dIceCash переименовывается в каталог с символом "_". Затем скачивается, распаковывется и запускается новая версия. Пользователю выдается сообщение на икс экран (если установлен gmessage) о том что произошло обновление. В остальном, можно работать дальше на сайте IceCash без каких либо дополнительных действий.
Отдельно от программы обновляется окружение. dUpload.py dw_upgrade_base. Для этого на сервере есть переменная update. Если она меняется, то скачивается архив со скриптами обновления (например dIceServ/site/script/iceupd_001.tar.bz2). Скрипты распаковываются и запускаются от рута. Выполнятся скрипты начинают с install.sh и могут устанавливать, удалять программы, обновлять структуры таблиц. Процесс обновления можно детально посмотреть в исходниках. dIceCash.py.
Каждое обращение к серверу сопровождается отправкой короткой информации в json о состоянии кассы. Модель принтера, версия программы, версия обновления окружения, фиксируется время обращения. Поэтому в IceServ, при настроенном автоматическом обновлении данных на кассах, можно видеть актуальную информацию о всех объектах и оценить их online доступность. У меня все объекты в VPN, доступ до любой кассы происходит во вкладке браузера в одной сети.