From 8dd48f3fadff026b979803457e2c5c37820732d3 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Thu, 22 Oct 2026 12:49:20 +0400 Subject: [PATCH] =?UTF-8?q?docs(openspec):=20=D0=B0=D1=80=D1=85=D0=B8?= =?UTF-8?q?=D0=B2=20intercompany-result-table-export=20(PR=20#159)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Задачи 2.1/2.2 отмечены: #159 слит до #141, кнопка выгрузки — PR #158, строка в frontend-api-guide — follow-up в arm-ka-docs. M-7 отклонено (design.md). Co-Authored-By: Claude Opus 5.5 --- .../design.md | 7 ++++++- .../proposal.md | 0 .../specs/audit-trail/spec.md | 0 .../specs/consolidations-api/spec.md | 0 .../tasks.md | 6 ++++-- openspec/specs/audit-trail/spec.md | 15 +++++++++++++ openspec/specs/consolidations-api/spec.md | 21 +++++++++++++++++++ 7 files changed, 46 insertions(+), 3 deletions(-) rename openspec/changes/{intercompany-result-table-export => archive/2026-10-22-intercompany-result-table-export}/design.md (80%) rename openspec/changes/{intercompany-result-table-export => archive/2026-10-22-intercompany-result-table-export}/proposal.md (100%) rename openspec/changes/{intercompany-result-table-export => archive/2026-10-22-intercompany-result-table-export}/specs/audit-trail/spec.md (100%) rename openspec/changes/{intercompany-result-table-export => archive/2026-10-22-intercompany-result-table-export}/specs/consolidations-api/spec.md (100%) rename openspec/changes/{intercompany-result-table-export => archive/2026-10-22-intercompany-result-table-export}/tasks.md (51%) diff --git a/openspec/changes/intercompany-result-table-export/design.md b/openspec/changes/archive/2026-10-22-intercompany-result-table-export/design.md similarity index 80% rename from openspec/changes/intercompany-result-table-export/design.md rename to openspec/changes/archive/2026-10-22-intercompany-result-table-export/design.md index 7b02f29..fd39fe0 100644 --- a/openspec/changes/intercompany-result-table-export/design.md +++ b/openspec/changes/archive/2026-10-22-intercompany-result-table-export/design.md @@ -29,4 +29,9 @@ в файле. Цена ошибки: при таком дефекте расчёта выгрузка ответит 500 вместо файла с нулём. - 22.10.2026. Общие реквизиты книги вынесены в базовый `VersionExportInfo`, затронут и код выгрузки шахматки. Обоснование: замечание ревью о копиях шапки и имени файла. Цена ошибки: конфликт слияния с PR #141 (тот меняет - `MatrixExportInfo`); порядок — сначала #141, затем ребейз #159. + `MatrixExportInfo`); порядок — сначала #141, затем ребейз #159. Владелец 22.10.2026 решил иначе: #159 слит первым, + конфликт разрешается при слиянии #141. +- 22.10.2026. M-7 ревью (openpyxl пишет числа через `%.16g`, `Decimal` теряет точность после 16 значащих цифр) + отклонено. Обоснование: Excel хранит число с точностью 15 значащих цифр, выгрузка в ячейку-число не может быть точнее; + потеря начинается с сумм порядка 10^14 руб., таких в отчётности групп нет. То же относится к выгрузке шахматки. Цена + ошибки: для сумм от 10^14 руб. последние копейки в файле округлятся; лечится только выгрузкой сумм текстом. diff --git a/openspec/changes/intercompany-result-table-export/proposal.md b/openspec/changes/archive/2026-10-22-intercompany-result-table-export/proposal.md similarity index 100% rename from openspec/changes/intercompany-result-table-export/proposal.md rename to openspec/changes/archive/2026-10-22-intercompany-result-table-export/proposal.md diff --git a/openspec/changes/intercompany-result-table-export/specs/audit-trail/spec.md b/openspec/changes/archive/2026-10-22-intercompany-result-table-export/specs/audit-trail/spec.md similarity index 100% rename from openspec/changes/intercompany-result-table-export/specs/audit-trail/spec.md rename to openspec/changes/archive/2026-10-22-intercompany-result-table-export/specs/audit-trail/spec.md diff --git a/openspec/changes/intercompany-result-table-export/specs/consolidations-api/spec.md b/openspec/changes/archive/2026-10-22-intercompany-result-table-export/specs/consolidations-api/spec.md similarity index 100% rename from openspec/changes/intercompany-result-table-export/specs/consolidations-api/spec.md rename to openspec/changes/archive/2026-10-22-intercompany-result-table-export/specs/consolidations-api/spec.md diff --git a/openspec/changes/intercompany-result-table-export/tasks.md b/openspec/changes/archive/2026-10-22-intercompany-result-table-export/tasks.md similarity index 51% rename from openspec/changes/intercompany-result-table-export/tasks.md rename to openspec/changes/archive/2026-10-22-intercompany-result-table-export/tasks.md index 8309416..fadca3d 100644 --- a/openspec/changes/intercompany-result-table-export/tasks.md +++ b/openspec/changes/archive/2026-10-22-intercompany-result-table-export/tasks.md @@ -6,5 +6,7 @@ ## 2. После слияния -- [ ] 2.1 Ребейз на `main` после слияния PR #141 (`build_with_members` возвращает объект), `make check-full` -- [ ] 2.2 Кнопка выгрузки на экране результирующей таблицы (`web/`) и строка в `../docs/dev/frontend-api-guide.md` +- [x] 2.1 PR #159 слит раньше #141 (решение владельца 22.10.2026); конфликт с #141 (`build_with_members` возвращает + объект) разрешается при слиянии #141 +- [x] 2.2 Кнопка выгрузки на экране результирующей таблицы — в PR #158 (коммит 473492f); строка в + `../docs/dev/frontend-api-guide.md` — follow-up в arm-ka-docs diff --git a/openspec/specs/audit-trail/spec.md b/openspec/specs/audit-trail/spec.md index 085fe86..ffe6640 100644 --- a/openspec/specs/audit-trail/spec.md +++ b/openspec/specs/audit-trail/spec.md @@ -157,3 +157,18 @@ credit_account_ids, cells}`. `mode` — `ALL` или `MANUAL`, массивы с #### Scenario: Две выгрузки - **WHEN** пользователь дважды выгружает ту же шахматку - **THEN** в `audit_event` две разные записи `EXPORT`, каждая со своим payload и числом ячеек + +### Requirement: Аудит экспорта результирующей таблицы ВГО +Каждый успешный `GET …/intercompany-matrix/result-table/export` SHALL добавлять отдельное неизменяемое событие +`audit_event` с `action = EXPORT`, `section = EXPORT`, `object_type = consolidation_version`, +`object_id = consolidation_version_id`, `consolidation_version_id` версии, `user_id` инициатора, `before_value = null` +и `after_value = {report: "intercompany_result_table", articles}`, где `articles` — число статей в книге. Неуспешная +выгрузка (404, 422, ошибка сборки книги) события не пишет. + +#### Scenario: Выгрузка таблицы +- **WHEN** пользователь выгружает результирующую таблицу версии +- **THEN** в `audit_event` одна запись `EXPORT` с `after_value = {report: "intercompany_result_table", articles: 5}` + +#### Scenario: Нет счёта статьи +- **WHEN** выгрузка отвечает 422 `RESULT_ACCOUNTS_MISSING` +- **THEN** событие `EXPORT` не записано diff --git a/openspec/specs/consolidations-api/spec.md b/openspec/specs/consolidations-api/spec.md index 5b64bd6..66eaf9c 100644 --- a/openspec/specs/consolidations-api/spec.md +++ b/openspec/specs/consolidations-api/spec.md @@ -251,3 +251,24 @@ SHALL возвращать все правила версии массивом. #### Scenario: Нет обязательного счёта - **WHEN** в плане счетов отсутствует счёт 58.03 - **THEN** ответ 422 `RESULT_ACCOUNTS_MISSING`, сообщение содержит `58.03` + +### Requirement: XLSX результирующей таблицы ВГО +`GET /api/v1/consolidations/versions/{version_id}/intercompany-matrix/result-table/export` (`CONSOLIDATION_VIEW`, +policy) SHALL возвращать XLSX с теми же статьями, компаниями и итогами, что `GET …/intercompany-matrix/result-table`, +из того же расчёта сводной ОСВ версии. Книга — лист «Результирующая таблица» с шапкой (ГК, период, версия, единицы +«руб.») и таблицей «Статья ВГО» × компании периметра + колонка «Итого по группе»; суммы — числа с двумя знаками. Имя +файла — `intercompany-result-table_<ГК>_<год>-<квартал>_v.xlsx`. Ошибки — как у JSON-маршрута: невидимая или +несуществующая версия — 404, отсутствие необходимого кода счёта — 422 `RESULT_ACCOUNTS_MISSING`. + +#### Scenario: Совпадение с JSON +- **WHEN** пользователь выгружает результирующую таблицу ГК «Русский бисквит» за 2024 Q1, версия 1 +- **THEN** имя содержит `Русский бисквит_2024-Q1_v1.xlsx`, порядок компаний, названия статей, суммы по компаниям и + «Итого по группе» совпадают с ответом `GET …/result-table` той же версии + +#### Scenario: Нет счёта статьи +- **WHEN** в плане счетов нет кода 58.03 +- **THEN** выгрузка отвечает 422 `RESULT_ACCOUNTS_MISSING` с кодом в сообщении, файл не формируется + +#### Scenario: Версия вне видимости +- **WHEN** пользователь филиала выгружает таблицу версии чужой ГК +- **THEN** ответ 404 с тем же телом, что у несуществующей версии -- 2.47.2