domovoy_bot/web/templates/emails.html

175 lines
7.6 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{% extends "base.html" %}
{% block title %}Email Audit - LKM37 Admin{% endblock %}
{% block nav_emails %}active{% endblock %}
{% block content %}
<div class="row mb-4">
<div class="col-md-8">
<h2 style="color: var(--matrix-green); text-shadow: 0 0 10px var(--matrix-green);">
>_ АУДИТ_ВЗАИМОДЕЙСТВИЯ_С_ОРГАНАМИ
</h2>
</div>
<div class="col-md-4 text-end">
<button id="runAuditBtn" class="btn btn-matrix">ЗАПУСТИТЬ ЭКСПОРТ</button>
</div>
</div>
<div class="row g-4">
<!-- СТАТУС АРХИВА -->
<div class="col-md-4">
<div class="card h-100">
<div class="card-header">АРХИВ_PDF (NOTEBOOK_LM)</div>
<div class="card-body text-center d-flex flex-column justify-content-center">
{% if has_master_pdf %}
<i class="bi bi-file-earmark-pdf-fill display-1 text-danger mb-3"></i>
<h5>TOTAL_ARCHIVE_2025-2026.pdf</h5>
<p class="small opacity-50">Обновлен: {{ fmt_local(last_update) }}</p>
<a href="/static/email_archive/TOTAL_ARCHIVE_2025-2026.pdf" class="btn btn-success w-100 mb-2" download>СКАЧАТЬ АРХИВ</a>
<button id="syncAiBtn" class="btn btn-matrix w-100">
<i class="bi bi-robot"></i> СИНХРОНИЗИРОВАТЬ С ИИ
</button>
{% else %}
<i class="bi bi-file-earmark-x display-1 opacity-20 mb-3"></i>
<p>Архив еще не сформирован</p>
<button class="btn btn-outline-secondary w-100" disabled>НЕДОСТУПНО</button>
{% endif %}
</div>
</div>
</div>
<!-- ПОСЛЕДНЯЯ АКТИВНОСТЬ -->
<div class="col-md-8">
<div class="card h-100">
<div class="card-header">СТАТИСТИКА_ВЕДОМСТВ</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-dark table-hover mb-0">
<thead>
<tr>
<th>Ведомство / Домен</th>
<th class="text-center">Вх.</th>
<th class="text-center">Исх.</th>
<th>Последнее письмо</th>
</tr>
</thead>
<tbody>
{% for domain in audit_data %}
<tr>
<td>
<span class="text-success">{{ domain.domain }}</span>
<br><small class="opacity-50">{{ domain.description }}</small>
</td>
<td class="text-center">{{ domain.inbound_count }}</td>
<td class="text-center">{{ domain.outbound_count }}</td>
<td>{{ domain.last_email_date.strftime('%d.%m.%Y') if domain.last_email_date else '-' }}</td>
</tr>
{% else %}
<tr>
<td colspan="4" class="text-center opacity-50 py-4">Данных пока нет. Запустите экспорт.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="row mt-4">
<!-- СВЕЖИЕ ПОСТУПЛЕНИЯ -->
<div class="col-md-12">
<div class="card">
<div class="card-header">СВЕЖИЕОСТУПЛЕНИЯ_В_АРХИВ (ПОСЛЕДНИЕ 10)</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-dark table-hover mb-0" style="font-size: 0.85rem;">
<thead>
<tr>
<th>Дата</th>
<th>Ведомство</th>
<th>Тема письма</th>
</tr>
</thead>
<tbody>
{% for email in latest_emails %}
<tr>
<td><code class="text-info">{{ email.date }}</code></td>
<td><span class="badge bg-secondary">{{ email.domain }}</span></td>
<td class="text-truncate" style="max-width: 500px;">{{ email.subject }}</td>
</tr>
{% else %}
<tr>
<td colspan="3" class="text-center opacity-50 py-3">Новых файлов пока нет</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="row mt-4">
<div class="col">
<div class="card">
<div class="card-header">ЛОГ_ПОСЛЕДНЕГО_ЗАПУСКА</div>
<div class="card-body">
<div class="p-3 bg-black border border-success font-monospace small">
{% if last_log %}
[TIME] Начат: {{ fmt_local(last_log.start_time) }} <br>
[TIME] Завершен: {{ fmt_local(last_log.end_time) if last_log.end_time else 'В ПРОЦЕССЕ...' }} <br>
[STATUS] Статус: <span class="{% if last_log.status == 'success' %}text-success{% else %}text-warning{% endif %}">{{ last_log.status.upper() }}</span> <br>
[DATA] Новых писем: {{ last_log.new_emails_count }}
{% else %}
[INFO] Запуски еще не производились.
{% endif %}
</div>
</div>
</div>
</div>
</div>
<script>
document.getElementById('syncAiBtn').addEventListener('click', async function() {
const btn = this;
if (!confirm('Отправить архив в NotebookLM для анализа?')) return;
btn.disabled = true;
const oldHtml = btn.innerHTML;
btn.innerHTML = '<span class="spinner-border spinner-border-sm"></span> СИНХРОНИЗИРУЮ...';
try {
const response = await fetch('/api/emails/sync_ai', { method: 'POST' });
const result = await response.json();
alert(result.message);
} catch (e) {
alert('Ошибка при синхронизации: ' + e);
} finally {
btn.disabled = false;
btn.innerHTML = oldHtml;
}
});
document.getElementById('runAuditBtn').addEventListener('click', async function() {
const btn = this;
if (!confirm('Запустить процесс синхронизации с Gmail? Это может занять пару минут.')) return;
btn.disabled = true;
btn.innerText = 'ЗАПУСКАЮ...';
try {
const response = await fetch('/api/emails/run', { method: 'POST' });
const result = await response.json();
alert(result.message);
location.reload();
} catch (e) {
alert('Ошибка при запуске: ' + e);
btn.disabled = false;
btn.innerText = 'ЗАПУСТИТЬ ЭКСПОРТ';
}
});
</script>
{% endblock %}