123 lines
5.6 KiB
PHP
123 lines
5.6 KiB
PHP
<?php
|
|
session_start();
|
|
require_once 'db/config.php';
|
|
|
|
if (!isset($_SESSION['user_id']) || !in_array($_SESSION['role'], ['Admin', 'Teacher', 'Super Admin'])) {
|
|
header('Location: login.php');
|
|
exit;
|
|
}
|
|
|
|
$school_id = $_SESSION['school_id'];
|
|
$role = $_SESSION['role'];
|
|
|
|
// Fetch grade-level averages
|
|
$query = "
|
|
SELECT
|
|
l.grade,
|
|
AVG((m.marks_obtained / a.total_marks) * 100) as average_percentage,
|
|
COUNT(DISTINCT l.id) as student_count,
|
|
COUNT(DISTINCT a.id) as assessment_count
|
|
FROM learners l
|
|
JOIN marks m ON l.id = m.learner_id
|
|
JOIN assessments a ON m.assessment_id = a.id
|
|
WHERE l.school_id = :school_id
|
|
GROUP BY l.grade
|
|
ORDER BY l.grade ASC
|
|
";
|
|
$stmt = db()->prepare($query);
|
|
$stmt->execute(['school_id' => $school_id]);
|
|
$grade_stats = $stmt->fetchAll();
|
|
|
|
$pageTitle = "Grade Performance Analytics";
|
|
include 'includes/header.php';
|
|
?>
|
|
|
|
<div class="container mt-5">
|
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<h2><i class="bi bi-bar-chart-line me-2"></i>Grade Performance Analytics</h2>
|
|
<button onclick="window.print()" class="btn btn-outline-primary d-print-none">
|
|
<i class="bi bi-printer me-2"></i>Print Report
|
|
</button>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-12 mb-4">
|
|
<div class="card shadow-sm border-0">
|
|
<div class="card-body">
|
|
<h5 class="card-title mb-4">Grade-Level Comparison</h5>
|
|
<?php if (empty($grade_stats)): ?>
|
|
<div class="alert alert-info">No assessment data available for comparison yet.</div>
|
|
<?php else: ?>
|
|
<div class="table-responsive">
|
|
<table class="table table-hover align-middle">
|
|
<thead class="table-light">
|
|
<tr>
|
|
<th>Grade</th>
|
|
<th>Avg. Performance</th>
|
|
<th>Students</th>
|
|
<th>Assessments</th>
|
|
<th>Status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($grade_stats as $stat): ?>
|
|
<?php
|
|
$avg = round($stat['average_percentage'], 1);
|
|
$badgeClass = $avg >= 70 ? 'bg-success' : ($avg >= 50 ? 'bg-warning text-dark' : 'bg-danger');
|
|
?>
|
|
<tr>
|
|
<td class="fw-bold"><?php echo htmlspecialchars($stat['grade']); ?></td>
|
|
<td>
|
|
<div class="d-flex align-items-center">
|
|
<div class="progress flex-grow-1 me-3" style="height: 10px;">
|
|
<div class="progress-bar <?php echo $badgeClass; ?>" role="progressbar" style="width: <?php echo $avg; ?>%"></div>
|
|
</div>
|
|
<span class="fw-bold"><?php echo $avg; ?>%</span>
|
|
</div>
|
|
</td>
|
|
<td><?php echo $stat['student_count']; ?></td>
|
|
<td><?php echo $stat['assessment_count']; ?></td>
|
|
<td>
|
|
<span class="badge <?php echo $badgeClass; ?>">
|
|
<?php echo $avg >= 70 ? 'Excellent' : ($avg >= 50 ? 'Satisfactory' : 'Critical'); ?>
|
|
</span>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row mt-4">
|
|
<div class="col-md-6 mb-4">
|
|
<div class="card h-100 shadow-sm border-0 bg-light">
|
|
<div class="card-body">
|
|
<h6><i class="bi bi-info-circle me-2"></i>Insights</h6>
|
|
<p class="text-muted small">
|
|
This data represents the average score across all subjects and assessments for each grade level in your school.
|
|
Use this to identify grades that may require additional resources or intervention.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6 mb-4">
|
|
<div class="card h-100 shadow-sm border-0 bg-light">
|
|
<div class="card-body">
|
|
<h6><i class="bi bi-lightbulb me-2"></i>Recommendations</h6>
|
|
<ul class="text-muted small">
|
|
<li>Grades below 50% should be flagged for curriculum review.</li>
|
|
<li>High-performing grades can serve as models for peer-teacher coaching.</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<?php include 'includes/footer.php'; ?>
|