feat: statistiques mensuelles dans la page rapports #2
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user