Календарь и планирование записей
Раздел «Календарь записей» — это ежедневник вашего автосервиса: кто едет, во сколько и на какой пост. Здесь записывают клиентов по звонку, видят загруженность дня, переносят записи пальцем и в один тап отправляют машину в наряд. Рядом живёт раздел «Напоминания» — список клиентов, которым нужно позвонить сегодня или завтра перед визитом.
Как открыть
- Календарь записей — боковая навигация (иконка внизу) → «Ещё» → «Календарь записей» (маршрут
/calendar). - Напоминания (обзвон) — «Ещё» → «Напоминания» (маршрут
/reminders). Пункт виден только при включённом модуле напоминаний. - Из уведомления «Клиент просит перенос» и других событий приложение само открывает нужный день и подсвечивает запись.
Что на экране
Экран «Календарь записей»
Сверху вниз:
- Шапка (AppBar) — заголовок «Календарь на сегодня», справа иконка AI-приёмщика.
- Навигация по дням — стрелки ‹ › с датой по центру и кнопкой «Сегодня».
- Полоса дней — горизонтальная лента чисел ±1 год; кольцо загруженности вокруг каждого числа.
- Строка фильтров — чипы «Площадка», «Пост», «Статус» и кнопка сброса.
- Таймлайн (сетка часов) — прокручиваемый список строк по часам (по умолчанию 8–19, расширяется под ранние/поздние записи). Карточки записей лежат поверх сетки как прямоугольники высотой «длительность».
- Кнопка «+ Запись» (FAB, большая кнопка внизу справа) — при перетаскивании превращается в корзину «В корзину».
Экран «Напоминания (обзвон)»
- Шапка — заголовок «Напоминания (обзвон)».
- Переключатель «Сегодня / Завтра» — прямо под заголовком.
- Сводка — две статусные строки с иконками: «К обзвону: N» и «Отправлено: M» над списком.
- Список карточек — клиент, авто/услуга, кнопка звонка, галочка «отметил».
Каждая кнопка и действие
Навигация по дням (полоса и шапка)
| Элемент | Где | Что делает | Кому доступно |
|---|---|---|---|
| Стрелка ‹ «Предыдущий день» | Шапка навигации, слева от даты | Переходит на один день назад | Все |
| Стрелка › «Следующий день» | Шапка навигации, справа от даты | Переходит на один день вперёд | Все |
| Дата по центру (значок календарика + «Сегодня · 13 июл» или «Пт · 12 июл») | Между стрелками | Тап открывает системный мини-календарь — выбрать любую дату за ±1 год | Все |
| Кнопка «Сегодня» | Справа от даты (появляется, если вы не на сегодня) | Возвращает к сегодняшнему дню | Все |
| Ячейка числа в полосе дней | Горизонтальная лента под навигацией | Тап — переход на этот день; выбранный день выделен цветом. Дуга-кольцо вокруг числа показывает долю загруженности: растёт пропорционально числу записей (полный круг = 8 записей). Цвет дуги: зелёный — до 2 записей, жёлтый — 3–5, красный — 6 и больше | Все |
| Свайп влево по таймлайну | Область расписания | Переход на следующий день | Все |
| Свайп вправо по таймлайну | Область расписания | Переход на предыдущий день | Все |
| Потянуть список вниз (pull-to-refresh) | Область расписания | Перезагружает записи дня | Все |
Фильтры дня
| Элемент | Где | Что делает | Кому доступно |
|---|---|---|---|
| Чип «Площадка» (иконка метки места) | Строка фильтров — появляется, только если площадок больше одной | Открывает выпадающий список площадок; выбор сужает список записей | Все |
| Чип «Пост» (иконка гаража) | Строка фильтров — появляется, если у площадки есть посты | Открывает список постов (сужается под выбранную площадку) | Все |
| Чип «Статус» (иконка флажка) | Строка фильтров | Открывает список: «Все» / «Запланировано» (ещё не приняты) / «Приняты» (чек-ин сделан) | Все |
| Кнопка «Сбросить» (значок X + текст «Сбросить») | Строка фильтров — появляется, когда хоть один фильтр активен | Сбрасывает все три фильтра разом | Все |
Таймлайн — ячейки часов
| Элемент | Где | Что делает | Кому доступно |
|---|---|---|---|
| Тап по пустой ячейке часа (первый тап) | Фон таймлайна, любая строка часа | Отмечает час начала (подсвечивается синей рамкой слева); появляется подсказка «Коснитесь часа окончания, чтобы создать запись на этот диапазон» | Только при праве scheduling:create |
| Тап по другой ячейке часа (второй тап) | Фон таймлайна | Открывает форму «Новая запись» с заранее заполненными началом и концом по выбранному диапазону | Только при праве scheduling:create |
| Долгое нажатие на ячейку часа | Фон таймлайна | Открывает форму «Новая запись» с датой и часом, на котором нажали (длительность 1 час по умолчанию) | Только при праве scheduling:create |
| Перетаскивание карточки записи на ячейку часа | Фон таймлайна (зона дроп-цели подсвечивается с меткой часа) | Переносит запись на новый час; длительность сохраняется. Работает во всю ширину поверх других карточек | Только при праве scheduling:create |
Карточка записи в таймлайне
| Элемент | Где | Что делает | Кому доступно |
|---|---|---|---|
| Тап по карточке записи | Таймлайн | Открывает нижнее меню действий (подробнее — в разделе «Диалоги») | Все; у завершённых/отменённых/неявок тап заблокирован |
| Кнопка «Записать приезд» (зелёная пилюля внутри карточки) | Внутри карточки — появляется только для записей сегодняшнего дня в статусах «ожидает», «подтверждена», «запрошена» и только если карточка достаточно высокая (≥ 56 пикселей, ~1 час) | Открывает форму создания наряда с уже заполненным клиентом, авто и id записи; после сохранения наряда сразу открывает его | Только при праве scheduling:create |
| Зажать карточку и тянуть (long-press drag) | Карточка записи | Начинает перетаскивание: FAB внизу превращается в корзину «В корзину», сама карточка блекнет. Можно перенести на другой час или бросить в корзину | Только при праве scheduling:create |
FAB и корзина
| Элемент | Где | Что делает | Кому доступно |
|---|---|---|---|
| «+ Запись» (FAB с иконкой плюса и подписью «Запись») | Нижний правый угол экрана | Открывает форму «Новая запись» без предустановленного времени | Только при праве scheduling:create |
| «В корзину» (FAB-корзина, красная, появляется при перетаскивании) | Нижний правый угол — только во время drag карточки | Принять брошенную карточку: запускает удаление с таймером 5 секунд и кнопками «Отмена» / «Удалить» | Только при праве scheduling:create |
Кнопка AI-приёмщика
| Элемент | Где | Что делает | Кому доступно |
|---|---|---|---|
| Иконка AI-приёмщика (наушники с человечком) | Правый угол AppBar | Открывает экран «AI-приёмщик» | Только при праве scheduling:create |
Форма «Новая запись» (bottom-sheet)
| Элемент | Где | Что делает | Кому доступно |
|---|---|---|---|
| Поле «Площадка» (иконка магазина, picker-поле) | Форма, вверху — только если площадок больше одной | Тап открывает список площадок; выбор обязателен, без него форма не отправится (показывается «Обязательное поле») | Все |
| Выпадающий список «Пост» (иконка гаража) | Форма — только если у площадки больше одного поста | Выбор конкретного поста для записи; «Без поста» — значение по умолчанию | Все |
| Поля «Клиент» и «Авто» (сдвоенный picker) | Форма | Тап по клиенту открывает список клиентов; выбор клиента подтягивает его первое авто. Оба поля необязательны | Все |
| Предупреждение «Клиент ранее не приезжал — рекомендуем подтвердить запись» + счётчик неявок | Форма — появляется под полем клиента, если у него есть пропущенные визиты | Информационная плашка, действий не требует; не блокирует создание | Все |
| Поле «Услуга · Необязательно» (иконка гаечного ключа) | Форма | Свободный текст: что нужно сделать. Не обязательно | Все |
| Плитка «Выбрать дату и время» / дата начала (иконка часов) | Форма | Тап открывает сначала выбор даты, затем выбор времени начала; заполняется из предустановленного значения, если запись создаётся с таймлайна | Все |
| Плитка «Окончание» (иконка таймлайна, появляется после выбора начала) | Форма под полем начала | Тап открывает выбор даты и времени окончания; по умолчанию начало + 1 час; нельзя поставить конец раньше начала | Все |
| Кнопка «Подобрать время» (иконка звёздочки) | Форма под полем времени | Запрашивает у сервера 3 ближайших свободных слота с учётом загрузки постов; пока загружает — показывает крутилку и заблокирована | Все |
| Чипы подобранных слотов (до 3 штук) | Форма — появляются после нажатия «Подобрать время» | Тап по чипу подставляет это время в поле начала; выбранный чип выделяется. Рядом с временем может быть короткая причина: «точно свободно», «ближайшее время», «удобное время дня», «оптимально по загрузке» | Все |
| Кнопка «Создать запись» (основная, заполненная) | Внизу формы | Отправляет запись; пока сохраняет — показывает крутилку. Площадка не выбрана → не отправит, покажет ошибку под полем | Все с правом scheduling:create |
Экран «AI-приёмщик»
| Элемент | Где | Что делает | Кому доступно |
|---|---|---|---|
| Чип-пример (3 варианта на старте: «Когда примете на замену масла завтра?», «Запишите на диагностику, Иван, +372 5xxxxxxx», «Какое ближайшее свободное время?») | Экран, когда диалог пуст | Тап подставляет фразу в поле ввода | Все |
| Поле ввода «Реплика клиента…» | Нижняя панель | Многострочное поле (1–3 строки); Enter/«Отправить» на клавиатуре отправляет сообщение | Все |
| Кнопка «Отправить» (иконка самолётика, заполненная) | Справа от поля | Отправляет текст AI-приёмщику; заблокирована, пока идёт ответ | Все |
| Индикатор загрузки (тонкая линия под диалогом) | Нижняя панель | Появляется, пока AI думает | Автоматически |
| Чипы слотов под ответом AI | Пузырь ответа | Неактивные информационные метки времени — показывают предложенное время | Все |
Экран «Напоминания (обзвон)»
| Элемент | Где | Что делает | Кому доступно |
|---|---|---|---|
| Переключатель «Сегодня / Завтра» (SegmentedButton) | Под заголовком | Переключает список между записями на сегодня и на завтра | Все |
| Потянуть список вниз (pull-to-refresh) | Список карточек | Перезагружает список | Все |
| Иконка трубки (зелёная, заполненная, в строке карточки) | Справа в карточке — только если у клиента есть номер телефона | Тап сразу набирает номер телефона (открывает приложение «Телефон») | Все |
| Иконка галочки (круглая, в строке карточки) | Справа в карточке — только если запись ещё не отмечена | Тап отмечает «Я позвонил»: имя клиента зачёркивается, время в пилюле тускнеет, появляется маленькая галочка | Все |
| Тап по карточке клиента | Вся карточка | Открывает нижнее меню действий (подробнее — ниже) | Все |
Диалоги и подэкраны
Нижнее меню действий по записи (из тапа на карточке в таймлайне)
Открывается тапом по карточке в таймлайне — только для не-терминальных статусов (не завершена, не отменена, не «неявка»).
Шапка меню: имя клиента + авто (если заполнены).
| Элемент | Что делает |
|---|---|
| «Открыть клиента» (иконка человека) — появляется, если клиент привязан | Закрывает меню, открывает карточку клиента (/client/<id>) |
| «Открыть авто» (иконка машины) — появляется, если авто привязано | Закрывает меню, открывает карточку авто (/vehicle/<id>) |
| «Изменить дату/время» (иконка карандаша + календарика) | Закрывает меню, открывает последовательно три системных диалога: выбор даты → выбор времени начала → выбор времени окончания. Если конец ≤ начало, сервер автоматически ставит +1 час |
| «Изменить данные» (иконка карандаша) | Закрывает меню, открывает форму записи в режиме редактирования — правка клиента, машины и услуги (без смены времени) |
| «Снять подтверждение» (жёлтая иконка минуса в круге) — только если статус «подтверждена» | Возвращает запись в статус «запрошена» |
| «Подтвердить запись» (зелёная иконка галочки в круге) — только если статус НЕ «подтверждена» | Переводит запись в статус «подтверждена» |
| «Чек-ин» (иконка машины, синяя) — недоступна, если статус уже «принята» | Создаёт наряд из записи и сразу открывает его (/order/<id>) |
| «Клиент не приехал» (красная иконка человека с крестом) | Переводит запись в статус «неявка» |
| «Отменить» (иконка занятого события) | Переводит запись в статус «отменена» |
Диалог удаления через корзину (drag-to-delete)
Появляется, когда карточка записи брошена на FAB-корзину во время перетаскивания.
Это стандартный виджет «отложенного удаления» (CxPendingDelete): снек-бар показывается 5 секунд с именем клиента и двумя кнопками:
- «Отмена» — отменяет удаление, запись остаётся.
- «Удалить» — немедленно отменяет запись (не ждёт 5 секунд).
Нижнее меню действий по строке в «Напоминаниях»
Открывается тапом по карточке в списке напоминаний.
Шапка: имя клиента + время · авто · услуга.
| Элемент | Что делает |
|---|---|
| «Позвонить» (зелёная трубка) + номер телефона под кнопкой — только если телефон есть | Закрывает меню, открывает приложение «Телефон» с этим номером |
| «Скопировать номер» (иконка копирования) — только если телефон есть | Закрывает меню, копирует номер в буфер обмена; появляется снек «Телефон скопирован» |
| «Открыть клиента» (иконка человека) — только если клиент привязан | Закрывает меню, переходит на карточку клиента |
| «Открыть авто» (иконка машины) — только если авто привязано | Закрывает меню, переходит на карточку авто |
| «Отметить отправленным» (синяя иконка письма с галочкой) — только если ещё не отмечено | Закрывает меню, ставит отметку; имя клиента зачёркивается в списке; снек «Напоминание отмечено отправленным» |
Экран «AI-приёмщик» — отдельный экран
Открывается нажатием иконки в AppBar календаря. Полноценный экран с историей диалога.
- Пустой старт: иконка по центру + текст «Вставьте, что сказал клиент — подберу услугу, время и помогу записать.» + три чипа-примера фраз.
- Ответ AI: пузырь с текстом ответа + под ним чипы предложенных слотов (если AI нашёл время).
- Ошибка сети или AI недоступен: пузырь с «Не удалось обработать. Попробуйте ещё раз.»
Что если…
День пустой — нет ни одной записи
показывается текст «На этот день записей нет». Нажмите «+ Запись», чтобы добавить первую.
Фильтр скрыл все записи, хотя записи на день есть
показывается «Нет записей по фильтру». Нажмите кнопку «Сбросить» рядом с фильтрами.
Пришло уведомление «Клиент просит перенос», нажали на него — запись не нашлась
приложение открывает нужный день, но запись уже перенесена кем-то другим. Снизу появляется сообщение «Запись не найдена (возможно, перенесена)». Откройте другой день или поищите по клиенту.
Пытаетесь сделать чек-ин, но кнопка серая («Чек-ин»)
запись уже принята (статус «принята»). Чек-ин с неё уже сделан — ищите созданный наряд на доске.
Список напоминаний пуст (иконка телефонной трубки + «Записей к напоминанию нет»)
на выбранный день (сегодня или завтра) нет записей, требующих предварительного звонка. Можно переключиться на другой день кнопкой «Сегодня / Завтра».
«Напоминания» нет в меню
этот раздел доступен только когда включён модуль напоминаний. Обратитесь к владельцу — модуль включается в настройках модулей.
AI-приёмщик отвечает «скоро» или «не удалось»
AI-ключ для сервиса ещё не настроен. Это не ошибка вашего телефона. Обратитесь к владельцу — он вводит ключ в настройках.
Вопрос-ответ
Как быстро перенести запись, не открывая меню?
Зажмите карточку записи пальцем (подержите секунду) — она начнёт «плыть». Тащите на нужный час и отпустите. Длительность сохранится, только час изменится.
В: Клиент приехал, как быстро открыть наряд?
О: Нажмите на карточку записи → «Чек-ин». Наряд создастся сам и сразу откроется. Или нажмите зелёную пилюлю «Записать приезд» прямо внутри карточки (если она достаточно высокая).
В: Ошибочно нажал «Подтвердить запись», как откатить?
О: Снова откройте меню записи. Теперь вместо «Подтвердить» будет «Снять подтверждение» — нажмите её.
В: Кольцо вокруг числа в полосе дней стало красным — это значит, что свободных мест нет?
О: Не обязательно. Красное кольцо значит, что записей 6 и больше (эвристика «занятый день»). Реальную загруженность постов смотрите на самом таймлайне — там видно, в какие часы ещё есть место.
В: Хочу видеть только записи на один пост, не все подряд — как?
О: В строке фильтров под полосой дней нажмите чип «Пост» и выберите нужный. Таймлайн сузится до записей этого поста. Чтобы снова видеть всё — нажмите «Сбросить».
В: Что значат цвета карточек на таймлайне?
О: Жёлтые — ещё не подтверждены (запрошена или запланирована). Зелёные — клиент подтвердил или уже приехал (принята). Красные — отменена или клиент не приехал. Синие — завершена.