<?php
// Start session
session_start();
$pageTitle = "Record Attendance";
include_once('includes/header.php');
// Check if admin/instructor is logged in
if (!isset($_SESSION['user_id']) || ($_SESSION['role'] !== 'admin' && $_SESSION['role'] !== 'instructor' && $_SESSION['role'] !== 'director')) {
header("Location: ../login.php");
exit();
}
// Get courses taught by the instructor (or all courses for admin/director)
$user_id = $_SESSION['user_id'];
$is_admin = ($_SESSION['role'] === 'admin' || $_SESSION['role'] === 'director');
if ($is_admin) {
// Admins can see all courses
$courses_query = "SELECT id, title FROM courses WHERE status = 'active' ORDER BY title";
$stmt = $conn->prepare($courses_query);
} else {
// Instructors see only their courses
$courses_query = "SELECT id, title FROM courses WHERE instructor_id = ? AND status = 'active' ORDER BY title";
$stmt = $conn->prepare($courses_query);
$stmt->bind_param("i", $user_id);
}
$stmt->execute();
$courses_result = $stmt->get_result();
// Check if we are processing a form submission
$attendance_saved = false;
$error_message = "";
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_attendance'])) {
try {
// Start transaction
$conn->begin_transaction();
$course_id = $_POST['course_id'];
$attendance_date = $_POST['attendance_date'];
$students = $_POST['students'] ?? [];
$statuses = $_POST['status'] ?? [];
$notes = $_POST['notes'] ?? [];
// Validate inputs
if (empty($course_id) || empty($attendance_date)) {
throw new Exception("Course and date are required");
}
// Format date
$formatted_date = date('Y-m-d', strtotime($attendance_date));
// Delete existing attendance records for this date and course
$delete_query = "DELETE FROM attendance
WHERE course_id = ? AND date = ?";
$stmt = $conn->prepare($delete_query);
$stmt->bind_param("is", $course_id, $formatted_date);
$stmt->execute();
// Insert new attendance records
$insert_query = "INSERT INTO attendance
(enrollment_id, course_id, student_id, date, status, notes, marked_by)
VALUES (?, ?, ?, ?, ?, ?, ?)";
$stmt = $conn->prepare($insert_query);
foreach ($students as $key => $student_id) {
// Get enrollment_id
$enrollment_query = "SELECT id FROM enrollments
WHERE user_id = ? AND course_id = ? AND status = 'active'";
$enroll_stmt = $conn->prepare($enrollment_query);
$enroll_stmt->bind_param("ii", $student_id, $course_id);
$enroll_stmt->execute();
$enrollment_result = $enroll_stmt->get_result();
if ($enrollment_result->num_rows > 0) {
$enrollment = $enrollment_result->fetch_assoc();
$enrollment_id = $enrollment['id'];
$status = $statuses[$key] ?? 'absent';
$note = $notes[$key] ?? '';
// Insert attendance record
$stmt->bind_param("iiisssi", $enrollment_id, $course_id, $student_id, $formatted_date, $status, $note, $user_id);
$stmt->execute();
}
}
// Commit transaction
$conn->commit();
$attendance_saved = true;
} catch (Exception $e) {
// Rollback transaction on error
$conn->rollback();
$error_message = $e->getMessage();
}
}
// Get selected course details
$selected_course_id = isset($_GET['course_id']) ? intval($_GET['course_id']) : (isset($_POST['course_id']) ? intval($_POST['course_id']) : 0);
$selected_date = isset($_GET['date']) ? $_GET['date'] : (isset($_POST['attendance_date']) ? $_POST['attendance_date'] : date('Y-m-d'));
// Get students enrolled in the selected course
$students_data = [];
if ($selected_course_id > 0) {
$students_query = "
SELECT
u.id,
u.first_name,
u.last_name,
u.email,
e.id as enrollment_id,
e.enrollment_date,
(SELECT status FROM attendance WHERE student_id = u.id AND course_id = ? AND date = ? LIMIT 1) as attendance_status,
(SELECT notes FROM attendance WHERE student_id = u.id AND course_id = ? AND date = ? LIMIT 1) as attendance_notes
FROM
users u
JOIN
enrollments e ON u.id = e.user_id
WHERE
e.course_id = ? AND e.status = 'active'
ORDER BY
u.first_name, u.last_name
";
$formatted_date = date('Y-m-d', strtotime($selected_date));
$stmt = $conn->prepare($students_query);
$stmt->bind_param("isisi", $selected_course_id, $formatted_date, $selected_course_id, $formatted_date, $selected_course_id);
$stmt->execute();
$students_result = $stmt->get_result();
while ($row = $students_result->fetch_assoc()) {
$students_data[] = $row;
}
}
?>
<div class="container-fluid py-4">
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 mb-0 text-gray-800">Record Attendance</h1>
</div>
<?php if ($attendance_saved): ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<i class="fas fa-check-circle mr-2"></i> Attendance recorded successfully!
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<?php endif; ?>
<?php if (!empty($error_message)): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<i class="fas fa-exclamation-circle mr-2"></i> Error: <?php echo htmlspecialchars($error_message); ?>
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<?php endif; ?>
<!-- Course and Date Selection Form -->
<div class="card shadow mb-4">
<div class="card-header py-3">
<h6 class="m-0 font-weight-bold text-primary">Select Course and Date</h6>
</div>
<div class="card-body">
<form method="GET" action="" id="courseSelectForm">
<div class="row">
<div class="col-md-5">
<div class="form-group">
<label for="course_id">Course:</label>
<select class="form-control" id="course_id" name="course_id" required onchange="this.form.submit()">
<option value="">-- Select Course --</option>
<?php while ($course = $courses_result->fetch_assoc()): ?>
<option value="<?php echo $course['id']; ?>" <?php echo ($course['id'] == $selected_course_id) ? 'selected' : ''; ?>>
<?php echo htmlspecialchars($course['title']); ?>
</option>
<?php endwhile; ?>
</select>
</div>
</div>
<div class="col-md-5">
<div class="form-group">
<label for="date">Date:</label>
<input type="date" class="form-control" id="date" name="date" value="<?php echo $selected_date; ?>" required onchange="this.form.submit()">
</div>
</div>
<div class="col-md-2 d-flex align-items-end">
<button type="submit" class="btn btn-primary btn-block">
<i class="fas fa-search"></i> View
</button>
</div>
</div>
</form>
</div>
</div>
<?php if ($selected_course_id > 0): ?>
<!-- Attendance Form -->
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">
Attendance for
<?php
$stmt = $conn->prepare("SELECT title FROM courses WHERE id = ? LIMIT 1");
$stmt->bind_param("i", $selected_course_id);
$stmt->execute();
$course_title = $stmt->get_result()->fetch_assoc()['title'] ?? 'Unknown Course';
echo htmlspecialchars($course_title) . ' - ' . date('F d, Y', strtotime($selected_date));
?>
</h6>
<div>
<button type="button" class="btn btn-sm btn-success" id="markAllPresent">
<i class="fas fa-check"></i> Mark All Present
</button>
<button type="button" class="btn btn-sm btn-danger" id="markAllAbsent">
<i class="fas fa-times"></i> Mark All Absent
</button>
</div>
</div>
<div class="card-body">
<?php if (empty($students_data)): ?>
<div class="alert alert-info">
<i class="fas fa-info-circle mr-2"></i> No students enrolled in this course.
</div>
<?php else: ?>
<form method="POST" action="">
<input type="hidden" name="course_id" value="<?php echo $selected_course_id; ?>">
<input type="hidden" name="attendance_date" value="<?php echo $selected_date; ?>">
<div class="table-responsive">
<table class="table table-bordered" id="attendanceTable">
<thead>
<tr>
<th width="5%">#</th>
<th width="30%">Student Name</th>
<th width="20%">Email</th>
<th width="15%">Status</th>
<th width="30%">Notes</th>
</tr>
</thead>
<tbody>
<?php foreach ($students_data as $index => $student): ?>
<tr>
<td><?php echo $index + 1; ?></td>
<td>
<?php echo htmlspecialchars($student['first_name'] . ' ' . $student['last_name']); ?>
<input type="hidden" name="students[]" value="<?php echo $student['id']; ?>">
</td>
<td><?php echo htmlspecialchars($student['email']); ?></td>
<td>
<select class="form-control status-select" name="status[]">
<option value="present" <?php echo $student['attendance_status'] === 'present' ? 'selected' : ''; ?>>Present</option>
<option value="absent" <?php echo $student['attendance_status'] === 'absent' ? 'selected' : ''; ?>>Absent</option>
<option value="late" <?php echo $student['attendance_status'] === 'late' ? 'selected' : ''; ?>>Late</option>
<option value="excused" <?php echo $student['attendance_status'] === 'excused' ? 'selected' : ''; ?>>Excused</option>
</select>
</td>
<td>
<input type="text" class="form-control" name="notes[]" placeholder="Optional notes" value="<?php echo htmlspecialchars($student['attendance_notes'] ?? ''); ?>">
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<div class="text-right mt-3">
<button type="submit" name="save_attendance" class="btn btn-primary">
<i class="fas fa-save"></i> Save Attendance
</button>
</div>
</form>
<?php endif; ?>
</div>
</div>
<?php elseif (isset($_GET['course_id'])): ?>
<div class="alert alert-warning">
<i class="fas fa-exclamation-triangle mr-2"></i> Invalid course selected.
</div>
<?php endif; ?>
</div>
<script>
$(document).ready(function() {
// Mark all students present
$('#markAllPresent').click(function() {
$('.status-select').val('present');
});
// Mark all students absent
$('#markAllAbsent').click(function() {
$('.status-select').val('absent');
});
// Initialize DataTable for attendance table if there are students
if ($('#attendanceTable tbody tr').length > 0) {
$('#attendanceTable').DataTable({
paging: false,
searching: true,
ordering: true,
info: false,
columnDefs: [
{ orderable: false, targets: [3, 4] }
]
});
}
});
</script>
<?php include_once('includes/footer.php'); ?>