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


Общая идея

Сейчас раздел “Сотрудники” позволяет создать/отредактировать/деактивировать сотрудника. Этого недостаточно для ежедневного управления. Нужно:

  1. Расширить профиль — юридические данные
  2. Планировать графики — составлять расписание смен заранее
  3. Учитывать рабочее время — факт vs. план, отклонения
  4. Видеть дашборд — кто работал, сколько продал, сколько заказов
  5. Считать зарплату — формулы по ролям + индивидуальные корректировки

1. Расширение профиля сотрудника

1.1 Новые вкладки в карточке сотрудника

Сейчас карточка — одна форма. Нужно организовать по вкладкам (как у Юмы):

ВкладкаЧто содержитКто видит
Общая информацияТекущие поля (ФИО, email, телефон, PIN, роль, статус, курьер)franchise, franchisee
Роли и магазиныРоль сотрудника + привязанные ТТ + индивидуальная формула зарплаты (если отличается от ролевой)franchise, franchisee
Юридические деталиИНН, паспортные данные, водительское удостоверение (номер, срок), СНИЛСfranchise, franchisee
Рабочее времяОтработанные часы за период (план/факт), история сменfranchise, franchisee, manager (своя ТТ)
История заказовЗаказы, оформленные сотрудником (из Order Service, когда появится)franchise, franchisee

1.2 Юридические детали (новая сущность)

ПолеТипОбязательностьОписание
innstringНеобязательноИНН сотрудника (12 цифр для физлица)
passport_seriesstringНеобязательноСерия паспорта
passport_numberstringНеобязательноНомер паспорта
driver_license_numberstringНеобязательноНомер водительского удостоверения
driver_license_expirydateНеобязательноСрок действия ВУ
snilsstringНеобязательноСНИЛС

Персональные данные

Юридические детали — чувствительные данные. Доступ только у 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 для бухгалтера.