diff --git a/model/data-model-v5.19.dbml b/model/data-model-v5.19.dbml index 268084d..20d5ed1 100644 --- a/model/data-model-v5.19.dbml +++ b/model/data-model-v5.19.dbml @@ -27,10 +27,25 @@ // (частичный индекс; ОСВ по счёту, DISCLOSURE, OTHER — «один на тип на файл», §9.5 п. 2); вторая форма того же типа // в файле хранится (Р-10, Р-15); новая колонка file_ordinal — порядковый номер документа в результате, уникален в файле. // 8. related_group.crm_id (varchar, nullable, unique) — ID ГСК/ГСЗ в ЕЦП CRM (AURORA-1619, arm-core#112, OQ-33). -// Заполнение при миграции: row_index строк — по возрастанию line_code внутри формы с 0, line_status = ok, needs_review -// строк = false, needs_review значений — по прежнему правилу values_ok (правлено или is_recognized не false и confidence -// 100 / NULL), source_text = string_value, is_confirmed = false, period_kind = absolute при period_date, иначе none, -// form_variant = NULL, file_ordinal — по (created_at, id) внутри файла с 0, related_group.crm_id = NULL. +// 9. Признак «строка создана правкой аналитика» — financial_statement_line.row_index IS NULL (заменяет прежний +// признак line_code_original_value IS NULL: у строк unreadable / missing / detail источника кода тоже нет). +// line_code_original_value — код строки из результата как пришёл (NULL у статусов кроме ok и у строк, созданных +// правкой); правками не меняется. +// 10. financial_statement_meta: header_source (jsonb — сырой текст и уверенность всех полей шапки результата, +// {"<поле>": {"text", "confidence"}}), organization_name_original_value и organization_name_modified (наименование +// правится PATCH шапки, как ИНН). +// 11. document_issue: codes (jsonb — коды цели и членов нарушения §7), column_index (столбец предупреждения вне колонок +// формы — COLUMN_SKIPPED и др.). +// Заполнение при миграции: row_index строк — NULL у строк с line_code_original_value IS NULL (созданных правкой), у +// остальных — по возрастанию line_code внутри формы с 0; line_status = ok, needs_review строк = false, needs_review +// значений — по прежнему правилу values_ok (правлено или is_recognized не false и confidence 100 / NULL), source_text = +// string_value, is_confirmed = false, period_kind = absolute при period_date, иначе none, form_variant = NULL (набор §7 — +// полный), header_source — из *_original_value и inn_confidence, organization_name_original_value = organization_name, +// file_ordinal — по (created_at, id) внутри файла с 0, related_group.crm_id = NULL; document_issue каждой формы — +// нарушения §7, посчитанные копией arm_statements по текущим суммам (source = core, kind relation / soft). +// Откат гарантирован на пустой БД и на данных, совместимых с v5.18 (нет повторов кода в форме, строк без кода, двух +// форм одного типа в файле, crm_id групп); на несовместимых данных downgrade останавливается с ошибкой и ничего не +// удаляет молча. // // v5.18 (решения владельца 09.10.2026; RSHB/arm-ka-docs#90, openspec/changes/console-files): // 1. stored_file.consolidation_id (uuid, nullable, FK → consolidation): консолидация (ГК + год + квартал), в контексте @@ -963,8 +978,11 @@ Table financial_statement_meta { checks_accepted_by uuid [ref: > app_user.id, note: 'v5.9 ТЗ 6.3 п.7: акцепт КА непройденных проверок (напр. 1370/2400) с комментарием'] checks_accepted_at timestamptz checks_accepted_comment text - form_variant statement_form_variant [note: 'v5.19: full | simplified — по структуре кодов (§11.7); выбирает набор соотношений §7; NULL — документ до v5.19'] - needs_review_fields jsonb [note: 'v5.19: имена полей шапки с needs_review (["report_date"]), как пришло от сервиса; правка поля убирает его из списка'] + form_variant statement_form_variant [note: 'v5.19: full | simplified — по структуре кодов (§11.7); выбирает набор соотношений §7; NULL — документ до v5.19 или результат 1.x: набор полный'] + needs_review_fields jsonb [note: 'v5.19: имена полей шапки, требующих проверки (["report_date"]), как пришло от сервиса; правка поля или подтверждение тем же значением убирает его из списка'] + header_source jsonb [note: 'v5.19: шапка результата как пришла — {"<поле>": {"text": <поле>_text, "confidence": <поле>_confidence}} для organization_name, inn, report_date, units, okud, okpo, okopf, okfs, okei, address; не меняется. *_original_value — разобранное значение из результата (inn_original_value = inn и т. д.), inn_confidence = header_source.inn.confidence'] + organization_name_original_value varchar [note: 'v5.19: наименование организации из результата; правками не меняется'] + organization_name_modified boolean [note: 'v5.19: наименование правилось аналитиком (PATCH шапки)'] Note: 'Шапка распознанной формы ББ/ОФР. v5.19: результат проверок §7 и предупреждения хранятся в document_issue как пришли от сервиса и пересчитываются ядром только после правок (пересматривает «не хранятся — считаются на лету»)' } @@ -996,14 +1014,14 @@ Table financial_statement_line { id uuid [pk] meta_id uuid [not null, ref: > financial_statement_meta.id] line_code varchar [note: 'код строки ОКУД, напр. 1230'] - line_code_original_value varchar + line_code_original_value varchar [note: 'v5.19: line_code строки из результата как пришёл (NULL у unreadable / missing / detail и у строк, созданных правкой); правками кода не меняется. До v5.19 NULL был признаком «создана правкой» — теперь это row_index IS NULL'] line_code_confidence numeric(5,2) line_code_modified boolean line_name varchar line_name_original_value varchar line_name_confidence numeric(5,2) line_name_modified boolean [note: 'FIX: был numeric'] - row_index int [note: 'v5.19: порядок строки в документе источника (с 0); NULL — строка шаблона, созданная правкой аналитика'] + row_index int [note: 'v5.19: порядок строки в документе источника (с 0). NULL ⇔ строка создана правкой аналитика (шаблонная, origin = template); у строк из результата — всегда не NULL (маппер 1.x и 2.0)'] source_ref varchar [note: 'v5.19: положение в источнике (row:8, row:14#2, Баланс!C27); NULL у строк, созданных правкой'] line_status statement_line_status [not null, default: 'ok', note: 'v5.19: ok | unreadable | missing | detail; line_code пуст ⇔ статус не ok'] line_code_text varchar [note: 'v5.19: сырой текст ячейки кода, как распознано'] @@ -1053,11 +1071,13 @@ Table document_issue { id uuid [pk] document_id uuid [not null, ref: > document.id] kind document_issue_kind [not null] - code varchar [not null, note: 'код предупреждения (05-domain-rules.md §11.9) или код вида нарушения'] + code varchar [not null, note: 'код предупреждения (05-domain-rules.md §11.9); у relation — RELATION_FAILED (severity error), у soft — RELATION_SOFT (severity info)'] severity issue_severity [not null] message text [not null] - line_ids jsonb [note: 'массив financial_statement_line.id, к которым относится запись (нарушение — все строки кодов соотношения)'] + line_ids jsonb [note: 'массив financial_statement_line.id, к которым относится запись (нарушение — все строки кодов соотношения); FK нет — при удалении шаблонной строки (назначение её кода строке источника) ядро убирает её id из line_ids всех записей документа'] column_id uuid [ref: > financial_statement_column.id] + column_index smallint [note: 'столбец сетки из предупреждения, если колонки нет среди financial_statement_column (COLUMN_SKIPPED и др.); у колонки формы — column_id'] + codes jsonb [note: 'для relation / soft: коды цели и членов соотношения (["1600","1100","1200"]); экран подсвечивает строки этих кодов'] field varchar [note: 'поле шапки (report_date, inn, organization_name, …)'] source issue_source [not null] relation varchar [note: 'для relation / soft: текст соотношения (1600 = 1100 + 1200)'] diff --git a/model/diagrams/part06_statements.png b/model/diagrams/part06_statements.png index 77d299c..428e899 100644 Binary files a/model/diagrams/part06_statements.png and b/model/diagrams/part06_statements.png differ diff --git a/model/diagrams/part06_statements.svg b/model/diagrams/part06_statements.svg index fad7a9d..5af5201 100644 --- a/model/diagrams/part06_statements.svg +++ b/model/diagrams/part06_statements.svg @@ -4,123 +4,123 @@ - - + + dbml statement_type - - - -       statement_type        - - -    balance     - - -    income     - + + + +       statement_type        + + +    balance     + + +    income     + statement_line_status - - - -       statement_line_status        - - -    ok     - - -    unreadable     - - -    missing     - - -    detail     - + + + +       statement_line_status        + + +    ok     + + +    unreadable     + + +    missing     + + +    detail     + statement_form_variant - - - -       statement_form_variant        - - -    full     - - -    simplified     - + + + +       statement_form_variant        + + +    full     + + +    simplified     + document_issue_kind - - - -       document_issue_kind        - - -    warning     - - -    relation     - - -    soft     - + + + +       document_issue_kind        + + +    warning     + + +    relation     + + +    soft     + issue_severity - - - -       issue_severity        - - -    error     - - -    info     - + + + +       issue_severity        + + +    error     + + +    info     + issue_source - - - -       issue_source        - - -    service     - - -    core     - + + + +       issue_source        + + +    service     + + +    core     + app_user - - - -       app_user        - - -id -     -uuid - + + + +       app_user        + + +id +     +uuid + @@ -128,16 +128,16 @@ document - - - -       document        - - -id -     -uuid - + + + +       document        + + +id +     +uuid + @@ -145,16 +145,16 @@ recognition_job - - - -       recognition_job        - - -id -     -uuid - + + + +       recognition_job        + + +id +     +uuid + @@ -162,253 +162,265 @@ financial_statement_meta - - - -       financial_statement_meta        - - -id -     -uuid - - -document_id     -uuid - -(!) - - -recognition_job_id     -uuid - -(!) - - -statement_type     -statement_type - -(!) - - -inn     -varchar - - -inn_original_value     -varchar - - -inn_confidence     -numeric(5,2) - - -inn_verified     -boolean - - -inn_modified     -boolean - - -organization_name     -varchar - - -report_date     -date - - -report_date_original_value     -varchar - - -report_date_verified     -boolean - - -report_date_modified     -boolean - - -units     -varchar - - -units_original_value     -varchar - - -units_verified     -boolean - - -units_modified     -boolean - - -currency     -varchar - - -okpo     -varchar - - -okopf     -varchar - - -okfs     -varchar - - -okud     -varchar - - -okei     -varchar - - -legal_form     -varchar - - -ownership_form     -varchar - - -address     -varchar - - -subject_to_audit     -boolean - - -reviewed_by     -uuid - - -reviewed_at     -timestamptz - - -checks_accepted_by     -uuid - - -checks_accepted_at     -timestamptz - - -checks_accepted_comment     -text - - -form_variant     -statement_form_variant - - -needs_review_fields     -jsonb - + + + +       financial_statement_meta        + + +id +     +uuid + + +document_id     +uuid + +(!) + + +recognition_job_id     +uuid + +(!) + + +statement_type     +statement_type + +(!) + + +inn     +varchar + + +inn_original_value     +varchar + + +inn_confidence     +numeric(5,2) + + +inn_verified     +boolean + + +inn_modified     +boolean + + +organization_name     +varchar + + +report_date     +date + + +report_date_original_value     +varchar + + +report_date_verified     +boolean + + +report_date_modified     +boolean + + +units     +varchar + + +units_original_value     +varchar + + +units_verified     +boolean + + +units_modified     +boolean + + +currency     +varchar + + +okpo     +varchar + + +okopf     +varchar + + +okfs     +varchar + + +okud     +varchar + + +okei     +varchar + + +legal_form     +varchar + + +ownership_form     +varchar + + +address     +varchar + + +subject_to_audit     +boolean + + +reviewed_by     +uuid + + +reviewed_at     +timestamptz + + +checks_accepted_by     +uuid + + +checks_accepted_at     +timestamptz + + +checks_accepted_comment     +text + + +form_variant     +statement_form_variant + + +needs_review_fields     +jsonb + + +header_source     +jsonb + + +organization_name_original_value     +varchar + + +organization_name_modified     +boolean + financial_statement_meta:e->statement_type:w - + financial_statement_meta:e->statement_form_variant:w - + financial_statement_meta:e->app_user:w - - -1 -* + + +1 +* financial_statement_meta:e->app_user:w - - -1 -* + + +1 +* financial_statement_meta:e->document:w - - -1 -* + + +1 +* financial_statement_meta:e->recognition_job:w - - -1 -* + + +1 +* financial_statement_column - - - -       financial_statement_column        - - -id -     -uuid - - -meta_id     -uuid - -(!) - - -column_index     -smallint - -(!) - - -label     -varchar - - -period_date     -date - - -is_current     -boolean - - -period_kind     -varchar - - -label_confidence     -numeric(5,2) - + + + +       financial_statement_column        + + +id +     +uuid + + +meta_id     +uuid + +(!) + + +column_index     +smallint + +(!) + + +label     +varchar + + +period_date     +date + + +is_current     +boolean + + +period_kind     +varchar + + +label_confidence     +numeric(5,2) + @@ -416,349 +428,357 @@ financial_statement_column:e->financial_statement_meta:w - - -1 -* + + +1 +* financial_statement_line - - - -       financial_statement_line        - - -id -     -uuid - - -meta_id     -uuid - -(!) - - -line_code     -varchar - - -line_code_original_value     -varchar - - -line_code_confidence     -numeric(5,2) - - -line_code_modified     -boolean - - -line_name     -varchar - - -line_name_original_value     -varchar - - -line_name_confidence     -numeric(5,2) - - -line_name_modified     -boolean - - -row_index     -int - - -source_ref     -varchar - - -line_status     -statement_line_status - -(!) - - -line_code_text     -varchar - - -parent_row_index     -int - - -needs_review     -boolean - -(!) - - -is_confirmed     -boolean - -(!) - + + + +       financial_statement_line        + + +id +     +uuid + + +meta_id     +uuid + +(!) + + +line_code     +varchar + + +line_code_original_value     +varchar + + +line_code_confidence     +numeric(5,2) + + +line_code_modified     +boolean + + +line_name     +varchar + + +line_name_original_value     +varchar + + +line_name_confidence     +numeric(5,2) + + +line_name_modified     +boolean + + +row_index     +int + + +source_ref     +varchar + + +line_status     +statement_line_status + +(!) + + +line_code_text     +varchar + + +parent_row_index     +int + + +needs_review     +boolean + +(!) + + +is_confirmed     +boolean + +(!) + financial_statement_line:e->statement_line_status:w - + financial_statement_line:e->financial_statement_meta:w - - -1 -* + + +1 +* financial_statement_value - - - -       financial_statement_value        - - -id -     -uuid - - -line_id     -uuid - -(!) - - -column_id     -uuid - -(!) - - -amount     -numeric(18,2) - - -string_value     -varchar - - -confidence     -numeric(5,2) - - -is_recognized     -boolean - - -is_modified     -boolean - -(!) - - -original_amount     -numeric(18,2) - - -modified_by     -uuid - - -modified_at     -timestamptz - - -source_text     -varchar - - -needs_review     -boolean - -(!) - - -is_confirmed     -boolean - -(!) - - -confirmed_by     -uuid - - -confirmed_at     -timestamptz - + + + +       financial_statement_value        + + +id +     +uuid + + +line_id     +uuid + +(!) + + +column_id     +uuid + +(!) + + +amount     +numeric(18,2) + + +string_value     +varchar + + +confidence     +numeric(5,2) + + +is_recognized     +boolean + + +is_modified     +boolean + +(!) + + +original_amount     +numeric(18,2) + + +modified_by     +uuid + + +modified_at     +timestamptz + + +source_text     +varchar + + +needs_review     +boolean + +(!) + + +is_confirmed     +boolean + +(!) + + +confirmed_by     +uuid + + +confirmed_at     +timestamptz + financial_statement_value:e->app_user:w - - -1 -* + + +1 +* financial_statement_value:e->app_user:w - - -1 -* + + +1 +* financial_statement_value:e->financial_statement_column:w - - -1 -* + + +1 +* financial_statement_value:e->financial_statement_line:w - - -1 -* + + +1 +* document_issue - - - -       document_issue        - - -id -     -uuid - - -document_id     -uuid - -(!) - - -kind     -document_issue_kind - -(!) - - -code     -varchar - -(!) - - -severity     -issue_severity - -(!) - - -message     -text - -(!) - - -line_ids     -jsonb - - -column_id     -uuid - - -field     -varchar - - -source     -issue_source - -(!) - - -relation     -varchar - - -expected     -numeric(18,2) - - -actual     -numeric(18,2) - - -created_at     -timestamptz - -(!) - + + + +       document_issue        + + +id +     +uuid + + +document_id     +uuid + +(!) + + +kind     +document_issue_kind + +(!) + + +code     +varchar + +(!) + + +severity     +issue_severity + +(!) + + +message     +text + +(!) + + +line_ids     +jsonb + + +column_id     +uuid + + +column_index     +smallint + + +codes     +jsonb + + +field     +varchar + + +source     +issue_source + +(!) + + +relation     +varchar + + +expected     +numeric(18,2) + + +actual     +numeric(18,2) + + +created_at     +timestamptz + +(!) + document_issue:e->document_issue_kind:w - + document_issue:e->issue_severity:w - + document_issue:e->issue_source:w - + document_issue:e->document:w - - -1 -* + + +1 +* document_issue:e->financial_statement_column:w - - -1 -* + + +1 +* diff --git a/model/entities-v5.19.md b/model/entities-v5.19.md index 86990ec..6a2f23d 100644 --- a/model/entities-v5.19.md +++ b/model/entities-v5.19.md @@ -9,19 +9,22 @@ Change `openspec/changes/unified-statement-normalization`: формы ББ/ОФ | № | Изменение | Решение | |---|---|---| -| 1 | `financial_statement_line`: снята уникальность `(meta_id, line_code)` (индекс остаётся неуникальным); новые `row_index`, `source_ref` (частичный уникальный `(meta_id, source_ref) WHERE source_ref IS NOT NULL`), `line_status` (enum `statement_line_status`: `ok` / `unreadable` / `missing` / `detail`), `line_code_text`, `parent_row_index`, `needs_review`, `is_confirmed` | Повтор кода — законный случай (один код, разные наименования; Р-4): хранятся все строки, чтения «по коду» идут через агрегат формы по коду (сумма строк `ok`, не хранится — DECISION-5). Строки без кода хранятся со статусом (Р-8, отменяет OQ-36 / OQ-141): `detail` — расшифровка под строкой с кодом, в §7, агрегаты, КФО и ЕХ не входит; `unreadable` / `missing` блокируют подтверждение, пока у них есть суммы (Р-13). Порядок и положение в источнике (`row_index`, `source_ref`) нужны экрану, чтобы показать строку и предупреждение у места | +| 1 | `financial_statement_line`: снята уникальность `(meta_id, line_code)` (индекс остаётся неуникальным); новые `row_index`, `source_ref` (частичный уникальный `(meta_id, source_ref) WHERE source_ref IS NOT NULL`), `line_status` (enum `statement_line_status`: `ok` / `unreadable` / `missing` / `detail`), `line_code_text`, `parent_row_index`, `needs_review`, `is_confirmed` | Повтор кода — законный случай (один код, разные наименования; Р-4): хранятся все строки, чтения «по коду» идут через агрегат формы по коду (сумма строк `ok`, не хранится — DECISION-5). Строки без кода хранятся со статусом (Р-8, отменяет OQ-36 / OQ-141): `detail` — расшифровка под строкой с кодом, в §7, агрегаты, КФО и ЕХ не входит; `unreadable` / `missing` блокируют подтверждение, пока у них есть суммы (Р-13). Порядок и положение в источнике (`row_index`, `source_ref`) нужны экрану, чтобы показать строку и предупреждение у места. **Признак «строка создана правкой аналитика» — `row_index IS NULL`** (прежний признак `line_code_original_value IS NULL` не годится: у строк `unreadable` / `missing` / `detail` источника кода тоже нет); `line_code_original_value` — код из результата как пришёл, правками не меняется | | 2 | `financial_statement_value`: `source_text`, `needs_review`, `is_confirmed`, `confirmed_by`, `confirmed_at` | `needs_review` **хранится** (пересматривает п. 4 v5.13): его считает сервис («подтверждение проверкой» §7 — Р-5, Р-7), ядро пересчитывает только после правок; подтверждение ячейки без правки аналитиком переживает пересчёт. Сырой текст источника — подсказка ячейки | | 3 | `financial_statement_column`: `period_kind`, `label_confidence` | Относительные подписи бланка 66н («На отчётную дату», «На 31 декабря предыдущего года») — дата колонки от эффективной даты документа, ядро досчитывает после правки даты отчёта (Р-6); колонка без даты остаётся с `period_kind = none` | -| 4 | `financial_statement_meta`: `form_variant` (enum `statement_form_variant`), `needs_review_fields` | Упрощённая форма — свой набор соотношений §7; поля шапки, требующие проверки (сейчас — неуверенная дата отчёта) | -| 5 | Новая таблица `document_issue` + enum `document_issue_kind`, `issue_severity`, `issue_source` | Предупреждения и нарушения §7 документа с уровнем и привязкой к строкам (`line_ids`), колонке, полю шапки; как пришли от сервиса или посчитаны ядром. Очищается при перезагрузке файла; при пересчёте после правки `relation` / `soft` заменяются целиком, `warning` сервиса сохраняются, кроме снимаемых правкой | +| 4 | `financial_statement_meta`: `form_variant` (enum `statement_form_variant`), `needs_review_fields`, `header_source` (jsonb), `organization_name_original_value`, `organization_name_modified` | Упрощённая форма — свой набор соотношений §7 (`NULL` — документ до v5.19 или результат 1.x, набор полный); поля шапки, требующие проверки (сейчас — неуверенная дата отчёта); сырой текст и уверенность всех полей шапки результата (`<поле>_text`, `<поле>_confidence`) — подсказка у поля на экране; наименование организации правится, как ИНН | +| 5 | Новая таблица `document_issue` + enum `document_issue_kind`, `issue_severity`, `issue_source` | Предупреждения и нарушения §7 документа с уровнем и привязкой к строкам (`line_ids`), колонке (`column_id`, а вне колонок формы — `column_index`), полю шапки; у нарушения — `codes` (коды цели и членов); как пришли от сервиса или посчитаны ядром. Очищается при перезагрузке файла; при пересчёте после правки `relation` / `soft` заменяются целиком, `warning` сервиса сохраняются, кроме снимаемых правкой. **Единственный источник нарушений** для экрана и подтверждения: для результатов 1.x и форм, существовавших до миграции, ядро один раз считает §7 копией `arm_statements` и пишет записи с `source = core` | | 6 | `recognition_job.statements_version` | Коммит копии общего кода `arm_statements`, которым посчитан результат (`service.statements_version`); расхождение с копией ядра при пересчёте — `info` | | 7 | `document`: уникальность `(stored_file_id, document_type, osv_account_code)` — частичная, кроме `BALANCE` / `INCOME`; новая колонка `file_ordinal` + уникальный `(stored_file_id, file_ordinal)` | Вторая форма того же типа в файле хранится (Р-10, Р-15); при двух формах одного типа и периода ни одна не автоподтверждается, подтверждение второй при подтверждённой первой — 409 `DUPLICATE_FORM` (Р-18). ОСВ по счёту, расшифровка и прочий — по-прежнему один на тип на файл (§9.5 п. 2) | | 8 | `related_group.crm_id` (`varchar`, nullable, unique) | ID ГСК/ГСЗ в ЕЦП CRM из форм `51-03`, `51-04`, `77-02` (AURORA-1619, arm-core#112, OQ-33); вводится вручную, импорт ЕЦП не заполняет (OQ-91); уникален, как `crm_id` ГК и ЮЛ | -Остальные таблицы и enum — как в v5.18 (44 таблицы, 33 enum). Реализация — одна миграция в `arm-core`; заполнение: -`row_index` — по возрастанию `line_code` в форме, `line_status = ok`, `needs_review` значений — по прежнему правилу -`values_ok`, `source_text = string_value`, `period_kind` — `absolute` при `period_date`, иначе `none`, `file_ordinal` — по -`(created_at, id)` в файле. +Остальные таблицы и enum — как в v5.18. Реализация — одна миграция в `arm-core`; заполнение: `row_index` — `NULL` у строк, +созданных правкой (`line_code_original_value IS NULL`), у остальных — по возрастанию `line_code` в форме; `line_status = +ok`, `needs_review` значений — по прежнему правилу `values_ok`, `source_text = string_value`, `period_kind` — `absolute` +при `period_date`, иначе `none`, `header_source` — из `*_original_value`, `file_ordinal` — по `(created_at, id)` в файле; +`document_issue` — нарушения §7 каждой формы, посчитанные копией `arm_statements` (`source = core`). Откат миграции +гарантирован на пустой БД и на данных, совместимых с v5.18 (без повторов кода, строк без кода и двух форм одного типа в +файле); на несовместимых данных `downgrade` останавливается с ошибкой. ## Что изменилось в v5.18 (решения владельца 09.10.2026, RSHB/arm-ka-docs#90) @@ -145,11 +148,11 @@ Change `openspec/changes/unified-statement-normalization`: формы ББ/ОФ | Сущность | Что это | Ключевые связи | Откуда | |---|---|---|---| -| `financial_statement_meta` | Шапка распознанной формы (1:1 с `document` BALANCE/INCOME): ИНН и наименование как в документе, отчётная дата, единица измерения, реквизиты. Ревью формы (`reviewed_by/at`) и акцепт КА непройденных логических проверок с комментарием. Подтверждение документа — `document.confirmed_by`. **v5.19:** `form_variant` (полная / упрощённая — набор соотношений §7), `needs_review_fields`; результат проверок §7 и предупреждения хранятся в `document_issue` как пришли от сервиса, ядро пересчитывает их только после правок. | → `document`, `recognition_job`, `app_user`; ← `column`, `line` | ТЗ 6.2/6.3; FNR01; макет | +| `financial_statement_meta` | Шапка распознанной формы (1:1 с `document` BALANCE/INCOME): ИНН и наименование как в документе, отчётная дата, единица измерения, реквизиты. Ревью формы (`reviewed_by/at`) и акцепт КА непройденных логических проверок с комментарием. Подтверждение документа — `document.confirmed_by`. **v5.19:** `form_variant` (полная / упрощённая — набор соотношений §7), `needs_review_fields`, `header_source` (сырой текст и уверенность полей шапки), правка наименования (`organization_name_original_value`, `organization_name_modified`); результат проверок §7 и предупреждения хранятся в `document_issue` как пришли от сервиса, ядро пересчитывает их только после правок. | → `document`, `recognition_job`, `app_user`; ← `column`, `line` | ТЗ 6.2/6.3; FNR01; макет | | `financial_statement_column` | Колонки-периоды формы с датой — нужны для межформенной проверки (1370 на начало года) и гудвилла. **v5.19:** `period_kind` (абсолютная / относительная подпись бланка / без даты), `label_confidence`. | → `meta`; ← `value` | ТЗ 6.3 п.7, 6.7 | -| `financial_statement_line` | Строка формы как в источнике: код (или его сырой текст) и наименование как распознано. **v5.19:** все строки источника — с кодом (`ok`, повторы кода тоже) и без (`unreadable`, `missing`, `detail` — расшифровка под родителем `parent_row_index`); порядок `row_index`, положение `source_ref`, `needs_review` неуверенного кода, подтверждение кода `is_confirmed`. Раскладка экрана — по коду «как на бумаге». | → `meta`; ← `value`, `document_issue.line_ids` | ТЗ 6.2, Прил. 2 | +| `financial_statement_line` | Строка формы как в источнике: код (или его сырой текст) и наименование как распознано. **v5.19:** все строки источника — с кодом (`ok`, повторы кода тоже) и без (`unreadable`, `missing`, `detail` — расшифровка под родителем `parent_row_index`); порядок `row_index` (`NULL` ⇔ строка создана правкой аналитика), положение `source_ref`, `needs_review` неуверенного кода, подтверждение кода `is_confirmed`. Раскладка экрана — по коду «как на бумаге». | → `meta`; ← `value`, `document_issue.line_ids` | ТЗ 6.2, Прил. 2 | | `financial_statement_value` | Число в ячейке (строка × колонка): сумма, уверенность, `is_recognized`, ручная правка с исходным значением. **v5.19:** подсветка — только `needs_review` (хранится: уверенность, `is_recognized` и §7 сведены сервисом, ядро пересчитывает после правок); `source_text` — сырой текст источника; `is_confirmed` / `confirmed_by/at` — подтверждено без правки. (v5.13 этот флаг убирала как производный.) | → `line`, `column`, `app_user` | ТЗ 6.2, Прил. 2 | -| `document_issue` | **v5.19, новая.** Предупреждение или нарушение §7 документа формы: вид (`warning` / `relation` / `soft`), код и уровень (`error` / `info`), сообщение, привязка к строкам (`line_ids`), колонке и полю шапки, источник (`service` / `core`); для нарушения — соотношение, `expected`, `actual`. Экран показывает их у места. | → `document`, `financial_statement_column` | change `unified-statement-normalization` (design, шаг 8) | +| `document_issue` | **v5.19, новая.** Предупреждение или нарушение §7 документа формы: вид (`warning` / `relation` / `soft`), код и уровень (`error` / `info`), сообщение, привязка к строкам (`line_ids`), колонке (`column_id` или `column_index`) и полю шапки, источник (`service` / `core`); для нарушения — соотношение, `codes`, `expected`, `actual`. Экран показывает их у места. | → `document`, `financial_statement_column` | change `unified-statement-normalization` (design, шаг 8) | ## Часть 07 — Консолидация