docs(openspec): архив intercompany-result-table-export (PR #159)

Задачи 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 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-10-22 12:49:20 +04:00
parent ab49f5e83d
commit 8dd48f3fad
7 changed files with 46 additions and 3 deletions

View File

@ -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 руб. последние копейки в файле округлятся; лечится только выгрузкой сумм текстом.

View File

@ -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

View File

@ -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` не записано

View File

@ -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<n>.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 с тем же телом, что у несуществующей версии