BRD Mobile 4.1.2 Мои заказы > Список текущих заказов > Перенос и отмена заказа
Направление работ: Mobile Код раздела: 4.1.2 Раздел: Мои заказы > Список текущих заказов > Перенос и отмена заказа Статус: Готов Ответственный: Панкова Л.А. Версия: 0.1 Обновлено: 17.08.26
1. Назначение
Раздел позволяет клиенту мобильного приложения перенести активное бронирование на другое доступное время или отменить его с учетом правил площадки.
При переносе клиент заранее получает предупреждения о возможном изменении стоимости и последствиях для бесплатной отмены, выбирает новые таймслоты и подтверждает удаление недоступных дополнительных позиций или промокода. При отмене интерфейс показывает последствия операции в зависимости от срока бесплатной отмены и состояния оплаты заказа.
Проверка возможности переноса или отмены, перерасчет заказа, возврат оплаты, начисление сбора и уведомление партнера выполняются системой по правилам связанных Back BRD. Интерфейс передает решение клиента и показывает полученный результат.
2. Ключевые понятия
Экран «Перенос и отмена заказа» — набор экранов и диалогов мобильного приложения для переноса или отмены активного бронирования.
Перенос заказа — изменение даты и времени действующего бронирования с повторной проверкой условий создания заказа и перерасчетом его состава и стоимости.
Бесплатная отмена — отмена заказа до установленного площадкой дедлайна без применения последствий за нарушение правил отмены.
Сбор за нарушение правил отмены — начисление клиенту при отмене заказа после истечения срока бесплатной отмены.
Возврат средств — возврат проведенной оплаты после отмены заказа в предусмотренном правилами случае.
3. Scope
Входит
S1: Начало переноса и подтверждение перехода к выбору нового времени
S2: Выбор новых таймслотов и просмотр условий измененного заказа
S3: Подтверждение конфликтов, перерасчет и завершение переноса
S4: Подтверждение отмены с учетом срока бесплатной отмены и состояния оплаты
S5: Просмотр результата отмены и переход к архивному заказу
Не входит
- Mobile: 2.4.1 Выбор таймслотов — базовые правила отображения и выбора доступного времени.
- Mobile: 4.1.1 Информация о текущем заказе — просмотр состава активного заказа и вход в сценарии переноса и отмены.
- Mobile: 4.2 Список архивных заказов — просмотр отмененного заказа после завершения сценария.
- Проверка доступности времени, применение правил создания и отмены заказа, перерасчет стоимости и М-баллов, проведение возврата, начисление сбора и уведомление партнера на стороне системы.
4. BR
Указаны в пункте 4 разделов Back: 2.4.1 Условия создания, Back: 2.4.3 Правила отмены, Back: 3.2 Процессинг заказов, Back: 3.2.1 Сборы за заказ и Back: 5.3 Сценарии возврата.
5. Функциональные требования (UC + FR)
FR — functional requirements, что интерфейс должен уметь делать по определенному UC.
| ID | Сценарий | Функциональное требование | BR | Вес | Статус |
|---|---|---|---|---|---|
| S1: FR4.1.2-1 | Клиент просматривает информацию о текущем заказе | Интерфейс позволяет начать перенос только для заказа без проведенных оплат. Для полностью или частично оплаченного заказа действие «Перенести» недоступно. Если перенос доступен и клиент нажимает «Перенести», интерфейс открывает диалог с заголовком «Вы уверены, что хотите перенести заказ?» и предупреждением «Стоимость заказа может измениться». | 1 | Частично OQ4.1.2-4 OQ4.1.2-22 | |
| S1: FR4.1.2-2 | Клиент начинает перенос после истечения срока бесплатной отмены | Вместо общего подтверждения интерфейс открывает отдельный диалог с заголовком «Вы уверены, что хотите перенести заказ?», сообщением «Нарушены правила отмены. В заказе будет учтен сбор: {сумма сбора}» и действиями «Не переносить» и «Да». | 1 | Частично OQ4.1.2-1 OQ4.1.2-5 | |
| S1: FR4.1.2-3 | Клиент нажимает «Не переносить» | Интерфейс закрывает диалог без изменения заказа и возвращает клиента к информации о текущем заказе. | 1 | Реализовано OQ4.1.2-22 | |
| S1: FR4.1.2-4 | Клиент нажимает «Да» | Интерфейс закрывает диалог и открывает экран «Выберите время» для текущей площадки и объекта. | 1 | Реализовано OQ4.1.2-22 | |
| S2: FR4.1.2-5 | Экран выбора нового времени загружается | До получения доступных таймслотов интерфейс показывает skeleton-состояние групп дат и времени. | 2 | Реализовано | |
| S2: FR4.1.2-6 | Клиент выбирает новое время | Интерфейс показывает даты, доступные интервалы и стоимость таймслотов и позволяет выбрать последовательный временной интервал по правилам раздела Mobile: 2.4.1 Выбор таймслотов. Недоступные таймслоты нельзя выбрать. | 2 | Реализовано | |
| S2: FR4.1.2-7 | Клиент просматривает другие даты | Интерфейс позволяет перейти к следующей неделе и выбрать доступные таймслоты другой даты. | 1 | Реализовано | |
| S2: FR4.1.2-8 | Клиент выбрал хотя бы один таймслот | Интерфейс показывает выбранные дату, время и длительность, условие бесплатной отмены, стоимость следующего часа с учетом возможной скидки и итоговую стоимость измененного заказа. Если бесплатная отмена доступна, отображается ее дедлайн; иначе — сообщение «Бесплатная отмена недоступна». | 2 | Частично OQ4.1.2-6 | |
| S2: FR4.1.2-9 | Клиент нажимает «Очистить» | Интерфейс снимает выбор всех таймслотов и возвращает нижнюю панель в исходное состояние. | 1 | Реализовано | |
| S2: FR4.1.2-10 | Клиент нажимает «Продолжить» | Если выбран корректный непрерывный интервал, интерфейс отправляет новые дату и время на проверку условий переноса. До выбора корректного интервала продолжение недоступно. | 1 | Частично OQ4.1.2-7 | |
| S2: FR4.1.2-11 | (на будущую реализацию) Клиент выбирает площадку перед выбором нового времени | Интерфейс дополнительно показывает горизонтальный список доступных площадок с изображением, названием объекта и ближайшим метро, а также сохраненную опцию количества человек. Выбор площадки обновляет набор доступных таймслотов. | 3 | Частично OQ4.1.2-8 | |
| S3: FR4.1.2-12 | Добавленные к заказу оборудование и промокод доступны в новое время | Интерфейс подтверждает перенос без дополнительного предупреждения о составе заказа. | 1 | Реализовано OQ4.1.2-22 | |
| S3: FR4.1.2-13 | Добавленное оборудование недоступно в новое время | Интерфейс показывает единый диалог подтверждения переноса с сообщением «Добавленное ранее оборудование недоступно в выбранное время» и действиями «Отменить» и «Перенести». | 1 | Реализовано OQ4.1.2-20 | |
| S3: FR4.1.2-14 | Добавленный промокод недоступен в новое время | Интерфейс показывает единый диалог подтверждения переноса с сообщением «Добавленный ранее промокод недоступен в выбранное время» и действиями «Отменить» и «Перенести». | 1 | Реализовано OQ4.1.2-20 | |
| S3: FR4.1.2-15 | Оборудование и промокод одновременно недоступны в новое время | Интерфейс показывает один общий диалог подтверждения переноса с сообщением «Добавленное ранее оборудование и промокод недоступны в выбранное время» и действиями «Отменить» и «Перенести». | 1 | Реализовано OQ4.1.2-20 | |
| S3: FR4.1.2-16 | Клиент нажимает «Отменить» в диалоге конфликта | Интерфейс закрывает диалог, не изменяет заказ и возвращает клиента к выбору нового времени с сохраненными таймслотами. | 1 | Реализовано OQ4.1.2-22 | |
| S3: FR4.1.2-17 | Клиент подтверждает перенос | Интерфейс отправляет запрос на перенос заказа. Недоступные в новое время оборудование и промокод исключаются из заказа, после чего интерфейс получает и показывает пересчитанные стоимость времени, дополнительные позиции, скидку, количество списываемых М-баллов, сбор за нарушение правил отмены при его наличии и итоговую стоимость. Сбор за нарушение правил отмены, примененный при переносе после истечения срока бесплатной отмены, включается в итоговую сумму перенесенного заказа. | 2 | Частично OQ4.1.2-1 OQ4.1.2-9 OQ4.1.2-10 | |
| S3: FR4.1.2-18 | Заказ успешно перенесен | Интерфейс показывает экран «Бронирование успешно перенесено» с новыми датой, временем и длительностью, актуальным условием бесплатной отмены и сообщением о том, что партнер уведомлен об изменениях. | 1 | Реализовано | |
| S3: FR4.1.2-19 | Клиент выбирает ссылку на социальную сеть на экране успешного переноса | Интерфейс открывает выбранную социальную сеть МАРТ во внешнем приложении или браузере. | 2 | Реализовано | |
| S3: FR4.1.2-20 | Клиент нажимает «Поделиться заказом» | Интерфейс запускает системное действие «Поделиться» и передает сообщение: «Привет Через МАРТ ({ссылка на сайт}) за нами забронировано время: {день недели}, {день} {месяц}, {время} {площадка} {объект} {адрес} {метро} {ссылка на видео «Как дойти»} До встречи!». | 1 | Не реализовано OQ4.1.2-11 | |
| S3: FR4.1.2-21 | Клиент нажимает «Перейти к заказу» | Интерфейс открывает обновленный заказ в разделе Mobile: 4.1.1 Информация о текущем заказе. | 1 | Реализовано | |
| S4: FR4.1.2-22 | Клиент нажимает «Отменить» в информации о текущем заказе | Интерфейс определяет доступность бесплатной отмены и состояние оплаты и открывает соответствующий диалог подтверждения. | 1 | Реализовано OQ4.1.2-21 | |
| S4: FR4.1.2-23 | Бесплатная отмена доступна, заказ не оплачен | Интерфейс показывает вопрос «Вы уверены, что хотите отменить заказ?» и действия «Не отменять» и «Да». | 1 | Реализовано OQ4.1.2-21 | |
| S4: FR4.1.2-24 | Бесплатная отмена доступна, заказ оплачен полностью или частично | Интерфейс показывает вопрос «Вы уверены, что хотите отменить заказ?», уведомляет, что возврат проведенной оплаты будет зачислен в течение 5 рабочих дней, и показывает действия «Не отменять» и «Да». | 1 | Реализовано OQ4.1.2-3 OQ4.1.2-21 | |
| S4: FR4.1.2-25 | Бесплатная отмена недоступна, заказ не оплачен | Интерфейс показывает вопрос «Вы уверены, что хотите отменить заказ?», предупреждает, что срок бесплатной отмены истек и клиенту будет начислен сбор, и показывает действия «Не отменять» и «Да». | 1 | Частично OQ4.1.2-12 | |
| S4: FR4.1.2-26 | Бесплатная отмена недоступна, заказ оплачен полностью или частично | Интерфейс показывает вопрос «Вы уверены, что хотите отменить заказ?», предупреждает, что срок бесплатной отмены истек, вся проведенная оплата будет удержана и клиенту будет начислен сбор, и показывает действия «Не отменять» и «Да». | 1 | Частично OQ4.1.2-3 OQ4.1.2-13 | |
| S4: FR4.1.2-27 | Клиент нажимает «Не отменять» | Интерфейс закрывает диалог без изменения заказа и возвращает клиента к информации о текущем заказе. | 1 | Реализовано OQ4.1.2-21 | |
| S4: FR4.1.2-28 | Клиент нажимает «Да» | Интерфейс отправляет запрос на отмену заказа с подтвержденными клиентом последствиями. | 1 | Частично OQ4.1.2-14 | |
| S5: FR4.1.2-29 | Заказ отменен без нарушения правил отмены | Интерфейс показывает экран «Заказ успешно отменен» и действие «Хорошо». Для полностью или частично оплаченного заказа возврат проведенной оплаты выполняется в течение 5 рабочих дней. | 1 | Частично OQ4.1.2-15 | |
| S5: FR4.1.2-30 | Заказ отменен после истечения срока бесплатной отмены | Интерфейс показывает экран «Заказ отменен», сообщение «Нарушены правила отмены» и сумму начисленного сбора, полученную от системы. | 1 | Частично OQ4.1.2-16 | |
| S5: FR4.1.2-31 | Клиент нажимает «Хорошо» на экране результата отмены | Интерфейс завершает сценарий и открывает раздел Mobile: 4.2 Список архивных заказов, в котором отмененный заказ доступен в списке. | 1 | Не реализовано OQ4.1.2-17 |
6. Открытые вопросы
| ID | Источник | Вопрос | Кому | Статус | Рекомендации | Итоговое решение |
|---|---|---|---|---|---|---|
| OQ4.1.2-1 | Бизнес-правила / Figma / Back: 3.2 / FR4.1.2-2, FR4.1.2-17 | При переносе после истечения срока бесплатной отмены сам перенос выполняется без сбора, а платной становится только последующая отмена, как указано в макете, или сбор за нарушение правил отмены должен быть включен уже в перенос по BR3.2-10? | Продукт / Back | Open | Перенос выполняется по правилам Back: сбор за нарушение правил отмены включается в итоговую сумму перенесенного заказа. Перед продолжением интерфейс показывает отдельный диалог «Вы уверены, что хотите перенести заказ?» с сообщением «Нарушены правила отмены. В заказе будет учтен сбор: {сумма сбора}». Решение учтено в FR4.1.2-2 и FR4.1.2-17. | |
| OQ4.1.2-3 | Бизнес-правила / Back: 3.2 / FR4.1.2-22–FR4.1.2-26 | К какому сценарию отмены относится частично оплаченный заказ: к неоплаченному или оплаченному? При отмене после истечения срока бесплатной отмены удерживаются все проведенные платежи по такому заказу? | Продукт / Back | Open | Сценарии отмены оплаченного заказа применяются как к полностью, так и к частично оплаченному заказу. Если срок бесплатной отмены истек, удерживается вся проведенная оплата и начисляется сбор. Решение учтено в FR4.1.2-24 и FR4.1.2-26; формулировка диалога сверена с макетом Figma. | |
| OQ4.1.2-4 | FR4.1.2-1 / conditions_btns_util.dart | Требование говорит: перенос доступен для любого заказа без проведённых оплат. В коде кнопка «Перенести» дополнительно скрывается, если у заказа не разрешена бесплатная отмена (freeCancellationAllowed == false) — такой заказ перенести нельзя вообще, даже будучи неоплаченным \ lib/src/feature/orders_tab/utils/conditions_btns_util.dart:91-109 (рядом стоит FIXME разработчика «Возможно добавить сравнение даты отмены с текущей», т.е. правило не финализировано) | Бизнес | Open | Подтвердить правило: если площадка не даёт бесплатную отмену, перенос заказа запрещён совсем или разрешён со сбором? Если запрет не задумывался — снять условие !isFreeCancellation из needMoveBtn и описать в FR4.1.2-1 явное условие доступности. | Вопрос к бизнесу. |
| OQ4.1.2-5 | FR4.1.2-2 / order_room_screen.dart | Требование говорит: при переносе после истечения срока бесплатной отмены показывается отдельный диалог с текстом «Нарушены правила отмены. В заказе будет учтен сбор: {сумма сбора}». В коде диалог тот же самый, меняется только подпись: вместо суммы сбора выводится «Стоимость заказа может измениться. Отмена после переноса будет платной» — сумма сбора клиенту не показывается, и смысл текста обратный (сбор относится к будущей отмене, а не к переносу) \ lib/src/feature/orders_tab/order_room/order_room_screen.dart:367-395 | Бизнес | Open | Связано с OQ4.1.2-1. После решения по OQ4.1.2-1 привести текст диалога к утверждённому: если сбор берётся при переносе — выводить {сумма сбора} (поле forfeitSum уже есть в order_screen_dto.dart:98); если нет — переформулировать FR4.1.2-2 под фактическую логику. | Вопрос к бизнесу. |
| OQ4.1.2-6 | FR4.1.2-8 / time_widget_screen.dart | Требование говорит: после выбора таймслота нижняя панель показывает дату, время и длительность, условие бесплатной отмены (дедлайн или «Бесплатная отмена недоступна»), стоимость следующего часа и итоговую стоимость. В коде панель показывает только строку «Итого: {сумма} ({N} ч)» и две кнопки; ни выбранной даты и времени, ни условия бесплатной отмены на экране выбора нового времени нет \ lib/src/feature/time_widget/widget/time_widget_screen.dart:1590-1606, длительность и сумма формируются в lib/src/feature/widgets/time_choose_widgets/date_time_sections_manager.dart:862, 867-894; строк про бесплатную отмену в этом экране нет (поиск по «Бесплатная отмена» даёт только экран заказа, экран результата и плитку списка) | Разработка | Open | Дополнить нижнюю панель выбранной датой/временем и блоком бесплатной отмены (данные уже есть: freeCancellationAllowed / freeCancellationDeadline в order_screen_dto.dart:83-84, форматтер — result_change_screen.dart:35-43). Цена слота с учётом скидки сейчас показывается только на плитках таймслотов (date_time_sections_manager.dart:666-670) — уточнить у бизнеса, достаточно ли этого для «стоимости следующего часа». | Данные есть, но не полные, да и не в том месте. Надо переделывать. |
| OQ4.1.2-7 | FR4.1.2-10 / time_widget_screen.dart | Требование говорит: клиент нажимает «Продолжить». В коде в сценарии переноса кнопка называется «Перенести» (в сценарии создания — «Создать»), при этом при отсутствии конфликтов нажатие сразу выполняет перенос без ещё одного подтверждения \ lib/src/feature/time_widget/widget/time_widget_screen.dart:1663-1667, ветка без диалога — lib/src/feature/widgets/time_choose_widgets/date_time_sections_manager.dart:472-474, 486, 511-515. Блокировка до корректного интервала работает: isValid гасит кнопку (time_widget_screen.dart:1638-1658), валидность считается по forceMultipleHours (date_time_sections_manager.dart:896-903) | Бизнес | Open | Подтвердить надпись на кнопке. Рекомендация: оставить «Перенести» как более точную (действие финальное, отдельного подтверждения дальше нет) и поправить формулировку FR4.1.2-10; либо вернуть «Продолжить», если по макету предполагался промежуточный шаг. | Вопрос к бизнесу. Я бы оставил так. |
| OQ4.1.2-8 | FR4.1.2-11 / time_widget_screen.dart | Что нашли: требование помечено «на будущую реализацию», но горизонтальный список площадок уже выводится в экране выбора нового времени — и выводится с зашитыми в код данными: подзаголовок всегда «Music Loft Rehearsal», метро всегда «М. Бауманская», картинка тянется с захардкоженного хоста dev3.musbooking.com; нажатие на карточку отправляет только событие аналитики и не меняет набор таймслотов (// TODO: Add navigation or selection logic here if needed) \ lib/src/feature/time_widget/widget/time_widget_screen.dart:1025-1042, подключение секции — lib/src/feature/widgets/time_choose_widgets/date_time_sections_manager.dart:327-330 и в skeleton 220. Сохранённая опция «количество человек» (PeopleOptionsSection) закомментирована — date_time_sections_manager.dart:225-228, 336-339 | Разработка | Open | До полноценной реализации FR4.1.2-11 скрыть RoomSelectionSection в сценарии переноса: сейчас клиенту в проде видны чужие/фиктивные название и метро. Либо реализовать выбор площадки целиком (перезапрос таймслотов при выборе) и снять пометку «на будущую реализацию». | на будущее (нет апи) |
| OQ4.1.2-9 | FR4.1.2-17 / change_time_order_cubit.dart | Требование говорит: после подтверждения переноса интерфейс получает и показывает пересчитанные стоимость времени, позиции, скидку, М-баллы, сбор и итоговую стоимость. В коде ответ UpdateOrderMobile не разбирается — из него читается только список ошибок, метод возвращает true/false, а пересчитанные суммы отбрасываются \ lib/src/core/components/repositories/order_service/orders_service_repository.dart:199-220. Экран успеха показывает только новые дату/время и условие бесплатной отмены (lib/src/feature/orders_tab/change_time_screens/cubit/result_change_screen.dart:62-128); пересчитанные суммы клиент увидит лишь вернувшись в заказ, где они берутся отдельным перезапросом и calcMobile (order_room_screen.dart:451-462, order_room/cubit/order_room_cubit.dart:118-125, 307-309). Исключение недоступных позиций и промокода из заказа при переносе реализовано \ change_time_order_cubit.dart:135-136, 141-157 | Разработка | Open | Либо показывать пересчитанный состав заказа прямо в сценарии переноса (для этого разобрать Order из ответа UpdateOrderMobile, данные уже приходят), либо согласовать с бизнесом упрощённый экран успеха и переписать FR4.1.2-17 под «клиент видит пересчёт в карточке заказа». | исправить |
| OQ4.1.2-10 | FR4.1.2-17 / date_time_sections_manager.dart | Что нашли: неуспешный перенос никак не сообщается клиенту. При updateOrder() == false (в т.ч. бизнес-ошибка бэкенда вида «нет цены на слот») модалка выбора времени просто закрывается с результатом false, вызывающий код проверяет if (res == true) и молча ничего не делает — клиент возвращается в заказ со старым временем без единого сообщения \ lib/src/feature/widgets/time_choose_widgets/date_time_sections_manager.dart:511-537, lib/src/feature/orders_tab/change_time_screens/change_time_order_main.dart:44-46, lib/src/feature/orders_tab/order_room/order_room_screen.dart:447-481 (рядом FIXME «Внутри потенциальные ошибки», date_time_sections_manager.dart:512) | Разработка | Open | Добавить обработку ошибки переноса: показывать сообщение и оставлять клиента на экране выбора времени с сохранённым выбором. Заодно завести отдельное ФТ на негативный сценарий переноса — сейчас его в BRD нет. | Добавить обработку ошибки переноса |
| OQ4.1.2-11 | FR4.1.2-20 / result_change_screen.dart | Требование говорит: на экране успешного переноса есть «Поделиться заказом», запускающее системный шэринг с текстом-шаблоном. В коде такой кнопки нет: на экране успеха две кнопки — «Позвонить» и «Перейти к заказу» \ lib/src/feature/orders_tab/change_time_screens/cubit/result_change_screen.dart:197-282. Пакет share_plus в проекте подключён, но Share.share вызывается только в реферальной модалке профиля \ lib/src/feature/profile_page/profile/widget/invite_modal.dart:367, pubspec.yaml:121 | Разработка | Open | Реализовать кнопку «Поделиться заказом» на экране успешного переноса по шаблону из FR4.1.2-20 (механика уже есть в invite_modal.dart). Уточнить у бизнеса источник ссылок «Как дойти» и адреса/метро — этих полей в OrderScreenDto на экране результата не используется. | Да, такого вообще нет. Нужен шаблон и чем собственно делиться? Где брать ссылку или тому подобное? |
| OQ4.1.2-12 | FR4.1.2-25 / cancel_dialog.dart | Что нашли: в диалоге отмены для неоплаченного заказа с истёкшим сроком бесплатной отмены текст заканчивается лишним вопросительным знаком: «Срок бесплатной отмены истек, вам будет начислен сбор?» — утверждение оформлено как вопрос \ lib/src/feature/orders_tab/order_room/widget/actullity/cancel_dialog.dart:92-99 | Разработка | Open | Опечатка: убрать «?» в конце строки. Проверить формулировку по макету Figma перед правкой. | убрать «?» |
| OQ4.1.2-13 | FR4.1.2-26 / cancel_dialog.dart | Требование говорит: для оплаченного заказа после истечения срока бесплатной отмены диалог предупреждает, что срок истёк, оплата будет удержана и клиенту будет начислен сбор. В коде в тексте только удержание: «Срок бесплатной отмены истек, оплаченная сумма будет удержана» — про сбор клиента не предупреждают \ lib/src/feature/orders_tab/order_room/widget/actullity/cancel_dialog.dart:150-157 | Разработка | Open | Связано с OQ4.1.2-3. После подтверждения бизнесом (удерживается оплата И начисляется сбор) дописать упоминание сбора в текст диалога _yesPayFreeNo. | дописать |
| OQ4.1.2-14 | FR4.1.2-28 / buttons_panel_widget.dart | Что нашли: неуспешная отмена заказа не показывается клиенту как ошибка — код бросает Exception("Ошибка отмены заказа Res == false") внутри колбэка whenComplete, вместо сообщения на экране; сам репозиторий любую ошибку gRPC гасит в false \ lib/src/feature/orders_tab/order_room/widget/actullity/buttons_panel_widget.dart:337-340, lib/src/feature/orders_tab/order_room/data/order_room_repository.dart:65-78 | Разработка | Open | Заменить throw на пользовательское сообщение об ошибке отмены (диалог/снекбар) с возможностью повторить. Завести отдельное ФТ на негативный сценарий отмены — в BRD его нет. | Заменить throw на пользовательское сообщение об ошибке отмены |
| OQ4.1.2-15 | FR4.1.2-29 / buttons_panel_widget.dart | Требование говорит: после отмены без нарушения правил показывается экран «Заказ успешно отменен» с действием «Хорошо», а для оплаченного заказа — что возврат придёт в течение 5 рабочих дней. В коде это не экран, а маленький диалог, у которого заголовок всегда «Заказ отменен», а «Заказ успешно отменен» идёт мелким серым текстом ниже; про возврат за 5 рабочих дней в результате не сказано ничего (эта фраза есть только в диалоге-подтверждении до отмены) \ lib/src/feature/orders_tab/order_room/widget/actullity/buttons_panel_widget.dart:341-345, lib/src/feature/orders_tab/order_room/widget/actullity/cancel_dialog.dart:300-334, 312-319 | Разработка | Open | Согласовать с бизнесом форму результата (экран по макету или диалог) и добавить в результат для оплаченного заказа строку о возврате в течение 5 рабочих дней — признак оплаты уже известен на этом шаге (typeCancelDialogs, buttons_panel_widget.dart:274-282). | Согласовать с бизнесом форму результата |
| OQ4.1.2-16 | FR4.1.2-30 / buttons_panel_widget.dart | Требование говорит: экран результата показывает «Нарушены правила отмены» и сумму начисленного сбора, полученную от системы. В коде сумма берётся из клиентской модели заказа (orderScreenDto.forfeitSum), а не из ответа на отмену: в самом коде зафиксировано, что CancelOrderMobile возвращает пустое тело без данных о возврате и сборе. Кроме того для оплаченного заказа тот же forfeitSum подставляется в текст «Нарушены правила отмены, удержана сумма: {N}₽» — то есть сбор показывается как удержанная оплата \ lib/src/feature/orders_tab/order_room/widget/actullity/buttons_panel_widget.dart:63-79, 321-330 | Разработка | Open | Уточнить с бэкендом, должен ли CancelOrderMobile возвращать фактические сбор и возврат; до этого — явно пометить суммы как расчётные на клиенте. Отдельно поправить текст для оплаченного заказа: удержанная оплата и сбор — разные величины. | апи должна это возвращать но не возвращает) |
| OQ4.1.2-17 | FR4.1.2-31 / cancel_dialog.dart | Требование говорит: «Хорошо» завершает сценарий и открывает раздел 4.2 «Список архивных заказов», где отменённый заказ уже виден. В коде «Хорошо» просто закрывает диалог (maybePop), никакой навигации в архив нет — клиент остаётся на карточке только что отменённого заказа \ lib/src/feature/orders_tab/order_room/widget/actullity/cancel_dialog.dart:356-362; переходов к архиву в сценарии отмены не найдено за обход (buttons_panel_widget.dart, cancel_dialog.dart, orders_navigation_screen.dart) | Разработка | Open | Добавить по «Хорошо» закрытие карточки заказа и переход на вкладку архивных заказов с обновлением списка. | Добавить по «Хорошо» закрытие карточки заказа и переход на вкладку архивных заказов |
| OQ4.1.2-18 | Обратный проход / result_change_screen.dart | Что нашли: на экране успешного переноса есть кнопка «Позвонить» партнёру (со звонком на первый телефон площадки и диалогом «Нет номера телефона», если телефон не указан) — в BRD этого действия нет \ lib/src/feature/orders_tab/change_time_screens/cubit/result_change_screen.dart:197-268 | Бизнес | Open | Подтвердить, что кнопка «Позвонить» на экране успешного переноса — намеренное поведение, и дописать её отдельным ФТ в S3; либо убрать из экрана. | Вопрос к бизнесу. |
| OQ4.1.2-19 | Обратный проход / аналитика | Что нашли: сценарии переноса и отмены полностью покрыты событиями аналитики AppMetrica (order_reschedule_started, order_reschedule_cancelled, order_reschedule_confirmed, order_reschedule_conflict_shown с типом конфликта, order_reschedule_completed с числом удалённых позиций и флагом снятого промокода, order_cancel_started, order_cancel_confirmed с признаками бесплатной отмены и оплаты, order_cancel_declined, order_cancel_completed с суммами возврата и сбора) — в BRD требований к аналитике нет \ lib/src/feature/orders_tab/order_room/order_room_screen.dart:356-358, 406-412, 420-426, lib/src/feature/widgets/time_choose_widgets/date_time_sections_manager.dart:477-482, 529-534, lib/src/feature/orders_tab/order_room/widget/actullity/buttons_panel_widget.dart:284-285, 302-309, cancel_dialog.dart:199-209 | Бизнес | Open | Подтвердить состав и названия событий как продуктовое требование и зафиксировать их отдельным пунктом BRD (иначе набор событий будет расходиться при доработках). | ага |
| OQ4.1.2-20 | Подтверждение / FR4.1.2-13, FR4.1.2-14, FR4.1.2-15 | Что подтверждено: три текста диалога о конфликтах при переносе совпадают с BRD дословно — «Добавленное ранее оборудование недоступно в выбранное время», «Добавленный ранее промокод недоступен в выбранное время» и общий «Добавленное ранее оборудование и промокод недоступны в выбранное время»; диалог один, кнопки «Отменить» / «Перенести», приоритет «оба конфликта» проверяется первым \ lib/src/feature/widgets/time_choose_widgets/date_time_sections_manager.dart:453-506. Доступность оборудования и промокода на новое время проверяется реальными запросами \ lib/src/feature/orders_tab/change_time_screens/cubit/change_time_order_cubit.dart:48-139 | Бизнес | Подтверждено | — | |
| OQ4.1.2-21 | Подтверждение / FR4.1.2-22, FR4.1.2-23, FR4.1.2-24, FR4.1.2-27 | Что подтверждено: матрица из четырёх диалогов отмены построена именно по паре «бесплатная отмена доступна / истекла» × «заказ оплачен / не оплачен», причём частично оплаченный заказ (payedHalf) обрабатывается как оплаченный — ровно так, как зафиксировано в решении OQ4.1.2-3; кнопки во всех четырёх вариантах — «Не отменять» / «Да», «Не отменять» просто закрывает диалог \ lib/src/feature/orders_tab/order_room/widget/actullity/buttons_panel_widget.dart:41-61, 274-282, 350-352, тексты — cancel_dialog.dart:60-174, кнопки — cancel_dialog.dart:195-210 | Бизнес | Подтверждено | — | |
| OQ4.1.2-22 | Подтверждение / FR4.1.2-1, FR4.1.2-3, FR4.1.2-4, FR4.1.2-12, FR4.1.2-16 | Что подтверждено: вход в перенос закрыт для оплаченных заказов — кнопка «Перенести» показывается только при paymentStatus == notPayed и статусе заказа «Бронь» \ lib/src/feature/orders_tab/utils/conditions_btns_util.dart:91-101; заголовок диалога «Вы уверены, что хотите перенести заказ?» и подпись «Стоимость заказа может измениться» совпадают с BRD, «Не переносить» закрывает диалог без изменений, «Да» открывает экран выбора нового времени по текущей площадке и объекту \ lib/src/feature/orders_tab/order_room/order_room_screen.dart:379-445; при отсутствии конфликтов перенос идёт без дополнительного предупреждения \ date_time_sections_manager.dart:472-474; «Отменить» в диалоге конфликта не меняет заказ и оставляет выбранные таймслоты \ date_time_sections_manager.dart:497-511 | Бизнес | Подтверждено | — |
BRD 4.1.2 v0.1 · booking.mobile.flutter · commit 9db8346/dev · 17.08.26 · якоря
lib/src/feature/orders_tab/order_room/(order_room_screen.dart,widget/actullity/buttons_panel_widget.dart,widget/actullity/cancel_dialog.dart,widget/actullity/forfeit_block_widget.dart,data/order_room_repository.dart,model/order_screen_dto.dart),lib/src/feature/orders_tab/change_time_screens/,lib/src/feature/orders_tab/utils/conditions_btns_util.dart,lib/src/feature/widgets/time_choose_widgets/date_time_sections_manager.dart,lib/src/feature/time_widget/widget/time_widget_screen.dart,lib/src/core/components/repositories/order_service/orders_service_repository.dartСверено 31 требование: Реализовано — 18, Частично — 11, Не реализовано — 2. Открытых вопросов добавлено 16 (OQ4.1.2-4…OQ4.1.2-19): бизнесу — 5, разработке — 11; подтверждений веса 1 — 3 (OQ4.1.2-20…OQ4.1.2-22). Два вопроса аналитика (OQ4.1.2-1, OQ4.1.2-3) оставлены без изменений. Скоуп сверки ограничен действиями переноса и отмены и связанными экранами/модалками; разделы 4.1 и 4.1.1 сверялись отдельно и здесь не дублируются. Бэкендовые правила (расчёт сбора, возврат, уведомление партнера) во фронт-коде не проверялись — они вне скоупа этого BRD. Маршрутизация без сверки с гайдбуком (гайдбук не передавался).Повторная сверка по итогам дейликов (2026-09-09). Репозиторий
booking.mobile.flutter(worktreebooking.mobile.flutter-0908) ·origin/maincommit1c4ad0e(08.09.2026, влитdev). Предыдущая сверка — 17.08.26, commit9db8346. Между9db8346и1c4ad0eякоря этого раздела (перечислены выше) тронули два коммита:0d2c5cb "dart format"(31.08.26, форматирование без изменения логики — не задевает файлы с цитатами доказательств в OQ ниже, кромеtime_widget_screen.dart, где изменилось только 6 строк форматирования) и6f3e565 "fixes"(31.08.26) — единственная правка вне доказательств:order_room_screen.dart:741убрала дублирующий текстerrorTextу общегоErrorScreen, к сценариям переноса/отмены (диалоги, таймслоты, результат) отношения не имеет. Задачи09af204 "new filters + my orders rehaul"(10.08.26) иb44cfa2 "my orders tab reahaul"(27.07.26), упомянутые в задании как важные для 4.1.2, — оба предшествуют базовому коммиту9db8346и уже были учтены в сверке от 17.08.26. Содержательных изменений в домене переноса/отмены с прошлой сверки не найдено — все 31 требование и обе таблицы «Открытые вопросы» перепроверены точечно по актуальному коду (см.4.1.2-mobile.changes.md) и оставлены без изменений; текст существующих строк OQ4.1.2-1…OQ4.1.2-22 не редактировался.