Направление работ: 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 · commit b44cfa2 / origin/dev · 29.07.26 · якорь lib/src/feature/profile_page/profile/widget/invite_modal.dart; правила начисления и выдача кода — booking-monorepo commit 9d5f0af9 / 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 (очистка кода при выходе)ПодтвержденоРасхождения нет.

0 items under this folder.