feat: calcul stats mensuelles dans reports (km + médianes)

This commit is contained in:
2026-03-13 14:35:18 +01:00
parent 6d5e58273f
commit 59d64885d4

View File

@@ -1,14 +1,21 @@
from flask import Blueprint, render_template, request from flask import Blueprint, render_template, request
from datetime import date from datetime import date
from collections import defaultdict
import sqlalchemy as sa import sqlalchemy as sa
from app import db from app import db
from app.models import WorkEntry from app.models import WorkEntry
from app.business.travel_calc import compute_km_for_entry, compute_co2_grams, compute_frais_reels 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 from app.config_loader import get_vehicles, get_journeys, get_bareme
bp = Blueprint("reports", __name__, url_prefix="/reports") 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("/") @bp.route("/")
def index(): def index():
@@ -23,6 +30,7 @@ def index():
vehicles = get_vehicles() vehicles = get_vehicles()
journeys = get_journeys() journeys = get_journeys()
# --- Stats annuelles (inchangées) ---
total_km = {} total_km = {}
total_co2 = 0.0 total_co2 = 0.0
for entry in entries: for entry in entries:
@@ -42,6 +50,32 @@ def index():
day_type_counts = count_day_types(entries) 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( return render_template(
"reports.html", "reports.html",
year=year, year=year,
@@ -50,4 +84,5 @@ def index():
frais_reels=frais_reels, frais_reels=frais_reels,
vehicles=vehicles, vehicles=vehicles,
day_type_counts=day_type_counts, day_type_counts=day_type_counts,
monthly_data=monthly_data,
) )