add-report-shahmatka #114

Merged
aep merged 9 commits from add-report-shahmatka into main 2026-10-16 14:58:13 +03:00
Owner
  • Шахматка считается по двум режимам (ALL - все счета, MANUAL - выбранные пользователем). Так же добавлены osv_entry_ids, исходя из которых считается ячейка в отчете (пригодится фронту для перехода из ячейки в сводную осв).
  • Выгрузка шахматки
  • Эндпоинты для получения статей расходов - для фильтрации на фронте для получения шахматки режима MANUAL
  • Эндпоинты для получения правил пресетов

пока все сделано на основе сводной осв, далее требуется доработка учета таблицы корректировок

- Шахматка считается по двум режимам (ALL - все счета, MANUAL - выбранные пользователем). Так же добавлены osv_entry_ids, исходя из которых считается ячейка в отчете (пригодится фронту для перехода из ячейки в сводную осв). - Выгрузка шахматки - Эндпоинты для получения статей расходов - для фильтрации на фронте для получения шахматки режима MANUAL - Эндпоинты для получения правил пресетов пока все сделано на основе сводной осв, далее требуется доработка учета таблицы корректировок
PotapovaA added 5 commits 2026-10-15 13:39:13 +03:00
PotapovaA requested review from aep 2026-10-15 13:39:23 +03:00
aep added 1 commit 2026-10-15 17:37:32 +03:00
- Убраны отладочные print() в режиме MANUAL.
- mypy: computed_field у is_debit/is_credit — с type: ignore[prop-decorator],
  как у остальных схем; флаг is_more_5_percent без сравнения Decimal с None
  (поведение прежнее).
- ruff format по трём файлам.
- test_openapi_routes: новые маршруты шахматки и правил элиминации
  в EXPECTED_ROUTES.

make check: ruff, ruff format, mypy — чисто; pytest 1303 passed, 44 skipped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner

Ревью PR #114 (AURORA-1537)

Спасибо! Расчёт по §6 в целом верный: прогнали код ветки на демо-стенде (версии «Русский бисквит» Q3 2024 и Q1 2025, только чтение) — суммы сходятся с данными построчно, ничего не сохраняется, всё на Decimal, права через require(...), сводная ОСВ не сломана. Q3 2024: Счастливочная 62.01 = 107 712 446,46 против РБ 60.01 = 106 311 116,46, разница 1 401 330 — строка «БП Аренда», расчёт с данными согласован.

make check мы довели до зелёного коммитом 1ebd5b9 в эту ветку: убраны два print() в MANUAL, # type: ignore[prop-decorator] у is_debit/is_credit (как в остальных схемах), флаг is_more_5_percent без сравнения Decimal с None (поведение прежнее), ruff format, новые маршруты — в EXPECTED_ROUTES. Сейчас: ruff/format/mypy чисто, pytest 1303 passed. Перед продолжением сделай git pull, дальше перед PR — make check-full и его вывод в описание.

Границы с AURORA-1536. Сопоставление пар по правилам Прил. 3, элиминируемая сумма (min(A, B) по §5) и фиксация версии правил у версии консолидации — это AURORA-1536, в этом PR они не нужны. Шахматка по §6 строится по выбранным наборам счетов (предустановки «58.03 vs 67.03 + 66.03», «60 + 62 + 76 vs 60 + 62 + 76», «все счета» и произвольный выбор).

Ниже — содержательные правки.

Обязательно перед merge

  1. Пара без встречной стороны не подсвечивается (services/intercompany_matrix.py, расчёт ячейки). При min(amount_a, amount_b) == 0 процент None и is_more_5_percent = False — пара «100 млн у А против 0 у Б» выглядит как сошедшаяся. Это главный случай для аналитика и прямо в критериях задачи. Подсвечивать при variance > 0, если min == 0 (процент оставить null или отдельный признак one_sided), и тест.
  2. Выгрузка xlsx не пишет audit_event(EXPORT), а экспорт сводной ОСВ пишет (services/consolidated_osv.py). Инвариант append-only аудита; payload — {report: "intercompany_matrix", mode, счета, число ячеек}.
  3. Тесты на критерии задачи. Сейчас только юнитные. Нужны: пустой периметр, нет ОСВ по счёту, пара без встречной стороны; API с БД — 404 вне видимости, 422 ACCOUNT_NOT_FOUND / ACCOUNT_KIND_MISMATCH, 403 без CONSOLIDATION_VIEW, RESULT_ACCOUNTS_MISSING; golden-тест на эталоне «Русский бисквит» — только по точным парам (эталон элиминирует полную сумму каждой стороны, а система — минимум по паре, решение владельца 08.10.2026). Тест с неокруглённым процентом (== Decimal("100")/Decimal("9")) переписать после п. 6 ниже; проверки "/intercompany-matrix/presets/" и "exceeds_threshold" — остатки прошлых итераций, убрать.

Желательно

  1. GET …/elimination-rules сейчас всегда пустой: репозиторий соединяет правила с consolidation_version.elimination_rules_version, а поле нигде не заполняется. Фиксация версии правил — AURORA-1536; здесь либо убрать эндпоинт до 1536, либо оставить и описать в README/гайде, что он заполнится после 1536 (пустой список вводит фронт в заблуждение).

  2. Исключения в MANUAL — сейчас правило вида «76 кроме 76.07.5, 76.07.9» вручную не воспроизвести (на стенде, Q1 2025, РБ → Счастливочная, пресет «60+62+76» дал 16 514 753,77, из них 952 714,57 — 76.07.5 и 8 676 330,29 — 76.07.9). Можно добавить debit_excluded_account_ids / credit_excluded_account_ids (как excluded_codes в result-table); точный расчёт по правилу — в 1536.

  3. Формат чисел: процент сейчас — Decimal на 28 знаков ("3.873533480903112697872235289"), нули — "0". Суммы и процент округлять до 0.01 (ROUND_HALF_UP), как деньги в остальном API.

  4. entry_osv_ids_* собираются из set — порядок случайный; в списки попадают строки с нулевым вкладом (переход «из ячейки в свод» покажет лишнее). Брать только ненулевые и сортировать.

  5. Состав статей result-table зашит в код (RESULT_ARTICLES) и дублирует счета правила 6 из elimination_rule — при изменении правил разойдётся. Минимум — комментарий-ссылка на §6, лучше строить из правил версии.

  6. Мёртвый код: list_rules, list_rule_accounts, IntercompanyMatrixService.build() не вызываются; measure всегда "closing"; коды ACCOUNTS_NOT_ALLOWED / INVALID_MODE из API недостижимы.

  7. Слои: сервис делает select(ChartOfAccount) сам, хотя в этом же PR есть repositories.directories.list_accounts; repo.members вызывается повторно после osv.build.

  8. Выгрузка: имя файла всегда intercompany-matrix.xlsx — по образцу свода (svod-osv_<ГК>_<год>-<квартал>_v<n>.xlsx); в книге нет шапки (версия, период, единицы, выбранные счета) и процента расхождения.

  9. Имена в контракте лучше выровнять до первого клиента: entry_osv_ids_debit/credit (в своде — entry_ids, в описании PR — osv_entry_ids), is_more_5_percent → exceeds_threshold. В EliminationRuleOut не хватает id, строк статей и elimination_mode — пресет в UI нечем подписать.

  10. Строки с account_id IS NULL молча выпадают — по §6 это верно, но стоит отдавать счётчик пропущенных строк, чтобы расхождение с ОСВ было видно.

    Процесс

  • openspec/specs/directories-api/spec.md правится прямо в specs/ — по процессу изменения идут через change в openspec/changes/<id>/; требований на шахматку, result-table и правила нет ни в одном spec (consolidations-api, consolidated-osv, audit-trail не обновлены).
  • В README в каталог ошибок API добавить новые коды (ACCOUNT_NOT_FOUND, ACCOUNT_KIND_MISMATCH, ACCOUNTS_REQUIRED, RESULT_ACCOUNTS_MISSING, …); строка «шахматка и ВГО — Срез 5» устарела.
  • Контракт фронт↔бэк сейчас живёт только в комментарии Jira — после merge нужно перенести его в гайд фронта по API (там шахматка пока в разделе «Нет в API»).
## Ревью PR #114 (AURORA-1537) Спасибо! Расчёт по §6 в целом верный: прогнали код ветки на демо-стенде (версии «Русский бисквит» Q3 2024 и Q1 2025, только чтение) — суммы сходятся с данными построчно, ничего не сохраняется, всё на Decimal, права через `require(...)`, сводная ОСВ не сломана. Q3 2024: Счастливочная 62.01 = 107 712 446,46 против РБ 60.01 = 106 311 116,46, разница 1 401 330 — строка «БП Аренда», расчёт с данными согласован. **`make check` мы довели до зелёного коммитом `1ebd5b9` в эту ветку:** убраны два `print()` в MANUAL, `# type: ignore[prop-decorator]` у `is_debit`/`is_credit` (как в остальных схемах), флаг `is_more_5_percent` без сравнения `Decimal` с `None` (поведение прежнее), `ruff format`, новые маршруты — в `EXPECTED_ROUTES`. Сейчас: ruff/format/mypy чисто, pytest 1303 passed. **Перед продолжением сделай `git pull`**, дальше перед PR — `make check-full` и его вывод в описание. **Границы с AURORA-1536.** Сопоставление пар по правилам Прил. 3, элиминируемая сумма (`min(A, B)` по §5) и фиксация версии правил у версии консолидации — это AURORA-1536, в этом PR они не нужны. Шахматка по §6 строится по выбранным наборам счетов (предустановки «58.03 vs 67.03 + 66.03», «60 + 62 + 76 vs 60 + 62 + 76», «все счета» и произвольный выбор). Ниже — содержательные правки. ### Обязательно перед merge 1. **Пара без встречной стороны не подсвечивается** (`services/intercompany_matrix.py`, расчёт ячейки). При `min(amount_a, amount_b) == 0` процент `None` и `is_more_5_percent = False` — пара «100 млн у А против 0 у Б» выглядит как сошедшаяся. Это главный случай для аналитика и прямо в критериях задачи. Подсвечивать при `variance > 0`, если `min == 0` (процент оставить `null` или отдельный признак `one_sided`), и тест. 2. **Выгрузка xlsx не пишет `audit_event(EXPORT)`**, а экспорт сводной ОСВ пишет (`services/consolidated_osv.py`). Инвариант append-only аудита; payload — `{report: "intercompany_matrix", mode, счета, число ячеек}`. 3. **Тесты на критерии задачи.** Сейчас только юнитные. Нужны: пустой периметр, нет ОСВ по счёту, пара без встречной стороны; API с БД — 404 вне видимости, 422 `ACCOUNT_NOT_FOUND` / `ACCOUNT_KIND_MISMATCH`, 403 без `CONSOLIDATION_VIEW`, `RESULT_ACCOUNTS_MISSING`; golden-тест на эталоне «Русский бисквит» — только по точным парам (эталон элиминирует полную сумму каждой стороны, а система — минимум по паре, решение владельца 08.10.2026). Тест с неокруглённым процентом (`== Decimal("100")/Decimal("9")`) переписать после п. 6 ниже; проверки `"/intercompany-matrix/presets/"` и `"exceeds_threshold"` — остатки прошлых итераций, убрать. ### Желательно 4. **`GET …/elimination-rules` сейчас всегда пустой**: репозиторий соединяет правила с `consolidation_version.elimination_rules_version`, а поле нигде не заполняется. Фиксация версии правил — AURORA-1536; здесь либо убрать эндпоинт до 1536, либо оставить и описать в README/гайде, что он заполнится после 1536 (пустой список вводит фронт в заблуждение). 5. **Исключения в MANUAL** — сейчас правило вида «76 кроме 76.07.5, 76.07.9» вручную не воспроизвести (на стенде, Q1 2025, РБ → Счастливочная, пресет «60+62+76» дал 16 514 753,77, из них 952 714,57 — 76.07.5 и 8 676 330,29 — 76.07.9). Можно добавить `debit_excluded_account_ids` / `credit_excluded_account_ids` (как `excluded_codes` в result-table); точный расчёт по правилу — в 1536. 6. **Формат чисел:** процент сейчас — Decimal на 28 знаков (`"3.873533480903112697872235289"`), нули — `"0"`. Суммы и процент округлять до `0.01` (`ROUND_HALF_UP`), как деньги в остальном API. 7. **`entry_osv_ids_*`** собираются из `set` — порядок случайный; в списки попадают строки с нулевым вкладом (переход «из ячейки в свод» покажет лишнее). Брать только ненулевые и сортировать. 8. **Состав статей result-table зашит в код** (`RESULT_ARTICLES`) и дублирует счета правила 6 из `elimination_rule` — при изменении правил разойдётся. Минимум — комментарий-ссылка на §6, лучше строить из правил версии. 9. **Мёртвый код:** `list_rules`, `list_rule_accounts`, `IntercompanyMatrixService.build()` не вызываются; `measure` всегда `"closing"`; коды `ACCOUNTS_NOT_ALLOWED` / `INVALID_MODE` из API недостижимы. 10. **Слои:** сервис делает `select(ChartOfAccount)` сам, хотя в этом же PR есть `repositories.directories.list_accounts`; `repo.members` вызывается повторно после `osv.build`. 11. **Выгрузка:** имя файла всегда `intercompany-matrix.xlsx` — по образцу свода (`svod-osv_<ГК>_<год>-<квартал>_v<n>.xlsx`); в книге нет шапки (версия, период, единицы, выбранные счета) и процента расхождения. 12. **Имена в контракте** лучше выровнять до первого клиента: `entry_osv_ids_debit/credit` (в своде — `entry_ids`, в описании PR — `osv_entry_ids`), `is_more_5_percent` → `exceeds_threshold`. В `EliminationRuleOut` не хватает `id`, строк статей и `elimination_mode` — пресет в UI нечем подписать. 13. **Строки с `account_id IS NULL`** молча выпадают — по §6 это верно, но стоит отдавать счётчик пропущенных строк, чтобы расхождение с ОСВ было видно. ### Процесс - `openspec/specs/directories-api/spec.md` правится прямо в `specs/` — по процессу изменения идут через change в `openspec/changes/<id>/`; требований на шахматку, result-table и правила нет ни в одном spec (`consolidations-api`, `consolidated-osv`, `audit-trail` не обновлены). - В README в каталог ошибок API добавить новые коды (`ACCOUNT_NOT_FOUND`, `ACCOUNT_KIND_MISMATCH`, `ACCOUNTS_REQUIRED`, `RESULT_ACCOUNTS_MISSING`, …); строка «шахматка и ВГО — Срез 5» устарела. - Контракт фронт↔бэк сейчас живёт только в комментарии Jira — после merge нужно перенести его в гайд фронта по API (там шахматка пока в разделе «Нет в API»).
Author
Owner

Пункты, которые будут делаться в рамках AURORA-1536

  1. GET …/elimination-rules сейчас всегда пустой: репозиторий соединяет правила с consolidation_version.elimination_rules_version, а поле нигде не заполняется. Фиксация версии правил — AURORA-1536; здесь либо убрать эндпоинт до 1536, либо оставить и описать в README/гайде, что он заполнится после 1536 (пустой список вводит фронт в заблуждение). - это будет сделано в рамках пресетов (AURORA-1536)
  2. Исключения в MANUAL — сейчас правило вида «76 кроме 76.07.5, 76.07.9» вручную не воспроизвести (на стенде, Q1 2025, РБ → Счастливочная, пресет «60+62+76» дал 16 514 753,77, из них 952 714,57 — 76.07.5 и 8 676 330,29 — 76.07.9). Можно добавить debit_excluded_account_ids / credit_excluded_account_ids (как excluded_codes в result-table); точный расчёт по правилу — в 1536. - исключения нужны только в пресетах (AURORA-1536)
  3. entry_osv_ids_* собираются из set — порядок случайный; в списки попадают строки с нулевым вкладом (переход «из ячейки в свод» покажет лишнее). Брать только ненулевые и сортировать.
  4. Состав статей result-table зашит в код (RESULT_ARTICLES) и дублирует счета правила 6 из elimination_rule — при изменении правил разойдётся. Минимум — комментарий-ссылка на §6, лучше строить из правил версии. - правила пресетов и построение этой таблицы на прямую никак не связаны, но это обсудить
  5. Мёртвый код: list_rules, list_rule_accounts, IntercompanyMatrixService.build() не вызываются; measure всегда "closing"; коды ACCOUNTS_NOT_ALLOWED / INVALID_MODE из API недостижимы. - будут нужны для AURORA-1536

остальное исправила (в jira актуализировала контракт бэк фронт)

Пункты, которые будут делаться в рамках AURORA-1536 > 4. **`GET …/elimination-rules` сейчас всегда пустой**: репозиторий соединяет правила с `consolidation_version.elimination_rules_version`, а поле нигде не заполняется. Фиксация версии правил — AURORA-1536; здесь либо убрать эндпоинт до 1536, либо оставить и описать в README/гайде, что он заполнится после 1536 (пустой список вводит фронт в заблуждение). - это будет сделано в рамках пресетов (AURORA-1536) > 5. **Исключения в MANUAL** — сейчас правило вида «76 кроме 76.07.5, 76.07.9» вручную не воспроизвести (на стенде, Q1 2025, РБ → Счастливочная, пресет «60+62+76» дал 16 514 753,77, из них 952 714,57 — 76.07.5 и 8 676 330,29 — 76.07.9). Можно добавить `debit_excluded_account_ids` / `credit_excluded_account_ids` (как `excluded_codes` в result-table); точный расчёт по правилу — в 1536. - исключения нужны только в пресетах (AURORA-1536) > 7. **`entry_osv_ids_*`** собираются из `set` — порядок случайный; в списки попадают строки с нулевым вкладом (переход «из ячейки в свод» покажет лишнее). Брать только ненулевые и сортировать. > 8. **Состав статей result-table зашит в код** (`RESULT_ARTICLES`) и дублирует счета правила 6 из `elimination_rule` — при изменении правил разойдётся. Минимум — комментарий-ссылка на §6, лучше строить из правил версии. - правила пресетов и построение этой таблицы на прямую никак не связаны, но это обсудить > 9. **Мёртвый код:** `list_rules`, `list_rule_accounts`, `IntercompanyMatrixService.build()` не вызываются; `measure` всегда `"closing"`; коды `ACCOUNTS_NOT_ALLOWED` / `INVALID_MODE` из API недостижимы. - будут нужны для AURORA-1536 остальное исправила (в jira актуализировала контракт бэк фронт)
PotapovaA added 1 commit 2026-10-16 13:19:57 +03:00
aep added 2 commits 2026-10-16 14:49:32 +03:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Требования AURORA-1537, дописанные в openspec/specs/{audit-trail,consolidated-osv,
consolidations-api,directories-api}, перенесены в дельты change'а; specs/ возвращены к main.
Известные дефекты (AURORA-1651/1652/1653) зафиксированы в design.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner

Принято: аудит выгрузки, тесты по критериям, формат чисел в ячейках, выгрузка (имя, шапка, процент), слои, счётчик пропущенных строк, коды ошибок в README. Доводы по исключениям в MANUAL и построению результирующей таблицы приняты.

Чтобы не задерживать merge, оставшиеся замечания вынесены в задачи:

  • AURORA-1651 — пара без встречной стороны (one_sided считать по суммам, а не по наличию строк ОСВ), та же подсветка в xlsx, режим «все счета» без забалансовых счетов 001–012;
  • AURORA-1652 — elimination-rules до 1536, формат сумм результирующей таблицы, ссылки на §§ в docstring, ссылка README на гайд фронта;
  • AURORA-1653 — переход из ячейки в сводную ОСВ: фильтр по паре и osv_entry_ids_* без нулевых строк, отсортированные.

В ветку добавлены merge main и OpenSpec change intercompany-matrix: требования перенесены из openspec/specs/ в дельты change'а, в specs/ они попадут при архивации после merge. make check и make test-integration зелёные.

Принято: аудит выгрузки, тесты по критериям, формат чисел в ячейках, выгрузка (имя, шапка, процент), слои, счётчик пропущенных строк, коды ошибок в README. Доводы по исключениям в MANUAL и построению результирующей таблицы приняты. Чтобы не задерживать merge, оставшиеся замечания вынесены в задачи: - AURORA-1651 — пара без встречной стороны (`one_sided` считать по суммам, а не по наличию строк ОСВ), та же подсветка в xlsx, режим «все счета» без забалансовых счетов 001–012; - AURORA-1652 — `elimination-rules` до 1536, формат сумм результирующей таблицы, ссылки на §§ в docstring, ссылка README на гайд фронта; - AURORA-1653 — переход из ячейки в сводную ОСВ: фильтр по паре и `osv_entry_ids_*` без нулевых строк, отсортированные. В ветку добавлены merge main и OpenSpec change `intercompany-matrix`: требования перенесены из `openspec/specs/` в дельты change'а, в `specs/` они попадут при архивации после merge. `make check` и `make test-integration` зелёные.
aep merged commit d44614f6e0 into main 2026-10-16 14:58:13 +03:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

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