54 lines
1.5 KiB
Python
54 lines
1.5 KiB
Python
"""Helper utilities for attendance system."""
|
|
|
|
from datetime import datetime, time
|
|
from typing import Literal
|
|
|
|
|
|
def calculate_attendance_status(
|
|
attendance_time: datetime = None,
|
|
cutoff_hour: int = 7,
|
|
cutoff_minute: int = 0,
|
|
) -> Literal["tepat_waktu", "terlambat"]:
|
|
"""Calculate attendance status based on cutoff time.
|
|
|
|
Args:
|
|
attendance_time: Time of attendance (default: now)
|
|
cutoff_hour: Cutoff hour (default: 7)
|
|
cutoff_minute: Cutoff minute (default: 0)
|
|
|
|
Returns:
|
|
'tepat_waktu' if before/at cutoff, 'terlambat' if after cutoff
|
|
|
|
Example:
|
|
>>> status = calculate_attendance_status() # Uses current time, cutoff 07:00
|
|
>>> status = calculate_attendance_status(cutoff_hour=8, cutoff_minute=30) # Cutoff 08:30
|
|
"""
|
|
if attendance_time is None:
|
|
attendance_time = datetime.now()
|
|
|
|
cutoff_time = time(cutoff_hour, cutoff_minute, 0)
|
|
current_time = attendance_time.time()
|
|
|
|
# Jika waktu <= cutoff_time → tepat_waktu
|
|
if current_time <= cutoff_time:
|
|
return "tepat_waktu"
|
|
else:
|
|
return "terlambat"
|
|
|
|
|
|
def format_attendance_status(status: str) -> str:
|
|
"""Format status for display.
|
|
|
|
Args:
|
|
status: 'tepat_waktu' or 'terlambat'
|
|
|
|
Returns:
|
|
Human-readable status
|
|
"""
|
|
status_map = {
|
|
"tepat_waktu": "Tepat Waktu ✓",
|
|
"terlambat": "Terlambat ⚠",
|
|
"izin": "Izin",
|
|
}
|
|
return status_map.get(status, status)
|