| Current Path : /home/seto/testhive.pm/admin/ |
| Current File : /home/seto/testhive.pm/admin/stats.php |
<?php
require_once __DIR__ . '/../includes/auth.php';
require_once __DIR__ . '/../includes/db.php';
require_once __DIR__ . '/_layout.php';
// Manual cleanup
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['cleanup'])) {
$deleted = db()->exec("DELETE FROM impressions_daily WHERE date < date('now', '-30 days')");
$msg = "Удалено записей: {$deleted}";
}
// Stats: impressions per campaign per day (last 14 days)
$rows = db()->query(
"SELECT c.name, id.date, COUNT(*) as cnt
FROM impressions_daily id
JOIN links l ON l.id = id.link_id
JOIN campaigns c ON c.id = l.campaign_id
WHERE id.date >= date('now', '-13 days')
GROUP BY c.id, id.date
ORDER BY id.date DESC, cnt DESC"
)->fetchAll();
// Pivot: campaigns as rows, dates as columns
$dates = [];
$data = [];
foreach ($rows as $r) {
$dates[$r['date']] = true;
$data[$r['name']][$r['date']] = (int)$r['cnt'];
}
krsort($dates);
$dates = array_keys($dates);
// Per-link impression totals
$linkStats = db()->query(
"SELECT l.text, c.name AS campaign_name, COUNT(*) AS total
FROM impressions_daily id
JOIN links l ON l.id = id.link_id
JOIN campaigns c ON c.id = l.campaign_id
GROUP BY id.link_id
ORDER BY total DESC
LIMIT 200"
)->fetchAll();
layout_head('Статистика');
?>
<?php if (isset($msg)): ?>
<div class="alert alert-success"><?= htmlspecialchars($msg) ?></div>
<?php endif ?>
<div class="mb-3">
<form method="post" class="d-inline" onsubmit="return confirm('Удалить impressions старше 30 дней?')">
<input type="hidden" name="cleanup" value="1">
<button class="btn btn-outline-danger btn-sm">Очистить старые данные (>30 дней)</button>
</form>
</div>
<!-- Campaign pivot table -->
<?php if (empty($data)): ?>
<p class="text-muted">Нет данных за последние 14 дней.</p>
<?php else: ?>
<h6 class="fw-semibold mb-2">По кампаниям (14 дней)</h6>
<div class="card shadow-sm mb-4">
<div class="table-responsive">
<table class="table table-sm table-bordered mb-0 small">
<thead class="table-light">
<tr>
<th>Campaign</th>
<?php foreach ($dates as $d): ?><th class="text-center"><?= htmlspecialchars($d) ?></th><?php endforeach ?>
<th class="text-end">Итого</th>
</tr>
</thead>
<tbody>
<?php foreach ($data as $cname => $byDate):
$total = array_sum($byDate);
?>
<tr>
<td><?= htmlspecialchars($cname) ?></td>
<?php foreach ($dates as $d): ?>
<td class="text-center"><?= isset($byDate[$d]) ? $byDate[$d] : '—' ?></td>
<?php endforeach ?>
<td class="text-end fw-semibold"><?= number_format($total) ?></td>
</tr>
<?php endforeach ?>
</tbody>
</table>
</div>
</div>
<?php endif ?>
<!-- Per-link balance table -->
<?php if (!empty($linkStats)): ?>
<h6 class="fw-semibold mb-2">Баланс показов по ссылкам</h6>
<div class="card shadow-sm">
<div class="table-responsive">
<table class="table table-sm table-hover mb-0 small">
<thead class="table-light">
<tr>
<th>Campaign</th>
<th>Текст ссылки</th>
<th class="text-end">Показов всего</th>
</tr>
</thead>
<tbody>
<?php foreach ($linkStats as $ls): ?>
<tr>
<td><?= htmlspecialchars($ls['campaign_name']) ?></td>
<td class="text-truncate" style="max-width:360px"><?= htmlspecialchars($ls['text']) ?></td>
<td class="text-end"><?= number_format((int)$ls['total']) ?></td>
</tr>
<?php endforeach ?>
</tbody>
</table>
</div>
</div>
<?php endif ?>
<?php layout_foot() ?>