README: возвращена фраза про XLSX результирующей таблицы, потерянная при merge. Change: отменённое решение 4, ветка-закладка wip/shahmatka-corrections-unpaired, ссылки на снятый раздел Known issues, шапка xlsx пресета — счета правила и «кроме», статьи сторон при side_1 = K, tasks раунда 2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8.7 KiB
8.7 KiB
Context
Реализация — PR RSHB/arm-core#141 (ветка add-preset-shahmatka), задача AURORA-1747 (выделена из AURORA-1536
решением владельца 21.10.2026). Расчёт элиминации §5 — сумма по тройке с elimination_mode каскадом по rule_no,
упаковка строк и «без пары», API списка пар, фиксация elimination_rules_version — остаётся в AURORA-1536 и в этот
change не входит. Шахматка — чистая функция от сводной ОСВ версии,
периметра и выбранных счетов; в БД не хранится (DECISION-5). Корректировки (correction) — хранимые ручные решения,
читаются, но в ядре пока никем не создаются.
Decisions
- Режим PRESET берёт правило по
rule_id. Правило должно быть действительно для версии: при зафиксированномelimination_rules_version— совпадать поversion_no, иначе — иметьvalid_to IS NULLи максимальный открытыйversion_no; иначе 404. - Сторона дебета —
company_1, еслиside_1 = D, иначеcompany_2; кредит — вторая сторона. Счета и исключения раскрываются по иерархии (_select_accounts), как в MANUAL. Нет счетов хотя бы одной стороны — 422ACCOUNTS_REQUIRED; неверныеside_1/measure/company_no— 422INVALID_RULE; не переданrule_id— 422RULE_REQUIRED. - Показатель (
closing/turnover) берётся из правила; ALL и MANUAL остаются наclosing. - Отменено решением владельца 21.10.2026 (п. 3 ниже), в реализацию не входит. Применённые корректировки правила (
status = APPLIED, тот жеrule_idи версия консолидации) уменьшаютamount_aячейки(A, B)наdebit_adjustmentкорректировки (legal_entity_id = A,counterparty_id = B) иamount_bнаcredit_adjustmentкорректировки(B, A); расхождение, процент и порог пересчитываются, ID корректировок попадают вcorrection_ids_debit/credit. - Первоначальная ручка
unpaired-osvотменена решением владельца ниже и в текущую реализацию не входит. GET …/elimination-rulesотдаёт объект с основанием выбора версии;as_ofне вводится.- xlsx пресета: имя
intercompany-matrix_<ГК>_<год>-<квартал>_v<n>_rule-balance-<rule_no>.xlsx, в шапке «Режим = Пресет», номер правила, статьи сторон, фактическая версия правил, коды счетов сторон (отсортированы) и строка «Показатель» (Сальдо/Оборот) для всех режимов.
Решения владельца (2026-10-21, ревью PR #141)
- Фиксация версии правил — в AURORA-1536 (следующий шаг, не этот change). Пока
consolidation_version.elimination_rules_versionпуст, шахматка берёт открытые правила (valid_to IS NULL); сейчас версия правил одна (seed/core/elimination_rules_v1.yaml,valid_toне задаётся, API управления правилами нет), поэтому результат не плавает. Фиксировать версию — при создании версии консолидации или при первом расчёте, но не в GET-запросе. - Какая версия правил берётся — действующая на дату составления консолидации, а не на отчётный период версии. Реализация — вместе с п. 1 в AURORA-1536.
- Корректировки из шахматки убираются (решение 4 выше и
correction_ids_*в ячейке). Причины: корректировки в ядре никто не создаёт (спринт корректировок), семантика ключа(rule, A, B)относительно ячейки (A, B) / (B, A) не утверждена, счета корректировки иparent_correction_idне учитывались; §6 описывает шахматку как суммы первички. Код корректировок сохранён в веткеwip/shahmatka-corrections-unpaired(PR #164 не сливается) и возвращается после решения по аналитике AURORA-1643 «Учитывание корректировок в шахматке». - Ручка
…/preset/{rule_id}/unpaired-osvубирается (решение 5 выше). Причины: «без пары» по наличию строк (дефект AURORA-1651), ложные срабатывания при пересечении счетов сторон (76 в правиле № 6), нет ячейки и стороны строки, расхождение с «без пары» §5. Сценарий закрывают AURORA-1653 (строки ОСВ ячейки) и AURORA-1536 (строки без пары по упаковке §5). Код — в той же веткеwip/shahmatka-corrections-unpaired. - Пресет = правило Прил. 3 — дополнение к пресетам §6 (наборы счетов), не замена. PRESET ограничивается
правилами ББ (
statement_type = balance): правил ОФР в seed нет, ОФР в §4 открыт. Правка §6 — в../docs.
После выноса п. 3–4 автором соответствующие требования дельты consolidated-osv удаляются из change.
Decisions made without discussion
- 2026-10-21. Change пишет ревьюер в ветке автора по решению владельца. Обоснование: автор не оформила OpenSpec. Цена ошибки: автор переписывает change.
- 2026-10-21. Спека описывает фактическое поведение PR; спорное вынесено в Known issues (раздел снят в раунде 2 — все пункты закрыты автором). Обоснование: домен решает автор и владелец, не ревьюер. Цена ошибки: после решения владельца спека меняется дельтой.
- 2026-10-21. Поле
as_ofудалено изEliminationRulesOutкак мёртвое: после правок по ревью всегдаNone, в main его не было, потребителей нет. Цена ошибки: если фронт ждалas_of, поле нужно вернуть. - 2026-10-21. При незаданной версии правил выбирается максимальный открытый
version_no; он возвращается в ответеelimination-rules, чтобы фронт видел фактически применённую версию. - 2026-10-21. mypy:
measureаннотированMeasureбезcast; слишком длинная f-строка имени файла свода ОСВ (consolidated_osv.py) разбита на две без изменения результата (ruff E501). Цена ошибки: нулевая. - 2026-10-21. В MODIFIED-блоке требования про правила элиминации и аудит экспорта приведён полный текст; требование «XLSX шахматки» (ALL/MANUAL) не менялось, поведение PRESET описано отдельным ADDED-требованием.
- 2026-10-22. Раунд 2 ревью: в ветку влит
main(#163), в README возвращена фраза про XLSX результирующей таблицы, потерянная при merge автора (b7d9794). Показатель пресета в docs (#146, §6) приведён к change:measureправила, у правил ББ —closing. Цена ошибки: нулевая.