175 lines
7.6 KiB
HTML
175 lines
7.6 KiB
HTML
{% 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 %}
|