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

92 lines
9.5 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.

# form4-programs-projects Specification
## Purpose
Программы и проекты на листах AHR/CAP/OPER формы 4 (FORM_4, «Проектная деятельность»): как они создаются, переименовываются и удаляются, где стоят в листе, как участвуют в итогах и выгрузке, как подписаны и как к проекту добавляется расход.
## Requirements
### Requirement: Проект создаётся в программе или прямо в разделе
Пользователь с правом добавлять строки в раздел листа SHALL иметь возможность создать проект как внутри программы этого раздела, так и прямо в разделе, без программы. Название SHALL быть непустым после обрезки пробелов. Права SHALL проверяться так же, как при создании программы в этом разделе.
#### Scenario: Проект в разделе
- **WHEN** на листе CAP выделена строка раздела (или ничего не выделено) и пользователь создаёт проект «П1»
- **THEN** «П1» появляется в разделе CAP без программы у всех подключённых к листу пользователей без перезагрузки
- **AND** после перезагрузки страницы «П1» стоит на том же месте
#### Scenario: Проект в программе — как раньше
- **WHEN** выделена программа «Пр» и пользователь создаёт проект
- **THEN** проект создаётся внутри «Пр»
#### Scenario: Выделен проект или расход
- **WHEN** выделен проект или строка расхода и пользователь создаёт проект
- **THEN** новый проект создаётся там же, где выделенный проект: в той же программе или прямо в разделе
#### Scenario: Пустое название
- **WHEN** пользователь вводит название из одних пробелов
- **THEN** проект не создаётся
### Requirement: Место самостоятельного проекта в листе
Самостоятельный проект SHALL выводиться строкой ITEM непосредственно под ROOT своего раздела, без строки GROUP над ним; его расходы — строками INPUT под ним. На уровне под ROOT программы и самостоятельные проекты SHALL идти в порядке создания (по id записи `form4_project`). Проекты внутри программы и их расходы SHALL выводиться как раньше.
#### Scenario: Вперемешку в порядке создания
- **WHEN** в разделе последовательно созданы программа «А», самостоятельный проект «Б», программа «В»
- **THEN** под ROOT раздела строки идут в порядке «А» (GROUP), «Б» (ITEM), «В» (GROUP)
#### Scenario: Пустой раздел
- **WHEN** в разделе нет ни одного расхода, но есть самостоятельный проект
- **THEN** проект виден в листе так же, как видна пустая программа
### Requirement: Суммы самостоятельного проекта
Суммы расходов самостоятельного проекта SHALL входить в строку ITEM проекта и в ROOT раздела ровно один раз. Лист SHALL NOT содержать строку GROUP без программы (`program_id` пустой). Ответ на правку ячейки расхода самостоятельного проекта SHALL содержать строку расхода, ITEM проекта и ROOT раздела.
#### Scenario: Итог раздела
- **WHEN** в разделе есть программа с расходом 100 и самостоятельный проект с расходом 50 в `plan.q1`
- **THEN** ROOT раздела показывает 150 в `plan.q1`, ITEM самостоятельного проекта — 50
#### Scenario: Правка расхода
- **WHEN** пользователь меняет `plan.q1` у расхода самостоятельного проекта
- **THEN** ответ содержит этот расход, ITEM проекта и ROOT раздела с пересчитанными суммами и не содержит GROUP
### Requirement: Расходы самостоятельного проекта
К самостоятельному проекту SHALL можно добавлять и удалять расходы так же, как к проекту в программе.
#### Scenario: Добавление расхода
- **WHEN** выделен самостоятельный проект и пользователь добавляет расход по статье
- **THEN** расход появляется под этим проектом, суммы проекта и раздела пересчитываются
### Requirement: Переименование программы и проекта
Пользователь с правом изменения SHALL иметь возможность переименовать выделенную программу или проект (в программе и самостоятельный). Окно переименования SHALL открываться с текущим названием. Пустое название и название из одних пробелов SHALL NOT сохраняться. При ошибке сервера окно SHALL оставаться открытым с введённым текстом и показывать понятное сообщение. Отмена SHALL оставлять прежнее название. Переименование SHALL NOT менять состав проектов, расходов и суммы.
#### Scenario: Успешное переименование
- **WHEN** пользователь переименовывает программу «А» в «А2»
- **THEN** у всех подключённых пользователей строка показывает «А2», после перезагрузки тоже
#### Scenario: Ошибка
- **WHEN** сервер отказывает в переименовании (например, нет прав)
- **THEN** окно остаётся открытым с введённым названием и показывает причину
### Requirement: Удаление самостоятельного проекта
Пустой самостоятельный проект SHALL удаляться с подтверждением, как проект в программе (AURORA-1978). Проект с расходами SHALL NOT удаляться, пользователь видит причину.
#### Scenario: Удаление пустого
- **WHEN** пользователь удаляет пустой самостоятельный проект и подтверждает
- **THEN** проект исчезает из листа у всех подключённых, ROOT раздела пересчитывается
### Requirement: Подпись типа в третьем столбце
В третьем столбце листов AHR/CAP/OPER формы 4 строка программы SHALL быть подписана «программа», строка проекта (в программе и самостоятельного) — «проект». Строки ROOT и расходов SHALL показывать код, как раньше. Подпись SHALL совпадать на экране и в выгрузке Excel.
#### Scenario: Подписи
- **WHEN** открыт лист CAP с программой, проектом в ней и самостоятельным проектом
- **THEN** напротив программы «программа», напротив обоих проектов «проект», у расходов — код статьи
### Requirement: Выбор расхода для проекта
Окно выбора расхода SHALL показывать варианты в виде «<номер статьи> — <название>», упорядоченные по номеру статьи с учётом числовых частей (например, 2 раньше 10). Поиск SHALL находить вариант по номеру и по названию. Выбор SHALL добавлять расход именно по выбранной статье.
#### Scenario: Сортировка
- **WHEN** среди статей есть номера «3.2.» и «3.10.»
- **THEN** «3.2.» стоит выше «3.10.»
#### Scenario: Поиск по номеру
- **WHEN** пользователь вводит «3.01»
- **THEN** в списке остаются статьи, номер которых содержит «3.01»