Andrey Epifancev fb491a3e93 openspec: архив statement-template-lines (#80)
Спеки documents-api и statement-checks обновлены дельтой change'а; change перенесён в
openspec/changes/archive/2026-10-09-statement-template-lines/. Реализация — PR #81.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:55:14 +04:00

7.8 KiB
Raw Blame History

Proposal: полный состав строк ББ/ОФР на экране проверки

Срез: доработка Среза 3b (../docs/context/09-delivery-plan.md) — экран проверки форм ББ/ОФР. Репозитории: arm-core (этот change, issue RSHB/arm-core#80); arm-web — PR в test (раскладка, правка по коду строки); ../docs — bounded-PR: правило в 05-domain-rules.md §7 «Ядро» и §11/§12, OQ-150 в 07-open-questions.md, гайды dev/frontend-api-guide.md, dev/qa-guide.md. Follow-up: словарь fsbu4 в scan-gateway (OQ-150 для нормализатора). DBML и контракты обмена не меняются, миграций нет.

Why

Ядро хранит только строки формы, пришедшие от OCR или разбора Excel (financial_statement_line), и правит только существующую ячейку (PATCH …/statement по line_id + column_id, иначе 422 UNKNOWN_CELL). Если источник строку потерял — пример: «Русский бисквит», 1 кв. 2025, ИС склеила «1500\n1700» и строка 1700 пропала (до OQ-156), — аналитик не может её заполнить, хотя форма бухгалтерской отчётности обязана её содержать. То же с ячейкой, которой нет у существующей строки в какой-то колонке. Решение владельца 09.10.2026: на экране проверки всегда показывать все строки формы своей редакции и давать их заполнять.

What Changes

  • Справочник строк форм по редакциям — api/rules/statement_lines.yaml (данные, не код): редакции 66n (≤ 2024-12-31) и fsbu4 (с 2025-01-01), для каждой — ББ и ОФР: коды в порядке формы и наименования. Источник обеих редакций — шаблоны банка ../fixtures/statements-xlsx/templates/ («ББ/ОФР до 01.01.2025», «ББ/ОФР после 01.01.2025») с исправленными склейками наименований и заголовков разделов (решение владельца 09.10.2026: данные OQ-150 — из шаблонов).
  • GET /documents/{id}/statement достраивает форму. К строкам из БД добавляются строки справочника редакции edition, которых в форме нет, и недостающие ячейки у существующих строк по всем колонкам формы. У достроенной строки id = null, origin = "template", наименование — из справочника; у достроенной ячейки id = null, amount = null, is_recognized = null, is_modified = false. Новое поле LineOut.origin: source — строка пришла из источника, template — строка из справочника (достроенная или созданная правкой аналитика). Без edition (нет даты периода) строки не достраиваются, недостающие ячейки — достраиваются.
  • PATCH …/statement создаёт строку и ячейку при первой правке. Элемент values[] адресует ячейку либо line_id + column_id (как сейчас; если у строки нет ячейки в этой колонке — ячейка создаётся), либо line_code + column_id — для строки справочника редакции, которой нет в форме: ядро создаёт financial_statement_line (line_code_original_value = NULL — признак «не из источника», наименование из справочника) и financial_statement_value (original_amount = NULL, is_recognized = NULL, confidence = NULL). Дальше — как любая правка: is_modified, modified_by/at, один audit_event(RECOGNIZED_DATA_EDIT) с before = null, сброс акцепта, пересчёт статуса.
  • Пустая шаблонная строка не влияет на статус и проверки (решение владельца 09.10.2026). Достроенные строки в БД не пишутся и в проверки §7, values_ok (D-6) и автоподтверждение не попадают. Созданная правкой строка (origin = template) участвует в проверках §7, только пока у неё есть хотя бы одна непустая сумма; очищенная до пустоты — снова как будто её нет.

Таблицы DBML v5.17: financial_statement_line (line_code_original_value NULL — признак строки не из источника), financial_statement_value, financial_statement_meta (сброс акцепта), document (статус), audit_event. Новых полей нет.

Non-goals

  • Запись достроенных строк в БД при маппинге и миграция данных — нет: БД хранит то, что пришло (первичка).
  • Обязательность заполнения: пустая строка не блокирует подтверждение и автоподтверждение; полноту ловят проверки §7.
  • Заполнение fsbu4 в словаре scan-gateway (нормализатор, golden-эталоны) — follow-up issue.
  • Строки без кода (OQ-36, OQ-141, OQ-149), пятизначные подстроки в справочнике, отдельные формы для упрощённой отчётности малых предприятий — нет.
  • Порядок строк в ответе — по коду, как сейчас; раскладка по разделам — на фронте (formLayout.ts).
  • Удаление созданной строки аналитиком — нет (очистка суммы до null возвращает её в состояние «пустая шаблонная»).
  • Правка кода и наименования строки — нет (решение Среза 3b).

Impact

  • Код: domain/statement_lines.py (новый: загрузка справочника по редакциям), достройка формы — _lines_out в schemas/statements.py, api/rules/statement_lines.yaml (новый), schemas/statements.py (LineOut.id/ValueOut.id nullable, LineOut.origin, CellPatch с line_id | line_code), services/statements.py (build_out, _apply_cells), repositories/statements.py (создание строки/ячейки, исключение пустых шаблонных строк в statement_amounts).
  • Спеки (дельты): documents-api («Форма ББ/ОФР для экрана проверки», «Правка формы»), statement-checks («Соотношения §7 по колонкам»).
  • Фронт arm-web: ключ шаблонной строки, отправка line_code, отсутствие подсветки «требует проверки» у пустых достроенных ячеек; выделение цветом строк «БАЛАНС» (1600 актив, 1700 пассив) — просьба владельца 09.10.2026.