Добавление шахматки #158
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/chessTable"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Добрый день! Спасибо за шахматку: фильтры, экспорт и переключение вкладок через адрес сделаны аккуратно, 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 changeopenspec/changes/intercompany-matrix-ui/: спека экрана шахматки по текущему поведению; то, что ниже в «Обязательно», записано там в Known issues. После исправлений поправьте, пожалуйста, соответствующие требования спеки (режим при одной выбранной стороне, «Итого»).Теперь
git diff origin/main --statпоказывает только шахматку.Обязательно
Глобальные стили.
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лучше оставить пустым.Полноэкранный режим. Полный экран включается на div, а выпадающие списки antd по умолчанию рендерятся в
document.body— в полноэкранном режиме браузер их не покажет, фильтры «Компании», «Дт», «Кт», «Единицы», «Знаки» открываться не будут. ПомогаетgetPopupContainer={() => containerRef.current}у Select (илиConfigProvider getPopupContainerвокруг блока). Проверьте, пожалуйста, руками.Суммы. Сейчас суммы считаются через
parseFloat, деление иtoFixed, итог складывается во float, разделителей тысяч нет. По соглашениям проекта деньги на фронте считаем без float: вutils/money.tsестьsumAmounts(точная сумма) иformatAmount(«1 234 567,89»). Масштаб (тыс./млн/млрд) можно делать сдвигом запятой в строке. И добавьте, пожалуйста, вариант «руб.» — ОСВ у нас в рублях.Строка «Итого». Сейчас она суммирует расхождения, а в макете 31-01 итог колонки — сумма верхних чисел ячеек (у ЭПТ 780,65 = 101,04 + 15,82 + 38,37 + 475,59 + 149,83). Уточните, пожалуйста, у аналитика и приведите к макету.
Подписи выбранных счетов. В
optionsу «Дт» и «Кт» попадают только корневые счета; если отметить дочерний (например, 60.01), в теге будет UUID. Нужно разворачивать всё дерево вoptionsс подписью по коду счёта.Выбрана только одна сторона. Если выбран только Дт или только Кт, запрос и экспорт молча уходят в режим «все счета», а пользователь думает, что фильтр работает. Лучше не перезапрашивать, пока не выбраны обе стороны, и показать подсказку.
Гонка запросов. При быстрой смене фильтров ответ на старый запрос может прийти позже нового и перезаписать таблицу. Нужен флаг
actualв эффекте или AbortController.Желательно
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 можно сделать следующим шагом.Спасибо!
Ревью, раунд 2 (коммиты cbeb9da…473492f)
Добрый день! Спасибо за доработку: гонка запросов закрыта, подписи дочерних счетов в Дт/Кт — по коду, поиск в дереве больше не теряет отмеченные счета, неизвестная вкладка ведёт на ОСВ, появилась результирующая таблица с выгрузкой. Изменения фронта из
mainветка больше не затирает.Проверки:
tsc, biome, eslint (без ошибок),vitest(342 теста) и сборка — зелёные.prettier --checkкрасный из-за одной пустой строки вConsolidationChessResTable.tsx:51, поэтомуnpm run lintпадает — поможетnpm run format. Перед продолжением, пожалуйста, влейтеmain: в ветке нет PR #159, без него выгрузка результирующей таблицы на стенде из ветки отвечает 404. Конфликтов нет.Обязательно
«Итого» шахматки (
ConsolidationChessTable.tsx:95-118) складывает расхождения (variance_amount). В макете 31-01 итоги — не расхождения, но и однозначного правила макет не даёт: у ЭПТ 780,65 — сумма верхних чисел, у Архола 142,04 и Фактории 84,03 сложены оба числа ячейки, а 709,23 у ИЛС не получается ни так, ни так. Уточните, пожалуйста, у аналитика (Лысенко), что именно суммирует строка «Итого», реализуйте по его ответу и зафиксируйте правило в спеке.«Итого» результирующей таблицы (
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 с бэка такой строки нет. Уточните, пожалуйста, у аналитика; до ответа строку лучше убрать, чтобы экран совпадал с выгрузкой.Суммы без float. Итоги считаются через
Numberи+=, форматтерchessTableCellFormatValueв конце тоже переводит строку вNumber(:37). Для итогов —sumAmountsизutils/money.ts(точная сумма в копейках); вIntl.NumberFormat(...).format()можно передавать саму строку после сдвига запятой — он форматирует её как точное десятичное. Добавьте, пожалуйста, вариант «руб.» в «Единицы» (форматтер его уже поддерживает) и unit-тесты на форматтер: сдвиг на тыс./млн/млрд, округление, отрицательные. Сейчас-4.00в тыс. руб. выводится как «-0,00».Снятие дочернего счёта (
TreeFilterDropdown.tsx:124-145). Если отмечен «60», снять 60.01 нельзя: из выбранного удаляется только 60.01, родитель «60» остаётся, дерево снова отмечает 60.01, и на бэк уходит весь 60. Раньше брался массив, который вернул antd, и снятие работало. Поиск можно сохранить так: братьkeysизonCheckдля видимых узлов, а скрытые поиском ключи добавлять из прежнего выбора.Вечный индикатор загрузки (
ConsolidatedChessContent.tsx:74-98). Выбраны Дт и Кт, запрос в полёте, пользователь снимает Кт: старый запрос уже неактуален иloadingне сбрасывает, а новый вызов выходит доsetLoading. Спиннер остаётся над старой таблицей. ДостаточноsetLoading(false)в ветке «выбрана одна сторона» или сбросаloadingв очистке эффекта.Одна выбранная сторона. Запрос теперь не уходит — спасибо. Но таблица продолжает показывать прежние данные, а «Экспорт» в этом состоянии молча выгружает режим «все счета» (
:120-126). Пожалуйста, сделайте «Экспорт» неактивным, пока не выбраны обе стороны или ни одной, и покажите постоянную подсказку у фильтров вместо всплывающего уведомления: в полноэкранном режиме уведомления не видны.Глобальный стиль в
App.css..ant-select-selection-item { … !important }перекрашивает теги во всех мультиселектах приложения — в форме ЮЛ и в администрировании пользователей. Перенесите, пожалуйста, правило под класс экрана (как уже сделано с.chessTableи.filterTree), аApp.cssоставьте пустым. Классы.resRowи.empty-cellтоже лучше повесить под.chessTable.Спека. После правок обновите, пожалуйста,
openspec/changes/intercompany-matrix-ui/: сценарий «Выбрана одна сторона», переход с неизвестной вкладки, запасное имя файла, правило «Итого». Добавьте требования к результирующей таблице (загрузка, единицы и знаки, «Итого», экспорт черезGET …/result-table/export) и закройте исправленные Known issues. Спека — источник истины, без неё PR не закрыть.Желательно
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) всё должно работать.Спасибо!
Ревью, раунд 3 (
ea9cb4a,601a125)Спиннер, снятие дочернего счёта и «руб.» теперь работают, lint зелёный.
Я кое-что докоммитил в ветку, так что сначала сделай
git pull— там правки в тех же файлах, которые тебе дальше трогать:services/apiи типы вtypes/api.ts;openspec/changes/intercompany-matrix-ui— теперь там описано, как должно работать. Что ещё не сходится с кодом, видно вdesign.mdв Known issues, это как раз три пункта ниже.Строку «Итого» пока оставляем как есть, потом её будет считать бэк (AURORA-1756/1757).
Что осталось поправить:
Поиск в дереве счетов. Если найти что-то так, что у 60 виден только один субсчёт, и отметить его, то отметится и сам 60 — дерево считает отметки по отфильтрованному списку. В итоге на бэк уходит весь 60. Надо после
onCheckпересчитывать отметки по полному дереву: родитель отмечен, только если отмечены все его субсчета.Когда выбран счёт только в Дт или только в Кт. Сейчас таблица остаётся со старыми данными, а «Экспорт» выгружает все счета. Нужно: таблицу очистить и вместо неё написать «Для расчёта по счетам выберите счета и в Дт, и в Кт», ту же подсказку показать рядом с фильтрами (только в этом случае), «Экспорт» сделать неактивным. Уведомление и подсказку внутри выпадашки убрать — в полноэкранном режиме уведомление всё равно не видно.
Стили.
App.cssдолжен остаться пустым, как в main, — правило для тегов перенеси в css шахматки. С формы ЮЛ класс убери, она к этому PR не относится. На Кт класс повесь, сейчас теги у Дт и Кт разные..resRowи.empty-cellпод.chessTable. И верниclassName='filterTree'на Tree, без него отступ у листьев опять появился.И в коммитах пиши номер задачи, AURORA-1538.
Ревью, раунд 4 (
6b956f7,79d4008)Спасибо, экспорт при одной стороне теперь неактивен, родитель при поиске снимается. Остальное доделал сам в
fd3bb79, чтобы слить сегодня:utils/treeChecks.tsс тестами. Раньше снятые отметки возвращались: новые ключи объединялись с уже применённым фильтром (selectedKeys), а не с текущим состоянием выпадашки. Родитель теперь пересчитывается по полному дереву на всех уровнях;App.cssвConsolidationChessTableFilter.css, с формы ЮЛ класс убрал.Пустая таблица с подсказкой при одной стороне ушла в техдолг AURORA-1799. Сливаю.