from flask import Blueprint, render_template, request, redirect, url_for, flash from datetime import date, time import sqlalchemy as sa from app import db from app.models import WorkEntry, TimeSlot from app.config_loader import get_journeys, get_motor_vehicles, day_types_without_journey, journey_has_motor bp = Blueprint("entries", __name__, url_prefix="/entries") DAY_TYPES = [ ("WORK", "Travail"), ("TT", "Télétravail"), ("GARDE", "Garde"), ("ASTREINTE", "Astreinte"), ("FORMATION", "Formation"), ("RTT", "RTT"), ("CONGE", "Congé"), ("MALADE", "Maladie"), ("FERIE", "Férié"), ] @bp.route("/") def list_entries(): entries = db.session.scalars( sa.select(WorkEntry).order_by(WorkEntry.date.desc()) ).all() return render_template("entry_list.html", entries=entries) @bp.route("/new", methods=["GET", "POST"]) @bp.route("//edit", methods=["GET", "POST"]) def entry_form(entry_id=None): entry = None if entry_id: entry = db.session.get(WorkEntry, entry_id) if not entry: flash("Entrée introuvable.", "error") return redirect(url_for("entries.list_entries")) if request.method == "POST": entry_date = date.fromisoformat(request.form["date"]) day_type = request.form["day_type"] journey_profile_id = request.form.get("journey_profile_id") or None motor_vehicle_id = request.form.get("motor_vehicle_id") or None if not journey_has_motor(journey_profile_id): motor_vehicle_id = None comment = request.form.get("comment") or None if day_type in day_types_without_journey(): journey_profile_id = None if entry is None: existing = db.session.scalar( sa.select(WorkEntry).where(WorkEntry.date == entry_date) ) if existing: flash(f"Une entrée existe déjà pour le {entry_date}.", "error") return redirect(url_for("entries.entry_form")) entry = WorkEntry(date=entry_date) db.session.add(entry) entry.day_type = day_type entry.journey_profile_id = journey_profile_id entry.comment = comment entry.motor_vehicle_id = motor_vehicle_id for slot in list(entry.time_slots): db.session.delete(slot) starts = request.form.getlist("start_time") ends = request.form.getlist("end_time") for s, e in zip(starts, ends): if s and e: db.session.add(TimeSlot( entry=entry, start_time=time.fromisoformat(s), end_time=time.fromisoformat(e), )) db.session.commit() flash("Entrée enregistrée.", "success") return redirect(url_for("dashboard.index")) journeys = get_journeys() return render_template( "entry_form.html", entry=entry, day_types=DAY_TYPES, journeys=journeys, motor_vehicles=get_motor_vehicles(), day_types_without_journey=day_types_without_journey(), today=date.today().isoformat(), ) @bp.route("//delete", methods=["POST"]) def delete_entry(entry_id): entry = db.session.get(WorkEntry, entry_id) if entry: db.session.delete(entry) db.session.commit() flash("Entrée supprimée.", "success") return redirect(url_for("entries.list_entries"))