""" =============================================================================== FILE: services/text_reporter/service.py PROJECT: SCUD Orion AI (Unified Architecture) MODULE: services / text_reporter ROLE: Формирование текстовой сводки ИИ-аудитора для вывода в консоль и сохранения в MD. =============================================================================== """ from typing import Dict, Any, List def format_controlling_summary_markdown( target_date: str, metrics: Dict[str, Any], anomalies: List[Dict[str, Any]] ) -> str: """Генерирует Markdown-текст ежедневной сводки контроллинга.""" lines = [ f"**Сводка контроллинга СКУД и 1С:ЗУП на {target_date}**\n", f"- Всего сотрудников по штату: **{metrics['total_staff']}**", f"- Итого на работе (в офисе): **{metrics['working_in_office_count']}**", f"- Удаленная работа (из дома): **{metrics['remote_home_count']}**", f"- Официально отсутствуют: **{metrics['official_absent_count']}**", f"- Неизвестно (истинно неотмеченные): **{metrics['unknown_count']}** чел.", f"- Выявлено аномалий/конфликтов реестров: **{len(anomalies)}** шт.\n" ] # Блок аномалий lines.append(f"#### 🚨 Выявленные ИИ аномалии и конфликты источников ({len(anomalies)}):") if anomalies: for idx, a in enumerate(anomalies, 1): lines.append(f"{idx}. {a['fio']}: {a['description']}") else: lines.append("Конфликтов и аномалий реестров не обнаружено.") lines.append("") # Блок неизвестных unknown_list = metrics.get("unknown_list", []) lines.append(f"#### ❓ Неизвестные случаи ({len(unknown_list)}):") if unknown_list: for idx, u in enumerate(unknown_list, 1): dept = u.get("Подразделение") or "—" pos = u.get("Должность") or "—" lines.append(f"{idx}. {u.get('fio_clean')} — {dept}, {pos}") else: lines.append("Все отсутствия подтверждены документами.") return "\n".join(lines)