AURORA-1835: свод 1 и сводные проектов: форматтер чисел создаётся один раз #217

Open
aep wants to merge 1 commits from feat/210-aurora-1835-svod1-formatter into test
Owner

Closes #210

Jira: AURORA-1835

Что сделано

  • Новый чистый модуль web/src/pages/SvodPage/summaryFormat.js: formatSummaryAmount(value, divisor) с модульным Intl.NumberFormat('ru-RU', { maximumFractionDigits: 2 }); для нечисловых значений возвращает null.
  • SummaryTable.jsx: Cell в scaleColumns использует formatSummaryAmount вместо new Intl.NumberFormat на каждую ячейку. Ветки originalCell и '—' остались в Cell. Вывод не меняется. Закрывает свод 1 и /projects/summaries.
  • Дубли форматтеров в Svod2Page/SvodPage/ProjectSummariesPage не трогались (рядом hunk AURORA-1836).

Тесты

  • web/src/pages/SvodPage/summaryFormat.test.js (node --test): 0 -> '-', 1234.567 -> '1 234,57', делители 1000 и 1e6, нечисловое -> null, Intl.NumberFormat создаётся один раз. 3 passed, 0 failed.
  • npm run build проходит. biome по новым файлам чистый; в SummaryTable.jsx biome ругается на порядок импортов и форматирование, это было до правки, не трогал. Бэк не менялся, pytest не запускался.

Проверить руками

  • Свод 1 (MAIN, FORM_1...4): числа и прочерки как до правки.
  • /projects/summaries: то же.
  • Смена единиц (руб./тыс./млн) пересчитывает числа.

Замер до/после

Будет добавлен после ночного прогона на стенде perf/. Сценарий: scroll.spec.ts, PERF_TARGETS='svod/svod1_MAIN,svod/svod1_FORM_1,svod/projects_summaries', метрика main_thread_ms_per_step (база: MAIN 138,6, FORM_1 133,4, сводные 93,2; критерий MAIN <= 110, не блокирует PR).

Rulings I made

нет

🤖 Generated with Claude Code

Closes #210 Jira: AURORA-1835 ## Что сделано - Новый чистый модуль web/src/pages/SvodPage/summaryFormat.js: formatSummaryAmount(value, divisor) с модульным Intl.NumberFormat('ru-RU', { maximumFractionDigits: 2 }); для нечисловых значений возвращает null. - SummaryTable.jsx: Cell в scaleColumns использует formatSummaryAmount вместо new Intl.NumberFormat на каждую ячейку. Ветки originalCell и '—' остались в Cell. Вывод не меняется. Закрывает свод 1 и /projects/summaries. - Дубли форматтеров в Svod2Page/SvodPage/ProjectSummariesPage не трогались (рядом hunk AURORA-1836). ## Тесты - web/src/pages/SvodPage/summaryFormat.test.js (node --test): 0 -> '-', 1234.567 -> '1 234,57', делители 1000 и 1e6, нечисловое -> null, Intl.NumberFormat создаётся один раз. 3 passed, 0 failed. - npm run build проходит. biome по новым файлам чистый; в SummaryTable.jsx biome ругается на порядок импортов и форматирование, это было до правки, не трогал. Бэк не менялся, pytest не запускался. ## Проверить руками - [ ] Свод 1 (MAIN, FORM_1...4): числа и прочерки как до правки. - [ ] /projects/summaries: то же. - [ ] Смена единиц (руб./тыс./млн) пересчитывает числа. ## Замер до/после Будет добавлен после ночного прогона на стенде perf/. Сценарий: scroll.spec.ts, PERF_TARGETS='svod/svod1_MAIN,svod/svod1_FORM_1,svod/projects_summaries', метрика main_thread_ms_per_step (база: MAIN 138,6, FORM_1 133,4, сводные 93,2; критерий MAIN <= 110, не блокирует PR). ## Rulings I made нет 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 1 commit 2026-10-28 17:09:39 +03:00
AURORA-1835: Cell в scaleColumns создавал Intl.NumberFormat на каждую ячейку.
Форматирование вынесено в formatSummaryAmount (summaryFormat.js) с модульным форматтером.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Author
Owner

Ночной замер на стенде perf/ (29.10, масштаб 1, D0 без grow, CPU 1x, arm-ka-* остановлены; машина та же Apple M4)

Сборки: «до» — test 2a28748; «после» — этот PR 2cb9006. Данные и API одни (БД perf, 0049).
Команда: PERF_TARGETS='svod/svod1_MAIN,svod/svod1_FORM_1,svod/projects_summaries' PERF_ROLES=dfip PERF_REPEATS=3 PERF_TRACE=0 npx playwright test scenarios/scroll.spec.ts --grep-invert filter + aggregate; профиль — hotspots.spec.ts PERF_HOT_MODE=cpu на prod-сборке с source maps (:8082) → cpuprofile_top.py.

main_thread_ms_per_step, медиана [min–max], 3 повтора до после Δ
свод 1 MAIN 139.5 [139.1–140.5] 105.7 [105.7–105.8] −24 %
свод 1 FORM_1 133.9 [132.9–134.2] 102.5 [101.6–102.8] −23 %
сводные проектов 93.9 [93.7–94.7] 79.5 [79.5–79.6] −15 %

CPU-профиль svod1_MAIN (доля self time): Cell — SummaryTable.jsx:69 23,0 % → в профиле «после» Cell — SummaryTable.jsx:70 0,1–0,7 %; конструктора Intl.NumberFormat в топе нет ни до, ни после (в «до» он был внутри Cell). Сводные проектов: Cell 14,3 % → нет в топе. Главные теперь: emotion-serialize 12 %, get offsetHeight 11 % (measureElement, SummaryTable.jsx:14 — закрывает AURORA-1836).

Вердикт по критерию Jira: MAIN ≤ 110 мс — выполнен (105.7); «Intl.NumberFormat / Cell отсутствует в топе» — выполнен.

Скриншоты (1600×900): до — .../scratchpad/night/base/shots/base-svod1-1600-{top,y0,y1}.png, base-summaries-1600.png; после — .../scratchpad/night/1835/shots/p1835-svod1-1600-*.png, p1835-summaries-1600.png (попиксельная сверка — в итоговом комментарии). Полный путь каталога: /private/tmp/claude-501/-Users-andrey-epifancev-projects-fomichev-claude/6fa9c75e-eb11-4e5d-98c1-05eb590ab14f/scratchpad/night/. Профили: night/base/hot/cpuprofile-top.md, night/1835/hot/cpuprofile-top.md.

🤖 Generated with Claude Code

## Ночной замер на стенде perf/ (29.10, масштаб 1, D0 без grow, CPU 1x, arm-ka-* остановлены; машина та же Apple M4) **Сборки:** «до» — `test` 2a28748; «после» — этот PR 2cb9006. Данные и API одни (БД `perf`, 0049). **Команда:** `PERF_TARGETS='svod/svod1_MAIN,svod/svod1_FORM_1,svod/projects_summaries' PERF_ROLES=dfip PERF_REPEATS=3 PERF_TRACE=0 npx playwright test scenarios/scroll.spec.ts --grep-invert filter` + `aggregate`; профиль — `hotspots.spec.ts PERF_HOT_MODE=cpu` на prod-сборке с source maps (:8082) → `cpuprofile_top.py`. | main_thread_ms_per_step, медиана [min–max], 3 повтора | до | после | Δ | |---|---|---|---| | свод 1 MAIN | 139.5 [139.1–140.5] | **105.7** [105.7–105.8] | −24 % | | свод 1 FORM_1 | 133.9 [132.9–134.2] | 102.5 [101.6–102.8] | −23 % | | сводные проектов | 93.9 [93.7–94.7] | 79.5 [79.5–79.6] | −15 % | CPU-профиль svod1_MAIN (доля self time): `Cell — SummaryTable.jsx:69` 23,0 % → в профиле «после» `Cell — SummaryTable.jsx:70` 0,1–0,7 %; конструктора `Intl.NumberFormat` в топе нет ни до, ни после (в «до» он был внутри `Cell`). Сводные проектов: `Cell` 14,3 % → нет в топе. Главные теперь: emotion-serialize 12 %, `get offsetHeight` 11 % (measureElement, `SummaryTable.jsx:14` — закрывает AURORA-1836). **Вердикт по критерию Jira:** MAIN ≤ 110 мс — **выполнен** (105.7); «Intl.NumberFormat / Cell отсутствует в топе» — **выполнен**. Скриншоты (1600×900): до — `.../scratchpad/night/base/shots/base-svod1-1600-{top,y0,y1}.png`, `base-summaries-1600.png`; после — `.../scratchpad/night/1835/shots/p1835-svod1-1600-*.png`, `p1835-summaries-1600.png` (попиксельная сверка — в итоговом комментарии). Полный путь каталога: `/private/tmp/claude-501/-Users-andrey-epifancev-projects-fomichev-claude/6fa9c75e-eb11-4e5d-98c1-05eb590ab14f/scratchpad/night/`. Профили: `night/base/hot/cpuprofile-top.md`, `night/1835/hot/cpuprofile-top.md`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
This pull request can be merged automatically.
You are not authorized to merge this pull request.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/210-aurora-1835-svod1-formatter:feat/210-aurora-1835-svod1-formatter
git checkout feat/210-aurora-1835-svod1-formatter
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/DFiP_Budget_planing#217
No description provided.