Возврат тестирования 10.11: в выгрузке формы 2 не было цветных заливок.
XlsxDepthSheetWriter._set_palette искал цвет только по пути ключей дерева
колонок (section_code, god.….q2), а FORM2_COLORS ключуется путём данных
(header.section_code, booking.y2026.q2) — совпадений 0 из 162. Теперь, если
по пути дерева цвета нет, он берётся по плоскому ключу данных колонки.
Форма 1 не меняется (её цвета находятся по пути дерева, как раньше).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Возврат тестирования 11.11:
- tableColumns считал множитель по MRT column, у которого нет accessorKey, —
getMoneyUnit видел пустой ключ и считал денежной любую колонку (НДС, курс,
сумма в валюте, площадь масштабировались). getMoneyUnit теперь берёт
column.columnDef ?? column.
- текстовые колонки (комментарии, обоснования, реквизиты договоров, коды)
попадали в правило «иначе thousand»: «123» в комментарии делилось, а при
«млн»/«млрд» редактор обоснования закрывался как денежный. Добавлен
isTextColumn: такие колонки не масштабируются и не форматируются как числа
(внутренний заказ 10123 и комментарий «123» показываются как есть).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
«Удалить строку» на строке программы (GROUP) или проекта (ITEM) ничего не
делала: у этих строк нет line_id, окно подтверждения не открывалось, а
события program_deleted / project_deleted, которые сервер уже поддерживает,
фронт не отправлял.
- getDeleteTarget: по выделенной строке выбирает программу, проект или
строку бюджета; для непустых программы/проекта сразу показывает причину.
- RealtimeContext: deleteProgram / deleteProject и обработка ответов.
- useRealtimeData: строка убирается из дерева, пересчёт ROOT/GROUP из
ответа сопоставляется по section_code / program_id / project_id
(alignNodeRows), а не по sort_order — сервер нумерует строки заново, и у
листа без строк бюджета нет ROOT (найдено при проверке на стенде).
- Окно подтверждения называет удаляемую программу/проект.
- getWsErrorMessage срезает префикс "<class 'asyncpg...'>: " — иначе отказ
сервера (программа с проектами у устаревшего клиента) показывался с ним.
Refs #303
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
0053 пересоздала v3.get_form2_ahr_satellite_delta по телу из 0031 с
сопоставлением лимитного шаблона «ei.depth = 3 AND (item_id OR
num_group_id)» и откатила правку 0037. Лимиты с кодом num_group_id статьи
глубины 4 (принтеры / МФУ / копиры) не попадали в target_lines, дельта
была пустой, и открытый АХР не обновлял сумму до перезагрузки.
Миграция 0058 пересоздаёт функцию с матчером 0037
((depth = 3 AND item_id = code) OR num_group_id = code); остальное тело —
как в 0053.
Тест-защита 0037 ждал в дельте INPUT-строку, которую AURORA-1887 скрыл на
листе AHR, — теперь проверяет заголовок SUB_SUB_ITEM статьи глубины 4.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Возврат тестирования 06.11, критерий «любое отрицательное число выделено
цветом»: NOT_EDITABLE_INPUT_STYLES (AURORA-1890) разворачивался после цвета
текста и перекрашивал минус в серый #5F6B7A — в расчётных колонках вне
перечня отрицательные значения оставались серыми. Цвет текста теперь
решает resolveCellTextColor (utils/cellTextColor.js, с тестами): минус —
красный всегда, серый — только для неотрицательных значений.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Доработка по возврату тестирования 06.11:
- у агрегатных строк (ROOT/GROUP/ITEM/SUB_ITEM) нет data.id, ключ ошибки был
«правило:колонка:null» — все агрегаты одной колонки схлопывались в одну
запись. Ключ строки теперь getValidationRowKey: line id или sort:<sort_order>;
- переход к ошибке ищет строку по тому же ключу (раньше для агрегата
прерывался, выделение оставалось на предыдущей ячейке);
- прокрутка: вместо scrollToIndex(rowIndex + 5, 'auto') — центрирование и
scrollIntoView самой ячейки после отрисовки (у последних строк запас +5
обрезался, шапка внутри контейнера не учитывалась — ячейка оставалась ниже
видимой области);
- названия колонок в плашке и в тосте EditCell — с подставленными годом и
единицами (formatHeaderPaths, как в TableHead);
- рамка активной ячейки дублируется псевдоэлементом ::after: inset-тень td
перекрывалась красной рамкой ошибочной ячейки.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
После AURORA-1848 GET листа вырезает null-поля, поэтому у заголовка статьи
без плана в квартале ключа plan.qN нет вовсе, и чтение «до» падало
KeyError до проверки самой логики. Заменено на plan.get("qN") or 0.
Продуктовый код не меняется: с правкой все 7 тестов зелёные на test
(после PR #295).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
JIT добавлял ~1,4 с к вызову с буквальными параметрами (стенд масштаба 1: 1500 мс против 43 мс).
Тест: функции svod2 имеют jit=off. Убран тест формы плана: функция с SET не разворачивается.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>