add-preset-shahmatka #141

Merged
aep merged 24 commits from add-preset-shahmatka into main 2026-10-22 17:57:14 +03:00
Owner

Добавлен расчёт и XLSX-экспорт шахматки по правилу-пресету

Обновлено получение правил по версии консолидации, если в consolidation_version нет elimination_rules_version, то берутся все актуальные правила на текущий момент

Корректировки учитываются в шахматке (важно: корректировки применяются к уже готовой шахматке, учитывая правило, пересечения счетов между правилами не учитывается);

Добавлена ручка строк сводной ОСВ без встречной стороны по правилу.

Добавлен расчёт и XLSX-экспорт шахматки по правилу-пресету Обновлено получение правил по версии консолидации, если в consolidation_version нет elimination_rules_version, то берутся все актуальные правила на текущий момент Корректировки учитываются в шахматке (важно: корректировки применяются к уже готовой шахматке, учитывая правило, пересечения счетов между правилами не учитывается); Добавлена ручка строк сводной ОСВ без встречной стороны по правилу.
PotapovaA added 2 commits 2026-10-20 15:27:54 +03:00
PotapovaA requested review from aep 2026-10-20 15:27:55 +03:00
PotapovaA requested review from tsygankoviva 2026-10-20 15:27:55 +03:00
PotapovaA added 1 commit 2026-10-20 15:35:51 +03:00
tsygankoviva requested changes 2026-10-20 17:18:17 +03:00
Dismissed
tsygankoviva left a comment
Owner

Основная претензия по build_account, остальное на твое усмотрение, можно оставить, но build_account прям не нравится

Основная претензия по build_account, остальное на твое усмотрение, можно оставить, но build_account прям не нравится
@ -565,1 +567,4 @@
return dict(groups)
async def correction_for_version_consolidation(
Owner

Не очень мне нравятся функции, начинающиеся не с глагола, но вроде уже приняли во всем проекте так, можно условиться на будущее, что select запросы можно не начинать с глагола, а если что-то в БД меняем, то все же желательно. Сейчас проще оставить как есть.

Не очень мне нравятся функции, начинающиеся не с глагола, но вроде уже приняли во всем проекте так, можно условиться на будущее, что select запросы можно не начинать с глагола, а если что-то в БД меняем, то все же желательно. Сейчас проще оставить как есть.
Author
Owner

исправила

исправила
@ -29,0 +31,4 @@
as_of = None
version_no = version.elimination_rules_version
else:
as_of = moscow_date(utc_now())
Owner

А у нас КА не только в Мск же сидят, раз есть КА РФ, допустим, аналитик или ГК из Екб, в этом случае элиминация тоже будет по Москве время прилетать? Пока не до конца въехал, мб чего-то пока не догоняю

А у нас КА не только в Мск же сидят, раз есть КА РФ, допустим, аналитик или ГК из Екб, в этом случае элиминация тоже будет по Москве время прилетать? Пока не до конца въехал, мб чего-то пока не догоняю
Author
Owner

я уточнила, теперь время вообще не важно для актуальности, просто проверка отсутствия записи в valid_to

я уточнила, теперь время вообще не важно для актуальности, просто проверка отсутствия записи в valid_to
@ -175,0 +185,4 @@
entry_id
for cell in matrix.cells
if cell.one_sided
for entry_id in (*cell.osv_entry_ids_debit, *cell.osv_entry_ids_credit)
Owner

Прикольно, я всегда через itertools.chain подобное делал, даже не задумывался, что так можно

Прикольно, я всегда через itertools.chain подобное делал, даже не задумывался, что так можно
@ -316,3 +335,1 @@
"""ALL использует все счета нужного вида; MANUAL раскрывает выбранные счета и потомков."""
matrix, _, _, _ = await self._build_accounts(
version_id, mode=mode, debit_account_ids=debit_account_ids, credit_account_ids=credit_account_ids
"""Рассчитать матрицу по всем счетам, ручному выбору или правилу-пресету."""
Owner

Я бы оставил в докстринге для чего каждый mode нужен, или думаешь уже лишнего?

Я бы оставил в докстринге для чего каждый mode нужен, или думаешь уже лишнего?
Author
Owner

вернула

вернула
@ -357,2 +458,3 @@
credit_account_ids: Sequence[uuid.UUID],
) -> tuple[IntercompanyMatrixOut, ConsolidationVersion, Consolidation, list[ChartOfAccount]]:
rule_id: uuid.UUID | None = None,
) -> tuple[
Owner

Тут все же буду настаивать. Когда функция\метод возвращает два значения это еще туда сюда, но когда уже больше - код превращается в месиво. Не очевидно, какой параметр возвращается каким (например, надо помнить, что объект MatrixSelection возвращается 5, нужно заходить в определение функции и отсчитывать, в каком он месте. К тому же, если тебе нужен только 2 каких-то придется писать либо matrix, _, _, _, selection, _ = self._build_accounts(...) либо built_account = self._build_account(...)\matrix, selection = built_account[0], built_account[4]). Исходя из вышеперечисленного предлагаю сделать в файле класс

@dataclasses.dataclass
class BuitAccount:
    matrix: IntercompanyMatrixOut
    consolidation_version: ConsolidationVersion
    ... 

Ну либо через pydantic аналогичный. Вроде _build_account только в двух местах вызывается, там поправить получение даннх в связи с этим

Тут все же буду настаивать. Когда функция\метод возвращает два значения это еще туда сюда, но когда уже больше - код превращается в месиво. Не очевидно, какой параметр возвращается каким (например, надо помнить, что объект MatrixSelection возвращается 5, нужно заходить в определение функции и отсчитывать, в каком он месте. К тому же, если тебе нужен только 2 каких-то придется писать либо matrix, _, _, _, selection, _ = self._build_accounts(...) либо built_account = self._build_account(...)\matrix, selection = built_account[0], built_account[4]). Исходя из вышеперечисленного предлагаю сделать в файле класс ``` @dataclasses.dataclass class BuitAccount: matrix: IntercompanyMatrixOut consolidation_version: ConsolidationVersion ... ``` Ну либо через pydantic аналогичный. Вроде _build_account только в двух местах вызывается, там поправить получение даннх в связи с этим
Owner

Ну и, соответственно, получение данных теперь будет matrix = (await self._build_account(...)).matrix или просто брать built_account = await self._build_account(...) и далее просто брать че надо, built_account.matrix или там built_account.selection и т д

Ну и, соответственно, получение данных теперь будет matrix = (await self._build_account(...)).matrix или просто брать built_account = await self._build_account(...) и далее просто брать че надо, built_account.matrix или там built_account.selection и т д
Author
Owner

исправила

исправила
PotapovaA added 1 commit 2026-10-21 11:59:35 +03:00
PotapovaA added 1 commit 2026-10-21 12:15:28 +03:00
tsygankoviva approved these changes 2026-10-21 12:47:43 +03:00
aep added 3 commits 2026-10-21 13:19:01 +03:00
aep added 1 commit 2026-10-21 14:10:33 +03:00
Фиксация версии правил и выбор по дате составления консолидации — в AURORA-1536;
корректировки и unpaired-osv выносятся из PR (код — ветка
wip/shahmatka-corrections-unpaired); пресет = правило ББ Прил. 3 как дополнение к §6.

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

PR относится к AURORA-1747 «Шахматка: пресет по правилу ББ Прил. 3 и формат elimination-rules» — выделена из AURORA-1536. Расчёт элиминации §5 (каскад, упаковка, API пар, фиксация версии правил) остаётся в AURORA-1536, она вернулась в «Разработку». Название PR и коммиты лучше привязать к AURORA-1747.

Спасибо, замечания Ивана закрыты: _build_accounts теперь возвращает MatrixBuildResult, свод — ConsolidatedOsvBuildResult, докстринг режимов на месте, московское время убрано.

Что сделано в ветке со стороны ревью (перед продолжением работы — git pull):

  • a8e510e — влит свежий main (без конфликтов).
  • 367a11e — ruff format (3 файла) и длинная строка имени файла в consolidated_osv.py; mypy в intercompany_matrix.py (measure: Measure); удалено поле as_of из EliminationRulesOut — после правок оно всегда было None; интеграционный test_preset_uses_current_rules_when_version_unfixed приведён к текущему поведению (is_version_fixed=false, version_no=None).
  • 0e95f95 — OpenSpec change openspec/changes/intercompany-matrix-presets/: дельты consolidations-api (ответ elimination-rules теперь объект), consolidated-osv (PRESET, xlsx пресета), audit-trail (mode=PRESET, rule_id). В README добавлены новые маршруты и коды ошибок.
  • 3adaf6f — решения по объёму PR (ниже) записаны в design.md и tasks.md change.
  • Ветка wip/shahmatka-corrections-unpaired (на 0e95f95) — закладка: учёт корректировок и ручка unpaired-osv сохранены там как есть, ничего не потеряется.
  • docs PR RSHB/arm-ka-docs#146 — §6 дополнен пресетом по правилу ББ, в §4 записано, по какой версии правил считать.

Сейчас зелёные: make check (ruff, mypy, 1793 юнит-теста) и make test-integration (945 passed, 0 failed).

Решения по объёму PR

  • Пресет = правило Прил. 3 — принимаем как дополнение к пресетам §6 (наборам счетов), но только для правил ББ: правил ОФР в seed нет, ОФР в §4 ещё не формализован.
  • Корректировки из шахматки убираем. Создавать их в ядре пока нечем (это спринт корректировок), и не утверждено, как корректировка (правило, A, B) ложится на ячейки (A, B) / (B, A), учитываются ли её счета и parent_correction_id. По §6 шахматка — суммы первички. Вернём из закладки после решения по аналитике AURORA-1643.
  • Ручку unpaired-osv убираем. Сейчас «без пары» считается по наличию строк (AURORA-1651), из-за пересечения счетов (76 в обеих сторонах правила № 6) появляются ложные строки, и это понятие расходится с «без пары» из §5. Сценарий «посмотреть строки ячейки» — AURORA-1653 (osv_entry_ids_* в ячейке уже есть), настоящие строки без пары — упаковка §5 в AURORA-1536 (следующий шаг).
  • Версия правил. Фиксацию elimination_rules_version делаем следующим шагом в AURORA-1536: версия правил, действующая на дату составления консолидации (не на отчётный период), при создании версии или первом расчёте, не в GET. В этом PR запасной вариант «открытые правила» остаётся: сейчас версия правил одна, результат не плавает.

Обязательно

  1. Отдельным коммитом убрать учёт корректировок (_apply_corrections, correction_for_version_consolidation, correction_ids_* в ячейке) и ручку unpaired-osv (get_unpaired_rows, UnpairedOsvOut, маршрут) вместе с их тестами, в том числе test_correction_repository.py и строки в test_openapi_routes. Отдельный коммит — чтобы потом вернуть всё одним git revert. Спеку и README после этого поправлю сам.
  2. PRESET — только для правил statement_type = balance; правило ОФР — 422 INVALID_RULE, и тест на это.
  3. «Открытые» правила (valid_to IS NULL) могут оказаться сразу из двух version_no, если новую версию завели, а старую не закрыли: получим дубли rule_no. Нужно брать одну версию (max version_no) или явно падать, и тест на это. Заодно при незафиксированной версии стоит отдавать в ответе фактический version_no открытых правил, чтобы фронт видел, по какой версии посчитано.

Желательно

  1. Имя файла …_preset-<uuid>.xlsx неудобно пользователю; лучше номер правила (…_rule-balance-6.xlsx). В шапке книги стоит только «Пресет» — добавить номер правила, статьи и версию правил.
  2. В audit EXPORT для пресета добавить номер и версию правил — иначе по аудиту не восстановить, что выгружали.
  3. ConsolidatedOsvService.build() теперь просто вызывает build_with_members() — можно оставить один метод. Переименование старых приватных хелперов (_amount → _get_amount и т.п.) не обязательно: Иван просил только про select-функции и сам предложил оставить.
  4. Ветка side_1 = "K" в _resolve_preset_selection без теста.
  5. Добавить § в docstring новых функций (правило репозитория).
PR относится к **AURORA-1747** «Шахматка: пресет по правилу ББ Прил. 3 и формат elimination-rules» — выделена из AURORA-1536. Расчёт элиминации §5 (каскад, упаковка, API пар, фиксация версии правил) остаётся в AURORA-1536, она вернулась в «Разработку». Название PR и коммиты лучше привязать к AURORA-1747. Спасибо, замечания Ивана закрыты: `_build_accounts` теперь возвращает `MatrixBuildResult`, свод — `ConsolidatedOsvBuildResult`, докстринг режимов на месте, московское время убрано. **Что сделано в ветке со стороны ревью** (перед продолжением работы — `git pull`): - `a8e510e` — влит свежий main (без конфликтов). - `367a11e` — `ruff format` (3 файла) и длинная строка имени файла в `consolidated_osv.py`; mypy в `intercompany_matrix.py` (`measure: Measure`); удалено поле `as_of` из `EliminationRulesOut` — после правок оно всегда было `None`; интеграционный `test_preset_uses_current_rules_when_version_unfixed` приведён к текущему поведению (`is_version_fixed=false`, `version_no=None`). - `0e95f95` — OpenSpec change `openspec/changes/intercompany-matrix-presets/`: дельты `consolidations-api` (ответ `elimination-rules` теперь объект), `consolidated-osv` (PRESET, xlsx пресета), `audit-trail` (`mode=PRESET`, `rule_id`). В README добавлены новые маршруты и коды ошибок. - `3adaf6f` — решения по объёму PR (ниже) записаны в `design.md` и `tasks.md` change. - Ветка `wip/shahmatka-corrections-unpaired` (на `0e95f95`) — закладка: учёт корректировок и ручка unpaired-osv сохранены там как есть, ничего не потеряется. - docs PR RSHB/arm-ka-docs#146 — §6 дополнен пресетом по правилу ББ, в §4 записано, по какой версии правил считать. Сейчас зелёные: `make check` (ruff, mypy, 1793 юнит-теста) и `make test-integration` (945 passed, 0 failed). **Решения по объёму PR** - **Пресет = правило Прил. 3** — принимаем как дополнение к пресетам §6 (наборам счетов), но только для правил ББ: правил ОФР в seed нет, ОФР в §4 ещё не формализован. - **Корректировки из шахматки убираем.** Создавать их в ядре пока нечем (это спринт корректировок), и не утверждено, как корректировка `(правило, A, B)` ложится на ячейки (A, B) / (B, A), учитываются ли её счета и `parent_correction_id`. По §6 шахматка — суммы первички. Вернём из закладки после решения по аналитике AURORA-1643. - **Ручку unpaired-osv убираем.** Сейчас «без пары» считается по наличию строк (AURORA-1651), из-за пересечения счетов (76 в обеих сторонах правила № 6) появляются ложные строки, и это понятие расходится с «без пары» из §5. Сценарий «посмотреть строки ячейки» — AURORA-1653 (`osv_entry_ids_*` в ячейке уже есть), настоящие строки без пары — упаковка §5 в AURORA-1536 (следующий шаг). - **Версия правил.** Фиксацию `elimination_rules_version` делаем следующим шагом в AURORA-1536: версия правил, действующая на дату составления консолидации (не на отчётный период), при создании версии или первом расчёте, не в GET. В этом PR запасной вариант «открытые правила» остаётся: сейчас версия правил одна, результат не плавает. **Обязательно** 1. Отдельным коммитом убрать учёт корректировок (`_apply_corrections`, `correction_for_version_consolidation`, `correction_ids_*` в ячейке) и ручку unpaired-osv (`get_unpaired_rows`, `UnpairedOsvOut`, маршрут) вместе с их тестами, в том числе `test_correction_repository.py` и строки в `test_openapi_routes`. Отдельный коммит — чтобы потом вернуть всё одним `git revert`. Спеку и README после этого поправлю сам. 2. PRESET — только для правил `statement_type = balance`; правило ОФР — 422 `INVALID_RULE`, и тест на это. 3. «Открытые» правила (`valid_to IS NULL`) могут оказаться сразу из двух `version_no`, если новую версию завели, а старую не закрыли: получим дубли `rule_no`. Нужно брать одну версию (max `version_no`) или явно падать, и тест на это. Заодно при незафиксированной версии стоит отдавать в ответе фактический `version_no` открытых правил, чтобы фронт видел, по какой версии посчитано. **Желательно** 1. Имя файла `…_preset-<uuid>.xlsx` неудобно пользователю; лучше номер правила (`…_rule-balance-6.xlsx`). В шапке книги стоит только «Пресет» — добавить номер правила, статьи и версию правил. 2. В audit EXPORT для пресета добавить номер и версию правил — иначе по аудиту не восстановить, что выгружали. 3. `ConsolidatedOsvService.build()` теперь просто вызывает `build_with_members()` — можно оставить один метод. Переименование старых приватных хелперов (`_amount` → `_get_amount` и т.п.) не обязательно: Иван просил только про select-функции и сам предложил оставить. 4. Ветка `side_1 = "K"` в `_resolve_preset_selection` без теста. 5. Добавить § в docstring новых функций (правило репозитория).
aep added 1 commit 2026-10-21 14:51:10 +03:00
PotapovaA added 10 commits 2026-10-22 15:36:03 +03:00
Author
Owner

все исправила

все исправила
aep added 2 commits 2026-10-22 17:47:10 +03:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
aep added 1 commit 2026-10-22 17:48:10 +03:00
aep added 1 commit 2026-10-22 17:56:30 +03:00
Owner

Ревью, раунд 2 (b7d9794, 02d67ff)

Прошлый список закрыт, make check и интеграционные зелёные, main влилась без потерь в коде. Я влил свежий main, вернул в README потерявшуюся при мерже фразу про выгрузку результирующей таблицы, поправил change и гайд фронта.

Сливаю. Что осталось по мелочи, вынес в техдолг AURORA-1761: шапка xlsx пресета (счета как в правиле и «кроме …» вместо 50 раскрытых субсчетов), подписи статей при side_1 = K, лишний raise ValueError в _export_response, реквизиты правила в MatrixExportInfo и _filename, описания ошибок preset в OpenAPI, проверка правила до расчёта свода.

С #165 у тебя теперь будет конфликт в intercompany_matrix.py и тестах шахматки, плюс тесты на старый смысл one_sided отсюда там упадут — подтяни main в ту ветку.

Ревью, раунд 2 (b7d9794, 02d67ff) Прошлый список закрыт, make check и интеграционные зелёные, main влилась без потерь в коде. Я влил свежий main, вернул в README потерявшуюся при мерже фразу про выгрузку результирующей таблицы, поправил change и гайд фронта. Сливаю. Что осталось по мелочи, вынес в техдолг AURORA-1761: шапка xlsx пресета (счета как в правиле и «кроме …» вместо 50 раскрытых субсчетов), подписи статей при side_1 = K, лишний raise ValueError в _export_response, реквизиты правила в MatrixExportInfo и _filename, описания ошибок preset в OpenAPI, проверка правила до расчёта свода. С #165 у тебя теперь будет конфликт в intercompany_matrix.py и тестах шахматки, плюс тесты на старый смысл one_sided отсюда там упадут — подтяни main в ту ветку.
aep merged commit 96f2b9a6d9 into main 2026-10-22 17:57:14 +03:00
Sign in to join this conversation.
No Reviewers
No Label
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

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