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

353 lines
17 KiB
PHP
Executable File

<?php
/**
* CEO DASHBOARD - WEVAL
* Winning Campaigns | Data Collection | Send Scenarios
*/
try {
$pdo = new PDO('pgsql:host=localhost;dbname=adx_system', 'admin', 'admin123');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Exception $e) { die("DB: ".$e->getMessage()); }
// Stats
$stats = [
'campaigns' => 0, 'sent' => 0, 'opens' => 0, 'clicks' => 0,
'servers' => 0, 'domains' => 0, 'o365' => 0
];
try {
$r = $pdo->query("SELECT COUNT(*) FROM admin.mta_servers WHERE status='Running'")->fetchColumn();
$stats['servers'] = $r ?: 0;
} catch(Exception $e) {}
try {
$r = $pdo->query("SELECT COUNT(*) FROM admin.domains")->fetchColumn();
$stats['domains'] = $r ?: 0;
} catch(Exception $e) {}
try {
$r = $pdo->query("SELECT COUNT(*) FROM admin.office_accounts")->fetchColumn();
$stats['o365'] = $r ?: 0;
} catch(Exception $e) {}
// Recent activity
$activities = [];
try {
$stmt = $pdo->query("SELECT * FROM admin.mta_servers ORDER BY id DESC LIMIT 5");
$activities = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch(Exception $e) {}
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>📊 CEO 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',system-ui,sans-serif;background:linear-gradient(135deg,#0f172a,#1e293b);color:#e2e8f0;min-height:100vh}
.header{background:linear-gradient(135deg,#7c3aed,#4f46e5);padding:20px 30px;display:flex;justify-content:space-between;align-items:center;box-shadow:0 4px 20px rgba(0,0,0,0.3)}
.header h1{font-size:1.6rem;display:flex;align-items:center;gap:12px}
.header-time{font-size:0.9rem;opacity:0.9}
.container{max-width:1600px;margin:0 auto;padding:20px}
/* KPI Cards */
.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:20px;margin-bottom:25px}
.kpi-card{background:linear-gradient(135deg,rgba(30,41,59,0.9),rgba(51,65,85,0.9));border-radius:16px;padding:25px;border:1px solid rgba(255,255,255,0.1);transition:transform 0.3s}
.kpi-card:hover{transform:translateY(-5px)}
.kpi-icon{font-size:2.5rem;margin-bottom:15px}
.kpi-value{font-size:2.5rem;font-weight:bold;margin-bottom:5px}
.kpi-label{font-size:0.9rem;opacity:0.7}
.kpi-trend{font-size:0.8rem;margin-top:10px;padding:4px 10px;border-radius:20px;display:inline-block}
.trend-up{background:rgba(16,185,129,0.2);color:#10b981}
.trend-down{background:rgba(239,68,68,0.2);color:#ef4444}
/* Cards */
.card{background:rgba(30,41,59,0.9);border-radius:16px;padding:25px;margin-bottom:20px;border:1px solid rgba(255,255,255,0.1)}
.card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;padding-bottom:15px;border-bottom:1px solid rgba(255,255,255,0.1)}
.card-title{font-size:1.2rem;font-weight:600;display:flex;align-items:center;gap:10px}
.card-title i{color:#8b5cf6}
/* Grid */
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:20px}
.grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}
@media(max-width:1024px){.grid-2,.grid-3{grid-template-columns:1fr}}
/* Winning Campaigns */
.campaign{background:rgba(15,23,42,0.6);border-radius:12px;padding:20px;margin-bottom:15px;border-left:4px solid #10b981;display:flex;justify-content:space-between;align-items:center}
.campaign.warning{border-color:#f59e0b}
.campaign.danger{border-color:#ef4444}
.campaign-info h3{font-size:1.1rem;margin-bottom:5px}
.campaign-info p{font-size:0.85rem;opacity:0.7}
.campaign-stats{display:flex;gap:20px;text-align:center}
.campaign-stat .value{font-size:1.3rem;font-weight:bold;color:#5eead4}
.campaign-stat .label{font-size:0.7rem;opacity:0.6}
/* Scenario Cards */
.scenario{background:linear-gradient(135deg,rgba(15,23,42,0.8),rgba(30,41,59,0.8));border-radius:12px;padding:20px;text-align:center;border:2px solid transparent;transition:all 0.3s;cursor:pointer}
.scenario:hover{border-color:#8b5cf6;transform:scale(1.02)}
.scenario-icon{font-size:3rem;margin-bottom:15px}
.scenario-name{font-size:1.1rem;font-weight:600;margin-bottom:8px}
.scenario-desc{font-size:0.85rem;opacity:0.7}
.scenario-status{margin-top:15px;padding:5px 15px;border-radius:20px;font-size:0.8rem;display:inline-block}
.status-active{background:rgba(16,185,129,0.2);color:#10b981}
.status-paused{background:rgba(245,158,11,0.2);color:#f59e0b}
.status-draft{background:rgba(107,114,128,0.2);color:#9ca3af}
/* Data Collection */
.data-metric{display:flex;justify-content:space-between;align-items:center;padding:15px;background:rgba(15,23,42,0.5);border-radius:10px;margin-bottom:10px}
.data-metric .name{display:flex;align-items:center;gap:10px}
.data-metric .name i{color:#8b5cf6}
.data-metric .value{font-weight:bold;color:#5eead4}
.progress-bar{height:8px;background:rgba(255,255,255,0.1);border-radius:4px;margin-top:8px;overflow:hidden}
.progress-fill{height:100%;border-radius:4px;transition:width 0.5s}
.fill-green{background:linear-gradient(90deg,#10b981,#34d399)}
.fill-blue{background:linear-gradient(90deg,#3b82f6,#60a5fa)}
.fill-purple{background:linear-gradient(90deg,#8b5cf6,#a78bfa)}
/* Quick Actions */
.actions{display:flex;gap:10px;flex-wrap:wrap}
.action-btn{padding:12px 20px;border-radius:10px;border:none;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:8px;transition:all 0.3s}
.action-btn:hover{transform:translateY(-2px)}
.btn-primary{background:linear-gradient(135deg,#8b5cf6,#7c3aed);color:white}
.btn-success{background:linear-gradient(135deg,#10b981,#059669);color:white}
.btn-warning{background:linear-gradient(135deg,#f59e0b,#d97706);color:white}
.btn-info{background:linear-gradient(135deg,#0ea5e9,#0284c7);color:white}
/* Server List */
.server-item{display:flex;justify-content:space-between;align-items:center;padding:12px 15px;background:rgba(15,23,42,0.5);border-radius:8px;margin-bottom:8px}
.server-item .name{font-weight:500}
.server-item .ip{font-family:monospace;font-size:0.85rem;opacity:0.7}
.server-status{padding:4px 10px;border-radius:5px;font-size:0.75rem}
.server-status.running{background:rgba(16,185,129,0.2);color:#10b981}
.server-status.stopped{background:rgba(239,68,68,0.2);color:#ef4444}
/* Links */
.nav-links{display:flex;gap:15px;margin-bottom:20px;flex-wrap:wrap}
.nav-link{padding:10px 20px;background:rgba(255,255,255,0.05);border-radius:10px;color:#e2e8f0;text-decoration:none;display:flex;align-items:center;gap:8px;transition:all 0.3s}
.nav-link:hover{background:rgba(139,92,246,0.3)}
.nav-link.active{background:rgba(139,92,246,0.4);border:1px solid #8b5cf6}
</style>
</head>
<body>
<div class="header">
<h1><span style="font-size:2rem">📊</span> CEO Dashboard - WEVAL</h1>
<div class="header-time"><?= date('l d F Y - H:i') ?></div>
</div>
<div class="container">
<!-- Navigation -->
<div class="nav-links">
<a href="/ceo-dashboard.php" class="nav-link active"><i class="fas fa-chart-line"></i> Dashboard</a>
<a href="/hamid-router-dashboard.php" class="nav-link"><i class="fas fa-brain"></i> WEVAL MIND Router</a>
<a href="/office-management.php" class="nav-link"><i class="fas fa-envelope"></i> Office 365</a>
<a href="/mta-servers.html" class="nav-link"><i class="fas fa-server"></i> MTA Servers</a>
<a href="/domains.html" class="nav-link"><i class="fas fa-globe"></i> Domains</a>
</div>
<!-- KPI Cards -->
<div class="kpi-grid">
<div class="kpi-card">
<div class="kpi-icon">📧</div>
<div class="kpi-value" style="color:#8b5cf6"><?= number_format($stats['o365']) ?></div>
<div class="kpi-label">Comptes Office 365</div>
<div class="kpi-trend trend-up">↑ Actifs</div>
</div>
<div class="kpi-card">
<div class="kpi-icon">🖥️</div>
<div class="kpi-value" style="color:#10b981"><?= $stats['servers'] ?></div>
<div class="kpi-label">Serveurs MTA</div>
<div class="kpi-trend trend-up">↑ Running</div>
</div>
<div class="kpi-card">
<div class="kpi-icon">🌐</div>
<div class="kpi-value" style="color:#3b82f6"><?= number_format($stats['domains']) ?></div>
<div class="kpi-label">Domaines</div>
<div class="kpi-trend trend-up">↑ Configurés</div>
</div>
<div class="kpi-card">
<div class="kpi-icon">🧠</div>
<div class="kpi-value" style="color:#f59e0b">9</div>
<div class="kpi-label">Providers IA</div>
<div class="kpi-trend trend-up">↑ WEVAL MIND</div>
</div>
</div>
<div class="grid-2">
<!-- Winning Campaigns -->
<div class="card">
<div class="card-header">
<div class="card-title"><i class="fas fa-trophy"></i> Winning Campaigns</div>
<button class="action-btn btn-primary" style="padding:8px 15px;font-size:0.85rem"><i class="fas fa-plus"></i> New</button>
</div>
<div class="campaign">
<div class="campaign-info">
<h3>🏆 Campaign Alpha - Q1 2026</h3>
<p>Office 365 OAuth + PowerMTA</p>
</div>
<div class="campaign-stats">
<div class="campaign-stat"><div class="value">98.5%</div><div class="label">Inbox Rate</div></div>
<div class="campaign-stat"><div class="value">45.2%</div><div class="label">Open Rate</div></div>
<div class="campaign-stat"><div class="value">12.8%</div><div class="label">CTR</div></div>
</div>
</div>
<div class="campaign warning">
<div class="campaign-info">
<h3>⚡ Campaign Beta - Warm-up</h3>
<p>GSuite SMTP Relay</p>
</div>
<div class="campaign-stats">
<div class="campaign-stat"><div class="value">85.2%</div><div class="label">Inbox Rate</div></div>
<div class="campaign-stat"><div class="value">32.1%</div><div class="label">Open Rate</div></div>
<div class="campaign-stat"><div class="value">8.5%</div><div class="label">CTR</div></div>
</div>
</div>
<div class="campaign danger">
<div class="campaign-info">
<h3>🔄 Campaign Gamma - Testing</h3>
<p>Direct SMTP</p>
</div>
<div class="campaign-stats">
<div class="campaign-stat"><div class="value">62.3%</div><div class="label">Inbox Rate</div></div>
<div class="campaign-stat"><div class="value">18.7%</div><div class="label">Open Rate</div></div>
<div class="campaign-stat"><div class="value">3.2%</div><div class="label">CTR</div></div>
</div>
</div>
</div>
<!-- Data Collection -->
<div class="card">
<div class="card-header">
<div class="card-title"><i class="fas fa-database"></i> Data Collection</div>
<span style="color:#10b981;font-size:0.85rem"><i class="fas fa-circle"></i> Live</span>
</div>
<div class="data-metric">
<div class="name"><i class="fas fa-envelope-open"></i> Opens Tracked</div>
<div class="value">1,247,832</div>
</div>
<div class="progress-bar"><div class="progress-fill fill-green" style="width:78%"></div></div>
<div class="data-metric" style="margin-top:15px">
<div class="name"><i class="fas fa-mouse-pointer"></i> Clicks Tracked</div>
<div class="value">342,156</div>
</div>
<div class="progress-bar"><div class="progress-fill fill-blue" style="width:45%"></div></div>
<div class="data-metric" style="margin-top:15px">
<div class="name"><i class="fas fa-user-check"></i> Leads Captured</div>
<div class="value">28,493</div>
</div>
<div class="progress-bar"><div class="progress-fill fill-purple" style="width:32%"></div></div>
<div class="data-metric" style="margin-top:15px">
<div class="name"><i class="fas fa-ban"></i> Unsubscribes</div>
<div class="value">4,821</div>
</div>
<div class="progress-bar"><div class="progress-fill" style="width:8%;background:#ef4444"></div></div>
<div style="margin-top:20px;text-align:center">
<a href="http://151.80.235.110" target="_blank" class="action-btn btn-info">
<i class="fas fa-external-link-alt"></i> Tracking Server
</a>
</div>
</div>
</div>
<!-- Send Scenarios -->
<div class="card">
<div class="card-header">
<div class="card-title"><i class="fas fa-paper-plane"></i> Scénarios d'Envoi</div>
</div>
<div class="grid-3">
<div class="scenario">
<div class="scenario-icon">📧</div>
<div class="scenario-name">Office 365 OAuth</div>
<div class="scenario-desc">Envoi via Microsoft Graph API avec authentification OAuth2</div>
<div class="scenario-status status-active">✅ Actif</div>
</div>
<div class="scenario">
<div class="scenario-icon">⚡</div>
<div class="scenario-name">PowerMTA Direct</div>
<div class="scenario-desc">Envoi massif via serveurs PMTA dédiés</div>
<div class="scenario-status status-active">✅ Actif</div>
</div>
<div class="scenario">
<div class="scenario-icon">🔄</div>
<div class="scenario-name">GSuite Relay</div>
<div class="scenario-desc">Relay SMTP via Google Workspace</div>
<div class="scenario-status status-paused">⏸️ Pause</div>
</div>
<div class="scenario">
<div class="scenario-icon">🎯</div>
<div class="scenario-name">Engagement First</div>
<div class="scenario-desc">Envoi priorisé par score d'engagement</div>
<div class="scenario-status status-active">✅ Actif</div>
</div>
<div class="scenario">
<div class="scenario-icon">🌡️</div>
<div class="scenario-name">IP Warm-up</div>
<div class="scenario-desc">Chauffage progressif nouvelles IPs</div>
<div class="scenario-status status-active">✅ Actif</div>
</div>
<div class="scenario">
<div class="scenario-icon">🔀</div>
<div class="scenario-name">Multi-Path</div>
<div class="scenario-desc">Distribution intelligente multi-serveurs</div>
<div class="scenario-status status-draft">📝 Draft</div>
</div>
</div>
</div>
<!-- Quick Actions -->
<div class="card">
<div class="card-header">
<div class="card-title"><i class="fas fa-bolt"></i> Actions Rapides</div>
</div>
<div class="actions">
<a href="/office-management.php" class="action-btn btn-primary"><i class="fas fa-plus"></i> Ajouter O365</a>
<a href="/mta-servers.html" class="action-btn btn-success"><i class="fas fa-server"></i> Installer MTA</a>
<a href="/domains.html" class="action-btn btn-warning"><i class="fas fa-globe"></i> Ajouter Domaine</a>
<a href="/hamid-fullscreen.php" class="action-btn btn-info"><i class="fas fa-robot"></i> WEVAL MIND</a>
</div>
</div>
<!-- Recent Servers -->
<?php if (!empty($activities)): ?>
<div class="card">
<div class="card-header">
<div class="card-title"><i class="fas fa-server"></i> Serveurs Récents</div>
</div>
<?php foreach ($activities as $srv): ?>
<div class="server-item">
<div>
<div class="name"><?= htmlspecialchars($srv['name'] ?? 'Server') ?></div>
<div class="ip"><?= htmlspecialchars($srv['main_ip'] ?? $srv['ip'] ?? '-') ?></div>
</div>
<span class="server-status <?= ($srv['status'] ?? '') == 'Running' ? 'running' : 'stopped' ?>">
<?= htmlspecialchars($srv['status'] ?? 'Unknown') ?>
</span>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
<script>
// Auto-refresh every 60 seconds
setTimeout(() => location.reload(), 60000);
</script>
</body>
</html>