2026-08-21 00:25:28 +02:00
from datetime import date
from flask import Blueprint , flash , redirect , render_template , request , url_for
from flask_login import current_user , login_required
from . . extensions import db
from . . core . models import WorkRequest , WorkRequestEvent , WorkRequestQuote , Equipment , Company , Service
works_bp = Blueprint ( " works " , __name__ , template_folder = " templates " )
STATUSES = [ " brouillon " , " à_valider_chef " , " travaux_internes_autorisés " , " devis_en_attente " , " devis_à_valider_chef " , " devis_accepté " , " envoyée_département " , " entreprise_mandatée " , " travaux_planifiés " , " travaux_en_cours " , " travaux_terminés " , " clôturée " , " refusée " ]
@works_bp.route ( " / " )
@login_required
def index ( ) :
2026-08-21 00:53:04 +02:00
flash ( " Les demandes de travaux sont désormais gérées directement dans les interventions. " , " info " )
return redirect ( url_for ( " interventions.index " ) )
2026-08-21 00:25:28 +02:00
@works_bp.route ( " /new " , methods = [ " GET " , " POST " ] )
@login_required
def new ( ) :
2026-08-21 00:53:04 +02:00
if request . method == " GET " :
flash ( " Créez une intervention puis choisissez son workflow travaux dans sa fiche. " , " info " )
return redirect ( url_for ( " interventions.create " , workflow = " travaux " ) )
2026-08-21 00:25:28 +02:00
if request . method == " POST " :
item = WorkRequest ( title = request . form [ " title " ] . strip ( ) , description = request . form [ " description " ] . strip ( ) , execution_mode = request . form . get ( " execution_mode " , " interne " ) , priority = request . form . get ( " priority " , " normale " ) , equipment_id = request . form . get ( " equipment_id " , type = int ) or None , created_by_id = current_user . id , status = " à_valider_chef " )
db . session . add ( item ) ; db . session . flush ( ) ; db . session . add ( WorkRequestEvent ( request = item , user_id = current_user . id , new_status = item . status , comment = " Demande créée " ) ) ; db . session . commit ( ) ; flash ( " Demande de travaux créée. " , " success " ) ; return redirect ( url_for ( " works.detail " , id = item . id ) )
return render_template ( " works/form.html " , equipments = Equipment . query . filter_by ( is_deleted = False ) . order_by ( Equipment . name ) . all ( ) )
@works_bp.route ( " /<int:id> " , methods = [ " GET " , " POST " ] )
@login_required
def detail ( id ) :
2026-08-21 00:53:04 +02:00
# Compatibilité avec les anciennes URLs : le nouveau suivi est dans l'intervention.
flash ( " Le suivi des travaux est désormais intégré aux interventions. " , " info " )
return redirect ( url_for ( " interventions.index " ) )
2026-08-21 00:25:28 +02:00
item = WorkRequest . query . get_or_404 ( id )
if request . method == " POST " :
old = item . status ; item . status = request . form . get ( " status " , old ) ; item . notes = request . form . get ( " notes " ) or item . notes ; item . company_id = request . form . get ( " company_id " , type = int ) or item . company_id ; item . service_id = request . form . get ( " service_id " , type = int ) or item . service_id
if item . status != old : db . session . add ( WorkRequestEvent ( request = item , user_id = current_user . id , old_status = old , new_status = item . status , comment = request . form . get ( " comment " ) ) )
db . session . commit ( ) ; flash ( " Demande mise à jour. " , " success " ) ; return redirect ( url_for ( " works.detail " , id = id ) )
return render_template ( " works/detail.html " , item = item , statuses = STATUSES , companies = Company . query . order_by ( Company . name ) . all ( ) , services = Service . query . order_by ( Service . name ) . all ( ) )