diff --git a/api/src/services/export_service/export_writers.py b/api/src/services/export_service/export_writers.py index fbd528a..ed94047 100644 --- a/api/src/services/export_service/export_writers.py +++ b/api/src/services/export_service/export_writers.py @@ -413,6 +413,10 @@ class XlsxDepthSheetWriter(AbstractWriter): color = self.colors_config.get(full_key) if color and "palette" in color: self.palette[key] = color["palette"] + # AURORA-1902: цвета Сметы РФ (FORM2_COLORS) ключуются путём данных + # (header.section_code, plan.q1), а не путём ключей дерева колонок. + if key not in self.palette and (color := self.colors_config.get(key)) and "palette" in color: + self.palette[key] = color["palette"] def _get_header_max_row(self, column_dict: dict) -> int: max_depth = 0 diff --git a/api/tests/unit/test_export_form2_mapping.py b/api/tests/unit/test_export_form2_mapping.py index b7a9d7b..2f93bdf 100644 --- a/api/tests/unit/test_export_form2_mapping.py +++ b/api/tests/unit/test_export_form2_mapping.py @@ -200,3 +200,42 @@ async def test_resolve_form2_vsp_numbers_skips_db_call_when_no_vsp_ids(): await service._resolve_form2_vsp_numbers(rows) service.vsp_repo.get_reg_numbers_by_ids.assert_not_awaited() + + +# AURORA-1902, возврат 10.11: FORM2_COLORS ключуется путём данных (header.section_code, plan.q1), +# а writer искал цвет только по пути ключей дерева колонок — заливок на листах не было. +@pytest.mark.parametrize("sheet", ["OPER", "AHR", "CAP"]) +def test_form2_writer_applies_sheet_palette_to_every_column(sheet): + service = ExportService(AsyncMock()) + writer = service._create_xlsxwriter_sheet_writers(XlsxWorkbook(), FormTypeEnum.FORM_2.value, 2026)[sheet] + + assert set(writer.palette) == set(writer.columns) + for key in writer.columns: + assert writer.palette[key] == FORM2_COLORS[sheet][key]["palette"], key + + +def test_form1_writer_palette_is_unaffected(): + service = ExportService(AsyncMock()) + writer = service._create_xlsxwriter_sheet_writers(XlsxWorkbook(), FormTypeEnum.FORM_1.value, 2026)["OPER"] + + assert len(writer.palette) == len(writer.columns) - 1 + assert writer.palette["section"] == "blue" + + +def test_form2_export_fills_group_row_with_sheet_colors(tmp_path): + from openpyxl import load_workbook + + path = tmp_path / "form2.xlsx" + workbook = XlsxWorkbook(str(path)) + service = ExportService(AsyncMock()) + writer = service._create_xlsxwriter_sheet_writers(workbook, FormTypeEnum.FORM_2.value, 2026)["OPER"] + worksheet = workbook.add_worksheet("OPER") + writer.write(worksheet, [("GROUP", 1, 1, {"header": {"name": "Группа"}, "plan": {"q1": 10}})]) + workbook.close() + + sheet = load_workbook(path).active + plan_q1_column = writer.columns.index("plan.q1") + 1 + group_row = sheet.max_row + fill = sheet.cell(row=group_row, column=plan_q1_column).fill + assert fill.fill_type == "solid" + assert fill.fgColor.rgb not in (None, "00000000", "FFFFFFFF")