Из чего строится дерево
Организационная структура в Quevell строится из одного факта в профиле: кто чей руководитель. Вести ее отдельно от жизни не нужно.
Компания отмечает одно из своих полей профиля типа "Пользователь компании" как поле руководителя. Каждый, у кого оно заполнено, встает под указанного пользователя; у кого не заполнено, стоит в корне дерева. Отдельной структуры, которую можно забыть обновить, не существует: изменение этого поля на странице пользователя двигает дерево само.
Поле руководителя
- Полем руководителя может быть только поле типа "Пользователь компании", и только одно на компанию. Выбор нового снимает отметку со старого.
- Выбирает и снимает его тот, у кого есть право редактировать структуру. Это отдельное право: один факт, одна дверь.
- У корня дерева поле руководителя пустое: обычно это владелец компании. Никто не подчиняется сам себе: такое значение отклоняется при вводе.
- Руководитель, покинувший компанию, перестает быть руководителем: его подчиненные поднимаются в корень дерева, а не висят под тем, кого нет.
Кто видит
Дерево показывает каждого пользователя компании и линии подчинения между ними, а это намного больше, чем "мои коллеги по проекту". Поэтому просмотр структуры это отдельное право. У администраторов компании оно есть всегда, остальным его выдают.
Под именем пользователя дерево показывает значения полей профиля, у которых включен показ на структуре: например, должность. Показывается только заполненное.
Циклы
Если А подчиняется Б, а Б подчиняется А, это цикл. Создать его больше нельзя: значение, замыкающее линию подчинения, напрямую или через цепочку (А подчиняется Б, Б подчиняется В, В подчиняется А), отклоняется при сохранении. Пользователи, оказавшиеся в цикле до появления этой проверки, не рисуются в дереве и перечислены рядом с ним поименно: так они остаются на виду и их можно поправить.
Структура в поиске
Дерево отвечает на запросы QQL через две функции:
assignee in (myReports()): задачи моих прямых подчиненных;assignee in (myVertical()): задачи всех, кто подо мной, на любую глубину.
Обе функции вычисляются относительно того, кто выполняет запрос: фильтр, сохраненный одним руководителем, показывает другому руководителю его собственных пользователей. Пользователи в цикле для этих функций ни под кем не стоят и никого не держат.
Это сделано намеренно вместо рассылок "вашему подчиненному назначили задачу": руководитель смотрит на работу своих подчиненных, когда сам решает посмотреть, и ничей ящик не наполняется сам.
Команды это не структура
Команды в Quevell живут отдельно от дерева подчинения: команду пользователи собирают сами, и она не обязана совпадать с линией руководства. Функция myTeammates() отвечает по командам, а не по дереву: все пользователи из всех команд, где вы состоите. Права на проекты тоже не следуют из дерева: они выдаются ролями в проекте, пользователю или группе.
Передача дел и доступ
Когда пользователь уходит, администратор видит все, что числится на пользователе: назначения, роли, правила, и передает преемнику одним действием. Передача выполняется целиком или не выполняется вовсе.
Преемнику переходят открытые назначения, открытые задачи, где уходящий значится автором, роли в проектах, правила автоматизации, личные страницы и сохраненные фильтры. Роли именно переходят, а не копируются: личной роли в этих проектах у прежнего пользователя не остается. Доступ через группу устроен отдельно, и передача его не трогает: если пользователь состоит в группе, которой выдана роль в проекте, он продолжит видеть проект через нее. Там, где у преемника своя роль в проекте была, она и остается: передача расширяет доступ и никогда его не понижает.
Авторство не передается никогда. Задачи, комментарии и вложения остаются подписаны тем, кто их сделал, и назначение на завершенной задаче тоже остается: это запись о том, кто ее закончил.
С деревом при этом происходит то, что описано выше: деактивированный руководитель перестает быть руководителем, его подчиненные поднимаются в корень. Поле руководителя у них при этом не стирается.
Когда деактивированного пользователя возвращают, поле руководителя проверяется: если названный руководитель по-прежнему в компании, поле сохраняется и линия восстанавливается. Если он за это время деактивирован или удален, поле очищается, а в ответе на возврат пользователя сказано "руководитель не указан: прежний деактивирован". Подтверждения при этом не спрашивают; очистка попадает в журнал.