# 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 ```python 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 fonction `monthly_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 de `monthly_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** : `div` flex, sections `width: X%` en `style=` inline (contrainte Tailwind CDN). - **Couleurs** : - Vélo → `#4ade80` (vert vif) - Électrique (fuel = "electric") → `#818cf8` (indigo) - Diesel → `#d4a574` (ambre chaud) - **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()` dans `tests/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 que `monthly_data` est bien transmis au template (test existant à étendre si besoin).