Учёт рабочего времени

Источник требований

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
Источникenumpos (автоматически с 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:

  1. Система автоматически закрывает смену (clock_out = clock_in + 24h)
  2. Ставит флаг auto_closed = true
  3. В расписании и дашборде смена помечена специальной иконкой
  4. Менеджер/франчайзи видит пометку и может скорректировать реальное время через корректировку

Автозакрытие = сигнал проблемы

Автозакрытая смена означает, что сотрудник забыл отметить уход. Менеджер должен выяснить причину и скорректировать часы.


Ручной ввод факта (через админку)

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 — фиксирует только свою смену

Связи с другими модулями