185 lines
7.0 KiB
HTML
185 lines
7.0 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|label }}</span>
|
|
<h1>{{ decision.decision_title }}</h1>
|
|
</div>
|
|
<div class="status-stack">
|
|
<span class="status">Incidencia: {{ decision.decision_status|label }}</span>
|
|
<span class="status">Revisión: {{ decision.review_status|label }}</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="question-box">
|
|
<h2>Pregunta</h2>
|
|
<p>{{ decision.question_text }}</p>
|
|
</div>
|
|
|
|
{% if consultation %}
|
|
<div class="consultation-box">
|
|
<h2>En consulta</h2>
|
|
<p>{{ consultation.reason }}</p>
|
|
{% if consultation.follow_up_with %}
|
|
<p><strong>Consultar con:</strong> {{ consultation.follow_up_with }}</p>
|
|
{% endif %}
|
|
<small>Marcado por {{ consultation.created_by_display_name }} el {{ consultation.created_at|datetime_es }}</small>
|
|
|
|
{% if write_enabled %}
|
|
<form method="post" action="/decisions/{{ decision.decision_group_key|urlencode }}/resume">
|
|
<input type="hidden" name="csrf_token" value="{{ user.csrf_token }}">
|
|
<input type="hidden" name="submission_key" value="{{ resume_submission_key }}">
|
|
<button class="secondary" type="submit">Ya tengo la información</button>
|
|
</form>
|
|
{% endif %}
|
|
</div>
|
|
{% endif %}
|
|
|
|
<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: {{ case.case_status|label }}
|
|
· Revisión: {{ case.case_review_status|label }}
|
|
</p>
|
|
{% if case.case_resolution_classification %}
|
|
<p><strong>Periodo ya aclarado:</strong> {{ case.case_resolution_classification|label }}</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 %}
|
|
{% if not consultation %}
|
|
<details class="consultation-form">
|
|
<summary>No conozco todavía la respuesta</summary>
|
|
<form method="post" action="/decisions/{{ decision.decision_group_key|urlencode }}/consultation">
|
|
<input type="hidden" name="csrf_token" value="{{ user.csrf_token }}">
|
|
<input type="hidden" name="submission_key" value="{{ consultation_submission_key }}">
|
|
<label>
|
|
Qué información falta
|
|
<textarea name="reason" rows="3" required placeholder="Ejemplo: preguntar a la operaria del turno de tarde qué estaba haciendo la máquina."></textarea>
|
|
</label>
|
|
<label>
|
|
A quién hay que consultar
|
|
<input name="follow_up_with" placeholder="Ejemplo: María / responsable del turno anterior">
|
|
</label>
|
|
<button class="secondary" type="submit">Marcar En consulta</button>
|
|
</form>
|
|
</details>
|
|
{% endif %}
|
|
|
|
<form class="review-form" method="post" action="/decisions/{{ decision.decision_group_key|urlencode }}/review">
|
|
<input type="hidden" name="csrf_token" value="{{ user.csrf_token }}">
|
|
<input type="hidden" name="submission_key" value="{{ review_submission_key }}">
|
|
|
|
<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, text in answer_options %}
|
|
<label class="radio-row">
|
|
<input type="radio" name="answer_code" value="{{ code }}" required>
|
|
<span>{{ text }}</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 %}
|
|
|
|
<div class="info-box">
|
|
<strong>Qué ocurrirá después</strong>
|
|
<p>Su respuesta cerrará la pregunta de Producción. Cuando la respuesta permita crear un contexto histórico, se enviará una propuesta a validación técnica. Usted no crea ni aprueba contextos.</p>
|
|
</div>
|
|
|
|
<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>
|
|
{% elif write_enabled %}
|
|
<div class="alert error">Su rol puede consultar esta decisión, pero no resolverla.</div>
|
|
{% endif %}
|
|
</section>
|
|
{% endblock %}
|