From 7d64a29601c53d4f16771ca91c9e9fb8ca8362d0 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 20 Aug 2026 22:53:04 +0000 Subject: [PATCH] Rendre le workflow des interventions modifiable --- app_new/interventions/crud.py | 36 +++++++++++++-------- app_new/interventions/templates/detail.html | 9 ++++++ app_new/works/routes.py | 9 +++++- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/app_new/interventions/crud.py b/app_new/interventions/crud.py index d64a2f5..465dde1 100644 --- a/app_new/interventions/crud.py +++ b/app_new/interventions/crud.py @@ -404,19 +404,27 @@ def detail(id): def save_work_details(id): """Enregistre les informations de travaux depuis la fiche intervention.""" intervention = Intervention.query.get_or_404(id) - intervention.execution_mode = request.form.get('execution_mode', 'interne') - service_id = request.form.get('department_service_id') - intervention.department_service_id = int(service_id) if service_id and service_id.isdigit() else None - company_id = request.form.get('company_id') - intervention.company_id = int(company_id) if company_id and company_id.isdigit() else None - intervention.quote_status = request.form.get('quote_status', 'non_requis') - intervention.quote_reference = request.form.get('quote_reference') or None - intervention.quote_amount_ht = float(request.form['quote_amount_ht']) if request.form.get('quote_amount_ht') else None - intervention.quote_amount_ttc = float(request.form['quote_amount_ttc']) if request.form.get('quote_amount_ttc') else None + if 'execution_mode' in request.form: + intervention.execution_mode = request.form.get('execution_mode') or 'interne' + if 'department_service_id' in request.form: + service_id = request.form.get('department_service_id') + intervention.department_service_id = int(service_id) if service_id and service_id.isdigit() else None + if 'company_id' in request.form: + company_id = request.form.get('company_id') + intervention.company_id = int(company_id) if company_id and company_id.isdigit() else None + if 'quote_status' in request.form: + intervention.quote_status = request.form.get('quote_status') or 'non_requis' + if 'quote_reference' in request.form: + intervention.quote_reference = request.form.get('quote_reference') or None + for field in ('quote_amount_ht', 'quote_amount_ttc'): + if field in request.form: + setattr(intervention, field, float(request.form[field]) if request.form.get(field) else None) for field in ('department_request_date', 'chief_validation_date', 'department_validation_date', 'quote_date', 'quote_valid_until'): - value = request.form.get(field) - setattr(intervention, field, datetime.strptime(value, '%Y-%m-%d').date() if value else None) - intervention.work_notes = request.form.get('work_notes') or None + if field in request.form: + value = request.form.get(field) + setattr(intervention, field, datetime.strptime(value, '%Y-%m-%d').date() if value else None) + if 'work_notes' in request.form: + intervention.work_notes = request.form.get('work_notes') or None db.session.commit() flash('Workflow travaux enregistré.', 'success') return redirect(url_for('interventions.detail', id=id)) @@ -499,7 +507,9 @@ def change_status(id): """Changer le statut d'une intervention.""" intervention = Intervention.query.get_or_404(id) old_status = intervention.status - new_status = request.form.get('status') + # Les anciennes fiches utilisent ``to_status`` ; accepter aussi ``status`` + # pour les formulaires d'édition et conserver une transition réellement modifiable. + new_status = request.form.get('to_status') or request.form.get('status') comment = request.form.get('comment', '') allowed = INTERVENTION_TRANSITIONS.get(old_status, set()) diff --git a/app_new/interventions/templates/detail.html b/app_new/interventions/templates/detail.html index bc2f2b5..52ecb45 100644 --- a/app_new/interventions/templates/detail.html +++ b/app_new/interventions/templates/detail.html @@ -51,6 +51,15 @@
Workflow
+
+ + + +
{% set workflow_order = ['brouillon', 'attente_chef', 'demande_departement', 'attente_devis', 'devis_a_valider', 'devis_accepte', 'entreprise_mandatee', 'travaux_planifies', 'travaux_en_cours', 'travaux_termines', 'reception', 'cloturee'] if intervention.execution_mode != 'interne' else ['brouillon', 'attente_chef', 'en_cours', 'en_attente_pieces', 'en_attente_entreprise', 'terminee', 'cloturee'] %} {% for step in workflow_order %} diff --git a/app_new/works/routes.py b/app_new/works/routes.py index a9d2c4c..59855e4 100644 --- a/app_new/works/routes.py +++ b/app_new/works/routes.py @@ -11,11 +11,15 @@ STATUSES = ["brouillon", "à_valider_chef", "travaux_internes_autorisés", "devi @works_bp.route("/") @login_required def index(): - return render_template("works/index.html", requests=WorkRequest.query.order_by(WorkRequest.created_at.desc()).all()) + flash("Les demandes de travaux sont désormais gérées directement dans les interventions.", "info") + return redirect(url_for("interventions.index")) @works_bp.route("/new", methods=["GET", "POST"]) @login_required def new(): + 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")) 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)) @@ -24,6 +28,9 @@ def new(): @works_bp.route("/", methods=["GET", "POST"]) @login_required def detail(id): + # 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")) 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