gmao/app_new/equipments/scheduled.py
root 701a765576
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run
Séparer les workflows d'intervention et de prévention
2026-08-21 10:12:23 +00:00

163 lines
8 KiB
Python

"""Equipments Scheduled Routes - GMAO Collège"""
from flask import Blueprint, render_template, redirect, url_for, request, flash, jsonify
from flask_login import login_required, current_user
from datetime import datetime
from app_new.extensions import db
from ..core.models.equipment import Equipment, EquipmentCategory, EquipmentDocument, EquipmentRoomHistory, EquipmentRestriction
from ..core.models.college import Room, Building, RoomType, Zone
from ..core.models.maintenance import Lot, Intervention
from ..core.models.planning import Meter, MeterReading, Consumable, EquipmentConsumable, ScheduledTask
from app_new.constants import EQUIPMENT_STATUSES
def _empty_to_none(v):
"""Convertit une chaîne vide en None."""
return None if v == '' else v
scheduled_bp = Blueprint("equipments_scheduled", __name__, template_folder='templates')
@scheduled_bp.route('/<int:id>/scheduled-tasks')
@login_required
def scheduled_tasks(id):
"""Liste des tâches planifiées pour un équipement."""
from ..core.models.planning import ScheduledTask
from ..core.models.equipment import Equipment
equipment = Equipment.query.get_or_404(id)
tasks = ScheduledTask.query.filter_by(equipment_id=id).order_by(ScheduledTask.scheduled_date).all()
return render_template('equipments/scheduled_tasks.html', equipment=equipment, tasks=tasks)
@scheduled_bp.route('/<int:id>/scheduled-tasks/new', methods=['GET', 'POST'])
@login_required
def new_scheduled_task(id):
"""Ajouter une tâche planifiée à un équipement."""
from ..core.models.planning import ScheduledTask
from ..core.models.equipment import Equipment
from ..core.models.college import Room
from flask_login import current_user
from datetime import datetime
equipment = Equipment.query.get_or_404(id)
if request.method == 'POST':
# Si company_id est défini, pas de technicien individuel
assigned_to = request.form.get('assigned_to_id') or None
company = request.form.get('company_id') or None
task = ScheduledTask(
equipment_id=id,
preventive_task_id=request.form.get('preventive_task_id') or None,
room_id=request.form.get('room_id') or None,
scheduled_date=datetime.strptime(request.form.get('scheduled_date'), '%Y-%m-%d').date() if request.form.get('scheduled_date') else None,
scheduled_start=datetime.strptime(request.form.get('scheduled_start'), '%H:%M').time() if request.form.get('scheduled_start') else None,
scheduled_end=datetime.strptime(request.form.get('scheduled_end'), '%H:%M').time() if request.form.get('scheduled_end') else None,
estimated_duration=int(request.form.get('estimated_duration') or 30),
status='planned',
assigned_to_id=assigned_to,
company_id=company
)
db.session.add(task)
db.session.commit()
flash('Tâche planifiée ajoutée', 'success')
return redirect(url_for('equipments.scheduled_tasks', id=id))
from ..core.models.company import Company
from ..core.models.user import User
rooms = Room.query.order_by(Room.name).all()
technicians = User.query.filter(User.role.in_(['technicien', 'tech', 'technician', 'responsable_gmao', 'admin'])).all()
companies = Company.query.order_by(Company.name).all()
return render_template('equipments/scheduled_task_form.html', equipment=equipment, rooms=rooms, technicians=technicians, companies=companies)
@scheduled_bp.route('/<int:id>/scheduled-tasks/<int:task_id>/edit', methods=['GET', 'POST'])
@login_required
def edit_scheduled_task(id, task_id):
"""Modifier une tâche planifiée."""
from ..core.models.planning import ScheduledTask
from ..core.models.college import Room
from datetime import datetime
task = ScheduledTask.query.filter_by(id=task_id, equipment_id=id).first_or_404()
equipment = Equipment.query.get_or_404(id)
if request.method == 'POST':
task.preventive_task_id = request.form.get('preventive_task_id') or None
task.room_id = request.form.get('room_id') or None
task.scheduled_date = datetime.strptime(request.form.get('scheduled_date'), '%Y-%m-%d').date() if request.form.get('scheduled_date') else None
task.scheduled_start = datetime.strptime(request.form.get('scheduled_start'), '%H:%M').time() if request.form.get('scheduled_start') else None
task.scheduled_end = datetime.strptime(request.form.get('scheduled_end'), '%H:%M').time() if request.form.get('scheduled_end') else None
task.estimated_duration = int(request.form.get('estimated_duration') or 30)
task.status = request.form.get('status', 'planned')
task.notes = request.form.get('notes')
task.assigned_to_id = request.form.get('assigned_to_id') or None
task.company_id = request.form.get('company_id') or None
db.session.commit()
flash('Tâche mise à jour', 'success')
return redirect(url_for('equipments.scheduled_tasks', id=id))
from ..core.models.company import Company
from ..core.models.user import User
rooms = Room.query.order_by(Room.name).all()
technicians = User.query.filter(User.role.in_(['technicien', 'tech', 'technician', 'responsable_gmao', 'admin'])).all()
companies = Company.query.order_by(Company.name).all()
return render_template('equipments/scheduled_task_form.html', equipment=equipment, task=task, rooms=rooms, technicians=technicians, companies=companies)
@scheduled_bp.route('/<int:id>/scheduled-tasks/<int:task_id>/delete', methods=['POST'])
@login_required
def delete_scheduled_task(id, task_id):
"""Supprimer une tâche planifiée."""
from ..core.models.planning import ScheduledTask
task = ScheduledTask.query.filter_by(id=task_id, equipment_id=id).first_or_404()
db.session.delete(task)
db.session.commit()
flash('Tâche supprimée', 'success')
return redirect(url_for('equipments.scheduled_tasks', id=id))
@scheduled_bp.route('/<int:id>/scheduled-tasks/<int:task_id>/create-intervention', methods=['GET', 'POST'])
@login_required
def create_intervention_from_task(id, task_id):
"""Créer une intervention à partir d'une tâche planifiée."""
from ..core.models.planning import ScheduledTask
from ..core.models.maintenance import Intervention
from ..core.models.company import Company
from ..core.models.user import User
from flask_login import current_user
task = ScheduledTask.query.filter_by(id=task_id, equipment_id=id).first_or_404()
equipment = Equipment.query.get_or_404(id)
if request.method == 'POST':
intervention = Intervention(
title=f"Intervention: {task.preventive_task.name if task.preventive_task else task.lot_task.name}",
description=task.notes,
equipment_id=id,
room_id=request.form.get('room_id') or task.room_id,
type='preventif',
workflow_type='preventive',
status='en_cours',
scheduled_date=task.scheduled_date,
scheduled_start=request.form.get('scheduled_start') or task.scheduled_start.strftime('%H:%M') if task.scheduled_start else None,
scheduled_end=request.form.get('scheduled_end') or task.scheduled_end.strftime('%H:%M') if task.scheduled_end else None,
assigned_to_id=request.form.get('assigned_to_id') or task.assigned_to_id or current_user.id
)
db.session.add(intervention)
db.session.commit()
flash('Intervention créée', 'success')
return redirect(url_for('interventions.detail', id=intervention.id))
rooms = Room.query.order_by(Room.name).all()
technicians = User.query.filter(User.role.in_(['technician', 'admin'])).all()
companies = Company.query.order_by(Company.name).all()
return render_template('interventions/form.html',
equipment=equipment,
task=task,
rooms=rooms,
technicians=technicians,
companies=companies)