RoyAalekh's picture
refactored project structure. renamed scheduler dir to src
6a28f91
"""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(),
}