From e9a4f8e8a86ab22d7d6c8d21fa651470e0739d41 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Wed, 11 Nov 2026 15:17:08 +0400 Subject: [PATCH] openspec: change intercompany-matrix-preset-header (AURORA-1761, PR #223) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Шапка XLSX пресета: коды правила без раскрытия, строки «кроме», статьи А/Б по сторонам. Сценарий правила № 6 — без перечня кодов (после AURORA-2034 исключения 76 на обеих сторонах), решения в design.md. Co-Authored-By: Claude Opus 5.5 --- .../design.md | 11 ++++++ .../proposal.md | 34 +++++++++++++++++++ .../specs/consolidated-osv/spec.md | 29 ++++++++++++++++ .../tasks.md | 10 ++++++ 4 files changed, 84 insertions(+) create mode 100644 openspec/changes/intercompany-matrix-preset-header/design.md create mode 100644 openspec/changes/intercompany-matrix-preset-header/proposal.md create mode 100644 openspec/changes/intercompany-matrix-preset-header/specs/consolidated-osv/spec.md create mode 100644 openspec/changes/intercompany-matrix-preset-header/tasks.md diff --git a/openspec/changes/intercompany-matrix-preset-header/design.md b/openspec/changes/intercompany-matrix-preset-header/design.md new file mode 100644 index 0000000..a62afc3 --- /dev/null +++ b/openspec/changes/intercompany-matrix-preset-header/design.md @@ -0,0 +1,11 @@ +# Design + +## Decisions made without discussion + +1. **2026-11-11. Сценарий правила № 6 без перечня кодов.** После AURORA-2034 (seed правила 6 исключает 15 субсчетов 76 + на обеих сторонах) сценарий автора «кроме 76.07.5, 76.07.9» / «кроме 76.07.1» устарел; в спеке сценарий описан без + перечня кодов, точный список проверяет тест seed. Цена ошибки: спека не ловит расхождение шапки с seed — его ловит + `test_seed_rules.py`. +2. **2026-11-11. Влив main: пустая сторона в шапке.** В main ALL/MANUAL объединены, у MANUAL сторона может быть пустой; + при разрешении конфликта шапка пишет «Все балансовые счета» для пустой стороны (`or all_accounts`, как в main), а не + по режиму. Цена ошибки: для PRESET сторона пустой не бывает (`ACCOUNTS_REQUIRED`), на шапку пресета не влияет. diff --git a/openspec/changes/intercompany-matrix-preset-header/proposal.md b/openspec/changes/intercompany-matrix-preset-header/proposal.md new file mode 100644 index 0000000..f532616 --- /dev/null +++ b/openspec/changes/intercompany-matrix-preset-header/proposal.md @@ -0,0 +1,34 @@ +# Proposal + +## Why + +AURORA-1761 (PR arm-core #223): техдолг ревью PR #141 (пресет шахматки по правилу ББ, AURORA-1747). Шапка XLSX пресета +перечисляла все раскрытые субсчета сторон правила: для правила № 6 — около 50 кодов в одной ячейке, а исключения +субсчетов 76 не видны вовсе, шапку нельзя сверить с Прил. 3. Подписи «Статья А / Статья Б» не учитывали `side_1 = K`. + +## What Changes + +- Шапка XLSX пресета: «Счета дебета» / «Счета кредита» — коды так, как они заданы в правиле; под каждой стороной строка + «кроме» с исключёнными кодами этой стороны. +- «Статья А» — статья дебетовой стороны, «Статья Б» — кредитовой: при `side_1 = K` статьи меняются местами. +- Реквизиты правила в `MatrixExportInfo` — вложенный `PresetRuleDetails` (None для ALL/MANUAL) вместо шести + необязательных полей; имя файла через общий `VersionExportInfo._filename`. +- Из `_export_response` убрана проверка с `raise ValueError` (давала 500). +- OpenAPI маршрутов preset: 404 — версия или правило, 422 — `INVALID_RULE` / `RULE_REQUIRED` / `ACCOUNTS_REQUIRED`. + +## Capabilities + +### Modified Capabilities + +- `consolidated-osv` — «XLSX шахматки пресета»: коды правила без раскрытия, строки «кроме», статьи по сторонам. + +## Impact + +arm-core `api/src/services/intercompany_matrix.py`, `api/src/services/intercompany_matrix_export.py`, +`api/src/api/endpoints/consolidations/intercompany_matrix.py`, тесты шахматки. JSON-ответ расчёта, аудит, DBML, +`05-domain-rules.md` не меняются. + +## Non-goals + +- Проверка правила до расчёта сводной ОСВ (необязательный пункт задачи) — не сделана: на неверный `rule_id` по-прежнему + сначала считается свод. diff --git a/openspec/changes/intercompany-matrix-preset-header/specs/consolidated-osv/spec.md b/openspec/changes/intercompany-matrix-preset-header/specs/consolidated-osv/spec.md new file mode 100644 index 0000000..065ac5e --- /dev/null +++ b/openspec/changes/intercompany-matrix-preset-header/specs/consolidated-osv/spec.md @@ -0,0 +1,29 @@ +## MODIFIED Requirements + +### Requirement: XLSX шахматки пресета +`GET …/intercompany-matrix/preset/{rule_id}/export` SHALL возвращать XLSX с теми же строками, что JSON-расчёт +пресета. Имя файла SHALL иметь вид `intercompany-matrix_<ГК>_<год>-<квартал>_v_rule-balance-.xlsx`. Шапка SHALL +содержать режим «Пресет», коды счетов дебета и кредита так, как они заданы в правиле (без раскрытия по иерархии), под +каждой стороной — строку «кроме» с исключёнными кодами этой стороны, если исключения есть, номер правила, статьи А и Б, +фактическую версию правил и строку «Показатель» со значением «Сальдо» для `closing` или «Оборот» для `turnover`. +Статья А SHALL относиться к дебетовой стороне, статья Б — к кредитовой: `article_1_line` / `article_2_line` при +`side_1 = D`, наоборот при `side_1 = K`. Строка «Показатель» SHALL присутствовать и в выгрузках ALL и MANUAL (значение +«Сальдо»). + +#### Scenario: Правило с исключениями на обеих сторонах +- **WHEN** пользователь выгружает пресет правила № 6 из seed-набора Прил. 3 (маска «76» на обеих сторонах с + исключениями субсчетов 76) +- **THEN** «Счета дебета» и «Счета кредита» содержат только коды сторон правила, включая «76», без раскрытых субсчетов; + под каждой стороной строка «кроме» перечисляет исключённые коды этой стороны + +#### Scenario: Кредитная первая сторона правила +- **WHEN** пользователь выгружает пресет с `side_1 = K` +- **THEN** «Статья А» содержит `article_2_line`, «Статья Б» — `article_1_line` + +#### Scenario: Выгрузка по оборотам +- **WHEN** пользователь выгружает пресет с `measure = turnover` +- **THEN** шапка содержит «Режим — Пресет», «Показатель — Оборот», номер, статьи и версию правила; имя файла заканчивается на `_rule-balance-.xlsx` + +#### Scenario: Правило не найдено +- **WHEN** `rule_id` не существует +- **THEN** 404, файл не отдаётся, событие аудита не пишется diff --git a/openspec/changes/intercompany-matrix-preset-header/tasks.md b/openspec/changes/intercompany-matrix-preset-header/tasks.md new file mode 100644 index 0000000..3c1266a --- /dev/null +++ b/openspec/changes/intercompany-matrix-preset-header/tasks.md @@ -0,0 +1,10 @@ +# Tasks + +- [x] 1.1 arm-core `api/src/services/intercompany_matrix.py` — `PresetRuleDetails`, коды сторон правила и исключений в + `MatrixSelection`, `filename` через `_filename` (PR #223, автор) +- [x] 1.2 arm-core `api/src/services/intercompany_matrix_export.py` — строки «кроме», статьи А/Б по `side_1` (PR #223, автор) +- [x] 1.3 arm-core `api/src/api/endpoints/consolidations/intercompany_matrix.py` — `PRESET_ERRORS`, без `raise ValueError` + в `_export_response` (PR #223, автор) +- [x] 1.4 Тесты: шапка правила № 6 с исключениями, `side_1 = K`, описания ошибок маршрутов preset (PR #223, автор) +- [x] 1.5 Ревью: влит main (объединённые ALL/MANUAL, AURORA-2034), пустая сторона MANUAL в шапке — «Все балансовые счета»; + правка спеки перенесена из `openspec/specs` в этот change