"""Blueprint des routes du tableau de bord principal. Ce module gère l'affichage de la page d'accueil (le tableau de bord). Il calcule et rassemble les statistiques clés de la semaine courante et du mois en cours, ainsi que le solde des congés et RTT pour l'année civile. """ from datetime import date, timedelta import sqlalchemy as sa from flask import Blueprint, render_template from app import db from app.business.leave_calc import compute_leave_used, get_or_create_balance from app.business.time_calc import minutes_to_str, work_minutes_reference from app.business.travel_calc import compute_co2_grams, compute_km_for_entry from app.config_loader import get_journeys, get_vehicles from app.models import WorkEntry bp = Blueprint("dashboard", __name__) @bp.route("/") def index(): """Affiche le tableau de bord principal de l'utilisateur. Cette route effectue les opérations suivantes : 1. Détermine la date du jour et calcule les limites de la semaine courante (du lundi au dimanche). 2. Récupère toutes les entrées de temps (`WorkEntry`) de la semaine courante pour calculer : - Le temps de travail effectif cumulé (`week_actual`). - Le temps de travail de référence théorique (`week_ref`) selon le type de chaque journée. - Le solde d'heures de la semaine (`week_balance` = effectif - référence). 3. Récupère toutes les entrées de temps du mois en cours (du 1er jour du mois jusqu'à aujourd'hui) pour calculer : - Les distances parcourues par véhicule (`month_km`) à partir des profils de trajets associés. - Les émissions de CO2 correspondantes (`month_co2`). 4. Récupère ou initialise le solde annuel des congés et RTT (`balance`) et calcule les jours posés/utilisés (`used`). 5. Vérifie s'il existe déjà une entrée de temps pour la journée d'aujourd'hui (`today_entry`). 6. Rend le template `dashboard.html` avec l'ensemble de ces données de contexte. Méthode HTTP : GET Retourne: str: Le rendu HTML de la page du tableau de bord (`dashboard.html`). """ today = date.today() year = today.year monday = today - timedelta(days=today.weekday()) sunday = monday + timedelta(days=6) week_entries = db.session.scalars( sa.select(WorkEntry).where(WorkEntry.date.between(monday, sunday)) ).all() week_actual = sum(e.total_minutes() for e in week_entries) week_ref = sum(work_minutes_reference(e.day_type) for e in week_entries) week_balance = week_actual - week_ref month_start = today.replace(day=1) month_entries = db.session.scalars( sa.select(WorkEntry).where(WorkEntry.date.between(month_start, today)) ).all() vehicles = get_vehicles() journeys = get_journeys() month_km = {} month_co2 = 0.0 for entry in month_entries: km = compute_km_for_entry(entry.journey_profile_id, journeys, entry.motor_vehicle_id) for v, d in km.items(): month_km[v] = month_km.get(v, 0) + d month_co2 += compute_co2_grams(km, vehicles) balance = get_or_create_balance(year) used = compute_leave_used(year) today_entry = db.session.scalar(sa.select(WorkEntry).where(WorkEntry.date == today)) return render_template( "dashboard.html", today=today, today_entry=today_entry, journeys=journeys, vehicles=vehicles, week_actual_str=minutes_to_str(week_actual), week_balance=week_balance, week_balance_str=minutes_to_str(abs(week_balance)), month_km=month_km, month_co2_kg=round(month_co2 / 1000, 2), balance=balance, used=used, )