Sindbad~EG File Manager
<?php
require_once '../../config/config.php';
checkLogin();
$pageTitle = "Membership Cards - " . APP_NAME;
$db = Database::getInstance()->getConnection();
$membershipCard = new MembershipCard();
$success = '';
$error = '';
$selectedCard = null;
// Handle card generation
if (isset($_POST['generate_card'])) {
$memberId = $_POST['member_id'];
$result = $membershipCard->createCard($memberId);
if ($result['success']) {
$success = $result['message'];
$selectedCard = $membershipCard->getCardByMember($memberId);
} else {
$error = $result['message'];
}
}
// Handle card view
if (isset($_GET['member_id'])) {
$selectedCard = $membershipCard->getCardByMember($_GET['member_id']);
}
// Handle card print
if (isset($_POST['mark_printed'])) {
$membershipCard->markAsPrinted($_POST['card_id']);
$success = "Card marked as printed!";
}
// Get all members for selection
$accessLevel = $_SESSION['access_level'] ?? 'assembly';
$areaId = $_SESSION['area_id'] ?? null;
$districtId = $_SESSION['district_id'] ?? null;
$assemblyId = $_SESSION['assembly_id'] ?? null;
// Check if membershipcard_id column exists
$columnExists = false;
try {
$checkStmt = $db->query("SHOW COLUMNS FROM members LIKE 'membershipcard_id'");
$columnExists = $checkStmt->fetch() !== false;
} catch (PDOException $e) {
// Column doesn't exist
}
$memberIdField = $columnExists ? 'm.membershipcard_id' : 'CONCAT("MC", YEAR(CURDATE()), LPAD(m.id, 6, "0")) as membershipcard_id';
$memberQuery = "SELECT m.id, {$memberIdField}, m.first_name, m.last_name, m.profile_photo,
a.area_name, d.district_name, asm.assembly_name,
(SELECT COUNT(*) FROM membership_cards WHERE member_id = m.id AND is_active = 1) as has_card
FROM members m
JOIN areas a ON m.area_id = a.id
JOIN districts d ON m.district_id = d.id
JOIN assemblies asm ON m.assembly_id = asm.id
WHERE 1=1";
$params = [];
if ($accessLevel === 'assembly') {
$memberQuery .= " AND m.assembly_id = :assembly_id";
$params['assembly_id'] = $assemblyId;
} elseif ($accessLevel === 'district') {
$memberQuery .= " AND m.district_id = :district_id";
$params['district_id'] = $districtId;
} elseif ($accessLevel === 'area') {
$memberQuery .= " AND m.area_id = :area_id";
$params['area_id'] = $areaId;
}
$memberQuery .= " ORDER BY m.first_name, m.last_name";
// Check if tables exist
try {
$stmt = $db->prepare($memberQuery);
$stmt->execute($params);
$members = $stmt->fetchAll();
} catch (PDOException $e) {
$members = [];
$error = "Database not set up properly. Please run the installer first.";
}
include '../../includes/header.php';
?>
<?php include '../../includes/sidebar.php'; ?>
<!-- Main Content -->
<main class="flex-1 md:ml-64 mt-16">
<div class="container mx-auto px-4 py-8">
<div class="mb-6">
<h1 class="text-3xl font-bold text-gray-800">
<i class="fas fa-id-card mr-2 text-blue-500"></i>Membership Cards
</h1>
<p class="text-gray-600 mt-2">Generate and manage member ID cards and codes</p>
</div>
<?php if ($success): ?>
<div class="bg-green-100 border border-green-400 text-green-700 px-4 py-3 rounded-lg mb-6">
<i class="fas fa-check-circle mr-2"></i><?php echo $success; ?>
</div>
<?php endif; ?>
<?php if ($error): ?>
<div class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded-lg mb-6">
<i class="fas fa-exclamation-circle mr-2"></i><?php echo $error; ?>
</div>
<?php endif; ?>
<!-- Membership Cards Content -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- Member Selection -->
<div class="lg:col-span-1">
<div class="bg-white rounded-xl shadow-lg p-6">
<h3 class="text-xl font-bold text-gray-800 mb-4">
<i class="fas fa-users mr-2 text-blue-500"></i>Select Member
</h3>
<div class="mb-4">
<input type="text" id="searchMember" placeholder="Search members..."
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
</div>
<div class="space-y-2 max-h-96 overflow-y-auto" id="memberList">
<?php foreach ($members as $member): ?>
<div class="member-item p-3 border rounded-lg hover:bg-blue-50 cursor-pointer transition <?php echo $member['has_card'] ? 'bg-green-50' : ''; ?>"
onclick="viewCard(<?php echo $member['id']; ?>)">
<div class="flex items-center justify-between">
<div class="flex items-center space-x-3">
<img src="<?php echo !empty($member['profile_photo']) ? BASE_URL . 'uploads/members/' . $member['profile_photo'] : BASE_URL . 'assets/images/default-avatar.png'; ?>"
class="w-10 h-10 rounded-full object-cover">
<div>
<div class="font-semibold text-sm">
<?php echo htmlspecialchars($member['first_name'] . ' ' . $member['last_name']); ?>
</div>
<div class="text-xs text-gray-500"><?php echo htmlspecialchars($member['membershipcard_id']); ?></div>
</div>
</div>
<?php if ($member['has_card']): ?>
<span class="text-green-600"><i class="fas fa-check-circle"></i></span>
<?php else: ?>
<span class="text-gray-400"><i class="fas fa-id-card"></i></span>
<?php endif; ?>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
<!-- Card Display -->
<div class="lg:col-span-2">
<?php if ($selectedCard): ?>
<!-- Membership Card -->
<div class="bg-white rounded-xl shadow-lg p-6 mb-6">
<div class="flex justify-between items-center mb-4">
<h3 class="text-xl font-bold text-gray-800">Membership Card</h3>
<div class="space-x-2">
<button onclick="printCard()" class="bg-blue-500 text-white px-4 py-2 rounded-lg hover:bg-blue-600 transition">
<i class="fas fa-print mr-2"></i>Print
</button>
<form method="POST" class="inline">
<input type="hidden" name="card_id" value="<?php echo $selectedCard['id']; ?>">
<button type="submit" name="mark_printed" class="bg-green-500 text-white px-4 py-2 rounded-lg hover:bg-green-600 transition">
<i class="fas fa-check mr-2"></i>Mark Printed
</button>
</form>
</div>
</div>
<!-- Card Preview -->
<div id="membershipCard" class="mx-auto" style="width: 3.375in; height: 2.125in;">
<!-- Front of Card -->
<div class="relative bg-gradient-to-br from-blue-600 via-blue-500 to-yellow-400 rounded-xl shadow-2xl p-6 text-white" style="height: 2.125in;">
<!-- Church Logo/Header -->
<div class="absolute top-0 left-0 right-0 bg-white bg-opacity-20 p-3 rounded-t-xl">
<div class="flex items-center justify-between">
<div>
<i class="fas fa-church text-2xl"></i>
</div>
<div class="text-right">
<div class="text-xs font-bold"><?php echo APP_NAME; ?></div>
<div class="text-xs"><?php echo htmlspecialchars($selectedCard['area_name']); ?></div>
</div>
</div>
</div>
<!-- Member Photo and Info -->
<div class="flex items-center space-x-4 mt-16">
<img src="<?php echo !empty($selectedCard['profile_photo']) ? BASE_URL . 'uploads/members/' . $selectedCard['profile_photo'] : BASE_URL . 'assets/images/default-avatar.png'; ?>"
class="w-20 h-20 rounded-full border-4 border-white object-cover">
<div class="flex-1">
<div class="text-xl font-bold">
<?php echo htmlspecialchars($selectedCard['first_name'] . ' ' . $selectedCard['last_name']); ?>
</div>
<div class="text-sm opacity-90">Member ID: <?php echo htmlspecialchars($selectedCard['member_number']); ?></div>
<div class="text-sm opacity-90"><?php echo htmlspecialchars($selectedCard['assembly_name']); ?></div>
</div>
</div>
<!-- Card Number -->
<div class="absolute bottom-3 left-0 right-0 px-6">
<div class="flex justify-between items-center text-xs">
<div>
<div class="opacity-75">Card No:</div>
<div class="font-mono font-bold"><?php echo htmlspecialchars($selectedCard['card_number']); ?></div>
</div>
<div class="text-right">
<div class="opacity-75">Valid Until:</div>
<div class="font-bold"><?php echo date('m/Y', strtotime($selectedCard['expiry_date'])); ?></div>
</div>
</div>
</div>
</div>
<!-- Card Details Below -->
<div class="mt-4 bg-gray-50 rounded-lg p-4 text-sm">
<div class="grid grid-cols-2 gap-3">
<div>
<span class="text-gray-600">Issue Date:</span>
<span class="font-semibold ml-2"><?php echo date('d/m/Y', strtotime($selectedCard['issue_date'])); ?></span>
</div>
<div>
<span class="text-gray-600">Status:</span>
<span class="ml-2">
<?php if ($selectedCard['is_active']): ?>
<span class="text-green-600 font-semibold"><i class="fas fa-check-circle"></i> Active</span>
<?php else: ?>
<span class="text-red-600 font-semibold"><i class="fas fa-times-circle"></i> Inactive</span>
<?php endif; ?>
</span>
</div>
<div>
<span class="text-gray-600">Printed:</span>
<span class="font-semibold ml-2"><?php echo $selectedCard['print_count']; ?> time(s)</span>
</div>
<?php if ($selectedCard['last_printed']): ?>
<div>
<span class="text-gray-600">Last Printed:</span>
<span class="font-semibold ml-2"><?php echo date('d/m/Y', strtotime($selectedCard['last_printed'])); ?></span>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
<?php else: ?>
<!-- No Card Selected -->
<div class="bg-white rounded-xl shadow-lg p-12 text-center">
<i class="fas fa-id-card text-6xl text-gray-300 mb-4"></i>
<h3 class="text-xl font-bold text-gray-800 mb-2">No Card Selected</h3>
<p class="text-gray-600 mb-6">Select a member from the list to view or generate their membership card</p>
<?php if (isset($_GET['member_id'])): ?>
<form method="POST">
<input type="hidden" name="member_id" value="<?php echo $_GET['member_id']; ?>">
<button type="submit" name="generate_card" class="bg-gradient-to-r from-blue-500 to-blue-600 text-white px-6 py-3 rounded-lg hover:from-blue-600 hover:to-blue-700 transition">
<i class="fas fa-plus-circle mr-2"></i>Generate Card for This Member
</button>
</form>
<?php endif; ?>
</div>
<?php endif; ?>
</div>
</div>
</div>
</main>
<script>
function viewCard(memberId) {
window.location.href = 'cards.php?member_id=' + memberId;
}
function printCard() {
window.print();
}
// Search functionality
document.getElementById('searchMember').addEventListener('input', function(e) {
const searchTerm = e.target.value.toLowerCase();
const members = document.querySelectorAll('.member-item');
members.forEach(member => {
const text = member.textContent.toLowerCase();
if (text.includes(searchTerm)) {
member.style.display = '';
} else {
member.style.display = 'none';
}
});
});
</script>
<style>
@media print {
body * {
visibility: hidden;
}
#membershipCard, #membershipCard * {
visibility: visible;
}
#membershipCard {
position: absolute;
left: 0;
top: 0;
}
}
</style>
<?php include '../../includes/footer.php'; ?>
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists