2026-07-21 16:45:13 +02:00

83 lines
3.7 KiB
HTML

{% extends "base.html" %}
{% block content %}
<a class="back" href="/approvals">← Volver a aprobación técnica</a>
{% if error %}
<div class="alert error">{{ error }}</div>
{% endif %}
<section class="decision-detail">
<div class="detail-heading">
<div>
<span class="machine">{{ proposal.machine_id }}</span>
<span class="status">{{ proposal.proposal_status|label }}</span>
<h1>Propuesta de contexto: {{ proposal.proposed_source_type|label }}</h1>
</div>
</div>
<div class="question-box">
<h2>Respuesta aportada por Producción</h2>
<p><strong>{{ proposal.answer_code|label }}</strong></p>
<p>Respondido por {{ proposal.proposed_by_display_name }} el {{ proposal.proposed_at|datetime_es }}</p>
</div>
<dl class="facts">
<div><dt>Inicio exacto</dt><dd>{{ proposal.first_seen_at|datetime_es }}</dd></div>
<div><dt>Fin exacto</dt><dd>{{ proposal.ended_at|datetime_es }}</dd></div>
<div><dt>Estado del intervalo</dt><dd>{{ proposal.case_status|label }}</dd></div>
<div><dt>Estado de revisión</dt><dd>{{ proposal.case_review_status|label }}</dd></div>
<div><dt>Órdenes</dt><dd>{{ proposal.production_orders|join(", ") if proposal.production_orders else "—" }}</dd></div>
<div><dt>Workorders</dt><dd>{{ proposal.odoo_workorder_ids|join(", ") if proposal.odoo_workorder_ids else "—" }}</dd></div>
</dl>
{% if proposal.last_action_notes %}
<div class="consultation-box">
<strong>Último intercambio</strong>
<p>{{ proposal.last_action_notes }}</p>
<small>{{ proposal.last_action_by }} · {{ proposal.last_action_at|datetime_es }}</small>
</div>
{% endif %}
<div class="info-box">
<strong>Validaciones al aprobar</strong>
<p>La aplicación comprobará que el intervalo ha terminado y que no se solapa con Odoo ni con otro contexto autoritativo. El contexto se creará en SHADOW y con elegibilidad oficial desactivada.</p>
</div>
{% if not write_enabled %}
<div class="alert error">La interfaz está en modo solo lectura.</div>
{% elif proposal.proposal_status == 'PENDING' %}
<form method="post" action="/approvals/{{ proposal.proposal_id }}/approve" class="review-form">
<input type="hidden" name="csrf_token" value="{{ user.csrf_token }}">
<input type="hidden" name="submission_key" value="{{ submission_key }}">
<label>
Observaciones técnicas
<textarea name="notes" rows="4" placeholder="Ejemplo: intervalo cerrado, sin solapamientos y coherente con la respuesta de Producción."></textarea>
</label>
<button class="primary" type="submit">Aprobar y crear contexto</button>
</form>
<form method="post" action="/approvals/{{ proposal.proposal_id }}/request_clarification" class="review-form">
<input type="hidden" name="csrf_token" value="{{ user.csrf_token }}">
<input type="hidden" name="submission_key" value="{{ submission_key }}">
<label>
Aclaración necesaria
<textarea name="notes" rows="4" required placeholder="Indique qué dato debe aclarar Producción."></textarea>
</label>
<button class="secondary" type="submit">Solicitar aclaración</button>
</form>
<form method="post" action="/approvals/{{ proposal.proposal_id }}/reject" class="review-form">
<input type="hidden" name="csrf_token" value="{{ user.csrf_token }}">
<input type="hidden" name="submission_key" value="{{ submission_key }}">
<label>
Motivo del rechazo
<textarea name="notes" rows="4" required placeholder="Explique por qué no debe crearse el contexto."></textarea>
</label>
<button class="danger-button" type="submit">Rechazar propuesta</button>
</form>
{% else %}
<div class="alert success">La propuesta ya no está pendiente: {{ proposal.proposal_status|label }}.</div>
{% endif %}
</section>
{% endblock %}