Sindbad~EG File Manager
<?php
require_once 'config/config.php';
$pageTitle = "Attendance - " . APP_NAME;
// Get settings for theme colors
$db = Database::getInstance()->getConnection();
$stmt = $db->query("SELECT * FROM general_settings ORDER BY id DESC LIMIT 1");
$settings = $stmt->fetch();
$settings = array_merge([
'site_title' => 'Church Membership System',
'theme_primary_color' => '#1E40AF',
'theme_secondary_color' => '#F97316',
], $settings ?: []);
$error = '';
$success = '';
$userType = $_POST['user_type'] ?? $_GET['type'] ?? '';
$userCode = $_POST['user_code'] ?? '';
$step = 'select_type'; // select_type, enter_code, select_program, checkin_success, admin_dashboard
$memberData = null;
$userData = null;
$availablePrograms = [];
$assemblyId = null;
// Handle member/user code verification
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['verify_code'])) {
$userCode = strtoupper(trim($_POST['user_code']));
$userType = $_POST['user_type'];
if (empty($userCode)) {
$error = "Please enter your code";
$step = 'enter_code';
} else {
try {
if ($userType === 'member') {
// Look up member by tracking code, code, or membershipcard_id
$stmt = $db->prepare("
SELECT m.*, mc.tracking_code, mc.code as member_code, a.assembly_name, d.district_name, ar.area_name
FROM members m
LEFT JOIN memberuser_codes mc ON mc.member_id = m.id AND mc.code_type = 'member' AND mc.is_active = 1
LEFT JOIN assemblies a ON m.assembly_id = a.id
LEFT JOIN districts d ON m.district_id = d.id
LEFT JOIN areas ar ON m.area_id = ar.id
WHERE (mc.tracking_code = :code1 OR mc.code = :code2 OR m.membershipcard_id = :code3)
AND m.is_active = 1
LIMIT 1
");
$stmt->execute(['code1' => $userCode, 'code2' => $userCode, 'code3' => $userCode]);
$memberData = $stmt->fetch();
if ($memberData) {
$assemblyId = $memberData['assembly_id'];
$step = 'select_program';
// Get available programs for this assembly
$progStmt = $db->prepare("
SELECT p.*,
(SELECT COUNT(*) FROM program_attendance pa WHERE pa.program_id = p.id AND DATE(pa.check_in_time) = CURDATE()) as today_checkins
FROM programs p
WHERE p.is_active = 1
AND (p.assembly_id = :assembly_id OR p.assembly_id IS NULL)
AND (p.end_date IS NULL OR p.end_date >= CURDATE())
ORDER BY p.program_name
");
$progStmt->execute(['assembly_id' => $assemblyId]);
$availablePrograms = $progStmt->fetchAll();
} else {
$error = "Invalid member code. Please check and try again.";
$step = 'enter_code';
}
} else {
// Admin/User code lookup - check tracking_code and code columns
$stmt = $db->prepare("
SELECT u.*, mc.tracking_code, mc.code as user_code, a.assembly_name, d.district_name, ar.area_name
FROM users u
LEFT JOIN memberuser_codes mc ON mc.user_id = u.id AND mc.code_type = 'user' AND mc.is_active = 1
LEFT JOIN assemblies a ON u.assembly_id = a.id
LEFT JOIN districts d ON u.district_id = d.id
LEFT JOIN areas ar ON u.area_id = ar.id
WHERE (mc.tracking_code = :code1 OR mc.code = :code2)
AND u.is_active = 1
LIMIT 1
");
$stmt->execute(['code1' => $userCode, 'code2' => $userCode]);
$userData = $stmt->fetch();
if ($userData) {
$assemblyId = $userData['assembly_id'];
$step = 'admin_dashboard';
// Store in session for admin actions
$_SESSION['temp_admin_id'] = $userData['id'];
$_SESSION['temp_admin_assembly'] = $assemblyId;
$_SESSION['temp_admin_code'] = $userCode;
} else {
$error = "Invalid admin code. Please check and try again.";
$step = 'enter_code';
}
}
} catch (Exception $e) {
$error = "Error: " . $e->getMessage();
$step = 'enter_code';
}
}
}
// Handle member check-in
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['member_checkin'])) {
try {
$memberId = $_POST['member_id'];
$programId = $_POST['program_id'];
// Check if already checked in today
$checkStmt = $db->prepare("
SELECT id FROM program_attendance
WHERE member_id = :member_id AND program_id = :program_id
AND DATE(check_in_time) = CURDATE()
");
$checkStmt->execute(['member_id' => $memberId, 'program_id' => $programId]);
if ($checkStmt->fetch()) {
$error = "You have already checked in to this program today.";
$step = 'select_program';
} else {
// Get program end time for auto checkout
$progStmt = $db->prepare("SELECT * FROM programs WHERE id = :id");
$progStmt->execute(['id' => $programId]);
$program = $progStmt->fetch();
// Insert check-in
$insertStmt = $db->prepare("
INSERT INTO program_attendance (program_id, member_id, check_in_time, attendance_type)
VALUES (:program_id, :member_id, NOW(), 'self')
");
$insertStmt->execute(['program_id' => $programId, 'member_id' => $memberId]);
$success = "Check-in successful! You are now marked as present.";
$step = 'checkin_success';
// Get member and program info for success message
$memberStmt = $db->prepare("SELECT * FROM members WHERE id = :id");
$memberStmt->execute(['id' => $memberId]);
$memberData = $memberStmt->fetch();
}
} catch (Exception $e) {
$error = "Check-in failed: " . $e->getMessage();
$step = 'select_program';
}
}
// Determine step based on GET parameters (only if not already set by POST)
if ($_SERVER['REQUEST_METHOD'] !== 'POST' && isset($_GET['type']) && in_array($_GET['type'], ['member', 'admin'])) {
$userType = $_GET['type'];
$step = 'enter_code';
}
// Check for returning admin session
if (isset($_SESSION['temp_admin_id']) && isset($_GET['admin']) && $_GET['admin'] === 'dashboard') {
$step = 'admin_dashboard';
$userData = ['id' => $_SESSION['temp_admin_id']];
$assemblyId = $_SESSION['temp_admin_assembly'];
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php echo $pageTitle; ?></title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<style>
.hero-gradient {
background: linear-gradient(135deg, #1E40AF 0%, #9333EA 50%, #F97316 100%);
}
.text-gradient {
background: linear-gradient(135deg, #1E40AF 0%, #F97316 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.btn-gradient {
background: linear-gradient(135deg, #1E40AF 0%, #9333EA 100%);
}
.btn-gradient-orange {
background: linear-gradient(135deg, #F97316 0%, #FBBF24 100%);
}
.card-hover:hover {
transform: translateY(-5px);
box-shadow: 0 20px 40px rgba(0,0,0,0.15);
}
.card-hover {
transition: all 0.3s ease;
}
@keyframes fadeInUp {
from { opacity: 0; transform: translateY(30px); }
to { opacity: 1; transform: translateY(0); }
}
.animate-fadeIn { animation: fadeInUp 0.5s ease-out; }
@keyframes pulse-ring {
0% { transform: scale(0.8); opacity: 1; }
100% { transform: scale(1.3); opacity: 0; }
}
.pulse-ring::before {
content: '';
position: absolute;
inset: -10px;
border-radius: 50%;
border: 3px solid currentColor;
animation: pulse-ring 1.5s ease-out infinite;
}
</style>
</head>
<body class="bg-gray-50 min-h-screen">
<!-- Header -->
<header class="bg-white shadow-lg sticky top-0 z-50">
<div class="container mx-auto px-4">
<div class="flex items-center justify-between h-16">
<div class="flex items-center space-x-3">
<div class="w-12 h-12 rounded-xl flex items-center justify-center hero-gradient">
<i class="fas fa-church text-white text-xl"></i>
</div>
<div>
<h1 class="text-xl font-bold text-gradient"><?php echo htmlspecialchars($settings['site_title']); ?></h1>
<p class="text-xs text-gray-500">Program Attendance</p>
</div>
</div>
<nav class="flex items-center space-x-4">
<a href="index.php" class="text-gray-700 hover:text-blue-700 font-medium transition">
<i class="fas fa-home mr-1"></i><span class="hidden sm:inline">Home</span>
</a>
<?php if (isLoggedIn()): ?>
<a href="dashboard.php" class="text-gray-700 hover:text-purple-600 font-medium transition">
<i class="fas fa-tachometer-alt mr-1"></i><span class="hidden sm:inline">Dashboard</span>
</a>
<?php else: ?>
<a href="login.php" class="px-4 py-2 rounded-full text-white font-semibold btn-gradient">
<i class="fas fa-sign-in-alt mr-1"></i>Login
</a>
<?php endif; ?>
</nav>
</div>
</div>
</header>
<!-- Hero Section -->
<section class="hero-gradient text-white py-8">
<div class="container mx-auto px-4 text-center">
<i class="fas fa-clipboard-check text-5xl mb-3 opacity-90"></i>
<h1 class="text-3xl font-bold mb-2">Program Attendance</h1>
<p class="text-white/90">Check in to church programs quickly and easily</p>
</div>
</section>
<!-- Main Content -->
<main class="container mx-auto px-4 py-8">
<div class="max-w-2xl mx-auto">
<?php if ($error): ?>
<div class="bg-red-100 border-l-4 border-red-500 text-red-700 p-4 rounded mb-6 animate-fadeIn">
<p class="font-bold"><i class="fas fa-exclamation-circle mr-2"></i>Error</p>
<p><?php echo htmlspecialchars($error); ?></p>
</div>
<?php endif; ?>
<?php if ($success): ?>
<div class="bg-green-100 border-l-4 border-green-500 text-green-700 p-4 rounded mb-6 animate-fadeIn">
<p class="font-bold"><i class="fas fa-check-circle mr-2"></i>Success</p>
<p><?php echo htmlspecialchars($success); ?></p>
</div>
<?php endif; ?>
<?php if ($step === 'select_type'): ?>
<!-- Step 1: Select User Type -->
<div class="bg-white rounded-xl shadow-lg p-8 animate-fadeIn">
<h2 class="text-2xl font-bold text-gray-800 text-center mb-6">
<i class="fas fa-user-check mr-2 text-blue-500"></i>Welcome!
</h2>
<p class="text-gray-600 text-center mb-8">Please select how you would like to check in:</p>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<!-- Member Option -->
<a href="?type=member" class="card-hover block bg-gradient-to-br from-blue-50 to-blue-100 rounded-xl p-6 border-2 border-blue-200 hover:border-blue-400 text-center">
<div class="w-20 h-20 mx-auto mb-4 rounded-full bg-blue-500 flex items-center justify-center">
<i class="fas fa-user text-3xl text-white"></i>
</div>
<h3 class="text-xl font-bold text-blue-800 mb-2">I'm a Member</h3>
<p class="text-blue-600 text-sm">Check in to programs using your member code</p>
</a>
<!-- Guest/Visitor Option -->
<a href="guest-checkin.php" class="card-hover block bg-gradient-to-br from-orange-50 to-yellow-100 rounded-xl p-6 border-2 border-orange-200 hover:border-orange-400 text-center">
<div class="w-20 h-20 mx-auto mb-4 rounded-full bg-gradient-to-br from-orange-500 to-yellow-500 flex items-center justify-center">
<i class="fas fa-user-plus text-3xl text-white"></i>
</div>
<h3 class="text-xl font-bold text-orange-800 mb-2">Guest / Visitor</h3>
<p class="text-orange-600 text-sm">First time here? Register as a guest or visitor</p>
</a>
<!-- Admin Option -->
<a href="?type=admin" class="card-hover block bg-gradient-to-br from-purple-50 to-purple-100 rounded-xl p-6 border-2 border-purple-200 hover:border-purple-400 text-center">
<div class="w-20 h-20 mx-auto mb-4 rounded-full bg-purple-500 flex items-center justify-center">
<i class="fas fa-user-shield text-3xl text-white"></i>
</div>
<h3 class="text-xl font-bold text-purple-800 mb-2">I'm an Admin</h3>
<p class="text-purple-600 text-sm">Manage attendance using your admin code</p>
</a>
</div>
<!-- Already have a visitor code? -->
<div class="mt-8 p-4 bg-gray-50 rounded-lg text-center">
<p class="text-gray-600 mb-2">Already registered as a guest?</p>
<a href="guest-lookup.php" class="text-orange-600 hover:text-orange-800 font-medium">
<i class="fas fa-search mr-1"></i>Look up your details with your visitor code
</a>
</div>
<div class="mt-6 text-center">
<a href="index.php" class="text-gray-500 hover:text-gray-700">
<i class="fas fa-arrow-left mr-1"></i>Back to Home
</a>
</div>
</div>
<?php elseif ($step === 'enter_code'): ?>
<!-- Step 2: Enter Code -->
<div class="bg-white rounded-xl shadow-lg p-8 animate-fadeIn">
<div class="text-center mb-6">
<?php if ($userType === 'member'): ?>
<div class="w-16 h-16 mx-auto mb-4 rounded-full bg-blue-500 flex items-center justify-center">
<i class="fas fa-user text-2xl text-white"></i>
</div>
<h2 class="text-2xl font-bold text-gray-800">Member Check-In</h2>
<p class="text-gray-600">Enter your member code or membership card ID</p>
<?php else: ?>
<div class="w-16 h-16 mx-auto mb-4 rounded-full bg-purple-500 flex items-center justify-center">
<i class="fas fa-user-shield text-2xl text-white"></i>
</div>
<h2 class="text-2xl font-bold text-gray-800">Admin Access</h2>
<p class="text-gray-600">Enter your admin tracking code</p>
<?php endif; ?>
</div>
<form method="POST" class="space-y-6">
<input type="hidden" name="user_type" value="<?php echo htmlspecialchars($userType); ?>">
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">
<?php echo $userType === 'member' ? 'Member Code / Card ID' : 'Admin Code'; ?>
</label>
<input type="text" name="user_code" required autofocus
placeholder="<?php echo $userType === 'member' ? 'e.g., MEM2026123456' : 'e.g., USR2026123456'; ?>"
class="w-full px-4 py-3 text-lg border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-center uppercase"
style="letter-spacing: 2px;">
</div>
<button type="submit" name="verify_code"
class="w-full py-3 rounded-lg text-white font-semibold <?php echo $userType === 'member' ? 'btn-gradient' : 'bg-purple-600 hover:bg-purple-700'; ?> transition">
<i class="fas fa-arrow-right mr-2"></i>Continue
</button>
</form>
<div class="mt-6 text-center">
<a href="attendance.php" class="text-gray-500 hover:text-gray-700">
<i class="fas fa-arrow-left mr-1"></i>Back
</a>
</div>
</div>
<?php elseif ($step === 'select_program' && $memberData): ?>
<!-- Step 3: Select Program (Member) -->
<div class="bg-white rounded-xl shadow-lg overflow-hidden animate-fadeIn">
<!-- Member Info Header -->
<div class="bg-gradient-to-r from-blue-500 to-blue-600 text-white p-6">
<div class="flex items-center space-x-4">
<div class="w-16 h-16 rounded-full bg-white/20 flex items-center justify-center">
<i class="fas fa-user text-2xl"></i>
</div>
<div>
<h3 class="text-xl font-bold">
<?php echo htmlspecialchars($memberData['first_name'] . ' ' . $memberData['last_name']); ?>
</h3>
<p class="text-white/80 text-sm">
<i class="fas fa-church mr-1"></i><?php echo htmlspecialchars($memberData['assembly_name'] ?? 'N/A'); ?>
</p>
<p class="text-white/80 text-sm">
<i class="fas fa-id-card mr-1"></i><?php echo htmlspecialchars($memberData['membershipcard_id'] ?? 'N/A'); ?>
</p>
</div>
</div>
</div>
<div class="p-6">
<h4 class="text-lg font-bold text-gray-800 mb-4">
<i class="fas fa-calendar-check mr-2 text-green-500"></i>Select Program to Check In
</h4>
<?php if (empty($availablePrograms)): ?>
<div class="text-center py-8">
<i class="fas fa-calendar-times text-5xl text-gray-300 mb-4"></i>
<p class="text-gray-600">No active programs available for your assembly today.</p>
</div>
<?php else: ?>
<div class="space-y-3">
<?php foreach ($availablePrograms as $program): ?>
<form method="POST" class="block">
<input type="hidden" name="member_id" value="<?php echo $memberData['id']; ?>">
<input type="hidden" name="program_id" value="<?php echo $program['id']; ?>">
<button type="submit" name="member_checkin"
class="w-full text-left p-4 border border-gray-200 rounded-lg hover:border-blue-400 hover:bg-blue-50 transition">
<div class="flex justify-between items-center">
<div>
<h5 class="font-semibold text-gray-800"><?php echo htmlspecialchars($program['program_name']); ?></h5>
<p class="text-sm text-gray-500">
<i class="fas fa-clock mr-1"></i>
<?php echo $program['start_time'] ? date('g:i A', strtotime($program['start_time'])) : 'Flexible'; ?>
<?php if ($program['end_time']): ?>
- <?php echo date('g:i A', strtotime($program['end_time'])); ?>
<?php endif; ?>
</p>
</div>
<div class="text-right">
<span class="text-xs bg-green-100 text-green-800 px-2 py-1 rounded-full">
<?php echo $program['today_checkins']; ?> checked in
</span>
<i class="fas fa-chevron-right text-gray-400 ml-2"></i>
</div>
</div>
</button>
</form>
<?php endforeach; ?>
</div>
<?php endif; ?>
<div class="mt-6 text-center">
<a href="attendance.php" class="text-gray-500 hover:text-gray-700">
<i class="fas fa-arrow-left mr-1"></i>Start Over
</a>
</div>
</div>
</div>
<?php elseif ($step === 'checkin_success'): ?>
<!-- Check-in Success -->
<div class="bg-white rounded-xl shadow-lg p-8 text-center animate-fadeIn">
<div class="w-24 h-24 mx-auto mb-6 rounded-full bg-green-100 flex items-center justify-center relative pulse-ring text-green-500">
<i class="fas fa-check text-4xl text-green-500"></i>
</div>
<h2 class="text-2xl font-bold text-gray-800 mb-2">Check-In Complete!</h2>
<p class="text-gray-600 mb-6">
Welcome, <strong><?php echo htmlspecialchars($memberData['first_name'] ?? ''); ?></strong>!
You have been marked as present.
</p>
<div class="bg-green-50 border border-green-200 rounded-lg p-4 mb-6">
<p class="text-green-800">
<i class="fas fa-info-circle mr-2"></i>
You will be automatically checked out when the program ends.
</p>
</div>
<div class="flex flex-col sm:flex-row gap-3 justify-center">
<a href="attendance.php" class="px-6 py-3 btn-gradient text-white rounded-lg font-semibold">
<i class="fas fa-redo mr-2"></i>New Check-In
</a>
<a href="index.php" class="px-6 py-3 bg-gray-200 text-gray-700 rounded-lg font-semibold hover:bg-gray-300">
<i class="fas fa-home mr-2"></i>Go Home
</a>
</div>
</div>
<?php elseif ($step === 'admin_dashboard'): ?>
<!-- Admin Dashboard - Redirect to full admin page -->
<?php
header('Location: attendance-admin.php?code=' . urlencode($_SESSION['temp_admin_code'] ?? ''));
exit();
?>
<?php endif; ?>
</div>
</main>
<!-- Footer -->
<footer class="bg-gray-800 text-white py-6 mt-auto">
<div class="container mx-auto px-4 text-center">
<p class="text-gray-400 text-sm">
© <?php echo date('Y'); ?> <?php echo htmlspecialchars($settings['site_title']); ?>
</p>
</div>
</footer>
<?php
if (file_exists(__DIR__ . '/includes/chat-hub-widget.php')) {
include 'includes/chat-hub-widget.php';
}
?>
</body>
</html>
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists