from datetime import date, datetime, timedelta from flask import Blueprint, flash, redirect, render_template, request, url_for from flask_login import current_user, login_required from sqlalchemy import func from app_new.extensions import db from app_new.core.models.user import Staff from app_new.core.models.prevention import PreventionWorkLog, StaffAuthorization, RiskAssessment, PreventionAction, SafetyRegisterEntry prevention_bp = Blueprint("prevention", __name__) def _date(value): return datetime.strptime(value, "%Y-%m-%d").date() if value else None @prevention_bp.route("/") @login_required def index(): monday = date.today() - timedelta(days=date.today().weekday()) minutes = db.session.query(func.coalesce(func.sum(PreventionWorkLog.duration_minutes), 0)).filter(PreventionWorkLog.user_id == current_user.id, PreventionWorkLog.work_date >= monday).scalar() target = 210 # 10 % d'une semaine de 35 h, paramétrable à l'étape suivante. return render_template("prevention/index.html", staff=Staff.query.filter_by(is_active=True).order_by(Staff.last_name).all(), logs=PreventionWorkLog.query.order_by(PreventionWorkLog.work_date.desc()).limit(20).all(), risks=RiskAssessment.query.filter_by(is_active=True).all(), actions=PreventionAction.query.order_by(PreventionAction.due_date).all(), entries=SafetyRegisterEntry.query.order_by(SafetyRegisterEntry.entry_date.desc()).limit(20).all(), minutes=minutes, target=target) @prevention_bp.post("/staff") @login_required def add_staff(): db.session.add(Staff(first_name=request.form.get("first_name", "").strip(), last_name=request.form.get("last_name", "").strip(), function=request.form.get("function"))) db.session.commit(); flash("Agent ajouté.", "success"); return redirect(url_for("prevention.index")) @prevention_bp.post("/time") @login_required def add_time(): db.session.add(PreventionWorkLog(user_id=current_user.id, work_date=_date(request.form.get("work_date")) or date.today(), duration_minutes=max(1, request.form.get("duration_minutes", type=int) or 1), activity=request.form.get("activity", "").strip(), notes=request.form.get("notes"))) db.session.commit(); flash("Temps de prévention enregistré.", "success"); return redirect(url_for("prevention.index")) @prevention_bp.post("/authorization") @login_required def add_authorization(): db.session.add(StaffAuthorization(staff_id=request.form.get("staff_id", type=int), name=request.form.get("name", "").strip(), issued_on=_date(request.form.get("issued_on")), expires_on=_date(request.form.get("expires_on")), issuer=request.form.get("issuer"))) db.session.commit(); flash("Habilitation enregistrée.", "success"); return redirect(url_for("prevention.index")) @prevention_bp.post("/risk") @login_required def add_risk(): db.session.add(RiskAssessment(work_unit=request.form.get("work_unit", "").strip(), hazard=request.form.get("hazard", "").strip(), exposed_people=request.form.get("exposed_people"), severity=request.form.get("severity", type=int) or 1, probability=request.form.get("probability", type=int) or 1, control_measures=request.form.get("control_measures"), reviewed_on=date.today())) db.session.commit(); flash("Risque ajouté au DUERP.", "success"); return redirect(url_for("prevention.index")) @prevention_bp.post("/action") @login_required def add_action(): db.session.add(PreventionAction(title=request.form.get("title", "").strip(), source_type=request.form.get("source_type", "observation"), risk_id=request.form.get("risk_id", type=int), priority=request.form.get("priority", "normale"), owner=request.form.get("owner"), due_date=_date(request.form.get("due_date")))) db.session.commit(); flash("Action créée.", "success"); return redirect(url_for("prevention.index")) @prevention_bp.post("/register") @login_required def add_register(): db.session.add(SafetyRegisterEntry(entry_date=_date(request.form.get("entry_date")) or date.today(), entry_type=request.form.get("entry_type", "observation"), title=request.form.get("title", "").strip(), details=request.form.get("details"), location=request.form.get("location"), created_by_id=current_user.id)) db.session.commit(); flash("Entrée ajoutée au registre.", "success"); return redirect(url_for("prevention.index"))