Path : /home/vishqocm/pcib.in/admin/
File Upload :
Current File : /home/vishqocm/pcib.in/admin/record_attendance.php

<?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">&times;</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">&times;</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'); ?>