iikoFront API SDK

Проверка и запрос прав

Проверка и запрос прав

Действия, которые выполняются с помощью плагина, могут требовать проверки или запроса прав. Для проверки прав пользователя есть методы CheckPermission и CheckPermissions. Для запроса прав можно показать диалоговые окна с помощью методов ShowCheckPermissionPopup и ShowCheckPermissionsPopup. Текущего пользователя можно узнать с помощью метода GetCurrentUser. Если терминал работает в режиме “Строгое соответствие расписанию”, то текущую роль можно узнать с помощью GetStrictAccordanceToScheduleUserRole.

Как это выглядит в iikoFront?

Например, плагин добавляет кнопку «SamplePlugin: Show OK popup» на «экран кассы». Пример реализации можно посмотреть в проекте SDK SamplePlugin в классе ButtonsTester.

ButtonOnPaymentScreenView

Пусть кнопка будет доступна для нажатия только пользователям с определёнными правами. Это можно сделать несколькими способами. Для начала зарегистрируем кнопку:

// Регистрация действия на экране кассы
subscription = PluginContext.Operations.AddButtonToPaymentScreen("SamplePlugin: Show ok popup", false, true, ShowOkPopupOnPaymentScreen);

В результате выполнения метода регистрации можно получить идентификатор кнопки - subscription.buttonId. В дальнейшем будет использоваться этот идентификатор.

Вариант 1: Отключение кнопки для всех пользователей, у кого нет права на её нажатие.

Можно включать и выключать ранее добавленную кнопку на экран кассы с помощью метода UpdatePaymentScreenButtonState, передавая параметр isEnabled. Здесь удобнее всего будет воспользоваться событием CurrentUserChanged, чтобы узнать, какой пользователь сейчас работает. Подпишемся на событие и проверим, обладает ли пользователь нужным правом (например, право печати Х-отчёта “F_XR”):

// Подписка на событие изменения текущего пользователя
PluginContext.Notifications.CurrentUserChanged.Where(user => user != null).DistinctUntilChanged().Subscribe(user =>
{
    var isButtonEnabled = PluginContext.Operations.CheckPermission(user, "F_XR");
    PluginContext.Operations.UpdatePaymentScreenButtonState(subscription.buttonId, isEnabled: isButtonEnabled);
});

Таким образом, при изменении текущего пользователя, в зависимости от наличия права “F_XR”, кнопка будет выключаться или включаться. Метод CheckPermission принимает на вход 3 аргумента:

Точно так же можно проверить несколько прав, воспользовавшись методом CheckPermissions. Он принимает на вход 4 аргумента:

Список прав, которыми обладает пользователь, может поменяться. Для отслеживания этого, можно подписаться на событие UserChanged.

Вариант 2: Скрытие кнопки для всех пользователей, у кого нет права на её нажатие.

Можно перенести регистрацию кнопки в подписку CurrentUserChanged:

(Guid buttonId, IDisposable buttonRegistration)? subscription = null;
// Подписка на событие изменения текущего пользователя
PluginContext.Notifications.CurrentUserChanged.Where(user => user != null).DistinctUntilChanged().Subscribe(user =>
{
    if (PluginContext.Operations.CheckPermission(user, "F_XR")) //Пользователь обладает правом
    {
        if (subscription == null) //Была ли ранее создана кнопка
            subscription = PluginContext.Operations.AddButtonToPaymentScreen("SamplePlugin: Show ok popup", false, true, ShowOkPopupOnPaymentScreen);
    }
    else //Пользователь не обладает правом
    {
        subscription?.buttonRegistration.Dispose(); //Удаляем кнопку, если она была создана
        subscription = null;
    }
});

В этом случае, если у пользователя нет права, то кнопка не покажется.

Вариант 3: Проверка возможности выполнения операции в момент нажатия на кнопку.

Если есть возможность воспользоваться экземпляром IViewManager, то можно показать окно запроса прав. Например, доступ к нему есть в подписке на событие нажатия на кнопку. Здесь может быть несколько вариантов реализации.

Вариант 3.1: Если право у пользователя есть, то окно запроса права не покажется. Если у пользователя его нет, то показываем окно запроса права.

private void ShowOkPopupOnPaymentScreen((IOrder order, IOperationService os, IViewManager vm, (Guid buttonId, string caption, bool isChecked, string iconGeometry) state) info)
{
    if (info.vm.ShowCheckPermissionPopup("F_XR", false) == null) //Право не было подтверждено
        return;
    info.vm.ShowOkPopup("Тестовое окно", "Сообщение показано с помощью SamplePlugin.");
}

Метод ShowCheckPermissionPopup принимает на вход 2 аргумента:

Метод возвращает экземпляр IUser — пользователь, который подтвердил право, либо null, если право не было подтверждено. Следует учитывать, что подтвердить право может любой пользователь, а не только тот, кто в данный момент выполнил вход в терминал.

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

CheckPermission

Если право было подтверждено, то метод ShowCheckPermissionPopup вернёт экземпляр IUser - пользователя, который подтвердил права.

Вариант 3.2: Запрашивать право в любом случае, даже если у пользователя оно есть.

Иногда непреднамеренное выполнение операции может привести к нежелательным последствиям. Для этого можно требовать подтверждения права, даже если текущий пользователь им уже обладает. Переделаем подписку нажатия на кнопку, передав в showConfirmPopupAnyway true:

private void ShowOkPopupOnPaymentScreen((IOrder order, IOperationService os, IViewManager vm, (Guid buttonId, string caption, bool isChecked, string iconGeometry) state) info)
{
    if (info.vm.ShowCheckPermissionPopup("F_XR", true) == null) //Право не было подтверждено
        return;
    info.vm.ShowOkPopup("Тестовое окно", "Сообщение показано с помощью SamplePlugin.");
}

В этом случае окно запроса прав будет показываться всегда.

Вариант 4: Проверка нескольких прав.

Можно показать окно проверки нескольких прав, например:

private void ShowOkPopupOnPaymentScreen((IOrder order, IOperationService os, IViewManager vm, (Guid buttonId, string caption, bool isChecked, string iconGeometry) state) info)
{
    if (info.vm.ShowCheckPermissionsPopup(new string[] { "F_XR", "F_ZREP" }, false, PermissionsCheckMode.Any) == null) //Права не были подтверждены
        return;
    info.vm.ShowOkPopup("Тестовое окно", "Сообщение показано с помощью SamplePlugin.");
}

Метод ShowCheckPermissionsPopup принимает на вход 3 аргумента:

Метод возвращает экземпляр IUser — пользователь, который подтвердил права, либо null, если права не были подтверждены.