Files
docs/domains/portfolio/how-to/investigate-discrepancy.md
T
codex-bot e8e3ef6285
Docs security / security (push) Successful in 8s
Docs verify / verify (push) Successful in 13s
docs: describe quiet reading and visible source state (#51)
ADR 021 фиксирует решение о тихом чтении и видимом состоянии источника; ui-resilience и затронутые domains приведены к AS-IS.
2026-10-17 22:11:49 +03:00

58 lines
6.7 KiB
Markdown

# Разобрать расхождение суммы портфеля
Используйте этот порядок, когда итог, позиция или доля на экране отличаются
от ожидаемого значения. Он помогает определить слой расхождения без изменения
данных. Нужны адрес экрана и уже доступный ответ API либо синтетический пример
из существующей проверки. Реальные токены, персональные выгрузки и содержимое
базы для разбора не нужны; не переносите их в документацию или отчёт.
1. **Определите предмет сравнения.** Запишите, открыт отдельный счёт или
«Все счета», какая валюта и какой показатель расходятся. Текущая стоимость,
свободные деньги, результат открытой позиции и полученный доход — разные
величины. Убедитесь, что сравниваемые значения относятся к одному составу
счетов и инструменту. Название или тикер сами по себе не доказывают
совпадение выпуска; используйте доступные UID, FIGI и ISIN.
2. **Сопоставьте время.** Проверьте `lastSuccessfulAt`, `isStale` и показанный
исход последней часовой попытки. Серверный снимок не обещает время
каждой котировки, а общий портфель может соединять разные моменты.
Действия «Повторить» на экране нет: временный сбой чтения восстанавливается
автоматически, поэтому расхождение проверяйте по показанному состоянию
источника, а не по результату ручного обновления. Перезагрузка backend
сохраняет последний полный снимок в SQLite, но не создаёт историю стоимости.
3. **Проверьте состав суммы.** Для одной валюты итог складывается из
вычислимых стоимостей позиций и доступных денег. Не добавляйте деньги
второй раз, не складывайте валюты и не включайте заблокированные средства.
Ненулевая позиция с `currentValue: null` делает оценку неполной, но не
даёт нулевой вклад в смысле полной стоимости. `CURRENCY` участвует
в суммах, хотя текущий интерфейс скрывает её карточку —
[известное расхождение со спецификацией](../overview.md#как-читать-экран).
4. **Проверьте показатель по его определению.** Используйте
[справочник](../data-reference.md#состав-и-денежные-показатели).
Условный пример: 2 бумаги по 100 RUB и 50 RUB свободных денег дают
250 RUB стоимости. Доля позиции среди позиций равна 100%, а доля
соответствующей категории в структуре с деньгами — 80%.
Купоны и дивиденды не включаются в результат открытой позиции.
Для проверки десятичных сумм сохраняйте исходные строки;
арифметика с плавающей точкой может сама создать расхождение.
5. **Найдите ответственную границу.** Если ответ API корректен, а экран
теряет цифры, валюту или показатель, исследуйте frontend.
Если исходные безопасные данные и нормализованный ответ расходятся,
исследуйте backend. Если не совпадают ожидаемое и описанное поведение,
сначала сопоставьте [спецификацию портфеля](https://git.personal.ksv741.ru/WealthLedger/specs/src/commit/9e227a563dda67620f0ad78228aa8a4c18bf35a0/openspec/specs/portfolio-view/spec.md)
и ограничения [потока загрузки](../flows/portfolio-loading.md).
Исправление документации само по себе не разрешает конфликт требований
и реализации.
Для адресной проверки исходников владельцами служат
[сервис снимков](https://git.personal.ksv741.ru/WealthLedger/backend/src/commit/016782657acfd35ff3fd755462007938fac35156/src/modules/investments/portfolio/application/portfolio.service.ts),
[валютные итоги](https://git.personal.ksv741.ru/WealthLedger/backend/src/commit/016782657acfd35ff3fd755462007938fac35156/src/modules/investments/portfolio/infrastructure/tbank-portfolio.mapper.ts),
[структура](https://git.personal.ksv741.ru/WealthLedger/backend/src/commit/016782657acfd35ff3fd755462007938fac35156/src/modules/investments/portfolio/domain/portfolio-structure.ts) и
[подготовка экрана](https://git.personal.ksv741.ru/WealthLedger/frontend/src/commit/9f7e342333b80bfacfd5bc394a2dcd0613d33ff3/src/pages/account/ui/AccountPage.vm.ts).
Это точки продолжения расследования; смысл вычислений изложен выше.
Разбор завершён, когда различие объяснено составом, временем или определением
показателя либо получен воспроизводимый пример дефекта с ожидаемым и
фактическим результатом. В последнем случае сохраните минимальный синтетический
пример и адрес ответственного слоя. Ошибки источника и неизвестные значения
не исправляются подстановкой нулей или обходом проверки доступа.