3.1 KiB
3.1 KiB
Design : statistiques mensuelles dans la page Rapports
Date : 2026-03-13
Objectif
Ajouter une section "Détail mensuel" sous les cartes annuelles existantes dans /reports. 12 cartes (une par mois) donnant en un coup d'œil : distance parcourue par mode de transport + durée de travail typique.
Décisions clés
- Types de jours inclus : tous les jours enregistrés (y compris absences = 0 min).
- Statistique temporelle : médiane (plus robuste que la moyenne face aux GARDE à 10h et aux absences).
- "Par semaine" : médiane de la durée totale hebdomadaire (somme des minutes par semaine ISO, puis médiane).
- Layout : 12 cartes empilées sous un titre "Détail mensuel".
- Couleurs transport : évocatrices (vert vélo, indigo électrique, ambre diesel).
Architecture
Données calculées par mois
monthly_data[month_int] = {
"km_by_vehicle": {vehicle_id: km},
"km_total": int,
"median_daily_min": int, # médiane de entry.total_minutes() sur toutes les entries du mois
"median_weekly_min": int, # médiane des sommes hebdomadaires (semaines ISO)
"entry_count": int,
}
Répartition du code
app/business/time_calc.py: nouvelle fonctionmonthly_stats(entries)→ calcule les médianes journalière et hebdomadaire. Pas de dépendance Flask.app/routes/reports.py: groupement des entries par mois + calcul des km par véhicule (déjà dans ce fichier), appel demonthly_stats, transmission du tout au template.app/templates/reports.html: section "Détail mensuel" avec les 12 cartes.
Visuel des cartes
┌─────────────────────────────────────────────┐
│ JANVIER 21 jours │
│ │
│ 312 km │
│ [████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░] │
│ ■ Vélo (132 km) ■ Électrique (108 km) │
│ ■ Diesel (72 km) │
│ │
│ Médiane/jour 7h52 Médiane/sem. 38h45 │
└─────────────────────────────────────────────┘
- Barre transport :
divflex, sectionswidth: X%enstyle=inline (contrainte Tailwind CDN). - Couleurs :
- Vélo →
#4ade80(vert vif) - Électrique (fuel = "electric") →
#818cf8(indigo) - Diesel →
#d4a574(ambre chaud)
- Vélo →
- Légende : carré coloré + nom du véhicule + km, sous la barre.
- Mois vide (0 entrées) : carte discrète, texte "Aucune entrée", sans barre.
Tests
- Nouvelle fonction
monthly_stats()danstests/test_time_calc.py:- cas nominal (entries avec time_slots)
- absences (total_minutes = 0) incluses dans la médiane
- mois avec une seule semaine
- Route
reports: vérifier quemonthly_dataest bien transmis au template (test existant à étendre si besoin).