103 lines
3.9 KiB
HTML
103 lines
3.9 KiB
HTML
<!-- app/templates/log.html -->
|
|
{% extends "base.html" %}
|
|
{% block titulo %}Log{% endblock %}
|
|
{% block conteudo %}
|
|
<h1>Log</h1>
|
|
|
|
<details class="secao-log">
|
|
<summary>
|
|
<span class="secao-log-titulo">Ações no painel</span>
|
|
<button type="button" class="botao-toggle-log" aria-expanded="false">Mostrar</button>
|
|
</summary>
|
|
<div class="secao-log-conteudo">
|
|
{% if eh_admin %}
|
|
<form method="post" action="/log/limpar" style="margin-bottom:14px">
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
|
|
<button type="submit" onclick="return confirm('Limpar todo o histórico de ações? Isso não pode ser desfeito.')">Limpar log</button>
|
|
</form>
|
|
{% endif %}
|
|
{% if acoes %}
|
|
<div class="tabela-wrap">
|
|
<table>
|
|
<tr><th>Quando</th><th>Usuário</th><th>Ação</th><th>Entidade</th><th>Status</th><th>Detalhe</th></tr>
|
|
{% for a in acoes %}
|
|
<tr>
|
|
<td>{{ a.CRIADO_EM }}</td>
|
|
<td>{{ a.USUARIO }}</td>
|
|
<td>{{ a.ACAO }}</td>
|
|
<td>{{ a.ENTIDADE }}{% if a.ENTIDADE_ID %} #{{ a.ENTIDADE_ID }}{% endif %}</td>
|
|
<td><span class="badge {{ 'badge-sucesso' if a.SUCESSO else 'badge-neutro' }}">{{ "OK" if a.SUCESSO else "ERRO" }}</span></td>
|
|
<td>{{ a.DETALHE or "" }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</table>
|
|
</div>
|
|
{% else %}
|
|
<p>Nenhuma ação registrada ainda.</p>
|
|
{% endif %}
|
|
</div>
|
|
</details>
|
|
|
|
<details class="secao-log">
|
|
<summary>
|
|
<span class="secao-log-titulo">Envios automáticos de chave (n8n)</span>
|
|
<button type="button" class="botao-toggle-log" aria-expanded="false">Mostrar</button>
|
|
</summary>
|
|
<div class="secao-log-conteudo">
|
|
{% if not envios_configurado %}
|
|
<div class="cartao">
|
|
<p>
|
|
Integração com o n8n não configurada — defina <code>N8N_API_URL</code> e
|
|
<code>N8N_API_KEY</code> no ambiente (ver <code>.env.example</code>) para ver
|
|
aqui os envios automáticos de chave feitos pelo workflow do n8n.
|
|
</p>
|
|
</div>
|
|
{% elif not envios %}
|
|
<p>Nenhum envio encontrado (ou não foi possível consultar o n8n agora).</p>
|
|
{% else %}
|
|
<div class="tabela-wrap">
|
|
<table>
|
|
<tr>
|
|
<th>Data</th><th>Cliente</th><th>Código</th><th>Competência</th><th>Status</th>
|
|
<th>Telefones enviados</th><th>Telefones com erro</th>
|
|
</tr>
|
|
{% for e in envios %}
|
|
<tr>
|
|
<td>{{ e.data_processamento }}</td>
|
|
<td>{{ e.nome_cliente }}</td>
|
|
<td>{{ e.codigo_cliente }}</td>
|
|
<td>{{ e.competencia }}</td>
|
|
<td>{{ e.status }}</td>
|
|
<td>{{ e.telefones_enviados }}</td>
|
|
<td>{{ e.telefones_com_erro or "" }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</table>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</details>
|
|
|
|
<script>
|
|
document.querySelectorAll(".secao-log").forEach(function (secao) {
|
|
var botao = secao.querySelector(".botao-toggle-log");
|
|
var atualizar = function () {
|
|
var aberto = secao.hasAttribute("open");
|
|
botao.textContent = aberto ? "Ocultar" : "Mostrar";
|
|
botao.setAttribute("aria-expanded", aberto ? "true" : "false");
|
|
};
|
|
// Um <button> dentro de <summary> é ele mesmo um elemento interativo:
|
|
// o navegador não propaga o clique para o toggle nativo do <details>
|
|
// quando o clique começa em outro controle interativo. Por isso o
|
|
// toggle precisa ser feito manualmente aqui.
|
|
botao.addEventListener("click", function (evento) {
|
|
evento.preventDefault();
|
|
secao.open = !secao.open;
|
|
atualizar();
|
|
});
|
|
secao.addEventListener("toggle", atualizar);
|
|
atualizar();
|
|
});
|
|
</script>
|
|
{% endblock %}
|