From 8fc189d9a93ac2f70b37fc2a1d1ea571fb4f85c4 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Thu, 22 Oct 2026 23:46:38 +0400 Subject: [PATCH] =?UTF-8?q?=C2=A76=20=D1=88=D0=B0=D1=85=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=BA=D0=B0:=20one=5Fsided=20=D0=BF=D0=BE=20=D1=81=D1=83=D0=BC?= =?UTF-8?q?=D0=BC=D0=B0=D0=BC,=20=D0=BF=D0=BE=D0=B4=D1=81=D0=B2=D0=B5?= =?UTF-8?q?=D1=82=D0=BA=D0=B0,=20=C2=AB=D0=B2=D1=81=D0=B5=20=D1=81=D1=87?= =?UTF-8?q?=D0=B5=D1=82=D0=B0=C2=BB=20=D0=B1=D0=B5=D0=B7=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B1=D0=B0=D0=BB=D0=B0=D0=BD=D1=81=D0=BE=D0=B2=D1=8B=D1=85;?= =?UTF-8?q?=20OQ-175,=20OQ-176;=20=D0=B3=D0=B0=D0=B9=D0=B4=20=D1=84=D1=80?= =?UTF-8?q?=D0=BE=D0=BD=D1=82=D0=B0=20(#158,=20AURORA-1651)?= 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 | 11 +++++++++-- context/07-open-questions.md | 2 ++ dev/frontend-api-guide.md | 4 +++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/context/05-domain-rules.md b/context/05-domain-rules.md index 6b203f4..d32b28b 100644 --- a/context/05-domain-rules.md +++ b/context/05-domain-rules.md @@ -594,7 +594,9 @@ closing_* = closing_* строки Qn ## §6. Шахматка и результирующая таблица (DOC-221277) Вход: версия + набор дебетовых счетов (`kind ∈ A, AP`) и кредитовых (`kind ∈ P, AP`); предустановки: «58.03 vs -67.03 + 66.03», «60 + 62 + 76 vs 60 + 62 + 76», «все счета». Дополнительно пресетом может быть **правило ББ из §4** +67.03 + 66.03», «60 + 62 + 76 vs 60 + 62 + 76», «все счета» — только балансовые счета, без забалансовых 001–012 +(`is_off_balance = true`; решение владельца 16.10.2026, AURORA-1651: 009 «Обеспечения выданные» давал ложное +расхождение); при ручном выборе забалансовые счета допускаются. Дополнительно пресетом может быть **правило ББ из §4** (`statement_type = balance`): дебетовые и кредитовые счета берутся из сторон правила (с исключениями `is_excluded`), показатель — `measure` правила (у всех правил ББ seed v1 — `closing`); каскада §5 нет — это просмотр сумм по счетам правила, не сумма элиминации (решение владельца 21.10.2026, arm-core #141). Правила ОФР пресетом не являются (ОФР в §4 открыт). @@ -606,9 +608,14 @@ closing_* = closing_* строки Qn ``` amount_a(A,B) = Σ closing_debit строк A с counterparty_id = B по дебетовым счетам amount_b(A,B) = Σ closing_credit строк B с counterparty_id = A по кредитовым счетам -variance = |amount_a − amount_b|; variance_pct = variance / min(amount_a, amount_b) * 100; > 5 % — подсветка +variance = |amount_a − amount_b|; variance_pct = variance / min(amount_a, amount_b) * 100 (null при min = 0) +one_sided = ровно одна из amount_a, amount_b равна 0 (знак ненулевой не важен) +подсветка = variance_pct > 5 % ИЛИ one_sided ячейка: amount_a / amount_b / (variance) ``` +Пара без встречной стороны (`one_sided`) — по суммам, а не по наличию строк ОСВ: строка с нулевым сальдо (одни обороты) +стороной не считается; «0 против 0» не подсвечивается (AURORA-1651). Подсветка одинакова в API, в xlsx и на экране. +Процент при отрицательной меньшей стороне — OQ-175; счёт `000` в «все счета» — OQ-176. Фильтры строк — как в §3 (COUNTERPARTY, BU/SUM, `account_id IS NOT NULL`). Результирующая таблица «компания против группы» по статьям: Дебиторка (Дт 60.02, 60.22, 60.32, 62.01, 62.03, 62.21, diff --git a/context/07-open-questions.md b/context/07-open-questions.md index e347f81..65911a8 100644 --- a/context/07-open-questions.md +++ b/context/07-open-questions.md @@ -180,3 +180,5 @@ | OQ-172 | Безымянная аналитика первого уровня на счёте **63** (резервы по сомнительным долгам) в плоской форме без названия вида: на файлах контура таких строк нет; 51 строка — в fixtures, golden `osv-dkb/nm/2025-Q3/НМ_ОСВ_63_Контрагенты_…json` (имя файла «63_Контрагенты» — довод за включение 63); счёт 63 не входит в `counterparty_accounts` (§1.3), строки остаются `OTHER` без имени. Нужен ли 63 в списке (аналитика резерва — контрагенты-должники) | tabular-parser #59, приёмка Task 6 (19.10.2026) | §1.3, сопоставление контрагентов | открыт; допущение принято: 63 в список не входит, строки `OTHER` | | OQ-173 | Пересечение правил в сумме элиминации: счета сторон правил §4 пересекаются — дебет № 5–8 (76 у № 5; 60/62/76 у № 6–8), кредит: 67.03 (№ 3 и маска 67 у № 7), 66.03 (№ 4 и маска 66 у № 8), 66.04/67.04 (№ 5 и № 7/8). Строка такого счёта входит в Σ стороны каждого правила, и сумма min(ΣA, ΣB) по правилам может превысить Σ самой стороны — двойная элиминация. Считать ΣA правила только по строкам, которые упаковка (§5 п. 2) отнесла к этому правилу? Или распределять сторону по правилам в фиксированном порядке? | решение по OQ-07 (docs #136, 19.10.2026), описание AURORA-1536 | §5 п. 1, AURORA-1536, КФО (§8 `eliminated_auto`) | **закрыт решением владельца 19.10.2026 (docs #136):** каскад по остатку — правила пары (A, B) считаются по порядку `rule_no` (в Прил. 3 он уже от частного к общему: № 3/4 раньше № 7/8, № 5 раньше № 6, № 6 → 7 → 8), каждое берёт min из остатка сторон после предыдущих, как в правиле № 1 Прил. 3 («сначала из 1450 до обнуления…»); упаковка — в том же порядке, строка сопоставляется одним правилом; ничьей между правилами нет. Поле порядка не нужно. Алгоритм — `05-domain-rules.md` §5 | | OQ-174 | Какая версия правил элиминации (§4) применяется к версии консолидации, если `consolidation_version.elimination_rules_version` не задан: открытые на сегодня, действующие на отчётную дату консолидации или на дату её составления; когда фиксировать номер версии | ревью arm-core PR #141 (21.10.2026) | §4, §5, AURORA-1536 | **закрыт решением владельца 21.10.2026 (docs #145):** версия правил, действующая на дату составления консолидации (создания версии), а не на отчётный период; фиксируется в `elimination_rules_version` при создании версии или первом расчёте, не в GET-запросе; реализация — AURORA-1536; до неё расчёты берут открытые правила (`valid_to IS NULL`, сейчас одна версия v1) | +| OQ-175 | Процент расхождения шахматки при отрицательной меньшей стороне: `variance_pct = variance / min(amount_a, amount_b) * 100` при отрицательном сальдо (возможно по §1) уходит в минус — пара (100, −5) даёт −2100 %, порог > 5 % не срабатывает, пара не подсвечивается. Считать от `\|min\|`, от меньшей по модулю стороны или подсвечивать пары с разными знаками всегда? | ревью arm-core #165 (AURORA-1651), 22.10.2026 | §6, шахматка, xlsx | открыт; до решения — как в коде (min со знаком) | +| OQ-176 | Счёт `000` «Вспомогательный» (технический счёт 1С для ввода остатков, `kind = AP`, `is_off_balance = false`) входит в шахматку «все счета». Исключать его вместе с забалансовыми? | ревью arm-core #165 (AURORA-1651), 22.10.2026 | §6, режим «все счета» | открыт; до решения — входит (решение владельца 22.10.2026: не трогать) | diff --git a/dev/frontend-api-guide.md b/dev/frontend-api-guide.md index 06a241c..4e3a9f8 100644 --- a/dev/frontend-api-guide.md +++ b/dev/frontend-api-guide.md @@ -577,7 +577,9 @@ line_code_text}` — строки `unreadable` / `missing`, у которых в `IntercompanyMatrixOut` — `{companies[] {id, name}, cells[] {company_a_id, company_b_id, amount_a, amount_b, variance_amount, variance_percent?, exceeds_threshold, one_sided, skipped_osv_entry_count, osv_entry_ids_debit[], osv_entry_ids_credit[]}}`. Порядок компаний задаёт обе оси; диагонали и пар без строк ОСВ в `cells` нет — показывать «—». Суммы — строки в рублях; -`variance_amount` — модуль разности, подсветка — по `exceeds_threshold` (> 5 % к меньшей сумме). `skipped_osv_entry_count` — +`variance_amount` — модуль разности. Подсветка пары — `exceeds_threshold` (> 5 % к меньшей сумме) **или** `one_sided` +(ровно одна сумма нулевая — пара без встречной стороны; тогда `variance_percent = null`), так же красит xlsx. Режим «все +счета» — без забалансовых 001–012. `skipped_osv_entry_count` — строки ОСВ пары без сопоставленного счёта, в суммы они не вошли. Выгрузки пишут в журнал `EXPORT`. ### 5.8 Схемы ответов (кратко) -- 2.47.2