159 lines
5.6 KiB
HTML
159 lines
5.6 KiB
HTML
{% extends "base.html" %}
|
|
{% block content %}
|
|
<a class="back" href="/">← Volver a pendientes</a>
|
|
|
|
{% if error %}
|
|
<div class="alert error">{{ error }}</div>
|
|
{% endif %}
|
|
|
|
<section class="decision-detail">
|
|
<div class="detail-heading">
|
|
<div>
|
|
<span class="machine">{{ decision.machine_id or "GLOBAL" }}</span>
|
|
<span class="severity">{{ decision.max_severity }}</span>
|
|
<h1>{{ decision.decision_title }}</h1>
|
|
</div>
|
|
<div class="status-stack">
|
|
<span class="status">
|
|
Incidencia:
|
|
{% if decision.decision_status == "OPEN" %}Activa{% else %}Terminada{% endif %}
|
|
</span>
|
|
<span class="status">Revisión: {{ decision.review_status }}</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="question-box">
|
|
<h2>Pregunta</h2>
|
|
<p>{{ decision.question_text }}</p>
|
|
</div>
|
|
|
|
<section>
|
|
<h2>Intervalos y casos</h2>
|
|
<div class="timeline">
|
|
{% for case in cases %}
|
|
<article class="timeline-item {% if case.case_review_status != 'PENDING' %}reviewed{% endif %}">
|
|
<div class="timeline-time">
|
|
<strong>{{ case.first_seen_at|datetime_es }}</strong>
|
|
<span>→ {{ case.ended_at|datetime_es }}</span>
|
|
</div>
|
|
<div>
|
|
<h3>Caso {{ case.case_id }} · {{ case.case_title }}</h3>
|
|
<p>
|
|
Incidencia:
|
|
{% if case.case_status == "OPEN" %}activa{% else %}terminada{% endif %}
|
|
· Revisión: {{ case.case_review_status }}
|
|
</p>
|
|
{% if case.case_resolution_classification %}
|
|
<p><strong>Resolución previa:</strong> {{ case.case_resolution_classification }}</p>
|
|
{% endif %}
|
|
{% if case.production_orders %}
|
|
<p><strong>Órdenes:</strong> {{ case.production_orders|join(", ") }}</p>
|
|
{% endif %}
|
|
</div>
|
|
</article>
|
|
{% endfor %}
|
|
</div>
|
|
</section>
|
|
|
|
<details>
|
|
<summary>Evidencia técnica</summary>
|
|
<div class="evidence-list">
|
|
{% for item in decision.episode_evidence %}
|
|
<article>
|
|
<strong>Episodio {{ item.episode_id }} · {{ item.incident_title }}</strong>
|
|
<p>{{ item.latest_detail or "Sin detalle adicional." }}</p>
|
|
<small>
|
|
{{ item.first_seen_at }} → {{ item.ended_at or "abierto" }}
|
|
{% if item.production_order %} · {{ item.production_order }}{% endif %}
|
|
{% if item.operator_name %} · {{ item.operator_name }}{% endif %}
|
|
</small>
|
|
</article>
|
|
{% endfor %}
|
|
</div>
|
|
</details>
|
|
|
|
{% if not write_enabled %}
|
|
<div class="alert error">
|
|
La interfaz está en modo solo lectura. Puede validar la información, pero todavía no registrar respuestas.
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if can_review and pending_cases %}
|
|
<form class="review-form" method="post" action="/decisions/{{ decision.decision_group_key|urlencode }}/review">
|
|
<input type="hidden" name="csrf_token" value="{{ user.csrf_token }}">
|
|
|
|
<fieldset>
|
|
<legend>1. Intervalos a los que se aplica la respuesta</legend>
|
|
{% for case in pending_cases %}
|
|
<label class="check-row">
|
|
<input type="checkbox" name="case_ids" value="{{ case.case_id }}" checked>
|
|
<span>
|
|
Caso {{ case.case_id }}:
|
|
{{ case.first_seen_at|datetime_es }}
|
|
→ {{ case.ended_at|datetime_es }}
|
|
</span>
|
|
</label>
|
|
{% endfor %}
|
|
<p class="help">Desmarque un intervalo cuando la causa no sea la misma. Los demás seguirán pendientes.</p>
|
|
</fieldset>
|
|
|
|
<fieldset>
|
|
<legend>2. Qué ocurrió</legend>
|
|
{% for code, label in answer_options %}
|
|
<label class="radio-row">
|
|
<input type="radio" name="answer_code" value="{{ code }}" required>
|
|
<span>{{ label }}</span>
|
|
</label>
|
|
{% endfor %}
|
|
</fieldset>
|
|
|
|
{% if decision.decision_family == "ODOO_ORDER_START_CONFLICT" %}
|
|
<fieldset>
|
|
<legend>3. Orden válida</legend>
|
|
{% for order_ref, workorder_id in order_pairs %}
|
|
<label class="radio-row">
|
|
<input type="radio" name="selected_order" value="{{ order_ref }}|{{ workorder_id }}">
|
|
<span>{{ order_ref }} · WO {{ workorder_id }}</span>
|
|
</label>
|
|
{% endfor %}
|
|
<label class="check-row">
|
|
<input type="checkbox" name="corrected_in_odoo" value="true">
|
|
<span>La incoherencia ya está corregida en Odoo</span>
|
|
</label>
|
|
</fieldset>
|
|
{% endif %}
|
|
|
|
{% if decision.decision_family == "UNCONFIRMED_ACTIVITY" %}
|
|
<fieldset>
|
|
<legend>3. Contexto retrospectivo</legend>
|
|
<label class="check-row">
|
|
<input type="checkbox" name="create_contexts" value="true">
|
|
<span>Crear un contexto exacto por cada intervalo seleccionado cuando la respuesta lo permita</span>
|
|
</label>
|
|
<p class="help">
|
|
Solo se admite para sistema antiguo, prueba/ajuste o mantenimiento.
|
|
No cubre los huecos entre intervalos y no se permite sobre casos todavía abiertos.
|
|
</p>
|
|
</fieldset>
|
|
{% endif %}
|
|
|
|
<label>
|
|
Observaciones
|
|
<textarea name="notes" rows="5" placeholder="Explique brevemente qué ocurrió y, cuando proceda, qué se corrigió."></textarea>
|
|
</label>
|
|
|
|
<label class="check-row confirmation">
|
|
<input type="checkbox" name="confirmation" value="true" required>
|
|
<span>Confirmo que la respuesta refleja la realidad de planta para los intervalos seleccionados.</span>
|
|
</label>
|
|
|
|
<button class="primary" type="submit">Resolver selección</button>
|
|
</form>
|
|
{% elif not pending_cases %}
|
|
<div class="alert success">Esta decisión ya no tiene casos pendientes.</div>
|
|
{% else %}
|
|
<div class="alert error">Su rol puede consultar esta decisión, pero no resolverla.</div>
|
|
{% endif %}
|
|
</section>
|
|
{% endblock %}
|