proposal, дельта спеки cell-formula, design.md со сверкой дизайна Jira
с кодом test 5a91f35 и разделом решений без обсуждения.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- sql_migration._split_statements узнаёт только $tag$, пустой $$ ломал разбиение:
DO $$ … $$ → DO $do$ … $do$.
- test_form_phases_delete_removes_only_named_phase: ?sheet= без direction
фильтрует direction IS NULL — читаем весь список и отбираем AHR в тесте.
- test_form_phases_duplicate_without_direction_rejected: после ошибки
сессия клиента откатывается, число строк не проверяем; защиту БД
проверяет новый test_form_phase_nodir_unique_index_blocks_duplicate.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Интеграционные тесты одноимённых этапов, PATCH/DELETE одного этапа, дубль без направления, direction в аудите.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ORM: direction входит в PK (nullable), одноимённые этапы Support/Development больше не склеиваются
- get_list: ORDER BY sheet, direction (NULL первыми), opens_at, phase_code
- 0059: del_form_phase фильтрует по phase_code, direction в v_phase_id (add/upd/del) и в payload upd,
чистка дублей без направления и частичный уникальный индекс form_phase_nodir_uidx
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>