Andrey Epifancev f0470313c1 openspec: архив aurora-1839-cell-memo и aurora-1984-pd-standalone-projects
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 19:33:14 +04:00

7.3 KiB
Raw Blame History

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), живая проверка на стенде.