kfo-table-back: vgo_assignment.side и kfo_result.snapshot #228

Merged
aep merged 4 commits from feat/kfo-table-back into main 2026-11-13 15:56:54 +03:00
2 changed files with 20 additions and 46 deletions
Showing only changes of commit ba507fa405 - Show all commits

View File

@ -4,13 +4,10 @@
// Над каждой таблицей — блок «ИСТОЧНИК»: пункт ТЗ АРМ КА BIQ-34 / ТЗ ЕХФД (помечено «ЕХ ТЗ») / Методика;
// страница аналитики (md); экран макета dkb_24.09.26; версия модели, в которой таблица появилась (v4 = исходная DBML аналитики).
//
// v5.27: kfo_result.snapshot не вводится; до заморозки сохраняются только ручные поля.
// v5.27 (arm-core feat/kfo-table-back, миграция 0014_dbml_v5_27):
// 1. vgo_assignment.side: D/K для ОФР, NULL для ББ (DOC-277424 §3.4).
// Уникальность ББ — версия/тип/строка; ОФР — версия/тип/строка/сторона.
// 2. kfo_result.snapshot boolean NOT NULL DEFAULT true: true = результат неактуален,
// false = пересчёт не требуется. Суммы хранятся в kfo_result_line/_company, не в JSON.
// Инвалидация и сброс признака выполняются в транзакциях изменения и расчёта;
// замороженные результаты не инвалидируются. Старые незамороженные результаты получают true.
// 3. correction.ordinal не вводится: основная строка задаётся parent_correction_id,
// дополнительные строки выводятся в стабильном порядке ID, порядок ввода не хранится.
// Порядок колонок kfo_result_line_company отражает последовательность ALTER TABLE v5.26.
@ -1465,7 +1462,6 @@ Table kfo_result {
corrections_count_ofr int
corrections_amount_bb numeric(18,2) [note: 'v5.26: Σ исключений этих корректировок обеих сторон = Σ eliminated_manual строк бланка ББ без итогов, тыс. руб.']
corrections_amount_ofr numeric(18,2)
snapshot boolean [not null, default: true, note: 'v5.27: true — требуется пересчёт, false — результат актуален; не JSON-снимок']
Note: 'Шапка результата КФО + контрольные пороги. Все суммы — тыс. руб. (§8 «КФО»); одна запись на версию, пересчитывается при чтении после изменения входов, пока не is_frozen'
}

View File

@ -1,46 +1,24 @@
# Модель данных v5.27 — КФО и позиции ВГО
# Модель данных v5.27 — КФО без сохранения промежуточного расчёта
Ветка: `feat/kfo-table-back`. Миграция arm-core: `0014_dbml_v5_27`, после `0013_dbml_v5_26`.
База: [v5.26](entities-v5.26.md). Полная схема: [data-model-v5.27.dbml](data-model-v5.27.dbml).
Миграция arm-core: `0014_dbml_v5_27`, после `0013_dbml_v5_26`.
База: [v5.26](entities-v5.26.md). Схема: [data-model-v5.27.dbml](data-model-v5.27.dbml).
## vgo_assignment.side
Поле `kfo_result.snapshot` не вводится. Незамороженная таблица рассчитывается при каждом GET без записи в БД.
До заморозки в `kfo_result` сохраняется обоснование порогов, в `consolidation_version` — отклонения
от методологии, в `kfo_result_line` — только строки с непустыми комментариями. Расчётные ячейки компаний
не создаются. Обязательное `consolidated_amount` строки комментария равно 0 и не используется при чтении;
`computed_at` шапки при её создании заполняется временем расчёта ответа PUT, а не временем заморозки.
Nullable varchar: для ББ NULL, для ОФР только D или K. Это отдельные ручные решения для дебетовой
и кредитовой позиции исходной строки ОСВ (DOC-277424 §3.4).
При переходе в VERIFIED таблица рассчитывается по текущим источникам, ручные поля накладываются на неё,
полный результат сохраняется и получает `is_frozen = true` в одной транзакции с переходом статуса.
После заморозки GET читает сохранённый результат. Повторная заморозка не пересчитывает результат.
Прежний уникальный индекс заменяется двумя частичными:
Миграция удаляет прежний расчётный кэш незамороженных таблиц, сохраняя комментарии, обоснования
и отклонения от методологии. Замороженные суммы не изменяются. Удалённый промежуточный расчёт при downgrade не восстанавливается.
- balance: `(consolidation_version_id, statement_type, osv_entry_id)`;
- income: `(consolidation_version_id, statement_type, osv_entry_id, side)`.
Существующие income ASSIGN переносятся по счетам зафиксированной версии правила с учётом иерархии
и исключений; при неоднозначности миграция откатывается. UNASSIGNED переносится на обе стороны.
ББ остаётся без стороны. Откат запрещён, если две позиции одной строки не помещаются в старый ключ.
## kfo_result.snapshot
Boolean NOT NULL DEFAULT true. Несмотря на имя, поле не содержит снимок JSON:
- true — входные данные изменились, нужен пересчёт;
- false — сохранённый расчёт актуален.
После сохранённого изменения периметра, документов, формы, сопоставления, разнесения, корректировок
или гудвилла признак выставляется той же транзакцией. GET пересчитывает помеченный результат и
сбрасывает признак только при успешном сохранении. is_frozen защищает от пересчёта и инвалидации;
существующие замороженные результаты при миграции получают false.
Сами суммы, комментарии, доли и предупреждения остаются в предусмотренных таблицах kfo_result,
kfo_result_line и kfo_result_line_company. Исторические названия компаний и полный набор реквизитов
в отдельном JSON больше не сохраняются.
## Корректировки
`correction.ordinal` не добавляется. Основная строка определяется через parent_correction_id;
дополнительные строки упорядочиваются по ID. Порядок ввода дополнительных строк не сохраняется.
Если исключение ограничено суммой, это порядок применения дополнительных строк.
## Граница v5.26 / v5.27
v5.26 содержит только изменения, описанные в data-model-v5.26.dbml: показатели компаний, предупреждения,
сводки корректировок и события KFO_EDIT/EX_SNAPSHOT_WRITE. side и булевый snapshot вводятся только в v5.27.
Наличие EX_SNAPSHOT_WRITE в enum не означает реализации процесса записи среза ЕХ.
`vgo_assignment.side` добавляется по DOC-277424 §3.4: NULL для ББ, D/K для ОФР.
Уникальность ББ — версия/тип/строка, ОФР — версия/тип/строка/сторона. Старые назначения
ASSIGN переносятся по счетам правил, неоднозначные решения блокируют миграцию;
UNASSIGNED переносится на D и K. Откат запрещён при конфликте старого уникального ключа.
`correction.ordinal` не вводится; дополнительные строки упорядочиваются по ID. Поле API `data_changed` сохраняется
для совместимости и всегда равно false: отдельного состояния неактуального сохранённого расчёта больше нет.