Andrey Epifancev dd454983e6 openspec: спека Среза 3b — формы ББ/ОФР в ядре и API до сводной ОСВ (#36)
proposal, design (D-1…D-14, решения без обсуждения №1–10), дельты osv-result-mapping (маппинг форм, статус),
statement-checks (новая: §7, межформенная, акцепт), documents-api (форма, правка, акцепт, подтверждение, комментарии,
исходный файл), consolidations-api (CSV чек-листа), directories-api (documents_count), users-admin (справочник имён).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 08:21:57 +04:00

74 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Proposal: Срез 3b — формы ББ/ОФР в ядре и API до сводной ОСВ
**Срез:** 3b — вторая половина Среза 3 «ББ/ОФР: scan-gateway, маппинг форм, логические проверки, подтверждение
документа» (`../docs/context/09-delivery-plan.md`). **Репозиторий:** arm-core. **Issue:** RSHB/arm-core#36.
**Соседние:** Срез 3a (scan-gateway, `statementDocument` из OCR, закрыт 07.10.2026), Срез 2b (tabular-parser, формы из
Excel, контракт v1.2). Документация — bounded-PR в docs (§7, §9.5, OQ, `03-architecture.md`, `09-delivery-plan.md`), без
сквозного change: контракт и DBML не меняются. Объём по решению владельца 07.10.2026: **весь API пути пользователя до
сводной ОСВ включительно**; UI делает другой разработчик по этим спекам.
## Why
Оба сервиса распознавания отдают формы ББ/ОФР (`statementDocument` контракта v1.2), а ядро их игнорирует: документы
`BALANCE`/`INCOME` не создаются, `financial_statement_*` пусты, а файл, где есть только формы (выгрузка ББ/ОФР из 1С,
скан PDF), падает в `ERROR` с «в результате нет документов ОСВ». Поэтому столбцы «Бух. баланс» и «ОФР» чек-листа никогда
не закрываются, экрана «Проверка распознавания» нечем кормить, а консолидация не может стартовать по правилам
`required_document_rule`. Сверка пользовательского пути (`10-user-journey.md`, пути 1–2 и шаг 3.1) с API нашла и
мелкие дыры: нет отдачи исходного файла, комментариев к документу, имён пользователей для не-админов, числа документов
у ЮЛ и CSV чек-листа.
## What Changes
- **Маппинг форм** (`osv-result-mapping`): в той же транзакции `map_file` после листов ОСВ каждый `statementDocument`
`BALANCE`/`INCOME` становится `document` + `financial_statement_meta` + `financial_statement_column` +
`financial_statement_line` + `financial_statement_value` (значение на каждую пару «строка × колонка»); период — по дате
отчёта, без неё — по самой поздней дате колонок; `counterparty_check` — как у ОСВ; `DISCLOSURE`/`OTHER` — один документ
на тип на файл без данных. Файл без ОСВ, но с формами — не ошибка; ошибка — только пустой результат.
- **Проверки §7** (новая спека `statement-checks`): чистые функции `domain/statement_checks.py` — перенос проверок
tabular-parser (допуск ±1, округление 0,001 %, `abs_terms`, подстроки) со словарём `api/rules/statement_checks.yaml`;
межформенная `1370 − 1370(начало года) = 2400` — мягкая. Результат не хранится; акцепт непройденных жёстких проверок
с комментарием — `checks_accepted_*`.
- **API формы** (`documents-api`): `GET /documents/{id}/statement` (шапка с исходниками и признаками правки, редакция
формы, колонки, строки со значениями, проверки), `PATCH /documents/{id}/statement` (значения и ИНН / дата отчёта /
единицы; исходники сохраняются, `audit_event(RECOGNIZED_DATA_EDIT)`, пересчёт проверок и статуса, сброс акцепта),
`POST /documents/{id}/statement/checks/accept`. Подтверждённая форма — только для чтения (решение владельца).
- **Подтверждение ББ/ОФР**: дополнительно требует пройденных или акцептованных жёстких проверок и определённого периода;
пишет `financial_statement_meta.reviewed_by/at`. Привязка к версиям и переходы статуса версии — без изменений.
- **Мелкие дыры**: `GET /files/{id}/content` (поток исходного файла из S3 через ядро), комментарии
`POST/GET /documents/{id}/comments` (таблица `comment`) и `comments_count` в карточке документа,
`GET /users/brief?ids=` для любого аутентифицированного пользователя, `documents_count` в списке ЮЛ,
`GET …/checklist?format=csv`.
## Таблицы DBML v5.16
Пишутся: `document` (типы `BALANCE`, `INCOME`, `DISCLOSURE`, `OTHER`), `financial_statement_meta`,
`financial_statement_column`, `financial_statement_line`, `financial_statement_value`, `comment`, `audit_event`.
Читаются: `stored_file`, `s3_object`, `recognition_job`, `legal_entity`, `legal_entity_alias`, `app_user`,
`consolidation_*`, `required_document_rule`. Новых таблиц, колонок и значений enum нет; миграции нет.
## Параграфы `05-domain-rules.md`
§7 (логические проверки, акцепт), §9.3 (статус документа), §9.5 (маппинг, подтверждение), §11 и §11.1 (форма из OCR),
§12 (форма из Excel; п. 5 — повтор кода, п. 7 — самопроверка), §2 и §3 п. 1 (период и привязка к версии). Правила,
которых в `05` нет и которые вводит этот change (будут дописаны в §7 и §9.5 bounded-PR docs): период ББ/ОФР по самой
поздней дате колонок при пустой дате отчёта; межформенная проверка мягкая; правка формы только до подтверждения;
условия подтверждения ББ/ОФР.
## Допущения по открытым вопросам
- ASSUMPTION(OQ-12, OQ-146): формулы §7 одни для редакций `66n` и `fsbu4`; варианты ФСБУ 4/2023 для 2400 — мягкие.
- ASSUMPTION(OQ-23): `DISCLOSURE` только хранится — документ без данных.
- ASSUMPTION(OQ-36, OQ-141, OQ-149): строки без кода не хранятся (их нет в результате).
- ASSUMPTION(OQ-77): вторая форма того же типа в файле не создаётся; первая — `NEEDS_CHECK` с предупреждением.
- ASSUMPTION(OQ-140): страницы формы из разных файлов не склеиваются.
- ASSUMPTION(OQ-145): редакцию формы ядро определяет само по дате отчёта; контракт не меняется.
## Non-goals
- UI (экраны делает другой разработчик).
- Правка строк ОСВ, добавление и удаление строк формы, правка кода и названия строки.
- Отмена подтверждения документа (исправление — новым файлом через автозамену).
- Шахматка, корректировки, КФО, ЕХ, журнал действий, «Добавить версию» (Срезы 5–7).
- Изменение контракта и DBML; хранение результатов проверок; разбор расшифровок.
- Заполнение редакции `fsbu4` и словарей по редакциям (OQ-146).