Формулировка проблемы: в текущий момент чтобы распределить записи реестра по департаментам, приходится создавать несколько идентичных реестров и задавать права для разных департаментов. Аналогичные проблемы происходят при необходимости распределения заявок по типу.
Связанные задачи:
* R1
Используется:
Основное приложение -> Хранилище -> Реестры
Конфигуратор -> Процессы
Решение: необходимо реализовать возможность создания централизованных фильтров в реестрах с указанием прав доступа к ним.
Данная задача состоит из следующих подзадач:
Решение: необходимо добавить в условия фильтров реестров компоненты, которые входят в "Поля формы реестра", и относятся к следующим типам:
Объекты Synergy (для всех типов данных: подразделение, должность, пользователь);
Ссылка на реестр.
Подпись данных компонентов формы реестра берётся из названия соответствующего «Поля формы реестра», если оно заполнено, в противном случае подписью будет идентификатор компонента в форме.
Возможные условия фильтрации
Объекты Synergy
Используются только способы сравнения: «содержит», «не содержит».
Ввод эталонного значения осуществляется при помощи компонента "Объекты Synergy" (с типом данных: подразделение, должность, пользователь) с мультивыбором. Тип данных должен соответствовать типу данных компонента "Объект Synergy", указанного в условии фильтра.
При указании нескольких эталонных значений в одном компоненте, проверка условия осуществляется по логическому "ИЛИ". При указании в фильтре нескольких отдельных условий относительно одного компонента "Объекты Synergy", проверка условия осуществляется по логическому "И".
Ссылка на реестр
Используются только способы сравнения: «содержит», «не содержит».
Ввод эталонного значения осуществляется при помощи компонента "Ссылка на реестр" с одиночным выбором. Данный компонент должен ссылаться на тот же реестр, что и компонент из условия фильтра.
При указании в фильтре нескольких отдельных условий относительно одного компонента "Ссылка на реестр", проверка условия осуществляется по логическому "И".
Решение: необходимо реализовать возможность централизованного управления фильтрами реестров с возможностью указания прав доступа к каждому из них.
Связанные задачи:
Используются:
Конфигуратор - "Процессы" - "Реестры"
Клиентское приложение - Хранилище - Реестры
Интерфейс
В редактор реестра необходимо добавиь функцию настройки фильтров реестра (кнопка "Управление фильтрами"):
Примечание:
Кнопка "Управление фильтрами" отображается только для сохраненных фильтров.
По нажатию на эту кнопку должно открываться окно "Управление фильтрами реестра":
В левой части окна располагается дерево централизованных фильтров, где корневым элементом является текущий реестр. В правой части расположены:
кнопки:
сохранить изменения;
добавить новый дочерний элемент;
удалить текущий элемент;
поля ввода сведений о фильтре:
"Название" - мультиязычное поле ввода (обязательное поле);
выбор пиктограммы фильтра (используется тот же набор пиктограмм, что и для фильтров в клиентсткой части);
"Код" - однострочное поле ввода (обязательное поле). К полю долны применяться существующие правила валидации.
блок указания условий фильтра, функциональность которого аналогична редактору фильтров реестров в клиентской части);
сплит;
таблица "Права на фильтр": аналогична таблице "Права" в редакторе реестра, но без указания права "Создание".
При выборе корневого элемента в правой части окна доступна только кнопка добавления нового элемента "+", кнопки "Сохранить" и "Удалить" заблокированы, никакие поля не отображаются.
Примечание:
Кнопки "Сохранить", "Добавить" и "Удалить" должны быть доступны только методологу (разработчику Synergy), имеющему право "Изменение" на текущий реестр.
Правила определения прав пользователя на запись реестра
Для каждой записи реестра итоговый набор прав пользователя определяется как объединение прав каждого фильтра (в том числе прав самого реестра), если одновременно:
запись удовлетворяет условиям фильтра;
пользователь входит в группу, которой установлены права в фильтре.
Пользовательские фильтры должны работать только с теми записями, которые доступны пользователю в корне.
Вне зависимости от установленных прав на реестр и фильтры пользователю доступно право "Редактирование" записей, созданных им лично.
Примечание:
Условия дочернего фильтра наследуются от родительского. Наследования прав не происходит.
Отображение фильтров и доступных записей в клиентской части
В клиентской части для реестра отображаются как централизованные, так и пользовательские фильтры, причем централизованные фильтры располагаются выше пользовательских.
Если у пользователя нет прав на фильтр, то этот фильтр ему не отображается. При этом дерево централизованных фильтров соответствующим образом адаптируется: если пользователю доступны фильтры уровня N+1 и N-1, но недоступен фильтр уровня N, то в навигаторе фильтр N+1 должен быть отображен как дочерний фильтра N-1 (считается, что реестр - фильтр уровня 0, а фильтр уровня N имеет N родительских фильтров, в том числе и сам реестр).
Исходное дерево централизованных фильтров:
Реестр
...
фильтр N-1
фильтр N
фильтр N+1
...
Дерево фильтров, отображаемое для пользователя, которому доступны фильтры уровня N+1 и N-1, но недоступен фильтр уровня N:
Реестр
...
фильтр N-1
фильтр N+1
...
По умолчанию фильтры всех реестров развернуты.
Централизованные фильтры в клиентском приложении не имеют контекстного меню: их нельзя редактировать, создавать в них вложенные пользовательские фильтры.
Если у пользователя есть права хотя бы на один фильтр реестра, то ему отображается и сам реестр. При этом в реестре отображаются только записи, удовлетворяющие условиям фильтров, доступных пользователю, а также те, которые он создал.
Если запись, созданная пользователем, не удовлетворяет ни одному набору условий доступных ему фильтров, то эта запись отображается только в корне (т.е. при выборе самого реестра).
Дополнительные права, которые дают фильтры, не влияют на следующие точки доступа к реестрам и их записям:
Конфигуратор - Редактор форм - компонент "Ссылка на реестр";
Клиентское приложение - "Цели и показатели" - "Реестры";
Клиентское приложение - "Проекты" - "Паспорт проекта".
Действия при обновлении системы
При обновлении системы в редакторе реестров должна появиться новая функция "Управление фильтрами реестров". Никакие централизованные фильтры при обновлении создаваться не должны.
Вариант использования 1. Ограничение доступа к подмножеству записей реестра
Исходные данные:
Форма реестра содержит компоненты:
cmp1
: выпадающий список со значениями
"Астана", "Алматы", "Другие"
cmp2
: однострочное поле
Пользователи user1
,
user2
, user3
.
Группы пользователей:
группа1: user1
группа2: user2
группа3: user3
Структура реестров фильтра:
реестр
Астана
Алматы
Права на реестр и фильтры, условия фильтров:
права на реестр:
Группа | Просмотр списка | Просмотр данных | Создание | Редактирование | Изменение | Удаление |
---|---|---|---|---|---|---|
группа1 |
|
|
| |||
группа2 |
| |||||
группа3 |
|
фильтр "Астана"
Условие: cmp1 = "Астана"
Группа | Просмотр списка | Просмотр данных | Редактирование | Изменение | Удаление |
---|---|---|---|---|---|
группа1 |
| ||||
группа2 |
|
|
|
|
|
фильтр "Алматы"
Условие: cmp1 = "Алматы"
Группа | Просмотр списка | Просмотр данных | Редактирование | Изменение | Удаление |
---|---|---|---|---|---|
группа1 |
| ||||
группа3 |
|
|
|
|
|
фильтр "Другие"
Условие: cmp1 = "Другие"
Группа | Просмотр списка | Просмотр данных | Редактирование | Изменение | Удаление |
---|---|---|---|---|---|
группа1 |
|
|
|
Исходное содержимое реестра (без учета права "Создание", которое регулируется непосредственно для реестра):
Однострочное поле | Выпадающий список | Отображается в фильтрах | Итоговые права user1 | Итоговые права user2 | Итоговые права user3 |
---|---|---|---|---|---|
|
|
Алматы |
Просмотр списка, просмотр данных |
Все |
нет |
|
|
только в корне |
Все |
нет |
нет |
|
|
Астана |
Просмотр списка, просмотр данных |
нет |
Все |
Ход исполнения:
Авторизоваться под пользователем user1, перейти к модулю "Хранилище" - "Реестры".
Структура реестров в навигаторе:
реестр
Астана
Алматы
Другие
Все дерево фильтров развернуто.
В навигаторе выделить корень реестра. Отображаются записи:
Однострочное поле | Выпадающий список |
---|---|
|
|
|
|
|
|
Доступно создание новой записи.
Вызвать контекстное меню записи:
|
|
Пункт "Удалить" недоступен.
Вызвать контекстное меню записи:
|
|
Доступно удаление записи.
В навигаторе выделить фильтр "Алматы". Отображается запись:
|
|
Открыть запись:
|
|
Кнопка перехода в режим редактирования не отображается.
Авторизоваться под пользователем user2, перейти к модулю "Хранилище" - "Реестры".
Структура реестров в навигаторе:
реестр
Астана
Все дерево фильтров развернуто.
В навигаторе выделить корень реестра. Отображается запись:
Однострочное поле | Выпадающий список |
---|---|
|
|
Доступно создание новой записи.
Открыть запись:
|
|
Доступно редактирование записи.
Закрыть проигрыватель форм, выделить в навигаторе фильтр "Астана". Отображается запись:
Однострочное поле | Выпадающий список |
---|---|
|
|
Создать новую запись реестра:
Однострочное поле | Выпадающий список |
---|---|
|
|
Новая запись создана.
Закрыть проигрыватель форм, выделить в навигаторе фильтр "Астана". Отображается запись:
Однострочное поле | Выпадающий список |
---|---|
|
|
В навигаторе выделить корень реестра. Отображаются записи:
Однострочное поле | Выпадающий список |
---|---|
|
|
|
|
Вариант использования 2. Наследование условий фильтров, адаптация дерева фильтров при недоступности одного из элементов дерева
Исходные данные:
Форма реестра содержит компоненты:
cmp1
: однострочное поле
cmp2
: дата/время
cmp3
: выпадающий список со значениями
"1", "2", "3".
Пользователи user1
,
user2
, user3
.
Группы пользователей:
группа1: user1
группа2: user1
,
user2
группа3: user1
,
user3
группа4: user3
группа5: группа2
,
группа4
Структура реестров фильтра:
реестр
фильтр 1.1
фильтр 2.1
фильтр 3
фильтр 2.2
фильтр 1.2
Права на реестр и фильтры, условия фильтров:
права на реестр:
Группа | Просмотр списка | Просмотр данных | Создание | Редактирование | Изменение | Удаление |
---|---|---|---|---|---|---|
группа1 |
|
|
| |||
группа2 |
|
|
фильтр 1.1:
Условие: cmp1 > 0; cmp2 >= 2016-12-01
Группа | Просмотр списка | Просмотр данных | Редактирование | Изменение | Удаление |
---|---|---|---|---|---|
группа1 |
|
|
|
|
|
фильтр 2.1:
Условие: cmp1 > 1; cmp2 >= 2017-01-01
Группа | Просмотр списка | Просмотр данных | Редактирование | Изменение | Удаление |
---|---|---|---|---|---|
группа2 |
|
|
|
|
фильтр 3:
Условие: cmp3 = "1"
Группа | Просмотр списка | Просмотр данных | Редактирование | Изменение | Удаление |
---|---|---|---|---|---|
группа3 |
|
|
|
|
|
фильтр 2.2:
Условие: cmp1 > 5; cmp1 <=10
Группа | Просмотр списка | Просмотр данных | Редактирование | Изменение | Удаление |
---|---|---|---|---|---|
группа1 |
| ||||
группа4 |
|
|
|
|
|
фильтр 1.2:
Условие: cmp1 < 0
Группа | Просмотр списка | Просмотр данных | Редактирование | Изменение | Удаление |
---|---|---|---|---|---|
группа5 |
|
|
|
Исходное содержимое реестра (без учета права "Создание", которое регулируется непосредственно для реестра):
Однострочное поле | Дата | Выпадающий список | Отображается в фильтрах | Итоговые права user1 | Итоговые права user2 | Итоговые права user3 |
---|---|---|---|---|---|---|
|
2017-01-05 |
|
фильтр 1.2 |
Просмотр списка, просмотр данных, удаление |
Просмотр списка, просмотр данных, удаление |
Просмотр списка, просмотр данных, удаление |
|
2016-11-30 |
|
только в корне |
Просмотр списка, просмотр данных, удаление |
Просмотр списка, просмотр данных, |
Нет |
|
2016-11-29 |
|
только в корне |
Просмотр списка, просмотр данных, удаление |
Просмотр списка, просмотр данных, |
Нет |
|
2017-01-01 |
|
фильтр 1.1, фильтр 2.1, фильтр 2.2 |
Все |
Просмотр списка, просмотр данных, редактирование, изменение |
Все |
|
2017-01-01 |
|
фильтр 1.1 |
Все |
Просмотр списка, просмотр данных |
Нет |
|
2017-02-02 |
|
фильтр 1.1, фильтр 2.1, фильтр 3 |
Все |
Просмотр списка, просмотр данных, редактирование, изменение |
Все |
|
2017-01-10 |
|
фильтр 1.2 |
Просмотр списка, просмотр данных, удаление |
Просмотр списка, просмотр данных, удаление |
Просмотр списка, просмотр данных, удаление |
|
2016-12-01 |
|
только в корне |
Просмотр списка, просмотр данных, удаление |
Просмотр списка, просмотр данных, |
Нет |
Ход исполнения:
Авторизоваться под пользователем user1, перейти к модулю "Хранилище" - "Реестры".
Структура реестров в навигаторе:
Реестр
фильтр 1.1
фильтр 2.1
фильтр 3
фильтр 2.2
фильтр 1.2
Все дерево фильтров развернуто.
Создать новую запись в реестре:
однострочное поле: 0
дата/время: 2017-03-03
выпадающий список: "2"
Сохранить данные.
В навигаторе выделить корень реестра. Отображаются записи:
Однострочное поле | Дата | Выпадающий список |
---|---|---|
|
2017-01-05 |
|
|
2016-11-30 |
|
|
2016-11-29 |
|
|
2017-01-01 |
|
|
2017-01-01 |
|
|
2017-02-02 |
|
|
2017-01-10 |
|
|
2016-12-01 |
|
|
2017-03-03 |
|
Открыть запись:
|
2016-11-30 |
|
Кнопка перехода в режим редактирования не отображается.
Закрыть проигрыватель форм, в навигаторе выделить фильтр 1.1. Отображаются записи:
Однострочное поле | Дата | Выпадающий список |
---|---|---|
|
2017-01-01 |
|
|
2017-01-01 |
|
|
2017-02-02 |
|
Вызвать контекстное меню записи:
|
2017-01-01 |
|
Доступен пункт "Удалить".
Открыть запись:
|
2017-02-02 |
|
Доступна кнопка перехода в режим редактирования.
Закрыть проигрыватель форм, в навигаторе выделить фильтр 3. Отображаются записи:
Однострочное поле | Дата | Выпадающий список |
---|---|---|
|
2017-01-01 |
|
|
2017-01-01 |
|
|
2017-02-02 |
|
Авторизоваться под пользователем user3, перейти к модулю "Хранилище" - "Реестры".
Структура реестров в навигаторе:
Реестр
фильтр 2.1
фильтр 3
фильтр 2.2
фильтр 1.2
Фильтр 1.1 не отображается. Создание новой записи в реестре недоступно.
В навигаторе выделить корень реестра. Отображаются записи:
Однострочное поле | Дата | Выпадающий список |
---|---|---|
|
2017-01-05 |
|
|
2017-01-01 |
|
|
2017-02-02 |
|
|
2017-01-10 |
|
В навигаторе выделить фильтр 2.1. Отображаются записи:
Однострочное поле | Дата | Выпадающий список |
---|---|---|
|
2017-01-01 |
|
|
2017-02-02 |
|
Вызвать контекстное меню записи:
|
2017-01-01 |
|
Доступен пункт "Удалить".
Открыть запись:
|
2017-02-02 |
|
Доступна кнопка перехода в режим редактирования.
Решение: необходимо изменить компонент формы "Ссылка на реестр", добавив отображение фильтров реестра.
Используются:
Клиентское приложение - проигрыватель форм
Проигрыватель форм
Существующее окно диалога выбора записи реестра необходимо расширить, добавив в левой части дерево доступных пользователю фильтров:
Функциональность дерева фильтров, отступы между уровнями и используемые пиктограммы аналогичны дереву в диалоге выбора подразделения (в проигрывателе форм).
Ширина блока дерева фильтров по умолчанию - 200px. Ширину блока можно изменять: минимальный размер - 92px, максимальный - 592px (2/3 от общего размера диалога).
Длина поля поиска по записям реестра должна увеличиться на 205px.
Кнопка "Выбрать" перемещается таким образом, чтобы располагаться в центре окна.
Размер и расположение остальных компонентов окна не изменяется.
При выборе реестра пользователю отображаются только доступные ему фильтры (как централизованные, так и пользовательские). Порядок отображения фильтров в диалоге выбора записи такой же, как и в навигаторе реестров в клиентской части.
По умолчанию отображаются записи, доступные пользователю в корне реестра.
Корнем дерева фильтров считается реестр.
Поиск записей производится только по тем записям, которые доступны пользователю.
Примечание:
В случае использования модифицированного компонента "Ссылка на реестр" блок фильтров реестра в нем может не отображаться по умолчанию, и это не является ошибкой Synergy. В этом случае требуется дополнительно обновлять внешний вид для каждого случая.
Решение: необходимо реализовать метод для получения фильтров реестров, а также доработать существующие методы работы с реестрами для обеспечения поддержки фильтров.
Новый API получения фильтров реестра
getRegistryFilters
.
URL метода: rest/api/registry/filters
Тип запроса: GET
Параметры:
registryID - ID реестра (не обязательное).
registryCode - код реестра (не обязательно, если указан
registryID
).
type - требуемые типы фильтров (не обязательное). Может принимать значения:
all
- все фильтры (значение по умолчанию);
user
- пользовательские;
service
- централизованные;
Если в параметре передано другое значение, оно обрабатывается как
all
.
locale - код локали (не обязательное). Если не указан, то используется локаль по умолчанию.
getIcon - возвращать иконку фильтра (логический, не обязательный). По умолчанию принимает значение
true
.
Возвращает дерево доступных авторизованному пользователю фильтров указанного реестра в формате JSON.
Альтернативный поток событий 1. Не передан ни один из параметров
registryID
,registryCode
.
Сервер возвращает ошибку "Не указан реестр", действие не выполняется.
Альтернативный поток событий 2. Передан некорректный (несуществующий) параметр
registryID
илиregistryCode
.
Сервер возвращает ошибку "Передан некорректный параметр
registryID
илиregistryCode
", действие не выполняется.
Альтернативный поток событий 3. Авторизованный пользователь не имеет прав на указанный реестр (в том числе с учетом прав фильтров)
Сервер возвращает ошибку "Нет прав на указанный реестр", действие не выполняется.
Изменение существующих API.
Модификация метода
rest/api/registry/data
Новые параметры:
filterID
- ID фильтра (не обязательное). Если параметр не указан, то выполняется поиск по всему реестру.
filterCode
- код фильтра (не обязательное, если указанfilterID
).
Исключить параметр
user
. Если этот параметр будет передан, то выполняется альтернативный поток событий 4.
Необходимо возвращать только те записи реестра, которые доступны авторизованному и удовлетворяют условиям указанных фильтров.
Модификация методов
rest/api/registry/data_ext
иrest/api/registry/data_ext_post
Новые параметры:
filterID
- ID фильтра (не обязательное). Если параметр не указан, то выполняется поиск по всему реестру.
filterCode
- код фильтра (не обязательное, если указанfilterID
).
В группах условий, параметр
condition
, условия с кодамиCONTAINS
,NOT_CONTAINS
,TEXT_EQUALS
иTEXT_NOT_EQUALS
должны учитывать возможность использования для сравнения ссылок на реестр, объектов Synergy.
Если для поиска используется параметр
searchString
, поиск указанного текста также должен выполняться по ссылкам на реестр и по объектам Synergy.
Необходимо возвращать только те записи реестра, которые доступны авторизованному пользователю (с учетом прав реестра и указанного фильтра) и удовлетворяют условиям фильтра.
Модификация метода
rest/api/registry/list
Метод должен дополнительно возвращать все реестры, в которых есть централизованные фильтры, дающие пользователю право доступа к реестру.
Модификация метода
rest/api/registry/files/search
Необходимо выполнять поиск только по тем реестрам, на которые у авторизованного пользователя есть право "Просмотр данных".
Альтернативный поток событий 4. В параметрах метода
rest/api/registry/data
передан параметрuser
Сервер возвращает ошибку "Параметр
user
не может быть использован", действие не выполняется.
Альтернативный поток событий 5. В параметре
registries
методаrest/api/registry/files/search
передан ID реестра, на который у авторизованного пользователя нет права "Просмотр данных"
Сервер возвращает ошибку "Нет прав на указанные реестры: %перечень_ID_реестров_из_параметров_без_права_просмотра_данных%", действие не выполняется.
Альтернативный поток событий 6. Передан некорректный (несуществующий) параметр
filterID
илиfilterCode
в методеrest/api/registry/data
,rest/api/registry/data_ext
илиrest/api/registry/data_ext_post
Сервер возвращает ошибку "Передан некорректный параметр
filterID
илиfilterCode
", действие не выполняется.