Система заявок для дилера iiko: сервис и розница. Один адрес — и веб-приложение, и мини-апп внутри Telegram.
Компания на два направления — сервис и розница. Заявки жили в переписке: сломанная касса, просроченный прайс и просьба заехать на точку лежали в одном чате вперемешку. Не было места, где у задачи есть срок, ответственный и история.
Заказчик работает из Telegram и не собирался оттуда уходить. Поэтому мини-апп — основной вход, а сайт вспомогательный: тот же адрес, та же база, отдельной сборки под мессенджер нет.
Шесть состояний — новая, в работе, отложена до даты, ожидает ответа, отменена, решена. Три приоритета, блоки-проекты, несколько ответственных, связи между задачами и напоминания о дедлайне с повтором.
Переписка внутри задачи, файлы до 25 МБ, около сорока форматов по белому списку расширений, счётчик непрочитанного. История остаётся при задаче, а не в чате, который пролистали.
Одна продиктованная фраза превращается в черновик: кому, что сделать, к какому сроку, насколько срочно и по какому блоку. Человек проверяет и создаёт.
Сообщение с кнопкой, открывающей задачу сразу в мини-аппе. События выбираются галочками на каждой задаче, частые сообщения склеиваются — бот не превращается в спам.
Группы с галочками вместо ролей-номеров: владелец заводит свои. Видимость настраивается тремя ступенями — свои задачи, отдел, вся компания.
План работ диаграммой Ганта: стрелки зависимостей, линия «сегодня», группировка по проектам. Рядом аналитика — динамика по дням, разрезы по людям и блокам, просрочки. Обновление раз в пятнадцать секунд.
Идейные макеты, с которых стартовал проект: как задумывалась карточка задачи и план работ до того, как появился первый работающий экран.
А это уже снимки самой системы, а не отрисованные макеты. Веб и мини-апп собраны из одного кода: то, что видно здесь, открывается и в браузере, и внутри Telegram.
Правила и словари вместо чужого API. Понимает падежи имён, «до завтрашнего дня до 15 часов», «к пятнице», «через два часа», «15 августа», приоритет и блок. Мужские и женские формы различаются по падежам: «Александре Волковой» не уходит Александру Волкову. Ноль стоимости за заявку и никакой зависимости от чужой доступности.
Whisper прогнан на боевом железе — два ядра, без видеокарты. Small: 12 секунд на фразу. Medium: 32. Large-v3-turbo: 30. Распознанный текст одинаковый. Оставил small, замеры записал в README, чтобы следующий человек не переспорил решение вслепую.
Сервер отвечает за 0,4–0,6 секунды — заметно. Разделы запоминаются на сессию: возврат на вкладку рисуется мгновенно, свежие данные подтягиваются следом. На первое открытие место держит заглушка, чтобы высота страницы не прыгала под курсором.
Палитру диаграммы прогнал валидатором: в тёмной теме красный и зелёный при дальтонизме дают ΔE 3.9 — просроченную и решённую задачу не различить. Просрочка получила штриховку, а статус продублирован словом везде, где он встречается.
Развёрнуто на боевом сервере под HTTPS. Заказчик ведёт реальные заявки и получает уведомления в Telegram.