File size: 5,616 Bytes
4d0ffdd
 
 
 
 
 
 
 
 
 
 
 
 
 
f6c65ef
4d0ffdd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f6c65ef
4d0ffdd
 
f6c65ef
4d0ffdd
 
 
 
f6c65ef
4d0ffdd
 
f6c65ef
4d0ffdd
 
 
 
f6c65ef
4d0ffdd
 
f6c65ef
4d0ffdd
 
 
 
 
 
f6c65ef
 
4d0ffdd
 
f6c65ef
4d0ffdd
 
 
 
 
 
 
 
 
 
 
f6c65ef
4d0ffdd
f6c65ef
4d0ffdd
 
f6c65ef
4d0ffdd
 
 
 
 
f6c65ef
4d0ffdd
 
f6c65ef
4d0ffdd
 
f6c65ef
4d0ffdd
 
 
 
 
f6c65ef
4d0ffdd
 
f6c65ef
4d0ffdd
f6c65ef
4d0ffdd
 
f6c65ef
4d0ffdd
 
 
f6c65ef
4d0ffdd
 
 
f6c65ef
4d0ffdd
f6c65ef
4d0ffdd
 
 
 
 
 
 
 
f6c65ef
4d0ffdd
 
 
f6c65ef
4d0ffdd
 
 
 
 
 
 
 
f6c65ef
4d0ffdd
 
f6c65ef
4d0ffdd
 
f6c65ef
4d0ffdd
 
 
 
 
f6c65ef
4d0ffdd
f6c65ef
4d0ffdd
 
 
f6c65ef
4d0ffdd
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
"""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(),
        }