104 lines
5.1 KiB
Python
104 lines
5.1 KiB
Python
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]
|
|
)
|