ЕХ: §14 срез при верификации, DBML v5.26 (version_card, EX_SNAPSHOT_WRITE, статус среза), OQ-195…198 (#208)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
013f7b673a
commit
4a5ecb1d91
@ -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)
|
## §11. Нормализация форм ББ/ОФР — общая цепочка (scan-gateway и tabular-parser)
|
||||||
|
|||||||
@ -198,3 +198,7 @@
|
|||||||
| OQ-192 | Пересчёт КФО: автоматически после каждого изменения (Excel Р-11, Р-23), по кнопке «Рассчитать КФО» с пометкой «устарела» (FNR03) или только при открытии? | DOC-274636 «Расчёт КФО» (черновик), «Что решить», вопрос 16; AURORA-1417 | §8 «КФО» п. 12 | открыт, вопрос заказчику; допущение принято (docs #206): автоматически: чтение пересчитывает устаревший результат, кнопки нет |
|
| 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-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-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 на лету |
|
||||||
|
|||||||
@ -284,7 +284,7 @@ DATA_CORRECTION, истечение блокировки, `period_check`, пор
|
|||||||
## Срез 7 — Маршрут согласования, ЕХ, журнал, выгрузки
|
## Срез 7 — Маршрут согласования, ЕХ, журнал, выгрузки
|
||||||
|
|
||||||
- Полная машина статусов §9.1 с `consolidation_status_history`, policy по ролям/филиалам; № и дата УОБ; новая версия.
|
- Полная машина статусов §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 на лету.
|
- ЛК ЕХ: дерево ГК → ГСК → организации, просмотр payload, скачивание первички, выгрузка xlsx на лету.
|
||||||
- Журнал действий: экран с фильтрами по разделам/объектам/полям.
|
- Журнал действий: экран с фильтрами по разделам/объектам/полям.
|
||||||
- Экспорт: настраиваемые колонки, `audit_event(EXPORT)`, S3 `exports/` 7 дней.
|
- Экспорт: настраиваемые колонки, `audit_event(EXPORT)`, S3 `exports/` 7 дней.
|
||||||
|
|||||||
@ -21,8 +21,14 @@
|
|||||||
// 5. kfo_result_line: пояснения приведены к §8 «КФО» (единицы — тыс. руб.; eliminated_auto / eliminated_manual — от
|
// 5. kfo_result_line: пояснения приведены к §8 «КФО» (единицы — тыс. руб.; eliminated_auto / eliminated_manual — от
|
||||||
// агрегатов без / с корректировкой, по одному агрегату не складываются; goodwill_adjust — у GOODWILL и итогов;
|
// агрегатов без / с корректировкой, по одному агрегату не складываются; goodwill_adjust — у GOODWILL и итогов;
|
||||||
// consolidated_amount = sum − vgo + goodwill_adjust). Структура не меняется.
|
// consolidated_amount = sum − vgo + goodwill_adjust). Структура не меняется.
|
||||||
// Миграция: новые колонки nullable, значение enum; откат удаляет колонки, KFO_EDIT при наличии событий не
|
// 6. ex_snapshot_item.item_type: + version_card — карточка версии на дату верификации (участники маршрута с ФИО, решение
|
||||||
// откатывается (как FILE_REPROCESS в v5.21).
|
// УОБ, обоснования, состав); 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):
|
// v5.24 (AURORA-1751/1540/1541, RSHB/arm-ka-docs#196; одна миграция arm-core, уже слита main):
|
||||||
// 1. Новая таблица vgo_assignment: ручное решение аналитика по строке сводной ОСВ сверх автоматического разнесения
|
// 1. Новая таблица vgo_assignment: ручное решение аналитика по строке сводной ОСВ сверх автоматического разнесения
|
||||||
@ -537,6 +543,7 @@ Enum audit_action {
|
|||||||
CORRECTION_EDIT
|
CORRECTION_EDIT
|
||||||
CORRECTION_REVOKE
|
CORRECTION_REVOKE
|
||||||
GOODWILL_EDIT
|
GOODWILL_EDIT
|
||||||
|
EX_SNAPSHOT_WRITE [note: 'v5.26: запись среза ЕХ при «Верифицирован» (§14); раздел KFO, object_type = ex_snapshot']
|
||||||
KFO_EDIT [note: 'v5.26: ручные поля КФО — комментарии строк, обоснование порога, причины отклонений от Методики; раздел KFO']
|
KFO_EDIT [note: 'v5.26: ручные поля КФО — комментарии строк, обоснование порога, причины отклонений от Методики; раздел KFO']
|
||||||
EXPORT
|
EXPORT
|
||||||
DIRECTORY_IMPORT
|
DIRECTORY_IMPORT
|
||||||
@ -1546,7 +1553,7 @@ Table ex_snapshot {
|
|||||||
year smallint [not null]
|
year smallint [not null]
|
||||||
quarter period_quarter [not null]
|
quarter period_quarter [not null]
|
||||||
version_no int [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_id uuid [not null, unique, note: 'v5.12: id consolidation_version-источника БЕЗ FK — источник удаляется по сроку, срез нет']
|
||||||
source_version_no int [not null]
|
source_version_no int [not null]
|
||||||
superseded_by_snapshot_id uuid [ref: > ex_snapshot.id, note: 'v5.12: для ARCHIVE — ссылка на актуальный срез, который его заместил']
|
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 {
|
Table ex_snapshot_item {
|
||||||
id uuid [pk]
|
id uuid [pk]
|
||||||
ex_snapshot_id uuid [not null, ref: > ex_snapshot.id]
|
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: 'для первички — организация']
|
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']
|
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 jsonb [note: 'v5.12 DECISION-5: замороженные данные для всех остальных типов; самодостаточно, без ссылок на таблицы консолидации; v5.26: конверт contracts/ex-payload-v1.schema.json, у primary_document — null']
|
||||||
payload_schema_version varchar
|
payload_schema_version varchar [note: 'v5.26: "1.0" — версия схемы ex-payload; у primary_document — null']
|
||||||
Indexes { (ex_snapshot_id, item_type) }
|
Indexes { (ex_snapshot_id, item_type) }
|
||||||
Note: 'Состав среза: primary_document → document; всё остальное → payload. «Просмотр» в ЛК ЕХ рендерит payload по схеме; «Выгрузка» собирает xlsx из payload на лету'
|
Note: 'Состав среза: primary_document → document; всё остальное → payload. «Просмотр» в ЛК ЕХ рендерит payload по схеме; «Выгрузка» собирает xlsx из payload на лету'
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,6 +13,9 @@
|
|||||||
| 3 | `audit_action` + `KFO_EDIT` | Сохранение ручных полей КФО (комментарии строк, обоснование порога, причины отклонений от Методики) — раздел `KFO`; подходящего действия не было |
|
| 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 |
|
| 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 |
|
| 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.
|
Остальные таблицы и enum — как в v5.24.
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user