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>
В v3.svod2_lines counterparty/reference/deadline/comment берутся как COALESCE(detail, summary).
Оракулы (Python, JS, векторы) отбрасывают null при слиянии, legacy_full() снова читает
ответ без параметров. Тесты: пустое поле detail, отсутствие строки detail, перекрытие непустым detail.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Контрольный тест тяжёлых GET (AURORA-1848) требовал одну ссылку на BaseListResponse;
режим страниц добавляет второй вариант ответа.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Конфликт perf/analysis/api_split.py: взят measure() из test (wire_bytes, AURORA-1848),
в него перенесена обработка нечислового result (facets возвращает объект, строк нет).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Конфликты Svod2Page.jsx: сохранены окно страниц, заглушки и фасеты PR; добавлены
factor/formatHeaderUnit (AURORA-1899/1900). Измерение высоты строки по offsetHeight
заменено фиксированной высотой 2.75rem (AURORA-1836): px считается из rem без чтения layout,
заглушки получают высоту в rem.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Конфликты summary.py, summary_repository.py, summary_service.py,
test_summary2_related_records_sql.py: сохранены новые методы страниц и фасетов,
режим без параметров идёт по быстрому JSON-пути test (AURORA-1848).
Миграция переименована в 0057 (down_revision 0056); в svod2_lines добавлена
поправка 0050 (СПОД аренды, только ГО). Эталон svod2_legacy_golden перезаписан
под ответ без null-полей; legacy_full оракулов строится прямым вызовом функции.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
R-4 (решение пользователя 08.11). В миграцию 0056 добавлен v3.add_budget_line:
тело = 0051_form2_ahr_satellite_new_line + только created_by = current_user_id() в
двух INSERT (обычная строка и заготовка записи сателлита). Авто-зеркальные строки
sync (_ensure_form2_ahr_*_sync_line) остаются с NULL. Backfill не делается.
del_budget_line: NULL-автор -> удаляет только ADMIN (комментарий в SQL + тесты).
xfail-тест владельца снят; добавлены тесты NULL-автора (исполнитель 403, ADMIN 200).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Конфликты (EditCell.jsx, RealtimeTable.jsx, formulaUtils.test.js):
- EditCell: сохранены правки 1891 (editorInitialInput, Esc/Tab/Enter,
возврат фокуса) и 1892 (warnIfNegativeNotAllowed); поверх них
повторена логика 1895: формула из localStorage подставляется только
если совпадает с текущим значением, иначе stale и удаляется.
- Сохранённая формула не подставляется, если редактор открыт набором
символа (getEditorInitialInput) и не затирает набранный текст при
изменении value другим пользователем (разрешение один раз при открытии).
- Tab/Enter помечают следующую ячейку (openNextEditableCell) только после
фактического закрытия редактора: при невычисляемой формуле он остаётся
открытым и не оставляет висящую цель перехода.
- formulaUtils.js: единственный isSameCellValue из test (с нормализацией
разделителей); дубль из ветки удалён.
- formulaUtils.test.js: тесты обеих сторон.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Конфликты Svod2Page.jsx: сохранены виртуализация колонок и CSS-классы PR,
добавлены factor/formatHeaderUnit/meta.money (AURORA-1899/1900) и фиксированная
высота строки 2.75rem (AURORA-1836). Высота строки и overflow перенесены в
SVOD2_TABLE_CONTAINER_SX (статичное CSS-правило вместо sx на ячейку).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Конфликт SummaryTable.jsx: взята структура test (getDisplayFactor, meta.money,
formatHeaderUnit), formatSummaryAmount переведён с делителя на множитель и
подключён в новый scaleColumns; тест summaryFormat обновлён.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>