docs: document income without comparisons and unified payouts (WealthLedger/main#33) #40

Merged
codex-bot merged 1 commits from docs/33-unify-income-payments-latest into develop 2026-10-13 18:17:00 +03:00
7 changed files with 44 additions and 37 deletions
+11
View File
@@ -61,6 +61,17 @@ Envelope несовместим с прежними bare-array ответами:
поставляются согласованной парой. Финальный artifact передаётся явно; поставляются согласованной парой. Финальный artifact передаётся явно;
локальная генерация и CI frontend читают только собственный snapshot. локальная генерация и CI frontend читают только собственный snapshot.
## Income analytics
`GET /api/v1/brokerage-accounts/{accountId}/income-analytics` и общий маршрут
`all` возвращают результат только выбранного периода: итоги по исходным
валютам, точные записи выплат, разбиение по инструментам и временные
интервалы. Данных сравнения с предыдущим периодом или годом ранее в ответе
нет — ни в теле, ни среди зависимостей `meta.dependencies`, роль которых
ограничена значением `selected`. Публичную машинную схему задаёт
backend-generated OpenAPI; frontend получает её обновлённый snapshot отдельно.
Точную семантику поведения описывает [доход](../domains/income/overview.md).
## Validation и identity ## Validation и identity
Backend преобразует и проверяет входные данные на общей HTTP-границе. Backend преобразует и проверяет входные данные на общей HTTP-границе.
+9 -25
View File
@@ -4,7 +4,7 @@
купонами и дивидендами за выбранный период». Пользователь открывает купонами и дивидендами за выбранный период». Пользователь открывает
`/accounts/:accountId/income` из обзора счёта или `/accounts/:accountId/income` из обзора счёта или
[общий доход](../portfolio/all-accounts.md) по доступным счетам. [общий доход](../portfolio/all-accounts.md) по доступным счетам.
Экран показывает итоги по валютам, сравнение и отдельную карточку каждой Экран показывает итоги по валютам и отдельную карточку каждой
включённой выплаты. Источником служат [исполненные операции](../operations/overview.md), включённой выплаты. Источником служат [исполненные операции](../operations/overview.md),
а не изменение цены портфеля и не календарь будущих выплат. а не изменение цены портфеля и не календарь будущих выплат.
@@ -38,7 +38,7 @@
При первой загрузке или новом периоде без сохранённых данных показан При первой загрузке или новом периоде без сохранённых данных показан
каркас страницы. Пустой результат объясняет отсутствие исполненных купонов и каркас страницы. Пустой результат объясняет отсутствие исполненных купонов и
дивидендов, сохраняя фильтры, налоговое пояснение и сравнения. Ошибка запроса дивидендов, сохраняя фильтры и налоговое пояснение. Ошибка запроса
или нарушение принадлежности выплат даёт локальное состояние с действием «Повторить». или нарушение принадлежности выплат даёт локальное состояние с действием «Повторить».
При фоновом обновлении того же периода сохранённый ответ и черновик При фоновом обновлении того же периода сохранённый ответ и черновик
остаются видимыми: загрузку обозначает индикатор, неуспешное обновление — остаются видимыми: загрузку обозначает индикатор, неуспешное обновление —
@@ -51,32 +51,15 @@
- Backend проверяет доступ локально и читает сохранённые операции. Фоновая загрузка должна завершить все страницы; ошибка страницы или повреждённая цепочка курсоров не подтверждают полноту. - Backend проверяет доступ локально и читает сохранённые операции. Фоновая загрузка должна завершить все страницы; ошибка страницы или повреждённая цепочка курсоров не подтверждают полноту.
- Только точные типы купона и дивиденда источника формируют результат. Суммы остаются точными десятичными строками в исходной валюте; отрицательные корректировки сохраняют знак. Налоги, комиссии, сделки, переводы, погашения и переводы дивидендов не входят в доход. - Только точные типы купона и дивиденда источника формируют результат. Суммы остаются точными десятичными строками в исходной валюте; отрицательные корректировки сохраняют знак. Налоги, комиссии, сделки, переводы, погашения и переводы дивидендов не входят в доход.
- Итоги, сравнения, временные интервалы и разбиение по инструментам не смешивают валюты и не создают общий конвертированный итог. Страница показывает сравнения с предыдущим периодом и годом ранее, когда календарная дата и история счёта позволяют. Неполное сравнение имеет отдельное сообщение, без нулевой базы. - Итоги, временные интервалы и разбиение по инструментам не смешивают валюты и не создают общий конвертированный итог. Система не загружает другие периоды ради сравнения полученного дохода с выбранным.
- Временные интервалы по-прежнему приходят с backend: дни для 1–45 дней, недели для 46–180 и месяцы для более длинного периода, включая пустые интервалы. Страница дохода не строит из них график или текстовую динамику; ответ API не меняется. - Временные интервалы по-прежнему приходят с backend: дни для 1–45 дней, недели для 46–180 и месяцы для более длинного периода, включая пустые интервалы. Страница дохода не строит из них график или текстовую динамику; ответ API не меняется.
- Раздел «Выплаты» показывает единый список карточек выплат в исходном порядке `entries`: одна карточка на каждую выплату. Внешних групп по инструментам или валютам, итогов и количества выплат инструмента нет. Описание, дата, доступные идентификаторы инструмента и сумма со знаком видны в каждой карточке; валюты по-прежнему разделены в итогах и сравнениях. Дополнительный запрос за составом не нужен. - Раздел «Выплаты» показывает единый список карточек выплат в исходном порядке `entries`: одна карточка на каждую выплату. Внешних групп по инструментам или валютам, итогов и количества выплат инструмента нет. Описание, дата, доступные идентификаторы инструмента и сумма со знаком видны в каждой карточке; валюты разделены в итогах. Дополнительный запрос за составом не нужен.
Сравнение с непосредственно предыдущим периодом использует предыдущий полный
месяц для полного выбранного месяца, иначе — непосредственно предшествующий
интервал той же включительной длительности. Оно не подменяет сравнение годом
ранее. Незагруженное сравнение и ошибка его источника отличаются от
недоступности годового сравнения по календарю или дате открытия счёта.
Каждый раздел сравнения показывает цветные панели без общей белой подложки и
внутренних отступов у внешнего блока. Точные периоды показаны в заголовках двух панелей с русским форматом диапазона
и UTC для календарных дат.
Отдельного заголовка с датами и валютного бейджа нет; валюта остаётся у каждой суммы.
Панель «Разница» сохраняет серверную абсолютную разницу и дополняет итог, купоны
и дивиденды процентом: абсолютная разница / сумма годом ранее × 100.
Это округлённый показатель для отображения, а не пересчёт Money или инвестиционная
доходность. Форматирование сохраняет знак и не более одного десятичного разряда.
При нулевой или отрицательной базе либо непредставимом числовом отношении
процентный бейдж не отображается; абсолютная разница остаётся видимой.
## Полнота и принадлежность выплат ## Полнота и принадлежность выплат
Доходы читают сохранённые операции и coverage в согласованной транзакции. Доходы читают сохранённые операции и coverage в согласованной транзакции.
Selected, previous и yearAgo имеют независимую готовность. Неполный selected Только выбранный период определяет готовность результата. Неполный период
не получает окончательных итогов; неполное сравнение не создаёт нулевую базу. не получает окончательных итогов.
Подтверждённый пустой период отличается от ещё не загруженного. При смене Подтверждённый пустой период отличается от ещё не загруженного. При смене
периода прежний snapshot не показывается под новым названием. периода прежний snapshot не показывается под новым названием.
@@ -103,11 +86,12 @@ Backend обеспечивает принадлежность выплат, ва
## Будущие события и ограничения ## Будущие события и ограничения
На странице дохода нет блоков «Динамика» и «Ближайший прогноз». Она не запрашивает На странице дохода нет блоков «Динамика» и «Ближайший прогноз», блоков
сравнения периодов и сообщений об их недоступности. Она не запрашивает
`/events` и не зависит от его доступности. Самостоятельная страница `/events` и не зависит от его доступности. Самостоятельная страница
[«Будущие события»](upcoming-events.md) по-прежнему доступна из обзора [«Будущие события»](upcoming-events.md) по-прежнему доступна из обзора
выбранного счёта и сохраняет прежнее поведение. Будущие выплаты выбранного счёта и сохраняет прежнее поведение. Будущие выплаты
не включаются в итоги полученного дохода или сравнения. не включаются в итоги полученного дохода.
Аналитика читает сохранённую историю операций и не рассчитывает налоги, инвестиционную эффективность, доходность, валютную конвертацию или общий мультивалютный итог. Аналитика читает сохранённую историю операций и не рассчитывает налоги, инвестиционную эффективность, доходность, валютную конвертацию или общий мультивалютный итог.
+6 -1
View File
@@ -45,7 +45,12 @@
календарных дней. Поля «С» и «По» сохраняют выбранные календарные даты в URL, календарных дней. Поля «С» и «По» сохраняют выбранные календарные даты в URL,
а «Сбросить» возвращает период по умолчанию. а «Сбросить» возвращает период по умолчанию.
События упорядочены по календарной дате. У каждой строки видны тип, События упорядочены по календарной дате. Купоны и дивиденды показываются
единым предметным представлением выплаты с явной пометкой прогноза — тем же,
что у исполненных выплат в доходе и журнале; неизвестная сумма остаётся
«сумма неизвестна» и не превращается в ноль или полученные деньги.
Дата дивиденда обозначена как дата реестра. Offer и погашение сохраняют своё
значение без суммы выплаты. У каждой строки видны тип,
инструмент, дата и доступная сумма в исходной валюте. Список не имеет инструмент, дата и доступная сумма в исходной валюте. Список не имеет
пагинации и не конвертирует валюты. Пустой результат означает отсутствие пагинации и не конвертирует валюты. Пустой результат означает отсутствие
известных поддерживаемых событий в выбранном окне, а не доказательство известных поддерживаемых событий в выбранном окне, а не доказательство
+5 -1
View File
@@ -89,7 +89,11 @@ HTML-источник, общий кэш и поведение при измен
Календарь охватывает пять прошлых лет и следующий год. Будущие купоны Календарь охватывает пять прошлых лет и следующий год. Будущие купоны
сортируются по дате выплаты, прошедшие и недатированные доступны отдельно. сортируются по дате выплаты, прошедшие и недатированные доступны отдельно.
Показаны сумма на облигацию, номер, тип, длительность периода и дата реестра, Будущие и прошедшие события купонного графика показываются единым предметным
представлением выплаты с пометкой события по графику — тем же, что у
исполненных выплат и прогноза; исполнение подтверждает только личная история.
Показаны сумма на облигацию, отдельная личная оценка, номер, тип, длительность
периода и дата реестра,
если они известны. Неопределённый будущий купон не заменяется нулём. если они известны. Неопределённый будущий купон не заменяется нулём.
Личная оценка доступна только при положительных позициях, известной сумме, Личная оценка доступна только при положительных позициях, известной сумме,
+5 -1
View File
@@ -124,7 +124,11 @@ UID включён в ключ кэша и подпись общего курс
## Дивиденды и финансовые показатели ## Дивиденды и финансовые показатели
События компании отделены от личных зачислений. Известные будущие выплаты События компании отделены от личных зачислений. Будущие и прошедшие события
дивидендного графика показываются единым предметным представлением выплаты
с пометкой «событие по графику» — тем же, что у исполненных выплат и прогноза;
сумма на акцию, отдельная личная оценка и дата реестра сохраняют свои подписи
и не выдаются за личное зачисление. Известные будущие выплаты
определяются по `paymentDate`, при её отсутствии — по `recordDate`; прошедшие определяются по `paymentDate`, при её отсутствии — по `recordDate`; прошедшие
и недатированные события помещены в отдельную историю компании. Отменённые и недатированные события помещены в отдельную историю компании. Отменённые
события исключаются. Личная оценка умножает сумму на акцию на текущее положительное события исключаются. Личная оценка умножает сумму на акцию на текущее положительное
+4 -2
View File
@@ -84,8 +84,10 @@ Coverage/status без изменения rowset cursor не ломают. Пе
Полный журнал и превью используют одинаковую компактную строку: логотип Полный журнал и превью используют одинаковую компактную строку: логотип
или буквенная заглушка, описание, дата, инструмент и денежное движение. или буквенная заглушка, описание, дата, инструмент и денежное движение.
Для купона и дивиденда денежная метка называет точное событие; для прочих Исполненные купоны и дивиденды показываются единым предметным представлением
операций — категорию. Она показывается один раз, без повтора рядом с датой. выплаты — тем же, что на странице дохода, в прогнозе и графиках инструментов;
денежная метка называет точное исполненное событие. Для прочих
операций метка называет категорию. Она показывается один раз, без повтора рядом с датой.
Знак и цвет обозначают направление денег; отсутствие движения нейтрально. Знак и цвет обозначают направление денег; отсутствие движения нейтрально.
Если описание отсутствует, показывается локализованный тип операции. Если описание отсутствует, показывается локализованный тип операции.
+4 -7
View File
@@ -53,13 +53,10 @@ Backend публикует статические маршруты под `/api/
- Журнал объединяет операции по убыванию времени, при равном времени использует - Журнал объединяет операции по убыванию времени, при равном времени использует
порядок идентификаторов счетов и операций. ID порядок идентификаторов счетов и операций. ID
операций разных счетов не считаются дублями. Переводы не схлопываются. операций разных счетов не считаются дублями. Переводы не схлопываются.
- Доходы рассчитываются из согласованной локальной выборки операций за общие периоды. - Доходы собираются из всех страниц операций каждого счёта за выбранный период.
Итоги, сравнения, временные интервалы и принадлежность выплат рассчитывает Итоги, временные интервалы и принадлежность выплат рассчитывает
сервис дохода. сервис дохода. Данные сравнения периодов не загружаются и не возвращаются;
Для сравнения с годом ранее используется текущий состав счетов; новый счёт состав счетов влияет только на фактические выплаты выбранного периода.
добавляет только реально полученные выплаты. При известных датах открытия всех счетов
доступность сравнения определяется самым ранним открытием в этом составе.
Закрытые счета в историческое сравнение не добавляются.
- Будущие события сортируются по дате и сохраняют отдельную строку каждого счёта. - Будущие события сортируются по дате и сохраняют отдельную строку каждого счёта.
Прогноз не включается в реализованные доходы. Прогноз не включается в реализованные доходы.