Files
wevads-platform/scripts/intelligence-dashboard.php
2026-02-26 04:53:11 +01:00

272 lines
15 KiB
PHP
Executable File

<?php
$db = new PDO("pgsql:host=127.0.0.1;dbname=adx_system", "admin", "admin123");
// Stats
$methodCount = $db->query("SELECT COUNT(*) FROM admin.method_scores")->fetchColumn();
$learningCount = $db->query("SELECT COUNT(*) FROM admin.learning_history")->fetchColumn();
$alertCount = $db->query("SELECT COUNT(*) FROM admin.antispam_watch WHERE resolved = FALSE")->fetchColumn();
// Best methods
$bestMethods = $db->query("SELECT * FROM admin.method_scores
WHERE total_uses >= 3
ORDER BY (inbox_score * 0.4 + stability_score * 0.3 + cost_score * 0.3) DESC
LIMIT 10")->fetchAll(PDO::FETCH_ASSOC);
// Recent learnings
$recentLearnings = $db->query("SELECT * FROM admin.learning_history ORDER BY created_at DESC LIMIT 10")->fetchAll(PDO::FETCH_ASSOC);
// Active alerts
$alerts = $db->query("SELECT * FROM admin.antispam_watch WHERE resolved = FALSE ORDER BY severity DESC, detected_at DESC LIMIT 5")->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Intelligence Dashboard - WEVAL</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: 'Segoe UI', sans-serif; background: linear-gradient(135deg, #0f0f1a 0%, #1a1a2e 100%); min-height: 100vh; color: #e2e8f0; padding: 20px; }
.header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 30px; }
.header h1 { font-size: 28px; background: linear-gradient(135deg, #8b5cf6, #6366f1); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.stats-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; margin-bottom: 30px; }
.stat-card { background: rgba(30, 41, 59, 0.9); border-radius: 12px; padding: 25px; border: 1px solid rgba(139, 92, 246, 0.3); }
.stat-card .value { font-size: 36px; font-weight: 700; color: #a78bfa; }
.stat-card .label { font-size: 12px; color: #94a3b8; margin-top: 5px; }
.grid-2 { display: grid; grid-template-columns: 2fr 1fr; gap: 20px; }
.card { background: rgba(30, 41, 59, 0.9); border-radius: 12px; padding: 20px; border: 1px solid rgba(139, 92, 246, 0.2); margin-bottom: 20px; }
.card h3 { color: #a78bfa; margin-bottom: 15px; font-size: 16px; display: flex; align-items: center; gap: 10px; }
table { width: 100%; border-collapse: collapse; }
th, td { padding: 12px; text-align: left; border-bottom: 1px solid rgba(139, 92, 246, 0.1); }
th { font-size: 11px; color: #64748b; text-transform: uppercase; }
.score { display: inline-block; padding: 4px 10px; border-radius: 12px; font-size: 12px; font-weight: 600; }
.score.high { background: rgba(34, 197, 94, 0.2); color: #4ade80; }
.score.medium { background: rgba(249, 115, 22, 0.2); color: #fb923c; }
.score.low { background: rgba(239, 68, 68, 0.2); color: #f87171; }
.trend { font-size: 11px; }
.trend.up { color: #4ade80; }
.trend.down { color: #f87171; }
.trend.stable { color: #94a3b8; }
.alert-item { padding: 12px; border-radius: 8px; margin-bottom: 8px; }
.alert-item.critical { background: rgba(239, 68, 68, 0.15); border-left: 4px solid #ef4444; }
.alert-item.high { background: rgba(249, 115, 22, 0.15); border-left: 4px solid #f97316; }
.alert-item.medium { background: rgba(234, 179, 8, 0.15); border-left: 4px solid #eab308; }
.calculator { background: rgba(15, 23, 42, 0.8); padding: 20px; border-radius: 12px; }
.form-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; margin-bottom: 15px; }
.form-group label { display: block; font-size: 11px; color: #94a3b8; margin-bottom: 5px; }
.form-group input { width: 100%; padding: 10px; border-radius: 6px; border: 1px solid rgba(139, 92, 246, 0.3); background: rgba(15, 23, 42, 0.8); color: #fff; }
.btn { padding: 12px 20px; border: none; border-radius: 8px; cursor: pointer; font-weight: 600; }
.btn-primary { background: linear-gradient(135deg, #8b5cf6, #6366f1); color: #fff; }
.result-box { margin-top: 20px; padding: 20px; background: rgba(34, 197, 94, 0.1); border-radius: 8px; border: 1px solid rgba(34, 197, 94, 0.3); }
</style>
</head>
<body>
<div class="header">
<h1><i class="fas fa-brain"></i> Intelligence Dashboard</h1>
<a href="/ceo-pilotage.php" style="color:#a78bfa;text-decoration:none;"><i class="fas fa-arrow-left"></i> Retour CEO</a>
</div>
<div class="stats-row">
<div class="stat-card">
<div class="value"><?= $methodCount ?></div>
<div class="label">Méthodes apprises</div>
</div>
<div class="stat-card">
<div class="value"><?= $learningCount ?></div>
<div class="label">Apprentissages</div>
</div>
<div class="stat-card">
<div class="value"><?= $alertCount ?></div>
<div class="label">Alertes actives</div>
</div>
<div class="stat-card">
<div class="value">15</div>
<div class="label">ISPs configurés</div>
</div>
</div>
<div class="grid-2">
<div>
<!-- Best Methods -->
<div class="card">
<h3><i class="fas fa-trophy"></i> Meilleures Méthodes</h3>
<table>
<thead>
<tr>
<th>Méthode</th>
<th>ISP</th>
<th>Inbox</th>
<th>Stabilité</th>
<th>Uses</th>
<th>Trend</th>
</tr>
</thead>
<tbody>
<?php foreach ($bestMethods as $m):
$inboxClass = $m['inbox_score'] >= 75 ? 'high' : ($m['inbox_score'] >= 60 ? 'medium' : 'low');
$trendClass = $m['trend'] == 'improving' ? 'up' : ($m['trend'] == 'declining' ? 'down' : 'stable');
$trendIcon = $m['trend'] == 'improving' ? '↑' : ($m['trend'] == 'declining' ? '↓' : '→');
?>
<tr>
<td><?= htmlspecialchars($m['method_name']) ?></td>
<td><?= $m['isp'] ?></td>
<td><span class="score <?= $inboxClass ?>"><?= $m['inbox_score'] ?>%</span></td>
<td><span class="score <?= $m['stability_score'] >= 70 ? 'high' : 'medium' ?>"><?= $m['stability_score'] ?>%</span></td>
<td><?= $m['total_uses'] ?></td>
<td><span class="trend <?= $trendClass ?>"><?= $trendIcon ?> <?= $m['trend'] ?></span></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<!-- Economic Calculator -->
<div class="card">
<h3><i class="fas fa-calculator"></i> Calculateur Économique</h3>
<div class="calculator">
<div class="form-row">
<div class="form-group">
<label>Volume (mails)</label>
<input type="number" id="calcVolume" value="50000">
</div>
<div class="form-group">
<label>Serveurs</label>
<input type="number" id="calcServers" value="2">
</div>
<div class="form-group">
<label>Heures estimées</label>
<input type="number" id="calcHours" value="3" step="0.5">
</div>
</div>
<div class="form-row">
<div class="form-group">
<label>Inbox Rate (%)</label>
<input type="number" id="calcInbox" value="75">
</div>
<div class="form-group">
<label>Payout (€/conversion)</label>
<input type="number" id="calcPayout" value="5" step="0.5">
</div>
<div class="form-group">
<label>Stabilité (%)</label>
<input type="number" id="calcStability" value="70">
</div>
</div>
<button class="btn btn-primary" onclick="calculateEconomics()">
<i class="fas fa-calculator"></i> Calculer
</button>
<div id="calcResult" class="result-box" style="display:none;"></div>
</div>
</div>
</div>
<div>
<!-- Alerts -->
<div class="card">
<h3><i class="fas fa-exclamation-triangle"></i> Alertes Anti-Spam</h3>
<?php if (empty($alerts)): ?>
<div style="text-align:center;color:#4ade80;padding:30px;">
<i class="fas fa-check-circle" style="font-size:40px;"></i>
<div style="margin-top:10px;">Aucune alerte active</div>
</div>
<?php else: ?>
<?php foreach ($alerts as $a): ?>
<div class="alert-item <?= $a['severity'] ?>">
<div style="font-weight:600;"><?= $a['isp'] ?> - <?= $a['filter_name'] ?></div>
<div style="font-size:12px;color:#94a3b8;margin-top:5px;"><?= $a['description'] ?></div>
</div>
<?php endforeach; ?>
<?php endif; ?>
</div>
<!-- Recent Learning -->
<div class="card">
<h3><i class="fas fa-graduation-cap"></i> Apprentissages Récents</h3>
<?php foreach ($recentLearnings as $l): ?>
<div style="padding:10px;border-bottom:1px solid rgba(139,92,246,0.1);font-size:13px;">
<span style="color:<?= $l['learning_type'] == 'success_pattern' ? '#4ade80' : '#f87171' ?>">
<?= $l['learning_type'] == 'success_pattern' ? '✓' : '✗' ?>
</span>
<?= $l['isp'] ?>/<?= $l['country'] ?> -
<span style="color:#64748b;"><?= date('d/m H:i', strtotime($l['created_at'])) ?></span>
</div>
<?php endforeach; ?>
</div>
<!-- Quick Actions -->
<div class="card">
<h3><i class="fas fa-bolt"></i> Actions Rapides</h3>
<button class="btn btn-primary" style="width:100%;margin-bottom:10px;" onclick="syncISPKnowledge()">
<i class="fas fa-sync"></i> Sync ISP Knowledge
</button>
<button class="btn btn-primary" style="width:100%;margin-bottom:10px;" onclick="location.href='/api/intelligence-api.php?action=list_all_isps'">
<i class="fas fa-list"></i> Voir tous les ISPs
</button>
<button class="btn btn-primary" style="width:100%;" onclick="location.href='/api/master-monitor-api.php?action=list_all_providers'">
<i class="fas fa-robot"></i> Voir toutes les IAs
</button>
</div>
</div>
</div>
<script>
async function calculateEconomics() {
const fd = new FormData();
fd.append('action', 'calculate_economics');
fd.append('volume', document.getElementById('calcVolume').value);
fd.append('servers', document.getElementById('calcServers').value);
fd.append('hours', document.getElementById('calcHours').value);
fd.append('inbox_rate', document.getElementById('calcInbox').value);
fd.append('payout', document.getElementById('calcPayout').value);
fd.append('stability_score', document.getElementById('calcStability').value);
fd.append('domains', 1);
fd.append('ips', document.getElementById('calcServers').value);
const res = await fetch('/api/intelligence-api.php', {method: 'POST', body: fd});
const data = await res.json();
if (data.success) {
const r = data.result;
const recColor = r.recommendation.action === 'SCALE_UP' ? '#4ade80' :
r.recommendation.action === 'STOP' ? '#f87171' : '#fb923c';
document.getElementById('calcResult').style.display = 'block';
document.getElementById('calcResult').innerHTML = `
<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:15px;">
<div>
<div style="color:#64748b;font-size:11px;">COÛT TOTAL</div>
<div style="font-size:24px;font-weight:700;">€${r.costs.total}</div>
</div>
<div>
<div style="color:#64748b;font-size:11px;">REVENU NET</div>
<div style="font-size:24px;font-weight:700;color:${r.revenue.net >= 0 ? '#4ade80' : '#f87171'}">€${r.revenue.net}</div>
</div>
<div>
<div style="color:#64748b;font-size:11px;">ROI</div>
<div style="font-size:24px;font-weight:700;color:${r.performance.roi_percent >= 100 ? '#4ade80' : '#fb923c'}">${r.performance.roi_percent}%</div>
</div>
</div>
<div style="margin-top:20px;padding:15px;background:rgba(0,0,0,0.3);border-radius:8px;">
<div style="font-weight:600;color:${recColor};">${r.recommendation.action}</div>
<div style="font-size:12px;color:#94a3b8;margin-top:5px;">${r.recommendation.reason}</div>
</div>
<div style="margin-top:15px;display:grid;grid-template-columns:repeat(3,1fr);gap:10px;font-size:12px;">
<div>Inbox: ${r.metrics.inbox_count.toLocaleString()}</div>
<div>Clicks: ${r.metrics.click_count.toLocaleString()}</div>
<div>Conv: ${r.metrics.conversion_count.toLocaleString()}</div>
</div>
`;
}
}
async function syncISPKnowledge() {
const res = await fetch('/api/intelligence-api.php', {method: 'POST', body: new URLSearchParams({action: 'sync_isp_knowledge'})});
const data = await res.json();
alert(data.success ? `Synced ${data.synced} ISP configurations` : 'Error');
}
</script>
</body>
</html>