diff --git a/app_new/core/models/maintenance.py b/app_new/core/models/maintenance.py index 5cf6564..eacb80e 100644 --- a/app_new/core/models/maintenance.py +++ b/app_new/core/models/maintenance.py @@ -375,6 +375,8 @@ class LotTask(db.Model): tache = db.Column(db.Text, nullable=True) periodicite = db.Column(db.String(200), nullable=True) contrat = db.Column(db.Boolean, default=False) + company_id = db.Column(db.Integer, db.ForeignKey("companies.id"), nullable=True) + contract_id = db.Column(db.Integer, db.ForeignKey("contracts.id"), nullable=True) gestionnaire = db.Column(db.String(50), nullable=True) jours_entre_interventions = db.Column(db.Integer, nullable=True) type_maintenance = db.Column(db.String(50), nullable=True) @@ -390,6 +392,8 @@ class LotTask(db.Model): unavailable_policy = db.Column(db.String(20), nullable=False, default="suspend") after_repair_policy = db.Column(db.String(20), nullable=False, default="preserve") is_safety_critical = db.Column(db.Boolean, nullable=False, default=False) + company = db.relationship("Company") + contract = db.relationship("Contract") def effective_duration(self): """Duree previsionnelle auto-adaptee pour cette tache de lot. diff --git a/app_new/core/models/planning.py b/app_new/core/models/planning.py index e608ec2..40afd49 100644 --- a/app_new/core/models/planning.py +++ b/app_new/core/models/planning.py @@ -426,6 +426,7 @@ class PreventiveTask(db.Model): has_contract = db.Column(db.Boolean, default=False) manager = db.Column(db.String(50)) company_id = db.Column(db.Integer, db.ForeignKey("companies.id")) + contract_id = db.Column(db.Integer, db.ForeignKey("contracts.id"), nullable=True) trigger_type = db.Column(db.String(20), default="time") meter_type_required = db.Column(db.String(50)) @@ -441,6 +442,7 @@ class PreventiveTask(db.Model): lot = db.relationship("Lot", backref=db.backref("preventive_tasks", lazy="dynamic")) category = db.relationship("EquipmentCategory", backref=db.backref("preventive_tasks", lazy="dynamic")) company = db.relationship("Company") + contract = db.relationship("Contract") consumables_needed = db.relationship("PreventiveTaskConsumable", back_populates="task", lazy="dynamic") def __repr__(self): diff --git a/app_new/core/services/maintenance_engine.py b/app_new/core/services/maintenance_engine.py index 7e7f0a2..7c56200 100644 --- a/app_new/core/services/maintenance_engine.py +++ b/app_new/core/services/maintenance_engine.py @@ -137,6 +137,8 @@ def generate_due_tasks(task: LotTask, event=None, today=None, equipment_ids=None status = "suspended" if unavailable and not task.is_safety_critical and task.unavailable_policy == "suspend" else "planned" item = ScheduledTask(lot_task_id=task.id, equipment_id=equipment.id, room_id=room.id if room else None, + company_id=task.company_id, + contract_id=task.contract_id, scheduled_date=due, estimated_duration=task.effective_duration(), status=status, suspension_reason="Équipement indisponible" if status == "suspended" else None, room_name_snapshot=room.name if room else None, diff --git a/app_new/lots/routes.py b/app_new/lots/routes.py index 08cd2d8..845608c 100644 --- a/app_new/lots/routes.py +++ b/app_new/lots/routes.py @@ -9,6 +9,7 @@ from ..core.models.maintenance import Lot, LotTask from ..core.models.planning import ScheduledTask from ..core.services.maintenance_engine import generate_due_tasks from ..core.models.company import Company +from ..contracts.models import Contract from ..core.models.equipment import Equipment lots_bp = Blueprint('lots', __name__) @@ -71,6 +72,8 @@ def _apply_task_form(task): task.after_repair_policy = request.form.get('after_repair_policy') or 'preserve' task.is_safety_critical = request.form.get('is_safety_critical') == 'on' task.is_active = request.form.get('is_active') == 'on' + task.company_id = request.form.get('company_id', type=int) or None + task.contract_id = request.form.get('contract_id', type=int) or None @lots_bp.route('//tasks/new', methods=['GET', 'POST']) @@ -87,7 +90,7 @@ def task_create(lot_id): db.session.commit() flash('Tâche préventive ajoutée au lot.', 'success') return redirect(url_for('lots.detail', id=lot.id)) - return render_template('lots/task_form.html', lot=lot, task=task, creating=True) + return render_template('lots/task_form.html', lot=lot, task=task, creating=True, companies=Company.query.order_by(Company.name).all(), contracts=Contract.query.order_by(Contract.name).all()) @lots_bp.route('//tasks//edit', methods=['GET', 'POST']) @@ -103,7 +106,7 @@ def task_edit(lot_id, task_id): db.session.commit() flash('Règle préventive mise à jour.', 'success') return redirect(url_for('lots.detail', id=lot.id)) - return render_template('lots/task_form.html', lot=lot, task=task, creating=False) + return render_template('lots/task_form.html', lot=lot, task=task, creating=False, companies=Company.query.order_by(Company.name).all(), contracts=Contract.query.order_by(Contract.name).all()) @lots_bp.route('//generate', methods=['POST']) diff --git a/app_new/planning/templates/planning/scheduled.html b/app_new/planning/templates/planning/scheduled.html index f3a51c5..0fc4bc1 100644 --- a/app_new/planning/templates/planning/scheduled.html +++ b/app_new/planning/templates/planning/scheduled.html @@ -36,7 +36,7 @@ {{ task.scheduled_date.strftime('%d/%m/%Y') if task.scheduled_date else '-' }} {{ task.scheduled_start.strftime('%H:%M') if task.scheduled_start else '- - -' }} {{ task.lot_task.tache if task.lot_task else '-' }} - {{ task.equipment.name if task.equipment else '-' }} + {{ task.equipment.name if task.equipment else '-' }}{% if task.company %}
{{ task.company.name }}{% if task.contract %} · {{ task.contract.name }}{% endif %}
{% endif %} {{ task.room.name if task.room else '-' }} {% if task.estimated_duration %}{{ task.estimated_duration }}{% elif task.lot_task and task.lot_task.duree_minutes %}{{ task.lot_task.duree_minutes }}{% else %}-{% endif %} min diff --git a/app_new/templates/lots/task_form.html b/app_new/templates/lots/task_form.html index ac07019..9a73e1a 100644 --- a/app_new/templates/lots/task_form.html +++ b/app_new/templates/lots/task_form.html @@ -21,6 +21,8 @@
Pour 30 chaises, « groupe » crée une seule tâche dans la salle.
+
+
diff --git a/migrations/versions/fc3d4e5f6a7b_link_preventive_contracts.py b/migrations/versions/fc3d4e5f6a7b_link_preventive_contracts.py new file mode 100644 index 0000000..e1dcb02 --- /dev/null +++ b/migrations/versions/fc3d4e5f6a7b_link_preventive_contracts.py @@ -0,0 +1,13 @@ +"""Lie les tâches préventives aux entreprises et contrats.""" +from alembic import op +import sqlalchemy as sa +revision = "fc3d4e5f6a7b" +down_revision = "fb2c3d4e5f6a" +branch_labels = None +depends_on = None +def upgrade(): + op.add_column("lot_tasks", sa.Column("company_id", sa.Integer(), sa.ForeignKey("companies.id"), nullable=True)) + op.add_column("lot_tasks", sa.Column("contract_id", sa.Integer(), sa.ForeignKey("contracts.id"), nullable=True)) + op.add_column("scheduled_tasks", sa.Column("contract_id", sa.Integer(), sa.ForeignKey("contracts.id"), nullable=True)) +def downgrade(): + op.drop_column("scheduled_tasks", "contract_id"); op.drop_column("lot_tasks", "contract_id"); op.drop_column("lot_tasks", "company_id")