52 lines
2.0 KiB
Python
52 lines
2.0 KiB
Python
"""Текст шапки экспорта с применёнными фильтрами."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Optional
|
|
|
|
_NET_DOMINANT_HINTS = {
|
|
"overload": "Преобладает перерасход — прямой убыток бюджета",
|
|
"underload": "Преобладает недогруз — экономия сейчас, риск падения надоев",
|
|
"balanced": "Перерасход и недогруз за период уравновешены",
|
|
}
|
|
|
|
|
|
def net_rub_display(summary: dict[str, Any]) -> float:
|
|
"""Итог без знака минус — как на вкладке «Итоги» в интерфейсе."""
|
|
return round(abs(float(summary.get("netRub") or 0)), 2)
|
|
|
|
|
|
def net_rub_dominant_hint(summary: dict[str, Any]) -> str:
|
|
return _NET_DOMINANT_HINTS.get(str(summary.get("dominantIssue") or "balanced"), _NET_DOMINANT_HINTS["balanced"])
|
|
|
|
|
|
def _count_label(raw: Optional[str], *, all_label: str) -> str:
|
|
text = (raw or "").strip()
|
|
if not text or text.lower() == "all":
|
|
return all_label
|
|
parts = [p.strip() for p in text.split(",") if p.strip()]
|
|
if not parts:
|
|
return all_label
|
|
if len(parts) == 1:
|
|
return parts[0]
|
|
return str(len(parts))
|
|
|
|
|
|
def build_export_header_lines(
|
|
*,
|
|
date_from: str,
|
|
date_to: str,
|
|
filter_farms: Optional[str] = None,
|
|
filter_dispensers: Optional[str] = None,
|
|
filter_recipes: Optional[str] = None,
|
|
) -> list[str]:
|
|
period = f"{date_from} — {date_to}"
|
|
farms = _count_label(filter_farms, all_label="все")
|
|
dispensers = _count_label(filter_dispensers, all_label="все")
|
|
recipes = _count_label(filter_recipes, all_label="все")
|
|
|
|
lines = [f"Отчёт о загрузках кормов за период {period}."]
|
|
filter_bits = [f"Фермы: {farms}", f"Кормораздатчики: {dispensers}", f"Рейсы: {recipes}"]
|
|
lines.append("Выбрано: " + ", ".join(filter_bits) + ".")
|
|
return lines
|