Решение владельца после показа на стенде: «Указать» во «Встречных записях» открывает список из одного участника пары; «Показать все организации» — обычный список. Чистая pairCandidateRows + vitest, спека и design.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
9.2 KiB
ADDED Requirements
Requirement: Баннер строк без ИНН
Пока в сводке unmapped_total > 0, над таблицей свода SHALL показываться баннер (стиль osv-mapping-alert макета [30]):
заголовок «Есть организации без ИНН и без сопоставления», текст «Осталось: N. Несопоставленные учитываются как внешние;
при необходимости укажите организацию кнопкой «Указать».» и кнопка «Показать ЮЛ без ИНН» / «Показать все строки»
(фильтр unmapped, как прежде). Баннер MUST NOT требовать сопоставить все строки для перехода к следующему шагу:
переход не блокируется (решение заказчика 16.10.2026, AURORA-1388). При unmapped_total = 0 баннера нет.
Scenario: Есть строки без ИНН
- WHEN открыт свод версии РБ 2024 Q3 до сопоставления (
unmapped_total= 1260) - THEN баннер «Есть организации без ИНН и без сопоставления», «Осталось: 1260. Несопоставленные учитываются как внешние…»; слов «Для перехода к следующему шагу сопоставьте все» на экране нет
Requirement: Режим «Встречные записи»
Над сводом на вкладке «ОСВ» SHALL быть переключатель режимов «Свод | Встречные записи (N)», N — число пар
summary.counter_pairs. Режим — параметр адреса ?view=pairs (без параметра — «Свод»); переключение режима MUST NOT
добавлять запись в историю браузера. Шапка свода (единицы, знаки после запятой) действует в обоих режимах.
В режиме «Встречные записи» экран SHALL показывать сверху список пар, под ним на всю ширину две таблицы одна под другой:
- сверху — список пар одной строкой «таблеток» с переносом, в порядке ответа, строка пары «Б ← А» (имена
missing_nameиholder_name) с числамиholder_rowsиmissing_unmapped_rows; выбранная пара подсвечена; при входе выбрана первая пара либо пара из адреса (?view=pairs&holder=<id>&missing=<id>); - первая таблица — «У <А> есть записи с <Б>»: строки
GET …/osv?legal_entity_id=А&counterparty_id=Б— счёт, контрагент, обороты Дт/Кт, сальдо на конец Дт/Кт; - вторая таблица — «У <Б> — строки без ИНН и без сопоставления»: строки
GET …/osv?legal_entity_id=Б&unmapped=true— счёт, контрагент, обороты Дт/Кт, сальдо на конец Дт/Кт и «Указать» в каждой строке; над таблицей — поиск по контрагенту (q, ≤ 500 символов, как фильтр свода); постранично, как таблица свода. Все четыре колонки сумм MUST быть видны без горизонтальной прокрутки при ширине окна 1440 px (на узком окне допустима прокрутка таблицы). Еслиmissing_rows_total = 0— вместо таблицы текст «У <Б> в своде нет строк: ОСВ не привязаны или по ним пробелы»; если строки у Б есть, а без ИНН и без сопоставления нет (missing_unmapped_rows = 0) — текст «Строк без ИНН нет: возможно, ИНН контрагента из файла не найден в справочнике или это пропуск в учёте».
Обе таблицы и список пар MUST оставаться внутри белой карточки экрана: тело режима прокручивается по вертикали внутри карточки, а не выходит за её границу.
Пока сводки нет, вместо тела режима показывается индикатор загрузки, а подпись переключателя — «Встречные записи» без «(N)». Если запрос сводки не удался, показывается ошибка с кнопкой «Повторить», повторяющей запрос.
«Указать» SHALL открывать модалку сопоставления из требования «Ручное сопоставление контрагента» с теми же ответами и
ошибками, но список кандидатов сразу сужен до участника пары А: одна строка под заголовком «Участник пары» с «Связать»
(кандидаты запрашиваются с scope=group и q = имя А), поле поиска и «Искать во всём справочнике» скрыты; флажок
«Показать все организации» возвращает обычный список модалки (решение владельца 27.10.2026). Если А среди кандидатов не
нашёлся — текст «Участник пары не найден среди кандидатов — включите «Показать все организации»». В обычном своде
«Указать» не меняется. После «Связать» экран SHALL перечитывать сводку и обе таблицы. Если выбранная пара исчезла из списка, выбирается
первая оставшаяся; пустой список — текст «Все участники периметра видят друг друга» (переключатель — «Встречные записи (0)»).
Scenario: Пара Русского бисквита
- WHEN открыт свод версии РБ 2024 Q3 до сопоставления и выбран режим «Встречные записи»
- THEN переключатель «Встречные записи (1)»; сверху пара «Русский бисквит ← Пекарня Счастливочная»; в первой таблице строки Счастливочной с контрагентом «Русский бисквит»; во второй таблице строки РБ без ИНН, среди них «Пекарня Счастливочная ООО» с «Указать»
Scenario: Сопоставление из режима закрывает пару
- WHEN во второй таблице у «Пекарня Счастливочная ООО» нажато «Указать» и выбрана ООО «Пекарня Счастливочная»
- THEN после «Связать» список пар пуст, показан текст «Все участники периметра видят друг друга», переключатель — «Встречные записи (0)»
Scenario: Модалка сопоставления сужена до участника пары
- WHEN в паре «Русский бисквит ← Пекарня Счастливочная» во второй таблице нажато «Указать»
- THEN в модалке одна строка — ООО «Пекарня Счастливочная» под заголовком «Участник пары» с «Связать»; после «Показать все организации» — поиск и обычный список кандидатов
Scenario: Сводка ещё не получена
- WHEN открыт режим «Встречные записи», запрос сводки в пути
- THEN показан индикатор загрузки, подпись переключателя — «Встречные записи» без числа
Scenario: Ошибка запроса сводки
- WHEN запрос сводки в режиме «Встречные записи» завершился ошибкой
- THEN показан Alert с текстом ошибки и кнопкой «Повторить»; нажатие повторяет запрос
Scenario: Режим из адреса
- WHEN открыт адрес
…/versions/{id}/osv?view=pairs - THEN показан режим «Встречные записи» с первой парой; кнопка «Назад» браузера не проходит по переключениям режимов