Andrey Epifancev 90ea429642 docs(#116): proposal и дельты спек единой нормализации ББ/ОФР
- proposal: зачем, что меняется, порядок выкладки «сначала ядро», non-goals
- statement-normalization: шаги 1–8 общего кода arm_statements (кандидат, раскладка, статусы строк,
  значения, §7, needs_review, структурная проверка кода, уровни предупреждений, статус)
- recognition-contract: файл результата и конверт v2.0, переход 1.x → 2.0
- tabular-recognition-service, scan-gateway: адаптеры шага 1 и что уходит из сервисов
- arm-core: хранение v2.0, агрегат по коду, document_issue, RECOGNIZED, PATCH lines/columns/confirmed,
  порядок 409, миграция v5.19, crm_id ГСК/ГСЗ
- arm-web: экран проверки формы по новым полям
- design.md: автозамена между файлами — §9.5 п. 3, а не §12 п. 3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 00:40:50 +04:00

5.1 KiB
Raw Blame History

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. Предупреждения и нарушения (issues, checks) SHALL показываться у места: у строк (line_ids), ячеек (line_ids + column_id), полей шапки (field) или у документа; уровень error отличается от info. Подсветки по confidence < 100 и is_recognized = false напрямую нет.

Scenario: Догадка подтверждена проверкой

  • WHEN значение is_recognized = false, needs_review = false
  • THEN ячейка не подсвечена; в подсказке сырой текст и уверенность

Requirement: Правка строк, колонок и подтверждение в режиме «Редактировать»

В режиме «Редактировать» экран SHALL давать: у unreadable / missing — поле ввода кода с подсказкой из справочника (код → справочное имя) и пункт меню строки «Это расшифровка»; у detail — «Назначить код»; у строки ok — «Сделать расшифровкой», смену кода и «Подтвердить код» у строки с needs_review; подтверждение ячейки без правки; ввод даты у колонки без даты (period_kind = none) или с предупреждением о дате. «Сохранить» отправляет один PATCH …/statement (header, values, columns, lines). Кнопка «Подтвердить данные» при строках unreadable / missing с суммами SHALL быть отключена с подсказкой «Разберите строки без кода: N» и переходом к первой такой строке; ответ сервера 409 LINES_UNRESOLVED показывается тем же текстом, 409 DUPLICATE_FORM — со ссылкой на подтверждённую форму, 409 LINE_EXISTS — у поля кода.

Scenario: Назначить код

  • WHEN аналитик вводит 1250 в ячейку кода строки unreadable и сохраняет
  • THEN уходит PATCH с lines: [{line_id, line_code: "1250"}]; после ответа строка встаёт на место 1250

Scenario: Подтверждение заблокировано

  • WHEN у формы две строки missing с суммами
  • THEN «Подтвердить данные» отключена, подсказка «Разберите строки без кода: 2», клик по подсказке ведёт к первой