from flask import Blueprint, render_template, request from datetime import date 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.config_loader import get_vehicles, get_journeys, get_bareme bp = Blueprint("reports", __name__, url_prefix="/reports") @bp.route("/") def index(): year = request.args.get("year", date.today().year, type=int) start = date(year, 1, 1) end = date(year, 12, 31) entries = db.session.scalars( sa.select(WorkEntry).where(WorkEntry.date.between(start, end)) ).all() vehicles = get_vehicles() journeys = get_journeys() total_km = {} total_co2 = 0.0 for entry in entries: km = compute_km_for_entry(entry.journey_profile_id, journeys, entry.motor_vehicle_id) for v, d in km.items(): total_km[v] = total_km.get(v, 0) + d total_co2 += compute_co2_grams(km, vehicles) frais_reels = {} for vehicle_id, km in total_km.items(): vehicle = vehicles.get(vehicle_id, {}) cv = vehicle.get("cv") if cv: tranches = get_bareme(year, cv) electric = vehicle.get("fuel") == "electric" frais_reels[vehicle_id] = round(compute_frais_reels(km, tranches, electric=electric), 2) day_type_counts = count_day_types(entries) return render_template( "reports.html", year=year, total_km=total_km, total_co2_kg=round(total_co2 / 1000, 2), frais_reels=frais_reels, vehicles=vehicles, day_type_counts=day_type_counts, )