From 4a5ecb1d91853f5348dcae37c1d9293ae0ddf219 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Fri, 6 Nov 2026 23:06:23 +0400 Subject: [PATCH] =?UTF-8?q?=D0=95=D0=A5:=20=C2=A714=20=D1=81=D1=80=D0=B5?= =?UTF-8?q?=D0=B7=20=D0=BF=D1=80=D0=B8=20=D0=B2=D0=B5=D1=80=D0=B8=D1=84?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D0=B8,=20DBML=20v5.26=20(version?= =?UTF-8?q?=5Fcard,=20EX=5FSNAPSHOT=5FWRITE,=20=D1=81=D1=82=D0=B0=D1=82?= =?UTF-8?q?=D1=83=D1=81=20=D1=81=D1=80=D0=B5=D0=B7=D0=B0),=20OQ-195?= =?UTF-8?q?=E2=80=A6198=20(#208)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- context/05-domain-rules.md | 52 ++++++++++++++++++++++++++++++++++++ context/07-open-questions.md | 4 +++ context/09-delivery-plan.md | 2 +- model/data-model-v5.26.dbml | 19 ++++++++----- model/entities-v5.26.md | 3 +++ 5 files changed, 73 insertions(+), 7 deletions(-) diff --git a/context/05-domain-rules.md b/context/05-domain-rules.md index a8bd42b..aa147a2 100644 --- a/context/05-domain-rules.md +++ b/context/05-domain-rules.md @@ -1699,6 +1699,58 @@ OQ-92 (пустые «Организация»/«Группа компаний» --- +--- + +## §14. Срез ЕХ при верификации (DOC-274687, DOC-274686, DOC-274685; ЕХ ТЗ 5.2, 6.2–6.4; AURORA-1560 — запись, AURORA-2001 — чтение и архив, AURORA-2002 — переход; ещё не реализовано) + +Срез — неизменяемая самодостаточная заморозка верифицированной версии: его читают и выгружают, когда рабочих таблиц +консолидации уже нет (решение команды 28–29.09.2026). Схема данных — `contracts/ex-payload-v1.schema.json` (генерируется +`scripts/kfo_contract/gen_ex_payload.py`, примеры — `contracts/examples/ex-payload-*.json`). + +1. **Когда.** Один раз — при переходе версии в «Верифицирован», после фиксации ГСК версии (AURORA-2002). Один срез на + версию (`ex_snapshot.source_version_id` уникален; повторная попытка второй срез не пишет). Другие переходы, в том + числе «Отменён», срез не пишут. Срез по монозаёмщику не формируется (первичка хранится без среза). +2. **Номер и связи.** `version_no` — следующий по (ГСК, год, квартал) — уникальный индекс модели; новая ГСК после смены + периметра начинает с 1. Переход в «Верифицирован» уже проверил, что у той же **ГК** за ту же отчётную дату нет + актуального среза (архив прежнего ручной, решение 27.10.2026, Р-35) — поэтому после записи актуальный срез по ГК и + дате ровно один, новый, `status = ACTUAL`. Запись прежний срез в архив **не переводит**; архивным срезам той же ГК и + даты без ссылки ставится `superseded_by_snapshot_id` нового (по ГК, а не ГСК, — чтобы ссылку получил и срез прежней + ГСК); разархивирование ссылку снимает (AURORA-2001). Ключ «ГК × дата» или «ГСК × дата» — вопрос заказчику (OQ-196): + при «ГСК» меняются проверка 2002 и это правило, схема payload — нет. +3. **Состав.** + - `ex_snapshot` — метаданные: ГСК, ГК (на дату), отчётная дата, год, квартал, номер, статус, источник + (`source_version_id` без FK, `source_version_no`), `verified_at`, `written_at`, `written_by` (кто верифицировал); + - `ex_snapshot_member` — по строке на ЮЛ версии (`consolidation_member`) с ИНН и наименованием на момент верификации; + - `ex_snapshot_item`: `primary_document` — по элементу на документ `consolidation_document` (ссылка `document_id`, + `legal_entity_id`, без payload); остальные типы — по одному элементу с payload: `summary_osv`, `vgo_pairs`, + `chess`, `kfo_balance`, `kfo_income`, `corrections`, `version_card`; `goodwill` — только при `goodwill_enabled`; + `other_report` — только при `scenario = CONFIRM`. +4. **Что в payload.** Конверт `{schema_version: "1.0", item_type, units, generated_at, source_version_no, data}`; + `data` — **ответ API экрана рабочей версии на момент верификации, теми же DTO** (сводная ОСВ, таблица корректировок, + шахматка, КФО, гудвилл), без полей редактирования и с тем, что нужно выгрузке xlsx рабочей версии (пробелы и способ + сопоставления свода, строки ОСВ агрегатов, сводка корректировок КФО) — срез выгружается на лету из payload и должен + совпадать с выгрузкой рабочей версии. Шахматка — режим «все счета», пресет каждого правила ББ версии правил и + результирующая таблица; ручной выбор счетов не замораживается. Корректировки — только применённые (`APPLIED`; + `REVOKED` нет, `DRAFT` не пишется). Карточка версии (`version_card`) — участники маршрута с ФИО, решение УОБ, причины + отклонений, состав с ИНН: версия КФО удаляется раньше среза. +5. **Не входят:** строки форм без кода (документ — целиком, ссылкой; решение 17.10.2026), документы, не привязанные к + версии, и документы заменённых файлов, черновики корректировок. +6. **Самодостаточность.** Ссылки допускаются только на то, что живёт не меньше среза: `document`, `legal_entity`, + `related_group`, `company_group`, `app_user`. Id строк ОСВ, правил, корректировок в payload — справочно, для + рендера не нужны; имена и ИНН компаний — внутри DTO. +7. **Суммы и единицы** — как в источнике, строками с двумя знаками, без перевода: ОСВ, агрегаты, шахматка, гудвилл, + корректировки — `rub`; КФО и сравнение с клиентом — `thousand_rub` (§8 «КФО»); карточка — `none`. +8. **Заморозка.** Производные (свод, агрегаты, шахматка, КФО) считаются в последний раз и кладутся в срез; + `kfo_result.is_frozen = true`; верифицированная версия — только чтение, в том числе после архивирования среза. + Срез после записи не меняется; меняются только служебные поля жизненного цикла (статус, ссылка на следующий срез, + отметки data lake). +9. **Сбой записи** не отменяет верификацию и не откатывает фиксацию ГСК (Excel статусно-ролевой модели, 13.10.2026). + Повтор записи — вопрос заказчику (OQ-197); на старте — версия «Верифицирован» без среза считается действующей + верифицированной КФО (блокирует финал следующей версии той же ГК и даты, DOC-274686), а признак «не передана в ЕХ» + вычисляется: `VERIFIED` без `ex_snapshot` с её `source_version_id`. +10. **Аудит** — `EX_SNAPSHOT_WRITE` (раздел `KFO`, `object_type = ex_snapshot`, `after` — номер среза, ГСК, дата, число + элементов по типам). PDF «Консолидированная отчётность» не формируется и не хранится (OQ-39, OQ-198). + --- ## §11. Нормализация форм ББ/ОФР — общая цепочка (scan-gateway и tabular-parser) diff --git a/context/07-open-questions.md b/context/07-open-questions.md index 35c42cc..f08423f 100644 --- a/context/07-open-questions.md +++ b/context/07-open-questions.md @@ -198,3 +198,7 @@ | OQ-192 | Пересчёт КФО: автоматически после каждого изменения (Excel Р-11, Р-23), по кнопке «Рассчитать КФО» с пометкой «устарела» (FNR03) или только при открытии? | DOC-274636 «Расчёт КФО» (черновик), «Что решить», вопрос 16; AURORA-1417 | §8 «КФО» п. 12 | открыт, вопрос заказчику; допущение принято (docs #206): автоматически: чтение пересчитывает устаревший результат, кнопки нет | | OQ-193 | Правило ББ 1 (76.7.1 / 76.7.9) автоматически по DOC-274230: обе суммы — у компании 2 (Кт 76.7.1 − Дт 76.7.9, каскад 1150 → 1450 → 1550), а сторона агрегата §5 устроена «компания 1 — сторона 1». Как переложить правило в seed (стороны, режим)? | DOC-274230 правило 1; `arm-core/api/seed/core/elimination_rules_v1.yaml` | §5 п. 1, §8 «КФО» п. 4 | открыт, задача команды (follow-up AURORA-1546); до решения правило 1 — `manual`, только корректировкой | | OQ-194 | КФО при неполном комплекте документов (обязательный комплект и проверки перед расчётом отложены, Excel В-01, В-08): считать по тому, что подтверждено и привязано, с предупреждением, или не считать, пока комплект не полон? | DOC-274636 «Расчёт КФО» (черновик), «Что решить», допущение 17 | §8 «КФО» п. 2 | открыт, вопрос заказчику; допущение принято (docs #206): считать, у компании без формы — нули и `FORM_MISSING` | +| OQ-195 | Кто переводит прежний срез ЕХ в архив: вручную до верификации новой версии (Excel статусно-ролевой модели, Р-35) или автоматически при записи нового среза (ЕХ ТЗ 6.4)? | DOC-274686 «Версии и прошлые периоды», вопрос 1; AURORA-1397 | §14 п. 2 | открыт, вопрос заказчику (аналитик — AURORA-1397); допущение принято (docs #208): вручную, запись нового среза прежний не архивирует | +| OQ-196 | Ключ «того же периода» для одного актуального среза и блокировки верификации: ГК × дата (решения Excel Р-35/Р-36) или ГСК × дата (ЕХ ТЗ 6.2, 6.4)? | DOC-274686, вопрос 2; AURORA-1397 | §14 п. 2; AURORA-2002 | открыт, вопрос заказчику; допущение: ГК × дата для «один актуальный» и `superseded_by_snapshot_id`, нумерация — по ГСК (индекс модели) | +| OQ-197 | Срез при верификации не записался: повторять запись с признаком «не передана в ЕХ», делать верификацию и запись одной операцией или не повторять? | DOC-274687, вопрос 6; Excel 13.10.2026 («механизм повторной передачи не определён») | §14 п. 9 | открыт, вопрос заказчику; допущение: верификация остаётся, признак вычисляется (VERIFIED без среза), такая версия блокирует финал следующей | +| OQ-198 | Нужен ли PDF «Консолидированная отчётность» в ЕХ (макет [83-01]) и что в нём? | DOC-274687, вопрос 2; макет [83-01]; ЕХ ТЗ 6.7.3 | §14 п. 10 | открыт, вопрос заказчику (продолжение OQ-39); допущение: не формируется и не хранится, xlsx — из payload на лету | diff --git a/context/09-delivery-plan.md b/context/09-delivery-plan.md index 45d1f81..4365519 100644 --- a/context/09-delivery-plan.md +++ b/context/09-delivery-plan.md @@ -284,7 +284,7 @@ DATA_CORRECTION, истечение блокировки, `period_check`, пор ## Срез 7 — Маршрут согласования, ЕХ, журнал, выгрузки - Полная машина статусов §9.1 с `consolidation_status_history`, policy по ролям/филиалам; № и дата УОБ; новая версия. -- `VERIFIED` → `ex_snapshot/_member/_item` (payload по схеме `docs/contracts/ex-payload-v1.schema.json`); read-only. +- `VERIFIED` → `ex_snapshot/_member/_item` (payload по схеме `docs/contracts/ex-payload-v1.schema.json`, правила — `05-domain-rules.md` §14); read-only. - ЛК ЕХ: дерево ГК → ГСК → организации, просмотр payload, скачивание первички, выгрузка xlsx на лету. - Журнал действий: экран с фильтрами по разделам/объектам/полям. - Экспорт: настраиваемые колонки, `audit_event(EXPORT)`, S3 `exports/` 7 дней. diff --git a/model/data-model-v5.26.dbml b/model/data-model-v5.26.dbml index 96cbd50..fb9ba58 100644 --- a/model/data-model-v5.26.dbml +++ b/model/data-model-v5.26.dbml @@ -21,8 +21,14 @@ // 5. kfo_result_line: пояснения приведены к §8 «КФО» (единицы — тыс. руб.; eliminated_auto / eliminated_manual — от // агрегатов без / с корректировкой, по одному агрегату не складываются; goodwill_adjust — у GOODWILL и итогов; // consolidated_amount = sum − vgo + goodwill_adjust). Структура не меняется. -// Миграция: новые колонки nullable, значение enum; откат удаляет колонки, KFO_EDIT при наличии событий не -// откатывается (как FILE_REPROCESS в v5.21). +// 6. ex_snapshot_item.item_type: + version_card — карточка версии на дату верификации (участники маршрута с ФИО, решение +// УОБ, обоснования, состав); payload — конверт contracts/ex-payload-v1.schema.json (у primary_document — null), +// payload_schema_version = "1.0" (RSHB/arm-ka-docs#208, AURORA-1560; context/05-domain-rules.md §14). +// 7. audit_action: + EX_SNAPSHOT_WRITE — запись среза ЕХ при «Верифицирован», раздел KFO. +// 8. ex_snapshot.status: пояснение под ручной архив (решение 27.10.2026) — ACTUAL «не архивирован», а не «последняя +// верифицированная»; запись среза прежний в архив не переводит. Структура не меняется. +// Миграция: новые колонки nullable, значения enum (KFO_EDIT — AURORA-1546, EX_SNAPSHOT_WRITE — AURORA-1560); откат +// удаляет колонки, значения enum при наличии событий не откатываются (как FILE_REPROCESS в v5.21). // // v5.24 (AURORA-1751/1540/1541, RSHB/arm-ka-docs#196; одна миграция arm-core, уже слита main): // 1. Новая таблица vgo_assignment: ручное решение аналитика по строке сводной ОСВ сверх автоматического разнесения @@ -537,6 +543,7 @@ Enum audit_action { CORRECTION_EDIT CORRECTION_REVOKE GOODWILL_EDIT + EX_SNAPSHOT_WRITE [note: 'v5.26: запись среза ЕХ при «Верифицирован» (§14); раздел KFO, object_type = ex_snapshot'] KFO_EDIT [note: 'v5.26: ручные поля КФО — комментарии строк, обоснование порога, причины отклонений от Методики; раздел KFO'] EXPORT DIRECTORY_IMPORT @@ -1546,7 +1553,7 @@ Table ex_snapshot { year smallint [not null] quarter period_quarter [not null] version_no int [not null] - status ex_snapshot_status [not null, note: 'ACTUAL — последняя верифицированная; предыдущие → ARCHIVE'] + status ex_snapshot_status [not null, note: 'v5.26: ACTUAL — не архивирован; ARCHIVE — архивирован пользователем в ЕХ (ручной архив, решение 27.10.2026); запись нового среза прежний не архивирует (§14)'] source_version_id uuid [not null, unique, note: 'v5.12: id consolidation_version-источника БЕЗ FK — источник удаляется по сроку, срез нет'] source_version_no int [not null] superseded_by_snapshot_id uuid [ref: > ex_snapshot.id, note: 'v5.12: для ARCHIVE — ссылка на актуальный срез, который его заместил'] @@ -1586,11 +1593,11 @@ Table ex_snapshot_member { Table ex_snapshot_item { id uuid [pk] ex_snapshot_id uuid [not null, ref: > ex_snapshot.id] - item_type varchar [not null, note: 'primary_document | summary_osv | vgo_pairs | chess | kfo_balance | kfo_income | goodwill | corrections | other_report'] + item_type varchar [not null, note: 'primary_document | summary_osv | vgo_pairs | chess | kfo_balance | kfo_income | goodwill | corrections | other_report | version_card (v5.26)'] legal_entity_id uuid [ref: > legal_entity.id, note: 'для первички — организация'] document_id uuid [ref: > document.id, note: 'v5.13: только для primary_document — исходники хранятся весь срок, FK допустим; «Скачать» — через document.stored_file → s3_object'] - payload jsonb [note: 'v5.12 DECISION-5: замороженные данные для всех остальных типов; самодостаточно, без ссылок на таблицы консолидации'] - payload_schema_version varchar + payload jsonb [note: 'v5.12 DECISION-5: замороженные данные для всех остальных типов; самодостаточно, без ссылок на таблицы консолидации; v5.26: конверт contracts/ex-payload-v1.schema.json, у primary_document — null'] + payload_schema_version varchar [note: 'v5.26: "1.0" — версия схемы ex-payload; у primary_document — null'] Indexes { (ex_snapshot_id, item_type) } Note: 'Состав среза: primary_document → document; всё остальное → payload. «Просмотр» в ЛК ЕХ рендерит payload по схеме; «Выгрузка» собирает xlsx из payload на лету' } diff --git a/model/entities-v5.26.md b/model/entities-v5.26.md index acd0dd6..c289550 100644 --- a/model/entities-v5.26.md +++ b/model/entities-v5.26.md @@ -13,6 +13,9 @@ | 3 | `audit_action` + `KFO_EDIT` | Сохранение ручных полей КФО (комментарии строк, обоснование порога, причины отклонений от Методики) — раздел `KFO`; подходящего действия не было | | 4 | `elimination_rule.elimination_mode` — значение `min_or_full` | Правило ББ 2 по DOC-274230: `min` при обеих сторонах, сторона 1 при пустой стороне 2, без порога 5 %; строки ДО — каскадом 1310 → 1350 → 1370. Поле varchar — схема не меняется; seed v1 правится на месте в AURORA-1546 | | 5 | Пояснения `kfo_result_line`, `kfo_result` | Приведены к §8 «КФО»: всё в тыс. руб.; корректировка агрегата заменяет его автосумму (`eliminated_auto` и `eliminated_manual` по одному агрегату не складываются); `GOODWILL` — служебная строка раздела I, входит в 1100/1600 | +| 6 | `ex_snapshot_item.item_type` + `version_card`; payload — по `contracts/ex-payload-v1.schema.json` | Карточка версии (участники маршрута с ФИО, решение УОБ, обоснования, состав) — элементом среза, а не колонками `ex_snapshot`: версия КФО удаляется раньше среза, а схему таблицы не трогаем. Схема payload — конверт и данные по каждому типу (`context/05-domain-rules.md` §14; docs #208) | +| 7 | `audit_action` + `EX_SNAPSHOT_WRITE` | Запись среза при «Верифицирован» — раздел `KFO` (раздела `EX` нет) | +| 8 | Пояснение `ex_snapshot.status` | Архив прежнего среза ручной (решение 27.10.2026): `ACTUAL` — «не архивирован», а не «последняя верифицированная» | Остальные таблицы и enum — как в v5.24.