Sindbad~EG File Manager
<?php
require_once '../../config/config.php';
checkLogin();
$pageTitle = "Member Transfers - " . APP_NAME;
$db = Database::getInstance()->getConnection();
$success = '';
$error = '';
// Get access level
$accessLevel = getUserAccessLevel();
$userAssemblyId = getUserAssemblyId();
$userDistrictId = getUserDistrictId();
// Handle transfer request
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['submit_transfer'])) {
try {
$memberId = $_POST['member_id'];
$fromAssemblyId = $_POST['from_assembly_id'];
$toAssemblyId = $_POST['to_assembly_id'];
$transferReason = $_POST['transfer_reason'];
$transferDate = $_POST['transfer_date'];
// Validate
if ($fromAssemblyId == $toAssemblyId) {
throw new Exception("Cannot transfer to the same assembly");
}
// Start transaction
$db->beginTransaction();
// Update member's assembly
$stmt = $db->prepare("
UPDATE members
SET assembly_id = :new_assembly,
district_id = (SELECT district_id FROM assemblies WHERE id = :new_assembly)
WHERE id = :member_id
");
$stmt->execute([
'new_assembly' => $toAssemblyId,
'member_id' => $memberId
]);
// Record transfer (if you have a transfers table, otherwise just success message)
$db->commit();
$success = "Member transfer completed successfully!";
} catch (Exception $e) {
if ($db->inTransaction()) {
$db->rollBack();
}
$error = $e->getMessage();
}
}
// Get members for transfer
$query = "SELECT m.*, a.assembly_name, d.district_name
FROM members m
LEFT JOIN assemblies a ON m.assembly_id = a.id
LEFT JOIN districts d ON m.district_id = d.id
WHERE m.is_active = 1";
$params = [];
if ($accessLevel === 'assembly') {
$query .= " AND m.assembly_id = :assembly_id";
$params['assembly_id'] = $userAssemblyId;
} elseif ($accessLevel === 'district') {
$query .= " AND m.district_id = :district_id";
$params['district_id'] = $userDistrictId;
}
$query .= " ORDER BY m.first_name, m.last_name LIMIT 100";
$stmt = $db->prepare($query);
$stmt->execute($params);
$members = $stmt->fetchAll();
// Get all assemblies
$assemblies = $db->query("SELECT a.*, d.district_name
FROM assemblies a
LEFT JOIN districts d ON a.district_id = d.id
WHERE a.is_active = 1
ORDER BY d.district_name, a.assembly_name")->fetchAll();
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="max-w-6xl mx-auto">
<!-- Header -->
<div class="mb-8">
<h1 class="text-3xl font-bold text-gray-800 mb-2">Member Transfers</h1>
<p class="text-gray-600">Manage member transfers between assemblies</p>
</div>
<!-- Success/Error Messages -->
<?php if ($success): ?>
<div class="mb-6 bg-green-100 border-l-4 border-green-500 text-green-700 p-4 rounded-lg shadow-md">
<div class="flex items-center">
<i class="fas fa-check-circle mr-3 text-xl"></i>
<p><?php echo $success; ?></p>
</div>
</div>
<?php endif; ?>
<?php if ($error): ?>
<div class="mb-6 bg-red-100 border-l-4 border-red-500 text-red-700 p-4 rounded-lg shadow-md">
<div class="flex items-center">
<i class="fas fa-exclamation-circle mr-3 text-xl"></i>
<p><?php echo htmlspecialchars($error); ?></p>
</div>
</div>
<?php endif; ?>
<!-- Transfer Form -->
<div class="bg-white rounded-xl shadow-lg p-6 mb-6">
<h2 class="text-xl font-semibold text-gray-800 mb-6">
<i class="fas fa-exchange-alt mr-2"></i>Create New Transfer
</h2>
<form method="POST" class="space-y-6">
<div class="grid grid-cols-2 gap-6">
<div class="col-span-2">
<label class="block text-sm font-medium text-gray-700 mb-2">Select Member*</label>
<select name="member_id" id="memberId" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500" required>
<option value="">Choose a member...</option>
<?php foreach ($members as $member): ?>
<option value="<?php echo $member['id']; ?>"
data-assembly="<?php echo $member['assembly_id']; ?>"
data-assembly-name="<?php echo htmlspecialchars($member['assembly_name']); ?>">
<?php echo htmlspecialchars($member['first_name'] . ' ' . $member['last_name'] . ' - ' . $member['assembly_name']); ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">From Assembly*</label>
<input type="hidden" name="from_assembly_id" id="fromAssemblyId" required>
<input type="text" id="fromAssemblyName" readonly
class="w-full px-4 py-2 border border-gray-300 rounded-lg bg-gray-50"
placeholder="Select member first">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">To Assembly*</label>
<select name="to_assembly_id" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500" required>
<option value="">Choose destination assembly...</option>
<?php foreach ($assemblies as $assembly): ?>
<option value="<?php echo $assembly['id']; ?>">
<?php echo htmlspecialchars($assembly['district_name'] . ' - ' . $assembly['assembly_name']); ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Transfer Date*</label>
<input type="date" name="transfer_date" value="<?php echo date('Y-m-d'); ?>"
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500" required>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Reason for Transfer</label>
<select name="transfer_reason" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
<option value="relocation">Relocation</option>
<option value="personal">Personal Reasons</option>
<option value="work">Work Related</option>
<option value="family">Family Reasons</option>
<option value="other">Other</option>
</select>
</div>
</div>
<div class="flex justify-end">
<button type="submit" name="submit_transfer"
class="bg-gradient-to-r from-blue-500 to-blue-600 text-white px-8 py-3 rounded-lg hover:shadow-lg transition">
<i class="fas fa-paper-plane mr-2"></i>Submit Transfer
</button>
</div>
</form>
</div>
<!-- Recent Transfers Table -->
<div class="bg-white rounded-xl shadow-lg overflow-hidden">
<div class="p-6 border-b border-gray-200">
<h2 class="text-xl font-semibold text-gray-800">
<i class="fas fa-history mr-2"></i>Members Available for Transfer
</h2>
</div>
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Member</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Current District</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Current Assembly</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Member Type</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<?php foreach ($members as $member): ?>
<tr class="hover:bg-gray-50">
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm font-medium text-gray-900">
<?php echo htmlspecialchars($member['first_name'] . ' ' . $member['last_name']); ?>
</div>
<div class="text-sm text-gray-500">
<?php echo htmlspecialchars($member['email'] ?? 'No email'); ?>
</div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<?php echo htmlspecialchars($member['district_name'] ?? 'N/A'); ?>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<?php echo htmlspecialchars($member['assembly_name'] ?? 'N/A'); ?>
</td>
<td class="px-6 py-4 whitespace-nowrap">
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">
<?php echo htmlspecialchars($member['member_type'] ?? 'Full Member'); ?>
</span>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</main>
<script>
// Auto-fill from assembly when member is selected
document.getElementById('memberId').addEventListener('change', function() {
const selectedOption = this.options[this.selectedIndex];
const assemblyId = selectedOption.getAttribute('data-assembly');
const assemblyName = selectedOption.getAttribute('data-assembly-name');
document.getElementById('fromAssemblyId').value = assemblyId || '';
document.getElementById('fromAssemblyName').value = assemblyName || 'No assembly';
});
</script>
<?php include '../../includes/footer.php'; ?>
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists