94 lines
9.8 KiB
Markdown
94 lines
9.8 KiB
Markdown
# vsp-directory Specification
|
||
|
||
## Purpose
|
||
Справочник объектов ВСП (`/api/v1/dict/info`, страница «Справочник ВСП») и подпись ВСП в листах форм: какие ВСП попадают в список, выгрузку и выпадающие списки, как их фильтровать по статусу и периоду закрытия, как закрытый ВСП выглядит в справочнике и в ячейке формы.
|
||
|
||
Термины: **действующий ВСП** — запись `v3.vsp` с `is_deleted = false` и `is_active = true`; **закрытый ВСП** — `is_deleted = false` и `is_active = false` (дата закрытия наступила); **удалённый ВСП** — `is_deleted = true`.
|
||
|
||
## Requirements
|
||
|
||
### Requirement: Фильтр справочника по статусу
|
||
`GET /api/v1/dict/info` SHALL принимать query-параметр `status` со значениями `active`, `closed`, `all`; по умолчанию — `active`. `active` SHALL возвращать только действующие ВСП, `closed` — только закрытые, `all` — действующие и закрытые. Иное значение SHALL давать 422. Удалённые ВСП SHALL NOT возвращаться ни при каком значении `status`. Остальные фильтры (рег. номер, адрес, ССП, дата открытия, тип размещения, численность) и ограничение исполнителя своими ССП SHALL применяться как прежде, вместе со `status`.
|
||
|
||
#### Scenario: По умолчанию — только действующие
|
||
- **WHEN** администратор запрашивает `GET /dict/info` без `status`, а в справочнике есть действующий ВСП A и закрытый ВСП B
|
||
- **THEN** ответ содержит A и не содержит B
|
||
|
||
#### Scenario: Закрытые
|
||
- **WHEN** администратор запрашивает `GET /dict/info?status=closed`
|
||
- **THEN** ответ содержит B с `is_active = false` и не содержит A
|
||
|
||
#### Scenario: Все
|
||
- **WHEN** администратор запрашивает `GET /dict/info?status=all`
|
||
- **THEN** ответ содержит и A, и B
|
||
|
||
#### Scenario: Недопустимый статус
|
||
- **WHEN** запрос `GET /dict/info?status=bogus`
|
||
- **THEN** ответ — 422
|
||
|
||
#### Scenario: Удалённый не возвращается
|
||
- **WHEN** администратор удалил ВСП C (`DELETE /dict/info/{id}`) и запрашивает `status=active`, `closed` и `all`
|
||
- **THEN** ни один ответ не содержит C
|
||
|
||
#### Scenario: Исполнитель видит закрытые только своих ССП
|
||
- **WHEN** исполнитель, привязанный к ССП S1, запрашивает `GET /dict/info?status=closed`, а закрытые ВСП есть в S1 и в чужом S2
|
||
- **THEN** ответ содержит закрытые ВСП S1 и не содержит закрытые ВСП S2
|
||
|
||
### Requirement: Фильтр по периоду закрытия
|
||
`GET /api/v1/dict/info` SHALL принимать необязательные `close_date_start` и `close_date_end` (даты `YYYY-MM-DD`). При заданном `close_date_start` SHALL возвращаться только ВСП с датой закрытия не раньше неё, при заданном `close_date_end` — не позже неё (границы включительно). ВСП без даты закрытия SHALL NOT попадать в ответ, если задана хотя бы одна граница.
|
||
|
||
#### Scenario: ВСП закрыт в периоде
|
||
- **WHEN** ВСП B закрыт 2021-03-15 и запрос `GET /dict/info?status=closed&close_date_start=2021-01-01&close_date_end=2021-12-31`
|
||
- **THEN** ответ содержит B
|
||
|
||
#### Scenario: ВСП закрыт вне периода
|
||
- **WHEN** тот же ВСП B и запрос `?status=closed&close_date_start=2022-01-01`
|
||
- **THEN** ответ не содержит B
|
||
|
||
### Requirement: Порядок закрытых ВСП
|
||
При `status=closed` список SHALL быть отсортирован по дате закрытия по убыванию, при равной дате — по `id` по возрастанию. При `status=active` и `status=all` порядок SHALL оставаться прежним — по `id`.
|
||
|
||
#### Scenario: Свежезакрытые сверху
|
||
- **WHEN** ВСП B закрыт 2021-03-15, ВСП D закрыт 2024-06-01 и запрос `?status=closed`
|
||
- **THEN** D идёт в ответе раньше B
|
||
|
||
### Requirement: Выгрузка учитывает статус и период
|
||
`POST /api/v1/dict/info/export` SHALL принимать в теле `status` (`active` | `closed` | `all`, по умолчанию `active`), `close_date_start`, `close_date_end` и применять их так же, как `GET /dict/info`. Без этих полей выгрузка SHALL содержать только действующие ВСП, как раньше.
|
||
|
||
#### Scenario: Выгрузка закрытых
|
||
- **WHEN** администратор выгружает справочник с `status = closed`
|
||
- **THEN** файл содержит закрытый ВСП B и не содержит действующий A
|
||
|
||
### Requirement: Выпадающий список ВСП с закрытыми для подписей
|
||
`GET /api/v1/dict/info/dropdown` SHALL принимать параметр `include_inactive` (по умолчанию `false`). При `false` SHALL возвращаться только действующие ВСП, как раньше; при `true` — действующие и закрытые в тех же границах (ССП формы `form_id` или `ssp_id`, ССП исполнителя). Удалённые ВСП SHALL NOT возвращаться.
|
||
|
||
#### Scenario: Закрытый ВСП ССП формы
|
||
- **WHEN** у ССП формы F есть закрытый ВСП B и запрос `GET /dict/info/dropdown?form_id=F&include_inactive=true`
|
||
- **THEN** ответ содержит B с `is_active = false`
|
||
|
||
#### Scenario: Без параметра
|
||
- **WHEN** запрос `GET /dict/info/dropdown?form_id=F`
|
||
- **THEN** ответ не содержит B
|
||
|
||
### Requirement: Справочник ВСП показывает статус и позволяет найти закрытые
|
||
Страница «Справочник ВСП» SHALL иметь переключатель статуса «Действующие» (по умолчанию) / «Закрытые» / «Все» и, при «Закрытые» и «Все», поля периода закрытия «Закрыт с» / «по». Смена статуса или периода SHALL перезагружать список с сервера с этими параметрами. Таблица SHALL иметь колонку «Статус» с бейджем «Действует» или «Закрыт»; текст строк закрытых ВСП SHALL быть приглушённым. Выгрузка со страницы SHALL передавать текущие статус и период. Если после правки ВСП перестал подходить под выбранный статус (например, его закрыли в режиме «Действующие»), строка SHALL исчезать из списка.
|
||
|
||
#### Scenario: Найти давно закрытый ВСП
|
||
- **WHEN** администратор выбирает «Закрытые» и период «Закрыт с 01.01.2021 по 31.12.2021»
|
||
- **THEN** таблица показывает ВСП, закрытые в 2021 году, с бейджем «Закрыт»
|
||
|
||
#### Scenario: Закрыли в режиме «Действующие»
|
||
- **WHEN** в режиме «Действующие» администратор ставит ВСП дату закрытия «вчера» и сохраняет
|
||
- **THEN** строка этого ВСП пропадает из таблицы
|
||
|
||
### Requirement: Подпись ВСП в листах форм
|
||
Ячейка колонки с `editType = 'vsp_dropdown'` в листах форм SHALL показывать рег. номер ВСП, а не число: для действующего ВСП — рег. номер; для закрытого — «<рег. номер> (закрыт)»; если ВСП с таким id нет среди загруженных для формы (например, удалён) — «ВСП #<id>». Значение такой ячейки SHALL NOT форматироваться как сумма и SHALL NOT масштабироваться селектором разрядности. Для выбора ВСП в ячейке и при добавлении строки SHALL предлагаться только действующие ВСП. Поиск и фильтр по колонке ВСП SHALL находить и закрытые ВСП по рег. номеру.
|
||
|
||
#### Scenario: Строка с закрытым ВСП
|
||
- **WHEN** в листе FORM_2/AHR строка ссылается на закрытый ВСП с рег. номером `1234/567`, разрядность «тыс. руб.»
|
||
- **THEN** ячейка «ВСП РФ» показывает `1234/567 (закрыт)`
|
||
|
||
#### Scenario: Выбор ВСП
|
||
- **WHEN** пользователь открывает выбор ВСП в ячейке этой строки
|
||
- **THEN** в списке только действующие ВСП, закрытого `1234/567` в нём нет
|