API Set10 ◾️ FAQ (Часто задаваемые вопросы)

Публичное пространство

API Set10 ◾️ FAQ (Часто задаваемые вопросы)

Статья будет пополняться по мере поступления запросов.

Кейс

Решение и описание

Кейс

Решение и описание

Лицензирование плагина

Как лицензируются плагины API Set10?

Основная информация о лицензировании плагинов содержится в статье https://crystals.atlassian.net/wiki/x/A4CMYQE.

Настройки плагина

Где хранится настройка/параметры плагина?

Параметр или настройку можно хранить в настройках в IntegrationProperties properties

Добавление настройки: properties.getServiceProperties().set(key, value)

Чтение настройки: properties.getServiceProperties().get(key)

Настройки/параметры хранятся в базе данных кассы и не сбрасываются при перезагрузке кассы.

Где хранятся параметры для настройки плагина? Какие есть требования к настройкам?

Параметры для работы плагина принято хранить в настройках плагина, для возможности их дальнейшего конфигурирования через визуализацию сервера SR10. Перечень настроек для каждого плагина задается в файле metainf.xml. Подробности в статье API Set10 ◾ Файл манифеста плагина (metainf.xml).

Возможные ошибки

Ошибка Cannot load plugin info from jar

Не совпадает информация о типе плагина, указанная в metainf.xml, с имплементацией в коде: указан плагин другого типа.

Например, в metainf.xml указано <PaymentPlugin .... В классе плагина (неправильно) - implements TechProcessPlugin.

Правильно: implements PaymentPlugin.

После загрузки плагина возникает ошибка Required params not set for...

Плагин имеет возможность работать с настройками всего сервиса и с настройками конкретного плагина (в одном сервисе можно сделать несколько плагинов: оплат, лояльности и т.п.). Доступ к общим настройкам (всего сервиса) можно получить путем вызова метода getServiceProperties. Доступ к настройкам плагина можно получить путем вызова getPluginProperties.

Указанная выше ошибка появляется в случае, если использовать не тот метод. Например, вместо getServiceProperties был использован getPluginProperties.

Плагин на кассе не активируется (не работает). Где посмотреть логи плагина?

На кассе откройте лог-файл плагина /home/tc/storage/crystal-cash/logs/plugins.log и просмотрите на предмет наличия ошибок.

Как правильно логировать ошибки плагина?

Логировать необходимо через логер SR10, реализацию логера можно добавить следующим образом:

import org.slf4j.Logger; @POSPlugin(id="foo.service.payment") public class FooPaymentPlugin implements PaymentPlugin { @Inject private Logger log; ...

Создание и тестирование плагина

Как протестировать плагин?

 Чтобы протестировать плагин поместите его в виде jar-файла в папки:

  • для серверов SetCentrum и SetRetail в папку /var/lib/jboss/plugins;

  • для касс в папку /home/tc/storage/crystal-cash/plugins

  • настройте плагин на сервере;

Перезагрузите кассовый модуль.

Как проверить возможность работы плагина при отключенной сети или эмулировать отсутствие интернета на кассе?

 

Обратите внимание, что команда tce-load может быть использована только для ОС tinycore. При работе с кассой на ОС Ubuntu для этой цели по умолчанию используется команда iptables.

Выполните команды:

1. tce-load -i iptables

2. Выключить соединение sudo iptables -A INPUT -s 172.29.1.13 -j DROP

3. Включить соединение sudo iptables -D INPUT 1

Как правильно подключить внешние библиотеки, например, API клиентов – через pom.xml/gradle или через config.json?

Подключать библиотеки можно через pom.xml/build.gradle. Подробнее с темой можно ознакомиться в примерах плагинов в API Set10 ◾️ Ресурсы для разработчика и в javadoc https://crystalservice.github.io/Set10API/.

Отправка данных в ERP

В Set10 есть группы продаж, похожие на сегменты в 1С. Как можно отправить информацию о группах из плагина в ERP?

Пример метода извлечения групп товаров, в аргументе переданы товары, которые берутся из состава чека:

public List<Group> getGoodsGroupByLineItems(List<LineItem> lineItems) { return lineItems.stream() .map(item -> item.getMerchandise().getGroup()) .collect(Collectors.toList()); }

В Set10 есть собственные рекламные акции (кассовые механики), информацию о них можно было бы передавать как метку на
процессинг для расчета скидок. Возможно в плагине можно получить рекламные акции для товара?

Да, при расчете скидок. В блоке чека discounts есть перечень РА по позициям. Плагин может посмотреть данные, но не изменять. Подробности в статье Экспорт результатов расчета скидок из SetRetail10 в ERP (веб-сервис на стороне SetRetail10).

Отправка данных в SetAPI

Возможно ли передавать дополнительное свойство для товара и отображать его в SetAPI?

  1. В плагине тех. процесса или оплаты можно получить additionalProperties. Например:

Map<ru.crystals.pos.spi.receipt.LineItem, Map.Entry<ru.crystals.pos.spi.receipt.Merchandise, Map<String, String>>> itemToAdditionalProperties = paymentRequest.getReceipt().getLineItems().stream() .collect(Collectors.toMap( LineItem item -> item, LineItem item -> new AbstractMap.SimpleEntry<>( item.getMerchandise(), item.getMerchandise().getAdditionalProperties() ) ));
  1. Для товарного плагина: для товара в таблице _Table.jpgcg_product_setapi в plugin_id указывается, в какой товарный плагин требуется отправить запрос для валидации данного товара. Товар должен иметь тип ProductSetApiEntity.

Работа с чеком

Каким образом осуществляется передача информации для отправки эл.чека?

  1. В плагине при поиске карты для держателя карты требуется реализовать установку e-mail и/или номера телефона https://crystalservice.github.io/Set10API/ru/crystals/pos/api/card/CardHolderEntity.html#setEmail-java.lang.String-, а также задать доступные способы передачи чека https://crystalservice.github.io/Set10API/ru/crystals/pos/api/card/CardHolderEntity.html#getReceiptFeedbackTypes--.

Пример:

/** * На основе переданного экземпляра {@link BuyerInfoResponse} создаёт экземпляр {@link CardHolderEntity}. * * @param buyer экземпляр {@link BuyerInfoResponse}, из которого нужно создать экземпляр {@link CardHolderEntity} * @param allowOnlineReceiptFeedback разрешить отправку чека по email, отказавшись при этом от его печати * @return созданный экземпляр {@link CardHolderEntity} или null, если такой не может быть создан из переданного аргумента. */ public static CardHolderEntity createCardHolder(BuyerInfoResponse buyer, boolean allowOnlineReceiptFeedback) { if (buyer == null) { return null; } CardHolderEntity cardHolder = new CardHolderEntity(); cardHolder.setFirstName(buyer.getFirstName()); cardHolder.setLastName(buyer.getLastName()); cardHolder.setMiddleName(buyer.getMiddleName()); cardHolder.setEmail(buyer.getEmail()); if (allowOnlineReceiptFeedback && StringUtils.isNotBlank(cardHolder.getEmail())) { cardHolder.getReceiptFeedbackTypes().add(ReceiptFeedbackType.BY_EMAIL); } return cardHolder; }
  1. В шаблоне кассы включить настройку включено на сервере.png Использовать анкетные данные покупателя для отправки электронной копии чека. Подробнее SetRetail10 ▪️ ОФД ◾️ Отказ от печати бумажных чеков.

Какие существуют рекомендации для подстановки реквизитов без согласия на отправку чека для внешних процессингов?

Ответ подробно описан в запросе API Set10 ◾️ FAQ (Часто задаваемые вопросы).

Разрешения и доступы плагинов

Какие плагины имеют доступ к UI и могу манипулировать интерфейсом кассы?

Манипулирование UI доступно в рамках методов плагинов, которые возвращают результат через callback. Подробности в javadoc https://crystalservice.github.io/Set10API/.

Может ли плагин отправлять http-запросы к внутреннему ресурсу?

В любом плагине возможно реализовать обращение к внутреннему ресурсу. Но стоит учитывать негативные сценарии, например, долгий ответ, ошибка и т. д., что может привести к замедлению работы кассы.

Можно ли в сам плагин встроить прямые API-запросы к сторонним сервисам?

Да, допускается обращение во внешние процессинги. Но учитывайте негативные сценарии из пункта API Set10 ◾️ FAQ (Часто задаваемые вопросы).

Кастомизация и брендирование

Как кастомизировать текстовые сообщение от плагина на экране кассы? Где находятся ключи для подстановки текста?

  1. Для плагина существует дефолтный механизм локализации, подробности в статье API Set10 ◾ Руководство разработчика по созданию плагинов Set API. Все названия ключей локализации вносятся разработчиком при создании плагина и хранятся в strings_ru.xml.

  2. Если необходимо точечно изменить сообщения плагина, то имеется механизм переопределения локализации (=кастомизации текстов) Для выполнения кастомизации текстов:

    1. Скачайте файл для кастомизации текстов на русском языке или для кастомизации текстов на английском языке.

    2. Найдите и скопируйте требуемые ключи локализации в файле strings_ru.xml.

    3. С помощью инструмента расшифровки переведите текст, который будет отображаться, из кодировки UTF-8 в Unicode Escape → скопируйте расшифровку.

    4. В файл кастомизации вставьте ключ локализации и получившуюся расшифровку, чтобы получилась пара следующего вида:

      card.plugin.name=\u041f\u043b\u0430\u0433\u0438\u043d\u0020\u043a\u0430\u0440\u0442\u0020\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e\u0020\u043a\u043b\u0438\u0435\u043d\u0442\u0430
    5. Сохраните изменения в файле → загрузите файл на сервер в папку /set10_home/nginx/html/crystal-cash/config/localizations.

    6. Перезагрузите кассу.

Плагин лояльности

Применение позиционного купона: как передается номер позиционного купона?

При поиске позиционного купона в плагинах в SetAPI в запросе CardSearchRequest#getLineItem() будет передана позиция, к которой будет применяться купон. Позиционный купон может быть применен только к одной единице товара, поэтому если в чек добавляется несколько единиц товара, то товар с примененным позиционным купоном выделяется в отдельную позицию и с другими позициями далее не схлопывается.

Примененный позиционный купон будет доступен у позиции в LineItem#getPositionCoupons().

Возможно ли осуществить транспорт данных между собственной системой клиента (ERP и бонусная система) и бонусной системой Set (списанные/начисленные бонусы, закрытые чеки и т. д.)?

Возможно, с помощью механик API.

Плагин оплаты

При попытке оплаты через плагин оплат на кассе возникает ошибка Выполняется другая транзакция, пожалуйста попробуйте позже, и метод doPayment() вызывается повторно с теми же параметрами. Почему возникает ошибка, и как ее устранить?

Требуется включить параметр showSumEnterForm - отображение формы подтверждения суммы. При этом действует запрет редактирования суммы - настройка activeSumEnterFormPayment.

Функциональный плагин

К какому событию возможно привязать запрос промокода на кассе? Можно ли запрашивать промокод по какой-то горячей клавише?

Можно запрашивать по клавише в любой момент работы с чеком (кроме оплаты). Для этого необходимо реализовать плагин функции для функциональной кнопки вызова окна с клавиатурой. После ввода касса проверит, что это купон, добавит его в чек и сделает перерасчет скидок. Пример интерфейса SetAPI:

/ * Интерфейс функционального плагина (плагин-функция) */ public interface FunctionPlugin { / * Вызов плагина * @param request необходимые данные и реализация callback интерфейса */ void execute(FunctionRequest request); /** * Проверяем доступность * @param receipt текущий чек, если есть и доступен * @return результат проверки {@link FunctionEnableResult} */ default FunctionEnableResult enabled(Optional<Receipt> receipt) { return new FunctionEnableResult(); } }