ADR 021 фиксирует решение о тихом чтении и видимом состоянии источника; ui-resilience и затронутые domains приведены к AS-IS.
58 lines
6.7 KiB
Markdown
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).
|
|
Это точки продолжения расследования; смысл вычислений изложен выше.
|
|
|
|
Разбор завершён, когда различие объяснено составом, временем или определением
|
|
показателя либо получен воспроизводимый пример дефекта с ожидаемым и
|
|
фактическим результатом. В последнем случае сохраните минимальный синтетический
|
|
пример и адрес ответственного слоя. Ошибки источника и неизвестные значения
|
|
не исправляются подстановкой нулей или обходом проверки доступа.
|