[
MAINHACK
]
Mail Test
BC
Config Scan
HOME
Create...
New File
New Folder
Viewing / Editing File: attendance.php
<?php /** * Attendance Management Page * This page allows teachers to record student attendance with homework and test scores */ require_once '../config/config.php'; requireLogin('teacher'); $database = new Database(); $conn = $database->getConnection(); $teacher_id = $_SESSION['teacher_id']; $message = ''; $message_type = ''; // Handle form submissions if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['action']) && $_POST['action'] === 'save_attendance') { $group_id = $_POST['group_id']; $session_date = $_POST['session_date']; $session_time = $_POST['session_time']; $attendance_data = $_POST['attendance'] ?? []; if (empty($group_id) || empty($session_date) || empty($session_time)) { $message = 'يرجى إدخال جميع البيانات المطلوبة'; $message_type = 'danger'; } else { // Verify group belongs to teacher $verify_query = "SELECT id FROM groups WHERE id = :group_id AND teacher_id = :teacher_id"; $verify_stmt = $conn->prepare($verify_query); $verify_stmt->bindParam(':group_id', $group_id); $verify_stmt->bindParam(':teacher_id', $teacher_id); $verify_stmt->execute(); if ($verify_stmt->rowCount() == 0) { $message = 'المجموعة غير صحيحة'; $message_type = 'danger'; } else { $conn->beginTransaction(); try { // Delete existing attendance for this session $delete_query = "DELETE FROM attendance WHERE group_id = :group_id AND session_date = :session_date AND session_time = :session_time"; $delete_stmt = $conn->prepare($delete_query); $delete_stmt->bindParam(':group_id', $group_id); $delete_stmt->bindParam(':session_date', $session_date); $delete_stmt->bindParam(':session_time', $session_time); $delete_stmt->execute(); // Insert new attendance records $insert_query = "INSERT INTO attendance (student_id, group_id, session_date, session_time, is_present, homework_level, has_test, test_total_score, student_test_score, teacher_notes) VALUES (:student_id, :group_id, :session_date, :session_time, :is_present, :homework_level, :has_test, :test_total_score, :student_test_score, :teacher_notes)"; $insert_stmt = $conn->prepare($insert_query); foreach ($attendance_data as $student_id => $data) { $is_present = isset($data['present']) ? 1 : 0; $homework_level = !empty($data['homework']) ? $data['homework'] : null; $has_test = isset($data['has_test']) ? 1 : 0; $test_total_score = $has_test && !empty($data['test_total']) ? floatval($data['test_total']) : null; $student_test_score = $has_test && !empty($data['test_score']) ? floatval($data['test_score']) : null; $teacher_notes = !empty($data['notes']) ? trim($data['notes']) : null; // Validate test scores if ($has_test && $test_total_score && $student_test_score && $student_test_score > $test_total_score) { throw new Exception('درجة الطالب لا يمكن أن تكون أكبر من الدرجة الكلية'); } $insert_stmt->bindParam(':student_id', $student_id); $insert_stmt->bindParam(':group_id', $group_id); $insert_stmt->bindParam(':session_date', $session_date); $insert_stmt->bindParam(':session_time', $session_time); $insert_stmt->bindParam(':is_present', $is_present); $insert_stmt->bindParam(':homework_level', $homework_level); $insert_stmt->bindParam(':has_test', $has_test); $insert_stmt->bindParam(':test_total_score', $test_total_score); $insert_stmt->bindParam(':student_test_score', $student_test_score); $insert_stmt->bindParam(':teacher_notes', $teacher_notes); $insert_stmt->execute(); } $conn->commit(); $message = 'تم حفظ الحضور بنجاح'; $message_type = 'success'; } catch (Exception $e) { $conn->rollback(); $message = $e->getMessage(); $message_type = 'danger'; } } } } } // Get selected group ID from URL $selected_group_id = $_GET['group_id'] ?? null; // Get teacher's groups $groups_query = "SELECT g.id, g.name, CONCAT(st.name, ' - ', gr.name, ' - ', sub.name) as full_info FROM groups g JOIN grades gr ON g.grade_id = gr.id JOIN stages st ON gr.stage_id = st.id JOIN subjects sub ON g.subject_id = sub.id WHERE g.teacher_id = :teacher_id AND g.is_active = 1 ORDER BY g.name"; $groups_stmt = $conn->prepare($groups_query); $groups_stmt->bindParam(':teacher_id', $teacher_id); $groups_stmt->execute(); $groups = $groups_stmt->fetchAll(PDO::FETCH_ASSOC); // Get students for selected group $students = []; if ($selected_group_id) { $students_query = "SELECT s.*, (SELECT COUNT(*) FROM attendance a WHERE a.student_id = s.id AND a.is_present = 0) as absence_count FROM students s JOIN groups g ON s.group_id = g.id WHERE s.group_id = :group_id AND g.teacher_id = :teacher_id AND s.is_active = 1 ORDER BY s.name"; $students_stmt = $conn->prepare($students_query); $students_stmt->bindParam(':group_id', $selected_group_id); $students_stmt->bindParam(':teacher_id', $teacher_id); $students_stmt->execute(); $students = $students_stmt->fetchAll(PDO::FETCH_ASSOC); } $page_title = 'تسجيل الحضور'; include '../includes/header.php'; ?> <div class="container-fluid"> <div class="row"> <!-- Sidebar --> <div class="col-lg-3 col-md-4 sidebar p-0"> <div class="d-flex flex-column h-100"> <div class="p-3 text-white"> <h4 class="mb-0"> <i class="fas fa-chalkboard-teacher me-2"></i> لوحة المعلم </h4> <small>مرحباً <?php echo $_SESSION['teacher_name']; ?></small> </div> <nav class="nav nav-pills flex-column p-3"> <a class="nav-link" href="dashboard.php"> <i class="fas fa-tachometer-alt me-2"></i>الرئيسية </a> <a class="nav-link" href="subjects_grades.php"> <i class="fas fa-book me-2"></i>المواد والصفوف </a> <a class="nav-link" href="groups.php"> <i class="fas fa-users me-2"></i>المجموعات </a> <a class="nav-link" href="students.php"> <i class="fas fa-user-graduate me-2"></i>الطلاب </a> <a class="nav-link active" href="attendance.php"> <i class="fas fa-clipboard-check me-2"></i>تسجيل الحضور </a> <a class="nav-link" href="makeup_sessions.php"> <i class="fas fa-redo me-2"></i>حصص التعويض </a> <a class="nav-link" href="reports.php"> <i class="fas fa-chart-bar me-2"></i>التقارير </a> <div class="mt-auto"> <a class="nav-link text-light" href="../logout.php"> <i class="fas fa-sign-out-alt me-2"></i>تسجيل الخروج </a> </div> </nav> </div> </div> <!-- Main Content --> <div class="col-lg-9 col-md-8 main-content p-4"> <div class="d-flex justify-content-between align-items-center mb-4"> <h2>تسجيل الحضور</h2> </div> <!-- Messages --> <?php if (!empty($message)): ?> <div class="alert alert-<?php echo $message_type; ?> alert-dismissible fade show" role="alert"> <i class="fas fa-<?php echo $message_type == 'success' ? 'check-circle' : 'exclamation-triangle'; ?> me-2"></i> <?php echo $message; ?> <button type="button" class="btn-close" data-bs-dismiss="alert"></button> </div> <?php endif; ?> <!-- Group Selection --> <div class="card mb-4"> <div class="card-header"> <h5 class="mb-0">اختيار المجموعة</h5> </div> <div class="card-body"> <?php if (empty($groups)): ?> <div class="alert alert-warning"> <i class="fas fa-exclamation-triangle me-2"></i> لا توجد مجموعات متاحة. يرجى إنشاء مجموعة أولاً. <a href="groups.php" class="btn btn-sm btn-warning ms-2"> <i class="fas fa-plus me-1"></i>إنشاء مجموعة </a> </div> <?php else: ?> <div class="row"> <div class="col-md-6"> <form method="GET" action=""> <select class="form-select" name="group_id" onchange="this.form.submit()"> <option value="">اختر المجموعة</option> <?php foreach ($groups as $group): ?> <option value="<?php echo $group['id']; ?>" <?php echo $selected_group_id == $group['id'] ? 'selected' : ''; ?>> <?php echo htmlspecialchars($group['name'] . ' - ' . $group['full_info']); ?> </option> <?php endforeach; ?> </select> </form> </div> </div> <?php endif; ?> </div> </div> <!-- Attendance Form --> <?php if ($selected_group_id && !empty($students)): ?> <div class="card"> <div class="card-header"> <h5 class="mb-0">تسجيل الحضور</h5> </div> <div class="card-body"> <form method="POST" action=""> <input type="hidden" name="group_id" value="<?php echo $selected_group_id; ?>"> <input type="hidden" name="action" value="save_attendance"> <!-- Session Details --> <div class="row mb-4"> <div class="col-md-4"> <label for="sessionDate" class="form-label">تاريخ الحصة</label> <input type="date" class="form-control" id="sessionDate" name="session_date" value="<?php echo date('Y-m-d'); ?>" required> </div> <div class="col-md-4"> <label for="sessionTime" class="form-label">وقت الحصة</label> <input type="time" class="form-control" id="sessionTime" name="session_time" value="<?php echo date('H:i'); ?>" required> </div> <div class="col-md-4 d-flex align-items-end"> <div class="form-check"> <input class="form-check-input" type="checkbox" id="hasTestGlobal" onchange="toggleGlobalTest()"> <label class="form-check-label" for="hasTestGlobal"> يوجد اختبار في هذه الحصة </label> </div> </div> </div> <!-- Global Test Settings --> <div id="globalTestSettings" class="row mb-4" style="display: none;"> <div class="col-md-6"> <label for="globalTestTotal" class="form-label">الدرجة الكلية للاختبار</label> <input type="number" class="form-control" id="globalTestTotal" step="0.01" min="0" onchange="updateAllTestTotals()"> </div> </div> <!-- Students Attendance --> <div class="table-responsive"> <table class="table table-bordered"> <thead class="table-light"> <tr> <th>اسم الطالب</th> <th>الحضور</th> <th>مستوى الواجب</th> <th>اختبار</th> <th>الدرجة الكلية</th> <th>درجة الطالب</th> <th>ملاحظات</th> </tr> </thead> <tbody> <?php foreach ($students as $student): ?> <tr <?php echo $student['absence_count'] > 3 ? 'class="table-warning"' : ''; ?>> <td> <strong><?php echo htmlspecialchars($student['name']); ?></strong> <?php if ($student['absence_count'] > 3): ?> <br><small class="text-danger">يحتاج متابعة (<?php echo $student['absence_count']; ?> غياب)</small> <?php endif; ?> </td> <td> <div class="form-check"> <input class="form-check-input" type="checkbox" name="attendance[<?php echo $student['id']; ?>][present]" id="present_<?php echo $student['id']; ?>" checked> <label class="form-check-label" for="present_<?php echo $student['id']; ?>"> حاضر </label> </div> </td> <td> <select class="form-select form-select-sm" name="attendance[<?php echo $student['id']; ?>][homework]"> <option value="">لا يوجد</option> <option value="ممتاز">ممتاز</option> <option value="جيد جداً">جيد جداً</option> <option value="جيد">جيد</option> <option value="مقبول">مقبول</option> <option value="ضعيف">ضعيف</option> </select> </td> <td> <div class="form-check"> <input class="form-check-input test-checkbox" type="checkbox" name="attendance[<?php echo $student['id']; ?>][has_test]" id="test_<?php echo $student['id']; ?>" onchange="toggleTestFields(<?php echo $student['id']; ?>)"> <label class="form-check-label" for="test_<?php echo $student['id']; ?>"> اختبار </label> </div> </td> <td> <input type="number" class="form-control form-control-sm test-total" name="attendance[<?php echo $student['id']; ?>][test_total]" id="test_total_<?php echo $student['id']; ?>" step="0.01" min="0" disabled onchange="validateTestScore(<?php echo $student['id']; ?>)"> </td> <td> <input type="number" class="form-control form-control-sm test-score" name="attendance[<?php echo $student['id']; ?>][test_score]" id="test_score_<?php echo $student['id']; ?>" step="0.01" min="0" disabled onchange="validateTestScore(<?php echo $student['id']; ?>)"> </td> <td> <textarea class="form-control form-control-sm" name="attendance[<?php echo $student['id']; ?>][notes]" rows="2" placeholder="ملاحظات المعلم"></textarea> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> <div class="text-center mt-4"> <button type="submit" class="btn btn-success btn-lg"> <i class="fas fa-save me-2"></i>حفظ الحضور </button> </div> </form> </div> </div> <?php elseif ($selected_group_id): ?> <div class="card"> <div class="card-body text-center py-5"> <i class="fas fa-user-graduate fa-3x text-muted mb-3"></i> <h5>لا يوجد طلاب في هذه المجموعة</h5> <p class="text-muted">يرجى إضافة طلاب للمجموعة أولاً</p> <a href="students.php?group_id=<?php echo $selected_group_id; ?>" class="btn btn-primary"> <i class="fas fa-plus me-2"></i>إضافة طلاب </a> </div> </div> <?php endif; ?> </div> </div> </div> <script> function toggleGlobalTest() { const hasTest = document.getElementById('hasTestGlobal').checked; const globalSettings = document.getElementById('globalTestSettings'); const testCheckboxes = document.querySelectorAll('.test-checkbox'); if (hasTest) { globalSettings.style.display = 'block'; testCheckboxes.forEach(checkbox => { checkbox.checked = true; toggleTestFields(checkbox.id.split('_')[1]); }); } else { globalSettings.style.display = 'none'; document.getElementById('globalTestTotal').value = ''; testCheckboxes.forEach(checkbox => { checkbox.checked = false; toggleTestFields(checkbox.id.split('_')[1]); }); } } function updateAllTestTotals() { const totalScore = document.getElementById('globalTestTotal').value; document.querySelectorAll('.test-total').forEach(input => { if (!input.disabled) { input.value = totalScore; } }); } function toggleTestFields(studentId) { const hasTest = document.getElementById(`test_${studentId}`).checked; const totalField = document.getElementById(`test_total_${studentId}`); const scoreField = document.getElementById(`test_score_${studentId}`); totalField.disabled = !hasTest; scoreField.disabled = !hasTest; if (!hasTest) { totalField.value = ''; scoreField.value = ''; } else { const globalTotal = document.getElementById('globalTestTotal').value; if (globalTotal) { totalField.value = globalTotal; } } } function validateTestScore(studentId) { const total = parseFloat(document.getElementById(`test_total_${studentId}`).value) || 0; const score = parseFloat(document.getElementById(`test_score_${studentId}`).value) || 0; if (score > total) { alert('درجة الطالب لا يمكن أن تكون أكبر من الدرجة الكلية'); document.getElementById(`test_score_${studentId}`).value = total; } } </script> <?php include '../includes/footer.php'; ?>
Save Changes
Cancel / Back
Close ×
Server Info
Hostname: premium320.web-hosting.com
Server IP: 66.29.153.54
PHP Version: 8.2.29
Server Software: LiteSpeed
System: Linux premium320.web-hosting.com 4.18.0-553.50.1.lve.el8.x86_64 #1 SMP Thu Apr 17 19:10:24 UTC 2025 x86_64
HDD Total: 97.87 GB
HDD Free: 76.87 GB
Domains on IP: N/A (Requires external lookup)
System Features
Safe Mode:
Off
disable_functions:
None
allow_url_fopen:
On
allow_url_include:
Off
magic_quotes_gpc:
Off
register_globals:
Off
open_basedir:
None
cURL:
Enabled
ZipArchive:
Enabled
MySQLi:
Enabled
PDO:
Enabled
wget:
Yes
curl (cmd):
Yes
perl:
Yes
python:
Yes (py3)
gcc:
Yes
pkexec:
No
git:
Yes
User Info
Username: aoneqssk
User ID (UID): 1285
Group ID (GID): 1290
Script Owner UID: 1285
Current Dir Owner: 1285