Перейти к содержанию

Оргструктура: бизнес-логика

Назначение

Оргструктура определяет: 1. Иерархию подчинённости — кто кому подчиняется. 2. Руководителя пользователя — для эскалации задач и подписей. 3. Доступ руководителей к задачам подчинённых. 4. Автоматическое членство в группах через связку unit ↔ group. 5. Визуальное представление организации (SPA /spa/org/chart2).

Организационная vs функциональная структура

На площадке может быть несколько оргструктур, переключаемых в UI.

Организационная — штатное расписание, юридическая иерархия (Компания → Филиал → Департамент → Отдел → Должность).

Функциональная — подчинённость по функциям, не по территории. Пример: менеджеры по продажам в разных филиалах территориально подчиняются директорам филиалов, но функционально — коммерческому директору холдинга. Именно функциональная структура чаще используется для автоматизации процессов, эскалации, контроля доступа.

Функциональными могут быть элементы любого уровня — не только должности, но и подразделения. Организационные единицы из разных ветвей могут быть привязаны к общей функциональной единице.

Элементы оргструктуры

Типы орг. единиц (OrgStructureType)

Справочник типов определяет допустимые уровни иерархии. Каждый тип имеет: - Название (Филиал, Департамент, Отдел, Группа и т.д.) - Порядок (Order) — числовой уровень; дочерний элемент должен иметь строго больший уровень, чем родитель - Признак «Является должностью» (IsPosition) — ровно один тип помечается как должностной; только элементы этого типа могут иметь назначенную должность (Appointment)

Типы настраиваются до создания самой оргструктуры.

Орг. единицы (OrgStructureUnit)

Узел дерева. Основные атрибуты: - Входит в (ParentId) — родительский элемент (self-FK; корневые элементы: ParentId = NULL) - Тип — из справочника типов - Должность (AppointmentId) — только для элементов с типом IsPosition - Связанная группа (LinkedGroupId) — привязка к группе пользователей - Актуальность (IsActual) — неактуальные единицы (нет сотрудников) отображаются серым - Функциональная (IsFuncGroup) — признак функциональной единицы - Не показывать в оргструктуре (DoNotShowInOrgStructure) — скрывает элемент в UI и контролах выбора

Должности (OrgStructureAppointment)

Плоский справочник названий должностей (Генеральный директор, Менеджер, Бухгалтер). Должность назначается конкретному элементу оргструктуры типа «Должность».

Пользователи в оргструктуре (UserOrgStructureUnit)

Пользователь может входить в несколько орг. единиц, но только одна из них — основная (IsPrimary). Уникальность: не более одной основной единицы на пользователя (unique filtered index).

Определение руководителя

Руководитель пользователя — это пользователь, занимающий руководящую должность (IsDirector) в ближайшем родительском элементе оргструктуры. Алгоритм поднимается вверх по дереву до первого узла с IsDirector = true.

Кастомная настройка CustomUserDirectorIds позволяет переопределить руководителя вручную (формат: userId1:directorId1,userId2:directorId2).

Связь с группами

Каждая орг. единица может быть связана с группой пользователей (LinkedGroupId): - При связывании состав группы синхронизируется с пользователями орг. единицы. - Обновление вложенных групп: опция «Обновить связанные группы» пересчитывает членство по всему поддереву. - POST /api/admin/org-structure/syncgroups — bulk-синхронизация. - POST /api/admin/org-structure/orgunit/{unitId}/link-sub-tree-with-group — привязка всех дочерних единиц к группам.

Типовые сценарии

Первоначальная настройка

  1. Настроить типы оргструктуры (Order, IsPosition)
  2. Создать дерево единиц (вручную / импорт из AD / 1C / Excel)
  3. Назначить должности элементам типа «Должность»
  4. Привязать пользователей к единицам
  5. Связать единицы с группами (для автоматического членства)

Реорганизация

  • Смена ParentId у единицы перемещает всё поддерево
  • Смена типа/родителя может повлиять на доступность потомков в UI (ограничение по Order)
  • После реорганизации — синхронизация связанных групп

Увольнение / перевод сотрудника

  • Удаление из орг. единицы → убирается из связанной группы
  • Перемещение в другую единицу → автопересчёт IsPrimary и групп

Пользовательский интерфейс

Представление оргструктуры

Оргструктура открывается по ссылке Оргструктура из меню Сотрудники. Отображается иерархическое дерево подразделений, должностей и сотрудников.

Элементы на схеме:

Обозначение Элемент
Департамент с руководящей должностью Корневой/родительский узел
Подотдел с руководителем Дочерний узел
Сотрудник Лист дерева (назначенный пользователь)
Вакантная должность Лист дерева (нет назначенного сотрудника)

В блоках департаментов и подотделов отображается число сотрудников, работающих в подразделении.

Несколько оргструктур

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

Навигация

  • Сворачивание/разворачивание — по кнопкам в панели навигации или кликом по элементам
  • Масштаб — регулируется колесом мыши
  • Перетаскивание — перемещение по структуре при зажатой кнопке мыши

Действия с элементами

Переход в профиль: по нажатию на имя пользователя открывается краткая карточка профиля.

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

Комментарии: администратор может задать произвольный текст комментария для элемента оргструктуры, который отображается под названием элемента.

Ограничения и правила

  • Элемент не может быть родителем сам себе (CHECK: ParentId <> Id)
  • Дочерний тип должен иметь Order строго больше родительского
  • По умолчанию разрешены дубликаты имён в одной ветке; запрет: настройка OrgStructure_AllowNonUniqueOrgUnitNames
  • Корневые элементы с DoNotShowInOrgStructure = false отображаются в переключателе оргструктур