Files
2026-10-17 19:45:51 +04:00

329 lines
34 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Barev Club — бизнес-требования для разработки (промпт для Claude Code)
> **Как использовать.** Положи этот файл в корень пустого репозитория как `docs/PRD.md` и напиши Claude Code:
> «Прочитай docs/PRD.md. Сначала предложи архитектуру, структуру репозитория и план по этапам, задай уточняющие вопросы из раздела 13. Код не пиши, пока я не подтвержу план. Потом реализуй Этап 1».
---
## 0. Роль и правила работы для Claude Code
Ты — ведущий full-stack разработчик. Строишь платформу Barev Club по этому документу.
- Работай **по этапам** (раздел 11). Не начинай следующий этап, пока текущий не принят по критериям из раздела 12.
- Перед кодом каждого этапа покажи план: какие модули, таблицы, эндпоинты, экраны.
- Если требование неоднозначно — спроси, не додумывай бизнес-логику. Технические решения принимай сам и коротко объясняй.
- Секреты только через `.env` (+ `.env.example` в репо). Никаких токенов в коде.
- Покрывай тестами бизнес-логику: статусы заказов, расчёт цены со скидкой, назначение исполнителя, промокоды.
- Добавь seed-данные (услуги, исполнители, партнёры, тестовые заказы), чтобы всё можно было показать без реальных пользователей.
- Все тексты интерфейса — через i18n, ни одной строки хардкодом.
---
## 1. Продукт и цель
**Barev Club** — клуб-сервис для эмигрантов в Ереване. Клиенты приходят через **агентства недвижимости** (QR/промокод в договоре аренды). Внутри одного Telegram-приложения клиент заказывает услуги по четырём направлениям и пользуется скидками партнёров.
**Слоган:** «Ереван — как дома. С первого дня.»
**Цель MVP:** клиент из агентства за 2 минуты открывает бота, выбирает язык, заказывает услугу и видит статус; админ назначает исполнителя; исполнитель проводит заказ по шагам.
**Ключевые метрики:**
- % лидов от агентства, активировавших бота;
- % активировавших, сделавших первый заказ;
- повторные заказы за 30 дней;
- конверсия в Barev+;
- лиды и выручка в разрезе агентств.
---
## 2. Направления и услуги (только эти, ничего не добавлять)
| Направление | Услуги | Формат |
|---|---|---|
| **Быт** | Клининг (обычная / генеральная / после ремонта), Ремонт (сантехника, электрика, мелкий ремонт), Трансфер (аэропорт ↔ адрес) | на адресе клиента / по городу |
| **Документы** | Соцкарта, Нотариальный перевод паспорта, ВНЖ | офлайн, с загрузкой документов |
| **Обучение и карьера** | Языки (армянский, английский; пакет уроков), Карьерный консультант (разбор резюме, план поиска работы) | онлайн / офлайн |
| **Скидки и подарки** | Скидки и подарки партнёров: кофейни, рестораны, другие | по клубной карте |
Цены — справочник в админке, на фронте показываются как «от N ֏». Конкретные цены и проценты скидок задаёт админ.
---
## 3. Роли
| Роль | Где работает | Что делает |
|---|---|---|
| **Клиент** | Telegram-бот + Mini App | Заказывает услуги, видит статусы, чат с исполнителем, оценивает, пользуется клубной картой, оформляет Barev+ |
| **Исполнитель** | **Отдельный Telegram-бот для исполнителей** + его Mini App | Подтипы: клинер, мастер, водитель, преподаватель, карьерный консультант. Видит заказы на день, ведёт по шагам, чек-лист, фотоотчёт, заработок. Исполнитель — либо частное лицо (фрилансер), либо сотрудник компании-партнёра |
| **Компания-партнёр (исполнитель)** | Тот же бот исполнителей, роль «диспетчер компании» | Клининговая компания, автопарк, языковая школа и т.п. Получает заказы, назначенные на компанию, и распределяет их между своими сотрудниками |
| **Админ / оператор** | Веб-админка | Канбан заказов, назначение исполнителей, справочники, клиенты, финансы, отчёты по агентствам |
| **Агентство** | Источник лидов (в MVP без кабинета) | Получает уникальный промокод/deep-link. Получает **% от оплаченных заказов привлечённых клиентов**; в отчётах видно его лиды, выручку и начисленное вознаграждение |
| **Партнёр** | В MVP без кабинета | Принимает клубную карту; проверяет её по коду на веб-странице проверки |
---
## 4. Каналы и поверхности
1. **Лендинг** (веб, адаптив) — за основу дизайн «Лендинг v2 · плотный».
2. **Клиентский Telegram-бот** — точка входа, онбординг, уведомления, ретрансляция чата.
3. **Клиентский Mini App** — основной интерфейс клиента.
4. **Бот исполнителей + его Mini App** — отдельный бот: назначения, принятие заказов, пошаговые статусы, чек-листы, фотоотчёты, заработок; роль «диспетчер компании» для компаний-партнёров.
5. **Веб-админка** — для операторов, desktop-first.
Домен лендинга у владельца уже есть (значение — в `.env`, `LANDING_DOMAIN`). Оба бота создаём в BotFather; токены — в `.env` (`CLIENT_BOT_TOKEN`, `PRO_BOT_TOKEN`).
Языки везде: **RU, EN, 中文 (ZH), Հայերեն (HY), ES**.
---
## 5. Функциональные требования
### 5.1 Лендинг (LND)
- **LND-1.** Секции, как в макете v2:
- шапка с языками и кнопкой «Открыть в Telegram»;
- hero: заголовок, подзаголовок, CTA и 3 шага;
- превью «Мои заявки»;
- плашки «5 языков» и «Без установки»;
- 4 блока направлений со списком услуг и ценами «от»;
- «Как это работает» в 4 шага;
- баннер агентства;
- тарифы Barev / Barev+;
- FAQ-аккордеон;
- подвал.
- **LND-2.** Переключатель 5 языков меняет все тексты; язык запоминается и передаётся в бота.
- **LND-3.** Все CTA — deep-link в бота `t.me/<bot>?start=<payload>`. Payload несёт язык, UTM и код агентства, если он есть в URL лендинга (`?a=<agency_code>`).
- **LND-4.** SEO-мета на каждом языке, OG-картинка, быстрая загрузка (Lighthouse ≥ 90 на мобильном).
- **LND-5.** Цены и тексты услуг подтягиваются из справочника, а не хардкодятся.
### 5.2 Онбординг в боте (ONB)
- **ONB-1.** `/start` с payload: определить язык и агентство, создать клиента и сохранить источник (агентство, UTM).
- **ONB-2.** Если язык не пришёл — выбор из 5 языков.
- **ONB-3.** Согласие на обработку персональных данных (ссылка на политику), без согласия дальше не пускать.
- **ONB-4.** Если клиент пришёл с кодом агентства — автоматически активировать подарочный месяц Barev+ и показать сообщение.
- **ONB-5.** Кнопка «Открыть приложение» запускает Mini App.
- **ONB-6.** Ручной ввод промокода агентства, если клиент пришёл без deep-link.
### 5.3 Каталог и заказ (ORD)
- **ORD-1.** Главная Mini App:
- приветствие;
- блок «Мои заявки» с активными заказами;
- быстрые кнопки;
- плитки 4 направлений;
- нижняя навигация: Главная / Услуги / + / Скидки / Профиль.
- **ORD-2.** Карточка услуги с параметрами, зависящими от услуги:
- клининг: тип уборки, примерная длительность;
- ремонт: категория и описание проблемы с фото;
- трансфер: рейс, количество пассажиров и багажа, адрес;
- языки: язык, уровень, онлайн/офлайн, пакет уроков;
- консультант: тема, загрузка резюме;
- документы: тип документа, загрузка сканов, для кого (сам / члены семьи).
- **ORD-3.** Выбор даты и времени из доступных слотов (для трансфера — время рейса).
- **ORD-4.** Расчёт цены: базовая цена по параметрам минус скидка Barev+ по направлению. Показывать строки «Стоимость», «Скидка Barev+», «Итого».
- **ORD-5.** Подтверждение заказа → статус «Новый» → уведомление клиенту и в админку.
- **ORD-6.** Бесплатная отмена и перенос — **не позднее чем за 24 часа** до начала услуги. Позже — отмена с удержанием (процент настраивается в админке по услугам) или только через оператора. Порог 24 ч тоже хранится в настройках, не в коде.
- **ORD-7.** Заказ «Повторить» из истории с теми же параметрами.
### 5.4 Статусы заказов (STS)
Своя последовательность статусов для каждой категории (state machine с проверкой допустимых переходов):
| Категория | Статусы |
|---|---|
| Клининг | Новый → Назначен → В пути → Уборка → Готово |
| Ремонт | Новый → Назначен → На месте → **Смета согласована клиентом** → Ремонт → Готово |
| Трансфер | Новый → Назначен → Водитель ждёт → В пути → Завершён |
| Языки | Записан → Урок N запланирован → Идёт урок → Урок завершён (прогресс «урок N из M») |
| Карьера | Новый → Консультант назначен → Резюме получено → Встреча → План отправлен |
| Документы | Новый → Документы проверяются → Подача → Готово (+ «Нужны доп. документы») |
Плюс «Отменён» из допустимых состояний. Каждый переход пишется в историю: кто, когда, комментарий. Клиент получает уведомление о каждом переходе.
- **STS-1.** В ремонте исполнитель вносит смету, клиент принимает или отклоняет её в Mini App. Без согласия переход в «Ремонт» невозможен.
### 5.5 Кабинет исполнителя (PRO)
- **PRO-1.** Шапка: имя, роль, статус смены (на смене / не на смене), заработок за день, рейтинг.
- **PRO-2.** Список заказов на сегодня; «Сейчас» — текущий заказ:
- адрес или «Онлайн»;
- язык клиента;
- заметка клиента.
- **PRO-3.** Пошаговые кнопки по роли:
- клинер: «Я на месте» → «Начать уборку» → чек-лист зон → «Завершить и отправить фото»;
- мастер: «Я на месте» → «Начать работу» → чек-лист «Диагностика / Смета / Ремонт / Фото» → «Закрыть»;
- водитель: «Я в аэропорту» → «Пассажир в машине» → «Багаж, адрес» → «Завершить поездку»;
- преподаватель: «Открыть урок» → «Начать» → «Повторение / Новая тема / ДЗ» → «Завершить урок»;
- консультант: «Открыть встречу» → «Начать» → «Резюме / План / Материалы» → «Завершить».
- **PRO-4.** Закрыть заказ нельзя, пока не отмечены все пункты чек-листа. Фото обязательно там, где требует чек-лист.
- **PRO-5.** Исполнитель принимает или отклоняет назначенный заказ (таймаут настраивается). Отказ возвращает заказ в «Новые».
- **PRO-7.** Заказ можно назначить на **частного исполнителя** или на **компанию-партнёра**. Во втором случае диспетчер компании в боте исполнителей назначает конкретного сотрудника; до этого заказ в админке помечен «Назначен на компанию».
- **PRO-8.** Выплаты: для фрилансеров ставка задаётся на исполнителе (фикс за услугу или % от заказа — выбирается в профиле исполнителя); для компаний — договорная ставка на уровне компании. Расчёт выплат — в разделе финансов админки.
- **PRO-6.** История заказов и заработок за период.
### 5.6 Веб-админка (ADM)
- **ADM-1.** Канбан заказов: Новые / Назначены / В работе / Готово, фильтр по направлению и услуге, по дате, поиск.
- **ADM-2.** Сводка: всего заказов, без исполнителя, выручка за день, свободные исполнители.
- **ADM-3.** Назначение исполнителя:
- система подсказывает свободного исполнителя нужной категории с учётом языка клиента, района и текущей загрузки;
- назначение в один клик или выбор вручную.
- **ADM-4.** Карточка заказа: параметры, история статусов, переписка, файлы, цена, оплата.
- **ADM-5.** Справочники:
- направления и услуги с параметрами и ценами;
- исполнители: роль, языки, районы, график, ставка;
- партнёры: категория, скидка, адрес, условия;
- агентства: код, условия вознаграждения;
- промокоды;
- тарифы Barev+ и скидки по направлениям.
- **ADM-6.** Клиенты: список, профиль, заказы, источник (агентство), статус Barev+.
- **ADM-7.** Финансы:
- выручка по услугам;
- выплаты исполнителям за период;
- вознаграждение агентствам;
- экспорт в CSV.
- **ADM-8.** Отчёт по агентствам: лиды → активировали → заказали → оплаченная выручка → **начисленное вознаграждение (% агентства от оплаченных заказов его клиентов)**. Процент задаётся на агентстве; срок, в течение которого клиент «принадлежит» агентству, — настройка (см. раздел 13). Выгрузка акта за месяц в CSV.
- **ADM-9.** Роли в админке: владелец (всё) и оператор (без финансов и настроек).
### 5.7 Чат и уведомления (MSG)
- **MSG-1.** Чат клиент ↔ исполнитель внутри заказа через бота-посредника; номера телефонов не раскрываются. Чат закрывается после завершения заказа + N часов.
- **MSG-2.** Push в Telegram:
- смена статуса;
- назначение;
- напоминание за 24 часа и за 1 час;
- просьба оценить.
- **MSG-3.** Все сообщения бота — на языке пользователя.
### 5.8 Скидки и клубная карта (CRD)
- **CRD-1.** Клубная карта в Mini App: имя, уровень (Barev / Barev+), QR и короткий код.
- **CRD-2.** Каталог партнёров: категория, скидка или подарок, адрес, условия.
- **CRD-3.** Публичная страница проверки карты для партнёра (`/check/<code>`): действительна ли карта, уровень. Персональных данных кроме имени не показывать.
- **CRD-4.** Логирование использований карты у партнёров для отчёта.
### 5.9 Членство Barev / Barev+ (SUB)
- **SUB-1.** Barev — бесплатно: каталог, клубная карта, скидки партнёров.
- **SUB-2.** Barev+ — ежемесячная подписка: скидка N% на Документы, Быт, Обучение и карьеру (проценты настраиваются по направлениям).
- **SUB-3.** Подарочный месяц по коду агентства, один раз на клиента. Напоминание за 3 дня до окончания.
- **SUB-4.** Экран выбора членства с переключением тарифов, как в макете.
### 5.10 Оценки (RTG)
- **RTG-1.** После завершения — оценка 1–5 и комментарий. Рейтинг исполнителя считается автоматически.
- **RTG-2.** Оценка ≤ 3 создаёт задачу для оператора.
### 5.11 Оплата (PAY)
- **PAY-1.** Способ оплаты на старте **ещё не выбран**. В MVP: заказ имеет поле «способ оплаты» (справочник, настраивается в админке) и статус оплаты; админ или исполнитель отмечает «оплачено» вручную. Никакой реальной интеграции с платёжкой в Этапах 1–2.
- **PAY-2.** Этап 3: онлайн-оплата и рекуррентная подписка через платёжного провайдера, работающего в Армении (выбор провайдера — открытый вопрос). Архитектуру сразу заложить через абстракцию `PaymentProvider` с заглушкой `ManualPaymentProvider`.
- **PAY-3.** Вознаграждение агентств и выплаты исполнителям считаются только по заказам со статусом оплаты «оплачено».
---
## 6. Нефункциональные требования
- **Безопасность:**
- проверка подписи Telegram `initData` на бэкенде для каждого запроса Mini App;
- RBAC по ролям;
- админка за логином с 2FA.
- **Персональные данные:**
- сканы паспортов и документов хранятся в приватном объектном хранилище с шифрованием;
- доступ по временным ссылкам только у оператора и назначенного исполнителя «Документы»;
- автоудаление через **90 дней** после завершения заказа (значение в настройках);
- логирование доступа к файлам.
- **i18n:** 5 языков. RU — исходный язык. EN, ZH, HY, ES — **машинный черновой перевод**, который делаешь ты; каждый ключ помечается статусом `needs_review`, пока носитель языка его не проверит. Сделай простой экран или экспорт (CSV/JSON) для проверки переводов носителями. Направление письма везде LTR. Шрифты с поддержкой кириллицы, армянского и китайского: фолбэк для армянского и китайского, если основной шрифт их не поддерживает.
- **Время:** часовой пояс Asia/Yerevan. Валюта — драм (֏).
- **Надёжность:**
- ежедневные бэкапы БД;
- логирование ошибок (Sentry или аналог);
- аудит-лог действий админов.
- **Производительность:** Mini App открывается быстрее 2 секунд на 4G.
- **Масштаб MVP:** до нескольких тысяч клиентов и сотен заказов в день, без микросервисов.
---
## 7. Модель данных (основные сущности)
`User` (telegram_id, роль, язык, имя, телефон?) · `Client` (источник/агентство, UTM, статус подписки) · `Provider` (роль-подтип, частный или сотрудник компании, языки, районы, график, тип ставки и ставка, рейтинг, на смене) · `ProviderCompany` (название, категории услуг, диспетчеры, договорная ставка) · `AgencyCommission` (агентство, заказ, % и сумма, период) · `Category` · `Service` (параметры как JSON-схема, базовая цена) · `Order` (клиент, услуга, параметры, слот, адрес/онлайн, цена, скидка, итог, статус, исполнитель, оплата) · `OrderStatusHistory` · `ChecklistItem` / `OrderChecklist` · `Estimate` (смета ремонта) · `OrderFile` · `Message` · `Rating` · `LessonPackage` (уроков всего / пройдено) · `Partner` · `CardUsage` · `Subscription` · `Agency` · `PromoCode` · `Payout` · `AdminUser` · `AuditLog`.
---
## 8. Рекомендуемый стек (можно предложить лучше и обосновать)
- **Монорепо** (pnpm/turborepo): `apps/landing`, `apps/miniapp-client`, `apps/miniapp-pro`, `apps/admin`, `apps/bot-client`, `apps/bot-pro`, `packages/db`, `packages/ui`, `packages/i18n`, `packages/core` (бизнес-логика, state machines).
- **Фронт:** Next.js + TypeScript (лендинг, админка), React + Vite (оба Mini App) с Telegram WebApp SDK.
- **Боты:** Node.js + grammY, два отдельных бота с общей бизнес-логикой из `packages/core`.
- **БД:** PostgreSQL + Prisma.
- **Хранилище файлов:** S3-совместимое, приватные бакеты.
- **Очереди и напоминания:** BullMQ + Redis или cron.
- **Деплой:** Docker. Один сервер на MVP, staging и prod окружения.
---
## 9. Дизайн-система (из макетов Barev Club)
- **Цвета:**
- фон `#FBF6EE`, текст `#1E1B1A`, вторичный текст `#5C5550`, акцент `#B8235A`, заголовки на розовом `#4A1028`;
- направления: Быт `#A8C38A`, Документы `#F9CDB0`, Обучение и карьера `#CFC8F5`, Скидки и подарки `#F7DA6E`;
- дополнительные: розовый `#F6C3D3`, голубой `#BCD0F2`.
- **Шрифты:** заголовки Rubik (700–800, приём «жирное + курсив»), текст Onest.
- **Форма:** крупные скругления (карточки 24–40px, кнопки-таблетки 999px), тёмная нижняя навигация-таблетка с белой «+» по центру, декоративные «цветы» (scalloped shapes).
- **Доступность:** контраст текста ≥ 4.5:1, зоны нажатия ≥ 44px.
- Сделать `packages/ui` с токенами и компонентами, чтобы лендинг, Mini App и админка выглядели единообразно.
---
## 10. Ключевые пользовательские сценарии
1. **Клиент из агентства:** QR в договоре → лендинг или сразу бот с кодом агентства → язык → согласие → подарочный Barev+ → заказ клининга со скидкой → статус «Назначен» → чат с клинером → «Готово» с фотоотчётом → оценка.
2. **Трансфер:** заказ с номером рейса → водитель назначен → «Водитель ждёт» → «В пути» → «Завершён».
3. **Ремонт со сметой:** мастер на месте → вносит смету → клиент согласует → ремонт → фото → закрытие.
4. **Документы:** клиент выбирает «Соцкарта» → загружает сканы → оператор проверяет → «Нужны доп. документы» или «Подача» → «Готово».
5. **Языки:** покупка пакета из M уроков → расписание → каждый урок закрывается преподавателем → прогресс «урок N из M».
6. **Скидка у партнёра:** клиент показывает карту → партнёр открывает страницу проверки → использование логируется.
7. **Админ:** новый заказ появляется в канбане → «Назначить: <подсказанный исполнитель>» → исполнитель принимает.
---
## 11. Этапы
- **Этап 1 (MVP-ядро):**
- монорепо, БД, i18n, `packages/ui`;
- лендинг v2;
- бот с онбордингом и кодами агентств;
- Mini App клиента: каталог, заказ, «Мои заявки», статусы;
- услуги **Клининг и Трансфер**;
- админка: канбан, назначение, справочники услуг и исполнителей;
- бот исполнителей и его Mini App для клинера и водителя (частные исполнители и диспетчер компании);
- уведомления; оплата отмечается вручную;
- машинный перевод на 5 языков со статусом `needs_review`.
- **Этап 2:**
- Ремонт со сметой, Документы с загрузкой файлов, Языки (пакеты уроков), Карьерный консультант;
- чат через бота;
- оценки;
- отчёт по агентствам;
- финансы и выплаты.
- **Этап 3:**
- клубная карта и партнёры со страницей проверки;
- Barev+ с подарочным месяцем, затем онлайн-оплата и рекуррентная подписка;
- аудит и автоудаление файлов.
---
## 12. Критерии приёмки (по этапу 1)
- [ ] Лендинг на 5 языках, все CTA ведут в бота с правильным payload (язык, агентство, UTM).
- [ ] `/start` с кодом агентства создаёт клиента с источником и активирует подарочный Barev+.
- [ ] Клиент оформляет клининг и трансфер, видит итог со скидкой, получает уведомление о каждом статусе.
- [ ] Недопустимый переход статуса отклоняется бэкендом (тесты на state machine для каждой категории).
- [ ] В админке новый заказ появляется в «Новых». Кнопка назначения предлагает свободного исполнителя нужной категории с учётом языка, назначение уходит исполнителю.
- [ ] Исполнитель не может закрыть заказ без всех пунктов чек-листа.
- [ ] Все строки интерфейса переведены (проверка: нет ключей без перевода).
- [ ] Запросы Mini App без валидного `initData` отклоняются.
- [ ] Seed-данные позволяют пройти все сценарии этапа на staging.
---
## 13. Принятые решения и открытые вопросы
**Уже решено владельцем:**
- Оплата на старте не выбрана → ручная отметка «оплачено», абстракция `PaymentProvider` (PAY-1, PAY-2).
- Исполнители смешанные: фрилансеры и компании-партнёры (PRO-7, PRO-8).
- Агентства получают % от оплаченных заказов привлечённых клиентов (ADM-8, PAY-3).
- Для исполнителей — отдельный Telegram-бот (раздел 4).
- Бесплатная отмена и перенос — за 24 часа до услуги (ORD-6).
- Сканы документов хранятся 90 дней после завершения заказа (раздел 6).
- Переводы: машинный черновик + проверка носителем (раздел 6).
- Домен есть, ботов ещё нет — создаём в BotFather (раздел 4).
**Ещё открыто (спроси перед стартом, а пока используй дефолты из скобок):**
1. Цены по услугам, % скидки Barev+ по направлениям и цена подписки (пока seed-значения-заглушки в админке).
2. Какой % получают агентства и как долго клиент «закреплён» за агентством (пока 10% и 12 месяцев, обе настройки — в админке).
3. Размер удержания при поздней отмене (пока 0%, настройка по услугам).
4. Платёжный провайдер для Этапа 3.