52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime, timezone
|
|
|
|
from app.extensions import db
|
|
from app.models import AttendanceEvent, AttendanceType, Person
|
|
|
|
|
|
def record_attendance(
|
|
person: Person,
|
|
event_type: AttendanceType,
|
|
*,
|
|
created_by_id: int | None = None,
|
|
confidence: float | None = None,
|
|
source: str = "web",
|
|
) -> AttendanceEvent:
|
|
event = AttendanceEvent(
|
|
person=person,
|
|
event_type=event_type.value,
|
|
occurred_at=datetime.now(timezone.utc),
|
|
created_by_id=created_by_id,
|
|
confidence=confidence,
|
|
source=source,
|
|
)
|
|
db.session.add(event)
|
|
db.session.commit()
|
|
return event
|
|
|
|
|
|
def last_presence_summary(person: Person) -> str:
|
|
check_in = (
|
|
AttendanceEvent.query.filter_by(person_id=person.id, event_type=AttendanceType.CHECK_IN.value)
|
|
.order_by(AttendanceEvent.occurred_at.desc())
|
|
.first()
|
|
)
|
|
check_out = (
|
|
AttendanceEvent.query.filter_by(person_id=person.id, event_type=AttendanceType.CHECK_OUT.value)
|
|
.order_by(AttendanceEvent.occurred_at.desc())
|
|
.first()
|
|
)
|
|
|
|
if not check_in and not check_out:
|
|
return "No attendance recorded"
|
|
|
|
check_in_text = _format_event_time(check_in) if check_in else "no check-in"
|
|
check_out_text = _format_event_time(check_out) if check_out else "no check-out"
|
|
return f"From {check_in_text} to {check_out_text}"
|
|
|
|
|
|
def _format_event_time(event: AttendanceEvent) -> str:
|
|
return event.occurred_at.strftime("%Y-%m-%d %H:%M")
|