## MODIFIED Requirements ### Requirement: Account page presents an upcoming events list Страница Brokerage Account MUST предоставлять действие перехода на отдельную страницу «Будущие события». Эта страница MUST показывать все полученные события компактным списком без фильтров, пагинации и суммарного итога списка, с датой, типом, инструментом и прогнозной суммой в исходной валюте, если она известна. Прогнозный итог визуальной группы режима «Все счета» не является суммарным итогом списка. Страница MUST объяснять, что прогноз основан на позиции счёта, указан до налогов и может быть неполным из-за доступности данных источника. Это предметное ограничение прогноза MUST NOT превращаться в отчёт о технической синхронизации. При временном сбое обновления страница MUST сохранять ранее доступный результат той же выборки с его исходными `calculatedAt` и окном, без индикации собственного чтения и ручного повтора. Состояние источника из `meta`, включая неуспех последней часовой попытки и неполноту, MUST представляться по `frontend-data-resilience`. При отсутствии результата SHALL показываться первичное ожидание либо нейтральная недоступность с автоматическим восстановлением по `frontend-data-resilience`. Подтверждённая потеря доступа MUST скрывать личные данные независимо от наличия сохранённого результата. #### Scenario: Просмотр ближайших событий - **WHEN** User открывает «Будущие события» из обзора Brokerage Account - **THEN** он видит отсортированный список событий ближайших 30 дней, где offer обозначен без суммы #### Scenario: Пустое состояние страницы - **WHEN** запрос будущих событий успешно возвращает полный пустой список - **THEN** страница сообщает, что на ближайшие 30 дней событий не найдено, и объясняет предметные ограничения покрытия источника #### Scenario: Ошибка страницы - **WHEN** запрос будущих событий завершается временной ошибкой - **THEN** страница сохраняет доступный результат той же выборки либо показывает нейтральную недоступность без ручного повтора, восстанавливая чтение автоматически и не выдавая частичные данные за полный прогноз #### Scenario: Прогнозный дивиденд с неизвестной суммой - **WHEN** прогноз содержит дивиденд с известной датой реестра, но без суммы - **THEN** его карточка обозначает дату как дату реестра и сумму как неизвестную, не показывает нулевую или полученную выплату #### Scenario: Ошибка обновления при сохранённом прогнозе на странице - **WHEN** запрос будущих событий возвращает последний полный прогноз вместе с ошибкой его обновления - **THEN** страница показывает этот прогноз с его исходными `calculatedAt` и окном и отдельно обозначает неуспех обновления источника, не предлагая ручной повтор #### Scenario: Первая загрузка либо ошибка без сохранённого прогноза - **WHEN** запрос будущих событий возвращает `data: null`, а `meta` обозначает выполнение первой загрузки либо её неуспех - **THEN** страница показывает доступное состояние первичного ожидания либо нейтральной недоступности без частичного списка и восстанавливает чтение автоматически ## ADDED Requirements ### Requirement: All-accounts upcoming events group same-day events of one instrument В режиме «Все счета» страница «Будущие события» и ближайшие события обзора MUST объединять в визуальную группу два и более показанных Future Cash Event с одинаковыми датой и видом даты (как на экране), identity Instrument и типом события, даже если они на одном счёте. События без Instrument или без пары MUST показываться как раньше. В режиме одного Brokerage Account группировка MUST NOT применяться. #### Scenario: Прогноз купонов одной облигации на двух счетах - **WHEN** в режиме «Все счета» на одну дату ожидается купон по облигации на брокерском счёте 200 RUB и купон по той же облигации на ИИС 100 RUB - **THEN** они показаны одной группой с облигацией, типом «Купон» и прогнозным итогом 300 RUB, а под заголовком видны строки «брокерский счёт 200 RUB» и «ИИС 100 RUB» #### Scenario: Разные типы или даты не объединяются - **WHEN** в режиме «Все счета» по одной облигации ожидаются купон и погашение на одну дату либо купоны на разные даты - **THEN** ни одна группа не содержит события разных типов или разных дат #### Scenario: Событие без Instrument - **WHEN** в режиме «Все счета» на одну дату показаны два события одного типа без identity Instrument - **THEN** они показаны отдельными строками без группы #### Scenario: Режим одного счёта не меняется - **WHEN** User открывает «Будущие события» одного Brokerage Account - **THEN** события показаны отдельными строками без группы, как до изменения ### Requirement: All-accounts upcoming event group shows each event and a forecast total Заголовок группы событий MUST показывать дату (для дивиденда — как дату реестра, если она такая), Instrument, тип и прогнозный итог. Под ним MUST всегда быть видна, без раскрытия, отдельная строка каждого события со счётом и прогнозной суммой (или пометкой о неизвестной сумме). Итог SHALL быть точной суммой со знаком по каждой валюте без конвертации и округления. Итог MUST NOT показываться, если у события группы нет суммы или полнота прогноза не подтверждена. #### Scenario: Событие с неизвестной суммой в группе - **WHEN** в режиме «Все счета» группа содержит дивиденд на одном счёте с известной суммой и дивиденд по той же бумаге на ту же дату на другом счёте без суммы - **THEN** заголовок группы не показывает итог, а строка второго счёта обозначает сумму как неизвестную #### Scenario: Оферта без сумм - **WHEN** в режиме «Все счета» на одну дату ожидается оферта по одной облигации на двух счетах - **THEN** они показаны одной группой без итога, и каждая строка показывает свой счёт #### Scenario: Прогнозный итог по нескольким валютам - **WHEN** группа содержит дивиденд 10 USD на одном счёте и дивиденд 200 RUB по той же бумаге на ту же дату на другом счёте - **THEN** заголовок показывает отдельные прогнозные итоги 10 USD и 200 RUB без конвертации #### Scenario: Прогнозный итог скрыт при неполном прогнозе - **WHEN** в режиме «Все счета» прогноз обозначен неполным, и на странице есть группа событий с известными суммами - **THEN** заголовок группы не показывает итог, а строки событий остаются видны со своими суммами #### Scenario: Группа дивидендов по дате реестра - **WHEN** группа содержит дивиденды, датированные датой реестра - **THEN** заголовок обозначает дату как дату реестра ### Requirement: All-accounts upcoming event grouping preserves order and limits Группа событий MUST занимать позицию своего первого события в порядке ответа; события внутри группы и остальные строки MUST сохранять относительный порядок ответа. Группировка MUST NOT менять состав, окно, порядок по дате или лимит обзора, который считается по событиям; группы собираются только из показанных событий. #### Scenario: Группировка в ближайших событиях обзора - **WHEN** в режиме «Все счета» среди пяти ближайших событий есть два события с одинаковым ключом - **THEN** блок обзора показывает те же пять событий, что и без группировки, два из них одной группой #### Scenario: Позиция группы событий - **WHEN** порядок ответа содержит события A, B, C, где A и C образуют группу, а B не входит ни в одну группу - **THEN** список показывает группу (A, C) на месте A, затем B