Пользовательские сценарии SpexTaxi. Шаги взяты из продуктового плана и уточнений. Не описанные ветки не добавляются.
Поток заказа одинаковый для частного и регулярного бизнес-клиента. Плановый заказ входит в MVP.
Один пользователь — один аккаунт. В этом аккаунте можно быть:
После входа по телефону — форма регистрации: имя и режим (клиент или исполнитель). Это сразу 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). У исполнителя — список входящих (не только пуш).
клиент / исполнитель) → current_mode.Срочный и плановый поток один по кнопкам. Алгоритм выдачи — SEARCH_ALGORITHM.md. Календаря занятости в системе нет.
Сначала фильтр заказа (его же можно сохранить как черновик):
TARIFF_TYPES.md);Система считает стоимость по каждой машине: ставка тарифа × количество. Сумму никто не вписывает вручную.
+N и список снизу.secure_deal_enabled; по умолчанию выключен — прямой расчёт). Отправить запрос этой машине / исполнителю. Нельзя свою единицу. Нельзя машину без подтверждённой лицензии категории (её нет в выдаче).Запрос можно не отправлять, а сохранить как черновик. Черновики — отдельная вкладка на экране заказов. Отправка черновика («опубликовать») переводит его в поиск без выбранного исполнителя: дальше клиент открывает выдачу и шлёт запрос выбранной машине уже внутри этого заказа.
Пока исполнитель не принял и не отказал, клиент может снять запрос и выбрать другого. После снятия этого же можно запросить снова. После отказа — скрыт по заказу, повторно нельзя. Не ответил за 5 минут — это отказ: скрыт, повторно нельзя. На один заказ одновременно ждёт ответа только один запрос.
Пока ожидающего запроса нет, клиент может править фильтр заказа (тариф, количество, дата начала, адрес, описание, режим расчёта) прямо в поиске — цена пересчитывается по текущим ставкам машин. Дата начала планового заказа — только в будущем.
Если исполнитель тем временем принял другой срочный заказ, а этот заказ тоже срочный — клиенту уведомление «исполнитель отказался», заказ остаётся в поиске, этот исполнитель по нему скрыт. Плановый запрос в этом случае продолжает ждать ответа.
Пока заказ не в in_progress, любой срыв матча возвращает его к поиску исполнителя. После начала работы поиск на этом заказе не продолжается. Нужен новый заказ («такой же»).
Заказ в поиске не висит бесконечно. Если исполнитель так и не найден:
Заказ отменяется системой, штрафа никому нет, клиенту уведомление «исполнитель не найден» с кнопкой «искать снова?».
Один чекбокс на экране профиля исполнителя. Меняет его только сам исполнитель, вручную; система его не переключает ни при принятии, ни при завершении заказа.
Флаг относится к исполнителю целиком, а не к отдельной машине. Видимость в поиске ещё зависит от подписки (если флаг подписки включён) и лицензии категории машины.
Флаг executor_subscription_enabled. В MVP флаг выключен: активация исполнителя без оплаты. Когда флаг включён — для приёма заказов нужна оплаченная подписка (автоактивация после оплаты, см. PRODUCT_FOUNDATION.md).
Лимита нет. Категории — строки таблицы machinery_categories. У строки: системный code типа транспорта, категория прав license_category (например B; пусто — лицензия не нужна), текст для интерфейса. Отдельного JSON-конфига лицензий нет: конфиг — сама строка типа.
При добавлении:
Если категории нужна лицензия, а у исполнителя нет подтверждённой админом лицензии на эту категорию — машину сохранить можно, в поиске её нет. Загрузка документов лицензии — один комплект на категорию (на все машины этой категории). Админ в админке: pending / approved / rejected.
Тарифы принадлежат единице. Справочник — TARIFF_TYPES.md. Изменение ставки на машине не меняет уже посчитанную цену в заказах: цена заказа фиксируется на момент отправки запроса или правки заказчиком.
Входящие — список заказов и уведомления. Открытие заказа из уведомления не отдельный статус: смотреть можно, но «просмотрел» никуда не пишется. У планового заказа в карточке видны дата и время начала.
Одному исполнителю могут одновременно висеть запросы от разных клиентов.
in_negotiation. Это не фиксация условий.
После «принять» экран другой: детали заказа, контакты заказчика, кнопка «Подтвердить условия» (не повтор «принять»). Срок подтверждения условий — 1 сутки.
Статус in_negotiation. У заказчика — правка деталей (тариф, количество, дата и время начала у планового, адрес, описание). Цена пересчитывается по текущим ставкам машины и фиксируется в заказе. После сохранения details_version растёт, исполнителю уведомление, его «подтвердить» сбрасывается, дедлайн подтверждения условий снова 1 сутки. Подтверждение со старой версией — ошибка.
У исполнителя — «Подтвердить условия» (текущая посчитанная сумма) или «Отклонить партнёра» с причиной. Полностью отменить заказ клиента исполнитель не может ни на одной стадии до начала работы.
Не подтвердил за сутки — заказ published, исполнитель скрыт, исполнителю −3.
«Отклонить партнёра» есть у обеих сторон на in_negotiation и на awaiting_payment: заказ published, исполнитель скрыт, клиент ищет другого в этом заказе. Спора нет. Если на awaiting_payment уже был создан платёж — он отменяется / холд возвращается.
После «Подтвердить условия»:
direct_payment — in_progress, создаётся назначение;secure_deal — awaiting_payment: форма оплаты у клиента, у исполнителя «не оплачен». Срок 1 сутки. Холд после оплаты. Успех → in_progress. Не оплатил → платёж отменяется, клиенту −3, заказ возвращается к поиску (не отменяется).На awaiting_payment заказчик может писать исполнителю через открытые контакты (и наоборот). Правка условий на этом статусе: вернуть/отменить холд или незавершённый платёж, снова in_negotiation (версия++, исполнителю снова подтверждать).
in_progress, пока обе стороны не подтвердят исполнение либо не откроют спор. Отмена кнопкой нельзя — только спор.
Исключение — плановый заказ до даты начала. Пока planned_start_at не наступил, обе стороны могут отменить заказ кнопкой с причиной стадии (как отмену до работы): заказ → cancelled, при сделке холд возвращается. Отменил исполнитель — клиенту уведомление с «искать снова?». После наступления даты начала — только спор. У срочного заказа такого окна нет.
У обеих кнопка «работа выполнена». Когда нажали оба — completed, выплата при сделке, можно оставить отзыв.
Если один подтвердил, второй молчит 1 сутки — автоподтверждение молчащего, заказ completed (работа считается выполненной). Если вторая сторона в течение этих суток открыла спор — спор главнее: заказ disputed, автоприёмки нет.
Спор с in_progress и с completed. При прямом расчёте у исполнителя есть причина «заказчик не оплатил работу».
Кнопка «такой же заказ» на completed — после того как обе стороны подтвердили (или автоподтверждение). На cancelled — после отмены. Если заказ вернулся к поиску, «такой же» не нужен.
Активные — без cancelled и без черновиков (черновики на своей вкладке). Архив: фильтр отменённых. Завершённые и disputed видны. Заказы в поиске (published) — в активных.
Полная отмена кнопкой — у клиента: draft (удалить черновик), published (без причины; ожидающий запрос снимается, исполнителю уведомление), in_negotiation, awaiting_payment (с причиной стадии). На awaiting_payment если платёж уже создан — его отменяют/возвращают, затем заказ cancelled.
У исполнителя до начала работы полной отмены нет — только «отклонить партнёра» (заказ обратно в поиск).
Плановый заказ на in_progress до даты начала — отмена с причиной у обеих сторон (раздел 8).
Нельзя кнопкой: in_progress после начала (только спор), completed, disputed (только админ).
Системные отмены: исполнитель не найден (раздел 4), отмена админом. Штрафа нет.
После полной отмены — «искать снова?» (новый заказ).
Только in_progress и completed. Одна сущность спора на заказ, сообщения в отдельной таблице. Апелляция открывает тот же спор повторно, не второй тред. Лимит апелляций — 1.
Причина при открытии, при other текст. Фото — во вложении сообщения. Админ пишет и закрывает только из админки (completed / cancelled / in_progress).
Автоматически в disputed: провайдер вернул уже существующий холд по expires_at (платёж был authorized). Если клиент не платил — провайдер ничего не возвращает, срабатывает наш таймаут с awaiting_payment → поиск.
Пока холд не выплачен, админ может направить деньги (выплата / возврат). Если выплата уже ушла (captured), админ деньги не контролирует — только санкции к пользователям; закрытие такого спора в cancelled возврата не делает.
После completed у обеих сторон: оценка 1–5 звёзд и необязательный текст. Отзывы об исполнителе видны в профиле / карточке исполнителя и в карточке машины в поиске. Отзывы о клиенте исполнитель видит в карточке входящего запроса как среднюю оценку и число отзывов. Это не внутренний рейтинг.
Экран всех уведомлений у обеих ролей. Просмотр уведомления не меняет статус запроса. Каждое уведомление ведёт на карточку заказа (или лицензии).
| Событие | Кому | Текст (смысл) |
|---|---|---|
| Новый запрос | исполнитель | Новый запрос на {тип техники}, ответьте за 5 минут |
| Запрос принят | клиент | Исполнитель принял запрос, контакты открыты |
| Отказ / автоотказ / таймаут 5 минут | клиент | Исполнитель отказался, выберите другого |
| Клиент снял запрос | исполнитель | Заказчик отозвал запрос |
| Условия изменены | исполнитель | Заказчик изменил условия, подтвердите заново |
| Условия подтверждены (прямой расчёт) | клиент | Исполнитель подтвердил условия, заказ в работе |
| Условия подтверждены (сделка) | клиент | Исполнитель подтвердил условия, оплатите за 1 сутки |
| Исполнитель не подтвердил за сутки | клиент | Исполнитель не подтвердил условия, заказ снова в поиске |
| Партнёр отклонён | вторая сторона | Заказчик выбрал другого / Исполнитель отказался, заказ снова в поиске |
| Оплата прошла | исполнитель | Заказ оплачен, можно приступать |
| Оплата не поступила | клиент, исполнитель | Оплата не поступила, заказ снова в поиске / Заказ не оплачен и снят с вас |
| Партнёр отметил работу выполненной | вторая сторона | Подтвердите выполнение в течение 1 суток |
| Автоприёмка | обе | Заказ завершён автоматически |
| Заказ завершён | обе | Заказ завершён, оставьте отзыв |
| Заказ отменён партнёром | вторая сторона | Заказ отменён (клиенту — с «искать снова?») |
| Исполнитель не найден | клиент | Исполнитель не найден, заказ отменён. Искать снова? |
| Спор открыт / сообщение / закрыт | обе | Спор по заказу … |
| Холд истёк у провайдера | обе | Оплата возвращена провайдером, заказ передан администратору |
| Лицензия рассмотрена | исполнитель | Лицензия на {категория} подтверждена / отклонена |
| Отмена админом / блокировка | пользователь | Заказ отменён администратором / Аккаунт заблокирован |