4.3 KiB
Context
См. motivation в proposal.md. Прогноз будущих событий (GET /api/v1/brokerage-account-upcoming-events) строится read-through: текущие Portfolio Position из T-Bank обогащаются данными источников. Дивиденды акций брались из MOEX dividends.json, который больше не возвращает блок dividends. T-Bank gRPC уже используется для Portfolio и Instruments, а GetDividends описан в instruments.proto и фильтруется по record_date — это прямой заменяющий источник для текущих позиций, поскольку токен владельца счёта уже есть в системе.
Goals / Non-Goals
Goals:
- Восстановить прогноз дивидендов по акциям через источник, доступный тем же токеном, что и Portfolio.
- Сохранить семантику события (
dateKind: registryпо дате фиксации реестра) и расчёт суммы до налогов по текущему количеству. - Убрать ставший мёртвым MOEX-путь дивидендов.
Non-Goals:
- Изменение API-контракта и frontend.
- Замена источника событий облигаций.
- Учёт налогов, удержаний и будущих сделок.
Decisions
Share dividends via T-Bank GetDividends
Ветка акций в UpcomingEventsService вызывает TbankClient.getDividends(token, instrumentId, from, to) с instrumentId = instrumentUid ?? figi позиции и окном 30 календарных дней. Запись превращается в событие dividend: дата = record_date, dateKind: registry, валюта и сумма на бумагу из dividend_net, итоговая сумма = dividend_net × quantity. Выплаты с dividend_type: Cancelled пропускаются.
Это использует уже имеющийся токен и покрывает именно инструменты портфеля, тогда как публичный MOEX-источник дивидендов сейчас недоступен. Альтернатива (новый cci/corp-actions MOEX) требует авторизации и не подходит для анонимного серверного вызова.
Strict source completeness unchanged
Недоступность T-Bank или MOEX по-прежнему завершает запрос ошибкой без частичного списка; инструмент без поддерживаемых событий просто пропускается. Смена источника не меняет семантику ошибок endpoint.
MOEX client keeps bond events only
Из moex.client.ts удаляются dividends() и MoexDividend; остаётся bondEvents() с блоками coupon, offer, description. Отсутствующий блок в успешном ответе MOEX трактуется как «нет данных», а не сбой.
Risks / Trade-offs
- [T-Bank возвращает только известные ему выплаты] → покрытие дивидендов зависит от данных T-Bank, что согласуется с ограничением «прогноз может быть неполным из-за доступности источника».
- [
GetDividendsлимитируется rate limiter] → запросы уже проходят через общийRateLimiterT-Bank. - [Отменённые выплаты в истории] → фильтр
dividend_type: Cancelledисключает их из прогноза.
Migration Plan
- Добавить
TbankClient.getDividendsи типTbankDividend. - Переключить ветку акций в
UpcomingEventsService; удалить MOEX-метод дивидендов. - Обновить тесты и
docs/features/brokerage-account-upcoming-events.md. - Откат: вернуть ветку акций на MOEX не требует миграции данных, состояние не сохраняется.