Andrey Epifancev 91fdc6c0f2 docs(openspec): change intercompany-matrix-ui — экран шахматки (ревью #158)
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>
2026-10-21 14:06:40 +04:00

9.2 KiB
Raw Blame History

Context

Экран «Шахматка» [31-01] добавлен в arm-core/web PR #158 (ветка feat/chessTable) как вторая вкладка страницы отчёта по версии. Страница layouts/ConsolidatedOsvPage.tsx разделена: общую шапку и вкладки держит layouts/ConsolidatioReportPage.tsx, содержимое вкладок — widgets/ConsolidatedOsvContent (прежняя сводная ОСВ без изменений поведения) и widgets/ConsolidatedChessContent. Бэкенд шахматки — change 2026-10-16-intercompany-matrix; расчёт — чистая функция версии, ничего не хранится.

Decisions (как устроено в ветке)

  • D-1. Маршрут :tab. OsvTabs берёт активную вкладку из useParams().tab (по умолчанию osv) и по выбору заменяет последний сегмент адреса. Страница выбирает содержимое по таблице tab → компонент; неизвестный tab даёт пустое содержимое.
  • D-2. Ключ версии. Страница отчёта разделена на обёртку с key={version_id} и содержимое: при смене версии карточка, фильтры и данные создаются заново (как было в ConsolidatedOsvPage).
  • D-3. Режим all / manual выводится из выбора счетов: manual только при непустых Дт и Кт (иначе бэкенд ответит 422), в остальных случаях all. Один и тот же признак выбирает маршрут экспорта.
  • D-4. Единицы, знаки и фильтр компаний — на клиенте. Запрос повторяется только при смене выбора счетов или версии.
  • D-5. План счетов — GET /directories/accounts целиком, деревья Дт и Кт строятся на клиенте по parent_id.
  • D-6. apiFetchBlob(path, init) принимает RequestInit, чтобы выгружать POST-ом с телом; без init поведение прежнее.
  • D-7. Полноэкранный режим — Fullscreen API на контейнере блока шахматки, состояние следует за fullscreenchange.

Known issues

Открытые проблемы ветки, которые исправляет автор PR; спека их НЕ закрепляет как требования.

  1. Глобальный CSS (App.css, ConsolidatedChessTable.css, TreeFilterDropdown.css) с !important на классах antd — влияет на все таблицы и деревья приложения; стили должны быть локальными (CSS-модули или className экрана).
  2. В полноэкранном режиме выпадающие списки фильтров (Компании, Дт, Кт, Единицы, Знаки) не видны: popup рендерится в body, вне полноэкранного элемента; нужен getPopupContainer на контейнер шахматки.
  3. Суммы форматируются через number / parseFloat / toFixed (float в денежном домене), без разделителей тысяч и без «руб.»; utils/money.ts работает со строками — использовать его. Деление на единицы делать над десятичной строкой.
  4. Строка «Итого» суммирует расхождения (variance_amount), а в макете 31-01 в итогах — верхние числа (суммы стороны A); итоги нужны по каждой из трёх величин либо по макету. Знак (…) разбирается эвристикой parseAmount, хотя API отдаёт десятичные строки.
  5. Подписи дочерних счетов в выборе Дт/Кт — UUID: Select получает options только корневых узлов, выбранные дочерние ключи выводятся как идентификаторы; нужны подписи «код - название» для любых узлов.
  6. Выбор счетов только с одной стороны молча даёт режим all: пользователь видит выбранный счёт, но данные по всем счетам; нужны подсказка/блокировка либо явное поведение.
  7. Гонка ответов: loadData не отменяет и не отбрасывает устаревшие ответы (последний пришедший побеждает, не последний запрошенный); нужен AbortController или счётчик запросов. Эффект зависит от loadData/notification не по правилам хуков.
  8. Нет результирующей таблицы ВГО (GET …/intercompany-matrix/result-table), пресетов выбора счетов и выбора года/квартала (заглушки disabled в панели фильтров), экран макета 31-01 реализован не полностью.
  9. Прочее по ревью: any в таблице и дереве, console.log в обработчике полноэкранного режима, ошибки не ApiError молча глотаются (loadData, download), экспорт не передаёт единицы/знаки/компании, пустой Select для года/квартала, опечатки в именах (ConsolidatioReportPage, consodilation, expoerLoading).

После исправления дефектов требования соответствующих разделов спеки уточняются отдельным change.

Decisions made without discussion

  • 2026-10-21 (а). Спеку пишет ревьюер в ветке автора — по решению владельца (разрешено явно); альтернатива — оставить автору. Цена ошибки: автор может не согласиться с формулировками; правится одним коммитом в этом же change.
  • 2026-10-21 (б). Спека описывает фактическое поведение, дефекты вынесены в «Known issues». Обоснование: спека — единственный источник истины при рулингах, а закреплять баги требованиями нельзя; иначе их закрытие превратится в «нарушение спеки». Цена ошибки: отдельные требования (например, режим all при выборе одной стороны, «Итого» из расхождений) описаны как есть и после исправления потребуют MODIFIED.
  • 2026-10-21 (в). При восстановлении затёртого фронта (коммит 175343b) из origin/main взяты целиком все файлы без шахматочных изменений, а в App.tsx, layouts/index.ts, api/client.ts (параметр init), OsvTabs.tsx, ConsolidatedOsvContent.tsx оставлены изменения шахматки. Возвращён key={version_id} (разделением страницы на обёртку и содержимое — поведение как в main). Обоснование: изменения PR в этих файлах относятся к шахматке; цена ошибки — незамеченная откатившаяся правка main в этих пяти файлах (построчно сверено с origin/main, расхождений кроме шахматочных нет).
  • 2026-10-21 (г). Механические правки biome без смены поведения (коммит e19291c): тип IntercompanyMatrixResponse у let res, Number.isNaN, key у span в OsvTabs, ?? null вместо пустого фрагмента. Предупреждения eslint (8 новых в коде шахматки: any, deps хуков, console) не исправлялись — они входят в Known issues. Цена ошибки: key на span внутри Tooltip безвреден, но избыточен.
  • 2026-10-21 (д). Дельта к consolidated-osv-ui не делается: вкладки описаны в новой спеке, текст consolidated-osv-ui не правился, чтобы не смешивать UI-половины. Цена ошибки: при архивации две спеки частично описывают один компонент (OsvTabs).