Загрузка данных


from calendar import Calendar
from collections import Counter

MONTH_NAMES = [
    "", "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь",
    "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь",
]

STATUS_LABELS = {
    "present": "Присутствовал",
    "absent": "Отсутствовал",
    "late": "Опоздал",
    "excused": "Уважительная",
}

STATUS_COLORS = {
    "present": "success",
    "absent": "danger",
    "late": "warning",
    "excused": "info",
}


def intern_stats(intern_id: int, date_from=None, date_to=None) -> dict:
    from app.models import Attendance

    q = Attendance.query.filter_by(intern_id=intern_id)
    if date_from:
        q = q.filter(Attendance.date >= date_from)
    if date_to:
        q = q.filter(Attendance.date <= date_to)

    records = q.all()
    total = len(records)
    counts = Counter(r.status for r in records)

    present_like = counts.get("present", 0) + counts.get("late", 0)
    rate = round(present_like / total * 100, 1) if total else 0.0

    return {
        "total": total,
        "present": counts.get("present", 0),
        "absent": counts.get("absent", 0),
        "late": counts.get("late", 0),
        "excused": counts.get("excused", 0),
        "rate": rate,
    }


def center_stats(date_from=None, date_to=None, mentor_id: int | None = None) -> dict:
    from app.models import Attendance, Intern

    q = Intern.query
    if mentor_id:
        q = q.filter(Intern.mentor_id == mentor_id)
    interns = q.all()
    intern_ids = [i.id for i in interns]

    if not intern_ids:
        return {
            "interns_count": 0,
            "records": 0,
            "rate": 0.0,
            "by_status": {},
        }

    aq = Attendance.query.filter(Attendance.intern_id.in_(intern_ids))
    if date_from:
        aq = aq.filter(Attendance.date >= date_from)
    if date_to:
        aq = aq.filter(Attendance.date <= date_to)

    records = aq.all()
    total = len(records)
    counts = Counter(r.status for r in records)
    present_like = counts.get("present", 0) + counts.get("late", 0)
    rate = round(present_like / total * 100, 1) if total else 0.0

    return {
        "interns_count": len(intern_ids),
        "records": total,
        "rate": rate,
        "by_status": dict(counts),
    }


def monthly_calendar(year: int, month: int):
    """Список недель (по 7 datetime.date), неделя начинается с понедельника."""
    return Calendar(firstweekday=0).monthdatescalendar(year, month)