# arm-web Specification ## Purpose Требования к экрану проверки формы ББ/ОФР во фронте `arm-core/web` (имя спеки — от прежнего репозитория arm-web, замороженного 21.10.2026) по контракту 2.0: раскладка строк со статусами (`ok` / `detail` / `unreadable` / `missing`), подсветка «требует внимания», предупреждения у места и правка кодов строк, сумм, дат колонок и шапки. ## Requirements ### Requirement: Раскладка строк формы со статусами Экран проверки формы ББ/ОФР ([41]) SHALL сохранять раскладку «как на бумаге» (Р-14): разделы, внутри — строки `ok` по возрастанию кода, несколько строк одного кода — в порядке файла (`row_index`), шаблонные строки на своих местах, пятизначные подстроки под родителем. Строка `unreadable` / `missing` SHALL стоять под ближайшей предыдущей по `row_index` строкой, размещённой по коду, а без такой — в начале первого раздела; она подсвечена целиком, в ячейке кода серым — сырой текст `line_code_text` с подсказкой. Строки `detail` SHALL быть скрыты под переключателем «Показать расшифровки (N)» и показываться под родителем (`parent_row_index`) с отступом. Экран показывает справочное имя строки (`reference_name`), файловое (`line_name`) — рядом, если отличается. Переключателя «как в файле» нет. #### Scenario: Код-мусор на своём месте - **WHEN** строка `unreadable` «ИЧ,250» в файле стоит после строки 1240 - **THEN** на экране она стоит сразу под 1240, подсвечена, в ячейке кода серым «ИЧ,250» #### Scenario: Расшифровки скрыты - **WHEN** у формы три строки `detail` - **THEN** по умолчанию их не видно, переключатель «Показать расшифровки (3)»; включённый показывает их под родителями ### Requirement: Подсветка и предупреждения у места Экран SHALL подсвечивать ячейки только по `needs_review` (в подсказке — `text` и уверенность), строки — по `needs_review` строки, поля шапки — по `needs_review_fields` (в подсказке у поля — `header.source.<поле>`: сырой текст и уверенность). Предупреждения и нарушения (`issues`, `checks`) SHALL показываться у места: у строк (`line_ids`), ячеек (`line_ids` + `column_id`), полей шапки (`field`) или у документа (в том числе запись с `column_index` без `column_id` — столбец вне колонок формы); уровень `error` отличается от `info`. Подсветки по `confidence < 100` и `is_recognized = false` напрямую нет. У значений строк `detail` `needs_review` всегда `false` (Р-23): при показанных расшифровках их сомнительные ячейки не подсвечиваются, но подсказка с `text` и уверенностью есть. #### Scenario: Догадка подтверждена проверкой - **WHEN** значение `is_recognized = false`, `needs_review = false` - **THEN** ячейка не подсвечена; в подсказке сырой текст и уверенность ### Requirement: Правка строк, колонок и подтверждение в режиме «Редактировать» В режиме «Редактировать» экран SHALL давать: у `unreadable` / `missing` — поле ввода кода с подсказкой из справочника (код → справочное имя) и пункт меню строки «Это расшифровка»; у `detail` — «Назначить код»; у строки `ok` — «Сделать расшифровкой», смену кода и «Подтвердить код» у строки с `needs_review`; подтверждение ячейки без правки; ввод даты у колонки без даты (`period_kind = none`) или с предупреждением о дате (в том числе подтверждение той же даты); снятие подтверждения ячейки и кода (`confirmed: false`); правка наименования организации в шапке; подтверждение даты отчёта из `needs_review_fields` без изменения (тем же значением). «Сохранить» отправляет один `PATCH …/statement` (`header`, `values`, `columns`, `lines`). Кнопка «Подтвердить данные» при строках `unreadable` / `missing` с суммами SHALL быть отключена с подсказкой «Разберите строки без кода: N» и переходом к первой такой строке; ответ сервера 409 `LINES_UNRESOLVED` показывается тем же текстом, 409 `DUPLICATE_FORM` — со ссылкой на подтверждённую форму, 409 `LINE_CODE_TAKEN` — у поля кода. Кнопка «Подтвердить данные» учитывает строки `unreadable` / `missing` с суммой или нераспознанным текстом в ячейках. #### Scenario: Назначить код - **WHEN** аналитик вводит 1250 в ячейку кода строки `unreadable` и сохраняет - **THEN** уходит `PATCH` с `lines: [{line_id, line_code: "1250"}]`; после ответа строка встаёт на место 1250 #### Scenario: Подтверждение заблокировано - **WHEN** у формы две строки `missing` с суммами - **THEN** «Подтвердить данные» отключена, подсказка «Разберите строки без кода: 2», клик по подсказке ведёт к первой ### Requirement: Предупреждения файла и документа в карточке файла Карточка файла (панель файлов) SHALL читать `job.warnings` как список структур `{code, severity, message, locator}` (после выкладки ядра v5.19 это не строки; у старых заданий ядро отдаёт строки, обёрнутые в `LEGACY_WARNING`), показывать `message` и `locator`, отличая `error` от `info`; предупреждения листа ОСВ и документа — из `DocumentOut.issues[]`. `job.mapping_warnings` остаётся списком строк. #### Scenario: Потерянный ОФР в карточке - **WHEN** у задания `job.warnings = [{code: "JSON_FAILED", severity: "error", message: "…", locator: "file:x_ofr.json"}]` - **THEN** карточка показывает предупреждение уровня «ошибка» с текстом и местом; экран не падает на объекте вместо строки