Учёт рабочего времени
Источник требований
BR 1.4.1, раздел 3
Референс
YUMA POS:
_reference/yumapos/employees-dashboard.md,_reference/yumapos/start-shift.md
Фиксация фактически отработанного времени сотрудников. Данные поступают из POS (автоматически) или вводятся вручную через админку.
Фиксация факта
Запись фактической смены
Каждая фактическая смена — отдельная запись:
| Поле | Тип | Описание |
|---|---|---|
| Сотрудник | uuid | Кто работал |
| ТТ | uuid | Где работал |
| Бизнес-день | date | Дата начала смены (по clock_in) |
| Приход (clock_in) | timestamp | Время начала работы |
| Уход (clock_out) | timestamp, nullable | Время окончания. Null = смена открыта. |
| Начало перерыва (break_start) | timestamp, nullable | Когда ушёл на перерыв |
| Конец перерыва (break_end) | timestamp, nullable | Когда вернулся с перерыва |
| Длительность перерыва | integer (минуты) | Вычисляется: break_end − break_start |
| Источник | enum | pos (автоматически с POS) или manual (ввод через админку) |
| Автозакрытие | boolean | Флаг: смена закрыта автоматически (превышение 24ч) |
Расчёт отработанного времени
Отработано = clock_out − clock_in − break_duration ± корректировки
Перерывы
Как в YUMA POS — сотрудник явно отмечает начало и конец перерыва:
- На POS: кнопки “Начать перерыв” / “Завершить перерыв”
- В админке (ручной ввод): поля break_start и break_end
В дашборде активности перерыв отображается отдельной колонкой.
Один перерыв за смену
В текущей версии фиксируется один перерыв за смену. Если понадобится несколько перерывов — выносим в отдельную таблицу (break_records).
Ночные смены
Смена, пересекающая полночь (например, 22:00–06:00):
- Бизнес-день = дата
clock_in(начала смены) - Смена 22:00 12 апреля → 06:00 13 апреля принадлежит 12 апреля
- В расписании отображается в ячейке дня начала
- При подсчёте часов за месяц: вся смена целиком попадает в месяц начала
Автозакрытие (правило 24 часов)
Максимальная продолжительность смены — 24 часа (как в YUMA POS).
Если clock_out отсутствует дольше 24 часов после clock_in:
- Система автоматически закрывает смену (
clock_out = clock_in + 24h) - Ставит флаг
auto_closed = true - В расписании и дашборде смена помечена специальной иконкой
- Менеджер/франчайзи видит пометку и может скорректировать реальное время через корректировку
Автозакрытие = сигнал проблемы
Автозакрытая смена означает, что сотрудник забыл отметить уход. Менеджер должен выяснить причину и скорректировать часы.
Ручной ввод факта (через админку)
MVP-сценарий
Пока POS не готов, фактическое время вводится вручную. После появления POS ручной ввод остаётся как резервный способ.
Из расписания
- Двойной клик по ячейке → модалка “Рабочее расписание”
- Указать: Факт с … по …, перерыв с … по …
- Источник автоматически =
manual
Массовый ввод
- Выбрать сотрудника → выбрать период → ввести часы по дням
Вкладка “Рабочее время” в профиле сотрудника
В карточке сотрудника (вкладка “Рабочее время”) отображается:
- Фильтр по периоду (неделя / месяц)
- Календарь с часами по дням — по каждому дню: план, факт, статус (цветовая кодировка)
- Итого за период:
- Плановые часы
- Фактические часы
- Перерывы
- Чистое отработанное время (факт − перерывы ± корректировки)
- Разница план/факт
- Пометки автозакрытых смен (для корректировки менеджером)
- Статусы смен — цветовая кодировка (зелёный, жёлтый, красный, сиреневый)
Ролевая матрица
(Обновлено в BR 1.4.4 — колонки scope вместо enum, permission для обычных сотрудников)
| Действие | Владелец франшизы | Владелец партнёра | Обычный сотрудник (permission) |
|---|---|---|---|
| Просмотр рабочего времени | Все сотрудники | Свои сотрудники | time_tracking.read в рамках своих ТТ |
| Ручной ввод факта | Все ТТ | Свои ТТ | time_tracking.edit в рамках своих ТТ |
| Фиксация на POS (clock in/out) | — | Свои (если есть pos.access) | pos.access — фиксирует только свою смену |
Связи с другими модулями
- Сотрудники — вкладка “Рабочее время” в профиле
- Расписание смен — план для сопоставления с фактом
- Дашборд — данные для сводки за день
- Зарплата — отработанные часы → расчёт начислений