Расписание смен

Роут: /schedule Основной API: GET /api/v1/schedules, GET /api/v1/shift-records


Что видит пользователь

Страница с табличным календарём смен. Строки — сотрудники, столбцы — дни. Вверху — заголовок “Расписание”, фильтры и переключатель периода (неделя/месяц).


Layout

Таблица-календарь

ЭлементОписание
СтрокиСотрудники (ФИО + роль)
СтолбцыДни выбранного периода
ЯчейкиПлановые и фактические смены с цветовым кодированием
Итого (справа)План/факт часов за период по сотруднику

Цветовое кодирование ячеек

ЦветСтатусОписание
Зелёныйon_scheduleФактическая смена совпадает с планом
Жёлтыйoff_scheduleФактическая смена без плановой
КрасныйmissedПлановая смена без фактической (прошедший день)
ФиолетовыйunplannedНезапланированная смена (вне расписания)
Серый (контур)Плановая смена (будущий день, ещё не наступила)

Содержимое ячейки

  • Время начала — время окончания (например “09:00 — 17:00”)
  • Если плановая и фактическая отличаются — показать обе (план зачёркнут, факт жирный)
  • Пустая ячейка — нет смены

Фильтры

ФильтрТипЗначенияDefault
Торговая точкаSelectСписок ТТОбязательный — первая ТТ пользователя
ПериодToggleНеделя / МесяцНеделя
РольSelectВсе / Менеджер ТТ / Кассир / КурьерВсе
Статус сменыSelectВсе / on_schedule / off_schedule / missedВсе
  • Навигация по датам: стрелки ”← Пред.” / “След. →” + кнопка “Сегодня”
  • Query params: store_id, from, to, role

Взаимодействия

Клик по ячейке (будущая дата, пустая)

  • Открывает модалку создания плановой смены
  • Предзаполнено: дата, сотрудник
  • Поля: время начала, время окончания, шаблон смены (select)
  • Кнопки: “Сохранить” / “Отмена”
  • API: POST /api/v1/schedules

Клик по ячейке (есть плановая смена)

  • Открывает модалку редактирования плановой смены
  • Поля: время начала, время окончания
  • Кнопки: “Сохранить” / “Удалить” / “Отмена”
  • API: PATCH /api/v1/schedules/{id}, DELETE /api/v1/schedules/{id}

Двойной клик по ячейке (есть фактическая смена)

  • Открывает модалку детали смены
  • Показывает: план vs факт, clock_in, clock_out, break_minutes, статус
  • Если прошедшая дата — кнопка “Корректировка” (см. ниже)

Шаблон смены (в модалке создания/редактирования)

  • Select “Шаблон” — загружается из GET /api/v1/shift-templates?store_id={store_id}
  • При выборе шаблона: автозаполнение start_time и end_time (start_time + duration)
  • Можно не использовать шаблон — заполнить вручную

Модалка корректировки (прошедшие смены)

Триггер: кнопка “Корректировка” в детали смены API: POST /api/v1/shift-records/{shift_record_id}/corrections

ПолеТипОписание
ТипSelectclock_in_correction, clock_out_correction, break_correction, full_override
Новое значениеTime inputЗависит от типа
ПричинаTextareaОбязательное
  • Кнопки: “Применить корректировку” / “Отмена”
  • После успеха: обновить ячейку, toast “Корректировка применена”

Итоговая колонка

ПоказательОписание
ПланСумма плановых часов за период
ФактСумма фактических часов за период
ДельтаРазница (зелёная если факт >= план, красная если меньше)

Состояния

СостояниеЧто показываем
ЗагрузкаSkeleton-таблица
Пусто”Нет сотрудников для выбранной точки”
Нет сменТаблица с пустыми ячейками (сотрудники есть, смен нет)
Ошибка”Не удалось загрузить расписание” + “Повторить”

Ролевой доступ

РольДоступ
FranchiseПросмотр и редактирование всех ТТ
FranchiseeПросмотр и редактирование своих ТТ
Менеджер ТТТолько просмотр своей ТТ
КассирНет доступа — 403, редирект

Переходы

ОткудаКудаТриггер
РасписаниеКарточка сотрудникаКлик по ФИО в строке
РасписаниеШаблоны сменСсылка “Управление шаблонами”
Карточка сотрудника (таб “Рабочее время”)РасписаниеСсылка “Открыть расписание”

Ссылки