Сотрудники — Список
Роут: /employees
API: GET /api/v1/employees
(Обновлено в BR 1.4.4)
Колонка и фильтр «Multi-tenancy роль» удалены вместе с enum
employees.role. Колонка «Permissions-роли» и фильтр «Permissions-роль» — оставлены. Колонка «Торговые точки» теперь — агрегат уникальных ТТ по всемroles[].store_idsсотрудника.
Что видит пользователь
Страница со списком сотрудников в виде таблицы. Вверху — заголовок “Сотрудники”, строка поиска и фильтры. Справа от заголовка — кнопка “Добавить сотрудника”.
Таблица
Колонки
(Обновлено в BR 1.4.4)
| Колонка | Данные | Примечание |
|---|---|---|
| ФИО | first_name + last_name | Кликабельное — переход в карточку. Если сотрудник — владелец, рядом мини-бейдж «Владелец франшизы» / «Владелец партнёра» |
email | ||
| Телефон | phone | Или ”—“ |
| Permissions-роли | roles[].name | Чипы названий ролей; max 3 видимых, остальные в «+N» с tooltip-полным списком. Скрытая роль владельца партнёра отображается как «Собственные права» (без техназвания) |
| Торговые точки | агрегат roles[].store_ids | Уникальный набор ТТ по всем permissions-ролям сотрудника (через запятую). Для владельцев — «Все ТТ франшизы» / «Все ТТ своих ЮЛ» соответственно |
| Статус | status | ”Активен” (зелёный) / “Деактивирован” (серая метка) |
| Курьер | is_courier | Бейдж “Курьер” если true, иначе пусто |
| Действия | — | Меню с действиями (см. ниже) |
Особенности отображения
- Деактивированные сотрудники отображаются серым цветом, статус — серой меткой “Деактивирован”
Фильтры
(Обновлено в BR 1.4.4 — фильтр «Multi-tenancy роль» удалён)
| Фильтр | Тип | Значения | Default |
|---|---|---|---|
| Permissions-роль | Select | Все / {список активных обычных ролей франшизы} | Все (query param role_id) |
| Торговая точка | Select | Все / список ТТ (из API) | Все |
| Статус | Select | Все / Активен / Деактивирован | Все |
Скрытые роли владельцев партнёров в фильтр не попадают (бэк фильтрует по owner_legal_entity_id IS NULL).
Фильтры применяются мгновенно (без кнопки “Применить”). При смене фильтра — сброс на page=1.
Поиск
- Поле ввода с placeholder “Поиск по ФИО, email или телефону”
- Поиск с debounce (300ms)
- Query param:
search - Ищет по всем трём полям одновременно (на бэкенде)
Сортировка
- По ФИО А-Я (default:
sort=name_asc) - Клик по заголовку колонки “ФИО” переключает A-Я / Я-A
Пагинация
- 20 записей на страницу
- Постраничная навигация внизу (номера страниц + стрелки)
- Query params:
page,per_page
Действия
Кнопки в шапке
| Кнопка | Переход | Видимость |
|---|---|---|
| ”Добавить сотрудника” | /employees/new | Владельцы (франшизы и партнёра); сотрудники с employees.edit |
| ”Выгрузить из PK” (BR 3.5) | /employees/import-from-paykeeper?account_id={id} (или модалка выбора ЛК если их >1) | integrations.read (видна) + integrations.manage AND employees.edit AND ≥1 active PK-аккаунт во scope (активна). Подробно: Импорт сотрудников из PayKeeper |
| ”Журнал импортов” (BR 3.5) | Открывает модалку | integrations.read AND есть хотя бы один прошлый прогон импорта |
Меню действий строки
| Действие | Видимость | Что происходит |
|---|---|---|
| Редактировать | Владелец франшизы — все; владелец партнёра — только своих; обычный сотрудник — employees.edit в своём scope | Переход в /employees/{id}/edit |
| Деактивировать | Те же + status=active | Модалка подтверждения |
| Реактивировать | Те же + status=inactive | Модалка подтверждения |
Модалки подтверждений
Деактивация
Триггер: клик “Деактивировать” в меню строки
API: POST /api/v1/employees/{id}/deactivate
- Заголовок: “Деактивация сотрудника”
- Текст: “Сотрудник [имя фамилия] будет деактивирован. Все его сессии будут завершены.”
- Кнопки: “Отмена” / “Деактивировать” (красная)
- После успеха: обновить статус в таблице, toast “Сотрудник деактивирован”
Реактивация
Триггер: клик “Реактивировать” в меню строки
API: POST /api/v1/employees/{id}/reactivate
- Заголовок: “Реактивация сотрудника”
- Текст: “Сотрудник [имя фамилия] будет реактивирован.”
- Кнопки: “Отмена” / “Реактивировать”
- После успеха: обновить статус в таблице, toast “Сотрудник реактивирован”
Состояния
| Состояние | Что показываем |
|---|---|
| Загрузка | Skeleton-таблица (placeholder строк) |
| Пусто (владельцы) | “Сотрудники пока не добавлены” + кнопка “Добавить сотрудника” |
| Ошибка загрузки | ”Не удалось загрузить данные” + кнопка “Повторить” |
| Пустой поиск | ”Ничего не найдено по запросу «…»” |
Ролевой доступ
(Обновлено в BR 1.4.4 — без enum, через scope + permissions)
Владелец франшизы
- Видит всех сотрудников всех ТТ
- Кнопка “Добавить сотрудника”
- Все действия доступны
Владелец партнёра
- Видит сотрудников только своих ЮЛ/ТТ (API фильтрует автоматически по scope)
- Кнопка “Добавить сотрудника”
- Действия: редактировать, деактивировать, реактивировать — только своих
Обычный сотрудник
- Доступ к разделу — если есть permission
employees.read. Видит сотрудников только своих ТТ (API фильтрует автоматически) - Кнопка “Добавить сотрудника” — только при permission
employees.edit(обычно не выдаётся) - Если нет ни
employees.read, ниemployees.edit— пункт меню «Сотрудники» скрыт; прямой URL → 403
Переходы
| Откуда | Куда | Триггер |
|---|---|---|
| Список | Карточка просмотра | Клик по ФИО |
| Список | Форма создания | Кнопка “Добавить сотрудника” |
| Список | Форма редактирования | Действие “Редактировать” |
BR 1.4.1 — Расширение навигации
Дополнения в рамках BR 1.4.1
Новые пункты в sidebar (раздел “Персонал”)
| Пункт | Роут | Описание |
|---|---|---|
| Сотрудники | /employees | Текущий список (без изменений) |
| Расписание | /schedule | Расписание смен — календарь смен |
| Дашборд активности | /activity/employees | Дашборд активности сотрудников — сводка по сотрудникам |
| Платёжные ведомости | /payroll | Платёжные ведомости — расчёт зарплат |
Кнопка “Архив”
- Рядом с кнопкой “Добавить сотрудника” добавить кнопку “Архив” (иконка архива, secondary style)
- При клике: применить фильтр
status=inactive(показать только деактивированных сотрудников) - В режиме архива: заголовок меняется на “Сотрудники — Архив”, кнопка “Архив” заменяется на “Активные”
- Переключение через query param:
/employees?archive=true