## 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** система сообщает об ошибке получения результата, не утверждая, что подходящих акций нет