Публичное пространство
API Set10 ◾️ FAQ (Часто задаваемые вопросы)
Статья будет пополняться по мере поступления запросов.
Кейс | Решение и описание |
|---|---|
Лицензирование плагина | |
Как лицензируются плагины API Set10? | Основная информация о лицензировании плагинов содержится в статье https://crystals.atlassian.net/wiki/x/A4CMYQE. |
Настройки плагина | |
Где хранится настройка/параметры плагина? | Параметр или настройку можно хранить в настройках в Добавление настройки: Чтение настройки: Настройки/параметры хранятся в базе данных кассы и не сбрасываются при перезагрузке кассы. |
Где хранятся параметры для настройки плагина? Какие есть требования к настройкам? | Параметры для работы плагина принято хранить в настройках плагина, для возможности их дальнейшего конфигурирования через визуализацию сервера SR10. Перечень настроек для каждого плагина задается в файле metainf.xml. Подробности в статье API Set10 ◾ Файл манифеста плагина (metainf.xml). |
Возможные ошибки | |
Ошибка | Не совпадает информация о типе плагина, указанная в metainf.xml, с имплементацией в коде: указан плагин другого типа. Например, в metainf.xml указано Правильно: |
После загрузки плагина возникает ошибка | Плагин имеет возможность работать с настройками всего сервиса и с настройками конкретного плагина (в одном сервисе можно сделать несколько плагинов: оплат, лояльности и т.п.). Доступ к общим настройкам (всего сервиса) можно получить путем вызова метода Указанная выше ошибка появляется в случае, если использовать не тот метод. Например, вместо |
Плагин на кассе не активируется (не работает). Где посмотреть логи плагина? | На кассе откройте лог-файл плагина /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-файла в папки:
Перезагрузите кассовый модуль. |
Как проверить возможность работы плагина при отключенной сети или эмулировать отсутствие интернета на кассе?
| Обратите внимание, что команда Выполните команды: 1. 2. Выключить соединение 3. Включить соединение |
Как правильно подключить внешние библиотеки, например, 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 есть собственные рекламные акции (кассовые механики), информацию о них можно было бы передавать как метку на | Да, при расчете скидок. В блоке чека |
Отправка данных в SetAPI | |
Возможно ли передавать дополнительное свойство для товара и отображать его в SetAPI? |
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()
)
));
|
Работа с чеком | |
Каким образом осуществляется передача информации для отправки эл.чека? |
Пример: /**
* На основе переданного экземпляра {@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;
}
|
Какие существуют рекомендации для подстановки реквизитов без согласия на отправку чека для внешних процессингов? | Ответ подробно описан в запросе API Set10 ◾️ FAQ (Часто задаваемые вопросы). |
Разрешения и доступы плагинов | |
Какие плагины имеют доступ к UI и могу манипулировать интерфейсом кассы? | Манипулирование UI доступно в рамках методов плагинов, которые возвращают результат через callback. Подробности в javadoc https://crystalservice.github.io/Set10API/. |
Может ли плагин отправлять http-запросы к внутреннему ресурсу? | В любом плагине возможно реализовать обращение к внутреннему ресурсу. Но стоит учитывать негативные сценарии, например, долгий ответ, ошибка и т. д., что может привести к замедлению работы кассы. |
Можно ли в сам плагин встроить прямые API-запросы к сторонним сервисам? | Да, допускается обращение во внешние процессинги. Но учитывайте негативные сценарии из пункта API Set10 ◾️ FAQ (Часто задаваемые вопросы). |
Кастомизация и брендирование | |
Как кастомизировать текстовые сообщение от плагина на экране кассы? Где находятся ключи для подстановки текста? |
|
Плагин лояльности | |
Применение позиционного купона: как передается номер позиционного купона? | При поиске позиционного купона в плагинах в SetAPI в запросе Примененный позиционный купон будет доступен у позиции в |
Возможно ли осуществить транспорт данных между собственной системой клиента (ERP и бонусная система) и бонусной системой Set (списанные/начисленные бонусы, закрытые чеки и т. д.)? | Возможно, с помощью механик API. |
Плагин оплаты | |
При попытке оплаты через плагин оплат на кассе возникает ошибка Выполняется другая транзакция, пожалуйста попробуйте позже, и метод | Требуется включить параметр |
Функциональный плагин | |
К какому событию возможно привязать запрос промокода на кассе? Можно ли запрашивать промокод по какой-то горячей клавише? | Можно запрашивать по клавише в любой момент работы с чеком (кроме оплаты). Для этого необходимо реализовать плагин функции для функциональной кнопки вызова окна с клавиатурой. После ввода касса проверит, что это купон, добавит его в чек и сделает перерасчет скидок. Пример интерфейса 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();
}
} |