spectaxi

Пользовательские сценарии (MVP)

1) Цель документа

Пользовательские сценарии SpexTaxi. Шаги взяты из продуктового плана и уточнений. Не описанные ветки не добавляются.

Поток заказа одинаковый для частного и регулярного бизнес-клиента. Плановый заказ входит в MVP.

2) Кто действует

Один пользователь — один аккаунт. В этом аккаунте можно быть:

После входа по телефону — форма регистрации: имя и режим (клиент или исполнитель). Это сразу current_mode. Других полей роли (default_mode, флаги «включён клиент / исполнитель») нет. Интерфейс (меню, заказы, поиск / парк) зависит от current_mode. Переключение режима остаётся; при первом переключении на исполнителя создаётся executor_profile.

Контакты заполняют оба. На форме всегда видны: телефон для связи, Telegram, WhatsApp, MAX — по отдельности не обязательны. Можно добавить ещё мессенджеры (название + ссылка). Для создания и принятия заказа нужны имя и хотя бы один канал связи (телефон или любой мессенджер). Иначе предупреждение и ссылка в профиль.

В поиске и до первого «принять» контакты не показываются.

Свою технику запросить нельзя.

Внутренние рейтинги (RATING_PLAN.md) в UI не показываются. После завершённого заказа стороны оставляют друг другу публичные отзывы (звёзды и необязательный текст). Причины — CANCELLATION_REASONS.md. Правила сервиса и блокировка — SERVICE_RULES.md. Поиск — SEARCH_ALGORITHM.md.

У клиента и исполнителя есть экран всех уведомлений (перечень — раздел 13). У исполнителя — список входящих (не только пуш).

3) Вход и регистрация

  1. Указать номер телефона.
  2. Получить код подтверждения.
  3. Ввести код.
  4. Если новый пользователь — имя и режим (клиент / исполнитель) → current_mode.

4) Клиент: фильтр, поиск и запрос

Срочный и плановый поток один по кнопкам. Алгоритм выдачи — SEARCH_ALGORITHM.md. Календаря занятости в системе нет.

Сначала фильтр заказа (его же можно сохранить как черновик):

Система считает стоимость по каждой машине: ставка тарифа × количество. Сумму никто не вписывает вручную.

  1. Поиск: карта и список по фильтру. Сортировка списка — ближайший первый, при равной дистанции — дешевле. Для срочного заказа показываются только исполнители с включённым флагом «принимаю срочные заказы»; для планового флаг не учитывается. Клиент сужает выдачу фильтрами: расстояние и потолок цены.
  2. Карточка — единица транспорта: фото, локация, аватар и имя, посчитанная цена, публичные отзывы об исполнителе. Контактов нет.
  3. Карта: точка машины, совпадение координат — +N и список снизу.
  4. Экран машины и исполнителя, контакты скрыты.
  5. Экран отправки запроса. Здесь же переключатель «Безопасная сделка» (виден только при включённом secure_deal_enabled; по умолчанию выключен — прямой расчёт). Отправить запрос этой машине / исполнителю. Нельзя свою единицу. Нельзя машину без подтверждённой лицензии категории (её нет в выдаче).
  6. Ждать ответ. На плановый заказ те же 5 минут.

Запрос можно не отправлять, а сохранить как черновик. Черновики — отдельная вкладка на экране заказов. Отправка черновика («опубликовать») переводит его в поиск без выбранного исполнителя: дальше клиент открывает выдачу и шлёт запрос выбранной машине уже внутри этого заказа.

Пока исполнитель не принял и не отказал, клиент может снять запрос и выбрать другого. После снятия этого же можно запросить снова. После отказа — скрыт по заказу, повторно нельзя. Не ответил за 5 минут — это отказ: скрыт, повторно нельзя. На один заказ одновременно ждёт ответа только один запрос.

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

Если исполнитель тем временем принял другой срочный заказ, а этот заказ тоже срочный — клиенту уведомление «исполнитель отказался», заказ остаётся в поиске, этот исполнитель по нему скрыт. Плановый запрос в этом случае продолжает ждать ответа.

Пока заказ не в in_progress, любой срыв матча возвращает его к поиску исполнителя. После начала работы поиск на этом заказе не продолжается. Нужен новый заказ («такой же»).

Заказ в поиске не висит бесконечно. Если исполнитель так и не найден:

Заказ отменяется системой, штрафа никому нет, клиенту уведомление «исполнитель не найден» с кнопкой «искать снова?».

5) Исполнитель: настройки, парк, лицензия, подписка

5.1. Флаг «принимаю срочные заказы»

Один чекбокс на экране профиля исполнителя. Меняет его только сам исполнитель, вручную; система его не переключает ни при принятии, ни при завершении заказа.

Флаг относится к исполнителю целиком, а не к отдельной машине. Видимость в поиске ещё зависит от подписки (если флаг подписки включён) и лицензии категории машины.

5.2. Подписка

Флаг executor_subscription_enabled. В MVP флаг выключен: активация исполнителя без оплаты. Когда флаг включён — для приёма заказов нужна оплаченная подписка (автоактивация после оплаты, см. PRODUCT_FOUNDATION.md).

5.3. Добавление транспорта

Лимита нет. Категории — строки таблицы machinery_categories. У строки: системный code типа транспорта, категория прав license_category (например B; пусто — лицензия не нужна), текст для интерфейса. Отдельного JSON-конфига лицензий нет: конфиг — сама строка типа.

При добавлении:

Если категории нужна лицензия, а у исполнителя нет подтверждённой админом лицензии на эту категорию — машину сохранить можно, в поиске её нет. Загрузка документов лицензии — один комплект на категорию (на все машины этой категории). Админ в админке: pending / approved / rejected.

Тарифы принадлежат единице. Справочник — TARIFF_TYPES.md. Изменение ставки на машине не меняет уже посчитанную цену в заказах: цена заказа фиксируется на момент отправки запроса или правки заказчиком.

6) Исполнитель: первое «принять»

Входящие — список заказов и уведомления. Открытие заказа из уведомления не отдельный статус: смотреть можно, но «просмотрел» никуда не пишется. У планового заказа в карточке видны дата и время начала.

Одному исполнителю могут одновременно висеть запросы от разных клиентов.

  1. Заказ без контактов заказчика: детали, цена, средняя оценка и число отзывов о заказчике (без текста отзывов). «Принять запрос» / «Отклонить». 5 минут, в том числе на плановый.
  2. «Принять запрос» — контакты открываются, статус in_negotiation. Это не фиксация условий.
    • Принял срочный — все его остальные ожидающие срочные запросы (по любой его машине) автоматически закрываются, их клиентам уведомление «исполнитель отказался», те заказы остаются в поиске. Ожидающие плановые запросы висят дальше.
    • Принял плановый — остальные запросы не трогаются.
  3. «Отклонить» — причина стадии, исполнитель скрыт по заказу.
  4. Таймаут 5 минут — как отказ: исполнителю −3, скрыт по заказу, повторно нельзя.
  5. Если контактов не хватает (нет ни телефона, ни мессенджера) или нет имени — принять нельзя, ссылка в профиль.

После «принять» экран другой: детали заказа, контакты заказчика, кнопка «Подтвердить условия» (не повтор «принять»). Срок подтверждения условий — 1 сутки.

7) Переговоры и фиксация условий

Статус in_negotiation. У заказчика — правка деталей (тариф, количество, дата и время начала у планового, адрес, описание). Цена пересчитывается по текущим ставкам машины и фиксируется в заказе. После сохранения details_version растёт, исполнителю уведомление, его «подтвердить» сбрасывается, дедлайн подтверждения условий снова 1 сутки. Подтверждение со старой версией — ошибка.

У исполнителя — «Подтвердить условия» (текущая посчитанная сумма) или «Отклонить партнёра» с причиной. Полностью отменить заказ клиента исполнитель не может ни на одной стадии до начала работы.

Не подтвердил за сутки — заказ published, исполнитель скрыт, исполнителю −3.

«Отклонить партнёра» есть у обеих сторон на in_negotiation и на awaiting_payment: заказ published, исполнитель скрыт, клиент ищет другого в этом заказе. Спора нет. Если на awaiting_payment уже был создан платёж — он отменяется / холд возвращается.

После «Подтвердить условия»:

На awaiting_payment заказчик может писать исполнителю через открытые контакты (и наоборот). Правка условий на этом статусе: вернуть/отменить холд или незавершённый платёж, снова in_negotiation (версия++, исполнителю снова подтверждать).

8) Работа и завершение

in_progress, пока обе стороны не подтвердят исполнение либо не откроют спор. Отмена кнопкой нельзя — только спор.

Исключение — плановый заказ до даты начала. Пока planned_start_at не наступил, обе стороны могут отменить заказ кнопкой с причиной стадии (как отмену до работы): заказ → cancelled, при сделке холд возвращается. Отменил исполнитель — клиенту уведомление с «искать снова?». После наступления даты начала — только спор. У срочного заказа такого окна нет.

У обеих кнопка «работа выполнена». Когда нажали оба — completed, выплата при сделке, можно оставить отзыв.

Если один подтвердил, второй молчит 1 сутки — автоподтверждение молчащего, заказ completed (работа считается выполненной). Если вторая сторона в течение этих суток открыла спор — спор главнее: заказ disputed, автоприёмки нет.

Спор с in_progress и с completed. При прямом расчёте у исполнителя есть причина «заказчик не оплатил работу».

Кнопка «такой же заказ» на completed — после того как обе стороны подтвердили (или автоподтверждение). На cancelled — после отмены. Если заказ вернулся к поиску, «такой же» не нужен.

9) История

Активные — без cancelled и без черновиков (черновики на своей вкладке). Архив: фильтр отменённых. Завершённые и disputed видны. Заказы в поиске (published) — в активных.

10) Отмена

Полная отмена кнопкой — у клиента: draft (удалить черновик), published (без причины; ожидающий запрос снимается, исполнителю уведомление), in_negotiation, awaiting_payment (с причиной стадии). На awaiting_payment если платёж уже создан — его отменяют/возвращают, затем заказ cancelled.

У исполнителя до начала работы полной отмены нет — только «отклонить партнёра» (заказ обратно в поиск).

Плановый заказ на in_progress до даты начала — отмена с причиной у обеих сторон (раздел 8).

Нельзя кнопкой: in_progress после начала (только спор), completed, disputed (только админ).

Системные отмены: исполнитель не найден (раздел 4), отмена админом. Штрафа нет.

После полной отмены — «искать снова?» (новый заказ).

11) Спор

Только in_progress и completed. Одна сущность спора на заказ, сообщения в отдельной таблице. Апелляция открывает тот же спор повторно, не второй тред. Лимит апелляций — 1.

Причина при открытии, при other текст. Фото — во вложении сообщения. Админ пишет и закрывает только из админки (completed / cancelled / in_progress).

Автоматически в disputed: провайдер вернул уже существующий холд по expires_at (платёж был authorized). Если клиент не платил — провайдер ничего не возвращает, срабатывает наш таймаут с awaiting_payment → поиск.

Пока холд не выплачен, админ может направить деньги (выплата / возврат). Если выплата уже ушла (captured), админ деньги не контролирует — только санкции к пользователям; закрытие такого спора в cancelled возврата не делает.

12) Отзывы

После completed у обеих сторон: оценка 1–5 звёзд и необязательный текст. Отзывы об исполнителе видны в профиле / карточке исполнителя и в карточке машины в поиске. Отзывы о клиенте исполнитель видит в карточке входящего запроса как среднюю оценку и число отзывов. Это не внутренний рейтинг.

13) Уведомления

Экран всех уведомлений у обеих ролей. Просмотр уведомления не меняет статус запроса. Каждое уведомление ведёт на карточку заказа (или лицензии).

Событие Кому Текст (смысл)
Новый запрос исполнитель Новый запрос на {тип техники}, ответьте за 5 минут
Запрос принят клиент Исполнитель принял запрос, контакты открыты
Отказ / автоотказ / таймаут 5 минут клиент Исполнитель отказался, выберите другого
Клиент снял запрос исполнитель Заказчик отозвал запрос
Условия изменены исполнитель Заказчик изменил условия, подтвердите заново
Условия подтверждены (прямой расчёт) клиент Исполнитель подтвердил условия, заказ в работе
Условия подтверждены (сделка) клиент Исполнитель подтвердил условия, оплатите за 1 сутки
Исполнитель не подтвердил за сутки клиент Исполнитель не подтвердил условия, заказ снова в поиске
Партнёр отклонён вторая сторона Заказчик выбрал другого / Исполнитель отказался, заказ снова в поиске
Оплата прошла исполнитель Заказ оплачен, можно приступать
Оплата не поступила клиент, исполнитель Оплата не поступила, заказ снова в поиске / Заказ не оплачен и снят с вас
Партнёр отметил работу выполненной вторая сторона Подтвердите выполнение в течение 1 суток
Автоприёмка обе Заказ завершён автоматически
Заказ завершён обе Заказ завершён, оставьте отзыв
Заказ отменён партнёром вторая сторона Заказ отменён (клиенту — с «искать снова?»)
Исполнитель не найден клиент Исполнитель не найден, заказ отменён. Искать снова?
Спор открыт / сообщение / закрыт обе Спор по заказу …
Холд истёк у провайдера обе Оплата возвращена провайдером, заказ передан администратору
Лицензия рассмотрена исполнитель Лицензия на {категория} подтверждена / отклонена
Отмена админом / блокировка пользователь Заказ отменён администратором / Аккаунт заблокирован