Направление работ: Mobile Код раздела: 5.1 Раздел: Профиль > Главный экран Статус: черновик Ответственный: Панкова Л.А. Версия: 0.1 Обновлено: 21.07.26
1. Назначение
Данный раздел описывает главный экран профиля пользователя в мобильном приложении.
Пользователь видит основные данные профиля, город, кэшбек, прогресс заполнения профиля, подписку, Мбаллы, скидки, ограничения, блок поддержки, информацию о приложении, частые вопросы, социальные сети и нижнюю навигацию приложения.
Главный экран профиля служит точкой перехода в соседние разделы профиля и внешние каналы поддержки.
Раздел зависит от Back: 1.3 Клиенты. Детальная работа с данными, подписками, скидками, ограничениями, отзывами и поддержкой описывается в соседних разделах Mobile 5.
2. Ключевые понятия
Главный экран профиля - стартовый экран раздела «Профиль» в мобильном приложении, на котором пользователь видит сводку по своему профилю и переходит в соседние разделы.
Карточка клиента - сущность для хранения персональной информации об аккаунте и истории его взаимодействий с партнерами.
Соседний раздел профиля - раздел Mobile 5, в который пользователь переходит из карточки, блока или пункта меню на главном экране профиля.
3. Scope
Входит
S1: Просмотр главного экрана профиля и переходы в соседние разделы S2: Состояние загрузки главного экрана профиля
Не входит
- Mobile 5.2 Настройки профиля - редактирование данных профиля
- Mobile 5.3 Настройки приложения - настройки приложения, пароля, код-пароля и привязанных карт
- Mobile 5.4 Пригласить - сценарий приглашения пользователя
- Mobile 5.5 Отзывы - просмотр и работа с отзывами
- Mobile 5.6 Подписки - управление подпиской
- Mobile 5.7 Мбаллы - подробная работа с Мбаллами
- Mobile 5.8 Скидки - подробная работа со скидками
- Mobile 5.9 Ограничения - подробная работа с ограничениями
- Mobile 5.10 Поддержка - онлайн-чат и сценарии поддержки
- Mobile 5.11 О приложении - подробная информация о приложении
- Mobile 5.12 Частые вопросы (FAQ) - просмотр FAQ
- Backend/API-контракты, структура БД и техническая реализация
4. BR
Указаны в пункте 4 раздела Back: 1.3 Клиенты.
5. Функциональные требования (UC + FR)
FR – functional requirements, что интерфейс должен уметь делать по определенному UC.
| ID | Cценарий | Функциональное требование | BR | Вес | Статус |
|---|---|---|---|---|---|
| S1: #FR5.1-1 | Пользователь открывает главный экран профиля | Интерфейс открывает главный экран профиля и показывает карточку пользователя, блок быстрых действий: Пригласить и Отзывы, блоки подписки и Мбаллов, блок скидок и ограничений, блок поддержки, социальные сети и нижнюю навигацию приложения. | 1 | Реализовано | |
| S1: #FR5.1-2 | Пользователь просматривает карточку профиля | Интерфейс показывает аватар, имя, город, кэшбек, прогресс заполнения профиля, подсказку о получении Мбаллов за заполнение профиля и действие перехода к настройкам профиля. | 1 | Частично \ #OQ5.1-2 \ #OQ5.1-8 \ #OQ5.1-9 | |
| S1: #FR5.1-3 | Пользователь переходит к настройкам профиля | Интерфейс позволяет перейти из карточки профиля через хлебные крошки в раздел 5.2 Настройки профиля. | 1 | Частично \ #OQ5.1-4 | |
| S1: #FR5.1-4 | Пользователь просматривает быстрые действия профиля | Интерфейс показывает действия «Пригласить» и «Отзывы» и позволяет перейти в разделы 5.4 Пригласить и 5.5 Отзывы. | 1 | Частично \ #OQ5.1-3 | |
| S1: #FR5.1-5 | Пользователь просматривает подписку и Мбаллы | Интерфейс показывает статус подписки, тип подписки, дату ближайшего списания, баланс Мбаллов и курс Мбаллов к рублю, а также позволяет перейти в разделы 5.6 Подписки и 5.7 Мбаллы. | 1 | Частично \ #OQ5.1-1 \ #OQ5.1-8 | |
| S1: #FR5.1-6 | Пользователь просматривает скидки и ограничения | Интерфейс показывает действия «Мои скидки» и «Ограничения» и позволяет перейти в разделы 5.8 Скидки и 5.9 Ограничения. | 1 | Реализовано | |
| S1: #FR5.1-7 | Пользователь просматривает блок поддержки и информации | Интерфейс показывает пункты «Поддержка», «О приложении» и «Частые вопросы», позволяет открыть внешний канал поддержки в Telegram и перейти в разделы 5.11 О приложении и 5.12 Частые вопросы (FAQ). Подробный сценарий поддержки описывается в разделе 5.10 Поддержка. | 1 | Частично \ #OQ5.1-5 \ #OQ5.1-7 | |
| S1: #FR5.1-8 | Пользователь просматривает социальные сети сервиса | Интерфейс показывает ссылки на социальные сети сервиса и позволяет перейти во внешний канал выбранной социальной сети. | 2 | Реализовано | |
| S1: #FR5.1-9 | Пользователь использует нижнюю навигацию приложения | Интерфейс показывает нижнюю навигацию приложения с активным разделом «Профиль» и позволяет перейти в другие основные разделы мобильного приложения. | 2 | Реализовано | |
| S2: #FR5.1-10 | Пользователь открывает главный экран профиля во время загрузки данных | Интерфейс показывает состояние загрузки главного экрана профиля с плейсхолдерами карточки пользователя, блоков профиля, поддержки и социальных сетей до получения данных. | 2 | Не реализовано \ #OQ5.1-6 |
6. Открытые вопросы
| ID | Источник | Вопрос | Кому | Статус | Рекомендации | |
|---|---|---|---|---|---|---|
| #OQ5.1-1 | Код FR5.1-5 | Требование говорит: блок подписки показывает статус, тип, дату ближайшего списания и ведёт в 5.6. В коде статус «Подписка активна» и тип «Базовый» захардкожены; строка даты списания («199₽ спишутся 07.07») закомментирована; переход в 5.6 отключён (onTap закомментирован — «Так тариф Базовый, ничего не будет тут»). Модель ClientTariffInfo (name/endDate/autoRenewal) есть, но на экране не используется. \ profile_screen.dart:322-323,346,369,388-393; user.dart:69,247-257 | Бизнес/Разработка | Open | Самое крупное расхождение раздела. (А, рекоменд.) подключить блок к ClientTariffInfo (статус/тип/дата) и включить переход в 5.6; на «Базовом» показывать состояние без даты списания. (Б) зафиксировать в BRD, что пока поддержан только «Базовый» без даты и перехода — тогда часть FR5.1-5 = сознательная заглушка. Связать с OQ5.1-10 (мёртвая навигация в подписку). | Жду решения от бизнеса (Подписки теперь входят в релиз???) |
| #OQ5.1-2 | Код FR5.1-2 | Проблема: «Кэшбек 1%» захардкожено для всех пользователей, без привязки к данным. \ profile_title.dart:192 | Бизнес (Герман) | Open | Решение: фиксированный 1% для всех или динамический per-user. (А) тянуть процент из данных тарифа/лояльности; (Б, реком. как минимум сейчас) закрепить в BRD фиксированный «Кэшбек 1%». | Жду решения бизнеса. На бэк нигде это не реализовано. |
| #OQ5.1-3 | Код FR5.1-4 | Требование говорит: «Пригласить» ведёт в раздел 5.4. В коде открывает inline bottom-sheet InviteModal (шаринг инвайт-кода), а не отдельный экран/раздел. \ profile_screen.dart:267-273; invite_modal.dart:19-27 | Бизнес (Герман) | Open | (А, рекоменд.) переформулировать 5.4 как модалку приглашения, раз сценарий реализован inline; (Б) вынести приглашение в отдельный экран-раздел. Продуктовое решение о формате. | переформулировать 5.4 как модалку приглашения |
| #OQ5.1-4 | Код FR5.1-3 | Требование говорит: переход к 5.2 из карточки «через хлебные крошки». В коде переход через выпадающее меню «⋯ ещё»: «Редактировать профиль»→EditProfile, «Настройки»→ProfileSettings; в том же меню — действия вне BRD: смена аватара и «Выйти из аккаунта». \ profile_title.dart:206-366,229-232,295-298,308-353 | Бизнес (Герман) | Open | (А, рекоменд.) актуализировать BRD: вход в настройки идёт через меню «⋯», и внести в требования логаут и смену аватара с главного экрана; (Б) привести UI к «хлебным крошкам» и убрать/перенести лишние действия. Пересекается с 5.2 (меню действий). | актуализировать BRD: вход в настройки идёт через меню «⋯» |
| #OQ5.1-5 | Код FR5.1-7 | Требование говорит: «Поддержка» открывает внешний канал в Telegram. В коде открывает Telegram deep-link; при этом 5.10 описывает онлайн-чат, а in-app SupportChatRoute в роутере закомментирован. \ profile_screen.dart:40,122-129; app_router.dart:374 | Бизнес (Герман) | Open | Согласовать с 5.10. (А, рекоменд.) если целевое — in-app чат, включить SupportChatRoute; (Б) если Telegram — явно зафиксировать это в 5.1 и 5.10. | Жду решения от бизнеса |
| #OQ5.1-6 | Код FR5.1-10 | Требование говорит: состояние загрузки с плейсхолдерами карточки, блоков, поддержки и соцсетей. В коде плейсхолдеров/скелетонов нет; при загрузке рендерится дефолтный пустой User() (points 0, пустое имя, город «не определён»); isProcessing/ProcessingProfileState объявлены, но экраном не потребляются. \ profile_bloc.dart:17-51,161-192; profile_scope.dart:57; profile_screen.dart:70-77 | Разработка | Закрывает PM | FR веса 2 не реализован, продуктового выбора нет. Закрываю сам: добавить skeleton/shimmer по isProcessing/ProcessingProfileState для карточки и блоков → тикет в Bitrix. Как минимум — не показывать нулевые значения (0 баллов, пустое имя) до первого ответа. | Здесь плейсхолдеры не нужны, поскольку и так всё заранее известно, а плейсхолдер аватарки и другая информация существует и используется. |
| #OQ5.1-7 | Код FR5.1-7 | Проблема: username бота поддержки захардкожен на тестовый mb_test_sup_bot (значение по умолчанию параметра) — риск релиза с тестовым ботом в проде. \ profile_screen.dart:40 | Разработка | Закрывает PM | Явный риск релиза, продуктового выбора нет. Закрываю сам: вынести username в .env/конфиг и проверить прод-значение перед релизом → тикет в Bitrix. | Когда будет продакшн бот, надо будет поменять. |
| #OQ5.1-8 | Код FR5.1-5, FR5.1-2 | Проблема: курс «1 балл = 1₽» и бонус за заполнение «300» захардкожены строковыми литералами, не из конфига/данных — риск расхождения с реальной логикой начислений (5.7). \ profile_screen.dart:479; profile_title.dart:415 | Разработка | Закрывает PM | Продуктового выбора нет. Закрываю сам: курс Мбаллов и бонус за заполнение вынести в конфиг/данные, чтобы значения на экране не расходились с фактикой начислений → тикет в Bitrix. Значения сверить с 5.7. | Захардкожен только один балл, равный 1 рублю, и получение 300 баллов за регистрацию. Остальное уже берется динамически. |
| #OQ5.1-9 | Код FR5.1-2 | Проблема: город берётся из citiesRepository.getCity() (выбранный в приложении город поиска), а не из карточки клиента (Back 1.3); в модели User поля города нет → возможен рассинхрон «города профиля» с данными клиента. \ profile_title.dart:162-169; user.dart:42-70 | Бизнес/Разработка | Open | Решение об источнике: (А) если у клиента (1.3) хранится город — показывать его; (Б) явно зафиксировать в BRD, что «город» = город поиска приложения. Согласовать с Back 1.3. | явно зафиксировать в BRD, что «город» = город поиска приложения |
| #OQ5.1-10 | Код вне BRD | Что нашли: SubscriptionRoute зарегистрирован в роутере, но единственная точка входа (тап по блоку подписки) закомментирована — экран подписки недостижим с главного экрана (мёртвая навигация). \ app_router.dart:373; profile_screen.dart:320-323 | Разработка | Закрывает PM | Мёртвый код, продуктового выбора нет. Закрываю сам: либо включить переход в подписку (в рамках OQ5.1-1), либо удалить неиспользуемую регистрацию SubscriptionRoute → тикет в Bitrix. Связать с OQ5.1-1. | Подписок нет. |
Вопросы по сверке с кодом
BRD 5.1 v0.1 · booking.mobile.flutter · commit dad0c65/dev · 2026-07-10 · якорь
lib/src/feature/profile_page/profile/(profile_screen.dart,profile_title.dart; шелл нижней навигации —feature/home/screen/home_screen.dart) Сводка: вопросов 10 (бизнесовых 5 / программных 5) · подтверждено без вопросов 4 (FR5.1-1, FR5.1-6, FR5.1-8, FR5.1-9) · отрезано находок обратного прохода 3 (AppMetrica-события на каждый тап, pull-to-refreshRefreshIndicator, неиспользуемыйErrorProfileState) Под особым вниманием: FR5.1-5 (блок подписки — статическая заглушка), FR5.1-10 (нет плейсхолдеров загрузки), FR5.1-4 (Пригласить — модалка вместо раздела), FR5.1-2 (кэшбек захардкожен)
Бизнесовые
| № | Связано с | Что в BRD | Что в коде | Где в коде |
|---|---|---|---|---|
| Б1 | FR5.1-5 | Блок подписки показывает статус подписки, тип, дату ближайшего списания и ведёт в раздел 5.6 Подписки | Статус «Подписка активна» и тип «Базовый» захардкожены; строка с датой списания («199₽ спишутся 07.07») закомментирована; переход в 5.6 отключён (onTap закомментирован — «Так тариф Базовый, ничего не будет тут»). Модель ClientTariffInfo (name/endDate/autoRenewal) существует, но на экране не используется — нужно решение, показывать ли реальные данные тарифа | profile_screen.dart:322-323, 346, 369, 388-393; user.dart:69, 247-257 |
| Б2 | FR5.1-2 | Карточка профиля показывает кэшбек | «Кэшбек 1%» захардкожено для всех пользователей, без привязки к данным — нужно решение: фиксированный 1% для всех или динамический per-user | profile_title.dart:192 |
| Б3 | FR5.1-4 | «Пригласить» позволяет перейти в раздел 5.4 Пригласить | Открывает inline bottom-sheet InviteModal (шаринг инвайт-кода), а не отдельный экран/раздел — нужно решение: приглашение как модалка или как раздел | profile_screen.dart:267-273; invite_modal.dart:19-27 |
| Б4 | FR5.1-3 | Переход к настройкам профиля (5.2) из карточки «через хлебные крошки» | Переход выполнен через выпадающее меню «⋯ ещё»: пункты «Редактировать профиль»→EditProfile и «Настройки»→ProfileSettings; в том же меню — действия вне BRD: смена аватара и «Выйти из аккаунта» — нужно решение по affordance («хлебные крошки» vs меню) и по составу действий карточки | profile_title.dart:206-366, 229-232, 295-298, 308-353 |
| Б5 | FR5.1-7 | «Поддержка» открывает внешний канал поддержки в Telegram | Открывает Telegram deep-link; при этом 5.10 описывает онлайн-чат, а in-app SupportChatRoute в роутере закомментирован — нужно решение: точка входа поддержки с главного экрана = Telegram или in-app чат | profile_screen.dart:40, 122-129; app_router.dart:374 |
Рекомендация / варианты решения
- Блок подписки (Б1) — самое крупное расхождение. Вариант А (рекоменд.): подключить блок к
ClientTariffInfo(статус/тип/дата списания) и включить переход в 5.6; на тарифе «Базовый» показывать состояние без даты списания. Вариант Б: зафиксировать в BRD, что на текущем этапе поддерживается только «Базовый» без даты и без перехода — тогда часть FR5.1-5 про подписку становится «сознательной заглушкой». - Кэшбек (Б2) — Вариант А: тянуть процент из данных тарифа/программы лояльности. Вариант Б (рекоменд. как минимум сейчас): закрепить в BRD фиксированный «Кэшбек 1%».
- Пригласить (Б3) — Вариант А (рекоменд.): переформулировать 5.4 как модалку приглашения, раз сценарий реализован inline через
InviteModal. Вариант Б: вынести приглашение в отдельный экран-раздел. - Меню карточки (Б4) — Вариант А (рекоменд.): актуализировать BRD — вход в настройки идёт через меню «⋯», и внести в требования логаут и смену аватара прямо с главного экрана. Вариант Б: привести UI к «хлебным крошкам» и убрать/перенести лишние действия.
- Поддержка (Б5) — согласовать с 5.10. Вариант А (рекоменд.): если целевое поведение — in-app чат, включить
SupportChatRoute. Вариант Б: если Telegram — явно зафиксировать это в 5.1 и 5.10.
Программные
| № | Связано с | Что в BRD | Что в коде | Где в коде |
|---|---|---|---|---|
| П1 | FR5.1-10 | Состояние загрузки с плейсхолдерами карточки, блоков профиля, поддержки и соцсетей до получения данных | Плейсхолдеров/скелетонов нет; при загрузке рендерится дефолтный пустой User() (points 0, пустое имя, город «не определен»); isProcessing/ProcessingProfileState объявлены, но экраном не потребляются — требование не реализовано | profile_bloc.dart:17-51, 161-192; profile_scope.dart:57; profile_screen.dart:70-77 |
| П2 | FR5.1-7 | Внешний канал поддержки в Telegram | Username бота захардкожен на ТЕСТОВЫЙ mb_test_sup_bot (значение по умолчанию параметра) — риск релиза с тестовым ботом в проде | profile_screen.dart:40 |
| П3 | FR5.1-5, FR5.1-2 | Курс Мбаллов к рублю; подсказка о бонусе за заполнение профиля | Курс «1 балл = 1₽» и бонус «300» захардкожены строковыми литералами, не из конфига/данных — риск расхождения с реальной логикой начислений (5.7) | profile_screen.dart:479; profile_title.dart:415 |
| П4 | FR5.1-2 | Карточка профиля показывает «город» | Город берётся из citiesRepository.getCity() (выбранный в приложении город поиска), а не из карточки клиента (Back 1.3); в модели User поля города нет — возможен рассинхрон «города профиля» с данными клиента | profile_title.dart:162-169; user.dart:42-70 |
| П5 | вне BRD | — | SubscriptionRoute зарегистрирован в роутере, но единственная точка входа (тап по блоку подписки) закомментирована — экран подписки недостижим с главного экрана профиля (мёртвая навигация) | app_router.dart:373; profile_screen.dart:320-323 |
Рекомендация / варианты решения
- Состояние загрузки (П1) — Вариант А (рекоменд.): добавить skeleton/shimmer по
isProcessing/ProcessingProfileStateдля карточки и блоков (плюс поддержка/соцсети). Вариант Б: как минимум скрывать нулевые значения (0 баллов, пустое имя) до первого ответа сервера. - Тестовый бот (П2) — вынести username в
.env/конфиг и проверить прод-значение перед релизом. - Хардкод значений (П3) — курс Мбаллов и бонус за заполнение вынести в конфиг/данные, чтобы значения на экране не расходились с фактической логикой начислений.
- Город (П4) — определить источник: если у клиента (1.3) хранится город — показывать его; иначе явно зафиксировать в BRD, что «город» = город поиска приложения.
- Мёртвая навигация (П5) — либо включить переход в подписку (см. Б1), либо удалить неиспользуемую регистрацию
SubscriptionRoute, чтобы не копился мёртвый код.