diff --git a/model/data-model-v5.27.dbml b/model/data-model-v5.27.dbml index a8296e7..d642d63 100644 --- a/model/data-model-v5.27.dbml +++ b/model/data-model-v5.27.dbml @@ -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' } diff --git a/model/entities-v5.27.md b/model/entities-v5.27.md index c44c004..1246794 100644 --- a/model/entities-v5.27.md +++ b/model/entities-v5.27.md @@ -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: отдельного состояния неактуального сохранённого расчёта больше нет.