AURORA-1756 #218

Merged
aep merged 6 commits from AURORA-1756 into main 2026-11-06 16:21:17 +03:00
6 changed files with 9 additions and 9 deletions
Showing only changes of commit df4e171cc5 - Show all commits

View File

@ -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` — она фиксируется при создании версии консолидации (действующая на дату

View File

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

View File

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

View File

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

View File

@ -13,7 +13,7 @@
счета; пустой `legal_entity_ids` — весь периметр. **BREAKING** для клиента фронта (переводится в AURORA-1757,
сливается одновременно).
- В ответе матрицы `total_debit` и `total_credit` — итог по каждому ЮЛ, строки с двумя знаками.
- В XLSX шахматки — колонка «Дебет» справа и строка «Кредит» снизу.
- В XLSX шахматки — колонка «Итого Дт» справа и строка «Итого Кт» снизу.
- Аудит выгрузки сохраняет `legal_entity_ids`.
- Результирующая таблица: итога по всем статьям нет (аналитик, 03.11.2026).

View File

@ -86,8 +86,8 @@ SHALL считать исходные строки ОСВ пары с `account_i
`intercompany-matrix_<ГК>_<год>-<квартал>_v<n>.xlsx`, шапкой (ГК, период, версия, единицы, режим,
выбранные счета; для ALL — «Все балансовые счета») и строками разницы, дебета, кредита и процента расхождения для
каждой пары. Пара SHALL заливаться цветом порога, если `exceeds_threshold` или `one_sided` — так же, как в API.
Справа от колонок компаний SHALL быть колонка «Дебет» с `total_debit` по каждому ЮЛ строки (ячейка объединена
на строки пары); под матрицей SHALL быть строка «Кредит» с `total_credit` по каждому ЮЛ колонки; ячейка на
Справа от колонок компаний SHALL быть колонка «Итого Дт» с `total_debit` по каждому ЮЛ строки (ячейка объединена
на строки пары); под матрицей SHALL быть строка «Итого Кт» с `total_credit` по каждому ЮЛ колонки; ячейка на
пересечении пустая. Значения — те же, что в JSON.
#### Scenario: Экспорт выбранных счетов