From df4e171cc53e121d8773566d7773509fdcb88d45 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Fri, 6 Nov 2026 17:00:46 +0400 Subject: [PATCH] =?UTF-8?q?AURORA-1756:=20=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B8=20=D0=B8=D1=82=D0=BE=D0=B3=D0=BE=D0=B2=20=D0=B2=20?= =?UTF-8?q?xlsx=20=E2=80=94=20=C2=AB=D0=98=D1=82=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=94=D1=82=C2=BB=20/=20=C2=AB=D0=98=D1=82=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D0=9A=D1=82=C2=BB,=20=D0=BA=D0=B0=D0=BA=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=8D=D0=BA=D1=80=D0=B0=D0=BD=D0=B5=20=D0=B8=20=D0=B2=20DOC-22?= =?UTF-8?q?1277?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- README.md | 2 +- api/src/services/intercompany_matrix_export.py | 4 ++-- api/tests/test_api_intercompany_matrix.py | 2 +- api/tests/test_intercompany_matrix_export.py | 4 ++-- openspec/changes/intercompany-matrix-totals/proposal.md | 2 +- .../intercompany-matrix-totals/specs/consolidated-osv/spec.md | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 5034e9a..8f268f7 100644 --- a/README.md +++ b/README.md @@ -938,7 +938,7 @@ API: список счетов `GET /directories/accounts`, правила ве `GET …/intercompany-matrix/result-table` и её XLSX `GET …/intercompany-matrix/result-table/export` (аудит `EXPORT`, `report = "intercompany_result_table"`). Режим PRESET (счета и показатель из правила элиминации): `GET …/intercompany-matrix/preset/{rule_id}` и его выгрузка `…/preset/{rule_id}/export`. -Пустой список стороны выбирает все подходящие балансовые счета (без 001–012); непустой список может включать и забалансовые; `legal_entity_ids` сужает обе оси и итоги до выбранных ЮЛ. Итоги `total_debit` («Итого Дт», строка) и `total_credit` («Итого Кт», столбец) — по ID ЮЛ, в xlsx — колонка «Дебет» и строка «Кредит»; у результирующей таблицы итога по статьям нет. `one_sided` — ровно одна сумма +Пустой список стороны выбирает все подходящие балансовые счета (без 001–012); непустой список может включать и забалансовые; `legal_entity_ids` сужает обе оси и итоги до выбранных ЮЛ. Итоги `total_debit` («Итого Дт», строка) и `total_credit` («Итого Кт», столбец) — по ID ЮЛ, в xlsx — те же колонка и строка; у результирующей таблицы итога по статьям нет. `one_sided` — ровно одна сумма пары нулевая; пара подсвечивается (и в xlsx) при `exceeds_threshold` или `one_sided` (AURORA-1651). `GET …/elimination-rules` отдаёт объект `{version_no, is_version_fixed, rules}` (у правила есть `id`): правила версии `consolidation_version.elimination_rules_version` — она фиксируется при создании версии консолидации (действующая на дату diff --git a/api/src/services/intercompany_matrix_export.py b/api/src/services/intercompany_matrix_export.py index 6915552..2a22051 100644 --- a/api/src/services/intercompany_matrix_export.py +++ b/api/src/services/intercompany_matrix_export.py @@ -105,7 +105,7 @@ def _write_matrix_totals( debit_total.alignment = Alignment(horizontal="right", vertical="center") credit_total_row = data_start_row + len(matrix.companies) * len(METRICS) - _text(sheet, credit_total_row, 1, "Кредит") + _text(sheet, credit_total_row, 1, "Итого Кт") sheet.cell(credit_total_row, 1).font = Font(bold=True) for column, company in enumerate(matrix.companies, start=3): credit_total = sheet.cell(credit_total_row, column, matrix.total_credit[company.id]) @@ -129,7 +129,7 @@ def build_matrix_workbook(matrix: IntercompanyMatrixOut, info: MatrixExportInfo) for column, company in enumerate(matrix.companies, start=3): _text(sheet, table_header_row, column, company.name) sheet.column_dimensions[get_column_letter(column)].width = 26 - _text(sheet, table_header_row, debit_total_column, "Дебет") + _text(sheet, table_header_row, debit_total_column, "Итого Дт") sheet.column_dimensions[get_column_letter(debit_total_column)].width = 26 sheet.row_dimensions[table_header_row].height = 36 for header in sheet[table_header_row]: diff --git a/api/tests/test_api_intercompany_matrix.py b/api/tests/test_api_intercompany_matrix.py index 4109f94..2b131f5 100644 --- a/api/tests/test_api_intercompany_matrix.py +++ b/api/tests/test_api_intercompany_matrix.py @@ -167,7 +167,7 @@ async def test_company_filter_applies_to_matrix_and_export( assert [sheet.cell(10, column).value for column in range(3, 6)] == [ world.members[0].name, world.members[1].name, - "Дебет", + "Итого Дт", ] audit = (await seeded.scalars(select(AuditEvent).where(AuditEvent.action == AuditAction.EXPORT))).one() assert audit.after_value["legal_entity_ids"] == selected diff --git a/api/tests/test_intercompany_matrix_export.py b/api/tests/test_intercompany_matrix_export.py index 2320e02..a9b764e 100644 --- a/api/tests/test_intercompany_matrix_export.py +++ b/api/tests/test_intercompany_matrix_export.py @@ -108,7 +108,7 @@ def test_matrix_export_has_three_rows_per_debit_company_and_highlights_threshold "Показатель", "=Компания А", "Компания Б", - "Дебет", + "Итого Дт", ] assert all(cell.alignment.horizontal == "center" and cell.alignment.vertical == "center" for cell in sheet[10]) assert sheet["C10"].data_type == "s" @@ -147,7 +147,7 @@ def test_matrix_export_has_three_rows_per_debit_company_and_highlights_threshold assert [sheet.cell(row, 3).value for row in range(15, 19)] == [0, 20, 20, 0] assert Decimal(str(sheet["E11"].value)) == Decimal("100.25") assert Decimal(str(sheet["E15"].value)) == Decimal("20") - assert [sheet.cell(19, column).value for column in range(1, 6)] == ["Кредит", None, 20, 90, None] + assert [sheet.cell(19, column).value for column in range(1, 6)] == ["Итого Кт", None, 20, 90, None] assert all(sheet[cell].number_format == MONEY_FORMAT for cell in ("E11", "E15", "C19", "D19")) assert all(sheet.cell(row, 3).fill.fgColor.rgb != THRESHOLD_FILL.fgColor.rgb for row in range(15, 19)) assert sheet.freeze_panes == "C11" diff --git a/openspec/changes/intercompany-matrix-totals/proposal.md b/openspec/changes/intercompany-matrix-totals/proposal.md index bdb270d..2b1d581 100644 --- a/openspec/changes/intercompany-matrix-totals/proposal.md +++ b/openspec/changes/intercompany-matrix-totals/proposal.md @@ -13,7 +13,7 @@ счета; пустой `legal_entity_ids` — весь периметр. **BREAKING** для клиента фронта (переводится в AURORA-1757, сливается одновременно). - В ответе матрицы `total_debit` и `total_credit` — итог по каждому ЮЛ, строки с двумя знаками. -- В XLSX шахматки — колонка «Дебет» справа и строка «Кредит» снизу. +- В XLSX шахматки — колонка «Итого Дт» справа и строка «Итого Кт» снизу. - Аудит выгрузки сохраняет `legal_entity_ids`. - Результирующая таблица: итога по всем статьям нет (аналитик, 03.11.2026). diff --git a/openspec/changes/intercompany-matrix-totals/specs/consolidated-osv/spec.md b/openspec/changes/intercompany-matrix-totals/specs/consolidated-osv/spec.md index 4977449..406b741 100644 --- a/openspec/changes/intercompany-matrix-totals/specs/consolidated-osv/spec.md +++ b/openspec/changes/intercompany-matrix-totals/specs/consolidated-osv/spec.md @@ -86,8 +86,8 @@ SHALL считать исходные строки ОСВ пары с `account_i `intercompany-matrix_<ГК>_<год>-<квартал>_v.xlsx`, шапкой (ГК, период, версия, единицы, режим, выбранные счета; для ALL — «Все балансовые счета») и строками разницы, дебета, кредита и процента расхождения для каждой пары. Пара SHALL заливаться цветом порога, если `exceeds_threshold` или `one_sided` — так же, как в API. -Справа от колонок компаний SHALL быть колонка «Дебет» с `total_debit` по каждому ЮЛ строки (ячейка объединена -на строки пары); под матрицей SHALL быть строка «Кредит» с `total_credit` по каждому ЮЛ колонки; ячейка на +Справа от колонок компаний SHALL быть колонка «Итого Дт» с `total_debit` по каждому ЮЛ строки (ячейка объединена +на строки пары); под матрицей SHALL быть строка «Итого Кт» с `total_credit` по каждому ЮЛ колонки; ячейка на пересечении пустая. Значения — те же, что в JSON. #### Scenario: Экспорт выбранных счетов