65 lines
3.9 KiB
HTML
65 lines
3.9 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}Аналитика — InviteMe{% endblock %}
|
|
|
|
{% block content %}
|
|
<header class="page-header"><div><div class="eyebrow">Live-аналитика</div><h1 class="page-title">{{ event.name }}</h1><p class="page-subtitle">Сводка по приглашениям, ответам и фактическим входам.</p></div><a class="btn btn-primary" href="{{ url_for('main.check_in') }}">Открыть контроль входа</a></header>
|
|
<div class="stats-grid"><div class="stat-card"><div class="stat-label">Всего гостей</div><div class="stat-value">{{ total }}</div><div class="stat-meta">в списке мероприятия</div></div><div class="stat-card"><div class="stat-label">Уже пришли</div><div class="stat-value text-success">{{ checked_in }}</div><div class="stat-meta">успешных входов</div></div><div class="stat-card"><div class="stat-label">Ожидаются</div><div class="stat-value">{{ not_checked_in }}</div><div class="stat-meta">ещё не отметились</div></div><div class="stat-card"><div class="stat-label">Посещаемость</div><div class="stat-value">{{ attendance_percent }}%</div><div class="stat-meta">от общего списка</div></div></div>
|
|
|
|
<h2 class="h5 mb-3">Подтверждения участия</h2>
|
|
<div class="row mb-4">
|
|
<div class="col-md-4"><div class="card"><div class="card-body"><h5 class="card-title">Подтвердили</h5><p class="display-6 text-success">{{ rsvp_confirmed }}</p></div></div></div>
|
|
<div class="col-md-4"><div class="card"><div class="card-body"><h5 class="card-title">Отказались</h5><p class="display-6 text-muted">{{ rsvp_declined }}</p></div></div></div>
|
|
<div class="col-md-4"><div class="card"><div class="card-body"><h5 class="card-title">Ожидается ответ</h5><p class="display-6 text-warning">{{ rsvp_pending }}</p></div></div></div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<h5 class="card-title">Быстрый поиск</h5>
|
|
<form action="{{ url_for('main.admin_guests') }}" method="GET" class="d-flex">
|
|
<input type="text" name="q" class="form-control me-2" placeholder="Фамилия или ФИО" required>
|
|
<button type="submit" class="btn btn-primary">Найти</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<h5 class="card-title">Действия</h5>
|
|
<a href="{{ url_for('main.admin_report') }}" class="btn btn-success">Выгрузить отчёт Excel</a>
|
|
<form action="{{ url_for('main.admin_send_invitations') }}" method="POST" class="d-inline">
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
|
<button type="submit" class="btn btn-outline-primary">Разослать приглашения</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<h2 class="h5 mt-5 mb-3">Последние входы</h2><div class="table-card table-responsive"><table class="table table-hover">
|
|
<thead>
|
|
<tr>
|
|
<th>Время</th>
|
|
<th>ФИО</th>
|
|
<th>Отдел</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for check_in in recent_check_ins %}
|
|
<tr>
|
|
<td>{{ check_in.checked_in_at | localtime('%d.%m.%Y %H:%M:%S') }}</td>
|
|
<td>{{ check_in.guest.full_name }}</td>
|
|
<td>{{ check_in.guest.department }}</td>
|
|
</tr>
|
|
{% else %}
|
|
<tr>
|
|
<td colspan="3" class="text-muted">Пока никто не отмечен</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table></div>
|
|
{% endblock %}
|