fix(#237): «76-исключения», разнесение по стороне строки и по периметру (AURORA-2034) #238

Merged
aep merged 2 commits from feat/237-acc76-exclusions into main 2026-11-10 12:15:02 +03:00
Owner

Closes #237. Jira: AURORA-2034. Правила — docs PR #225 (§4–§6, OQ-164 закрыт).

Замечание заказчика (Артём, 09.11.2026, п. 1): счета 76 (аренда, НДС) не должны участвовать в расчётах и засорять таблицу корректировок. Список субсчетов — Лысенко 10.11.2026.

Что сделано

  1. Seed правил v1 (seed/core/elimination_rules_v1.yaml, правка на месте): из маски 76 на обеих сторонах правил 5–8 исключены 76.07/76.27/76.37 .1/.5/.9, 76.АВ, 76.ВА, 76.К, 76.Н, 76.НА, 76.ОТ. Правило 1 не меняется. Список повторён в каждом правиле явно (без YAML-якорей: с якорем правка одного правила скриптом меняла все — на это упал тест seed).
  2. Результирующая таблица §6 — тот же список (ACCOUNT_76_EXCLUDED); совпадение с seed проверяет тест.
  3. Дефект: правила строки без учёта стороны. VgoService._rule_accounts сливал счета дебета и кредита правила, и исключение одной стороны возвращалось через маску другой: Кт-строки 76.* (АП-субсчета) попадали в правила 5–8 и висели в нераспределённых (MULTIPLE_RULES), то же в меню «Отнести к правилу». Теперь account_owners ведёт стороны раздельно, правило строки — по её стороне (row_side, rules_for).
  4. Дефект: строки вне периметра. В нераспределённые попадали строки с контрагентом вне периметра версии (ГК, но не ГСК) и «сам на себя» — вопреки §5 п. 2a. Теперь они в разнесение не входят; строка с ручным решением аналитика остаётся видна.
  5. Golden-тест правила 6 на фикстурах РБ: 76.АВ вне правила, ΣA 108 062 446,46, расхождение 1,65 % — совпадает с эталонной консолидацией (OQ-164).

Эффект на данных стенда

Копия БД локального стенда, seed из ветки, API ветки против API main:

Версия Нераспределённых в main В ветке
РБ 2025 К1 37 3
РБ 2024 К3 31 3

76.АВ/76.ВА ушли из агрегатов; 76.07.1/76.07.9 остаются только в правиле 1 (аренда, ручное), как и задумано.

Выкладка

После выкладки нужен повторный seed (python -m scripts.seed): он добавит 66 строк исключений в elimination_rule_account (upsert, без удалений). Миграций нет.

Проверки

  • make check: ruff, mypy — чисто; тесты 2086 passed, 1 failed — test_vendored_contracts_are_identical_to_docs: в docs main уже лежит контракт ЕХ (ex-payload-v1), в arm-core main его ещё нет. С этим PR не связано.
  • Интеграционные (-m 'integration and not e2e', локальный Postgres): 1269 passed до правки периметра; после неё затронутые модули (корректировки, разнесение, шахматка, гудвилл, seed, golden на фикстурах) — 248 passed.
  • make check-full целик��м не запускал (docker-build/e2e/web-check): фронт не тронут, миграций нет.

Rulings I made

  • Решения владельца 10.11.2026: правка версии правил 1 на месте (верифицированных версий нет); исключения везде, где маска 76; 76.07.1/.5/.9 с обеих сторон, правило 1 не трогаем; дефекты стороны и периметра — в этой же задаче.
  • У строки с сальдо одновременно по дебету и кредиту сторона — дебет (как уже показывал экран нераспределённых); кредитовая часть такой строки правил кредита не получает.
  • Строка «сам на себя» исключена и из авто-отнесения (раньше при обоих участниках периметра она могла уйти в правило).

🤖 Generated with Claude Code

Closes #237. Jira: AURORA-2034. Правила — docs PR #225 (§4–§6, OQ-164 закрыт). Замечание заказчика (Артём, 09.11.2026, п. 1): счета 76 (аренда, НДС) не должны участвовать в расчётах и засорять таблицу корректировок. Список субсчетов — Лысенко 10.11.2026. ## Что сделано 1. **Seed правил v1** (`seed/core/elimination_rules_v1.yaml`, правка на месте): из маски 76 на обеих сторонах правил 5–8 исключены 76.07/76.27/76.37 .1/.5/.9, 76.АВ, 76.ВА, 76.К, 76.Н, 76.НА, 76.ОТ. Правило 1 не меняется. Список повторён в каждом правиле явно (без YAML-якорей: с якорем правка одного правила скриптом меняла все — на это упал тест seed). 2. **Результирующая таблица §6** — тот же список (`ACCOUNT_76_EXCLUDED`); совпадение с seed проверяет тест. 3. **Дефект: правила строки без учёта стороны.** `VgoService._rule_accounts` сливал счета дебета и кредита правила, и исключение одной стороны возвращалось через маску другой: Кт-строки 76.* (АП-субсчета) попадали в правила 5–8 и висели в нераспределённых (`MULTIPLE_RULES`), то же в меню «Отнести к правилу». Теперь `account_owners` ведёт стороны раздельно, правило строки — по её стороне (`row_side`, `rules_for`). 4. **Дефект: строки вне периметра.** В нераспределённые попадали строки с контрагентом вне периметра версии (ГК, но не ГСК) и «сам на себя» — вопреки §5 п. 2a. Теперь они в разнесение не входят; строка с ручным решением аналитика остаётся видна. 5. Golden-тест правила 6 на фикстурах РБ: 76.АВ вне правила, ΣA 108 062 446,46, расхождение 1,65 % — совпадает с эталонной консолидацией (OQ-164). ## Эффект на данных стенда Копия БД локального стенда, seed из ветки, API ветки против API main: | Версия | Нераспределённых в main | В ветке | |---|---|---| | РБ 2025 К1 | 37 | 3 | | РБ 2024 К3 | 31 | 3 | 76.АВ/76.ВА ушли из агрегатов; 76.07.1/76.07.9 остаются только в правиле 1 (аренда, ручное), как и задумано. ## Выкладка **После выкладки нужен повторный seed** (`python -m scripts.seed`): он добавит 66 строк исключений в `elimination_rule_account` (upsert, без удалений). Миграций нет. ## Проверки - `make check`: ruff, mypy — чисто; тесты 2086 passed, 1 failed — `test_vendored_contracts_are_identical_to_docs`: в docs main уже лежит контракт ЕХ (`ex-payload-v1`), в arm-core main его ещё нет. С этим PR не связано. - Интеграционные (`-m 'integration and not e2e'`, локальный Postgres): 1269 passed до правки периметра; после неё затронутые модули (корректировки, разнесение, шахматка, гудвилл, seed, golden на фикстурах) — 248 passed. - `make check-full` целик��м не запускал (docker-build/e2e/web-check): фронт не тронут, миграций нет. ## Rulings I made - Решения владельца 10.11.2026: правка версии правил 1 на месте (верифицированных версий нет); исключения везде, где маска 76; 76.07.1/.5/.9 с обеих сторон, правило 1 не трогаем; дефекты стороны и периметра — в этой же задаче. - У строки с сальдо одновременно по дебету и кредиту сторона — дебет (как уже показывал экран нераспределённых); кредитовая часть такой строки правил кредита не получает. - Строка «сам на себя» исключена и из авто-отнесения (раньше при обоих участниках периметра она могла уйти в правило). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 2 commits 2026-11-10 12:08:10 +03:00
Замечание заказчика 09.11.2026, п. 1: счета 76 (аренда, НДС) не должны участвовать в
расчётах и засорять таблицу корректировок. Список субсчетов — Лысенко 10.11.2026.

- seed правил v1 (правка на месте, решение владельца 10.11.2026): из маски 76 на обеих
  сторонах правил 5–8 исключены 76.07/76.27/76.37 .1/.5/.9, 76.АВ, 76.ВА, 76.К, 76.Н, 76.НА,
  76.ОТ; правило 1 не меняется; на стендах нужен повторный seed;
- результирующая таблица §6 (RESULT_ARTICLES) — тот же список ACCOUNT_76_EXCLUDED, совпадение
  с seed проверяет тест;
- дефект: VgoService._rule_accounts сливал счета дебета и кредита правила, исключения одной
  стороны возвращались через маску другой — Кт-строки 76.* попадали в правила 5–8 и висели
  в нераспределённых (MULTIPLE_RULES); то же в candidate_rule_ids. Теперь account_owners
  ведёт стороны раздельно, правило строки — по её стороне (row_side, rules_for);
- golden-тест правила 6 на фикстурах РБ: 76.АВ вне правила, ΣA 108 062 446,46, 1,65 %
  (совпадает с эталоном, OQ-164).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
§5 п. 2a: в агрегаты и нераспределённые идут только строки между разными компаниями
периметра версии; строка с ручным решением аналитика остаётся видна. На копии стенда
нераспределённых РБ 2025 К1 — 37 → 3, РБ 2024 К3 — 31 → 3 (вместе с «76-исключениями»).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit d67a67ae58 into main 2026-11-10 12:15:02 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-core#238
No description provided.