Шаблоны смен
Роут: /schedule/templates (или модалка внутри страницы расписания)
API: GET/POST/PATCH/DELETE /api/v1/shift-templates
Что видит пользователь
Простая страница или модалка со списком шаблонов смен для выбранной торговой точки. Шаблоны упрощают создание расписания — вместо ручного ввода времени выбирается готовый шаблон.
Список шаблонов
Таблица
| Колонка | Данные | Примечание |
|---|---|---|
| Название | name | Например “Утренняя”, “Вечерняя”, “Полная” |
| Начало | start_time | Формат HH:MM |
| Длительность | duration_minutes | Отображать как “8ч 00м” |
| Окончание | Расчётное | start_time + duration_minutes |
| Действия | — | Редактировать / Удалить |
Фильтр
- Торговая точка (Select, обязательный) —
store_id - Query param:
?store_id={id}
Создание шаблона
Триггер: кнопка “Добавить шаблон”
API: POST /api/v1/shift-templates
Модалка создания
| Поле | Тип ввода | Обязательно | Валидация |
|---|---|---|---|
| Название | Text input | Да | max 100 символов |
| Время начала | Time picker | Да | HH:MM |
| Длительность | Number input | Да | 1–1440 минут |
- Кнопки: “Сохранить” / “Отмена”
- После успеха: добавить в список, toast “Шаблон создан”
Максимум 4 шаблона на ТТ
Если у точки уже 4 шаблона — кнопка “Добавить шаблон” disabled с tooltip “Максимум 4 шаблона на точку”. Валидация на клиенте + сервер вернёт
SHIFT_TEMPLATE_LIMIT_EXCEEDED.
Редактирование шаблона
Триггер: кнопка “Редактировать” в строке
API: PATCH /api/v1/shift-templates/{id}
- Та же модалка, предзаполненная текущими значениями
- Кнопки: “Сохранить” / “Отмена”
- После успеха: обновить строку, toast “Шаблон обновлён”
Удаление шаблона
Триггер: кнопка “Удалить” в строке
API: DELETE /api/v1/shift-templates/{id}
- Модалка подтверждения: “Удалить шаблон «{name}»? Существующие смены не будут затронуты.”
- Кнопки: “Отмена” / “Удалить” (красная)
- После успеха: убрать из списка, toast “Шаблон удалён”
Состояния
| Состояние | Что показываем |
|---|---|
| Загрузка | Skeleton-строки |
| Пусто | ”Шаблоны смен не созданы” + кнопка “Добавить шаблон” |
| Ошибка | ”Не удалось загрузить шаблоны” + “Повторить” |
Ролевой доступ
| Роль | Доступ |
|---|---|
| Franchise | Полный CRUD для любой ТТ |
| Franchisee | Полный CRUD для своих ТТ |
| Менеджер ТТ | Только просмотр |
| Кассир | Нет доступа |