Установка плагина и привязка кассы к заведению

Делается один раз на каждую главную кассу при подключении заведения.

Как устроен «деплой»#

Инсталлятора нет. Плагин — это папка с файлами внутри каталога iikoFront:

C:\Program Files\iiko\iikoRMS\Front.Net\
├── iikoFront.Net.exe
└── Plugins\
    └── SlpPlugin.V9\     ← папка плагина: приезжает готовой внутри архива
        ├── manifest.xml  ← паспорт плагина, без него фронт его не увидит
        └── ... остальные файлы комплекта

При старте iikoFront сканирует папку Plugins\, читает manifest.xml, проверяет лицензию модуля и поднимает плагин в отдельном процессе. Никаких файлов API iiko в комплект плагина класть не нужно — их даёт сам фронт.

Порядок установки#

Шаг 1. Скачать пакет для этой кассы#

Пакет плагина выдаёт личный кабинет заведения: раздел «Касса», шаг 1 — впишите название кассы и нажмите «Выпустить и скачать пакет».

Скачается архив, в котором плагин уже настроен на ваше заведение: адрес облака и ключ этой кассы прописаны внутри. Настраивать что-либо вручную не нужно.

Важно

Пакет выдаётся один раз — сохраните файл. Ключ доступа внутри него нигде больше не хранится, и повторный выпуск создаёт новый ключ: касса, работающая на старом пакете, перестанет выходить на связь, пока на неё не поставят новый.

Шаг 2. Распаковать на кассе#

Распакуйте архив в папку Plugins\. Папка SlpPlugin.V9\ со всеми файлами лежит уже внутри архива — она появится сама, создавать её не нужно.

Важно

Не переименовывайте её. Имя SlpPlugin.V9 — с суффиксом версии API, как у остальных плагинов iiko (Resto.Front.Api.Updater.V9 и прочие), — служба обновления ищет обновления по имени папки: под другим именем плагин будет работать, но обновления на эту кассу приходить перестанут.

Шаг 3. Канал обновлений — ничего делать не нужно#

Плагин подключает себя к каналу обновлений сам при первом запуске: дописывает наш адрес в список источников службы обновления iikoFront. В логе плагина это видно строкой SLP: канал обновлений прописан в ….

Раньше это был ручной шаг, и его пропускали: касса при этом работала, но навсегда оставалась на той версии, с которой её поставили. Если вы ставите плагин версии 0.1.12 или старше — шаг придётся сделать руками. Откройте (или создайте) файл:

%AppData%\iiko\CashServer\PluginConfigs\Resto.Front.Api.Updater.V9\updater.config

и добавьте наш канал в список источников:

<CustomPluginSources>
  <Source Name="SLP gate" Location="https://gate.simple-loyalty-pass.ru/plugin-feed/index.json" />
</CustomPluginSources>

Остальные элементы файла не трогайте. Проверьте, что режим службы обновления включён (<OperatingMode>Enabled</OperatingMode>) — по умолчанию так и есть; выключенную службу плагин сам не включает, только предупреждает об этом в логе.

Шаг 4. Запустить кассу#

Запустите iikoFront. Плагин подхватит настройки из пакета, перенесёт их в папку конфигураций фронта и выйдет на связь — в кабинете касса отметится как «на связи», шаг 1 закроется сам.

В логе плагина появится строка SLP: настройки взяты из пакета кабинета.

Дальше плагин обновляется сам — скачивать архив второй раз не нужно (см. раздел «Обновление плагина»).

Справочно: файл настроек#

Отдельно настраивать плагин не требуется — всё приезжает в пакете. Таблица ниже нужна, только если поддержка попросит что-то проверить в файле slp-plugin.json (папка конфигураций фронта).

ПараметрСмыслПо умолчанию
cloudUrlАдрес облака SLPзаполняется пакетом
terminalTokenКлюч этой кассы — привязка терминала к заведениюзаполняется пакетом
discountTypeIdЛичная скидка вручную по GUID; обычно пусто — названия задаются в кабинетепусто
drainIntervalSecondsКак часто плагин пытается отправить накопленную очередь чеков20 секунд
heartbeatIntervalMinutesКак часто касса отмечается «жива» в кабинете5 минут
qrPrefixУжесточение распознавания QR. Пусто = распознавание по форматупусто
updateManifestUrl, updateChannel, updatePublicKeyBase64Не используются — оставить пустымипусто

Настройки читаются только при запуске — после ручной правки файла кассу нужно перезапустить.

Шаг 5. Настроить iikoOffice (один раз на точку)#

Плагину нужны три типа скидки — по одному на каждую роль. Три, а не один: плагин снимает и ставит «свою» скидку по типу, и на общем типе одна операция стирала бы другую (повторное опознание гостя стёрло бы погашенный купон, гашение купона — списание бонусов).

РольНазвание-шаблонНужна, если
Личная скидка гостяSLP Скидкавы выдаёте гостям личные условия (карточка гостя → «Личные условия»). Уровни скидку не дают
КупоныSLP Купонывы пользуетесь купонами и штампами
Списание бонусовSLP Бонусыгости платят баллами — то есть почти всегда

Названия можно взять свои, но тогда впишите их в кабинете (раздел «Касса») ровно так же, как в iikoOffice.

Каждая из трёх скидок создаётся одинаково, мастером из трёх окон. Откройте iikoOffice → Дисконтная системаСкидки и надбавкиДобавить.

Окно 1 — название и тип.

  • Название — ровно то, что вписано в кабинете (например, SLP Скидка). По этому названию плагин находит скидку на кассе: лишний пробел или другая буква — и он её не увидит.
  • Тип создаваемого элемента — «Скидки и надбавки» (не «Дисконтная карта» и не «Категория гостей»).
  • Далее.

Окно 2 — где действует и кто применяет.

  • Места продаж — «Все места продаж». Если в одной базе iiko несколько точек и вы ограничите список, скидка не заработает на остальных.
  • Галочка «Можно назначать вручную» — обязательна. Без неё скидка не попадает в список доступных на кассе, и плагин применить её не сможет.
  • Галочку «требуется ввод карты» ставить не нужно: гостя опознаёт приложение, дисконтные карты iiko здесь ни при чём.
  • Далее.

Окно 3 — как считается сумма. Это ключевое окно.

  • Способ применения — «К полной сумме заказа».
  • Тип — «Скидка» (не «Надбавка»).
  • Размер — фиксированная сумма, и включите галочку «Назначать сумму» (в разных версиях называется «Указывать сумму при применении» или «Произвольная сумма»). Она означает, что сумму задаёт тот, кто применяет скидку, — то есть плагин, по расчёту облака для конкретного чека. Без неё iiko ждёт фиксированный процент, и применить скидку не получится.
  • Проценты, суммы и расписание заполнять не нужно — их перекроет плагин.
  • Скидка должна быть активна (не в архиве).

Повторите для второй и третьей скидки, меняя только название. Сохраните и выгрузите настройки на кассу (обычная синхронизация iiko). GUID скидок копировать не нужно: плагин присылает список подходящих скидок в кабинет, где вы выбираете нужные в разделе «Касса».

Права кассиров. Разрешите применение этих скидок.

Шаг 6. Проверить#

Запустите iikoFront. В логе должна появиться строка вида SLP: плагин <версия> запущен.

Дальше — короткий проверочный прогон:

ШагОжидаемый результат
Открыть заказ, добавить позиции
Отсканировать QR из приложения гостя (или кнопка «SLP Лояльность» → последние цифры номера)Всплывает окно: гость, баланс, уровень, лимит списания. Гость появился строкой в заказе
Посмотреть чекВ чеке уже стоит скидка списания бонусов (если у гостя есть баллы), а при личных условиях — и его скидка
Уменьшить скидку списания рукамиКасса принимает правку и больше своё число не навязывает
Закрыть чекГость получает начисление и пуш, баллы списываются
Отключить сеть кассы и закрыть ещё один чекЧек закрывается нормально; после возврата сети начисление догоняет
Сделать возврат первого чекаБаллы возвращаются, начисление откатывается

Привязка кассы к заведению: как это работает#

  • Каждая главная касса регистрируется в облаке SLP как терминал заведения и получает собственный секретный токен.
  • Токен — единственное, что связывает кассу с конкретным заведением. Всё остальное (какому заведению начислять, чьи правила применять) облако берёт из токена, а не из данных, присланных кассой.
  • В кабинете заведения по каждому терминалу видно: имя, версию плагина, версию API и время последней активности (lastSeen) — по нему видно, «жива» ли касса.
  • Токен можно отозвать из кабинета. После отзыва плагин на этой кассе перестанет авторизовываться: лояльность выключится, но касса продолжит работать штатно.
  • Если лицензия или подписка SLP у заведения неактивна, токены не выдаются и отзываются — с тем же результатом: касса работает, лояльность выключена.