Направление работ: Mobile Код раздела: 5.4 Раздел: Профиль > Пригласить Статус: черновик Ответственный: Панкова Л.А. Версия: 0.1 Обновлено: 27.07.26
1. Назначение
Раздел описывает приглашение друзей по реферальной программе из профиля пользователя: просмотр условий программы, получение личного промокода, его копирование и отправку через системное меню мобильного устройства.
Пользовательская цель: поделиться реферальным кодом с друзьями и получить баллы за каждого приглашенного пользователя.
Раздел зависит от Back: 1.1.1 Регистрация в части применения пригласительного кода при завершении регистрации, от Back: 8.4.2 Настройки балльной системы в части начисления баллов пригласившему пользователю и приглашенному другу и от Администрирование > Параметры системы в части текста приглашения.
2. Ключевые понятия
Реферальный промокод — уникальный код пользователя, который друг указывает при регистрации для участия в реферальной программе.
Регистрация — создание и активация аккаунта пользователя после подтверждения обязательных данных.
М-баллы — бонусные баллы, начисляемые участникам реферальной программы.
3. Scope
Входит
S1: Приглашение по реферальной программе.
Не входит
4. BR
Указаны в пункте 4 раздела Back: 1.1.1 Регистрация. Правила начисления баллов относятся к Back: 8.4.2 Настройки балльной системы.
5. Функциональные требования (UC + FR)
| ID | Сценарий | Функциональное требование | BR | Вес | Статус |
|---|---|---|---|---|---|
| S1: FR5.4-1 | Пользователь выбирает действие “Пригласить” в профиле. | Интерфейс открывает поверх главного экрана профиля нижнюю панель “Пригласите друзей и получите баллы”. | 1 | Реализовано | |
| S1: FR5.4-2 | Пользователь просматривает условия реферальной программы. | Интерфейс отображает последовательность условий: - пользователь делится личным промокодом с друзьями, количество приглашений не ограничено; - друг получает 100 М-баллов после завершения регистрации с промокодом; - пользователь получает 300 М-баллов за каждого приглашенного друга. Интерфейс показывает уникальный реферальный промокод текущего пользователя, состоящий из пяти цифр. | 1 | Частично OQ5.4-1, OQ5.4-2, OQ5.4-3 | |
| S1: FR5.4-3 | Пользователь копирует реферальный промокод отдельным действием. | Интерфейс копирует промокод в буфер обмена, закрывает нижнюю панель, возвращает пользователя на Mobile 5.1 Главный экран профиля и показывает уведомление “Реферальный код скопирован”. | 1 | Частично OQ5.4-4 | |
| S1: FR5.4-4 | Пользователь нажимает “Скопировать и отправить”. | Интерфейс копирует реферальный промокод, показывает уведомление “Реферальный код скопирован” и открывает системное меню “Поделиться”. Целевой текст приглашения определяется в Администрирование > Параметры системы. В рамках MVP интерфейс передает стандартный текст из предыдущей версии приложения: “Приглашаю вас в MUSbooking! Введите код при регистрации и получите 100 баллов. Приложение по ссылке: https://clck.ru/JeLJN Код: {реферальный промокод пользователя}“. | 1 | Частично OQ5.4-5 |
6. Открытые вопросы
Сверка с кодом: BRD 5.4 v0.1 · репозиторий
booking.mobile.flutter· commitb44cfa2/origin/dev· 29.07.26 · якорьlib/src/feature/profile_page/profile/widget/invite_modal.dart; правила начисления и выдача кода —booking-monorepocommit9d5f0af9/mainСводка: 11 вопросов (Open 9 · Подтверждено 2) Маршрутизация без сверки с гайдбуком (гайдбук не передавался).
| ID | Источник | Вопрос | Кому | Статус | Рекомендации | Итоговое решение |
|---|---|---|---|---|---|---|
| OQ5.4-1 | Код FR5.4-2 | Требование говорит: реферальный промокод состоит из пяти цифр. В коде код выдаётся из последовательности базы данных, у которой заданы границы от 100000 до 999999. То есть код всегда шестизначный — пятизначным он не бывает и быть не может. Приложение это подтверждает косвенно: пока код не получен, вместо него рисуется заглушка из шести дефисов. \ 20251216120529_add_invite_code.cs:20-21 (границы последовательности 100000–999999), AccountRepository.cs:32-40 (код берётся из последовательности при регистрации), invite_modal.dart:261 (заглушка ------) | Бизнес | Open | Заменить в FR5.4-2 «состоящий из пяти цифр» на «состоящий из шести цифр» — это ровно то, что выдаёт система. Если пять цифр — жёсткое требование (макет, печатные материалы), это отдельная задача на бэкенд со сменой схемы выдачи и решением, что делать с уже выданными кодами; учтите, что пятизначный диапазон вмещает всего 90 000 кодов и упрётся в потолок быстрее — см. OQ5.4-7. | |
| OQ5.4-2 | Код FR5.4-2 | Требование говорит: друг получает 100 М-баллов, пользователь — 300 М-баллов, и эти величины относятся к Back: 8.4.2 Настройки балльной системы. В коде на бэкенде суммы действительно настраиваемые — они берутся из правил начисления по причине («регистрация», «приглашение»). А вот в мобильном приложении числа 100 и 300 записаны прямо в вёрстке панели: если бизнес поменяет правило, пользователю продолжат показывать старые цифры, а начислится новая сумма. \ invite_modal.dart:131 (100), :140 (300); AccountCreatedClientConsumer.cs:93 (сумма из правила регистрации), CreatePointCommandHandler.cs:39-47 (сумма приглашения из правила) | Разработка | Open | Завести тикет в Bitrix: отдавать приложению суммы из правил начисления (тем же запросом, что и сам промокод) и выводить их в панели, а не хранить в вёрстке. До этого момента любое изменение настроек балльной системы обязано сопровождаться релизом приложения — это стоит явно проговорить с бизнесом. | |
| OQ5.4-3 | Код FR5.4-2 | Требование говорит: друг получает 100 М-баллов после завершения регистрации с промокодом. В коде баллы за регистрацию начисляются каждому новому пользователю, независимо от того, вводил он промокод или нет; промокод влияет только на второе начисление — бонус пригласившему. То есть «за промокод» друг ничего дополнительно не получает. Показательно, что и сам текст в приложении обещает баллы просто «при завершении регистрации», без упоминания промокода. \ AccountCreatedClientConsumer.cs:93-119 (начисление за регистрацию без проверки промокода), :121-131 (бонус пригласившему — только при наличии промокода), invite_modal.dart:129-131 (текст условия в панели) | Бизнес | Open | Определиться, что именно обещаем другу: (А) если 100 баллов — это обычный бонус за регистрацию (рекоменд., так и работает, и так же написано в приложении), переформулировать FR5.4-2 в духе «друг получит 100 баллов за регистрацию, а вы — 300 за то, что он пришёл по вашему коду»; (Б) если баллы должны быть именно за регистрацию по промокоду — это доработка бэкенда: отдельное правило начисления и проверка промокода. | |
| OQ5.4-4 | Код FR5.4-3 | Требование говорит: после копирования промокода интерфейс закрывает нижнюю панель, возвращает пользователя на главный экран профиля и показывает уведомление «Реферальный код скопирован». В коде копирование работает, но панель остаётся открытой (закрытия в обработчике нет), а уведомление называется иначе — «Промокод скопирован». Пользователь остаётся на той же панели и видит другой текст. \ invite_modal.dart:287-305 (копирование и уведомление, закрытия панели нет) | Разработка | Open | Завести тикет в Bitrix: закрывать панель после копирования и привести текст уведомления к «Реферальный код скопирован». Перед этим стоит подтвердить у бизнеса саму механику: закрывать панель сразу после копирования спорно — пользователь мог открыть её, чтобы скопировать код и тут же отправить его вторым действием. Возможно, правильнее оставить панель открытой и поправить только текст. | |
| OQ5.4-5 | Код FR5.4-4 | Требование говорит: по кнопке «Скопировать и отправить» интерфейс копирует код, показывает уведомление «Реферальный код скопирован» и открывает системное меню «Поделиться», передавая в него текст приглашения со ссылкой на приложение и кодом. В коде копирование и системное меню есть, но: уведомление не показывается вовсе, а телом сообщения уходит только сам код — без текста приглашения и без ссылки на приложение (заголовок «Приглашение в MusBooking» задаётся, но виден он лишь в почтовых клиентах, в мессенджеры уйдёт голое число). Ни текста «Приглашаю вас в MUSbooking…», ни ссылки clck.ru в коде приложения нет. Друг получит одно число и не поймёт, что с ним делать. \ invite_modal.dart:342-360 (копирование, отсутствие уведомления, отправка одного кода с заголовком письма); поиск по всему проекту не находит ни текста приглашения, ни ссылки | Разработка | Open | Завести тикет в Bitrix: собирать текст приглашения по шаблону из FR5.4-4 и отправлять его целиком в теле сообщения, плюс показывать уведомление о копировании. Отдельно решить с бизнесом, откуда берётся текст: BRD ссылается на настройку в разделе «Администрирование → Параметры системы», а в MVP допускает зашитый текст — сейчас не сделано ни то, ни другое. | |
| OQ5.4-6 | Код (обратный проход) | Проблема: промокод приложение не запрашивает отдельно — оно берёт его из ответа на вход и кладёт в локальное хранилище, а панель читает уже сохранённое значение. Отсюда три следствия, которых нет в BRD. Первое и самое массовое: только что зарегистрировавшийся пользователь своего кода не увидит — ответ на регистрацию код не содержит, он появится только после первого перелогина; до этого панель показывает ------, а обе кнопки выдают «Код приглашения недоступен». Второе: то же самое у тех, кто вошёл до появления функции и с тех пор не выходил. Третье: если у аккаунта кода нет, сервер отдаёт ноль, а приложение проверяет только пустое значение — и пользователь увидит промокод «0» и сможет его скопировать. \ RegistrationMobileEndCommandHandler.cs:170 (ответ на регистрацию — только токены), LoginMobileCommandHandler.cs:26 (код отдаётся при входе, при отсутствии — 0), auth_repository.dart:140-165 (сохранение из ответа на вход), invite_modal.dart:261 и :289-296 (проверка только на пустое значение) | Разработка | Open | Завести тикет в Bitrix: дозапрашивать промокод у бэкенда при открытии панели, если в хранилище пусто, и считать значение «0» отсутствующим кодом. Без этого новый пользователь физически не может никого пригласить — а это ровно тот момент, когда он охотнее всего делится приложением. Заодно описать в BRD состояние панели при недоступном коде: сейчас это ------ и сообщение «Код приглашения недоступен», в требованиях такого состояния нет. | |
| OQ5.4-7 | Код (обратный проход) | Проблема: запас реферальных кодов конечен и зациклен. Последовательность объявлена с границами 100000–999999 и признаком «по кругу», а на само поле кода стоит уникальный индекс. Это значит, что после 900 000 регистраций счётчик пойдёт на второй круг и начнёт выдавать уже занятые номера — регистрация будет падать с ошибкой уникальности. Повторных попыток в коде регистрации нет: пользователь просто не сможет зарегистрироваться, и внешне это будет выглядеть как случайный сбой. \ 20251216120529_add_invite_code.cs:20-21 (границы и цикличность), :25-29 и DatabaseContext.cs:69-71 (уникальный индекс по коду), AccountRepository.cs:30-52 (повторных попыток при конфликте нет) | Разработка | Open | Завести тикет в Bitrix: либо снять цикличность и расширить диапазон, либо добавить повтор выдачи при конфликте уникальности. Срочность зависит от прогноза по числу аккаунтов — стоит один раз посмотреть текущее значение счётчика в проде и понять, сколько запаса осталось. Вопрос смежный с OQ5.4-1: при переходе на пять цифр запас сократится до 90 000 и проблема станет близкой. | |
| OQ5.4-8 | Код (обратный проход) | Проблема: начисление бонуса пригласившему спрятано за двумя ранними выходами из обработчика регистрации. Сначала проверяется правило начисления за регистрацию: если его нет или сумма нулевая — обработчик завершается, и до бонуса пригласившему дело не доходит, даже если правило для приглашений настроено и работает. Второй выход — если регистрационные баллы этому клиенту уже начислялись. Кроме того, в начисление за приглашение передаётся описание регистрационного правила, поэтому в истории М-баллов пригласившего окажется чужой текст. \ AccountCreatedClientConsumer.cs:94-99 (выход при отсутствии правила регистрации), :102-108 (выход при повторном начислении), :121-131 (бонус пригласившему после обоих выходов, с описанием регистрационного правила) | Разработка | Open | Завести тикет в Bitrix: сделать начисление за приглашение независимым от правила регистрации и передавать в него собственное описание. Правки лежат в Back: 8.4.2 Настройки балльной системы, но на пользователя они смотрят именно из этого раздела: пригласивший не получит обещанные 300 баллов и не поймёт, почему. | |
| OQ5.4-9 | Код (обратный проход) | Проблема: несуществующий промокод при регистрации не проверяется. Поиск пригласившего по коду возвращает не «не найдено», а пустой идентификатор, который затем записывается новому пользователю как ссылка на пригласившего. Поскольку на это поле стоит внешний ключ, запись такой ссылки нарушает целостность — регистрация с опечаткой в промокоде, скорее всего, завершится ошибкой базы данных. Понятного сообщения «код не найден» пользователь при этом не увидит. \ AccountRepository.cs:302-308 (поиск возвращает пустой идентификатор вместо «не найдено»), RegistrationMobileEndCommandHandler.cs:138-142 (пустой идентификатор записывается как пригласивший) | Разработка | Open | Завести тикет в Bitrix: отличать «код не найден» от найденного значения и в этом случае либо регистрировать без пригласившего, либо возвращать понятную ошибку. Что именно — решает бизнес: молча игнорировать неверный код или не пускать дальше, пока пользователь его не исправит. Формально это зона Back: 1.1.1 Регистрация, но обнаружено при сверке этого раздела и напрямую ломает реферальную программу. | |
| OQ5.4-10 | Код FR5.4-1, FR5.4-2 | Что подтверждено: вход в раздел и сама панель соответствуют требованию. В профиле есть действие «Пригласить», по нему поверх главного экрана открывается нижняя панель с заголовком «Пригласите друзей и получите баллы», внутри — три шага условий с прогресс-индикатором, блок с промокодом и кнопка «Скопировать и отправить». Три условия совпадают с FR5.4-2 по смыслу и по порядку; расхождения только в тексте — «Кол-во» вместо «количество» и отсутствие слов «с промокодом» во втором условии (последнее разбирается в OQ5.4-3). \ profile_screen.dart:264-272 (действие «Пригласить»), invite_modal.dart:18-26 (нижняя панель), :98 (заголовок), :117-141 (три условия) | — | Подтверждено | Расхождения нет. | — |
| OQ5.4-11 | Код (обратный проход) | Что подтверждено: связка «кто кого пригласил» доводится до конца и живёт корректно. При регистрации введённый промокод превращается в ссылку на аккаунт пригласившего, она сохраняется у нового пользователя и уходит в событие, по которому начисляются баллы; бонус за приглашение получает именно пригласивший, а не новый пользователь. При выходе из аккаунта сохранённый промокод удаляется из локального хранилища, так что следующий пользователь на том же устройстве не увидит чужой код. \ RegistrationMobileEndCommandHandler.cs:138-142 (поиск пригласившего по коду), :159-165 (событие с пригласившим), AccountCreatedClientConsumer.cs:130 и CreatePointCommandHandler.cs:57-62 (баллы зачисляются пригласившему), logout_service.dart:96-105 (очистка кода при выходе) | — | Подтверждено | Расхождения нет. | — |