записи

04

Записи — вторая причина носить его с собой

Всё подтверждается автоматически, если кто-то не наложит вето до дедлайна. Это единственное место в продукте, где отсутствие за столом имеет цену — и где телефон её снимает. Вкладки переименованы: Ожидают и Утверждены.

9:41
Записи
АГ
Ожидают 2
Утверждены
Клиенты
Стрижка · 60 мин
Завтра, 12:30 · мастер Ирина Соколова
Клиент +7 9•• ••• •• 47 Показать
Подтвердится через 3 чcal a0f3c952
Подтвердить
Отклонить
Окрашивание · 180 мин
Чт 24 апреля, 10:00 · мастер Пётр Ким
Клиент +7 9•• ••• •• 08 Показать
Подтвердится через 26 чcal a0f3c952Из чата
Подтвердить
Отклонить
Одна очередь на все календари. Здесь нет «моих» записей.
/calendar/waiting · вкладка «В ожидании» → «Ожидают»

Строки таблицы становятся карточками, где вето — под рукой. Показывается при calendar:configure или любом из booking:confirm/reject/cancel — тот же расширенный гейт, что и в консоли.

Настоящий пробел, найденный при рисовании этого экрана. PendingBooking несёт workerId, serviceId, calendarId — и ни одного имени. А ConfirmedBooking несёт и workerDisplayName, и serviceName, и customerDisplayName. То есть на экране, где у человека секунды на решение, слов нет вообще, а на экране, где решать нечего, есть все. Карточки здесь нарисованы с именами, потому что так и должно быть — но для этого ответу очереди нужно вырасти на три поля, и это отдельная задача, а не выдумка на клиенте. Пока этого нет, честный вид карточки — строка cal a0f3c952 вместо названия.

9:41
Записи
АГ
Ожидают 2
Утверждены
Клиенты
Пн28
Вт29
Ср30
Чт1
Пт2
Сб3
Сентябрь 2026 Октябрь 2026
Ирина Соколова · 4 записи
10:00
Анна Ковалёва
Стрижка · 60 мин
11:15
Мария Орлова
Окрашивание · 120 мин
13:30
+7 ··· ·· 67
Без имени · Стрижка · 45 мин
15:00
Ольга Титова
Укладка · 40 мин
Пётр Ким · 1 запись
12:00
Дмитрий Соловьёв
Мужская стрижка · 30 мин
/calendar/bookings · вкладка «Утверждённые» → «Утверждены»

Консоль показывает сетку неделя × мастер — единственный layout в продукте, который принципиально широкий. Android меняет оси местами: лента дат, затем этот день, сгруппированный по мастеру. Вопрос, на который он отвечает («что на четверг»), не меняется.

Строка клиента — это имя. Оно на первом плане, услуга и длительность — подписью под ним. Имя всегда берётся как есть и не проверяется (никаких «недействительно»). Когда имени нет — маскированный телефон и пометка «Без имени», но никогда не шестнадцатеричный код (сбор имени при записи — отдельная задача; телефон обязателен всегда).

Месяц и год под лентой дней. Когда неделя пересекает границу месяца, под числами стоит «Сентябрь 2026 / Октябрь 2026» — тем же приглушённым шрифтом, что и подписи строк, без разделителя, год у каждого месяца, лишнее обрезается многоточием; подписи едут вместе с днями.

Два значка на строке — чат и телефон (слева направо), Material-глифы, оба всегда. Чат ведёт в диалог-источник записи (один на запись), телефон — к контакту. Тап по всей строке открывает детальную запись (следующий экран).

9:41
Запись
Анна Ковалёва
Вторник, 29 сентября 2026 10:00–11:00
УслугаСтрижка · 60 мин
МастерИрина Соколова
Телефон+7 ··· ·· 67Показать
Подтверждён по SMSда
ИсточникВиджет на сайте
Перейти к диалогу
Закрыть
строка записи → детальная запись → диалог

Тап по строке открывает запись. Дата слева, время справа — двумя выключками в одну строку, без точки между ними. «Мастер» — отдельной строкой, как «Услуга». «Источник» — простым текстом (Виджет на сайте / Telegram / Макс), без стилизованных плашек.

Телефон — за «Показать» (аудируемое раскрытие, как в треде диалога). «Перейти к диалогу» ведёт в тот самый диалог, где создана запись — связь бронь↔диалог в обе стороны: из чипа записи в диалоге — сюда, отсюда — в диалог (новые поля origin_conversation_id на брони и result_booking_id на задаче чата).

9:41
Записи
АГ
Услуги
Часы
Ожидают 2
Утверждены
Клиенты
Всё подтверждается автоматически.
Записи · сегменты → сегменты + ⋮

Сегментов не может быть больше трёх. Услуги и Часы сначала легли четвёртым и пятым сегментом — на реальном телефоне подписи стали переноситься и обрезаться, ряд физически не резиновый. Правило на будущее: операционное остаётся в сегментах, настроечное уходит за ⋮.

Разделитель простой — спроси не «часто ли этим пользуются», а «есть ли что-то срочное прямо сейчас». Ожидают/Утверждены/Клиенты — живые люди и решения с дедлайном. Услуги и Часы — словари: их читают чаще, чем правят, и ничего не «горит», если зайти туда на день позже.

Открывает то же самое: пункт меню ведёт на уже существующий экран (Услуги/Часы) без изменений внутри него — переезжает только точка входа. Тот же приём годится для любой вкладки, которая начинает разъезжаться: прежде чем резать текст или уменьшать шрифт, спроси, не пора ли часть сегментов сделать пунктами ⋮.

05

Конфигурация записей — флоу, которого в консоли нет

Шесть фактов решают, может ли незнакомец записаться. Сервер считает все шесть одним запросом (GET /booking-readiness) — и это цепочка зависимостей: каждый следующий пункт бессмысленен, пока не выполнен предыдущий. Консоль разносит эти шесть по пяти маршрутам и показывает сам список как пассивную панель на двух из них. Здесь цепочка — это и есть навигация.

Что именно сломано в консоли, и это проверяемо

  • «Расписание» называет две разные вещи. Пункт меню «Расписание» — это /calendar/schedule, исключения: выходной и короткий день. Кнопка «Расписание» в карточке мастера — это генерирующий шаблон: недельный или цикл, длина слота, перерыв, горизонт. Одно слово, две несвязанные поверхности — и у второй, той самой, которая и производит слоты, вообще нет собственного адреса.
  • «Когда работает мастер» отвечается на двух экранах. Рабочие часы — форма на /calendar/setup. Шаблон графика — секция карточки на /calendar/masters. Оба обязательны (пункты 4 и 5 цепочки), и ни один не упоминает другой.
  • Причина и следствие в трёх экранах друг от друга. Шаблон правится в карточке, его результат виден только в /masters/:id/slots, а починка уже нарезанных дней — четвёртый экран, /recut. На экране, где правят, не видно, что получилось.
  • Услугу нельзя исправить. calendarApi.ts экспортирует createService и ничего больше для этого типа: услуга с неверной длительностью не правится нигде в продукте. Названо здесь, а не обойдено.
9:41
Конфигурация записей
Основной календарь Нельзя записаться
1Календарь опубликован
2На календаре есть активный мастерИрина Соколова, Пётр Ким
3Мастер оказывает услугу4 услуги у Ирины, 2 у Петра
4Заданы рабочие часы или циклУ Петра Кима не заданы — без этого график нечего материализоватьИсправить →
5График сохранёнЖдёт пункта 4
6Слоты сгенерированы в горизонтеЖдёт пункта 5
Справочники
Календари
1 · опубликован
Мастера
2 активных
Услуги
6 · правка пока не поддержана сервером
Остальное
Исключения: выходной и короткий день
Разрешённые источники страницы
GET /booking-readiness · собирает /calendar/setup, /masters, /services, /schedule

Заголовок экрана — это буквально вопрос, который задаёт себе тенант, и он уже есть в консоли как строка: «Может ли клиент записаться прямо сейчас?». Разница в том, что здесь это экран, а не панель на другом экране.

Выполненные пункты свёрнуты в одну строку, первый невыполненный развёрнут и несёт ссылку прямо в то место, где он чинится. Ничего не пересчитывается на клиенте: шесть фактов считает сервер, иначе получилась бы вторая, спорящая копия той же конъюнкции.

Справочники доступны и плоским списком ниже — для того, кто пришёл переименовать услугу, а не выяснять, почему никто не записывается. Цепочка — это ответ на вопрос «почему не работает», а не мастер-визард, через который надо проходить.

9:41
Пётр Киммастер · 1e5b7d44
1 · Кто
Ким Пётр Андреевич
Отображается как «Пётр Ким» · активен
2 · Где
Основной календарь
Europe/Moscow · у мастера ровно один календарь
3 · Что делает
Мужская стрижка
Бритьё
+ услуга
4 · Когда работает
Рабочие часы не заданы
Пока их нет, графику нечего нарезать — и записаться к этому мастеру нельзя.
Задать часы
График мастера
Не сохранён · недельный или цикл, длина слота, горизонт
5 · Что получилось
Слотов нет: ни часов, ни графика. Появятся здесь сразу после сохранения.
/calendar/masters · + рабочие часы, переехавшие с /calendar/setup

Пять пронумерованных секций в том порядке, в котором человек на них отвечает. Главная правка против консоли — четвёртая: рабочие часы и шаблон графика живут здесь вместе. В консоли первое — форма на экране настройки, второе — секция этой карточки, и разъезд этих двух половин и есть та причина, по которой пункты 4 и 5 цепочки ощущаются как один и тот же вопрос, заданный дважды.

Пятая секция отвечает на «а что получилось» прямо здесь, а не через два экрана.

9:41
График мастераИрина Соколова
Недельный (обычная неделя)
«2 через 2» и «сутки через трое» — это шаблон «Цикл», а не недельный.
30
10
Перерывы внутри длинной записи считаются рабочим временем
При таких числах: услуга 70 мин займёт 2 слота.
30
Ограничено 180 днями.
Что получится
Горизонт покрывает 30 дней, из них рабочих 22.
Около 16 слотов в рабочий день, всего ≈352.
Смотреть слоты
Дни, нарезанные по старому шаблону, сами не изменятся. Пересчитать расписание → — там видно, что будет удалено, прежде чем это произойдёт.
WorkerScheduleSection — секция карточки в консоли, без своего адреса

Консоль уже считает арифметическую фразу («услуга 70 мин займёт N слотов», зеркало серверного ComputeSlotsNeeded) — она сохранена дословно. Добавлены две цифры, которые тенант на самом деле хочет видеть: сколько дней покрывает горизонт и сколько слотов выходит в день. Читаются после сохранения, на этом же экране, со ссылкой прямо в нарезанные слоты.

Слово «Расписание» здесь не используется вообще: этот экран — График мастера, а экран выходных и коротких дней — Исключения. Двусмысленности, которую они заменяют, в консоли ровно столько, что её хватило, чтобы заполнять всё «как-то».

9:41
Пересчёт расписанияШаг 2 из 3 · решение по каждой записи
С 24 апреля будет перенарезано 18 дней. В них попали 7 записей — по каждой нужно решение.
Чт 24 апр, 10:00 · Стрижка
Сова · Клубника 7c4e18f0 · +7 9•• ••• •• 47 Показать
Отменить
Оставить
Чт 24 апр, 14:00 · Окрашивание
Анна К. · +7 9•• ••• •• 08 Показать
Отменить
Оставлена
Пт 25 апр, 11:00 · Укладка
Коала · Авокадо d6081bba · +7 9•• ••• •• 31 Показать
Отменить
Оставить
/calendar/masters/:workerId/recut · шаг 2

Пересчёт мог бы показаться слишком разрушительным для маленького экрана — но это типовая операция для тенанта, который рулит расписанием, и исключать её нельзя: тот, кто меняет график смен, должен починить уже нарезанные дни в тот же день, а не из десктопного браузера.

Карточка на запись, а не строка: смысл этого шага в том, что каждая запись — это чей-то визит. Кнопки «применить ко всем» здесь нет намеренно.

Шаг нельзя оставить наполовину. Счётчик «решено 4 из 7» закреплён внизу, и «Далее» не активна, пока хоть одна запись без решения. Консоль полагается на то, что оператор прокрутит таблицу и заметит; телефон так не может, поэтому счёт назван вслух.

9:41
Пересчёт расписанияШаг 3 из 3 · подтверждение
Это действие нельзя отменить
Слоты с 24 апреля будут удалены и нарезаны заново по текущему графику. Отменённые записи получат отмену; клиентам уйдут уведомления по обычным правилам.
Что произойдёт
Дней перенарезано18
Слотов удалено214
Слотов будет создано252
Записей отменено3
Записей сохранено4
Будут отменены
Чт 24 апр, 10:00 · Стрижка · Сова · Клубника 7c4e18f0
Пт 25 апр, 11:00 · Укладка · Коала · Авокадо d6081bba
Сб 26 апр, 09:30 · Бритьё · Сергей В.
/calendar/masters/:workerId/recut · шаг 3

Отменённые записи перечислены поимённо, а не сосчитаны — число «3» ничего не стоит, три конкретных визита стоят. Подтверждающая кнопка называет своё последствие в собственном тексте и остаётся единственной кнопкой опасного тона во всём флоу.

Диалога нет: подтверждение — вторая панель, а не модалка. Это собственная форма подтверждения, уже принятая в консоли (удаление мастера, стирание диалога), и она же здесь.