Sindbad~EG File Manager
<?php
require_once '../config/config.php';
// Check if user is logged in and is superuser
if (!isLoggedIn() || !hasRole('superuser')) {
die('Access denied. Superuser required.');
}
$db = new Database();
$conn = $db->getConnection();
echo "<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='UTF-8'>
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
<title>Location System Test</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'>
<style>
.gradient-bg { background: linear-gradient(135deg, #3B82F6 0%, #F59E0B 50%, #6B7280 100%); }
</style>
</head>
<body class='bg-gray-50'>
<div class='max-w-6xl mx-auto p-6'>
<div class='gradient-bg text-white p-6 rounded-lg mb-6'>
<h1 class='text-3xl font-bold'><i class='fas fa-map-marker-alt mr-3'></i>Location System Test</h1>
<p class='mt-2'>Comprehensive testing of districts, assemblies, and attendance integration</p>
</div>";
try {
// Test 1: Check database structure
echo "<div class='bg-white rounded-lg shadow p-6 mb-6'>
<h2 class='text-xl font-bold text-gray-900 mb-4'><i class='fas fa-database mr-2 text-blue-600'></i>Database Structure Test</h2>";
// Check if new columns exist
$columns_query = "DESCRIBE attendance_records";
$stmt = $conn->prepare($columns_query);
$stmt->execute();
$columns = $stmt->fetchAll();
$has_district_id = false;
$has_assembly_id = false;
echo "<div class='grid grid-cols-1 md:grid-cols-2 gap-4 mb-4'>";
echo "<div><h3 class='font-semibold mb-2'>Attendance Records Columns:</h3><ul class='text-sm'>";
foreach ($columns as $column) {
$icon = $column['Field'] === 'district_id' ? 'fas fa-check text-green-600' :
($column['Field'] === 'assembly_id' ? 'fas fa-check text-green-600' : 'fas fa-circle text-gray-400');
echo "<li><i class='$icon mr-2'></i>{$column['Field']} ({$column['Type']})</li>";
if ($column['Field'] === 'district_id') $has_district_id = true;
if ($column['Field'] === 'assembly_id') $has_assembly_id = true;
}
echo "</ul></div>";
// Check foreign keys
$fk_query = "SELECT
CONSTRAINT_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'attendance_records'
AND REFERENCED_TABLE_NAME IS NOT NULL";
$stmt = $conn->prepare($fk_query);
$stmt->execute();
$foreign_keys = $stmt->fetchAll();
echo "<div><h3 class='font-semibold mb-2'>Foreign Key Constraints:</h3><ul class='text-sm'>";
foreach ($foreign_keys as $fk) {
echo "<li><i class='fas fa-link text-blue-600 mr-2'></i>{$fk['COLUMN_NAME']} → {$fk['REFERENCED_TABLE_NAME']}.{$fk['REFERENCED_COLUMN_NAME']}</li>";
}
echo "</ul></div></div>";
$structure_status = $has_district_id && $has_assembly_id ? 'success' : 'error';
$structure_message = $structure_status === 'success' ? 'Database structure is up to date!' : 'Missing required columns. Run migration first.';
$structure_color = $structure_status === 'success' ? 'green' : 'red';
echo "<div class='bg-{$structure_color}-50 border border-{$structure_color}-200 rounded p-3'>
<p class='text-{$structure_color}-800'><i class='fas fa-" . ($structure_status === 'success' ? 'check-circle' : 'exclamation-triangle') . " mr-2'></i>$structure_message</p>
</div></div>";
// Test 2: Location Data
echo "<div class='bg-white rounded-lg shadow p-6 mb-6'>
<h2 class='text-xl font-bold text-gray-900 mb-4'><i class='fas fa-map mr-2 text-green-600'></i>Location Data Test</h2>";
$districts_query = "SELECT COUNT(*) as count FROM locations WHERE type = 'district' AND is_active = 1";
$assemblies_query = "SELECT COUNT(*) as count FROM locations WHERE type = 'assembly' AND is_active = 1";
$districts_count = $conn->query($districts_query)->fetch()['count'];
$assemblies_count = $conn->query($assemblies_query)->fetch()['count'];
echo "<div class='grid grid-cols-1 md:grid-cols-2 gap-6'>";
// Districts
echo "<div class='border rounded-lg p-4'>
<h3 class='font-semibold text-lg mb-3'><i class='fas fa-building mr-2 text-blue-600'></i>Districts ($districts_count)</h3>";
$districts_list_query = "SELECT id, name, contact_person, contact_phone FROM locations WHERE type = 'district' AND is_active = 1 ORDER BY name";
$stmt = $conn->prepare($districts_list_query);
$stmt->execute();
$districts = $stmt->fetchAll();
if ($districts) {
echo "<ul class='space-y-2'>";
foreach ($districts as $district) {
echo "<li class='flex items-center justify-between p-2 bg-gray-50 rounded'>
<div>
<span class='font-medium'>{$district['name']}</span>
<br><small class='text-gray-600'>{$district['contact_person']} | {$district['contact_phone']}</small>
</div>
<span class='bg-blue-100 text-blue-800 px-2 py-1 rounded text-xs'>ID: {$district['id']}</span>
</li>";
}
echo "</ul>";
} else {
echo "<p class='text-gray-500'>No districts found</p>";
}
echo "</div>";
// Assemblies
echo "<div class='border rounded-lg p-4'>
<h3 class='font-semibold text-lg mb-3'><i class='fas fa-church mr-2 text-purple-600'></i>Assemblies ($assemblies_count)</h3>";
$assemblies_list_query = "SELECT a.id, a.name, a.parent_id, d.name as district_name
FROM locations a
LEFT JOIN locations d ON a.parent_id = d.id
WHERE a.type = 'assembly' AND a.is_active = 1
ORDER BY d.name, a.name";
$stmt = $conn->prepare($assemblies_list_query);
$stmt->execute();
$assemblies = $stmt->fetchAll();
if ($assemblies) {
echo "<ul class='space-y-2'>";
foreach ($assemblies as $assembly) {
echo "<li class='flex items-center justify-between p-2 bg-gray-50 rounded'>
<div>
<span class='font-medium'>{$assembly['name']}</span>
<br><small class='text-gray-600'>District: " . ($assembly['district_name'] ?: 'None') . "</small>
</div>
<span class='bg-purple-100 text-purple-800 px-2 py-1 rounded text-xs'>ID: {$assembly['id']}</span>
</li>";
}
echo "</ul>";
} else {
echo "<p class='text-gray-500'>No assemblies found</p>";
}
echo "</div></div></div>";
// Test 3: Attendance Records Analysis
echo "<div class='bg-white rounded-lg shadow p-6 mb-6'>
<h2 class='text-xl font-bold text-gray-900 mb-4'><i class='fas fa-users mr-2 text-yellow-600'></i>Attendance Records Analysis</h2>";
$attendance_stats_query = "SELECT
COUNT(*) as total_records,
COUNT(district_id) as with_district_id,
COUNT(assembly_id) as with_assembly_id,
COUNT(CASE WHEN district_name IS NOT NULL AND district_name != '' THEN 1 END) as with_district_name,
COUNT(CASE WHEN assembly_name IS NOT NULL AND assembly_name != '' THEN 1 END) as with_assembly_name
FROM attendance_records";
$stmt = $conn->prepare($attendance_stats_query);
$stmt->execute();
$stats = $stmt->fetch();
echo "<div class='grid grid-cols-1 md:grid-cols-3 gap-4 mb-4'>";
echo "<div class='bg-blue-50 p-4 rounded-lg text-center'>
<div class='text-2xl font-bold text-blue-600'>{$stats['total_records']}</div>
<div class='text-sm text-blue-800'>Total Records</div>
</div>";
echo "<div class='bg-green-50 p-4 rounded-lg text-center'>
<div class='text-2xl font-bold text-green-600'>{$stats['with_district_id']}</div>
<div class='text-sm text-green-800'>With District ID</div>
</div>";
echo "<div class='bg-purple-50 p-4 rounded-lg text-center'>
<div class='text-2xl font-bold text-purple-600'>{$stats['with_assembly_id']}</div>
<div class='text-sm text-purple-800'>With Assembly ID</div>
</div>";
echo "</div>";
// Recent records sample
$recent_query = "SELECT ar.id, ar.full_name, ar.district_name, ar.assembly_name,
ld.name as district_from_id, la.name as assembly_from_id,
p.name as program_name, ar.submitted_at
FROM attendance_records ar
LEFT JOIN locations ld ON ar.district_id = ld.id
LEFT JOIN locations la ON ar.assembly_id = la.id
LEFT JOIN programs p ON ar.program_id = p.id
ORDER BY ar.submitted_at DESC
LIMIT 5";
$stmt = $conn->prepare($recent_query);
$stmt->execute();
$recent_records = $stmt->fetchAll();
if ($recent_records) {
echo "<h3 class='font-semibold mb-3'>Recent Records Sample:</h3>";
echo "<div class='overflow-x-auto'>
<table class='min-w-full divide-y divide-gray-200'>
<thead class='bg-gray-50'>
<tr>
<th class='px-3 py-2 text-left text-xs font-medium text-gray-500 uppercase'>Name</th>
<th class='px-3 py-2 text-left text-xs font-medium text-gray-500 uppercase'>District</th>
<th class='px-3 py-2 text-left text-xs font-medium text-gray-500 uppercase'>Assembly</th>
<th class='px-3 py-2 text-left text-xs font-medium text-gray-500 uppercase'>Program</th>
<th class='px-3 py-2 text-left text-xs font-medium text-gray-500 uppercase'>Date</th>
</tr>
</thead>
<tbody class='bg-white divide-y divide-gray-200'>";
foreach ($recent_records as $record) {
$district_display = $record['district_from_id'] ?: $record['district_name'] ?: 'N/A';
$assembly_display = $record['assembly_from_id'] ?: $record['assembly_name'] ?: 'N/A';
echo "<tr>
<td class='px-3 py-2 text-sm text-gray-900'>{$record['full_name']}</td>
<td class='px-3 py-2 text-sm text-gray-600'>$district_display</td>
<td class='px-3 py-2 text-sm text-gray-600'>$assembly_display</td>
<td class='px-3 py-2 text-sm text-gray-600'>{$record['program_name']}</td>
<td class='px-3 py-2 text-sm text-gray-500'>" . date('M j, Y g:i A', strtotime($record['submitted_at'])) . "</td>
</tr>";
}
echo "</tbody></table></div>";
}
echo "</div>";
// Test 4: Form Integration Test
echo "<div class='bg-white rounded-lg shadow p-6 mb-6'>
<h2 class='text-xl font-bold text-gray-900 mb-4'><i class='fas fa-clipboard-check mr-2 text-red-600'></i>Form Integration Test</h2>";
// Get active programs
$programs_query = "SELECT id, name FROM programs WHERE is_active = 1 ORDER BY name LIMIT 5";
$stmt = $conn->prepare($programs_query);
$stmt->execute();
$programs = $stmt->fetchAll();
echo "<div class='grid grid-cols-1 md:grid-cols-2 gap-6'>";
echo "<div>
<h3 class='font-semibold mb-3'>Test Form Links:</h3>
<ul class='space-y-2'>";
foreach ($programs as $program) {
echo "<li>
<a href='../attendance/form.php?program={$program['id']}'
target='_blank'
class='inline-flex items-center px-3 py-2 bg-blue-100 text-blue-800 rounded-lg hover:bg-blue-200 transition-colors'>
<i class='fas fa-external-link-alt mr-2'></i>
{$program['name']}
</a>
</li>";
}
echo "</ul></div>";
echo "<div>
<h3 class='font-semibold mb-3'>API Test:</h3>
<button onclick='testAPI()' class='bg-green-600 text-white px-4 py-2 rounded-lg hover:bg-green-700'>
<i class='fas fa-play mr-2'></i>Test Attendance API
</button>
<div id='api-result' class='mt-3 p-3 bg-gray-100 rounded text-sm font-mono hidden'></div>
</div>";
echo "</div></div>";
// Navigation
echo "<div class='bg-white rounded-lg shadow p-6'>
<h2 class='text-xl font-bold text-gray-900 mb-4'><i class='fas fa-tools mr-2 text-gray-600'></i>Quick Actions</h2>
<div class='grid grid-cols-1 md:grid-cols-4 gap-4'>
<a href='migrate_database.php' class='bg-blue-600 text-white p-4 rounded-lg text-center hover:bg-blue-700 transition-colors'>
<i class='fas fa-database text-2xl mb-2 block'></i>
Run Migration
</a>
<a href='dashboard.php' class='bg-green-600 text-white p-4 rounded-lg text-center hover:bg-green-700 transition-colors'>
<i class='fas fa-tachometer-alt text-2xl mb-2 block'></i>
Dashboard
</a>
<a href='locations.php' class='bg-purple-600 text-white p-4 rounded-lg text-center hover:bg-purple-700 transition-colors'>
<i class='fas fa-map-marker-alt text-2xl mb-2 block'></i>
Manage Locations
</a>
<a href='programs.php' class='bg-yellow-600 text-white p-4 rounded-lg text-center hover:bg-yellow-700 transition-colors'>
<i class='fas fa-calendar text-2xl mb-2 block'></i>
Manage Programs
</a>
</div>
</div>";
} catch (Exception $e) {
echo "<div class='bg-red-50 border border-red-200 rounded p-4'>
<p class='text-red-800'><i class='fas fa-exclamation-triangle mr-2'></i>Error: " . $e->getMessage() . "</p>
</div>";
}
echo "</div>
<script>
async function testAPI() {
const resultDiv = document.getElementById('api-result');
resultDiv.classList.remove('hidden');
resultDiv.innerHTML = 'Testing API...';
try {
const response = await fetch('api/get_attendance.php?page=1&limit=3');
const data = await response.json();
resultDiv.innerHTML = JSON.stringify(data, null, 2);
if (data.success) {
resultDiv.className = 'mt-3 p-3 bg-green-100 rounded text-sm font-mono';
} else {
resultDiv.className = 'mt-3 p-3 bg-red-100 rounded text-sm font-mono';
}
} catch (error) {
resultDiv.innerHTML = 'Error: ' + error.message;
resultDiv.className = 'mt-3 p-3 bg-red-100 rounded text-sm font-mono';
}
}
</script>
</body>
</html>";
?>
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists