## MODIFIED Requirements ### Requirement: Форма ББ/ОФР — просмотр и правка Экран SHALL показывать `GET /documents/{id}/statement`: шапку (ИНН, дата отчёта, единицы — значение и исходное при правке; наименование, ОКУД/ОКПО) и таблицу «строка (код, наименование) × колонки» с суммами из `values[]`, включая строки и ячейки, достроенные сервером по справочнику редакции (`id = null`). Ячейки с `needs_review = true` SHALL подсвечиваться как «требует внимания» (подсветки напрямую по `confidence < 100` или `is_recognized = false` нет), с `is_modified = true` — как «исправлено» с исходным значением `original_amount` в подсказке; пустая достроенная ячейка не подсвечивается. Строки «БАЛАНС» формы `BALANCE` (коды 1600 и 1700) SHALL выделяться фоном `#f9f0ff` и жирным шрифтом; подсветка ячейки перекрывает фон строки. Единицы (`header.units`) SHALL выводиться над таблицей. Пока документ не `CONFIRMED`, ячейка SHALL быть редактируемой: ввод проверяется по формату суммы (до 2 знаков после точки, знак минус допустим, пустое — `null`), сохранение отправляет `PATCH /documents/{id}/statement {values: [...]}` суммой-строкой: ячейка строки из БД — `{line_id, column_id, amount}`, ячейка достроенной строки (`id = null`) — `{line_code, column_id, amount}`; ответ заменяет состояние экрана. Правка шапки (ИНН, дата отчёта, единицы, наименование организации) SHALL отправляться тем же `PATCH` в `header`; `inn: null` не отправляется. Правка строк, колонок и подтверждений в том же `PATCH` (`columns`, `lines`, `values[].confirmed`) описана в требовании «Правка строк, колонок и подтверждение в режиме «Редактировать»». #### Scenario: Исправление ячейки - **WHEN** аналитик меняет значение ячейки и сохраняет - **THEN** ячейка помечена «исправлено», проверки пересчитаны по ответу сервера, акцепт снят #### Scenario: Заполнение строки, которой не было в распознавании - **WHEN** у формы нет строки 1700 из источника, аналитик вводит сумму в достроенную строку 1700 и сохраняет - **THEN** уходит `{line_code: "1700", column_id, amount}`, по ответу строка получила `id`, ячейка помечена «исправлено» #### Scenario: Строки «БАЛАНС» - **WHEN** открыта форма `BALANCE` - **THEN** строки 1600 и 1700 выделены цветом и жирным, у ОФР выделения нет #### Scenario: Неверный формат суммы - **WHEN** аналитик вводит «12,3,4» - **THEN** запрос не отправляется, поле показывает ошибку формата ### Requirement: Подтверждение документа Кнопка «Подтвердить» SHALL отправлять `POST /documents/{id}/confirm` и быть недоступна для `CONFIRMED` и `ERROR`, а также при наличии строк `unreadable` / `missing` с суммой или нераспознанным текстом в ячейках (подсказка «Разберите строки без кода: N» с переходом к первой такой строке). При 409 `CHECKS_NOT_PASSED` экран SHALL показать `detail.failures[]` и предложить акцепт; при 409 `PERIOD_REQUIRED` — подсказать исправить дату отчёта; при 409 `LINES_UNRESOLVED` — показать тот же текст, что у отключённой кнопки; при 409 `DUPLICATE_FORM` — со ссылкой на подтверждённую форму; прочие ошибки — `message`. После успеха экран SHALL перейти в режим только чтения. #### Scenario: Подтверждение с неакцептованными нарушениями - **WHEN** аналитик подтверждает форму с жёсткими нарушениями без акцепта - **THEN** показан список нарушений из ответа и кнопка «Принять с комментарием» #### Scenario: Дубль подтверждённой формы - **WHEN** сервер отвечает 409 `DUPLICATE_FORM` - **THEN** экран показывает ошибку со ссылкой на уже подтверждённую форму ## ADDED 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 показывать предупреждения документа из `DocumentOut.issues[]` (коды `OSV_*`) блоком над таблицей; все записи относятся к документу (строки ОСВ `line_ids` не адресуются); уровень `error` отличается от `info`. #### Scenario: Предупреждение листа ОСВ - **WHEN** у ОСВ-документа в `issues` есть запись с кодом `OSV_*` - **THEN** над таблицей показан блок предупреждений с текстом записи и уровнем