54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
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,
|
|
)
|