
- Добавлена полная реферальная система с GraphQL резолверами и UI компонентами - Улучшена система регистрации с поддержкой ВКонтакте и реферальных ссылок - Обновлена схема Prisma для поддержки реферальной системы - Добавлены новые файлы документации правил системы - Улучшена система партнерства и контрагентов - Обновлены компоненты авторизации для поддержки новых функций - Удален устаревший server.log 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
10 KiB
10 KiB
ПРАВИЛА РЕГИСТРАЦИИ И АВТОРИЗАЦИИ
🏗️ АРХИТЕКТУРА СИСТЕМЫ
Основные сущности:
- ПОЛЬЗОВАТЕЛЬ - верхний уровень, может иметь много номеров телефонов
- НОМЕР ТЕЛЕФОНА - привязан к пользователю, может иметь много организаций
- ОРГАНИЗАЦИЯ/КАБИНЕТ - бизнес-сущность, привязана к номеру телефона
- ПАРТНЕРСТВО - связь между организациями (не пользователями или номерами)
Связи:
ПОЛЬЗОВАТЕЛЬ (1) ←→ (N) НОМЕРА ТЕЛЕФОНОВ (1) ←→ (N) ОРГАНИЗАЦИИ
ОРГАНИЗАЦИЯ (N) ←→ (N) ОРГАНИЗАЦИИ (партнерство)
Пример структуры:
ПОЛЬЗОВАТЕЛЬ "Иван Петров"
├── +7111111111 (номер 1)
│ ├── СБЕРБАНК (организация 1)
│ └── АВИТО (организация 2)
└── +7222222222 (номер 2)
└── ЯНДЕКС (организация 3)
📋 СПОСОБЫ СОЗДАНИЯ ОРГАНИЗАЦИЙ
1. СТАНДАРТНАЯ РЕГИСТРАЦИЯ
URL: /register
(без параметров)
Флоу для НОВОГО номера телефона:
- Ввод телефона → SMS код → авторизация
- Выбор типа кабинета
- Ввод данных организации (ИНН или API ключи)
- Создание организации
- Привязка организации к номеру телефона
Флоу для АВТОРИЗОВАННОГО номера:
- Редирект в дашборд (стандартное поведение)
2. РЕГИСТРАЦИЯ ЧЕРЕЗ САЙДБАР (ПОТОМ)
Местоположение: Блок организации в сайдбаре
Флоу:
- Модалка создания новой организации
- Выбор типа кабинета
- Ввод данных организации
- Создание организации без партнерства
3. ПАРТНЕРСКАЯ ССЫЛКА
URL: /register?partner=CODE
Флоу для НОВОГО номера телефона:
- Ввод телефона → SMS код → авторизация
- Выбор типа кабинета
- Ввод данных организации
- Создание организации С ПАРТНЕРСТВОМ
- Автоматическое создание партнерских связей между организациями
- Начисление +100 сфер организации-рефереру
Флоу для АВТОРИЗОВАННОГО номера телефона:
- Пропуск авторизации (уже авторизован на этом номере)
- Переход сразу к выбору типа кабинета
- Ввод данных новой организации
- Создание организации С ПАРТНЕРСТВОМ
- Автоматическое создание партнерских связей
- Начисление +100 сфер организации-рефереру
4. РЕФЕРАЛЬНАЯ ССЫЛКА
URL: /register?ref=CODE
Флоу для НОВОГО номера телефона:
- Ввод телефона → SMS код → авторизация
- Выбор типа кабинета
- Ввод данных организации
- Создание организации С РЕФЕРАЛЬНОЙ СВЯЗЬЮ
- Начисление +100 сфер организации-рефереру
- БЕЗ автоматического партнерства
Флоу для АВТОРИЗОВАННОГО номера телефона:
- Пропуск авторизации (уже авторизован на этом номере)
- Переход сразу к выбору типа кабинета
- Ввод данных новой организации
- Создание организации С РЕФЕРАЛЬНОЙ СВЯЗЬЮ
- Начисление +100 сфер организации-рефереру
- БЕЗ автоматического партнерства
📊 ДАШБОРД РЕФЕРАЛОВ (РЕАЛИЗОВАНО)
Местоположение: /partners
→ вкладка "Рефералы"
Функции:
-
Мои ссылки:
- Реферальная ссылка:
register?ref=CODE
- Партнерская ссылка:
register?partner=CODE
- Кнопка копирования
- Реферальная ссылка:
-
Статистика:
- Всего партнеров и начисленных сфер
- Статистика за текущий месяц
-
Список рефералов:
- Привлеченные организации
- Фильтрация и поиск
- Источник регистрации
🔧 ТЕХНИЧЕСКИЕ ПРАВИЛА
Валидация URL параметров:
- Нельзя использовать
partner
иref
одновременно - Коды должны быть длиной 10 символов
- Коды должны существовать в системе
- Коды должны соответствовать формату
[ABCDEFGHJKLMNPQRSTUVWXYZ23456789]{10}
Поведение AuthGuard:
- Без кодов: если авторизован → дашборд, иначе → форма авторизации
- С кодами: всегда показывать AuthFlow (даже для авторизованных)
Поведение AuthFlow:
- Новый номер телефона: полный флоу (телефон → SMS → создание организации)
- Авторизованный номер: пропустить телефон/SMS, сразу к созданию организации
Создание партнерства:
- Создаются записи в таблице
Counterparty
в ОБЕ стороны - Создается
ReferralTransaction
с начислением сфер - Устанавливается
referredById
у новой организации
Создание реферальной связи:
- Создается
ReferralTransaction
с начислением сфер - Устанавливается
referredById
у новой организации - БЕЗ создания
Counterparty
записей
⚠️ ВАЖНЫЕ ОГРАНИЧЕНИЯ
Архитектурные ограничения:
- ОДИН ПОЛЬЗОВАТЕЛЬ может иметь МНОГО номеров телефонов
- ОДИН НОМЕР ТЕЛЕФОНА привязан к ОДНОМУ ПОЛЬЗОВАТЕЛЮ
- ОДИН НОМЕР ТЕЛЕФОНА может иметь МНОГО ОРГАНИЗАЦИЙ
- Нельзя зарегистрировать один номер телефона дважды
Уникальность организаций:
- Одна организация (по ИНН) может быть зарегистрирована только один раз
- API ключи селлеров должны быть уникальными
Сохранение кодов:
- Партнерские/реферальные коды должны передаваться через все компоненты
- Коды не должны теряться при авторизации номера телефона
- Коды применяются при создании ОРГАНИЗАЦИИ, не пользователя или номера
🧪 ТЕСТОВЫЕ СЦЕНАРИИ
Сценарий 1: Новый номер + партнерская ссылка
- Переход по
register?partner=A2LA72BZZX
- Ввод нового телефона → SMS → авторизация
- Создание новой организации
- Проверка: создались партнерские связи, начислились сферы
Сценарий 2: Авторизованный номер + партнерская ссылка
- Уже авторизован на номере в системе
- Переход по
register?partner=A2LA72BZZX
- Пропуск авторизации → сразу создание организации
- Проверка: создались партнерские связи, начислились сферы
Сценарий 3: Реферальная ссылка
- Переход по
register?ref=A2LA72BZZX
- Авторизация (если нужно)
- Создание организации
- Проверка: начислились сферы, НЕТ партнерских связей
❓ ВОПРОСЫ ДЛЯ СОГЛАСОВАНИЯ
- Архитектура БД: Нужна ли новая таблица для "мастер-пользователей" или изменить текущую схему?
- Связь пользователь-телефон: Как будет происходить связывание номеров телефонов с одним пользователем?
- UI для авторизованных: Показывать ли информацию "Вы создаете организацию для номера +7XXX"?
- Переключение организаций: Как пользователь выбирает активную организацию из разных номеров?
- Лимиты: Есть ли ограничения на количество номеров у пользователя или организаций у номера?
- Идентификация: Как система определяет, что два номера принадлежат одному пользователю?