Sindbad~EG File Manager
<?php
require_once '../includes/functions.php';
// Check if user is logged in and has admin privileges
if (!isLoggedIn()) {
header('Location: ' . BASE_URL . 'login.php');
exit();
}
$user = getCurrentUser();
if (!in_array($user['role'], ['superuser', 'area_admin', 'district_admin', 'assembly_admin'])) {
header('Location: ' . BASE_URL . 'dashboard.php');
exit();
}
$db = new CopMadinaDB();
$conn = $db->getConnection();
// Get filter parameters
$filter_type = $_GET['filter_type'] ?? 'events';
$date_from = $_GET['date_from'] ?? date('Y-m-01');
$date_to = $_GET['date_to'] ?? date('Y-m-t');
$area_id = $_GET['area_id'] ?? '';
$district_id = $_GET['district_id'] ?? '';
$assembly_id = $_GET['assembly_id'] ?? '';
$status = $_GET['status'] ?? '';
$member_type = $_GET['member_type'] ?? '';
// Build where clause based on user role
$role_where = "";
$role_params = [];
if ($user['role'] === 'area_admin') {
$role_where = " AND e.area_id = ?";
$role_params[] = $user['area_id'];
} elseif ($user['role'] === 'district_admin') {
$role_where = " AND e.district_id = ?";
$role_params[] = $user['district_id'];
} elseif ($user['role'] === 'assembly_admin') {
$role_where = " AND e.assembly_id = ?";
$role_params[] = $user['assembly_id'];
}
// Get dropdown data
$stmt = executeQuery("SELECT id, name FROM areas WHERE status = 'active' ORDER BY name");
$areas = $stmt ? $stmt->fetchAll() : [];
$stmt = executeQuery("SELECT id, name, area_id FROM districts WHERE status = 'active' ORDER BY name");
$districts = $stmt ? $stmt->fetchAll() : [];
$stmt = executeQuery("SELECT id, name, district_id FROM assemblies WHERE status = 'active' ORDER BY name");
$assemblies = $stmt ? $stmt->fetchAll() : [];
// Initialize data arrays
$chart_data = [];
$table_data = [];
$summary_stats = [];
// Process data based on filter type
switch ($filter_type) {
case 'events':
// Events analytics
$where_conditions = ["1=1"];
$params = [];
if ($date_from) {
$where_conditions[] = "e.start_date >= ?";
$params[] = $date_from;
}
if ($date_to) {
$where_conditions[] = "e.end_date <= ?";
$params[] = $date_to;
}
if ($area_id) {
$where_conditions[] = "e.area_id = ?";
$params[] = $area_id;
}
if ($district_id) {
$where_conditions[] = "e.district_id = ?";
$params[] = $district_id;
}
if ($assembly_id) {
$where_conditions[] = "e.assembly_id = ?";
$params[] = $assembly_id;
}
if ($status) {
$where_conditions[] = "e.status = ?";
$params[] = $status;
}
$where_clause = implode(' AND ', $where_conditions) . $role_where;
$all_params = array_merge($params, $role_params);
try {
$query = "SELECT
COALESCE(d.name, 'Area Level') as district_name,
COUNT(e.id) as count,
COALESCE(d.id, 0) as district_id
FROM events e
LEFT JOIN districts d ON e.district_id = d.id
WHERE " . implode(' AND ', $where_conditions) . "
GROUP BY COALESCE(d.id, 0), COALESCE(d.name, 'Area Level')
ORDER BY count DESC";
$stmt = executeQuery($query, $params);
$results = $stmt ? $stmt->fetchAll() : [];
foreach ($results as $row) {
$chart_data[] = [
'label' => $row['district_name'],
'value' => (int)$row['count']
];
$table_data[] = [
'District' => $row['district_name'],
'Events' => $row['count']
];
}
$summary_stats = [
'total_events' => array_sum(array_column($chart_data, 'value')),
'districts_with_events' => count($chart_data)
];
} catch (Exception $e) {
error_log("Events query error: " . $e->getMessage());
}
// Detailed events table
$events_detail_query = "
SELECT
e.title,
e.start_date,
e.end_date,
e.status,
e.max_capacity,
COALESCE(a.name, 'Unknown Area') as area_name,
COALESCE(d.name, 'Unknown District') as district_name,
COALESCE(ass.name, 'Unknown Assembly') as assembly_name,
COALESCE((
SELECT COUNT(*)
FROM event_registrations er
WHERE er.event_id = e.id
), 0) + COALESCE((
SELECT COUNT(*)
FROM nonmember_registrations nr
WHERE nr.event_id = e.id
), 0) as registration_count,
COALESCE((
SELECT SUM(CASE WHEN er.payment_status = 'paid' THEN er.amount_paid ELSE 0 END)
FROM event_registrations er
WHERE er.event_id = e.id
), 0) + COALESCE((
SELECT SUM(CASE WHEN nr.payment_status = 'paid' THEN nr.amount_paid ELSE 0 END)
FROM nonmember_registrations nr
WHERE nr.event_id = e.id
), 0) as revenue
FROM events e
LEFT JOIN areas a ON e.area_id = a.id
LEFT JOIN districts d ON e.district_id = d.id
LEFT JOIN assemblies ass ON e.assembly_id = ass.id
WHERE $where_clause
ORDER BY e.start_date DESC
LIMIT 50
";
$stmt = executeQuery($events_detail_query, $all_params);
$table_data = $stmt ? $stmt->fetchAll() : [];
break;
case 'members':
// Members analytics
$where_conditions = ["u.role = 'member'"];
$params = [];
if ($date_from) {
$where_conditions[] = "u.created_at >= ?";
$params[] = $date_from;
}
if ($date_to) {
$where_conditions[] = "u.created_at <= ?";
$params[] = $date_to;
}
if ($area_id) {
$where_conditions[] = "u.area_id = ?";
$params[] = $area_id;
}
if ($district_id) {
$where_conditions[] = "u.district_id = ?";
$params[] = $district_id;
}
if ($assembly_id) {
$where_conditions[] = "u.assembly_id = ?";
$params[] = $assembly_id;
}
if ($status) {
$where_conditions[] = "u.status = ?";
$params[] = $status;
}
$where_clause = implode(' AND ', $where_conditions);
// Members by district
$members_query = "
SELECT
d.name as district_name,
COUNT(u.id) as member_count,
COUNT(CASE WHEN u.status = 'active' THEN 1 END) as active_members
FROM users u
LEFT JOIN areas a ON u.area_id = a.id
LEFT JOIN districts d ON u.district_id = d.id
WHERE $where_clause
GROUP BY u.district_id, d.name
ORDER BY member_count DESC
";
$stmt = executeQuery($members_query, $params);
$chart_data = $stmt ? $stmt->fetchAll() : [];
// Detailed members table
$members_detail_query = "
SELECT
u.first_name,
u.last_name,
u.email,
u.phone,
u.status,
u.created_at,
a.name as area_name,
d.name as district_name,
ass.name as assembly_name
FROM users u
LEFT JOIN areas a ON u.area_id = a.id
LEFT JOIN districts d ON u.district_id = d.id
LEFT JOIN assemblies ass ON u.assembly_id = ass.id
WHERE $where_clause
ORDER BY u.created_at DESC
LIMIT 100
";
$stmt = executeQuery($members_detail_query, $params);
$table_data = $stmt ? $stmt->fetchAll() : [];
break;
case 'non_members':
// Non-members analytics using nonmember_registrations table
$where_conditions = ["1=1"];
$params = [];
if ($date_from) {
$where_conditions[] = "nr.created_at >= ?";
$params[] = $date_from;
}
if ($date_to) {
$where_conditions[] = "nr.created_at <= ?";
$params[] = $date_to;
}
if ($area_id) {
$where_conditions[] = "e.area_id = ?";
$params[] = $area_id;
}
if ($district_id) {
$where_conditions[] = "e.district_id = ?";
$params[] = $district_id;
}
if ($assembly_id) {
$where_conditions[] = "e.assembly_id = ?";
$params[] = $assembly_id;
}
if ($status) {
$where_conditions[] = "nr.status = ?";
$params[] = $status;
}
$where_clause = implode(' AND ', $where_conditions) . $role_where;
$all_params = array_merge($params, $role_params);
// Non-members by district
$non_members_query = "
SELECT
d.name as district_name,
COUNT(nr.id) as non_member_count,
SUM(nr.amount_paid) as total_revenue,
AVG(nr.amount_paid) as avg_amount
FROM nonmember_registrations nr
LEFT JOIN events e ON nr.event_id = e.id
LEFT JOIN areas a ON e.area_id = a.id
LEFT JOIN districts d ON e.district_id = d.id
WHERE $where_clause
GROUP BY d.id, d.name
ORDER BY non_member_count DESC
LIMIT 20
";
$stmt = executeQuery($non_members_query, $all_params);
$chart_data = $stmt ? $stmt->fetchAll() : [];
// Detailed non-members table
$non_members_detail_query = "
SELECT
nr.registration_code,
nr.first_name,
nr.last_name,
nr.email,
nr.phone,
e.title as event_title,
nr.status,
nr.payment_status,
nr.amount_paid,
nr.created_at,
a.name as area_name,
d.name as district_name
FROM nonmember_registrations nr
LEFT JOIN events e ON nr.event_id = e.id
LEFT JOIN areas a ON e.area_id = a.id
LEFT JOIN districts d ON e.district_id = d.id
WHERE $where_clause
ORDER BY nr.created_at DESC
LIMIT 100
";
$stmt = executeQuery($non_members_detail_query, $all_params);
$table_data = $stmt ? $stmt->fetchAll() : [];
break;
case 'registrations':
// Simplified registrations analytics
$where_conditions = ["1=1"];
$params = [];
if ($date_from) {
$where_conditions[] = "r.registration_date >= ?";
$params[] = $date_from;
}
if ($date_to) {
$where_conditions[] = "r.registration_date <= ?";
$params[] = $date_to;
}
if ($district_id) {
$where_conditions[] = "e.district_id = ?";
$params[] = $district_id;
}
if ($assembly_id) {
$where_conditions[] = "e.assembly_id = ?";
$params[] = $assembly_id;
}
if ($status) {
$where_conditions[] = "r.status = ?";
$params[] = $status;
}
try {
// Get member registrations
$member_query = "SELECT
COALESCE(d.name, 'Area Level') as district_name,
COUNT(r.id) as count
FROM event_registrations r
JOIN events e ON r.event_id = e.id
LEFT JOIN districts d ON e.district_id = d.id
WHERE " . implode(' AND ', $where_conditions) . "
GROUP BY COALESCE(d.id, 0), COALESCE(d.name, 'Area Level')";
$stmt = executeQuery($member_query, $params);
$member_results = $stmt ? $stmt->fetchAll() : [];
// Get non-member registrations
$nonmember_query = "SELECT
COALESCE(d.name, 'Area Level') as district_name,
COUNT(nr.id) as count
FROM nonmember_registrations nr
JOIN events e ON nr.event_id = e.id
LEFT JOIN districts d ON e.district_id = d.id
WHERE " . implode(' AND ', $where_conditions) . "
GROUP BY COALESCE(d.id, 0), COALESCE(d.name, 'Area Level')";
$stmt = executeQuery($nonmember_query, $params);
$nonmember_results = $stmt ? $stmt->fetchAll() : [];
// Combine results
$combined_data = [];
foreach ($member_results as $row) {
$district = $row['district_name'];
$combined_data[$district] = ($combined_data[$district] ?? 0) + $row['count'];
}
foreach ($nonmember_results as $row) {
$district = $row['district_name'];
$combined_data[$district] = ($combined_data[$district] ?? 0) + $row['count'];
}
foreach ($combined_data as $district => $count) {
$chart_data[] = [
'label' => $district,
'value' => (int)$count
];
$table_data[] = [
'District' => $district,
'Registrations' => $count
];
}
$summary_stats = [
'total_registrations' => array_sum(array_column($chart_data, 'value')),
'districts_with_registrations' => count($chart_data)
];
} catch (Exception $e) {
error_log("Registrations query error: " . $e->getMessage());
}
break;
}
// Calculate summary statistics
if ($filter_type === 'events') {
$summary_stats = [
'total_events' => array_sum(array_column($chart_data, 'count')),
'avg_capacity' => round(array_sum(array_column($chart_data, 'avg_capacity')) / max(count($chart_data), 1), 2),
'total_registrations' => array_sum(array_column($chart_data, 'total_registrations'))
];
} elseif ($filter_type === 'members') {
$summary_stats = [
'total_members' => array_sum(array_column($chart_data, 'member_count')),
'active_members' => array_sum(array_column($chart_data, 'active_members')),
'areas_covered' => count(array_unique(array_column($chart_data, 'area_name')))
];
} elseif ($filter_type === 'non_members') {
$summary_stats = [
'total_non_members' => array_sum(array_column($chart_data, 'non_member_count')),
'total_revenue' => array_sum(array_column($chart_data, 'total_revenue')),
'avg_amount' => round(array_sum(array_column($chart_data, 'avg_amount')) / max(count($chart_data), 1), 2)
];
} elseif ($filter_type === 'registrations') {
$summary_stats = [
'total_registrations' => array_sum(array_column($chart_data, 'count')),
'total_revenue' => array_sum(array_column($chart_data, 'total_amount')),
'avg_amount' => round(array_sum(array_column($chart_data, 'avg_amount')) / max(count($chart_data), 1), 2)
];
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Advanced Reports - COP Madina Conference</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.5.31/jspdf.plugin.autotable.min.js"></script>
</head>
<body class="bg-gradient-to-br from-slate-50 to-blue-50 min-h-screen">
<div class="flex h-screen">
<!-- Sidebar -->
<?php include 'includes/admin_sidebar.php'; ?>
<!-- Main Content -->
<div class="flex-1 flex flex-col overflow-hidden ml-72">
<!-- Header -->
<?php include 'includes/admin_header.php'; ?>
<!-- Content -->
<main class="flex-1 overflow-y-auto p-8">
<!-- Filters Section -->
<div class="bg-white/80 backdrop-blur-sm rounded-2xl shadow-xl border border-slate-200/50 p-6 mb-8">
<h2 class="text-xl font-bold text-slate-800 mb-4 flex items-center">
<i class="fas fa-filter text-blue-600 mr-2"></i>
Advanced Filters
</h2>
<form method="GET" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
<!-- Filter Type -->
<div>
<label class="block text-sm font-medium text-slate-700 mb-2">Report Type</label>
<select name="filter_type" class="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
<option value="events" <?php echo $filter_type === 'events' ? 'selected' : ''; ?>>Events</option>
<option value="members" <?php echo $filter_type === 'members' ? 'selected' : ''; ?>>Members</option>
<option value="non_members" <?php echo $filter_type === 'non_members' ? 'selected' : ''; ?>>Non-Members</option>
<option value="registrations" <?php echo $filter_type === 'registrations' ? 'selected' : ''; ?>>Registrations</option>
</select>
</div>
<!-- Date From -->
<div>
<label class="block text-sm font-medium text-slate-700 mb-2">Date From</label>
<input type="date" name="date_from" value="<?php echo htmlspecialchars($date_from); ?>"
class="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
</div>
<!-- Date To -->
<div>
<label class="block text-sm font-medium text-slate-700 mb-2">Date To</label>
<input type="date" name="date_to" value="<?php echo htmlspecialchars($date_to); ?>"
class="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
</div>
<!-- Area -->
<?php if ($user['role'] === 'superuser'): ?>
<div>
<label class="block text-sm font-medium text-slate-700 mb-2">Area</label>
<select name="area_id" class="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
<option value="">All Areas</option>
<?php foreach ($areas as $area): ?>
<option value="<?php echo $area['id']; ?>" <?php echo $area_id == $area['id'] ? 'selected' : ''; ?>>
<?php echo htmlspecialchars($area['name']); ?>
</option>
<?php endforeach; ?>
</select>
</div>
<?php endif; ?>
<!-- District -->
<?php if (in_array($user['role'], ['superuser', 'area_admin'])): ?>
<div>
<label class="block text-sm font-medium text-slate-700 mb-2">District</label>
<select name="district_id" class="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
<option value="">All Districts</option>
<?php foreach ($districts as $district): ?>
<option value="<?php echo $district['id']; ?>" <?php echo $district_id == $district['id'] ? 'selected' : ''; ?>>
<?php echo htmlspecialchars($district['name']); ?>
</option>
<?php endforeach; ?>
</select>
</div>
<?php endif; ?>
<!-- Assembly -->
<?php if (in_array($user['role'], ['superuser', 'area_admin', 'district_admin'])): ?>
<div>
<label class="block text-sm font-medium text-slate-700 mb-2">Assembly</label>
<select name="assembly_id" class="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
<option value="">All Assemblies</option>
<?php foreach ($assemblies as $assembly): ?>
<option value="<?php echo $assembly['id']; ?>" <?php echo $assembly_id == $assembly['id'] ? 'selected' : ''; ?>>
<?php echo htmlspecialchars($assembly['name']); ?>
</option>
<?php endforeach; ?>
</select>
</div>
<?php endif; ?>
<!-- Status -->
<div>
<label class="block text-sm font-medium text-slate-700 mb-2">Status</label>
<select name="status" class="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
<option value="">All Status</option>
<?php if ($filter_type === 'events'): ?>
<option value="draft" <?php echo $status === 'draft' ? 'selected' : ''; ?>>Draft</option>
<option value="published" <?php echo $status === 'published' ? 'selected' : ''; ?>>Published</option>
<option value="active" <?php echo $status === 'active' ? 'selected' : ''; ?>>Active</option>
<option value="completed" <?php echo $status === 'completed' ? 'selected' : ''; ?>>Completed</option>
<option value="cancelled" <?php echo $status === 'cancelled' ? 'selected' : ''; ?>>Cancelled</option>
<?php else: ?>
<option value="active" <?php echo $status === 'active' ? 'selected' : ''; ?>>Active</option>
<option value="inactive" <?php echo $status === 'inactive' ? 'selected' : ''; ?>>Inactive</option>
<?php endif; ?>
</select>
</div>
<!-- Member Type (for registrations) -->
<?php if ($filter_type === 'registrations'): ?>
<div>
<label class="block text-sm font-medium text-slate-700 mb-2">Member Type</label>
<select name="member_type" class="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
<option value="">All Types</option>
<option value="member" <?php echo $member_type === 'member' ? 'selected' : ''; ?>>Members</option>
<option value="non_member" <?php echo $member_type === 'non_member' ? 'selected' : ''; ?>>Non-Members</option>
</select>
</div>
<?php endif; ?>
<!-- Submit Button -->
<div class="flex items-end">
<button type="submit" class="w-full px-4 py-2 bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 text-white font-medium rounded-lg transition-all duration-200 flex items-center justify-center space-x-2">
<i class="fas fa-search"></i>
<span>Apply Filters</span>
</button>
</div>
</form>
</div>
<!-- Summary Statistics -->
<?php if (!empty($summary_stats)): ?>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8">
<?php foreach ($summary_stats as $key => $value): ?>
<div class="bg-white/80 backdrop-blur-sm rounded-2xl shadow-xl border border-slate-200/50 p-6">
<div class="flex items-center justify-between">
<div>
<p class="text-sm font-medium text-slate-600"><?php echo ucwords(str_replace('_', ' ', $key)); ?></p>
<p class="text-2xl font-bold text-slate-800">
<?php echo is_numeric($value) ? number_format($value, 2) : $value; ?>
</p>
</div>
<div class="p-3 rounded-full bg-gradient-to-br from-blue-500 to-purple-600">
<i class="fas fa-chart-bar text-white"></i>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<!-- Charts Section -->
<?php if (!empty($chart_data)): ?>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8 mb-8">
<!-- Pie Chart -->
<div class="bg-white/80 backdrop-blur-sm rounded-2xl shadow-xl border border-slate-200/50 p-6">
<h3 class="text-lg font-bold text-slate-800 mb-4">Distribution Chart</h3>
<canvas id="pieChart" width="400" height="300"></canvas>
</div>
<!-- Bar Chart -->
<div class="bg-white/80 backdrop-blur-sm rounded-2xl shadow-xl border border-slate-200/50 p-6">
<h3 class="text-lg font-bold text-slate-800 mb-4">Comparison Chart</h3>
<canvas id="barChart" width="400" height="300"></canvas>
</div>
</div>
<?php endif; ?>
<!-- Data Table -->
<?php if (!empty($table_data)): ?>
<div class="bg-white/80 backdrop-blur-sm rounded-2xl shadow-xl border border-slate-200/50 p-6">
<div class="flex items-center justify-between mb-4">
<h3 class="text-lg font-bold text-slate-800">Detailed Data</h3>
<div class="flex space-x-2">
<button onclick="exportToCSV()" class="px-4 py-2 bg-green-600 hover:bg-green-700 text-white font-medium rounded-lg transition-colors flex items-center space-x-2">
<i class="fas fa-file-csv"></i>
<span>Export CSV</span>
</button>
<button onclick="exportToPDF()" class="px-4 py-2 bg-red-600 hover:bg-red-700 text-white font-medium rounded-lg transition-colors flex items-center space-x-2">
<i class="fas fa-file-pdf"></i>
<span>Export PDF</span>
</button>
</div>
</div>
<div class="overflow-x-auto">
<table class="w-full table-auto" id="dataTable">
<thead>
<tr class="border-b border-slate-200">
<?php if (!empty($table_data)): ?>
<?php foreach (array_keys($table_data[0]) as $header): ?>
<th class="text-left py-3 px-4 font-medium text-slate-700">
<?php echo ucwords(str_replace('_', ' ', $header)); ?>
</th>
<?php endforeach; ?>
<?php endif; ?>
</tr>
</thead>
<tbody>
<?php foreach ($table_data as $row): ?>
<tr class="border-b border-slate-100 hover:bg-slate-50">
<?php foreach ($row as $cell): ?>
<td class="py-3 px-4 text-slate-600">
<?php echo htmlspecialchars($cell ?? ''); ?>
</td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
<?php endif; ?>
</main>
</div>
</div>
<script>
// Chart data from PHP
const chartData = <?php echo json_encode($chart_data); ?>;
const filterType = '<?php echo $filter_type; ?>';
// Initialize charts if data exists
if (chartData && chartData.length > 0) {
// Pie Chart
const pieCtx = document.getElementById('pieChart');
if (pieCtx) {
let pieLabels, pieData;
if (filterType === 'events') {
pieLabels = chartData.map(item => item.label || item.district_name || 'Unknown');
pieData = chartData.map(item => item.value || item.count || 0);
} else if (filterType === 'members') {
pieLabels = chartData.map(item => item.label || item.district_name || 'Unknown');
pieData = chartData.map(item => item.value || item.member_count || 0);
} else if (filterType === 'non_members') {
pieLabels = chartData.map(item => item.label || item.district_name || 'Unknown');
pieData = chartData.map(item => item.value || item.non_member_count || 0);
} else if (filterType === 'registrations') {
pieLabels = chartData.map(item => item.label || item.district_name || 'Unknown');
pieData = chartData.map(item => item.value || item.count || 0);
}
new Chart(pieCtx, {
type: 'pie',
data: {
labels: pieLabels,
datasets: [{
data: pieData,
backgroundColor: [
'#3B82F6', '#8B5CF6', '#10B981', '#F59E0B',
'#EF4444', '#6B7280', '#EC4899', '#14B8A6'
]
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
position: 'bottom'
}
}
}
});
}
// Bar Chart
const barCtx = document.getElementById('barChart');
if (barCtx) {
let barLabels, barData;
if (filterType === 'events') {
barLabels = chartData.map(item => item.label || item.district_name || 'Unknown');
barData = chartData.map(item => item.value || item.count || item.total_registrations || 0);
} else if (filterType === 'members') {
barLabels = chartData.map(item => item.label || item.district_name || 'Unknown');
barData = chartData.map(item => item.value || item.active_members || 0);
} else if (filterType === 'non_members') {
barLabels = chartData.map(item => item.label || item.district_name || 'Unknown');
barData = chartData.map(item => item.value || item.total_revenue || 0);
} else if (filterType === 'registrations') {
barLabels = chartData.map(item => item.label || item.district_name || 'Unknown');
barData = chartData.map(item => item.value || item.count || item.total_amount || 0);
}
new Chart(barCtx, {
type: 'bar',
data: {
labels: barLabels,
datasets: [{
label: filterType === 'registrations' ? 'Revenue' : 'Count',
data: barData,
backgroundColor: 'rgba(59, 130, 246, 0.8)',
borderColor: 'rgba(59, 130, 246, 1)',
borderWidth: 1
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
y: {
beginAtZero: true
}
}
}
});
}
}
// Export to CSV function
function exportToCSV() {
const table = document.getElementById('dataTable');
if (!table) return;
let csv = [];
const rows = table.querySelectorAll('tr');
for (let i = 0; i < rows.length; i++) {
const row = [], cols = rows[i].querySelectorAll('td, th');
for (let j = 0; j < cols.length; j++) {
row.push(cols[j].innerText);
}
csv.push(row.join(','));
}
const csvFile = new Blob([csv.join('\n')], { type: 'text/csv' });
const downloadLink = document.createElement('a');
downloadLink.download = `advanced_report_${filterType}_${new Date().toISOString().split('T')[0]}.csv`;
downloadLink.href = window.URL.createObjectURL(csvFile);
downloadLink.style.display = 'none';
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
// Export to PDF function
function exportToPDF() {
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
// Add title
doc.setFontSize(20);
doc.text('Advanced Reports - COP Madina Conference', 20, 20);
// Add report type and date
doc.setFontSize(12);
doc.text(`Report Type: ${filterType.charAt(0).toUpperCase() + filterType.slice(1)}`, 20, 35);
doc.text(`Generated: ${new Date().toLocaleDateString()}`, 20, 45);
// Add summary statistics if available
const summaryStats = <?php echo json_encode($summary_stats ?? []); ?>;
if (summaryStats && Object.keys(summaryStats).length > 0) {
doc.setFontSize(14);
doc.text('Summary Statistics:', 20, 65);
let yPos = 75;
Object.entries(summaryStats).forEach(([key, value]) => {
doc.setFontSize(10);
const label = key.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase());
const displayValue = typeof value === 'number' ? value.toLocaleString() : value;
doc.text(`${label}: ${displayValue}`, 20, yPos);
yPos += 10;
});
yPos += 10;
} else {
var yPos = 65;
}
// Add table data
const table = document.getElementById('dataTable');
if (table) {
const headers = [];
const data = [];
// Get headers
const headerCells = table.querySelectorAll('thead th');
headerCells.forEach(cell => {
headers.push(cell.innerText);
});
// Get data rows
const dataRows = table.querySelectorAll('tbody tr');
dataRows.forEach(row => {
const rowData = [];
const cells = row.querySelectorAll('td');
cells.forEach(cell => {
rowData.push(cell.innerText);
});
data.push(rowData);
});
// Add table to PDF
doc.autoTable({
head: [headers],
body: data,
startY: yPos,
styles: {
fontSize: 8,
cellPadding: 2
},
headStyles: {
fillColor: [59, 130, 246],
textColor: 255,
fontStyle: 'bold'
},
alternateRowStyles: {
fillColor: [248, 250, 252]
},
margin: { left: 20, right: 20 }
});
}
// Add footer
const pageCount = doc.internal.getNumberOfPages();
for (let i = 1; i <= pageCount; i++) {
doc.setPage(i);
doc.setFontSize(8);
doc.text(`Page ${i} of ${pageCount}`, doc.internal.pageSize.width - 40, doc.internal.pageSize.height - 10);
doc.text('COP Madina Conference Management System', 20, doc.internal.pageSize.height - 10);
}
// Save the PDF
doc.save(`advanced_report_${filterType}_${new Date().toISOString().split('T')[0]}.pdf`);
}
</script>
</body>
</html>
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists