171 lines
6.1 KiB
PHP
171 lines
6.1 KiB
PHP
<?php
|
|
session_start();
|
|
require_once __DIR__ . '/db/config.php';
|
|
|
|
// Fetch dashboard data
|
|
try {
|
|
$pdo = db();
|
|
|
|
// Total leads
|
|
$total_leads = $pdo->query('SELECT COUNT(*) FROM leads')->fetchColumn();
|
|
|
|
// Leads per status
|
|
$leads_per_status_stmt = $pdo->query('SELECT Status, COUNT(*) as count FROM leads GROUP BY Status');
|
|
$leads_per_status = $leads_per_status_stmt->fetchAll(PDO::FETCH_KEY_PAIR);
|
|
|
|
// Total activities
|
|
$total_activities = $pdo->query('SELECT COUNT(*) FROM activities')->fetchColumn();
|
|
|
|
// Activities per type
|
|
$activities_per_type_stmt = $pdo->query('SELECT ActivityType, COUNT(*) as count FROM activities GROUP BY ActivityType');
|
|
$activities_per_type = $activities_per_type_stmt->fetchAll(PDO::FETCH_KEY_PAIR);
|
|
|
|
} catch (PDOException $e) {
|
|
$db_error = "Error fetching dashboard data: " . $e->getMessage();
|
|
}
|
|
|
|
$projectName = $_SERVER['PROJECT_NAME'] ?? 'CRM';
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Dashboard - <?= htmlspecialchars($projectName) ?></title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
<style>
|
|
body {
|
|
background-color: #ecf0f1;
|
|
font-family: 'Lato', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
|
}
|
|
.navbar {
|
|
background-color: #2c3e50;
|
|
}
|
|
.navbar-brand {
|
|
font-weight: bold;
|
|
color: #fff;
|
|
}
|
|
.card {
|
|
border: none;
|
|
border-radius: 0.5rem;
|
|
box-shadow: 0 0.5rem 1rem rgba(0,0,0,0.1);
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<nav class="navbar navbar-expand-lg navbar-dark mb-4">
|
|
<div class="container">
|
|
<a class="navbar-brand" href="index.php"><i class="fas fa-chart-line me-2"></i><?= htmlspecialchars($projectName) ?></a>
|
|
<div class="collapse navbar-collapse">
|
|
<ul class="navbar-nav ms-auto">
|
|
<li class="nav-item">
|
|
<a class="nav-link" href="index.php">Leads</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link active" href="dashboard.php">Dashboard</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<main class="container">
|
|
<?php if (isset($db_error)): ?>
|
|
<div class="alert alert-danger"><?= htmlspecialchars($db_error) ?></div>
|
|
<?php else: ?>
|
|
<div class="row g-4">
|
|
<div class="col-md-3">
|
|
<div class="card text-center text-white bg-primary">
|
|
<div class="card-body">
|
|
<h5 class="card-title"><i class="fas fa-users me-2"></i>Total Leads</h5>
|
|
<p class="card-text fs-1"><?= $total_leads ?></p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card text-center text-white bg-info">
|
|
<div class="card-body">
|
|
<h5 class="card-title"><i class="fas fa-tasks me-2"></i>Total Activities</h5>
|
|
<p class="card-text fs-1"><?= $total_activities ?></p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row g-4 mt-4">
|
|
<div class="col-md-6">
|
|
<div class="card">
|
|
<div class="card-header">Leads by Status</div>
|
|
<div class="card-body">
|
|
<canvas id="leadsByStatusChart"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="card">
|
|
<div class="card-header">Activities by Type</div>
|
|
<div class="card-body">
|
|
<canvas id="activitiesByTypeChart"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
</main>
|
|
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
// Leads by Status Chart
|
|
const leadsCtx = document.getElementById('leadsByStatusChart').getContext('2d');
|
|
new Chart(leadsCtx, {
|
|
type: 'doughnut',
|
|
data: {
|
|
labels: <?= json_encode(array_keys($leads_per_status)) ?>,
|
|
datasets: [{
|
|
data: <?= json_encode(array_values($leads_per_status)) ?>,
|
|
backgroundColor: ['#3498db', '#f39c12', '#2ecc71', '#9b59b6', '#1abc9c', '#e74c3c']
|
|
}]
|
|
},
|
|
options: {
|
|
responsive: true,
|
|
plugins: {
|
|
legend: {
|
|
position: 'top',
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
// Activities by Type Chart
|
|
const activitiesCtx = document.getElementById('activitiesByTypeChart').getContext('2d');
|
|
new Chart(activitiesCtx, {
|
|
type: 'bar',
|
|
data: {
|
|
labels: <?= json_encode(array_keys($activities_per_type)) ?>,
|
|
datasets: [{
|
|
label: 'Number of Activities',
|
|
data: <?= json_encode(array_values($activities_per_type)) ?>,
|
|
backgroundColor: '#3498db'
|
|
}]
|
|
},
|
|
options: {
|
|
responsive: true,
|
|
scales: {
|
|
y: {
|
|
beginAtZero: true
|
|
}
|
|
},
|
|
plugins: {
|
|
legend: {
|
|
display: false
|
|
}
|
|
}
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
|
|
</body>
|
|
</html>
|