24 KiB
Brokerage Account Upcoming Events Specification
Purpose
Позволяет пользователю просматривать известные будущие денежные и связанные корпоративные события одного брокерского счёта на ближайший месяц.
Requirements
Requirement: User can retrieve upcoming events for an account
Система MUST предоставлять аутентифицированному User read-only GET /api/v1/brokerage-account-upcoming-events для выбранного открытого поддерживаемого Brokerage Account либо существующего режима «Все счета» (all) в границах текущего T-Bank connection User. Параметры from и to MUST сохранять существующий контракт: необязательные строгие календарные даты YYYY-MM-DD с включительными границами в UTC. Без from начало MUST соответствовать текущей календарной дате UTC; без to конец MUST соответствовать дате from плюс 30 календарных дней. При from позже to система MUST возвращать существующую ошибку INVALID_EVENTS_PERIOD, не подменять период, не запускать загрузку другого периода и не возвращать его прогноз. Обычный GET MUST NOT запускать личную синхронизацию.
Ответ MUST иметь { data, meta }, где meta соответствует наблюдаемому состоянию resource по tbank-data-sync. Доступный data MUST содержать только события coupon, dividend, maturity и offer, отсортированные по дате по возрастанию, calculatedAt, а в режиме all -- принадлежность каждого события счёту. Прогноз MUST быть рассчитан по количеству бумаг полного Portfolio Snapshot на calculatedAt; сохранённый прогноз MUST сохранять свой исходный calculatedAt и рассчитанное от него включительное окно, даже когда запрошенное from/to отличается. При чтении сохранённого прогноза система MUST возвращать только события, чьи даты попадают во включительное пересечение исходного окна прогноза и запрошенного UTC-окна; пустое пересечение либо отсутствие событий в пересечении MUST возвращать успешный пустой список с теми же calculatedAt, meta и исходным окном. В режиме all доступ и полнота обязательных источников MUST проверяться для каждого входящего счёта; отсутствие вклада счёта MUST NOT подменяться полным результатом. Список будущих событий является прогнозом по наблюдаемому состоянию счёта и количеству бумаг на calculatedAt и MUST NOT означать долговременное право владения Brokerage Account независимо от T-Bank connection.
Scenario: Получение событий доступного счёта
- WHEN аутентифицированный User запрашивает события доступного счёта с последним полным прогнозом
- THEN система возвращает из сохранённого прогноза события в запрошенном включительном UTC-окне, его исходные
calculatedAtи рассчитанное окно без обращения к T-Bank
Scenario: Запрошенное окно не пересекается с сохранённым прогнозом
- WHEN запрошенный включительный UTC-окно не пересекается с исходным окном последнего полного прогноза
- THEN система возвращает успешный пустой
dataс исходнымиcalculatedAt, окном иmeta
Scenario: Отсутствие событий в периоде
- WHEN пересечение запрошенного и исходного окна прогноза не содержит событий
- THEN система возвращает успешный пустой список, момент расчёта, исходное окно и
meta
Scenario: Некорректный период
- WHEN User передаёт
fromпозжеto - THEN система возвращает существующую ошибку
INVALID_EVENTS_PERIODбез прогноза и без запуска личной синхронизации
Scenario: Прогноз всех счетов
- WHEN User запрашивает режим
allи для каждого входящего счёта доступен полный прогноз - THEN система возвращает события всех счетов в запрошенном окне с принадлежностью каждого события счёту
Scenario: Отклонение недоступного счёта
- WHEN User запрашивает события счёта, недоступного через его текущий T-Bank connection
- THEN система возвращает существующий ответ о недоступности счёта и не раскрывает события
Requirement: Forecasts preserve event meaning and uncertainty
Система MUST передавать для каждого события его календарную дату, тип, доступные идентификаторы и название Instrument, а также прогнозную сумму до налогов как Money, если она известна. Прогнозная сумма MUST рассчитываться по количеству бумаг полного Portfolio Snapshot на calculatedAt, использованного для сохранённого прогноза, а не по количеству бумаг на момент HTTP-запроса. Сохранённый прогноз MUST сохранять свой calculatedAt и эту исходную зависимость, в том числе после неуспешного обновления, и MUST NOT приписываться более новому Portfolio Snapshot. Если денежные условия события неизвестны или неприменимы, прогнозная сумма MUST быть null, а не нулём и не парой разрозненных полей. Дивиденд MUST обозначать переданную дату как дату реестра, а offer MUST передаваться без вымышленной суммы.
Instrument в Future Cash Event MUST иметь тот же доменный смысл, что и в Portfolio: это финансовый инструмент, к которому относится событие, даже если событие не является Portfolio Position.
Scenario: Прогноз купона по текущей позиции
- WHEN поддерживаемая облигация в Portfolio Snapshot на
calculatedAtимеет известный купон в пределах исходного окна прогноза - THEN система возвращает сохранённое событие coupon с прогнозной суммой до налогов как Money в исходной валюте, рассчитанной по количеству облигаций этого Snapshot
Scenario: Прогноз дивиденда
- WHEN поддерживаемая акция в Portfolio Snapshot на
calculatedAtимеет объявленный дивиденд с датой фиксации реестра в пределах исходного окна прогноза - THEN система возвращает сохранённое событие dividend с датой, обозначенной как дата реестра (
record_date), и прогнозной суммой до налогов как Money, равнойdividend_netна одну бумагу, умноженной на количество акций этого Snapshot
Scenario: Отменённый дивиденд не попадает в прогноз
- WHEN запись дивиденда T-Bank имеет тип выплаты
Cancelled - THEN система не добавляет такое событие в сохранённый прогноз
Scenario: Отображение оферты без суммы
- WHEN для поддерживаемой облигации известна оферта в пределах исходного окна прогноза, но её денежные условия недоступны
- THEN система возвращает событие offer с прогнозной суммой
null
Scenario: Неподдерживаемое частичное погашение
- WHEN источник не предоставляет расписание будущих частичных погашений или амортизации облигации
- THEN система НЕ создаёт синтетическое событие частичного погашения
Requirement: Upcoming events use complete source results
Система MUST публиковать прогноз только после полного получения необходимых данных брокера и MOEX для полного Portfolio Snapshot, по количеству бумаг которого он рассчитан. Неуспешное обновление MUST NOT заменять последний полный прогноз, его calculatedAt или окно событий частичным списком. При неуспешном обновлении и существующем последнем полном прогнозе система MUST возвращать отфильтрованную для запрошенного окна часть этого прогноза с его исходными calculatedAt, окном и meta, отдельно обозначающим неуспех последней попытки, даже если результат фильтрации пуст. При отсутствии последнего полного прогноза система MUST возвращать data: null и в meta обозначать выполнение первой загрузки либо её неуспех без частичного списка. Система MUST пропускать инструменты, для которых источник не предоставляет поддерживаемые события, не создавая строки «нет данных».
Scenario: Недоступность источника
- WHEN необходимый источник данных брокера или MOEX временно недоступен во время часового обновления
- THEN система не публикует частичный список как полный прогноз
Scenario: Ошибка обновления при сохранённом прогнозе
- WHEN часовой обход не завершает обновление необходимых источников, а последний полный прогноз существует
- THEN система возвращает его события только в запрошенном окне, исходные
calculatedAtи окно, аmetaотдельно обозначает ошибку обновления
Scenario: Ошибка обновления при сохранённом прогнозе вне запрошенного окна
- WHEN часовой обход не завершает обновление, последний полный прогноз существует, но его окно не пересекается с запрошенным
- THEN система возвращает успешный пустой
dataс исходнымиcalculatedAt, окном иmeta, обозначающим ошибку обновления
Scenario: Инструмент без поддерживаемых данных
- WHEN Portfolio содержит инструмент, для которого источник не предоставляет поддерживаемые будущие события
- THEN система не добавляет для него синтетическую строку в результат
Scenario: MOEX отвечает без запрошенного блока
- WHEN MOEX отвечает успешно, но не содержит запрошенного блока данных
- THEN система трактует ответ как отсутствие данных по инструменту и не завершает обновление ошибкой
Requirement: Account page presents an upcoming events list
Страница Brokerage Account MUST предоставлять read-only действие перехода на отдельную страницу «Будущие события». Эта страница MUST показывать события сохранённого полного прогноза компактным списком без фильтров, пагинации, суммарного итога или действия ручной синхронизации, с датой, типом, инструментом и прогнозной суммой в исходной валюте, если она известна. Купоны и дивиденды MUST использовать то же представление выплаты, что и исполненные купоны, дивиденды и события графика инструмента, но MUST быть явно обозначены как прогноз, а не полученные деньги. Дата дивиденда MUST быть обозначена как дата реестра. Страница MUST показывать calculatedAt, исходное окно прогноза и наблюдаемые freshness, полноту, время последнего успешного прогноза, последнюю часовую попытку и доступность из meta понятным текстом или иконкой с доступным именем, а не только цветом. Она MUST объяснять, что прогноз рассчитан по количеству бумаг на calculatedAt, а показанные события дополнительно ограничены запрошенным включительным UTC-окном; прогноз указан до налогов и может быть неполным из-за доступности данных источника. Открытие страницы и повтор HTTP-чтения MUST NOT запускать личную синхронизацию.
Scenario: Просмотр ближайших событий
- WHEN User открывает «Будущие события» из обзора Brokerage Account
- THEN он видит отсортированный read-only список событий сохранённого 30-календарного окна и
calculatedAt, где купоны и дивиденды представлены как прогнозные выплаты, а offer обозначен без суммы
Scenario: Прогнозный дивиденд с неизвестной суммой
- WHEN прогноз содержит дивиденд с известной датой реестра, но без суммы
- THEN его карточка обозначает дату как дату реестра и сумму как неизвестную, не показывает нулевую или полученную выплату
Scenario: Пустое состояние страницы
- WHEN запрос будущих событий успешно возвращает пустой список
- THEN страница сообщает, что в сохранённом окне прогноза событий не найдено, показывает
calculatedAtи объясняет ограничения покрытия источника
Scenario: Первая загрузка либо ошибка без сохранённого прогноза
- WHEN запрос будущих событий возвращает
data: null, аmetaобозначает выполнение первой загрузки либо её неуспех - THEN страница показывает доступное состояние загрузки либо ошибки без частичного списка и предоставляет при ошибке действие повторить только HTTP-чтение
Scenario: Ошибка страницы
- WHEN запрос будущих событий завершается ошибкой
- THEN страница не показывает частичный список и предоставляет действие повторить только HTTP-чтение
Scenario: Ошибка обновления при сохранённом прогнозе на странице
- WHEN запрос будущих событий возвращает последний полный прогноз вместе с ошибкой его обновления
- THEN страница показывает этот прогноз с его исходными
calculatedAtи окном, отдельно сообщает об ошибке обновления и предоставляет действие повторить только HTTP-чтение
Requirement: Account overview includes upcoming events
Обзор Brokerage Account MUST показывать не более пяти ближайших Future Cash Event сохранённого полного прогноза в применённом запрошенном окне, его calculatedAt, исходное окно, наблюдаемую freshness, полноту, последнюю часовую попытку и доступность из meta, а также действие перехода на read-only полную страницу «Будущие события». Купоны и дивиденды MUST быть представлены той же карточкой выплаты, что на полной странице событий и остальных экранах, с явным обозначением прогнозного статуса; погашение и оферта сохраняют своё значение. Статус MUST быть понятен текстом или иконкой с доступным именем, а не только цветом. Неуспешное обновление при сохранённом прогнозе MUST оставаться локальным состоянием блока, сохранять показанные события и их исходное окно и MUST NOT заменять успешно отображённый Portfolio. Если полного прогноза нет, неуспешное обновление MUST оставаться локальным состоянием блока без частичного списка. Обзор MUST NOT предоставлять действие ручной синхронизации; его повтор MUST выполнять только HTTP-чтение.
Scenario: Отображение ближайших событий
- WHEN обзор счёта успешно загружен и сохранённый прогноз содержит будущие события
- THEN обзор показывает первые пять событий в порядке даты,
calculatedAtи действие перехода к полной странице, используя единое представление для прогнозных купонов и дивидендов
Scenario: Ближайшие события недоступны без сохранённого прогноза
- WHEN обзор счёта успешно загружен, а события возвращают
data: nullиmetaобозначает выполнение первой загрузки либо её неуспех - THEN Portfolio остаётся доступным, а блок будущих событий отображает собственное доступное состояние загрузки либо ошибки без частичного списка
Scenario: Ближайшие события недоступны
- WHEN обзор счёта успешно загружен, но запрос будущих событий завершается ошибкой
- THEN Portfolio остаётся доступным, а блок будущих событий отображает собственную ошибку
Scenario: Неуспешное обновление не скрывает сохранённый прогноз
- WHEN обзор счёта получает сохранённый полный прогноз вместе с ошибкой его обновления
- THEN Portfolio и события сохранённого окна остаются доступными, а блок отдельно обозначает ошибку и предлагает повторить только HTTP-чтение
Requirement: User can filter upcoming events by a forecast date range
The events page MUST retain its URL-backed date-range filter. When the URL has
no from or to parameters, the applied range MUST include the current date
and the following six calendar dates. The page MUST allow selecting today and
future dates in its date picker and MUST prevent selecting dates before today.
The date-picker restriction MUST NOT invalidate or rewrite a valid past date
range supplied directly in the URL. A malformed date, impossible calendar date,
or reversed range MUST be normalized to the default range, removing invalid
from and to parameters from the URL. Applying and resetting the filter MUST
continue to use the existing URL-backed period behavior.
Scenario: Default range starts today and spans seven calendar dates
- WHEN the user opens the events page without
fromortoparameters - THEN the applied range starts on the current calendar date
- AND the inclusive end date is six calendar dates after the start date
Scenario: Future dates can be selected and past dates cannot
- WHEN the user opens the date picker
- THEN today and later dates are selectable
- AND dates before today are not selectable
Scenario: Valid past URL range is preserved
- WHEN the user opens the events page with valid
fromandtodates in the past andfromis not afterto - THEN the page applies that URL range without clamping or replacing it
Scenario: Invalid URL range falls back to the default
- WHEN the URL contains a malformed date, an impossible calendar date, or
a range whose
fromdate is after itstodate - THEN the page applies the default seven-calendar-date range
- AND invalid
fromandtoparameters are removed from the URL