Files
tableau-de-bord/app/routes/dashboard.py
Antoine Van Elstraete bd5bc496eb doc: document configuration and application routes
Co-authored-by: OpenAI/GPT-5.6-Terra <vibecoder@antoineve.me>
Co-authored-by: Google/Gemini-3.5-Flash <vibecoder@antoineve.me>
Co-authored-by: DeepSeek/DeepSeek-v4-Flash <vibecoder@antoineve.me>
2026-08-13 11:05:10 +02:00

94 lines
3.6 KiB
Python

"""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,
)