353 lines
17 KiB
PHP
Executable File
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>
|