Andrey Epifancev b1c61ae769 openspec: архив aurora-1883-closed-vsp и aurora-1896-cell-formulas
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 18:49:51 +04:00

94 lines
9.8 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.

# 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` в нём нет