arm-ka-docs/model/entities-v5.19.md
Andrey Epifancev ecc789667f model: DBML v5.19 — строки форм со статусами, needs_review, document_issue, crm_id ГСК/ГСЗ (#116)
- financial_statement_line: снята уникальность (meta_id, line_code); row_index, source_ref (частичный
  уникальный индекс), line_status (enum statement_line_status), line_code_text, parent_row_index,
  needs_review, is_confirmed
- financial_statement_value: source_text, needs_review (хранится — пересмотр п. 4 v5.13), is_confirmed,
  confirmed_by/at; financial_statement_column: period_kind, label_confidence;
  financial_statement_meta: form_variant (enum statement_form_variant), needs_review_fields
- новая таблица document_issue + enum document_issue_kind, issue_severity, issue_source
- recognition_job.statements_version; document: file_ordinal, уникальность типа на файл — только не для
  BALANCE/INCOME (Р-10); related_group.crm_id (arm-core#112)
- changelog и правила заполнения миграции в шапке; entities-v5.19.md; диаграммы части 01, 04, 06
  (document_issue — в части 06); ссылки на текущую модель и DBML в Makefile — v5.19

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

45 KiB
Raw Blame History

АРМ КА — описание сущностей модели данных v5.19

Источник истины по структуре — data-model-v5.19.dbml (полный). Диаграммы по частям — diagrams/ (part01…09 svg/png; перерисовываются make diagrams из текущего DBML). Здесь — что каждая таблица значит для бизнеса, как связана с соседями и откуда взялась.

Что изменилось в v5.19 (решения владельца 17.10.2026, Р-1…Р-19; RSHB/arm-ka-docs#116)

Change openspec/changes/unified-statement-normalization: формы ББ/ОФР нормализуются общим кодом сервисов, контракт результата v2.0; ядро хранит результат как пришёл (context/05-domain-rules.md §11, §9.3, §9.5).

№ Изменение Решение
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) нужны экрану, чтобы показать строку и предупреждение у места
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 сервиса сохраняются, кроме снимаемых правкой
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) в файле.

Что изменилось в v5.18 (решения владельца 09.10.2026, RSHB/arm-ka-docs#90)

№ Изменение Решение
1 stored_file.consolidation_id (uuid, nullable, FK → consolidation) + индекс (legal_entity_id, consolidation_id) Файл загружается в консолидацию (период ГК) и становится основой её «рабочего стола» (полный состав стола — context/05-domain-rules.md §9.5 п. 11), общего для всех версий периода; NULL — загрузка без контекста (страница ЮЛ, монозаёмщики, API). Панель «Первичные документы» в версии показывает рабочий стол консоли для ЮЛ плюс файлы с документами, привязанными к версиям консоли. Что использует конкретная версия — по-прежнему consolidation_document; заморозка после VERIFIED — привязки и ex_snapshot. Привязка файла к версии (consolidation_file) отвергнута: рабочие версии периода делят первичку, а новая версия после VERIFIED подхватывает подтверждённое (openspec/changes/console-files/design.md)
2 Note recognition_job.reply_deadline Без изменения структуры: срок ответа OCR — 20 мин (OQ-159)

Остальные таблицы и enum — как в v5.17. Реализация — миграция 0006 в arm-core (backfill consolidation_id по consolidation_document).

Что изменилось в v5.17 (решение владельца 07.10.2026, пересмотр OQ-31, RSHB/arm-ka-docs#53)

№ Изменение Решение
1 legal_entity.kpp и legal_entity_history.kpp (varchar, nullable) КПП юридического лица нужен (макет: колонка «КПП» на экранах 50, 61, поле форм 51-02, 79; фронтенд: «в ручке получения ЮЛ не приходит КПП»). Формат — 9 символов: 4 цифры, 2 символа (цифра или латинская A–Z), 3 цифры, иначе INVALID_KPP. У ИП (entity_type = ИП) КПП запрещён. Для ЮЛ необязателен: существующие записи и импорт без колонки остаются валидными. Уникален по-прежнему только inn (КПП — атрибут; сопоставление контрагентов ОСВ по ИНН не меняется). Изменение КПП — обычная правка со снимком в legal_entity_history. Отменяет п. 2 v5.14 («КПП не вводится»)

Остальные таблицы и enum — как в v5.16. Реализация — миграция 0005 в arm-core.

Что изменилось в v5.16 (Срез 4, решения владельца 06.10.2026)

№ Изменение Решение
1 Enum counterparty_match_kind (INN, NAME, ALIAS, MANUAL, PROPAGATED) и колонка osv_entry.counterparty_match_kind (nullable) Способ сопоставления контрагента строки ОСВ хранится. NULL ⇔ counterparty_id NULL; INN / NAME / ALIAS — шаг автоматического резолва при маппинге (ИНН; точное имя; нормализованное имя ЮЛ или алиас); MANUAL — ручное сопоставление аналитиком; PROPAGATED — автоприменение по имени в версии (DOC-221278 п. 12–13). Вычислять на чтение нельзя: после ручного связывания появляется алиас, и ручное сопоставление неотличимо от ALIAS. Миграция 0004 заполняет колонку по уже смапленным строкам (ИНН без пробелов = legal_entity.inn → INN; trim(name) = legal_entity.name → NAME; остальные с counterparty_id → ALIAS — приближение: ручных сопоставлений до Среза 4 не было)
2 Семантика consolidation_document Без изменения структуры: строка создаётся при подтверждении документа (по документам ЮЛ — членов периметра версий «в работе») и при добавлении ЮЛ в периметр (подтверждённые подходящие документы подхватываются); удаляется при замене/удалении файла и исключении ЮЛ из периметра. Для одной (ЮЛ, document_type, osv_account_code, период, признак нарастающего) привязан один документ — самый поздний confirmed_at (D-5 Среза 4)
3 Семантика consolidation_lock Без изменения структуры: блокировка без истечения по времени — активна, пока её не снял владелец, администратор или не перехватил другой пользователь с CONSOLIDATION_EDIT по причине (OQ-119)

Пробелы квартальной склейки и сама сводная ОСВ по-прежнему не хранятся (DECISION-5). Остальные таблицы и enum — как в v5.15 (43 таблицы; enum — 28). Реализация — миграция 0004 в arm-core.

Что изменилось в v5.15 (Срез 2c, решения владельца 05.10.2026)

№ Изменение Решение
1 osv_data_type + NU (после BU) Строки налогового учёта из ОСВ «БУ, НУ» хранятся в osv_entry как есть (OQ-45); контракт результата допускал NU с v1.0, ядро раньше такой строки принять не могло
2 app_user.email — в нижнем регистре Без изменения структуры: нормализация при записи (seed, администрирование), поиск по lower(email) сохраняется, уникальность — существующий UNIQUE по email (OQ-59). Expression-индекс lower(email) не вводится: сверка ORM↔DBML не умеет expression-индексы. Миграция 0003 приводит существующие email к нижнему регистру (при дублях по регистру — падает, слияние решает человек)
3 Семантика stored_file.status, recognition_job.group_schema Без изменения структуры: PROCESSING ставит inbox по ack сервиса, PROCESSED/ERROR — цикл маппинга результата (OQ-67); маппинг выполняется отдельно от inbox (OQ-69); group_schema заполняет маппер; «Итого» в osv_entry не хранится (OQ-01)
4 Индексы osv_entry (parent_entry_id), osv_entry (recognition_job_id), stored_file (current_recognition_job_id) Индексы для удаления файла и обхода дерева строк: без них проверки FK (в том числе self-FK parent_entry_id) при DELETE /files/{id} и очистке файла перед повторным маппингом шли seq scan'ом. Замер: DELETE документа 1000 строк 8,6 с → 16 мс на 200 тыс. строк. Обычные (не unique) индексы; закрывает OQ-117 (I-1 финального ревью Среза 2c)

Остальные таблицы и enum — как в v5.14 (43 таблицы, 27 enum). Реализация — миграция 0003 в arm-core.

Что изменилось в v5.14 (Срез 1, решения владельца 04.10.2026)

№ Изменение Решение
1 related_group_member.kind + индекс (legal_entity_id, kind) WHERE is_current ЮЛ состоит одновременно в одной ГСК и одной ГСЗ (но только в одной группе каждого вида). Отменяет ANL-030 / v5.8 («только в одной ГСК или ГСЗ»). kind — денормализация related_group.kind (равенство проверяет ядро при записи, тест на рассинхрон); индекс не выразить через join, триггер не выбран. Закрывает OQ-32
2 КПП Не вводится (отменено в v5.17: КПП введён). Поле есть только в макете; у legal_entity его нет, импорт его не читает (закрывал OQ-31 до v5.17)
3 Семантика company_group.crm_id, base_regional_office_id Без изменения структуры: crm_id = «iD ГК» выгрузки ЕЦП CRM, base_regional_office_id = «Базовый РФ ГК в CRM»; флаги «входит в ГСК/ГСЗ» выгрузки → членство в одной неявной ГСК/ГСЗ на ГК (правила — 05-domain-rules.md §13)
4 audit_action + LEGAL_ENTITY_CHANGE, USER_CHANGE Журнал изменений ЮЛ (создание/изменение/закрытие/перевод, алиасы) и пользователей (создание/деактивация администратором) — ТЗ 8.2; в v5.13 для них не было действия (были GROUP_CHANGE, MEMBERSHIP_CHANGE, USER_ROLE_CHANGE)

Остальные таблицы и enum — как в v5.13 (43 таблицы). Реализация — миграция 0002 в arm-core.

Что изменилось в v5.13 (ревью 30.09–01.10)

№ Замечание Решение
1 Вместо RBAC «в коде» — роли и права permission + role_permission возвращены; права только через роли, прямых назначений пользователю нет. Исключения — заведением роли
2 osv_entry.parent_entry_id не нужен — храним только строки с контрагентами Отложено. Открыт вопрос: хранить ли строки уровня ACCOUNT для сверки «Σ контрагентов = итог счёта»; аналитика «Парсинг ОСВ» п.11 пока говорит «все строки»
3 osv_group_schema не особо нужна Убрана. Схема шапки — recognition_job.group_schema jsonb; тип строки — osv_entry.group_type
4 financial_statement_value.needs_review непонятен Убран: производное от confidence / is_recognized, порог может меняться
5 В recognition_job не нужны и result, и raw_result Оставлен только result_s3_object_id. Сырой ответ ИС Сканирование — S3 raw/{job_id}.json по конвенции, в БД не регистрируется
6 stored_file.fields_modified — что это Счётчик «исправлено полей» с карточки документа (v5.7). Убран — COUNT(is_modified) по данным
6-бис document_type не предусматривает несколько ОСВ или ББ+ОФР в одном файле Разделение файл / документ: stored_file — физический файл, document — логическая единица (1:N). Чек-лист, проверки, подтверждение, FK разобранных данных, consolidation_document, ex_snapshot_item — на document. Замена (superseded_by) — файл целиком
7 file_type: убрать Р7 Убран. xls/xlsx/xlsb → tabular-parser, pdf/png/jpg → scan-gateway

Принципы модели (коротко):

  • Первичка не редактируется: файлы и распознанные значения хранятся как пришли; правки аналитика — рядом (is_modified, original_*) и в аудите.
  • Производные консолидации в работе (сводная ОСВ, пары ВГО, шахматка) не хранятся — считаются запросом. Хранятся только ручные решения (корректировки, гудвилл, подтверждение КФО клиента).
  • При верификации всё замораживается в Единое хранилище (ЕХ) как самодостаточный срез, который не зависит от таблиц консолидации.
  • Единственный писатель в БД — ядро arm-core; сервисы распознавания видят только NATS и S3.
  • Права — данные (role_permission), ограничения по ЗО/филиалу/статусу — policy-слой поверх прав.

Часть 01 — Группы компаний, организации, филиалы

Сущность Что это Ключевые связи Откуда
regional_office Филиал банка: головной офис (ГО, is_head_office) и региональные филиалы (РФ). Определяет зону видимости пользователя и закрепление ГК. ← company_group.base_regional_office_id, legal_entity.regional_office_id, app_user.regional_office_id ТЗ 8.1
company_group Группа компаний (ГК) — верхний уровень справочника клиентов. Текущее состояние (SCD4). crm_id = «iD ГК» из ЕЦП CRM (NULL, если создана вручную Куратором; v5.14 — семантика по выгрузке), внутренний code, закрепление за филиалом (base_regional_office_id = «Базовый РФ ГК в CRM»), флаг архива. → regional_office; ← legal_entity, related_group, consolidation ТЗ 6.1, Прил. 2; макет
company_group_history Прошлые снимки ГК: каждое изменение — новая строка с valid_from/valid_to. → company_group ТЗ 6.10, 8.2
legal_entity Юридическое лицо / ИП. Натуральный ключ — ИНН; v5.17: kpp — КПП (9 символов, nullable, только у ЮЛ, не ключ). company_group_id = текущая ГК; NULL = монозаёмщик. close_date — закрыто/архивировано. → company_group, regional_office; ← related_group_member, stored_file, document, osv_entry.counterparty_id, consolidation_member ТЗ 6.1, Прил. 2; ЕХ 6.1
legal_entity_history Прошлые снимки ЮЛ + вид события (создание, изменение, переход в другую ГК, закрытие, вывод из ГК) и дата вступления в силу. → legal_entity ТЗ 8.2; макет
legal_entity_alias Словарь написаний контрагента: как имя встречается в ОСВ и нормализованный ключ для матчинга. Пополняется при ручном сопоставлении. → legal_entity ТЗ 6.5
related_group ГСК или ГСЗ внутри ГК; kind различает. Для ГСК формируется КФО. Иерархия не поддерживается. v5.19: crm_id — ID группы в ЕЦП CRM (вручную, уникален). → company_group; ← related_group_member, consolidation.related_group_id ТЗ 6.1, Прил. 2
related_group_member Состав ГСК/ГСЗ — история членства (SCD2). v5.14: ЮЛ может одновременно входить в одну ГСК и одну ГСЗ (не более одной группы каждого вида): колонка kind = related_group.kind (денормализация) и частичный уникальный индекс (legal_entity_id, kind) WHERE is_current. Решение владельца 04.10.2026, отменяет ANL-030. → related_group, legal_entity ТЗ 6.1; макет [79]

Часть 02 — Пользователи, роли, права

Сущность Что это Ключевые связи Откуда
app_user Пользователь АРМ. Аутентификация внешняя (РАИСА/SSO, external_id). Филиал (ГО/РФ), зона ответственности (ДКБ/ДМСБ/ДМ), табельный номер. Видимость данных = права роли + филиал + ЗО. → regional_office; ← user_role, все *_by поля ТЗ 8.1, Прил. 2
role Роли: seed из ТЗ 8.1 (КА РФ, КА ГО, РКА, КМ, Куратор ГО, Эксперт, Администратор; is_system) + роли, заведённые администратором для исключений. v5.13: код роли в бизнес-логике не проверяется — только права. ← user_role, role_permission ТЗ 8.1
permission v5.13. Атомарное право «объект × действие»: DIRECTORY/DOCUMENT/CONSOLIDATION/KFO/EX/EXPORT/USERS/AUDIT × VIEW/EDIT/APPROVE/VERIFY/DELETE/EXPORT/ADMIN. Seed, привязан к коду — администратор новые коды не создаёт. Право говорит «может»; policy-слой (ЗО, филиал, статус КФО) — «эту ли и сейчас ли». ← role_permission ТЗ Прил. 2, сноска 29
role_permission v5.13. Матрица доступов как данные: effective_permissions(user) = ∪ permissions(roles(user)). Редактируется администратором на экране «Изменение ролей и прав доступа»; история — audit_event(ROLE_PERMISSION_CHANGE). Прямых прав у пользователя нет. → role, permission ТЗ Прил. 2; макет
user_role Назначение ролей пользователю (M:N). История — в аудите. → app_user, role ТЗ 8.1

Часть 03 — Бухгалтерские справочники и правила

Сущность Что это Ключевые связи Откуда
chart_of_account План счетов с иерархией, тип A/P/AP, признак забалансового. Seed — полный план 1С; нестандартные субсчета клиентов добавляет администратор. ← osv_entry.account_id, elimination_rule_account, required_document_rule ТЗ 6.2/6.5, Прил. 3/4
elimination_rule Правило элиминации из Прил. 3 (ББ) / Прил. 4 (ОФР) как данные: пара статей, сторона, мера, режим, НДС, акцизы. Версионируется. ← elimination_rule_account, correction.rule_id; версия фиксируется в consolidation_version ТЗ 6.4, Прил. 3/4
elimination_rule_account Счета/субсчета каждой стороны правила, включая исключения («76 кроме 76.7.1»). → elimination_rule, chart_of_account ТЗ Прил. 3/4
required_document_rule Какие документы обязательны по подходу. v5.13: сверяется с document (тип + счёт + период), а не с файлом: выполнено = есть document CONFIRMED у каждого ЮЛ периметра. → chart_of_account ТЗ 5.1, 6.2, сноска 12

Часть 04 — Файлы, документы, S3, задания распознавания

Сущность Что это Ключевые связи Откуда
s3_object Реестр всех объектов в S3: бакет-роль, ключ, размер, sha256, срок жизни, ссылка на архив в data lake. Единая точка ретеншна (5 лет по ТЗ 8.4) и дедупа. ← stored_file, recognition_job ТЗ 6.2, 8.4; ЕХ 8.3
stored_file v5.13: только физический файл одной загрузки: чей (ЮЛ), формат, hash, кто/когда загрузил, статус обработки (UPLOADED → PROCESSING → PROCESSED / ERROR / SUPERSEDED), версия при замене. v5.18: consolidation_id — консолидация, в контексте которой файл загружен (основа «рабочего стола консоли», общего для версий периода; полный состав — context/05-domain-rules.md §9.5 п. 11; NULL — без контекста). Что внутри файла — document. Замена — файл целиком со всеми документами. → legal_entity, consolidation, s3_object, recognition_job; ← document, recognition_job ТЗ 6.2, 8.2; UC-01…05
document v5.13, новая. Логический документ внутри файла: ББ, ОФР, ОСВ по счёту (osv_account_code), расшифровка, прочее. Период, отчётная дата, где в файле (locator: лист / страницы), статус проверки (RECOGNIZED / NEEDS_CHECK / CONFIRMED / ERROR), результаты проверок периода и контрагента, кто подтвердил. Один файл → N документов (PDF с ББ+ОФР; xlsx с несколькими ОСВ). Создаёт ядро при маппинге результата recognition_job. На документ ссылаются разобранные данные, чек-лист, консолидация и ЕХ. v5.19: file_ordinal — номер документа в результате; формы ББ/ОФР одного типа в файле могут повторяться (ОСВ по счёту, расшифровка, прочий — один на тип); предупреждения и нарушения — document_issue. → stored_file, legal_entity, app_user; ← osv_entry, financial_statement_meta, document_issue, consolidation_document, ex_snapshot_item ТЗ 6.2, 5.1, 8.2; макет (чек-лист, «Подтвердить данные»)
recognition_job Одна попытка распознать/распарсить файл. Единственная точка обмена с NATS (outbox/inbox, дедуп по result_msg_id, DLQ). Хранит сервис и версию, одну ссылку на нормализованный JSON-результат в S3 (v5.13), метрики, и схему группировок шапки ОСВ по листам (group_schema jsonb, v5.13 — вместо osv_group_schema). v5.19: statements_version — версия копии общего кода нормализации, которой посчитан результат форм. → stored_file, s3_object; ← osv_entry, financial_statement_meta ТЗ 6.2, 6.10; DECISION-4

Часть 05 — Разобранные ОСВ

Сущность Что это Ключевые связи Откуда
osv_entry Строка ОСВ: документ (счёт + период), владелец, тип строки по схеме шапки (group_type, v5.13), уровень и родитель (parent_entry_id — открыт вопрос, замечание 2), код счёта и резолв в план счетов, сырое имя/ИНН контрагента, резолв в ЮЛ и способ сопоставления (counterparty_match_kind, v5.16), шесть сумм, тип данных (БУ/валюта/кол-во), «подакцизный» для 90-го. Ручные правки: is_modified, original_values, modified_by. Признак ГСК/ГК/Внешний не хранится — выводится из периметра версии; способ сопоставления контрагента хранится (NULL ⇔ контрагент не сопоставлен). → document, recognition_job, legal_entity ×2, chart_of_account ТЗ 6.2/6.5, Прил. 2; «Парсинг ОСВ»

Часть 06 — Распознанные формы ББ/ОФР

Сущность Что это Ключевые связи Откуда
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_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_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)

Часть 07 — Консолидация

Сущность Что это Ключевые связи Откуда
consolidation Логическая консолидация: ГК + отчётный период. ГСК фиксируется/создаётся при верификации по фактическому периметру. Уникальна по (ГК, год, квартал). v5.18: файлы, загруженные в консолидацию, — stored_file.consolidation_id (основа рабочего стола, общего для версий периода; полный состав — context/05-domain-rules.md §9.5 п. 11). → company_group, related_group; ← consolidation_version, stored_file ТЗ 6.10, 7.2
consolidation_version Версия консолидации: номер, статус, сценарий, подход, гудвилл, инициатор и его офис (маршрут), кто утвердил / верифицировал, решение УОБ, отклонения от Методики, версия правил элиминации, ссылка на предыдущую. После VERIFIED — read-only. → consolidation, app_user, regional_office, self; ← всё в частях 07–08 ТЗ 5.1, 6.4, 6.10; макет
consolidation_status_history Каждый переход статуса: из → в, кто, когда, комментарий (обязателен при возврате). → consolidation_version, app_user ТЗ 6.10, 8.2
consolidation_lock «Взять в работу»: кто редактирует версию, перехват с причиной (v5.16: без истечения по времени, OQ-119). Из макета — ANL-036. → consolidation_version, app_user макет
consolidation_member Периметр версии — зафиксированный список ЮЛ; is_head_entity для гудвилла. → consolidation_version, legal_entity ТЗ 6.1, 6.10
consolidation_document v5.13: какие документы (не файлы) участвуют в версии. Чек-лист = required_document_rule × периметр − consolidation_document. Переиспользование одного документа в нескольких версиях/периодах, монозаёмщики из ЕХ. → consolidation_version, document ТЗ Прил. 2; ЕХ 7

Не хранятся (DECISION-5), считаются запросом по версии: сводная ОСВ, признак контрагента ГСК/ГК/Внешний, пары ВГО, шахматка, результирующая таблица ВГО.

Часть 08 — Корректировки, гудвилл, результат КФО

Сущность Что это Ключевые связи Откуда
correction Ручная корректировка ВГО: пара (правило + компания 1 + компания 2 — естественный ключ), ББ/ОФР, строки и суммы по Дт и Кт, дочерние строки для распределения, причина, обязательный комментарий, статус, номер версии (история — в аудите). КФО = свод − Σ корректировок. → consolidation_version, elimination_rule, legal_entity ×2, chart_of_account ×2, self ТЗ 6.4, 6.8, Прил. 9
goodwill Строка расчёта гудвилла: головная × дочерняя, доля владения, ФВ по 58.01, УК (1310) и добавочный капитал (1350 — вопрос методологам), гудвилл, «включить в КФО», комментарий. → consolidation_version, legal_entity ×2, app_user ТЗ 6.7, Прил. 3 п.2, Прил. 8
kfo_result Шапка результата КФО: когда посчитан, заморожен ли, ЧА и ВБ, выручка, прибыль, расхождения, пороги, обоснование, итог гудвилла. → consolidation_version (1:1); ← kfo_result_line ТЗ 6.4, 6.8, Прил. 10
kfo_result_line Строка консолидированного ББ/ОФР по коду ФСБУ 4/2023: сумма → авто-элиминация → корректировки → гудвилл → итог; «в т.ч. ВГО», источник, расхождение, комментарий. → kfo_result; ← kfo_result_line_company ТЗ 6.4, Прил. 10; макет
kfo_result_line_company Разрез строки КФО по компаниям периметра: сумма и доля. → kfo_result_line, legal_entity ЕХ 6.6; макет
client_kfo_line Сценарий «подтверждение КФО клиента»: по строке — значение и ВГО от клиента (ручной ввод), значение и ВГО банка, расхождение, причина. → consolidation_version, app_user ТЗ 5.1, 6.10; макет

Часть 09 — Комментарии, аудит, Единое хранилище

Сущность Что это Ключевые связи Откуда
comment Полиморфный комментарий к объекту (документу, ячейке шахматки по ключу пары, строке КФО). → app_user; object_type + object_id без FK ТЗ 6.3/6.4; макет
audit_event Журнал действий (append-only): кто, когда, действие, раздел, объект, версия консолидации, before/after, результат, IP/браузер. Покрывает историю правок распознанных данных, корректировок, выгрузок, импорта справочников, входов, изменений матрицы прав (v5.13), подтверждения документов, изменений ЮЛ и пользователей (v5.14: LEGAL_ENTITY_CHANGE, USER_CHANGE). → app_user, consolidation_version ТЗ 8.2, Прил. 2; макет
ex_snapshot Срез ЕХ: одна ГСК на одну отчётную дату, версия, статус (актуальный/архив), когда и кем верифицирован и записан. Самодостаточен — на консолидацию ссылается только данными. → related_group, company_group, app_user, self; ← member, item ЕХ ТЗ 6.2, 6.4, 5.3
ex_snapshot_member Периметр среза на дату: ЮЛ с ИНН и наименованием на момент верификации. → ex_snapshot, legal_entity ЕХ ТЗ 6.3
ex_snapshot_item Содержимое среза. Два вида: исходный документ → ссылка на document (v5.13; скачать — через его файл) и всё производное → payload jsonb. → ex_snapshot, document, legal_entity ЕХ ТЗ 5.2, 6.7

Как читать модель по сценарию «сформировать КФО»

  1. Справочники (01–03): ГК → ЮЛ → ГСК/ГСЗ; план счетов; правила элиминации; что обязательно загрузить.
  2. Создание консолидации (07): consolidation от ГК + период → consolidation_version → consolidation_member (периметр).
  3. Загрузка (04): stored_file + s3_object → recognition_job (queued → NATS → сервис → результат в S3 → done) → ядро создаёт document на каждый ББ / ОФР / ОСВ по счёту, найденный в файле.
  4. Разбор (05–06): ОСВ → osv_entry; ББ/ОФР → financial_statement_meta/column/line/value. Аналитик проверяет, правит, подтверждает документ; логические проверки — на лету; сопоставляет контрагентов (→ osv_entry.counterparty_id, legal_entity_alias). Чек-лист закрывается по document CONFIRMED.
  5. Консолидация (вычисляется): сводная ОСВ, пары ВГО, шахматка — из osv_entry × периметр × правила. Аналитик вносит correction, заполняет goodwill, при сценарии подтверждения — client_kfo_line. Результат — kfo_result(_line).
  6. Согласование (07): consolidation_status_history по маршруту; блокировка consolidation_lock. Что можно — решает role_permission + policy-слой по статусу/ЗО.
  7. Верификация → ЕХ (09): ex_snapshot + member + item (документы по ссылке, остальное — payload). Версия → read-only. Всё это время — audit_event.

Открытые вопросы после v5.14

  • Замечание 2 (osv_entry.parent_entry_id, какие строки ОСВ хранить) — отложено; затрагивает и аналитику «Парсинг ОСВ» п.11.
  • Замена по-документно (одна ОСВ из файла с пятью) — сейчас не предусмотрена, замена файлом целиком. Если понадобится — superseded_by переезжает в document.
  • Статус document.RECOGNIZED (ручная проверка не требуется по порогу) — подтвердить с аналитиками, нужен ли, или все документы проходят через NEEDS_CHECK → CONFIRMED.