gmao/app_new/prevention/routes.py
root ed6675b9d3
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run
Structure le suivi de la prévention et du DUERP
2026-08-14 21:43:13 +00:00

54 lines
4.2 KiB
Python

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"))