- RealtimeContext: стор карты формул (formulaStore), загрузка при открытии листа и
переподключении (формы и отчёты проектов), обновление на каждом cell_updated,
защита от устаревших ответов при смене листа; useCellFormula; updateCell(..., { formula })
- Cell: маркер fx только при актуальной формуле, подсказка с единицей при displayFactor != 1
- EditCell: начальный текст «=выражение», выражение уходит в data.formula, без localStorage;
ввод «100+50» без «=» не отправляется (тост «Формула начинается с =»)
- удалены resolveEditorState и clearLegacyFormulaKeys; T6.1/T6.2 в cellFormulaUtils
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
T1.1 каскад hard_delete проверяется по AHR_LIMIT; T1.2 тесты триггеров
rent/utility/security/fixed_asset_report; T1.3 NaN в set_cell_formulas
отклоняется (0059 правится на месте); T3.1 unit-кейсы asyncpg-обёртки;
T3.2 предусловие SAVEPOINT-теста и комментарий к 403; T4.1 проверка
незаписи значения при 422 отчёта проекта; T4.2 убрана мёртвая логика.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PATCH cell/cells отчёта проекта пишут формулу в той же транзакции, GET
.../report/{year}/{report_type}/formulas возвращает формулы отчёта.
Тесты: roundtrip, снятие формулы, каскад удаления проекта, триггер
rf_project_report_line (del_form3_line и прямой DELETE).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SheetService.update_cell_with_formula/update_cells пишут формулу после значения в одной
транзакции, GET /form/{id}/sheet/{sheet}/formulas. Ошибки БД с обёрткой asyncpg
"<class ...>: invalid_formula: ..." теперь корректно мапятся в 422.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
proposal, дельта спеки cell-formula, design.md со сверкой дизайна Jira
с кодом test 5a91f35 и разделом решений без обсуждения.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Возврат тестирования 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>