Conventional commits / commits (pull_request) Successful in 14s
Docs security / security (pull_request) Successful in 8s
Docs verify / verify (pull_request) Successful in 13s
Docs security / security (push) Successful in 8s
Docs verify / verify (push) Successful in 12s
Document local data ownership, coverage and freshness, refresh behavior, failure recovery and additive migration rollback. Record ADR 017.
57 lines
6.6 KiB
Markdown
57 lines
6.6 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).
|
|
Это точки продолжения расследования; смысл вычислений изложен выше.
|
|
|
|
Разбор завершён, когда различие объяснено составом, временем или определением
|
|
показателя либо получен воспроизводимый пример дефекта с ожидаемым и
|
|
фактическим результатом. В последнем случае сохраните минимальный синтетический
|
|
пример и адрес ответственного слоя. Ошибки источника и неизвестные значения
|
|
не исправляются подстановкой нулей или обходом проверки доступа.
|