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>
94 lines
3.6 KiB
Python
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,
|
|
)
|