luli331/oppy_google
0
1from datetime import datetime2 3 4def evaluate_project(project: dict, emails: list[dict], events: list[dict], search_score: float) -> dict:5 """Evaluate a project's status based on deterministic rules.6 7 Returns:8 {"status": "READY"|"URGENT"|"SIGNAL", "alerts": [str]}9 """10 alerts = []11 status = "READY"12 13 # Rule 1: Silence detected14 reply_days = [15 e["days_since_reply"]16 for e in emails17 if e.get("days_since_reply") is not None18 ]19 if reply_days:20 max_silence = max(reply_days)21 if max_silence >= 5:22 contact = emails[0]["from"]23 alerts.append(f"Silence depuis {max_silence} jours de {contact}")24 status = "URGENT"25 26 # Rule 2: Deadline < 48h without prep block27 deadline_str = project.get("deadline")28 if not deadline_str:29 return {"status": status, "alerts": alerts}30 deadline = datetime.fromisoformat(deadline_str)31 now = datetime.now()32 hours_to_deadline = (deadline - now).total_seconds() / 360033 has_prep = any(e.get("prep_block", False) for e in events)34 if hours_to_deadline < 48 and not has_prep:35 alerts.append(f"Deadline dans {int(hours_to_deadline)}h - aucun bloc de prep")36 status = "URGENT"37 38 # Rule 3: External signal relevant39 if search_score > 0.6:40 alerts.append("Signal externe pertinent detecte")41 if status != "URGENT":42 status = "SIGNAL"43 44 # Rule 4: High urgency email45 urgency_scores = [e.get("urgency_score", 0) for e in emails]46 if any(s > 0.8 for s in urgency_scores):47 alerts.append("Email a haute urgence detecte")48 status = "URGENT"49 50 return {"status": status, "alerts": alerts}51 