# Портфель по всем счетам Режим «Все счета» объединяет открытые поддерживаемые инвестиционные счета, доступные через текущее подключение T-Bank. Состав совпадает с политикой [списка счетов](../accounts/overview.md); закрытые и недоступные счета не включаются. `all` — зарезервированное обозначение общего режима, которое не передаётся брокеру как идентификатор счёта. ## Маршруты и навигация | Маршрут | Содержание | | --- | --- | | `/accounts` | Список отдельных счетов и действие открытия общего портфеля | | `/accounts/all` | Общий портфель и превью операций, дохода и будущих событий | | `/accounts/all/operations` | Общий журнал исполненных операций | | `/accounts/all/income` | Купоны и дивиденды за календарный период | | `/accounts/all/events` | Будущие события всех доступных счетов | Общий режим использует те же страницы разделов с обозначением `all`. На страницах счёта и общего режима переключатель «Счёт» сохраняет текущий раздел и применённые URL-фильтры. При переключении пагинация начинается заново. Журнал хранит применённые `from`, `to` и `categories` в URL; черновые значения применяются кнопкой. Раздел дохода сохраняет свой прежний календарный контракт. Хлебные крошки называют общий режим «Все счета». ## Данные и вычисления Backend публикует статические маршруты под `/api/v1/brokerage-accounts/all`: `/portfolio`, `/operations`, `/income-summary`, `/income-analytics`, `/events`. У них те же формы данных и фильтры, что у соответствующих разделов отдельного счёта. Позиции, операции (включая выплаты дохода) и события сохраняют источник в поле `account: { id, name }`; в ответах одного счёта это поле отсутствует. Итоги и деньги агрегированы в RUB. Точную форму транспорта задаёт [OpenAPI backend](../../architecture/http-api.md). - Портфель и доступные денежные остатки суммируются сервером точно, в RUB, с точной десятичной арифметикой. Позиции и деньги в других валютах не участвуют; правила неизвестных значений и состава сумм наследуются от [портфеля](data-reference.md). - Одинаковые бумаги разных счетов показаны одной карточкой с общим названием и идентификатором. Внутри всегда видны строки счетов: ссылка на портфель, количество, доступная стоимость, результат, средняя цена и доля позиции. Денежные показатели и количества остаются исходными для каждого счёта; общая средняя цена и суммарное количество карточки не рассчитываются. Группировка выполняется по типу инструмента и первому доступному идентификатору: UID, затем FIGI, затем ISIN. Разные выбранные идентификаторы или их отсутствие, а также одно лишь совпадение имени или тикера не объединяют позиции. Повторные строки одного счёта остаются отдельными. API сохраняет позиции каждого счёта; объединяется только их представление. Порядок карточек задаёт первое вхождение бумаги; порядок счетов внутри карточки сохраняется. Одиночные позиции используют прежнюю карточку. Доля относится к позициям во всём показанном портфеле, без денежных остатков. - Журнал объединяет операции по убыванию времени, при равном времени использует порядок идентификаторов счетов и операций. ID операций разных счетов не считаются дублями. Переводы не схлопываются. - Доходы собираются из всех страниц операций каждого счёта за выбранный период. Итоги, временные интервалы и принадлежность выплат рассчитывает сервис дохода. Данные сравнения периодов не загружаются и не возвращаются; состав счетов влияет только на фактические выплаты выбранного периода. - Будущие события сортируются по дате и сохраняют отдельную строку каждого счёта. Прогноз не включается в реализованные доходы. - [Результат инвестирования](investment-performance.md) складывает потоки и стоимость только рублёвых счетов с полной историей. Счёт с причиной недоступности исключается, сводка помечается неполной. Похожие на перевод между своими счетами операции без подтверждённой связи исключают оба счёта (`UNCONFIRMED_TRANSFER`). Если оценки оставшихся счетов сделаны в разные московские дни, сводка недоступна: стоимости разных дат не складываются. ## Полнота, свежесть и доступ Общий запрос читает membership и разрешённые snapshots из SQLite в одной согласованной границе. Время источников может различаться: это не обещание одновременного наблюдения счетов у брокера. Неполный счёт делает aggregate неполным; отсутствующие суммы не подменяются нулями. `lastSuccessfulAt` показывает самое раннее время обязательных источников. Секции портфеля, операций, дохода и событий готовы независимо. Ошибка обновления сохраняет прежний полный результат того же scope и периода. Известный отказ доступа и смена подключения очищают personal view. ## Общая пагинация операций Страница строится из локальных строк с порядком occurredAt, accountId и ID операции. Cursor проверяет пользователя, подключение, membershipRevision, фильтры, limit и ревизии операций. Изменение rowset возвращает `400 INVALID_OPERATIONS_CURSOR`; клиент сбрасывает стек страниц, сохраняя применённые фильтры. Coverage/status без изменения строк не ломают cursor. Продолжение не зависит от RAM-кэша или перезапуска. Визуальная группировка строк одного инструмента в общих списках выполняется только в пределах уже полученного списка: в журнале — на загруженной странице, без переноса группы на следующую; в полном списке будущих событий и выплатах дохода — по всем полученным строкам периода. Группировка не меняет порядок, cursor или ответ API. Протокол курсора прежний. Правила группировки — в [журнале](../operations/overview.md#группировка-в-режиме-все-счета). Повторная сверка полного показанного периода публикует все счета и интервалы одной транзакцией; успешное первое окно не смешивается с прежними остальными. Подробнее — [журнал](../operations/overview.md#получение-и-полнота). ## Совместимость и границы требований Общий режим использует те же persistent sources и envelope, что и отдельный счёт. Новый envelope несовместим с прежним bare response: backend и frontend поставляются согласованной парой по [HTTP contract](../../architecture/http-api.md). Additive migration сохраняет прежние таблицы; rollback приложения не удаляет новые данные и не заменяет рабочую базу старым backup. Возврат требует заранее проверенной совместимой пары; произвольный прежний клиент не считается совместимым. Процедура backup/restore описана в [runbook](../../architecture/deployment.md). Основные спецификации областей сохраняют исходные понятия отдельного счёта. Утверждённый change `persist-tbank-data` распространяет полноту, локальный доступ, атомарную сверку и состояния синхронизации на режим `all`.