diff --git a/app/routes/reports.py b/app/routes/reports.py index f244f3c..294425b 100644 --- a/app/routes/reports.py +++ b/app/routes/reports.py @@ -1,14 +1,21 @@ from flask import Blueprint, render_template, request from datetime import date +from collections import defaultdict import sqlalchemy as sa from app import db from app.models import WorkEntry from app.business.travel_calc import compute_km_for_entry, compute_co2_grams, compute_frais_reels -from app.business.time_calc import count_day_types +from app.business.time_calc import count_day_types, monthly_stats, minutes_to_str from app.config_loader import get_vehicles, get_journeys, get_bareme bp = Blueprint("reports", __name__, url_prefix="/reports") +MONTHS_FR = { + 1: "Janvier", 2: "Février", 3: "Mars", 4: "Avril", + 5: "Mai", 6: "Juin", 7: "Juillet", 8: "Août", + 9: "Septembre", 10: "Octobre", 11: "Novembre", 12: "Décembre", +} + @bp.route("/") def index(): @@ -23,6 +30,7 @@ def index(): vehicles = get_vehicles() journeys = get_journeys() + # --- Stats annuelles (inchangées) --- total_km = {} total_co2 = 0.0 for entry in entries: @@ -42,6 +50,32 @@ def index(): day_type_counts = count_day_types(entries) + # --- Stats mensuelles --- + entries_by_month: dict[int, list] = defaultdict(list) + for entry in entries: + entries_by_month[entry.date.month].append(entry) + + monthly_data = {} + for month in range(1, 13): + month_entries = entries_by_month.get(month, []) + + month_km: dict[str, int] = {} + 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 + + stats = monthly_stats(month_entries) + + monthly_data[month] = { + "month_name": MONTHS_FR[month], + "entry_count": len(month_entries), + "km_by_vehicle": month_km, + "km_total": sum(month_km.values()), + "median_daily_str": minutes_to_str(stats["median_daily_min"]) if month_entries else "–", + "median_weekly_str": minutes_to_str(stats["median_weekly_min"]) if month_entries else "–", + } + return render_template( "reports.html", year=year, @@ -50,4 +84,5 @@ def index(): frais_reels=frais_reels, vehicles=vehicles, day_type_counts=day_type_counts, + monthly_data=monthly_data, )