Andrey Epifancev 551066bb05 AURORA-1984: перепроверка дизайна и план реализации
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 22:14:29 +04:00

43 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Proposal
## Why
На форме 4 (FORM_4, на фронте «Проектная деятельность») иерархия листа жёсткая: раздел (лист AHR/CAP/OPER) → программа → проект → расходы. Проект без программы создать нельзя: интерфейс требует выделить программу, `v3.add_form4_project` отвергает вызов без `p_program_id`, у проекта нет своего раздела (ограничение `chk_form4_project_section_code`), а лист находит проекты только через программу. Пользователю приходится заводить программу-обёртку ради одного проекта.
Замечание тестировщика AURORA-1984 (Gitea #305): проект можно создать прямо в разделе, без программы. Человек (08.11.2026): «всё то же самое, как и сейчас, только нет уровня программы»; в разделе программы и самостоятельные проекты стоят вперемешку в порядке создания.
В той же ветке закрываются три смежных замечания по ПД: AURORA-1979 (подпись «программа»/«проект» в третьем столбце), AURORA-1980 (переименование программы и проекта), AURORA-1989 (окно выбора расхода: номер статьи, сортировка, поиск).
## What Changes
- **Самостоятельный проект.** Запись `v3.form4_project` с `level='project'`, `parent_id IS NULL`, собственными `section_code` и `form_id`. Ограничение `chk_form4_project_section_code` ослабляется: раздел обязателен у программы и у проекта без родителя, запрещён у проекта в программе.
- **Создание.** `v3.add_form4_project` принимает либо программу (как сейчас), либо форму и раздел. WS-событие `project_added` принимает `program_id` необязательно; без него проект создаётся в разделе текущего листа соединения.
- **Лист.** `v3.v_form4_sheet_jsonb` выводит самостоятельный проект строкой ITEM прямо под ROOT раздела (без GROUP), с расходами под ним. Порядок на втором уровне — по id верхнего узла (программы или самостоятельного проекта), то есть в порядке создания. Суммы проекта входят в ROOT один раз; фиктивной GROUP с `program_id = NULL` нет.
- **Правка и удаление.** `v3.upd_form4_project` и `v3.del_form4_project` работают и без родителя: раздел берётся у проекта, в ответе нет GROUP. Запрет удалять проект с расходами — прежний.
- **Фронт.** «Добавить проект»: выделена программа → внутри неё; выделена строка раздела или ничего → в разделе; выделен проект или расход → рядом, в той же программе или в разделе. Вставка нового ITEM под ROOT. Удаление (AURORA-1978) уже работает по `project_id`.
- **AURORA-1979.** В третьем столбце листов ПД у программы «программа», у проекта (в программе и самостоятельного) «проект» вместо кода раздела; так же в выгрузке Excel. Коды статей у строк расходов и ROOT не меняются.
- **AURORA-1980.** Действие «Переименовать» для выделенной программы или проекта: окно с текущим названием, события `program_updated` / `project_updated` (сервер уже поддерживает). Пустое название и пробелы не сохраняются; при ошибке окно остаётся открытым с введённым текстом.
- **AURORA-1989.** Окно выбора расхода: «номер статьи — название», сортировка по номеру статьи с учётом числовых частей (2 раньше 10), поиск по номеру и названию.
- Новая миграция `0059_form4_standalone_project` (номер — следующий после 0058 на момент ветки).
**Не меняется:**
- существующие данные: все проекты остаются в своих программах, перенос проекта в программу и из неё не делается;
- своды, листы SMETA и STRUCTURE (не читают программы и проекты);
- права: создание самостоятельного проекта проверяется так же, как у программы (`v3.can_edit` по форме и разделу), переименование и удаление — тоже как у программы (членство в форме, `_validate_form4_node_access`);
- контракт строк листа для программ и проектов в программах.
## Capabilities
### New Capabilities
- `form4-programs-projects`: программы и проекты листов AHR/CAP/OPER формы 4 — создание (в программе и в разделе), переименование, удаление, место в листе и в итогах, подпись типа в третьем столбце, выбор расхода для проекта.
### Modified Capabilities
Нет.
## Impact
- SQL: миграция `0059_*.py` + `sql/0059_*.sql`: ограничение `form4_project`, `v3.add_form4_project` (новая сигнатура — DROP/CREATE), `v3.upd_form4_project`, `v3.del_form4_project`, `v3.v_form4_sheet_jsonb` (тело — от версии 0053).
- Python: `websocket.py` (`__add_project`), `SheetService.add_project` (проверка доступа по форме без программы), `SheetRepository.add_project`, ORM `form4_project.py`; export_service — новый `Form4DepthRowNormalizer` (подпись «программа»/«проект» в третьем столбце).
- Фронт: `RealtimeTable.jsx`, `RealtimeContext.js`, `useRealtimeData.js`, `utils/cellUtils.js`, `utils/rowUtils.js`, `tableColumns.jsx`, `SettingPanel.jsx`, модалки создания/переименования, `SelectExpenseItemModal.jsx`, конфиг колонок FORM_4.
- Тесты: интеграционные (лист, итоги, создание/правка/удаление самостоятельного проекта, ответ `_form_affected_rows`), unit фронта (`node --test`), живая проверка на стенде.