Files
codex-bot 7fbd4273ba
Docs security / security (push) Successful in 7s
Docs verify / verify (push) Successful in 13s
docs: describe RUB-only behavior (WealthLedger/main#55) (#68)
2026-11-11 09:19:49 +03:00

11 KiB

Портфель

Портфель показывает, какими активами и доступными деньгами располагает брокерский счёт по последнему успешному наблюдению T-Bank. Это снимок состава и его текущей оценки, а не локальная история владения или расчёт полной инвестиционной доходности. Пользователь открывает его на /accounts/:accountId; режим «Все счета» объединяет доступные счета текущего подключения.

Снимок и связанные области

Снимок состоит из позиций по инструментам, доступных денежных остатков, итоговой суммы в RUB и структуры активов. Позиция означает ненулевое количество обычного инструмента в брокерском портфеле. Торгуемая валютная позиция CURRENCY и свободные деньги имеют разный смысл и передаются раздельно; в итоге учитываются только деньги в RUB. Точный смысл сумм и неизвестных значений раскрыт в справочнике данных.

Доступность счёта определяется текущим подключением и списком счетов. Backend получает данные через серверную интеграцию T-Bank и постоянно сохраняет последний полный снимок в SQLite. Frontend получает нормализованный результат через HTTP API. Поток загрузки объясняет границы доступа, свежесть снимка и восстановление после временной ошибки.

Обзор счёта также показывает пять последних операций, полученный доход текущего месяца и до пяти будущих событий. Каждый блок загружается самостоятельно: его ошибка или отсутствие данных не скрывает основной портфель. Полученные выплаты и прогноз не добавляются к текущей стоимости повторно и не превращают результат открытой позиции в полную доходность. Полную доходность с учётом пополнений и выводов показывает вкладка «Результат».

Как читать экран

Сводка показывает одну карточку с итоговой суммой в RUB. Деньги уже включены в итог. Сумма обозначена ₽; вспомогательным технологиям доступны полное значение и название валюты. Суммы сохраняют все исходные цифры, знак и дробные позиции, включая -0,5; длинные значения переносятся без обрезания. Карточка не интерактивна. Отсутствующая итоговая сумма не получает искусственный ноль. Пустой итог не скрывает доступный состав портфеля.

Структура после сводки распределяет известную стоимость по акциям, облигациям, другим активам и свободным деньгам в RUB. Кольцевая диаграмма дополнена текстовым списком сумм и долей и подсказкой; на узком экране список расположен под ней. Неизвестная оценка, отрицательные составляющие или нулевой итог ограничивают возможность показать доли — почему кольцо бывает недоступно.

Акции и облигации показаны отдельными секциями, по одной карточке в ряду при любой ширине. Внутри сохраняется порядок источника. Слева находятся название, логотип, количество и идентификатор, справа — стоимость и результат. Средняя цена и доля размещены ниже. Логотип размером 40 px при недоступности изображения заменяется первой буквой имени. Акция показывает тикер, а при его отсутствии ISIN; облигация — ISIN. Название и логотип ведут на страницы акции или облигации, когда доступен точный UID инструмента.

Результат открытой позиции имеет явный знак: плюс при положительном, минус при отрицательном, без знака при нуле. Цвет дополняет знак. Иные отображаемые активы используют компактные плитки в адаптивной сетке без логотипа и с подписью результата. Отсутствующие показатели скрываются, а не подменяются нулём или заглушкой.

Рядом с вкладкой «Позиции» на странице отдельного счёта есть вкладка «Концентрация»: она показывает, где сконцентрированы деньги — крупнейшие бумаги, секторы и эмитенты. В режиме «Все счета» её нет.

Существует расхождение: согласованная спецификация представления позиций требует доступности всех иных типов в отдельной секции, а текущие frontend и его проверка исключают CURRENCY только из списка карточек. Такие позиции остаются в ответе, но не входят в итоговую сумму, структуру; их учёт в знаменателе долей остальных позиций требует проверки. Выбор между изменением интерфейса и согласованием требований остаётся отдельной задачей.

Свежесть и границы

При первом запросе экран показывает каркас заголовка, сводки и разделов. Каркас итоговой карточки не обещает наличие суммы. Загрузка обозначена для вспомогательных технологий; декоративные элементы не содержат данных и не получают фокус. При обычном фоновом обновлении сохраняются предыдущие суммы и время успешного получения в UTC.

Серверный isStale обозначает возраст снимка старше часа: обновлением владеет часовой обход, а не запрос экрана. Он показывается рядом с суммами вместе с временем последнего успешного результата и исходом последней часовой попытки. Неудачная попытка клиента обновить уже показанный ответ о себе не сообщает: эти состояния независимы, но пользователю видимо только состояние источника. Успешное автоматическое перечитывание обновляет суммы и время; обозначение устаревания определяется новым isStale. Правила времени и ошибок приведены в потоке загрузки.

Отдельного чтения истории стоимости нет, но каждый полный снимок сохраняет точку оценки по счёту в RUB для будущих поддерживаемых представлений; публичного графика в текущем решении нет. Нет также учёта виртуальных позиций или заблокированных средств. Последний полный снимок сохраняется после перезапуска; обновлением личных данных владеет часовой обход, рассчитанный на один экземпляр backend. Действие «Обновить» выполняет только локальное перечитывание открытого экрана и не запускает работу с T-Bank.

Для проверки конкретной суммы используйте руководство по расхождениям. Проверяемое поведение отдельного счёта описано в спецификации портфеля; точную форму HTTP-ответа задаёт OpenAPI backend.