Направление работ: Mobile Код раздела: 5.1 Раздел: Профиль > Главный экран Статус: черновик Ответственный: Панкова Л.А. Версия: 0.1 Обновлено: 21.07.26


1. Назначение

Данный раздел описывает главный экран профиля пользователя в мобильном приложении.

Пользователь видит основные данные профиля, город, кэшбек, прогресс заполнения профиля, подписку, Мбаллы, скидки, ограничения, блок поддержки, информацию о приложении, частые вопросы, социальные сети и нижнюю навигацию приложения.

Главный экран профиля служит точкой перехода в соседние разделы профиля и внешние каналы поддержки.

Раздел зависит от Back: 1.3 Клиенты. Детальная работа с данными, подписками, скидками, ограничениями, отзывами и поддержкой описывается в соседних разделах Mobile 5.

2. Ключевые понятия

Главный экран профиля - стартовый экран раздела «Профиль» в мобильном приложении, на котором пользователь видит сводку по своему профилю и переходит в соседние разделы.

Карточка клиента - сущность для хранения персональной информации об аккаунте и истории его взаимодействий с партнерами.

Соседний раздел профиля - раздел Mobile 5, в который пользователь переходит из карточки, блока или пункта меню на главном экране профиля.

3. Scope

Входит

S1: Просмотр главного экрана профиля и переходы в соседние разделы S2: Состояние загрузки главного экрана профиля

Не входит

4. BR

Указаны в пункте 4 раздела Back: 1.3 Клиенты.

5. Функциональные требования (UC + FR)

FR – functional requirements, что интерфейс должен уметь делать по определенному UC.

IDCценарийФункциональное требование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РазработкаЗакрывает PMFR веса 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-refresh RefreshIndicator, неиспользуемый ErrorProfileState) Под особым вниманием: FR5.1-5 (блок подписки — статическая заглушка), FR5.1-10 (нет плейсхолдеров загрузки), FR5.1-4 (Пригласить — модалка вместо раздела), FR5.1-2 (кэшбек захардкожен)

Бизнесовые

Связано сЧто в BRDЧто в кодеГде в коде
Б1FR5.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
Б2FR5.1-2Карточка профиля показывает кэшбек«Кэшбек 1%» захардкожено для всех пользователей, без привязки к данным — нужно решение: фиксированный 1% для всех или динамический per-userprofile_title.dart:192
Б3FR5.1-4«Пригласить» позволяет перейти в раздел 5.4 ПригласитьОткрывает inline bottom-sheet InviteModal (шаринг инвайт-кода), а не отдельный экран/раздел — нужно решение: приглашение как модалка или как разделprofile_screen.dart:267-273; invite_modal.dart:19-27
Б4FR5.1-3Переход к настройкам профиля (5.2) из карточки «через хлебные крошки»Переход выполнен через выпадающее меню «⋯ ещё»: пункты «Редактировать профиль»→EditProfile и «Настройки»→ProfileSettings; в том же меню — действия вне BRD: смена аватара и «Выйти из аккаунта» — нужно решение по affordance («хлебные крошки» vs меню) и по составу действий карточкиprofile_title.dart:206-366, 229-232, 295-298, 308-353
Б5FR5.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Что в кодеГде в коде
П1FR5.1-10Состояние загрузки с плейсхолдерами карточки, блоков профиля, поддержки и соцсетей до получения данныхПлейсхолдеров/скелетонов нет; при загрузке рендерится дефолтный пустой User() (points 0, пустое имя, город «не определен»); isProcessing/ProcessingProfileState объявлены, но экраном не потребляются — требование не реализованоprofile_bloc.dart:17-51, 161-192; profile_scope.dart:57; profile_screen.dart:70-77
П2FR5.1-7Внешний канал поддержки в TelegramUsername бота захардкожен на ТЕСТОВЫЙ mb_test_sup_bot (значение по умолчанию параметра) — риск релиза с тестовым ботом в продеprofile_screen.dart:40
П3FR5.1-5, FR5.1-2Курс Мбаллов к рублю; подсказка о бонусе за заполнение профиляКурс «1 балл = 1₽» и бонус «300» захардкожены строковыми литералами, не из конфига/данных — риск расхождения с реальной логикой начислений (5.7)profile_screen.dart:479; profile_title.dart:415
П4FR5.1-2Карточка профиля показывает «город»Город берётся из citiesRepository.getCity() (выбранный в приложении город поиска), а не из карточки клиента (Back 1.3); в модели User поля города нет — возможен рассинхрон «города профиля» с данными клиентаprofile_title.dart:162-169; user.dart:42-70
П5вне BRDSubscriptionRoute зарегистрирован в роутере, но единственная точка входа (тап по блоку подписки) закомментирована — экран подписки недостижим с главного экрана профиля (мёртвая навигация)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, чтобы не копился мёртвый код.

0 items under this folder.