Добавление шахматки #158

Merged
aep merged 24 commits from feat/chessTable into main 2026-10-23 09:41:48 +03:00
Owner
  • Добавлена таблица шахматка, вместе с фильтрами, экспортом и открытие таблицы на весь экран
  • Обновлена логика переключения вида отчетности
- Добавлена таблица шахматка, вместе с фильтрами, экспортом и открытие таблицы на весь экран - Обновлена логика переключения вида отчетности
grog added 3 commits 2026-10-21 10:56:02 +03:00
grog requested review from aep 2026-10-21 10:56:02 +03:00
grog requested review from maxim 2026-10-21 10:56:03 +03:00
aep added 3 commits 2026-10-21 13:07:02 +03:00
Коммит 7891430 откатил синхронизацию фронта (5bec434, #139/#140) и форматирование Prettier (#137).
Из origin/main восстановлены файлы, не относящиеся к шахматке:
- index.tsx (тема antd: Layout.fontSize, Form.labelFontSize/labelColor);
- layouts/DocumentPage.tsx (переключатель документа, комментарий к документу);
- services/api: consolidations.ts (getChecklist), documents.ts (postComment), files.ts (removeFile),
  directories/catalogue_jur.ts; types/consolidations/version_members.ts (ChecklistBackendShape);
- widgets: ConsoleLegalEntities (ChecklistModal, checklist_utils), FilesDrawer (DeleteModal, ReplaceDocModal,
  documentRows), DocumentReview (CommentModal, StatementReview, reviewCounters, reviewView),
  CatalogueJurForm, CatalogueJurTable, CompanyGroupsList;
- hooks/useVirtualList.tsx и components/TableTag/presets.tsx (форматирование Prettier).

В файлах шахматки оставлены её изменения: App.tsx, layouts/index.ts, api/client.ts (init в apiFetchBlob), OsvTabs.tsx,
ConsolidatedOsvContent.tsx. Из main возвращён key={version_id}: страница отчёта разделена на обёртку с key и
содержимое, чтобы при смене версии состояние (карточка, фильтры, страница) создавалось заново, как в ConsolidatedOsvPage.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- npm run format (eslint --fix, biome check --write, prettier --write) по файлам шахматки;
- biome: import type и сортировка импортов; явный тип IntercompanyMatrixResponse у `let res`
  (ConsolidatedChessContent); Number.isNaN вместо isNaN (ConsolidationChessTable); key у span в OsvTabs;
  `?? null` вместо пустого фрагмента (ConsolidatioReportPage). Поведение не менялось.

Остаются предупреждения eslint в коде шахматки (any, deps хуков, console) — за автором.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
proposal, design (Known issues — открытые дефекты ветки за автором; Decisions made without discussion), tasks и спека
intercompany-matrix-ui: вкладки по маршруту :tab, таблица ЮЛ x ЮЛ, фильтры компаний и счетов Дт/Кт, режимы all/manual,
единицы и знаки, экспорт XLSX, полноэкранный режим. Описано фактическое поведение ветки; дефекты в требования не вошли.

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

Добрый день! Спасибо за шахматку: фильтры, экспорт и переключение вкладок через адрес сделаны аккуратно, API бэка используется правильно.

Что сделано в ветке со стороны ревью (перед продолжением работы — git pull):

  • 175343b — возвращена синхронизация фронта #139/#140, которую затёр первый коммит ветки: удаление и замена файла в панели файлов ЮЛ, модалка чек-листа, кнопка «Добавить комментарий» и переключатель «Документ» на экране проверки, счётчики «Изменённых значений / требующих проверки» над ББ/ОФР, настройки темы в index.tsx, форматирование Prettier в useVirtualList, presets, catalogue_jur, CatalogueJur*, CompanyGroupsList. Шахматочные изменения сохранены; key={version_id} (сброс фильтров при смене версии) возвращён на ConsolidatioReportPage.
  • e19291c — npm run format и ошибки biome (import type, сортировка импортов, тип у let res, Number.isNaN, key в OsvTabs, пустой фрагмент). Сейчас зелёные: biome (0 ошибок), prettier, tsc, vitest (342 теста), сборка.
  • 91fdc6c — OpenSpec change openspec/changes/intercompany-matrix-ui/: спека экрана шахматки по текущему поведению; то, что ниже в «Обязательно», записано там в Known issues. После исправлений поправьте, пожалуйста, соответствующие требования спеки (режим при одной выбранной стороне, «Итого»).

Теперь git diff origin/main --stat показывает только шахматку.

Обязательно

  1. Глобальные стили. ConsolidatedChessTable.css, App.css и TreeFilterDropdown.css переопределяют с !important классы самого antd (.ant-table-cell-fix, .ant-table-summary, .ant-select-selection-item, .ant-tree-switcher-noop). CSS в сборке общий на всё приложение, поэтому закреплённые колонки сводной ОСВ, ОСВ документа и матрицы прав станут серыми, а выбранные значения во всех мультиселектах — зелёными. Повесьте правила на свой класс-обёртку (например, .chess-table …) или задайте через rootClassName / ConfigProvider. App.css лучше оставить пустым.

  2. Полноэкранный режим. Полный экран включается на div, а выпадающие списки antd по умолчанию рендерятся в document.body — в полноэкранном режиме браузер их не покажет, фильтры «Компании», «Дт», «Кт», «Единицы», «Знаки» открываться не будут. Помогает getPopupContainer={() => containerRef.current} у Select (или ConfigProvider getPopupContainer вокруг блока). Проверьте, пожалуйста, руками.

  3. Суммы. Сейчас суммы считаются через parseFloat, деление и toFixed, итог складывается во float, разделителей тысяч нет. По соглашениям проекта деньги на фронте считаем без float: в utils/money.ts есть sumAmounts (точная сумма) и formatAmount («1 234 567,89»). Масштаб (тыс./млн/млрд) можно делать сдвигом запятой в строке. И добавьте, пожалуйста, вариант «руб.» — ОСВ у нас в рублях.

  4. Строка «Итого». Сейчас она суммирует расхождения, а в макете 31-01 итог колонки — сумма верхних чисел ячеек (у ЭПТ 780,65 = 101,04 + 15,82 + 38,37 + 475,59 + 149,83). Уточните, пожалуйста, у аналитика и приведите к макету.

  5. Подписи выбранных счетов. В options у «Дт» и «Кт» попадают только корневые счета; если отметить дочерний (например, 60.01), в теге будет UUID. Нужно разворачивать всё дерево в options с подписью по коду счёта.

  6. Выбрана только одна сторона. Если выбран только Дт или только Кт, запрос и экспорт молча уходят в режим «все счета», а пользователь думает, что фильтр работает. Лучше не перезапрашивать, пока не выбраны обе стороны, и показать подсказку.

  7. Гонка запросов. При быстрой смене фильтров ответ на старый запрос может прийти позже нового и перезаписать таблицу. Нужен флаг actual в эффекте или AbortController.

Желательно

  • eslint: в коде шахматки 8 новых предупреждений (no-explicit-any ×4, exhaustive-deps ×3, no-console ×1) — убрать any ((row as any)[company.id], Record<string, any> в buildTree), поправить зависимости эффектов, убрать console.log в обработчике полного экрана.
  • Удалить мёртвые ветки row.isTotal в колонках (итог рисуется через summary) и разбор скобок в parseAmount (бэк отдаёт -123.45).
  • Ячейку оформить по макету: расхождение в скобках, нули — «—». Если skipped_osv_entry_count > 0 — значок с подсказкой, что часть строк ОСВ без счёта не вошла в суммы; процент расхождения можно вынести в tooltip.
  • «Год» и «Квартал» сейчас пустые и заблокированные — лучше показать год и квартал версии только для чтения или убрать.
  • Запасное имя экспорта — с расширением и периодом, например Шахматка_<ГК>_<год>_<квартал>.xlsx, как exportFilename у сводной ОСВ.
  • Неизвестную вкладку в адресе перенаправлять на osv.
  • Имена и места файлов: services/consodilation/chess.ts → services/api/intercompanyMatrix.ts, ConsolidatioReportPage → ConsolidationReportPage, типы шахматки и AccountOut — в types/api.ts к остальным DTO; JSON-тело экспорта — через withJsonBody клиента (он сам ставит Content-Type).
  • Проверить поиск в дереве счетов: не теряются ли отмеченные счета вне результата поиска.
  • Коммиты — на русском и со ссылкой на задачу. «Результирующую таблицу» под матрицей (ручка result-table на бэке уже есть) и пресеты из PR #141 можно сделать следующим шагом.

Спасибо!

Добрый день! Спасибо за шахматку: фильтры, экспорт и переключение вкладок через адрес сделаны аккуратно, API бэка используется правильно. **Что сделано в ветке со стороны ревью** (перед продолжением работы — `git pull`): - `175343b` — возвращена синхронизация фронта #139/#140, которую затёр первый коммит ветки: удаление и замена файла в панели файлов ЮЛ, модалка чек-листа, кнопка «Добавить комментарий» и переключатель «Документ» на экране проверки, счётчики «Изменённых значений / требующих проверки» над ББ/ОФР, настройки темы в `index.tsx`, форматирование Prettier в `useVirtualList`, `presets`, `catalogue_jur`, `CatalogueJur*`, `CompanyGroupsList`. Шахматочные изменения сохранены; `key={version_id}` (сброс фильтров при смене версии) возвращён на `ConsolidatioReportPage`. - `e19291c` — `npm run format` и ошибки biome (`import type`, сортировка импортов, тип у `let res`, `Number.isNaN`, `key` в `OsvTabs`, пустой фрагмент). Сейчас зелёные: biome (0 ошибок), prettier, tsc, vitest (342 теста), сборка. - `91fdc6c` — OpenSpec change `openspec/changes/intercompany-matrix-ui/`: спека экрана шахматки по текущему поведению; то, что ниже в «Обязательно», записано там в Known issues. После исправлений поправьте, пожалуйста, соответствующие требования спеки (режим при одной выбранной стороне, «Итого»). Теперь `git diff origin/main --stat` показывает только шахматку. **Обязательно** 1. **Глобальные стили.** `ConsolidatedChessTable.css`, `App.css` и `TreeFilterDropdown.css` переопределяют с `!important` классы самого antd (`.ant-table-cell-fix`, `.ant-table-summary`, `.ant-select-selection-item`, `.ant-tree-switcher-noop`). CSS в сборке общий на всё приложение, поэтому закреплённые колонки сводной ОСВ, ОСВ документа и матрицы прав станут серыми, а выбранные значения во всех мультиселектах — зелёными. Повесьте правила на свой класс-обёртку (например, `.chess-table …`) или задайте через `rootClassName` / `ConfigProvider`. `App.css` лучше оставить пустым. 2. **Полноэкранный режим.** Полный экран включается на div, а выпадающие списки antd по умолчанию рендерятся в `document.body` — в полноэкранном режиме браузер их не покажет, фильтры «Компании», «Дт», «Кт», «Единицы», «Знаки» открываться не будут. Помогает `getPopupContainer={() => containerRef.current}` у Select (или `ConfigProvider getPopupContainer` вокруг блока). Проверьте, пожалуйста, руками. 3. **Суммы.** Сейчас суммы считаются через `parseFloat`, деление и `toFixed`, итог складывается во float, разделителей тысяч нет. По соглашениям проекта деньги на фронте считаем без float: в `utils/money.ts` есть `sumAmounts` (точная сумма) и `formatAmount` («1 234 567,89»). Масштаб (тыс./млн/млрд) можно делать сдвигом запятой в строке. И добавьте, пожалуйста, вариант «руб.» — ОСВ у нас в рублях. 4. **Строка «Итого».** Сейчас она суммирует расхождения, а в макете 31-01 итог колонки — сумма верхних чисел ячеек (у ЭПТ 780,65 = 101,04 + 15,82 + 38,37 + 475,59 + 149,83). Уточните, пожалуйста, у аналитика и приведите к макету. 5. **Подписи выбранных счетов.** В `options` у «Дт» и «Кт» попадают только корневые счета; если отметить дочерний (например, 60.01), в теге будет UUID. Нужно разворачивать всё дерево в `options` с подписью по коду счёта. 6. **Выбрана только одна сторона.** Если выбран только Дт или только Кт, запрос и экспорт молча уходят в режим «все счета», а пользователь думает, что фильтр работает. Лучше не перезапрашивать, пока не выбраны обе стороны, и показать подсказку. 7. **Гонка запросов.** При быстрой смене фильтров ответ на старый запрос может прийти позже нового и перезаписать таблицу. Нужен флаг `actual` в эффекте или AbortController. **Желательно** - eslint: в коде шахматки 8 новых предупреждений (`no-explicit-any` ×4, `exhaustive-deps` ×3, `no-console` ×1) — убрать `any` (`(row as any)[company.id]`, `Record<string, any>` в `buildTree`), поправить зависимости эффектов, убрать `console.log` в обработчике полного экрана. - Удалить мёртвые ветки `row.isTotal` в колонках (итог рисуется через `summary`) и разбор скобок в `parseAmount` (бэк отдаёт `-123.45`). - Ячейку оформить по макету: расхождение в скобках, нули — «—». Если `skipped_osv_entry_count > 0` — значок с подсказкой, что часть строк ОСВ без счёта не вошла в суммы; процент расхождения можно вынести в tooltip. - «Год» и «Квартал» сейчас пустые и заблокированные — лучше показать год и квартал версии только для чтения или убрать. - Запасное имя экспорта — с расширением и периодом, например `Шахматка_<ГК>_<год>_<квартал>.xlsx`, как `exportFilename` у сводной ОСВ. - Неизвестную вкладку в адресе перенаправлять на `osv`. - Имена и места файлов: `services/consodilation/chess.ts` → `services/api/intercompanyMatrix.ts`, `ConsolidatioReportPage` → `ConsolidationReportPage`, типы шахматки и `AccountOut` — в `types/api.ts` к остальным DTO; JSON-тело экспорта — через `withJsonBody` клиента (он сам ставит `Content-Type`). - Проверить поиск в дереве счетов: не теряются ли отмеченные счета вне результата поиска. - Коммиты — на русском и со ссылкой на задачу. «Результирующую таблицу» под матрицей (ручка `result-table` на бэке уже есть) и пресеты из PR #141 можно сделать следующим шагом. Спасибо!
grog added 1 commit 2026-10-21 16:48:26 +03:00
grog added 1 commit 2026-10-22 10:07:53 +03:00
grog added 1 commit 2026-10-22 10:14:18 +03:00
grog added 1 commit 2026-10-22 10:26:47 +03:00
grog added 1 commit 2026-10-22 10:37:43 +03:00
Owner

Ревью, раунд 2 (коммиты cbeb9da…473492f)

Добрый день! Спасибо за доработку: гонка запросов закрыта, подписи дочерних счетов в Дт/Кт — по коду, поиск в дереве больше не теряет отмеченные счета, неизвестная вкладка ведёт на ОСВ, появилась результирующая таблица с выгрузкой. Изменения фронта из main ветка больше не затирает.

Проверки: tsc, biome, eslint (без ошибок), vitest (342 теста) и сборка — зелёные. prettier --check красный из-за одной пустой строки в ConsolidationChessResTable.tsx:51, поэтому npm run lint падает — поможет npm run format. Перед продолжением, пожалуйста, влейте main: в ветке нет PR #159, без него выгрузка результирующей таблицы на стенде из ветки отвечает 404. Конфликтов нет.

Обязательно

  1. «Итого» шахматки (ConsolidationChessTable.tsx:95-118) складывает расхождения (variance_amount). В макете 31-01 итоги — не расхождения, но и однозначного правила макет не даёт: у ЭПТ 780,65 — сумма верхних чисел, у Архола 142,04 и Фактории 84,03 сложены оба числа ячейки, а 709,23 у ИЛС не получается ни так, ни так. Уточните, пожалуйста, у аналитика (Лысенко), что именно суммирует строка «Итого», реализуйте по его ответу и зафиксируйте правило в спеке.

  2. «Итого» результирующей таблицы (ConsolidationChessResTable.tsx:84-91, :119-141) складывает все пять статей — актив вместе с пассивом. В макете 31-01-01 итог = Дебиторская задолженность + Финансовые вложения (ЭПТ: 817,96 + 352,00 = 1 169,96; общий итог 1 296,51 + 1 829,07 = 3 125,58), так сходится по всем колонкам. В XLSX с бэка такой строки нет. Уточните, пожалуйста, у аналитика; до ответа строку лучше убрать, чтобы экран совпадал с выгрузкой.

  3. Суммы без float. Итоги считаются через Number и +=, форматтер chessTableCellFormatValue в конце тоже переводит строку в Number (:37). Для итогов — sumAmounts из utils/money.ts (точная сумма в копейках); в Intl.NumberFormat(...).format() можно передавать саму строку после сдвига запятой — он форматирует её как точное десятичное. Добавьте, пожалуйста, вариант «руб.» в «Единицы» (форматтер его уже поддерживает) и unit-тесты на форматтер: сдвиг на тыс./млн/млрд, округление, отрицательные. Сейчас -4.00 в тыс. руб. выводится как «-0,00».

  4. Снятие дочернего счёта (TreeFilterDropdown.tsx:124-145). Если отмечен «60», снять 60.01 нельзя: из выбранного удаляется только 60.01, родитель «60» остаётся, дерево снова отмечает 60.01, и на бэк уходит весь 60. Раньше брался массив, который вернул antd, и снятие работало. Поиск можно сохранить так: брать keys из onCheck для видимых узлов, а скрытые поиском ключи добавлять из прежнего выбора.

  5. Вечный индикатор загрузки (ConsolidatedChessContent.tsx:74-98). Выбраны Дт и Кт, запрос в полёте, пользователь снимает Кт: старый запрос уже неактуален и loading не сбрасывает, а новый вызов выходит до setLoading. Спиннер остаётся над старой таблицей. Достаточно setLoading(false) в ветке «выбрана одна сторона» или сброса loading в очистке эффекта.

  6. Одна выбранная сторона. Запрос теперь не уходит — спасибо. Но таблица продолжает показывать прежние данные, а «Экспорт» в этом состоянии молча выгружает режим «все счета» (:120-126). Пожалуйста, сделайте «Экспорт» неактивным, пока не выбраны обе стороны или ни одной, и покажите постоянную подсказку у фильтров вместо всплывающего уведомления: в полноэкранном режиме уведомления не видны.

  7. Глобальный стиль в App.css. .ant-select-selection-item { … !important } перекрашивает теги во всех мультиселектах приложения — в форме ЮЛ и в администрировании пользователей. Перенесите, пожалуйста, правило под класс экрана (как уже сделано с .chessTable и .filterTree), а App.css оставьте пустым. Классы .resRow и .empty-cell тоже лучше повесить под .chessTable.

  8. Спека. После правок обновите, пожалуйста, openspec/changes/intercompany-matrix-ui/: сценарий «Выбрана одна сторона», переход с неизвестной вкладки, запасное имя файла, правило «Итого». Добавьте требования к результирующей таблице (загрузка, единицы и знаки, «Итого», экспорт через GET …/result-table/export) и закройте исправленные Known issues. Спека — источник истины, без неё PR не закрыть.

Желательно

  • eslint: в шахматке осталось 6 предупреждений — any в ConsolidationChessTable.tsx:98, :149 и ConsolidationChessTableFilter.tsx:21, зависимости эффектов в ConsolidatedChessContent.tsx:173, :178, ConsolidationChessTableFilter.tsx:114.
  • Мёртвый код: isTotal, разбор скобок в parseAmount и в форматтере, проверка formatted === '—' (никогда не срабатывает), комментарий «// 4. …».
  • Ячейки по макету: расхождение в скобках, нули и пустые значения — «—» (в результирующей таблице сейчас пустая ячейка), значок с подсказкой при skipped_osv_entry_count > 0.
  • Запасное имя файла сейчас Сводная_ОСВ_….xlsx и для шахматки, и для результирующей таблицы — нужна своя функция, например Шахматка_<ГК>_<год>_<квартал>.xlsx. У двух кнопок «Экспорт» — отдельные флаги загрузки.
  • В toggleFullscreen ошибка requestFullscreen — не ApiError, сейчас она проглатывается молча.
  • «Год» и «Квартал» — пустые заглушки: показать год и квартал версии только для чтения или убрать.
  • Каталог services/consodilation → services/api/; типы шахматки — в types/api.ts; тело POST-экспорта — через withJsonBody; Account.kind: string | null.
  • Коммиты — на русском и со ссылкой на задачу.
  • Полноэкранный режим с выпадающими списками проверьте, пожалуйста, руками в браузере: по коду (ConfigProvider getPopupContainer) всё должно работать.

Спасибо!

**Ревью, раунд 2** (коммиты cbeb9da…473492f) Добрый день! Спасибо за доработку: гонка запросов закрыта, подписи дочерних счетов в Дт/Кт — по коду, поиск в дереве больше не теряет отмеченные счета, неизвестная вкладка ведёт на ОСВ, появилась результирующая таблица с выгрузкой. Изменения фронта из `main` ветка больше не затирает. Проверки: `tsc`, biome, eslint (без ошибок), `vitest` (342 теста) и сборка — зелёные. `prettier --check` красный из-за одной пустой строки в `ConsolidationChessResTable.tsx:51`, поэтому `npm run lint` падает — поможет `npm run format`. Перед продолжением, пожалуйста, влейте `main`: в ветке нет PR #159, без него выгрузка результирующей таблицы на стенде из ветки отвечает 404. Конфликтов нет. **Обязательно** 1. **«Итого» шахматки** (`ConsolidationChessTable.tsx:95-118`) складывает расхождения (`variance_amount`). В макете 31-01 итоги — не расхождения, но и однозначного правила макет не даёт: у ЭПТ 780,65 — сумма верхних чисел, у Архола 142,04 и Фактории 84,03 сложены оба числа ячейки, а 709,23 у ИЛС не получается ни так, ни так. Уточните, пожалуйста, у аналитика (Лысенко), что именно суммирует строка «Итого», реализуйте по его ответу и зафиксируйте правило в спеке. 2. **«Итого» результирующей таблицы** (`ConsolidationChessResTable.tsx:84-91`, `:119-141`) складывает все пять статей — актив вместе с пассивом. В макете 31-01-01 итог = Дебиторская задолженность + Финансовые вложения (ЭПТ: 817,96 + 352,00 = 1 169,96; общий итог 1 296,51 + 1 829,07 = 3 125,58), так сходится по всем колонкам. В XLSX с бэка такой строки нет. Уточните, пожалуйста, у аналитика; до ответа строку лучше убрать, чтобы экран совпадал с выгрузкой. 3. **Суммы без float.** Итоги считаются через `Number` и `+=`, форматтер `chessTableCellFormatValue` в конце тоже переводит строку в `Number` (`:37`). Для итогов — `sumAmounts` из `utils/money.ts` (точная сумма в копейках); в `Intl.NumberFormat(...).format()` можно передавать саму строку после сдвига запятой — он форматирует её как точное десятичное. Добавьте, пожалуйста, вариант «руб.» в «Единицы» (форматтер его уже поддерживает) и unit-тесты на форматтер: сдвиг на тыс./млн/млрд, округление, отрицательные. Сейчас `-4.00` в тыс. руб. выводится как «-0,00». 4. **Снятие дочернего счёта** (`TreeFilterDropdown.tsx:124-145`). Если отмечен «60», снять 60.01 нельзя: из выбранного удаляется только 60.01, родитель «60» остаётся, дерево снова отмечает 60.01, и на бэк уходит весь 60. Раньше брался массив, который вернул antd, и снятие работало. Поиск можно сохранить так: брать `keys` из `onCheck` для видимых узлов, а скрытые поиском ключи добавлять из прежнего выбора. 5. **Вечный индикатор загрузки** (`ConsolidatedChessContent.tsx:74-98`). Выбраны Дт и Кт, запрос в полёте, пользователь снимает Кт: старый запрос уже неактуален и `loading` не сбрасывает, а новый вызов выходит до `setLoading`. Спиннер остаётся над старой таблицей. Достаточно `setLoading(false)` в ветке «выбрана одна сторона» или сброса `loading` в очистке эффекта. 6. **Одна выбранная сторона.** Запрос теперь не уходит — спасибо. Но таблица продолжает показывать прежние данные, а «Экспорт» в этом состоянии молча выгружает режим «все счета» (`:120-126`). Пожалуйста, сделайте «Экспорт» неактивным, пока не выбраны обе стороны или ни одной, и покажите постоянную подсказку у фильтров вместо всплывающего уведомления: в полноэкранном режиме уведомления не видны. 7. **Глобальный стиль в `App.css`.** `.ant-select-selection-item { … !important }` перекрашивает теги во всех мультиселектах приложения — в форме ЮЛ и в администрировании пользователей. Перенесите, пожалуйста, правило под класс экрана (как уже сделано с `.chessTable` и `.filterTree`), а `App.css` оставьте пустым. Классы `.resRow` и `.empty-cell` тоже лучше повесить под `.chessTable`. 8. **Спека.** После правок обновите, пожалуйста, `openspec/changes/intercompany-matrix-ui/`: сценарий «Выбрана одна сторона», переход с неизвестной вкладки, запасное имя файла, правило «Итого». Добавьте требования к результирующей таблице (загрузка, единицы и знаки, «Итого», экспорт через `GET …/result-table/export`) и закройте исправленные Known issues. Спека — источник истины, без неё PR не закрыть. **Желательно** - eslint: в шахматке осталось 6 предупреждений — `any` в `ConsolidationChessTable.tsx:98`, `:149` и `ConsolidationChessTableFilter.tsx:21`, зависимости эффектов в `ConsolidatedChessContent.tsx:173`, `:178`, `ConsolidationChessTableFilter.tsx:114`. - Мёртвый код: `isTotal`, разбор скобок в `parseAmount` и в форматтере, проверка `formatted === '—'` (никогда не срабатывает), комментарий «// 4. …». - Ячейки по макету: расхождение в скобках, нули и пустые значения — «—» (в результирующей таблице сейчас пустая ячейка), значок с подсказкой при `skipped_osv_entry_count > 0`. - Запасное имя файла сейчас `Сводная_ОСВ_….xlsx` и для шахматки, и для результирующей таблицы — нужна своя функция, например `Шахматка_<ГК>_<год>_<квартал>.xlsx`. У двух кнопок «Экспорт» — отдельные флаги загрузки. - В `toggleFullscreen` ошибка `requestFullscreen` — не `ApiError`, сейчас она проглатывается молча. - «Год» и «Квартал» — пустые заглушки: показать год и квартал версии только для чтения или убрать. - Каталог `services/consodilation` → `services/api/`; типы шахматки — в `types/api.ts`; тело POST-экспорта — через `withJsonBody`; `Account.kind: string | null`. - Коммиты — на русском и со ссылкой на задачу. - Полноэкранный режим с выпадающими списками проверьте, пожалуйста, руками в браузере: по коду (`ConfigProvider getPopupContainer`) всё должно работать. Спасибо!
grog added 1 commit 2026-10-22 14:29:04 +03:00
grog added 1 commit 2026-10-22 14:36:32 +03:00
aep added 3 commits 2026-10-22 15:30:13 +03:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Сдвиг единиц, точное округление без float, большие суммы, «-0,00»,
пустые значения.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Итоги отдаёт бэкенд (AURORA-1756/1757), результирующая таблица и её выгрузка,
«руб.», точное округление, одна сторона Дт/Кт без запроса, правило отметок
дерева по полному плану счетов, отдельные флаги выгрузки, полноэкранный режим.
Known issues — по состоянию 601a125.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep added 2 commits 2026-10-22 15:42:07 +03:00
- форматтер сумм: проверка числа до сдвига запятой, Intl.StringNumericLiteral (ES2023.Intl) вместо any, без разбора скобок;
- запасные имена выгрузок xlsxFilename, отдельные флаги загрузки у двух «Экспорт»;
- useNotificationApi мемоизирован, загрузки — useCallback, зависимости эффектов полные;
- ячейки: расхождение в скобках, значок пропущенных строк ОСВ, «—» вместо выдуманного нуля;
- «Год»/«Период» версии только для чтения;
- сервис services/api/intercompanyMatrix.ts с withJsonBody, типы шахматки в types/api.ts, Account.kind.

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

Ревью, раунд 3 (ea9cb4a, 601a125)

Спиннер, снятие дочернего счёта и «руб.» теперь работают, lint зелёный.

Я кое-что докоммитил в ветку, так что сначала сделай git pull — там правки в тех же файлах, которые тебе дальше трогать:

  • влил main (там бэк выгрузки результирующей таблицы, без него на стенде 404);
  • тесты на форматтер сумм;
  • закрыл всё, что было в «желательно»: форматтер без any, имена файлов выгрузки, отдельные спиннеры у двух «Экспорт», зависимости эффектов, скобки у расхождения, значок для пропущенных строк ОСВ, год и период версии в фильтрах, перенёс сервис в services/api и типы в types/api.ts;
  • обновил спеку openspec/changes/intercompany-matrix-ui — теперь там описано, как должно работать. Что ещё не сходится с кодом, видно в design.md в Known issues, это как раз три пункта ниже.

Строку «Итого» пока оставляем как есть, потом её будет считать бэк (AURORA-1756/1757).

Что осталось поправить:

  1. Поиск в дереве счетов. Если найти что-то так, что у 60 виден только один субсчёт, и отметить его, то отметится и сам 60 — дерево считает отметки по отфильтрованному списку. В итоге на бэк уходит весь 60. Надо после onCheck пересчитывать отметки по полному дереву: родитель отмечен, только если отмечены все его субсчета.

  2. Когда выбран счёт только в Дт или только в Кт. Сейчас таблица остаётся со старыми данными, а «Экспорт» выгружает все счета. Нужно: таблицу очистить и вместо неё написать «Для расчёта по счетам выберите счета и в Дт, и в Кт», ту же подсказку показать рядом с фильтрами (только в этом случае), «Экспорт» сделать неактивным. Уведомление и подсказку внутри выпадашки убрать — в полноэкранном режиме уведомление всё равно не видно.

  3. Стили. App.css должен остаться пустым, как в main, — правило для тегов перенеси в css шахматки. С формы ЮЛ класс убери, она к этому PR не относится. На Кт класс повесь, сейчас теги у Дт и Кт разные. .resRow и .empty-cell под .chessTable. И верни className='filterTree' на Tree, без него отступ у листьев опять появился.

И в коммитах пиши номер задачи, AURORA-1538.

Ревью, раунд 3 (ea9cb4a, 601a125) Спиннер, снятие дочернего счёта и «руб.» теперь работают, lint зелёный. Я кое-что докоммитил в ветку, так что сначала сделай `git pull` — там правки в тех же файлах, которые тебе дальше трогать: - влил main (там бэк выгрузки результирующей таблицы, без него на стенде 404); - тесты на форматтер сумм; - закрыл всё, что было в «желательно»: форматтер без any, имена файлов выгрузки, отдельные спиннеры у двух «Экспорт», зависимости эффектов, скобки у расхождения, значок для пропущенных строк ОСВ, год и период версии в фильтрах, перенёс сервис в `services/api` и типы в `types/api.ts`; - обновил спеку `openspec/changes/intercompany-matrix-ui` — теперь там описано, как должно работать. Что ещё не сходится с кодом, видно в `design.md` в Known issues, это как раз три пункта ниже. Строку «Итого» пока оставляем как есть, потом её будет считать бэк (AURORA-1756/1757). Что осталось поправить: 1. Поиск в дереве счетов. Если найти что-то так, что у 60 виден только один субсчёт, и отметить его, то отметится и сам 60 — дерево считает отметки по отфильтрованному списку. В итоге на бэк уходит весь 60. Надо после `onCheck` пересчитывать отметки по полному дереву: родитель отмечен, только если отмечены все его субсчета. 2. Когда выбран счёт только в Дт или только в Кт. Сейчас таблица остаётся со старыми данными, а «Экспорт» выгружает все счета. Нужно: таблицу очистить и вместо неё написать «Для расчёта по счетам выберите счета и в Дт, и в Кт», ту же подсказку показать рядом с фильтрами (только в этом случае), «Экспорт» сделать неактивным. Уведомление и подсказку внутри выпадашки убрать — в полноэкранном режиме уведомление всё равно не видно. 3. Стили. `App.css` должен остаться пустым, как в main, — правило для тегов перенеси в css шахматки. С формы ЮЛ класс убери, она к этому PR не относится. На Кт класс повесь, сейчас теги у Дт и Кт разные. `.resRow` и `.empty-cell` под `.chessTable`. И верни `className='filterTree'` на Tree, без него отступ у листьев опять появился. И в коммитах пиши номер задачи, AURORA-1538.
grog added 1 commit 2026-10-22 17:43:56 +03:00
aep added 1 commit 2026-10-22 22:47:15 +03:00
aep added 1 commit 2026-10-23 00:37:58 +03:00
grog added 1 commit 2026-10-23 09:28:53 +03:00
grog added 1 commit 2026-10-23 09:30:30 +03:00
aep added 1 commit 2026-10-23 09:41:34 +03:00
- toggleTreeCheck (utils/treeChecks): родитель отмечен, только если отмечены все потомки, на всех уровнях; скрытые
  поиском отметки берутся из состояния выпадашки — снятые подряд отметки больше не возвращаются; тесты.
- Правило тегов из App.css → ConsolidationChessTableFilter.css (App.css пустой, как в main); класс с формы ЮЛ снят.
- Спека: Known issues — остаток (одна сторона Дт/Кт) в техдолг AURORA-1799, решение (п), tasks.

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

Ревью, раунд 4 (6b956f7, 79d4008)

Спасибо, экспорт при одной стороне теперь неактивен, родитель при поиске снимается. Остальное доделал сам в fd3bb79, чтобы слить сегодня:

  • отметки дерева вынес в utils/treeChecks.ts с тестами. Раньше снятые отметки возвращались: новые ключи объединялись с уже применённым фильтром (selectedKeys), а не с текущим состоянием выпадашки. Родитель теперь пересчитывается по полному дереву на всех уровнях;
  • правило тегов перенёс из App.css в ConsolidationChessTableFilter.css, с формы ЮЛ класс убрал.

Пустая таблица с подсказкой при одной стороне ушла в техдолг AURORA-1799. Сливаю.

Ревью, раунд 4 (6b956f7, 79d4008) Спасибо, экспорт при одной стороне теперь неактивен, родитель при поиске снимается. Остальное доделал сам в `fd3bb79`, чтобы слить сегодня: - отметки дерева вынес в `utils/treeChecks.ts` с тестами. Раньше снятые отметки возвращались: новые ключи объединялись с уже применённым фильтром (`selectedKeys`), а не с текущим состоянием выпадашки. Родитель теперь пересчитывается по полному дереву на всех уровнях; - правило тегов перенёс из `App.css` в `ConsolidationChessTableFilter.css`, с формы ЮЛ класс убрал. Пустая таблица с подсказкой при одной стороне ушла в техдолг AURORA-1799. Сливаю.
aep merged commit 664c9487d7 into main 2026-10-23 09:41:48 +03:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-core#158
No description provided.