43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
from datetime import date, datetime, time, timedelta
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from ..core.datetime import utc_now
|
|
from ..models.models import AttendanceCheckoutSource, AttendanceSession
|
|
|
|
|
|
def duration_seconds(start: datetime, end: datetime) -> int:
|
|
return max(0, int((end - start).total_seconds()))
|
|
|
|
|
|
def close_stale_attendance_sessions(
|
|
db: Session,
|
|
cutoff_date: date | None = None,
|
|
checkout_hour: int = 17,
|
|
) -> int:
|
|
cutoff = cutoff_date or date.today()
|
|
cutoff_at = datetime.combine(cutoff, time.min)
|
|
sessions = (
|
|
db.query(AttendanceSession)
|
|
.filter(
|
|
AttendanceSession.is_open == True,
|
|
AttendanceSession.checked_in_at < cutoff_at,
|
|
)
|
|
.all()
|
|
)
|
|
|
|
now = utc_now()
|
|
for session in sessions:
|
|
checkout_at = datetime.combine(session.checked_in_at.date(), time(hour=checkout_hour))
|
|
if checkout_at < session.checked_in_at:
|
|
checkout_at = session.checked_in_at + timedelta(minutes=1)
|
|
session.checked_out_at = checkout_at
|
|
session.checkout_source = AttendanceCheckoutSource.SYSTEM
|
|
session.system_flag_reason = "User did not check out before midnight; checkout time was system-set."
|
|
session.duration_seconds = duration_seconds(session.checked_in_at, checkout_at)
|
|
session.is_open = False
|
|
session.updated_at = now
|
|
|
|
db.commit()
|
|
return len(sessions)
|