17 lines
4.4 KiB
HTML
17 lines
4.4 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}Blocker {{ detail.id }} | GTI Fiscal{% endblock %}
|
|
{% block content %}
|
|
<div class="detail-head"><div><p class="eyebrow">RESOLUÇÃO OPERACIONAL</p><h1>Blocker {{ detail.id }}</h1><p class="muted">{{ detail.client or "Cliente não identificado" }} · {{ detail.product_code }}</p></div><div class="badge-stack"><span class="badge blocked large">Fiscal: {{ detail.blocker_type }}</span><span class="badge priority-{{ detail.priority|lower }} large">Prioridade: {{ detail.priority }}</span></div></div>
|
|
{% if error %}<div class="panel"><p class="error">{{ error }}</p></div>{% endif %}
|
|
<section class="split">
|
|
<article class="panel"><h2>Detalhes do blocker</h2><dl class="facts"><dt>Cliente</dt><dd>{{ detail.client or "-" }}</dd><dt>Instalação</dt><dd>{{ detail.installation.display_name or "-" }}</dd><dt>Servidor</dt><dd>{{ detail.server.hostname or "-" }}</dd><dt>Produto</dt><dd>{{ detail.product_code }}</dd><dt>Descrição</dt><dd>{{ detail.description or "-" }}</dd><dt>Campo</dt><dd>{{ detail.field or "OTHER" }}</dd><dt>Tipo</dt><dd>{{ detail.blocker_type }}</dd><dt>Motivo</dt><dd>{{ detail.reason }}</dd><dt>Idade</dt><dd>{{ detail.age }}</dd><dt>Primeira ocorrência</dt><dd title="{{ detail.first_seen_at }}">{{ detail.first_seen_display }}</dd><dt>Última ocorrência</dt><dd title="{{ detail.last_seen_at }}">{{ detail.last_seen_display }}</dd><dt>Evidência</dt><dd><pre class="evidence">{{ detail.evidence|tojson(indent=2) }}</pre></dd></dl></article>
|
|
<article class="panel"><h2>Contexto atual</h2><p class="muted">Valor atual por chave persistida para esta empresa.</p>{% for entry in context_entries %}<div class="list-row"><span><b>{{ entry.key }}</b><small>{{ entry.scope }} / {{ entry.scope_key or "empresa" }}</small></span><em>{{ entry.value }}</em></div>{% else %}<p class="muted">Nenhum valor definido.</p>{% endfor %}</article>
|
|
</section>
|
|
{% if resolution_available %}
|
|
<section class="panel"><h2>Salvar contexto e reprocessar</h2><p class="muted">Escolha uma chave fiscal validada. O reprocessamento será limitado ao produto deste blocker.</p><form method="post" action="/blockers/{{ detail.id }}/resolve-context"><input type="hidden" name="csrf_token" value="{{ csrf_token }}"><div class="form-grid"><label for="context-key">Chave de contexto<select id="context-key" name="key" required>{% for key in context_keys %}<option value="{{ key }}"{% if resolution_values.get('key') == key %} selected{% endif %}>{{ key }}</option>{% endfor %}</select></label><label for="context-value">Valor<input id="context-value" name="value" required maxlength="512" value="{{ resolution_values.get('value', '') }}"><small>Valores aceitos: {{ value_choices|join(", ") }}</small></label><label for="context-scope">Escopo<select id="context-scope" name="scope" required>{% for scope in ('PRODUCT', 'GROUP', 'COMPANY') %}<option value="{{ scope }}"{% if resolution_values.get('scope', 'PRODUCT') == scope %} selected{% endif %}>{{ scope }}</option>{% endfor %}</select></label><label for="scope-key">Chave do escopo<input id="scope-key" name="scope_key" value="{{ resolution_values.get('scope_key', detail.product_code) }}" required></label><label class="wide" for="context-reason">Nota<textarea id="context-reason" name="reason" required maxlength="2000">{{ resolution_values.get('reason', '') }}</textarea></label></div><div class="panel-title"><a href="/blockers">Cancelar</a><button type="submit">Salvar contexto e reprocessar</button></div></form></section>
|
|
{% else %}
|
|
<section class="panel"><h2>Resolução de contexto indisponível</h2><p class="error">Este é um blocker legado de empresa, sem vínculo comprovado com um servidor. Não é possível oferecer o reprocessamento de contexto com segurança.</p></section>
|
|
{% endif %}
|
|
<section class="split"><article class="panel"><h2>Eventos relacionados</h2>{% for event in detail.related_events[:10] %}<div class="event-row"><span>{{ event.severity }}</span><span><b>{{ event.event_type }}</b><small>{{ event.message }}{% if event.product_code %} · Produto {{ event.product_code }}{% endif %}</small></span></div>{% else %}<p class="empty-state">Nenhum evento relacionado.</p>{% endfor %}</article><article class="panel"><h2>Jobs relacionados</h2>{% for job in detail.related_jobs[:10] %}<div class="list-row"><span><b>Job {{ job.job_id }}</b><small>{{ job.kind }} · {{ job.status }}</small></span><em>{{ job.duration }}</em></div>{% else %}<p class="empty-state">Nenhum job relacionado.</p>{% endfor %}</article></section>
|
|
{% endblock %}
|