logo

Определение непосредственного руководителя в сценарии

В статье приведен пример сценарий для определения руководителя пользователя.

Пример сценария с использованием PublicAPI

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.15.38 включительно.

Сценарий записывает всех начальников пользователя в контекстную переменную context.Nachaljniki (не только начальника отдела, но и выше по оргструктуре).

Контекстные переменные:

  • context.Ispolnitelj – переменная типа Пользователь;

  • context.Nachaljniki – переменная типа Пользователь, тип связи – Список.

Пространство имен:

using EleWise.ELMA.API;

Текст сценария:

foreach (var chief in PublicAPI.Portal.Security.OrganizationItem.GetChiefByUser(context.Ispolnitelj)) { context.Nachaljniki.Add(chief); }

Методы для получения руководителя

GetChiefByUser

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

GetUserChiefsHierarchy

На выходе этого метода получим тип HierarchyChiefDisplayModel, внутри которого dictionary<IOrganizationItem, IEnumerable<HierarchyChiefModel>:

  • key — должность исходного пользователя;

  • value — список родительских должностей;

  • HierarchyChiefModel — модель родителя, содержит следующие свойства:

    • Lvl— уровень родителя (0 у исходного);

    • OrgItem — должность;

    • OrgItemId — Id должности;

    • StartItem — дочерняя должность;

    • StartItemId — Id дочерней должности;

    • User — пользователь на должности;

    • UserId — Id пользователя на должности.

Пример

Если для оргструктуры Директор (User 4) — Должность 3 (User 3) — Должность 2 (User 2) — Должность 1 (User 1) вызвать метод GetUserChiefsHierarchy, подставляя User 1, на выходе получится следующее:

Key будет содержать Должность 1, value будет содержать 3 элемента:

Должность 2:

Lvl 1
OrgItem Должность 2
OrgItemId Id Должности 2
StartItem Должность 1
StartItemId Id Должности 1
User User 2
UserId Id User 2

Должность 3:

Lvl 2
OrgItem Должность 3
OrgItemId Id Должности 3
StartItem Должность 2
StartItemId Id Должности 2
User User 3
UserId Id User 3

Директор:

Lvl 3
OrgItem Директор
OrgItemId Id Директора
StartItem Должность 3
StartItemId Id Должности 3
User User 4
UserId Id User 4

GetOrgItemsHierarchy(IOrganizationItem startItem)

Этот метод позволяет получить список элементов оргструктуры (например, должности начальников пользователя (IEnumerable<IOrganizationItem>) в иерархическом в порядке: Должность 2 — Должность 3 — Директор), стартовый элемент из содержащихся в HierarchyChiefDisplayModel.Items.

GetUsersHierarchy(IOrganizationItem startItem)

Этот метод позволяет получить список начальников пользователя (IEnumerable<Models.IUser>) в виде иерархии (User 2 — User 3 — User 4), стартовый элемент из содержащихся в HierarchyChiefDisplayModel.Items.

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

var chiefs = model.GetUsersHierarchy(context.Iniciator.OrganizationItems.FirstOrDefault());

Метод OrganizationItemSecurityApi

GetChiefByUser(Models.IUser user) — аналогично GetUsersHierarchy(IOrganizationItem startItem), но пользователь любой.

Пример сценария без использования PublicAPI

В сценарии использованы контекстные переменные:

  • context.Ispolnitelj – переменная Исполнитель, тип Пользователь;
  • context.Nachaljnik – переменная Начальник, тип Пользователь.

Текст сценария:

var chiefs = context.Ispolnitelj.OrganizationItems.ToArray ().Union (context.Ispolnitelj.OrganizationGroups).Select (organizationItem =>  {
	var parentOrganizationItem = organizationItem.ParentItem;
	while (parentOrganizationItem != null && parentOrganizationItem.User == null)
		parentOrganizationItem = parentOrganizationItem.ParentItem;
	return parentOrganizationItem != null ? parentOrganizationItem.User : null;
}).Where (u => u != null);

if(!chiefs.Any()) //Если не найдено ни одного элемента организационной структуры (высшее звено)
	context.Nachaljnik = context.Ispolnitelj; //Начальник инициатора - сам инициатор

else //Стандартная ветка
{
	var chief = chiefs.First ();
	context.Nachaljnik = chief;
}
Следует отметить, что в случае, если пользователь, от имени которого запускается сценарий, является высшим звеном организационной структуры, он же и будет назначен своим начальником.