from __future__ import annotations from typing import Any, Callable from openpyxl.worksheet.worksheet import Worksheet FORM1_FLAT_COLUMNS: list[tuple[str, str]] = [ ("section", "Код раздела"), ("item_id", "ID статьи"), ("name", "Наименование"), ("q1", "I квартал"), ("q2", "II квартал"), ("q3", "III квартал"), ("q4", "IV квартал"), ("totals", "ИТОГО"), ("plan", "План"), ("reserve", "Резерв"), ("approved", "Согласовано"), ("collegial", "Коллегиальный"), ("allocation", "Аллокация"), ("sequestration", "Секвестр"), ("contract", "Договор"), ("contract_sum", "Сумма договора"), ("ckk", "ЦКК"), ] SMETA_COLUMNS: list[tuple[str, str]] = [ ("section_code", "Код раздела"), ("name", "Наименование"), ("plan_support_q1", "План поддержка I квартал"), ("plan_support_q2", "План поддержка II квартал"), ("plan_support_q3", "План поддержка III квартал"), ("plan_support_q4", "План поддержка IV квартал"), ("plan_support_year", "План поддержка Год"), ("plan_development_q1", "План развитие I квартал"), ("plan_development_q2", "План развитие II квартал"), ("plan_development_q3", "План развитие III квартал"), ("plan_development_q4", "План развитие IV квартал"), ("plan_development_year", "План развитие Год"), ("plan_total_year", "План ИТОГО Год"), ("approved_support_q1", "Утверждено поддержка I квартал"), ("approved_support_q2", "Утверждено поддержка II квартал"), ("approved_support_q3", "Утверждено поддержка III квартал"), ("approved_support_q4", "Утверждено поддержка IV квартал"), ("approved_support_year", "Утверждено поддержка Год"), ("approved_development_q1", "Утверждено развитие I квартал"), ("approved_development_q2", "Утверждено развитие II квартал"), ("approved_development_q3", "Утверждено развитие III квартал"), ("approved_development_q4", "Утверждено развитие IV квартал"), ("approved_development_year", "Утверждено развитие Год"), ("approved_total_year", "Утверждено ИТОГО Год"), ("fact_support_q1", "Факт поддержка I квартал"), ("fact_support_q2", "Факт поддержка II квартал"), ("fact_support_q3", "Факт поддержка III квартал"), ("fact_support_q4", "Факт поддержка IV квартал"), ("fact_support_year", "Факт поддержка Год"), ("fact_development_q1", "Факт развитие I квартал"), ("fact_development_q2", "Факт развитие II квартал"), ("fact_development_q3", "Факт развитие III квартал"), ("fact_development_q4", "Факт развитие IV квартал"), ("fact_development_year", "Факт развитие Год"), ("fact_total_year", "Факт ИТОГО Год"), ("corrected_support_q2", "Корректировка поддержка II квартал"), ("corrected_support_q3", "Корректировка поддержка III квартал"), ("corrected_support_q4", "Корректировка поддержка IV квартал"), ("corrected_development_q2", "Корректировка развитие II квартал"), ("corrected_development_q3", "Корректировка развитие III квартал"), ("corrected_development_q4", "Корректировка развитие IV квартал"), ] FORM3_REPORT_COLUMNS: list[tuple[str, str]] = [ ("section", "Код раздела"), ("item_id", "ID статьи"), ("name", "Наименование"), ("q1", "I квартал"), ("q2", "II квартал"), ("q3", "III квартал"), ("q4", "IV квартал"), ("totals", "ИТОГО"), ] RowNormalizer = Callable[[dict[str, Any]], dict[str, Any]] ValueSerializer = Callable[[Any], Any] class TabularSheetWriter: def __init__( self, columns: list[tuple[str, str]], row_normalizer: RowNormalizer, value_serializer: ValueSerializer, ): self.columns = columns self.row_normalizer = row_normalizer self.value_serializer = value_serializer def write(self, worksheet: Worksheet, rows: list[tuple]) -> None: worksheet.append([title for _, title in self.columns]) for row in rows: raw_data = row[3] if len(row) > 3 and isinstance(row[3], dict) else {} normalized = self.row_normalizer(raw_data) worksheet.append( [self.value_serializer(normalized.get(key)) for key, _ in self.columns] )