From 683e12c52ffaff128b97d1098002f94363e130f6 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Wed, 11 Nov 2026 20:10:55 +0400 Subject: [PATCH] =?UTF-8?q?chore(formulas):=20=D0=BD=D0=BE=D0=BC=D0=B5?= =?UTF-8?q?=D1=80=20=D0=BC=D0=B8=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20006?= =?UTF-8?q?0=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20rebase=20=D0=BD=D0=B0=20te?= =?UTF-8?q?st=20(AURORA-1896)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- ARCHITECTURE.md | 2 +- .../versions/{0059_cell_formula.py => 0060_cell_formula.py} | 6 +++--- .../sql/{0059_cell_formula.sql => 0060_cell_formula.sql} | 0 api/tests/integration/test_cell_formula_sql.py | 2 +- openspec/changes/aurora-1896-cell-formulas/design.md | 1 + 5 files changed, 6 insertions(+), 5 deletions(-) rename api/alembic/versions/{0059_cell_formula.py => 0060_cell_formula.py} (61%) rename api/alembic/versions/sql/{0059_cell_formula.sql => 0060_cell_formula.sql} (100%) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index f4bf145..8385739 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -4,7 +4,7 @@ Поток редактирования ячейки: `RealtimeTable` → WebSocket `/api/v1/ws/form/{id}/sheet/{sheet}` (`cell_edit_start` — блокировка, `cell_updated`) → `SheetService` → `v3.upd_form_cell(s)`. Функция проверяет роль и окно этапа и пишет аудит `v3.log_event`, после чего изменение рассылается остальным подключённым. Ответ `upd_form_cells` (HTTP и `cell_updated`) — полные строки (`data` как в GET листа, с явными `null`): изменённые INPUT и все их предки-агрегаты, в том числе неизменившиеся; при `sections` ключи исключённых разделов убираются. Выборку делает `v3._form_affected_rows` (миграции 0050, 0051). Для FORM_1 и FORM_2 она не собирает лист целиком: построители (`v_form1_view`/`v_form2_view` → `*_sheet_jsonb` → `*_sheet_sections`) вызываются с фокусом `p_focus_lines` (NULL — весь лист, `'{}'` — ничего) и считают только изменённые строки и узлы их путей. `sort_order` в обоих режимах берётся из скелета листа (`_sort_rank`), поэтому совпадает с GET. FORM_4 до AURORA-1846 собирается полностью. Фоновая дельта АХР после правки сателлита (`get_form2_ahr_satellite_delta`) идёт тем же путём. -Триггеры. В схеме `v3` есть первые триггеры (миграция 0059, AURORA-1896): `AFTER DELETE FOR EACH ROW` на `budget_line`, `rent_detail`, `utility_detail`, `security_detail`, `fixed_asset_report`, `rf_project_report_line` (функции `v3.cell_formula_cleanup_<таблица>()`) удаляют формулы ячеек `v3.cell_formula` удалённой строки. Это поведение не видно из тел функций удаления (`del_budget_line`, `del_form3_line`, `sync_form2_ahr_satellite_line` и др.); формулы формы и отчёта проекта при удалении самой формы или отчёта уходят каскадом по FK. +Триггеры. В схеме `v3` есть первые триггеры (миграция 0060, AURORA-1896): `AFTER DELETE FOR EACH ROW` на `budget_line`, `rent_detail`, `utility_detail`, `security_detail`, `fixed_asset_report`, `rf_project_report_line` (функции `v3.cell_formula_cleanup_<таблица>()`) удаляют формулы ячеек `v3.cell_formula` удалённой строки. Это поведение не видно из тел функций удаления (`del_budget_line`, `del_form3_line`, `sync_form2_ahr_satellite_line` и др.); формулы формы и отчёта проекта при удалении самой формы или отчёта уходят каскадом по FK. ## Модули diff --git a/api/alembic/versions/0059_cell_formula.py b/api/alembic/versions/0060_cell_formula.py similarity index 61% rename from api/alembic/versions/0059_cell_formula.py rename to api/alembic/versions/0060_cell_formula.py index 5bb8695..e6bacab 100644 --- a/api/alembic/versions/0059_cell_formula.py +++ b/api/alembic/versions/0060_cell_formula.py @@ -1,14 +1,14 @@ from sql_migration import run_sql_file_migration -revision = "0059" -down_revision = "0058" +revision = "0060" +down_revision = "0059" branch_labels = None depends_on = None def upgrade() -> None: - run_sql_file_migration("0059_cell_formula.sql") + run_sql_file_migration("0060_cell_formula.sql") def downgrade() -> None: diff --git a/api/alembic/versions/sql/0059_cell_formula.sql b/api/alembic/versions/sql/0060_cell_formula.sql similarity index 100% rename from api/alembic/versions/sql/0059_cell_formula.sql rename to api/alembic/versions/sql/0060_cell_formula.sql diff --git a/api/tests/integration/test_cell_formula_sql.py b/api/tests/integration/test_cell_formula_sql.py index fd24c7e..08d01da 100644 --- a/api/tests/integration/test_cell_formula_sql.py +++ b/api/tests/integration/test_cell_formula_sql.py @@ -1,4 +1,4 @@ -"""SQL-слой формул ячеек (миграция 0059, AURORA-1896): set_cell_formulas, v_cell_formulas, триггеры, каскады.""" +"""SQL-слой формул ячеек (миграция 0060, AURORA-1896): set_cell_formulas, v_cell_formulas, триггеры, каскады.""" import json import pytest diff --git a/openspec/changes/aurora-1896-cell-formulas/design.md b/openspec/changes/aurora-1896-cell-formulas/design.md index 58b5bd8..bba3599 100644 --- a/openspec/changes/aurora-1896-cell-formulas/design.md +++ b/openspec/changes/aurora-1896-cell-formulas/design.md @@ -184,3 +184,4 @@ AHR_LIMIT (`limit_template.id`) построчно не удаляется — | 16 | 2026-11-11 | Пачка minor-правок Task 1–4 (коммит 0e2aafe) без отдельного scoped re-review — её проверит финальное ревью ветки (R-6); миграция 0059 правилась на месте (проверка NaN) | Диф — тесты и одно условие SQL, тесты зелёные | Регрессия обнаружится на шаг позже | | 17 | 2026-11-11 | Клиент API формул — методы `FormsSheetApi.getFormulas` и `ProjectsApi.getReportFormulas`, а не отдельные функции `getSheetFormulas`/`getProjectReportFormulas` (R-7); правки minor T6.1/T6.2 переданы исполнителю Task 7 (R-8) | Соответствие шаблону модулей `web/src/api` | Нет | | 18 | 2026-11-11 | Task 7: стор формул вынесен в чистый `utils/formulaStore.js` (подписка по ключу ячейки, токены против устаревших ответов, повтор WS-событий поверх GET); загрузка карты при каждой смене `isConnected` (один лишний GET при открытии); `fx` слева-снизу; проверка «выражение без =» не действует на текстовые колонки; удалены `clearLegacyFormulaKeys`, `resolveEditorState`, пропсы `tableId/cellId`; `options` проброшен и через `RealtimeTable.jsx` | Тестируемость и отсутствие перерисовки всей таблицы; согласуется с D7 | Низкая: визуальные детали и один лишний запрос; в браузере не проверено | +| 19 | 2026-11-11 | Миграция переименована в `0060_cell_formula` (`down_revision = "0059"`), ветка перебазирована на `origin/test` f047031, где уже есть `0059_form4_standalone_project` (R-9; D9 исполнен) | Номер 0059 занят слитым PR | Нет |