Расписание смен
Роут: /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
| Поле | Тип | Описание |
|---|
| Тип | Select | clock_in_correction, clock_out_correction, break_correction, full_override |
| Новое значение | Time input | Зависит от типа |
| Причина | Textarea | Обязательное |
- Кнопки: “Применить корректировку” / “Отмена”
- После успеха: обновить ячейку, toast “Корректировка применена”
Итоговая колонка
| Показатель | Описание |
|---|
| План | Сумма плановых часов за период |
| Факт | Сумма фактических часов за период |
| Дельта | Разница (зелёная если факт >= план, красная если меньше) |
Состояния
| Состояние | Что показываем |
|---|
| Загрузка | Skeleton-таблица |
| Пусто | ”Нет сотрудников для выбранной точки” |
| Нет смен | Таблица с пустыми ячейками (сотрудники есть, смен нет) |
| Ошибка | ”Не удалось загрузить расписание” + “Повторить” |
Ролевой доступ
| Роль | Доступ |
|---|
| Franchise | Просмотр и редактирование всех ТТ |
| Franchisee | Просмотр и редактирование своих ТТ |
| Менеджер ТТ | Только просмотр своей ТТ |
| Кассир | Нет доступа — 403, редирект |
Переходы
| Откуда | Куда | Триггер |
|---|
| Расписание | Карточка сотрудника | Клик по ФИО в строке |
| Расписание | Шаблоны смен | Ссылка “Управление шаблонами” |
| Карточка сотрудника (таб “Рабочее время”) | Расписание | Ссылка “Открыть расписание” |
Ссылки