@@ -0,0 +1,51 @@
|
||||
"""Текст шапки экспорта с применёнными фильтрами."""
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user