spec: archive three completed changes (main#33, frontend#63, screener)
This commit is contained in:
+138
@@ -0,0 +1,138 @@
|
||||
## REMOVED Requirements
|
||||
|
||||
### Requirement: Period comparisons preserve calendar and currency meaning
|
||||
|
||||
**Reason**: Сравнения с предыдущим периодом и годом ранее больше не входят в
|
||||
назначение аналитики полученного дохода и требуют избыточной загрузки истории.
|
||||
|
||||
**Migration**: Пользователь видит только итоги и состав выплат применённого
|
||||
периода; потребители ответа аналитики больше не получают данные сравнений и
|
||||
состояния их доступности. Исторический период можно по-прежнему применить
|
||||
самостоятельно, но система не сопоставляет его с другим периодом автоматически.
|
||||
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: User explicitly applies an analytics period represented in the URL
|
||||
|
||||
Страница выбранного Brokerage Account «Пассивный доход» MUST позволять User редактировать черновик `from` и `to`, не изменяя видимую аналитику до явного применения. Верхний блок фильтров MUST предоставлять два подписанных календарных поля начала и окончания периода с тем же взаимодействием выбора даты, что в истории событий портфеля, и отображением дат в формате `ДД.ММ.ГГГГ`. Поля и действия применения и сброса MUST быть доступны с клавиатуры. Явное применение MUST заменить применённый период, загрузить соответствующий результат и представить применённые даты в URL страницы. Недопустимый черновик MUST показывать ошибку соответствующего поля и MUST NOT заменять последний применённый период. Сброс MUST немедленно вернуть применённый период к текущему месяцу по сегодняшний день и синхронизировать URL. Перезагрузка или открытие URL с допустимым периодом MUST восстановить тот же применённый период. Страница MUST NOT дублировать период отдельной подписью под блоком фильтров. Действие перехода на страницу MUST быть доступно из выбранного Brokerage Account, а не из глобальной навигации.
|
||||
|
||||
#### Scenario: Черновик периода не применён
|
||||
|
||||
- **WHEN** User изменяет черновик `from` или `to`, но не применяет его
|
||||
- **THEN** видимые итоги и карточки выплат остаются основанными на последнем применённом периоде
|
||||
|
||||
#### Scenario: Выбор дат в верхнем блоке
|
||||
|
||||
- **WHEN** User выбирает начало и окончание периода через календарные поля
|
||||
- **THEN** выбранные даты отображаются в подписанных полях в формате `ДД.ММ.ГГГГ`, а изменение остаётся черновиком до явного применения
|
||||
|
||||
#### Scenario: Управление фильтрами с клавиатуры
|
||||
|
||||
- **WHEN** User управляет верхним блоком фильтров с клавиатуры
|
||||
- **THEN** он может последовательно перейти к обоим полям дат, изменить период и выполнить применение или сброс без мыши
|
||||
|
||||
#### Scenario: Применение периода
|
||||
|
||||
- **WHEN** User явно применяет допустимый черновик периода
|
||||
- **THEN** страница загружает аналитику этого периода и отражает применённые `from` и `to` в URL
|
||||
|
||||
#### Scenario: Недопустимый черновик периода
|
||||
|
||||
- **WHEN** User пытается применить черновик с отсутствующей, некорректной или будущей датой либо с `from` после `to`
|
||||
- **THEN** страница показывает ошибку соответствующего поля и сохраняет последний применённый период, его URL и видимую аналитику
|
||||
|
||||
#### Scenario: Восстановление применённого периода из URL
|
||||
|
||||
- **WHEN** User открывает URL страницы с допустимыми `from` и `to`
|
||||
- **THEN** страница показывает аналитику за указанный применённый период
|
||||
|
||||
#### Scenario: Сброс периода
|
||||
|
||||
- **WHEN** User сбрасывает пользовательский период
|
||||
- **THEN** страница немедленно применяет период от первого дня текущего месяца по Europe/Moscow до сегодняшнего дня и синхронизирует URL
|
||||
|
||||
### Requirement: Realized analytics never presents an incomplete result as complete
|
||||
|
||||
Система MUST формировать выбранный результат, его trend buckets, instrument breakdown и drill-down только после успешного получения всех необходимых cursor pages исполненных операций выбранного периода. Ошибка любой необходимой страницы MUST завершать расчёт восстанавливаемой ошибкой и MUST NOT возвращать частичные totals, buckets или breakdown как полный результат. Успешный период без подходящих выплат MUST возвращать нулевой результат и отображаться с явным объяснением пустого состояния. Система MUST NOT загружать другие периоды ради сравнения полученного дохода с выбранным периодом.
|
||||
|
||||
#### Scenario: Все страницы операций успешно получены
|
||||
|
||||
- **WHEN** для расчёта требуется несколько cursor pages и каждая страница успешно получена
|
||||
- **THEN** система формирует результат по всем подходящим Ledger Entries со всех страниц выбранного периода без расчёта сравнений с другими периодами
|
||||
|
||||
#### Scenario: Одна из страниц операций недоступна
|
||||
|
||||
- **WHEN** получение любой необходимой cursor page завершается ошибкой
|
||||
- **THEN** страница показывает восстанавливаемую ошибку и не показывает частичный результат как полный
|
||||
|
||||
#### Scenario: В периоде нет купонов и дивидендов
|
||||
|
||||
- **WHEN** все необходимые операции успешно получены, но среди них нет подходящих coupon или dividend Ledger Entries
|
||||
- **THEN** страница показывает нулевой результат и объясняет, что за выбранный период купоны и дивиденды не найдены
|
||||
|
||||
### Requirement: Income payments remain traceable to exact Ledger Entries
|
||||
|
||||
В разделе «Выплаты» страница MUST показывать единый список карточек точных исполненных Ledger Entries применённого периода в исходном серверном порядке entries. Каждая выплата MUST иметь собственную сразу видимую карточку с описанием, датой исполнения, доступной identity Instrument и signed Money в исходной валюте. Купоны и дивиденды MUST использовать то же представление выплаты, что и на экранах журнала, прогноза и графиков инструментов, при этом карточка MUST обозначать эту сумму именно как фактически исполненную, а не прогнозную. Страница MUST NOT добавлять внешние группировочные карточки или заголовки по Instrument либо валюте, subtotals инструмента или количество выплат инструмента. Список MUST сохранять отрицательные корректировки и повторяющиеся operation IDs как отдельные записи и MUST NOT включать записи вне аналитического итога. Backend MUST обеспечивать согласованность entries, instrumentKey, валюты и receipt count при формировании ответа из одного набора записей. Frontend SHALL доверять типизированному contract без второго runtime consistency validator и MUST NOT пересчитывать денежные итоги.
|
||||
|
||||
#### Scenario: Каждая выплата показана отдельной карточкой
|
||||
|
||||
- **WHEN** выбранный период содержит несколько включённых Ledger Entries одного или разных Instrument
|
||||
- **THEN** раздел «Выплаты» сразу показывает отдельную карточку каждой записи в исходном порядке без внешних группировочных блоков, раскрытия, итогов инструмента и receipt count на UI
|
||||
|
||||
#### Scenario: Список воспроизводит точный состав дохода
|
||||
|
||||
- **WHEN** User просматривает загруженный раздел «Выплаты»
|
||||
- **THEN** он видит все и только включённые coupon и dividend Ledger Entries применённого периода с датой, описанием, доступной identity и исходной суммой, обозначенной как исполненная выплата
|
||||
|
||||
#### Scenario: Отрицательная корректировка и повторяющиеся IDs сохраняются
|
||||
|
||||
- **WHEN** доход содержит отрицательную корректировку либо несколько включённых entries с одинаковым operation ID
|
||||
- **THEN** каждая запись остаётся отдельной карточкой, а корректировка отображается с исходным знаком
|
||||
|
||||
#### Scenario: Валюта видна в сумме каждой выплаты
|
||||
|
||||
- **WHEN** подходящие выплаты одного Instrument представлены в нескольких исходных валютах
|
||||
- **THEN** каждая карточка показывает свою Money с исходной валютой, без отдельного заголовка валютной группы или объединённого мультивалютного итога
|
||||
|
||||
### Requirement: Analytics summary remains readable per currency
|
||||
|
||||
Страница MUST обозначать фактический результат как «Получено купонами и дивидендами» и для каждой исходной валюты показывать total, coupon subtotal и dividend subtotal выбранного периода. Она MUST объяснять, что tax operations не включены, не называя фактический результат gross, net, суммой до налогов, суммой после налогов или налоговым расчётом. Значения MUST оставаться доступными как читаемый текст, не только как графика, цвет или положение. Страница MUST NOT показывать блок «Динамика», его график, переключатель валюты графика или текстовый список временных buckets независимо от длительности выбранного периода. Страница MUST NOT показывать блоки «Предыдущий период» и «Годом ранее» или сообщения о недоступности сравнений.
|
||||
|
||||
#### Scenario: Итоги дохода доступны как текст
|
||||
|
||||
- **WHEN** выбранный период содержит исполненные купонные или дивидендные выплаты
|
||||
- **THEN** страница показывает читаемые total, coupon subtotal и dividend subtotal с обозначением фактически полученного дохода и объяснением исключения tax operations
|
||||
|
||||
#### Scenario: Итоги нескольких валют остаются разделёнными
|
||||
|
||||
- **WHEN** результат содержит подходящие выплаты в нескольких исходных валютах
|
||||
- **THEN** страница показывает отдельные читаемые итоги каждой валюты без конвертации и общего итога разных валют
|
||||
|
||||
#### Scenario: Динамика отсутствует для периода любой длительности
|
||||
|
||||
- **WHEN** User открывает аналитику или применяет допустимый период любой длительности
|
||||
- **THEN** страница показывает итоги и выплаты без динамики, сравнений периодов и состояний их доступности
|
||||
|
||||
### Requirement: Income page excludes upcoming forecasts
|
||||
|
||||
Страница «Пассивный доход» MUST NOT показывать блок «Ближайший прогноз», его суммы, список будущих выплат, состояния загрузки, пустоты или ошибки. Forecast values MUST NOT входить в realized total, trend buckets или instrument breakdown. Доступность данных Future Cash Events MUST NOT влиять на отображение успешно загруженной realized analytics. Существующая самостоятельная страница «Будущие события» и её доступность из выбранного Brokerage Account MUST сохраняться.
|
||||
|
||||
#### Scenario: Известные будущие выплаты не появляются на странице дохода
|
||||
|
||||
- **WHEN** для выбранного Brokerage Account известны будущие coupon или dividend события с суммой или без неё либо maturity или offer события
|
||||
- **THEN** страница дохода не показывает блок «Ближайший прогноз» и не включает эти будущие события в фактически полученный доход
|
||||
|
||||
#### Scenario: Изменение исторического периода не возвращает прогноз
|
||||
|
||||
- **WHEN** User применяет допустимый исторический период или сбрасывает фильтры
|
||||
- **THEN** страница показывает соответствующую realized analytics без блока «Ближайший прогноз»
|
||||
|
||||
#### Scenario: Данные будущих событий недоступны
|
||||
|
||||
- **WHEN** realized analytics успешно загружена, а данные Future Cash Events недоступны
|
||||
- **THEN** итоги и карточки выплат остаются доступными, а страница дохода не показывает состояние ошибки или загрузки прогноза
|
||||
|
||||
#### Scenario: Самостоятельная страница будущих событий сохраняется
|
||||
|
||||
- **WHEN** User переходит из выбранного Brokerage Account на существующую страницу «Будущие события»
|
||||
- **THEN** эта страница остаётся доступной с прежним поведением независимо от отсутствия прогноза на странице дохода
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: Account overview includes recent ledger events
|
||||
|
||||
Обзор счёта MUST показывать пять последних исполненных записей журнала этого счёта и действие перехода к его полному журналу. Каждая показанная запись MUST иметь ту же визуальную идентичность инструмента и семантику денежного движения, что и запись полного журнала. Исполненные купоны и дивиденды MUST иметь то же представление выплаты, что и на других экранах с купонами и дивидендами; остальные операции сохраняют представление записи журнала. Неуспешный или пустой запрос последних записей MUST оставаться локальным состоянием блока последних событий и MUST NOT заменять успешно отображённый обзор Portfolio.
|
||||
|
||||
#### Scenario: Отображение последних событий
|
||||
|
||||
- **WHEN** загружается обзор счёта и его журнал содержит исполненные операции
|
||||
- **THEN** обзор показывает не более пяти последних записей и ссылку на полный журнал, а купоны и дивиденды узнаваемы по тому же представлению выплаты
|
||||
|
||||
#### Scenario: Последние записи недоступны
|
||||
|
||||
- **WHEN** обзор счёта успешно загружается, но запрос последних записей завершается ошибкой
|
||||
- **THEN** обзор Portfolio остаётся доступным, а блок последних событий отображает собственное состояние восстановления
|
||||
|
||||
#### Scenario: Последняя запись не содержит visual metadata инструмента
|
||||
|
||||
- **WHEN** одна из последних записей не имеет доступной presentation metadata инструмента
|
||||
- **THEN** обзор показывает для неё понятный текстовый fallback и сохраняет дату, тип, инструмент и денежное изменение записи доступными для чтения
|
||||
|
||||
### Requirement: Full ledger presents compact rows
|
||||
|
||||
Страница полного журнала MUST показывать для каждой записи дату, тип операции, инструмент и денежное изменение в исходной валюте в компактной структурированной строке. При доступной presentation metadata инструмента строка MUST показывать его визуальную идентичность; при её отсутствии MUST использовать понятный текстовый fallback. Для купонных и дивидендных операций на странице полного журнала и в личной истории инструмента MUST использоваться то же представление выплаты, что в доходе, прогнозе и графиках инструментов, с обозначением исполненного движения. Для каждой записи денежное изменение в исходной валюте MUST сопровождаться подписью конкретного типа события и знаком: для купонной операции — «Купон», для дивидендной — «Дивиденд», для остальных записей — подпись их категории («Сделка», «Налог», «Комиссия», «Перевод», «Прочее»). Строка MUST NOT повторять подпись типа события во вторичной метадате записи. Знак «+» / «−» и семантический цвет MUST оставаться носителями направления и MUST NOT заменяться только текстом. Страница MUST обозначать записи без движения денег нейтрально и MUST NOT показывать цену или количество.
|
||||
|
||||
#### Scenario: Отображение записи только с инструментом
|
||||
|
||||
- **WHEN** полный журнал отображает запись без денежной выплаты
|
||||
- **THEN** страница определяет её как запись без движения денег
|
||||
|
||||
#### Scenario: Отображение поступления
|
||||
|
||||
- **WHEN** полный журнал отображает запись с положительной денежной выплатой
|
||||
- **THEN** строка явно показывает поступление знаком и подписью конкретного типа события («Купон», «Дивиденд» или категории) и его денежное изменение в исходной валюте, не полагаясь только на цвет
|
||||
|
||||
#### Scenario: Отображение списания
|
||||
|
||||
- **WHEN** полный журнал отображает запись с отрицательной денежной выплатой
|
||||
- **THEN** строка явно показывает списание знаком и подписью конкретного типа события («Купон», «Дивиденд» или категории) и его денежное изменение в исходной валюте, не полагаясь только на цвет
|
||||
|
||||
#### Scenario: Отображение купона
|
||||
|
||||
- **WHEN** полный журнал или личная история инструмента отображает исполненную операцию с upstream-типом купона
|
||||
- **THEN** запись показывает подпись «Купон» и исполненную сумму в том же представлении выплаты, что на других экранах
|
||||
|
||||
#### Scenario: Отображение дивиденда
|
||||
|
||||
- **WHEN** полный журнал или личная история инструмента отображает исполненную операцию с upstream-типом дивиденда
|
||||
- **THEN** запись показывает подпись «Дивиденд» и исполненную сумму в том же представлении выплаты, что на других экранах
|
||||
|
||||
#### Scenario: Подпись типа не дублируется
|
||||
|
||||
- **WHEN** полный журнал отображает запись с типом события и вторичной метадатой
|
||||
- **THEN** подпись типа события присутствует в строке один раз и не повторяется во вторичной метадате записи
|
||||
|
||||
#### Scenario: Отсутствует visual metadata инструмента
|
||||
|
||||
- **WHEN** полный журнал отображает запись без доступной presentation metadata инструмента
|
||||
- **THEN** строка показывает понятный текстовый fallback без подмены или сокрытия доступных данных инструмента
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### 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-чтение
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
## Purpose
|
||||
|
||||
Позволяет отличать опубликованные календарные сведения о купонах и дивидендах
|
||||
инструмента от фактически полученных личных выплат и прогноза по позиции.
|
||||
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Instrument payout schedules do not imply executed income
|
||||
|
||||
На страницах акций и облигаций известные будущие, прошедшие и недатированные события графика дивидендов или купонов MUST использовать то же представление выплаты, что и купоны/дивиденды других экранов, но MUST обозначать их как события графика, не подтверждающие фактическое зачисление. Доступные дата реестра, дата выплаты, сумма на одну бумагу и отдельная личная оценка MUST сохранять свои подписи и смысл; неизвестная сумма или дата MUST NOT подменяться нулём или вымышленной датой. Исполненная личная операция MUST оставаться отличимой от события графика, даже когда их даты совпадают.
|
||||
|
||||
#### Scenario: Будущий купон с известными условиями
|
||||
|
||||
- **WHEN** User просматривает будущий купон облигации с известными датой выплаты, суммой на облигацию и оценкой для позиции
|
||||
- **THEN** единое представление показывает купон как событие графика, сохраняет обе разные суммы и дату и не называет оценку полученными деньгами
|
||||
|
||||
#### Scenario: Прошедший дивиденд без подтверждённой операции
|
||||
|
||||
- **WHEN** User просматривает в истории акции событие дивидендного графика с прошедшей датой реестра
|
||||
- **THEN** представление показывает его как событие графика с суммой на акцию, а не как исполненную выплату пользователю
|
||||
|
||||
#### Scenario: Неизвестные условия графика
|
||||
|
||||
- **WHEN** в купонном или дивидендном графике отсутствует дата выплаты либо денежное значение
|
||||
- **THEN** представление сохраняет известные сведения и явно различает неизвестное значение и ноль без вымышленной даты зачисления
|
||||
Reference in New Issue
Block a user