92 lines
9.5 KiB
Markdown
92 lines
9.5 KiB
Markdown
# 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»
|