spec: archive three completed changes (main#33, frontend#63, screener)
Conventional commits / commits (pull_request) Successful in 13s
Specs security / security (pull_request) Successful in 8s
Specs verify / verify (pull_request) Successful in 12s

This commit is contained in:
2026-10-14 21:40:26 +03:00
parent 0ed462d157
commit 6efb989ed9
37 changed files with 191 additions and 45 deletions
@@ -0,0 +1,76 @@
## Purpose
Определяет поиск доступных к покупке акций по характеристикам всего доступного каталога, просмотр совпавших выпусков и навигацию по результату поиска.
## ADDED Requirements
### Requirement: Скринер ищет среди доступных к покупке акций
Система SHALL по нажатию «Найти» искать по всему доступному на момент запроса каталогу акций, не ограничивая исходный набор первыми совпадениями текстового поиска. В результаты MUST включаться только акции, для которых в полученных сведениях подтверждены и доступность покупки, и возможность торговли через API. Скринер MUST показывать время получения списка и MUST NOT представлять эти признаки как гарантию, что конкретный пользователь сможет исполнить заявку прямо сейчас.
#### Scenario: Поиск без названия или тикера
- **WHEN** пользователь не ввёл текст и нажал «Найти»
- **THEN** система ищет по доступному каталогу и показывает выпуски, удовлетворяющие условиям и обоим признакам доступности
#### Scenario: Акция недоступна для покупки
- **WHEN** у акции отсутствует подтверждение доступности покупки или торговли через API
- **THEN** система не включает её в результаты скринера независимо от остальных совпавших условий
### Requirement: Условия скринера применяются совместно
Система SHALL позволять независимо задавать необязательные условия по сектору, типу акции, валюте расчётов, площадке, стране риска и максимальному количеству бумаг в лоте, а также необязательный текстовый запрос по названию или тикеру. После нажатия «Найти» система SHALL возвращать только акции, удовлетворяющие всем заданным условиям. Отсутствующее или неизвестное значение выбранного условия MUST NOT считаться совпадением.
#### Scenario: Несколько условий без текста
- **WHEN** пользователь выбрал сектор и валюту, оставил текст пустым и нажал «Найти»
- **THEN** в результате остаются только доступные к покупке акции выбранного сектора и валюты
#### Scenario: Текст совместно с характеристиками
- **WHEN** пользователь ввёл название или тикер, выбрал тип акции и нажал «Найти»
- **THEN** система отбирает совпадения по тексту и типу среди доступного каталога до разделения результата на страницы
#### Scenario: Неизвестный сектор
- **WHEN** пользователь выбрал сектор, а у акции сектор не указан
- **THEN** акция не считается совпадением
#### Scenario: Граница максимального лота
- **WHEN** задано максимальное количество бумаг в лоте
- **THEN** акции с известным размером лота не больше указанного включаются при соблюдении остальных условий, а акции с неизвестным или большим лотом исключаются
### Requirement: Результат представляет отдельные выпуски
Система SHALL показывать не более одной карточки для каждого выпуска с одинаковым ISIN; акции с разными ISIN SHALL оставаться отдельными результатами. При отсутствии ISIN отдельным результатом SHALL быть инструмент с собственным идентификатором. Представитель выпуска MUST выбираться среди инструментов, удовлетворяющих заданным условиям, а карточка MUST вести к выбранному инструменту.
#### Scenario: Несколько подходящих режимов одного выпуска
- **WHEN** несколько инструментов с одним ISIN удовлетворяют всем условиям
- **THEN** система показывает одну карточку выпуска со ссылкой на один из этих инструментов
#### Scenario: Один режим не соответствует условиям
- **WHEN** два инструмента имеют один ISIN, но только один удовлетворяет всем условиям
- **THEN** карточка выпуска ведёт к соответствующему условиям инструменту
#### Scenario: Разные выпуски одного эмитента
- **WHEN** обыкновенная и привилегированная акции имеют разные ISIN и обе удовлетворяют условиям
- **THEN** система показывает их как отдельные результаты
### Requirement: Страницы относятся к одному результату поиска
Система SHALL упорядочивать совпадения по тикеру, затем по идентификатору инструмента, и показывать не более 30 выпусков на странице. Переход между страницами одного поиска MUST сохранять состав и порядок полученного результата без пропусков и повторов. Изменение полей без нажатия «Найти» MUST NOT заменять текущий результат; повторное нажатие «Найти», в том числе без изменения условий, SHALL запускать новый поиск и возвращать к первой странице.
#### Scenario: Переход к следующей странице
- **WHEN** пользователь открывает следующую страницу полученного результата
- **THEN** он видит следующие до 30 выпусков в том же порядке и с тем же временем получения списка, без повторения выпусков предыдущей страницы
#### Scenario: Повторный поиск
- **WHEN** пользователь изменил условия или оставил их прежними и нажал «Найти» повторно
- **THEN** система получает новый результат с новым временем получения списка и показывает его первую страницу
#### Scenario: Поля изменены, но поиск не запущен
- **WHEN** пользователь изменяет условия и ещё не нажал «Найти»
- **THEN** ранее полученные страницы не подменяются результатом для новых условий
### Requirement: Отсутствие совпадений отличается от недоступности поиска
Система MUST показывать пустой результат только после успешного поиска без совпадений. Если получить сведения для поиска не удалось, система SHALL сообщать о недоступности поиска и MUST NOT выдавать отсутствие акций за подтверждённый результат.
#### Scenario: Успешный поиск без совпадений
- **WHEN** поиск завершился успешно, но ни одна акция не удовлетворяет условиям
- **THEN** система показывает, что подходящие акции не найдены
#### Scenario: Источник каталога недоступен
- **WHEN** поиск не может получить сведения о каталоге
- **THEN** система сообщает об ошибке получения результата, не утверждая, что подходящих акций нет