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


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

Раздел позволяет клиенту просматривать ограничения, установленные партнерами сервиса, и понимать последствия каждого ограничения.

Интерфейс показывает список ограничений по партнерским зонам, причину и сумму сбора, если она начислена, а также доступные действия с ограничением.

Раздел зависит от Back: 1.3.2 Характеристики клиента. Оспаривание ограничения описывается в соседних разделах Mobile 5.9.1 и 5.9.2.

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

Ограничение — примененная партнером характеристика клиента, которая изменяет доступность бронирования или условия оказания услуг в конкретной партнерской зоне.

Блокировка клиента — ограничение, при котором клиент не может совершать заказы в конкретной партнерской зоне.

Сбор — начисленная клиенту сумма, связанная с нарушением условий партнера или заказа.

Карточка ограничения — представление ограничения в списке с данными партнера, причиной, суммой сбора и доступными действиями.

3. Scope

Входит

S1: Ограничения

S2: Виды карточек ограничений

S3: Дополнительные состояния экрана

Не входит

4. BR

Указаны в пункте 4 раздела Back: 1.3.2 Характеристики клиента.

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

IDСценарийФункциональное требованиеBRВесСтатус
S1: FR5.9-1Клиент открывает экран ограниченийИнтерфейс открывает экран «Ограничения» и показывает список действующих ограничений клиента.1Реализовано · OQ5.9-12
S1: FR5.9-2Клиент просматривает ограничениеИнтерфейс показывает в карточке ограничения партнера, площадку или область действия ограничения, дату и время применения ограничения, причину ограничения и сумму сбора, если она начислена.

Карточка ограничения показывает в правом верхнем углу три цветные иконки-индикатора — «предоплата», «сбор» и «блокировка», подсвеченные активным цветом по соответствующим признакам ограничения.
2Реализовано · OQ5.9-2, OQ5.9-8
S2: FR5.9-3Клиент просматривает сбор, установленный вручнуюИнтерфейс показывает карточку с фотографией площадки, причиной «Установлен в ручном режиме сотрудником компании», суммой сбора и действиями «Оспорить» и «Оплатить».1Частично · OQ5.9-3
S2: FR5.9-4Клиент просматривает сбор, начисленный автоматическиИнтерфейс показывает карточку с фотографией площадки, причиной «Нарушение правил отмены заказа», суммой сбора и действиями «Оспорить» и «Оплатить».1Частично · OQ5.9-3
S2: FR5.9-5Клиент просматривает автоматическую блокировкуИнтерфейс показывает карточку с логотипом партнерской зоны, областью действия «Все объекты», причиной «Повторное нарушение правил отмены заказа», суммой сбора и действиями «Оспорить» и «Оплатить».1Частично · OQ5.9-4
S2: FR5.9-6Клиент просматривает блокировку без указанной причиныИнтерфейс показывает карточку с логотипом партнерской зоны, областью действия «Все объекты», текстом «Блокировка по инициативе площадки» и пояснением «Причина: не указана», если партнер не указал причину блокировки.1Реализовано · OQ5.9-5
S2: FR5.9-7Клиент выбирает действие с ограничениемИнтерфейс позволяет перейти к оспариванию ограничения по действию «Оспорить» или начать оплату начисленного сбора по действию «Оплатить». В рамках MVP письмо в поддержку является каналом оспаривания по умолчанию.1Реализовано · OQ5.9-6
S3: FR5.9-8Клиент открывает информацию об ограниченияхИнтерфейс по информационному действию открывает панель «Информация о мерах, принятых партнерами сервиса Март, вследствие нарушения правил оказания услуг» и поясняет последствия ограничений: «Вы заблокированы, площадка недоступна для бронирования», «Вам начислен сбор. Стоимость бронируемых услуг у данного партнера увеличена согласно сумме сбора» и «Услуги данного партнера предоставляются только по предоплате».1Реализовано · OQ5.9-7
S3: FR5.9-9Загружается список ограниченийИнтерфейс показывает состояние загрузки карточек до получения списка ограничений.2Реализовано · OQ5.9-9
S3: FR5.9-10У клиента нет ограниченийИнтерфейс показывает пустое состояние с сообщениями «У вас нет ограничений» и «Вам доступно бронирование у всех партнеров сервиса».1Реализовано · OQ5.9-13

6. Открытые вопросы

IDИсточникВопросКомуСтатус
OQ5.9-1

Открытые вопросы

Пин: BRD 5.9 v0.1 · repo booking.mobile.flutter (Flutter/Dart) · commit 1c4ad0e / origin/main · 2026-09-08 · якорь lib/src/feature/profile_page/forfeits/ Сводка: 12 вопросов — Open 5 (бизнесу 5) · Closed 2 · Закрывает PM 3 (разработка) · Подтверждено 2 · отрезано находок обратного прохода 3 (отладочные print, закомментированный старый блок оплаты, небезопасный каст состояния — как несущественные). Статусы OQ ниже не менялись (правило дельта-сверки — чужой контент); фактическая картина по коду на 1c4ad0e — см. досверку ниже и 5.9-mobile.changes.md. Маршрутизация без сверки с гайдбуком (гайдбук на вход не передан). Адресаты: бизнес → Бизнес (Герман), программное → Разработка (Владислав). Повторная сверка по итогам дейликов (08.09.26, commit 2b93d4f). Предыдущая сверка — 15.07.26, commit dad0c65. Между dad0c65 и 2b93d4f якорь lib/src/feature/profile_page/forfeits/ тронул только один коммит — 0d2c5cb "dart format" (31.08.26) — чисто форматирование, без изменения логики. Все статусы были оставлены без изменений. Досверка по дельте 2b93d4f → 1c4ad0e (08.09.26, влит dev в origin/main, merge 1c4ad0e). В якоре forfeits/ теперь реальные функциональные изменения — forfeit_screen.dart, forfeit_tile.dart, repository/forfeit_repository.dart (коммиты dev, включая «fixes» 31.08 и правки 08.09; соответствует дейликам Андрея «закрывал доработки 5.9.1» 31.08 и «5.9 — ограничения» 02.09). По коду закрыты: OQ5.9-2 (карточка теперь показывает дату/время применения createdAt вместо периода заказа — forfeit_tile.dart:103-112,259-271), OQ5.9-5 (добавлены тексты «Блокировка по инициативе площадки» / «Причина: не указана» для блокировки без причины — forfeit_tile.dart:87-88,94-98,100-101,303-317), OQ5.9-7 (заголовок информационной панели заменён на «сервиса МАРТ» — forfeit_screen.dart:141), OQ5.9-9 (добавлен скелетон-плейсхолдер карточек на состояния initial/loading — forfeit_screen.dart:40-123,232-233), OQ5.9-10 (безусловный canPay = true после проверки email убран — forfeit_tile.dart:410-434), OQ5.9-11 (текст ошибки загрузки теперь не пустой — forfeit_screen.dart:273-276). Существующие строки таблицы вопросов ниже не редактировались (см. правило дельта-сверки) — расхождение между их текстом/статусом и текущим кодом отражено только в колонке «Статус» раздела 5 (там, где это меняет вывод) и в 5.9-mobile.changes.md. OQ5.9-4 (карточка автоблокировки) закрыт частично: область «Все объекты» и текст причины теперь совпадают с BRD (forfeit_tile.dart:79-98), но отдельного «логотипа партнёрской зоны» по-прежнему нет — код показывает тот же Files-снимок, что и у обычного сбора, с блок-иконкой как заглушкой при отсутствии фото (forfeit_tile.dart:131-158); статус FR5.9-5 в разделе 5 оставлен «Частично». Новых открытых вопросов не заведено. Расхождений по остальным требованиям не найдено. Подробности — 5.9-mobile.changes.md, раздел «Досверка 1c4ad0e».

IDИсточникВопросКомуСтатусРекомендацииИтоговое решение
OQ5.9-2Код FR5.9-2Требование говорит: в карточке показывается дата и время применения ограничения. В коде карточка выводит вместо этого период брони заказа («от {начало}–{конец}»), а при отсутствии заказа — текст «Время заказа неизвестно»; поле даты создания ограничения в данных есть, но на экран не выводится вообще.
forfeit_tile.dart:175, forfeit_tile.dart:187, forfeit_model.dart:49
Разработка (Владислав)Open(А) выводить в карточке дату/время применения ограничения (поле createdAt), как требует BRD — рекомендуется, требование однозначно; (Б) если период брони показывается намеренно (полезнее клиенту) — зафиксировать это в BRD.Доработка, вес 2: выбран вариант А — выводить дату и время применения ограничения (createdAt). Ограничение не всегда связано с заказом: возможны автоблокировка из-за нарушения правил отмены и блокировка по инициативе партнера без указанной причины.
OQ5.9-3Код FR5.9-3, FR5.9-4Требование говорит: для сбора вручную причина «Установлен в ручном режиме сотрудником компании», для авто-сбора — «Нарушение правил отмены заказа»; предусмотрены разные виды карточек. В коде карточка одна универсальная, а причина берётся из фиксированного перечня, где таких формулировок нет — доступны только «Нормальная отмена без штрафа», «Поздняя отмена, ожидание/подтверждено/оплачено», «Штраф отменён/отклонён», «Причина штрафа неизвестна».
forfeit_model.dart:107-116, forfeit_tile.dart:216
Бизнес (Герман)Open(А) согласовать перечень причин с BRD и завести варианты карточек под виды ограничений — рекомендуется, если точная формулировка причины важна клиенту; (Б) привести BRD к фактическому перечню причин из данных. Разблокирует OQ5.9-4 и OQ5.9-5.Проблемы нет: для ручного и автоматического сбора используется один тип карточки; различается только наполнение согласно FR5.9-3 и FR5.9-4. Выбран вариант Б.
OQ5.9-4Код FR5.9-5Требование говорит: авто-блокировка показывается с логотипом партнёрской зоны, областью действия «Все объекты» и причиной «Повторное нарушение правил отмены заказа». В коде факт блокировки отражается только цветной иконкой (флаг «ban»); отдельного логотипа партнёрской зоны нет (используется то же фото площадки из файлов, при отсутствии — иконка «нет фото»); текста «Все объекты» нет нигде в приложении; такой причины в перечне нет.
forfeit_model.dart:23, forfeit_tile.dart:63-81, forfeit_tile.dart:153; «Все объекты» — не найдено за обход lib/src
Бизнес (Герман)Open(А) реализовать вид карточки блокировки: логотип зоны, область «Все объекты», отдельная причина — рекомендуется для соответствия BRD; (Б) упростить BRD, если различие «фото/логотип» и «Все объекты» на данном этапе не нужно. Связать с OQ5.9-3.Доработка, вес 1: выбран вариант А — реализовать вид карточки автоматической блокировки согласно FR5.9-5.
OQ5.9-5Код FR5.9-6Требование говорит: если партнёр не указал причину блокировки — показывается текст «Блокировка по инициативе площадки» и пояснение «Причина: не указана». В коде этих текстов нет: для неизвестной причины перечень отдаёт «Причина штрафа неизвестна», а формулировок «Блокировка по инициативе площадки» и «Причина: не указана» нет нигде.
forfeit_model.dart:116; обе строки — не найдено за обход lib/src
Бизнес (Герман)Open(А) добавить обработку блокировки без причины с текстами из BRD — рекомендуется, поведение полностью отсутствует; (Б) отказаться от отдельного текста и оставить «Причина штрафа неизвестна», обновив BRD. Связать с OQ5.9-3.Доработка, вес 1: выбран вариант А — добавить обработку блокировки без указанной причины с текстами из FR5.9-6.
OQ5.9-6Код FR5.9-7Требование говорит: по действию «Оспорить» — переход к оспариванию ограничения (Mobile 5.9.1), по «Оплатить» — начало оплаты сбора. В коде «Оплатить» реализовано (создаётся ссылка на оплату и открывается во внешнем окне), а «Оспорить» открывает не экран оспаривания, а создание письма на support@musbooking.com с заранее подставленной темой.
forfeit_tile.dart:250-252 (письмо), forfeit_tile.dart:339-346 + forfeit_repository.dart:39-65 (оплата)
Бизнес (Герман)Closed(А) заменить письмо на переход в экран оспаривания 5.9.1, когда он готов — рекомендуется, соответствует BRD; (Б) зафиксировать письмо в поддержку как штатный канал оспаривания в BRD 5.9/5.9.1.Разделение на компоненты условно: в BRD 5.9.1 описан тот же сценарий, поэтому требование считается реализованным. В рамках MVP письмо в поддержку является каналом оспаривания по умолчанию.
OQ5.9-7Код FR5.9-8Требование говорит: заголовок информационной панели — «…принятых партнерами сервиса Март…». В коде панель и все три пояснения реализованы и совпадают с BRD, но в заголовке используется название сервиса «MUSbooking», а не «Март».
forfeit_screen.dart:68 (заголовок); forfeit_screen.dart:89, 110, 131 (пояснения совпадают)
Бизнес (Герман)Open(А) если сервис переименован в «Март» — обновить название в приложении (это часть ребрендинга) — рекомендуется, если «Март» финальное имя; (Б) если «Март» — рабочее имя в BRD, оставить «MUSbooking» и поправить BRD.Доработка, вес 1: выбран вариант А — заменить название сервиса «MUSbooking» на «МАРТ». Макеты на текущем этапе не обновляются.
OQ5.9-8Код вне BRDЧто нашли: карточка ограничения показывает в правом верхнем углу три цветные иконки-индикатора — «предоплата», «сбор» и «блокировка», подсвеченные активным цветом по соответствующим признакам ограничения. В BRD (виды карточек 5.9-3…5.9-6) этот визуальный язык не описан.
forfeit_tile.dart:122-166
Бизнес (Герман)Closed(А) описать индикаторы в BRD как часть карточки — рекомендуется, они несут смысл для клиента; (Б) признать их лишними и убрать, если тип ограничения передаётся текстом.Решение согласовано, требования уточнены: в FR5.9-2 добавлено описание трех цветных иконок-индикаторов «предоплата», «сбор» и «блокировка».
OQ5.9-9Код FR5.9-9Требование говорит: до получения списка показывается состояние загрузки карточек. В коде во время загрузки экран пустой (возвращается пустой виджет); заготовка индикатора загрузки объявлена, но нигде не вызывается (мёртвый код).
forfeit_screen.dart:156-159, forfeit_screen.dart:40-53
Разработка (Владислав)Закрывает PMЗакрываю сам: добавить скелетон/индикатор загрузки карточек в состояние loading (задействовать существующую заготовку либо скелетон-плейсхолдеры) → тикет в Bitrix.Доработка, вес 2: добавить скелетон или индикатор загрузки карточек.
OQ5.9-10Код вне BRDПроблема: перед оплатой сбора код проверяет наличие email у клиента и показывает окно ввода контактов, но затем безусловно выставляет «оплата разрешена» (canPay = true), из-за чего результат проверки игнорируется — похоже на незавершённую логику.
forfeit_tile.dart:306-336
Разработка (Владислав)Закрывает PMЗакрываю сам: убрать принудительный canPay = true (строка 336) либо осознанно оформить требование подтверждённого email перед оплатой → тикет в Bitrix.Доработка, вес 1: убрать принудительное присваивание canPay = true.
OQ5.9-11Код вне BRDПроблема: состояние ошибки экрана отрисовывает экран ошибки с пустым текстом сообщения (errorText: ""), поэтому при сбое загрузки клиент не видит пояснения, что произошло. В BRD состояние ошибки как FR не описано, но это одно из состояний экрана.
forfeit_screen.dart:196-198
Разработка (Владислав)Закрывает PMЗакрываю сам: передавать в экран ошибки понятный текст (напр. «Не удалось загрузить ограничения, повторите позже») → тикет в Bitrix. При необходимости согласовать текст с бизнесом.Доработка, вес 1: передавать в экран ошибки понятный пользователю текст.
OQ5.9-12Код FR5.9-1Что подтверждено: экран «Ограничения» открывается из профиля, зарегистрирован в роутере, при открытии грузит список через метод API ClientsService.GetAllForfeitsByClientMobile и отображает карточки списком. Оговорка: отбор именно «действующих» ограничений выполняется на бэкенде (метод отдаёт все сборы клиента) и из Flutter-кода не проверяется.
forfeit_screen.dart:22-27, forfeit_screen.dart:56-58, app_router.dart:366, profile_screen.dart:536-539, forfeit_repository.dart:25-37
—ПодтвержденоРасхождения нет. Отбор «действующих» — на стороне бэкенда, вне зоны этого раздела.Решение подтверждено, расхождений нет.
OQ5.9-13Код FR5.9-10Что подтверждено: пустое состояние показывается с точными текстами BRD — «У вас нет ограничений» и «Вам доступно бронирование у всех партнеров сервиса», с иконкой и pull-to-refresh.
forfeit_screen.dart:161-169
—ПодтвержденоРасхождения нет.Решение подтверждено, расхождений нет.