"""Judge entity and workload management. This module defines the Judge class which represents a judicial officer presiding over hearings in a courtroom. """ from dataclasses import dataclass, field from datetime import date from typing import Dict, List, Optional, Set @dataclass class Judge: """Represents a judge with workload tracking. Attributes: judge_id: Unique identifier name: Judge's name courtroom_id: Assigned courtroom (optional) preferred_case_types: Case types this judge specializes in cases_heard: Count of cases heard hearings_presided: Count of hearings presided workload_history: Daily workload tracking """ judge_id: str name: str courtroom_id: Optional[int] = None preferred_case_types: Set[str] = field(default_factory=set) cases_heard: int = 0 hearings_presided: int = 0 workload_history: List[Dict] = field(default_factory=list) def assign_courtroom(self, courtroom_id: int) -> None: """Assign judge to a courtroom. Args: courtroom_id: Courtroom identifier """ self.courtroom_id = courtroom_id def add_preferred_types(self, *case_types: str) -> None: """Add case types to judge's preferences. Args: *case_types: One or more case type strings """ self.preferred_case_types.update(case_types) def record_hearing(self, hearing_date: date, case_id: str, case_type: str) -> None: """Record a hearing presided over. Args: hearing_date: Date of hearing case_id: Case identifier case_type: Type of case """ self.hearings_presided += 1 def record_daily_workload(self, hearing_date: date, cases_heard: int, cases_adjourned: int) -> None: """Record workload for a specific day. Args: hearing_date: Date of hearings cases_heard: Number of cases actually heard cases_adjourned: Number of cases adjourned """ self.workload_history.append({ "date": hearing_date, "cases_heard": cases_heard, "cases_adjourned": cases_adjourned, "total_scheduled": cases_heard + cases_adjourned, }) self.cases_heard += cases_heard def get_average_daily_workload(self) -> float: """Calculate average cases heard per day. Returns: Average number of cases per day """ if not self.workload_history: return 0.0 total = sum(day["cases_heard"] for day in self.workload_history) return total / len(self.workload_history) def get_adjournment_rate(self) -> float: """Calculate judge's adjournment rate. Returns: Proportion of cases adjourned (0.0 to 1.0) """ if not self.workload_history: return 0.0 total_adjourned = sum(day["cases_adjourned"] for day in self.workload_history) total_scheduled = sum(day["total_scheduled"] for day in self.workload_history) return total_adjourned / total_scheduled if total_scheduled > 0 else 0.0 def get_workload_summary(self, start_date: date, end_date: date) -> Dict: """Get workload summary for a date range. Args: start_date: Start of range end_date: End of range Returns: Dict with workload statistics """ days_in_range = [day for day in self.workload_history if start_date <= day["date"] <= end_date] if not days_in_range: return { "judge_id": self.judge_id, "days_worked": 0, "total_cases_heard": 0, "avg_cases_per_day": 0.0, "adjournment_rate": 0.0, } total_heard = sum(day["cases_heard"] for day in days_in_range) total_adjourned = sum(day["cases_adjourned"] for day in days_in_range) total_scheduled = total_heard + total_adjourned return { "judge_id": self.judge_id, "days_worked": len(days_in_range), "total_cases_heard": total_heard, "total_cases_adjourned": total_adjourned, "avg_cases_per_day": total_heard / len(days_in_range), "adjournment_rate": total_adjourned / total_scheduled if total_scheduled > 0 else 0.0, } def is_specialized_in(self, case_type: str) -> bool: """Check if judge specializes in a case type. Args: case_type: Case type to check Returns: True if in preferred types or no preferences set """ if not self.preferred_case_types: return True # No preferences means handles all types return case_type in self.preferred_case_types def __repr__(self) -> str: return (f"Judge(id={self.judge_id}, courtroom={self.courtroom_id}, " f"hearings={self.hearings_presided})") def to_dict(self) -> dict: """Convert judge to dictionary for serialization.""" return { "judge_id": self.judge_id, "name": self.name, "courtroom_id": self.courtroom_id, "preferred_case_types": list(self.preferred_case_types), "cases_heard": self.cases_heard, "hearings_presided": self.hearings_presided, "avg_daily_workload": self.get_average_daily_workload(), "adjournment_rate": self.get_adjournment_rate(), }