StatusBadge: split badges per dimension (abnormal/late/early/OT <=30min); Attendance filter by status_code conditions for abnormal/late/early/OT/normal/leave types

This commit is contained in:
IT狗
2026-07-21 18:10:43 +08:00
parent 4c9db01213
commit 33a5e3b2ad
3 changed files with 61 additions and 103 deletions
+35 -1
View File
@@ -1267,7 +1267,41 @@ async def attendance_records(
if status:
q = q.filter(AttendanceRecord.status_code == status)
if status_text:
q = q.filter(AttendanceRecord.status_text.like(f"%{status_text}%"))
# Map status_text filter to actual conditions
if status_text == 'abnormal':
q = q.filter(
(AttendanceRecord.late_minutes > 30) |
(AttendanceRecord.early_minutes > 30) |
(AttendanceRecord.ot_minutes > 30)
)
elif status_text == 'late':
q = q.filter(
(AttendanceRecord.late_minutes > 0) &
(AttendanceRecord.late_minutes <= 30)
)
elif status_text == 'early':
q = q.filter(
(AttendanceRecord.early_minutes > 0) &
(AttendanceRecord.early_minutes <= 30)
)
elif status_text == 'ot':
q = q.filter(
(AttendanceRecord.ot_minutes > 0) &
(AttendanceRecord.ot_minutes <= 30)
)
elif status_text == 'missing':
q = q.filter(AttendanceRecord.status_code == 'missing')
elif status_text in ('holiday', 'al', 'sl', 'cl', 'mixed_leave'):
q = q.filter(AttendanceRecord.status_code == status_text)
elif status_text == 'normal':
q = q.filter(
(AttendanceRecord.late_minutes == 0) &
(AttendanceRecord.early_minutes == 0) &
(AttendanceRecord.ot_minutes == 0)
)
else:
# Fallback to text search
q = q.filter(AttendanceRecord.status_text.like(f"%{status_text}%"))
if search:
like = f"%{search}%"
q = q.filter(or_(