# 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»