1.4.1 Сотрудники — расширение (расписание, учёт времени, зарплата)
Расширение BR 1.4
BR 1.4 реализовал базовый CRUD сотрудников. Эта BR добавляет функции, которые превращают раздел “Сотрудники” из справочника в полноценный инструмент управления персоналом — по образцу YUMA POS.
Референс
Документация YUMA POS:
_reference/yumapos/— файлыschedule.md,shift-report.md,employees-dashboard.md,roles.md,staff-list.md,how-to-add-new-staff-member.md
Общая идея
Сейчас раздел “Сотрудники” позволяет создать/отредактировать/деактивировать сотрудника. Этого недостаточно для ежедневного управления. Нужно:
- Расширить профиль — юридические данные
- Планировать графики — составлять расписание смен заранее
- Учитывать рабочее время — факт vs. план, отклонения
- Видеть дашборд — кто работал, сколько продал, сколько заказов
- Считать зарплату — формулы по ролям + индивидуальные корректировки
1. Расширение профиля сотрудника
1.1 Новые вкладки в карточке сотрудника
Сейчас карточка — одна форма. Нужно организовать по вкладкам (как у Юмы):
| Вкладка | Что содержит | Кто видит |
|---|---|---|
| Общая информация | Текущие поля (ФИО, email, телефон, PIN, роль, статус, курьер) | franchise, franchisee |
| Роли и магазины | Роль сотрудника + привязанные ТТ + индивидуальная формула зарплаты (если отличается от ролевой) | franchise, franchisee |
| Юридические детали | ИНН, паспортные данные, водительское удостоверение (номер, срок), СНИЛС | franchise, franchisee |
| Рабочее время | Отработанные часы за период (план/факт), история смен | franchise, franchisee, manager (своя ТТ) |
| История заказов | Заказы, оформленные сотрудником (из Order Service, когда появится) | franchise, franchisee |
1.2 Юридические детали (новая сущность)
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
| inn | string | Необязательно | ИНН сотрудника (12 цифр для физлица) |
| passport_series | string | Необязательно | Серия паспорта |
| passport_number | string | Необязательно | Номер паспорта |
| driver_license_number | string | Необязательно | Номер водительского удостоверения |
| driver_license_expiry | date | Необязательно | Срок действия ВУ |
| snils | string | Необязательно | СНИЛС |
Персональные данные
Юридические детали — чувствительные данные. Доступ только у franchise и franchisee (только для своих сотрудников). Менеджер и кассир не видят.
2. Расписание работы (Графики смен)
2.1 Концепция
Расписание — это план/факт учёт рабочего времени:
- Плановое время — менеджер или франчайзи заранее планирует, когда сотрудник должен работать
- Фактическое время — фиксируется автоматически через POS (кнопки “Начать работу” / “Завершить работу”) или вручную через админку
2.2 Экран расписания
Новая страница в админке: Сотрудники → Расписание
Визуализация: Таблица-календарь на неделю или месяц:
- Строки = сотрудники
- Столбцы = дни
- Ячейки = плановые и фактические смены с цветовой кодировкой
Фильтры:
- По ТТ (обязательный — расписание составляется для конкретной точки)
- По роли
- По периоду (неделя / месяц)
- По статусу смены (все, по расписанию, не по расписанию, пропущено, вне плана)
Сводка:
- В правой колонке — часы за период: план / факт по каждому сотруднику
2.3 Шаблоны смен
Для удобства — заранее настроенные шаблоны:
- Название (например, “Утренняя”, “Вечерняя”, “Полный день”)
- Время начала
- Продолжительность (время окончания рассчитывается автоматически)
- Привязка к ТТ
- Максимум 4 шаблона на ТТ
2.4 Создание/редактирование плановых смен
- Выбрать ячейки в расписании → задать шаблон или вручную (время начала + длительность)
- Массовое редактирование: выбрать несколько ячеек → применить шаблон
- Ограничение: плановые смены можно создавать только на будущие дни (не текущий и не прошедший)
- Удаление плановых смен — только будущие
2.5 Четыре статуса смены (автоматические)
При наличии и планового, и фактического времени система автоматически присваивает статус:
| Статус | Цвет | Условие |
|---|---|---|
| По расписанию | Зелёный | Факт начался за ≤30 мин до плана И закончился ≤30 мин после плана |
| Не по расписанию | Жёлтый | Факт есть, но отклонение >30 мин |
| Пропущено | Красный | План был, но факт отсутствует |
| Вне плана | Сиреневый | Плана не было, но сотрудник отработал |
2.6 Корректировка прошедших смен
Прошедшие смены нельзя удалить. Но можно скорректировать отработанные часы:
- Тип: Увеличение / Уменьшение
- Величина (часы, минуты)
- Комментарий (обязательный)
- Возможность сбросить корректировку
2.7 Кто что может
| Действие | Франшиза | Франчайзи | Менеджер ТТ | Кассир |
|---|---|---|---|---|
| Просмотр расписания | Все ТТ | Свои ТТ | Своя ТТ | Нет |
| Составление расписания | Все ТТ | Свои ТТ | Нет | Нет |
| Корректировка прошедших смен | Все ТТ | Свои ТТ | Нет | Нет |
| Управление шаблонами | Все ТТ | Свои ТТ | Нет | Нет |
3. Учёт рабочего времени
3.1 Фиксация факта (из POS)
Когда сотрудник на POS нажимает “Начать работу” / “Завершить работу”, создаётся запись:
- employee_id
- store_id
- clock_in (timestamp)
- clock_out (timestamp, null пока не завершил)
- break_start (timestamp, null) — начало перерыва
- break_end (timestamp, null) — конец перерыва
- break_duration (минуты, вычисляется)
- source:
pos|manual - auto_closed: boolean — флаг автозакрытия (если смена превысила 24ч)
Перерывы (как в Юме): сотрудник явно отмечает начало и конец перерыва на POS. В дашборде отображается отдельной колонкой. Отработанное время = clock_out - clock_in - break_duration.
Автозакрытие: если clock_out отсутствует дольше 24 часов — система автоматически закрывает смену, ставит auto_closed = true. Менеджер видит пометку и может скорректировать.
Ночные смены: бизнес-день смены = дата clock_in. Смена 22:00–06:00 принадлежит дню начала.
Зависимость от POS
Полноценная фиксация факта появится с POS-сменами (будущий BR для POS/Order Service). В MVP — ручной ввод факта через админку.
3.2 Ручной ввод факта (через админку)
Пока POS не готов, менеджер/франчайзи может вручную внести фактическое время:
- В расписании → двойной клик по ячейке → указать “Факт: с … по …”
- Или массово: выбрать сотрудника за период → ввести часы
3.3 Вкладка “Рабочее время” в профиле
Отображает отработанные часы сотрудника за выбранный период:
- Календарь с часами по дням
- Итого за период: план, факт, перерывы, чистое время, разница
- Статусы смен (цветовая кодировка)
- Пометки автозакрытых смен (для корректировки)
4. Дашборд активности сотрудников
4.1 Новая страница: Активность → Сотрудники
Сводка по работе сотрудников за выбранную дату.
Фильтры:
- По ТТ
- По дате (по умолчанию — сегодня)
По каждому сотруднику:
| Колонка | Описание |
|---|---|
| Сотрудник | ФИО |
| Пришёл | Время начала работы |
| Ушёл | Время окончания работы |
| Перерыв | Длительность перерыва |
| Отработано | Общая длительность смены |
| Создано заказов | Число заказов за день |
| Выполнено | Число закрытых заказов |
| Доставлено | Число доставленных (для курьеров) |
| Продажи | Сумма продаж |
| Последняя продажа | Время последней продажи |
Сводка (шапка):
- Выручка за день (по выбранной ТТ или по всем)
- Всего заказов
- Всего сотрудников на смене
- Лидер продаж (по сумме заказов)
Зависимость от Order Service
Колонки с заказами и продажами появятся после реализации Order Service (BR 2.1). Пока — только время работы (приход/уход/отработано).
4.2 Кто видит дашборд
| Роль | Доступ |
|---|---|
| Франшиза | Все ТТ |
| Франчайзи | Свои ТТ |
| Менеджер ТТ | Своя ТТ |
| Кассир | Нет доступа |
5. Зарплата
5.1 Формула по роли
Каждая роль (из наших четырёх) может иметь формулу начисления зарплаты:
- Почасовая ставка —
ставка × отработанные часы - Фиксированный оклад —
оклад за месяц - Смешанная —
оклад + ставка × часы сверх нормы
Настраивается в справочнике ролей (или в настройках ТТ — ставки могут отличаться по точкам).
5.2 Индивидуальная формула
Для конкретного сотрудника можно задать свою формулу, которая перекрывает ролевую.
5.3 Платёжные ведомости (Payroll)
Новая страница: Сотрудники → Платёжные ведомости
Автоматический расчёт начислений за период (месяц):
- По каждому сотруднику: отработанные часы × ставка или оклад
- Итого к выплате
- Статус: Рассчитано / Подтверждено / Выплачено
Скоуп платёжных ведомостей
Как в Юме — только начисление (
ставка × часыили оклад). Без НДФЛ, взносов, вычетов — это 1С-территория. Экспорт в CSV для передачи бухгалтеру.
5.4 Кто управляет зарплатой
| Действие | Франшиза | Франчайзи | Менеджер | Кассир |
|---|---|---|---|---|
| Настройка формул по ролям | Да | Да (свои) | Нет | Нет |
| Настройка индивидуальных формул | Да | Да (свои) | Нет | Нет |
| Просмотр ведомостей | Да | Да (свои) | Нет | Нет |
| Подтверждение ведомостей | Да | Да (свои) | Нет | Нет |
6. Изменения в существующей реализации (BR 1.4)
Обратная совместимость
Всё, что реализовано в BR 1.4, остаётся. Ниже — точечные доработки.
6.1 Карточка сотрудника → Вкладки
Текущая карточка — плоская форма. Переделать на вкладки (см. раздел 1.1).
Поля из BR 1.4 остаются как есть — просто переезжают на вкладку “Общая информация”.
6.2 Привязка к ТТ — множественная для кассира
В BR 1.4 кассир привязан к одной ТТ. В Юме — к нескольким магазинам.
Решение: оставить как есть (одна ТТ для кассира) — для нашей модели это достаточно, т.к. POS всегда привязан к конкретной точке. Пересматриваем если будет реальная потребность.
6.3 Архив сотрудников
В BR 1.4 есть деактивация. У Юмы — отдельный “архивный список” с возможностью восстановления. У нас деактивация + реактивация уже покрывает этот кейс. Добавить:
- Фильтр “Показать деактивированных” в списке (если ещё нет)
- Или отдельная кнопка “Архив” для просмотра деактивированных
Что НЕ берём из Юмы (и почему)
| Фича Юмы | Почему не берём | Перспектива |
|---|---|---|
| Произвольные роли (создание новых) | У нас 4 фиксированные роли — покрывают бизнес-иерархию франшизы | Заложить в архитектуру: при проектировании хранить role как FK на таблицу ролей, а не enum. Когда понадобится — добавить UI конструктор ролей и пермишенов без переписывания бэкенда. |
| Гранулярные права по разделам бэкофиса | Ролевая матрица зашита в код. Для MVP достаточно. | Связано с кастомными ролями — реализовать вместе. |
| MFA (двухфакторная аутентификация) | Не приоритет для MVP, усложняет auth-flow | Отдельная BR когда будет потребность (email-код через Resend, позже SMS) |
| Денежный ящик при открытии смены | POS-функция, не для админки | Войдёт в будущую BR для POS |
| Печать отчёта по смене (чековый принтер) | POS-функция | Войдёт в будущую BR для POS |
| Курьерское приложение (YUMA GO) | Отдельный продукт | Не в скоупе MVP |
Приоритеты реализации (предложение)
| Очередь | Блок | Зависимости |
|---|---|---|
| 1 | Расширение профиля (вкладки, юр. детали) | Нет — чистый UI + новая таблица |
| 2 | Расписание (план/факт, шаблоны, статусы) | Нет — новый модуль |
| 3 | Дашборд активности (только время) | Зависит от расписания |
| 4 | Зарплата (формулы, базовый расчёт) | Зависит от расписания (часы) |
| 5 | Дашборд активности (заказы, продажи) | Зависит от Order Service (BR 2.1) |
Затронутые сервисы
| Сервис | Что делать |
|---|---|
| User Service | Новые таблицы: employee_legal_details, shift_schedules, shift_templates, shift_records, salary_formulas. Новые эндпоинты. |
| Auth Service | (пока не затронут — MFA вынесен за скоуп) |
| Admin BFF | Проксирование новых эндпоинтов |
| Admin Web | Расписание (календарь), вкладки карточки, дашборд, зарплата |
| Order Service | (будущее) Данные по заказам сотрудника для дашборда |
Связи с другими BR
- BR 1.4 (базовый CRUD сотрудников) — расширяем
- BR 1.3 (авторизация) — учёт времени связан с логином на POS
- BR 1.5 (торговые точки) — расписание привязано к ТТ
- BR 2.1 (Order Service) — данные по заказам для дашборда
Принятые решения (закрытые вопросы)
| # | Вопрос | Решение | Обоснование |
|---|---|---|---|
| 1 | Перерывы | Фиксируем как в Юме — отдельные отметки “Пришёл / Ушёл / Перерыв” | 1 в 1 с Юмой, чтобы не встрять при расширении. В дашборде — отдельная колонка “Перерыв”. |
| 2 | Ночные смены | По дню начала — смена 22:00–06:00 принадлежит дню начала | Стандарт табельного учёта. В базе — timestamp, бизнес-день = дата clock_in. |
| 3 | Макс. длительность | 24 часа (как в Юме) | У Юмы так же. Автозакрытие через 24ч с флагом для ручной корректировки менеджером. |
| 4 | Зарплата: налоги | Только начисление, без НДФЛ/взносов | Как в Юме — ставка × часы или оклад. Бухгалтерия ведётся в 1С. Экспорт в CSV для бухгалтера. |