Оргструктура: бизнес-логика¶
Назначение¶
Оргструктура определяет:
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 — привязка всех дочерних единиц к группам.
Типовые сценарии¶
Первоначальная настройка¶
- Настроить типы оргструктуры (Order, IsPosition)
- Создать дерево единиц (вручную / импорт из AD / 1C / Excel)
- Назначить должности элементам типа «Должность»
- Привязать пользователей к единицам
- Связать единицы с группами (для автоматического членства)
Реорганизация¶
- Смена ParentId у единицы перемещает всё поддерево
- Смена типа/родителя может повлиять на доступность потомков в UI (ограничение по Order)
- После реорганизации — синхронизация связанных групп
Увольнение / перевод сотрудника¶
- Удаление из орг. единицы → убирается из связанной группы
- Перемещение в другую единицу → автопересчёт IsPrimary и групп
Пользовательский интерфейс¶
Представление оргструктуры¶
Оргструктура открывается по ссылке Оргструктура из меню Сотрудники. Отображается иерархическое дерево подразделений, должностей и сотрудников.
Элементы на схеме:
| Обозначение | Элемент |
|---|---|
| Департамент с руководящей должностью | Корневой/родительский узел |
| Подотдел с руководителем | Дочерний узел |
| Сотрудник | Лист дерева (назначенный пользователь) |
| Вакантная должность | Лист дерева (нет назначенного сотрудника) |
В блоках департаментов и подотделов отображается число сотрудников, работающих в подразделении.
Несколько оргструктур¶
В системе может быть настроено несколько оргструктур. Переключение между ними выполняется через выпадающий список. В списке отображаются все корневые элементы оргструктур с неактивной опцией Не показывать в орг. структуре. По умолчанию открывается первая оргструктура в списке.
Навигация¶
- Сворачивание/разворачивание — по кнопкам в панели навигации или кликом по элементам
- Масштаб — регулируется колесом мыши
- Перетаскивание — перемещение по структуре при зажатой кнопке мыши
Действия с элементами¶
Переход в профиль: по нажатию на имя пользователя открывается краткая карточка профиля.
Информация об элементе: если у элемента оргструктуры (отдела или должности) есть связь с пространством, содержащим описание, отображается кнопка Информация. По нажатию открывается статья пространства в модальном окне (только текст, без навигации). Полную статью можно открыть в отдельной вкладке.
Комментарии: администратор может задать произвольный текст комментария для элемента оргструктуры, который отображается под названием элемента.
Ограничения и правила¶
- Элемент не может быть родителем сам себе (CHECK:
ParentId <> Id) - Дочерний тип должен иметь Order строго больше родительского
- По умолчанию разрешены дубликаты имён в одной ветке; запрет: настройка
OrgStructure_AllowNonUniqueOrgUnitNames - Корневые элементы с
DoNotShowInOrgStructure = falseотображаются в переключателе оргструктур