feat: statistiques mensuelles dans la page rapports #2

Merged
AntoineVe merged 5 commits from monthly-stats-reports into master 2026-03-13 14:42:38 +01:00
Showing only changes of commit 59d64885d4 - Show all commits

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,
) )