Календарь и планирование записей
Раздел «Календарь записей» — это ежедневник вашего автосервиса: кто едет, во сколько и на какой пост. Здесь записывают клиентов по звонку, видят загруженность дня, переносят записи пальцем и в один тап отправляют машину в наряд. Рядом живёт раздел «Напоминания» — список клиентов, которым нужно позвонить сегодня или завтра перед визитом.
Как открыть
- Календарь записей — боковая навигация (иконка внизу) → «Ещё» → «Календарь записей» (маршрут
/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 и больше (эвристика «занятый день»). Реальную загруженность постов смотрите на самом таймлайне — там видно, в какие часы ещё есть место.
Хочу видеть только записи на один пост, не все подряд — как?
В строке фильтров под полосой дней нажмите чип «Пост» и выберите нужный. Таймлайн сузится до записей этого поста. Чтобы снова видеть всё — нажмите «Сбросить».
Что значат цвета карточек на таймлайне?
Жёлтые — ещё не подтверждены (запрошена или запланирована). Зелёные — клиент подтвердил или уже приехал (принята). Красные — отменена или клиент не приехал. Синие — завершена.