Andrey Epifancev 93ee8b2352 feat(#195): модалка сопоставления в режиме пар сразу сужена до участника пары
Решение владельца после показа на стенде: «Указать» во «Встречных записях»
открывает список из одного участника пары; «Показать все организации» —
обычный список. Чистая pairCandidateRows + vitest, спека и design.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 22:58:50 +04:00

9.2 KiB
Raw Blame History

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 показан режим «Встречные записи» с первой парой; кнопка «Назад» браузера не проходит по переключениям режимов