AURORA-1756: подписи итогов в xlsx — «Итого Дт» / «Итого Кт», как на экране и в DOC-221277
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
6faa4fb325
commit
df4e171cc5
@ -938,7 +938,7 @@ API: список счетов `GET /directories/accounts`, правила ве
|
|||||||
`GET …/intercompany-matrix/result-table` и её XLSX `GET …/intercompany-matrix/result-table/export`
|
`GET …/intercompany-matrix/result-table` и её XLSX `GET …/intercompany-matrix/result-table/export`
|
||||||
(аудит `EXPORT`, `report = "intercompany_result_table"`). Режим PRESET (счета и показатель из правила элиминации):
|
(аудит `EXPORT`, `report = "intercompany_result_table"`). Режим PRESET (счета и показатель из правила элиминации):
|
||||||
`GET …/intercompany-matrix/preset/{rule_id}` и его выгрузка `…/preset/{rule_id}/export`.
|
`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).
|
пары нулевая; пара подсвечивается (и в xlsx) при `exceeds_threshold` или `one_sided` (AURORA-1651).
|
||||||
`GET …/elimination-rules` отдаёт объект `{version_no, is_version_fixed, rules}` (у правила есть `id`): правила версии
|
`GET …/elimination-rules` отдаёт объект `{version_no, is_version_fixed, rules}` (у правила есть `id`): правила версии
|
||||||
`consolidation_version.elimination_rules_version` — она фиксируется при создании версии консолидации (действующая на дату
|
`consolidation_version.elimination_rules_version` — она фиксируется при создании версии консолидации (действующая на дату
|
||||||
|
|||||||
@ -105,7 +105,7 @@ def _write_matrix_totals(
|
|||||||
debit_total.alignment = Alignment(horizontal="right", vertical="center")
|
debit_total.alignment = Alignment(horizontal="right", vertical="center")
|
||||||
|
|
||||||
credit_total_row = data_start_row + len(matrix.companies) * len(METRICS)
|
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)
|
sheet.cell(credit_total_row, 1).font = Font(bold=True)
|
||||||
for column, company in enumerate(matrix.companies, start=3):
|
for column, company in enumerate(matrix.companies, start=3):
|
||||||
credit_total = sheet.cell(credit_total_row, column, matrix.total_credit[company.id])
|
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):
|
for column, company in enumerate(matrix.companies, start=3):
|
||||||
_text(sheet, table_header_row, column, company.name)
|
_text(sheet, table_header_row, column, company.name)
|
||||||
sheet.column_dimensions[get_column_letter(column)].width = 26
|
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.column_dimensions[get_column_letter(debit_total_column)].width = 26
|
||||||
sheet.row_dimensions[table_header_row].height = 36
|
sheet.row_dimensions[table_header_row].height = 36
|
||||||
for header in sheet[table_header_row]:
|
for header in sheet[table_header_row]:
|
||||||
|
|||||||
@ -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)] == [
|
assert [sheet.cell(10, column).value for column in range(3, 6)] == [
|
||||||
world.members[0].name,
|
world.members[0].name,
|
||||||
world.members[1].name,
|
world.members[1].name,
|
||||||
"Дебет",
|
"Итого Дт",
|
||||||
]
|
]
|
||||||
audit = (await seeded.scalars(select(AuditEvent).where(AuditEvent.action == AuditAction.EXPORT))).one()
|
audit = (await seeded.scalars(select(AuditEvent).where(AuditEvent.action == AuditAction.EXPORT))).one()
|
||||||
assert audit.after_value["legal_entity_ids"] == selected
|
assert audit.after_value["legal_entity_ids"] == selected
|
||||||
|
|||||||
@ -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 all(cell.alignment.horizontal == "center" and cell.alignment.vertical == "center" for cell in sheet[10])
|
||||||
assert sheet["C10"].data_type == "s"
|
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 [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["E11"].value)) == Decimal("100.25")
|
||||||
assert Decimal(str(sheet["E15"].value)) == Decimal("20")
|
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].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 all(sheet.cell(row, 3).fill.fgColor.rgb != THRESHOLD_FILL.fgColor.rgb for row in range(15, 19))
|
||||||
assert sheet.freeze_panes == "C11"
|
assert sheet.freeze_panes == "C11"
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
счета; пустой `legal_entity_ids` — весь периметр. **BREAKING** для клиента фронта (переводится в AURORA-1757,
|
счета; пустой `legal_entity_ids` — весь периметр. **BREAKING** для клиента фронта (переводится в AURORA-1757,
|
||||||
сливается одновременно).
|
сливается одновременно).
|
||||||
- В ответе матрицы `total_debit` и `total_credit` — итог по каждому ЮЛ, строки с двумя знаками.
|
- В ответе матрицы `total_debit` и `total_credit` — итог по каждому ЮЛ, строки с двумя знаками.
|
||||||
- В XLSX шахматки — колонка «Дебет» справа и строка «Кредит» снизу.
|
- В XLSX шахматки — колонка «Итого Дт» справа и строка «Итого Кт» снизу.
|
||||||
- Аудит выгрузки сохраняет `legal_entity_ids`.
|
- Аудит выгрузки сохраняет `legal_entity_ids`.
|
||||||
- Результирующая таблица: итога по всем статьям нет (аналитик, 03.11.2026).
|
- Результирующая таблица: итога по всем статьям нет (аналитик, 03.11.2026).
|
||||||
|
|
||||||
|
|||||||
@ -86,8 +86,8 @@ SHALL считать исходные строки ОСВ пары с `account_i
|
|||||||
`intercompany-matrix_<ГК>_<год>-<квартал>_v<n>.xlsx`, шапкой (ГК, период, версия, единицы, режим,
|
`intercompany-matrix_<ГК>_<год>-<квартал>_v<n>.xlsx`, шапкой (ГК, период, версия, единицы, режим,
|
||||||
выбранные счета; для ALL — «Все балансовые счета») и строками разницы, дебета, кредита и процента расхождения для
|
выбранные счета; для ALL — «Все балансовые счета») и строками разницы, дебета, кредита и процента расхождения для
|
||||||
каждой пары. Пара SHALL заливаться цветом порога, если `exceeds_threshold` или `one_sided` — так же, как в API.
|
каждой пары. Пара SHALL заливаться цветом порога, если `exceeds_threshold` или `one_sided` — так же, как в API.
|
||||||
Справа от колонок компаний SHALL быть колонка «Дебет» с `total_debit` по каждому ЮЛ строки (ячейка объединена
|
Справа от колонок компаний SHALL быть колонка «Итого Дт» с `total_debit` по каждому ЮЛ строки (ячейка объединена
|
||||||
на строки пары); под матрицей SHALL быть строка «Кредит» с `total_credit` по каждому ЮЛ колонки; ячейка на
|
на строки пары); под матрицей SHALL быть строка «Итого Кт» с `total_credit` по каждому ЮЛ колонки; ячейка на
|
||||||
пересечении пустая. Значения — те же, что в JSON.
|
пересечении пустая. Значения — те же, что в JSON.
|
||||||
|
|
||||||
#### Scenario: Экспорт выбранных счетов
|
#### Scenario: Экспорт выбранных счетов
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user