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>
9.2 KiB
9.2 KiB
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; спека их НЕ закрепляет как требования.
- Глобальный CSS (
App.css,ConsolidatedChessTable.css,TreeFilterDropdown.css) с!importantна классах antd — влияет на все таблицы и деревья приложения; стили должны быть локальными (CSS-модули илиclassNameэкрана). - В полноэкранном режиме выпадающие списки фильтров (Компании, Дт, Кт, Единицы, Знаки) не видны: popup рендерится в
body, вне полноэкранного элемента; нуженgetPopupContainerна контейнер шахматки. - Суммы форматируются через
number/parseFloat/toFixed(float в денежном домене), без разделителей тысяч и без «руб.»;utils/money.tsработает со строками — использовать его. Деление на единицы делать над десятичной строкой. - Строка «Итого» суммирует расхождения (
variance_amount), а в макете 31-01 в итогах — верхние числа (суммы стороны A); итоги нужны по каждой из трёх величин либо по макету. Знак(…)разбирается эвристикойparseAmount, хотя API отдаёт десятичные строки. - Подписи дочерних счетов в выборе Дт/Кт — UUID:
Selectполучаетoptionsтолько корневых узлов, выбранные дочерние ключи выводятся как идентификаторы; нужны подписи «код - название» для любых узлов. - Выбор счетов только с одной стороны молча даёт режим
all: пользователь видит выбранный счёт, но данные по всем счетам; нужны подсказка/блокировка либо явное поведение. - Гонка ответов:
loadDataне отменяет и не отбрасывает устаревшие ответы (последний пришедший побеждает, не последний запрошенный); нуженAbortControllerили счётчик запросов. Эффект зависит отloadData/notificationне по правилам хуков. - Нет результирующей таблицы ВГО (
GET …/intercompany-matrix/result-table), пресетов выбора счетов и выбора года/квартала (заглушкиdisabledв панели фильтров), экран макета 31-01 реализован не полностью. - Прочее по ревью:
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).