291 lines
14 KiB
PHP
291 lines
14 KiB
PHP
<?php
|
|
require_once __DIR__ . '/db/config.php';
|
|
session_start();
|
|
|
|
// Auth Check
|
|
if (!isset($_SESSION['user_id']) || !in_array($_SESSION['role'], ['Teacher', 'Admin'])) {
|
|
header('Location: login.php');
|
|
exit;
|
|
}
|
|
|
|
$db = db();
|
|
$school_id = $_SESSION['school_id'];
|
|
$pageTitle = 'Reporting Center | SOMS';
|
|
|
|
// Fetch school info for report header
|
|
$stmt = $db->prepare("SELECT * FROM schools WHERE id = ?");
|
|
$stmt->execute([$school_id]);
|
|
$school = $stmt->fetch();
|
|
|
|
$report_type = $_GET['type'] ?? null;
|
|
$learner_id = $_GET['learner_id'] ?? null;
|
|
$assessment_id = $_GET['assessment_id'] ?? null;
|
|
|
|
$report_data = null;
|
|
$learner_info = null;
|
|
$assessment_info = null;
|
|
|
|
if ($report_type === 'learner' && $learner_id) {
|
|
// Fetch learner transcript
|
|
$stmt = $db->prepare("SELECT * FROM learners WHERE id = ? AND school_id = ?");
|
|
$stmt->execute([$learner_id, $school_id]);
|
|
$learner_info = $stmt->fetch();
|
|
|
|
if ($learner_info) {
|
|
$stmt = $db->prepare("
|
|
SELECT a.name, a.type, a.total_marks, m.marks_obtained, a.created_at
|
|
FROM marks m
|
|
JOIN assessments a ON m.assessment_id = a.id
|
|
WHERE m.learner_id = ?
|
|
ORDER BY a.created_at DESC
|
|
");
|
|
$stmt->execute([$learner_id]);
|
|
$report_data = $stmt->fetchAll();
|
|
}
|
|
} elseif ($report_type === 'class' && $assessment_id) {
|
|
// Fetch class report for an assessment
|
|
$stmt = $db->prepare("SELECT * FROM assessments WHERE id = ? AND school_id = ?");
|
|
$stmt->execute([$assessment_id, $school_id]);
|
|
$assessment_info = $stmt->fetch();
|
|
|
|
if ($assessment_info) {
|
|
$stmt = $db->prepare("
|
|
SELECT l.full_name, l.student_id, m.marks_obtained
|
|
FROM learners l
|
|
LEFT JOIN marks m ON l.id = m.learner_id AND m.assessment_id = ?
|
|
WHERE l.school_id = ? AND l.grade = ?
|
|
ORDER BY l.full_name ASC
|
|
");
|
|
$stmt->execute([$assessment_id, $school_id, $assessment_info['grade']]);
|
|
$report_data = $stmt->fetchAll();
|
|
}
|
|
}
|
|
|
|
// Fetch lists for selection
|
|
$stmt = $db->prepare("SELECT id, full_name, grade, student_id FROM learners WHERE school_id = ? ORDER BY grade, full_name");
|
|
$stmt->execute([$school_id]);
|
|
$all_learners = $stmt->fetchAll();
|
|
|
|
$stmt = $db->prepare("SELECT id, name, grade, type FROM assessments WHERE school_id = ? ORDER BY created_at DESC");
|
|
$stmt->execute([$school_id]);
|
|
$all_assessments = $stmt->fetchAll();
|
|
|
|
include 'includes/header.php';
|
|
?>
|
|
|
|
<div class="container pb-5">
|
|
<div class="row mb-4 no-print">
|
|
<div class="col-12">
|
|
<h2 class="h4 mb-1">Reporting Center</h2>
|
|
<p class="text-muted small">Generate academic transcripts and class performance reports</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row g-4 no-print">
|
|
<!-- Learner Report Selection -->
|
|
<div class="col-md-6">
|
|
<div class="card shadow-sm border-0">
|
|
<div class="card-body p-4 text-center">
|
|
<i class="bi bi-person-badge text-primary mb-3" style="font-size: 2.5rem;"></i>
|
|
<h5 class="fw-bold">Learner Transcript</h5>
|
|
<p class="text-muted small">Academic history for a specific student</p>
|
|
<form method="GET" class="mt-3">
|
|
<input type="hidden" name="type" value="learner">
|
|
<div class="mb-3">
|
|
<select name="learner_id" class="form-select" required>
|
|
<option value="">Select Learner</option>
|
|
<?php foreach ($all_learners as $l): ?>
|
|
<option value="<?= $l['id'] ?>" <?= $learner_id == $l['id'] ? 'selected' : '' ?>>
|
|
Grade <?= $l['grade'] ?> - <?= htmlspecialchars($l['full_name']) ?> (<?= $l['student_id'] ?>)
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary w-100">Generate Report</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Class Report Selection -->
|
|
<div class="col-md-6">
|
|
<div class="card shadow-sm border-0">
|
|
<div class="card-body p-4 text-center">
|
|
<i class="bi bi-people text-secondary mb-3" style="font-size: 2.5rem;"></i>
|
|
<h5 class="fw-bold">Class Performance</h5>
|
|
<p class="text-muted small">Full class results for a specific assessment</p>
|
|
<form method="GET" class="mt-3">
|
|
<input type="hidden" name="type" value="class">
|
|
<div class="mb-3">
|
|
<select name="assessment_id" class="form-select" required>
|
|
<option value="">Select Assessment</option>
|
|
<?php foreach ($all_assessments as $a): ?>
|
|
<option value="<?= $a['id'] ?>" <?= $assessment_id == $a['id'] ? 'selected' : '' ?>>
|
|
Grade <?= $a['grade'] ?> - <?= htmlspecialchars($a['name']) ?> (<?= $a['type'] ?>)
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
<button type="submit" class="btn btn-secondary w-100">Generate Report</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<?php if ($report_type && $report_data): ?>
|
|
<div class="mt-5 report-container">
|
|
<div class="card shadow-sm border-0">
|
|
<div class="card-body p-5">
|
|
<!-- Report Header -->
|
|
<div class="d-flex justify-content-between align-items-start mb-5 border-bottom pb-4">
|
|
<div>
|
|
<h1 class="h3 fw-bold mb-1"><?= htmlspecialchars($school['name'] ?? 'School Report') ?></h1>
|
|
<p class="text-muted mb-0"><?= htmlspecialchars($school['location'] ?? 'South Africa') ?></p>
|
|
<p class="text-muted small">Generated on: <?= date('d F Y, H:i') ?></p>
|
|
</div>
|
|
<div class="text-end no-print">
|
|
<button onclick="window.print()" class="btn btn-dark shadow-sm">
|
|
<i class="bi bi-printer me-2"></i> Print to PDF
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<?php if ($report_type === 'learner' && $learner_info): ?>
|
|
<div class="mb-4">
|
|
<h4 class="fw-bold text-center mb-4">ACADEMIC TRANSCRIPT</h4>
|
|
<div class="row">
|
|
<div class="col-6">
|
|
<p class="mb-1"><strong>Name:</strong> <?= htmlspecialchars($learner_info['full_name']) ?></p>
|
|
<p class="mb-1"><strong>Student ID:</strong> <?= htmlspecialchars($learner_info['student_id']) ?></p>
|
|
</div>
|
|
<div class="col-6 text-end">
|
|
<p class="mb-1"><strong>Grade:</strong> <?= htmlspecialchars($learner_info['grade']) ?></p>
|
|
<p class="mb-1"><strong>Status:</strong> Active</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<table class="table table-bordered mt-4">
|
|
<thead class="bg-light">
|
|
<tr>
|
|
<th>Date</th>
|
|
<th>Assessment</th>
|
|
<th>Type</th>
|
|
<th class="text-center">Score</th>
|
|
<th class="text-center">Percentage</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php
|
|
$total_perc = 0;
|
|
$count = 0;
|
|
foreach ($report_data as $row):
|
|
$perc = ($row['marks_obtained'] / $row['total_marks']) * 100;
|
|
$total_perc += $perc;
|
|
$count++;
|
|
?>
|
|
<tr>
|
|
<td><?= date('d M Y', strtotime($row['created_at'])) ?></td>
|
|
<td><?= htmlspecialchars($row['name']) ?></td>
|
|
<td><?= htmlspecialchars($row['type']) ?></td>
|
|
<td class="text-center"><?= $row['marks_obtained'] ?> / <?= $row['total_marks'] ?></td>
|
|
<td class="text-center"><strong><?= round($perc, 1) ?>%</strong></td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
<?php if ($count > 0): ?>
|
|
<tfoot class="bg-light fw-bold">
|
|
<tr>
|
|
<td colspan="4" class="text-end">Average Performance:</td>
|
|
<td class="text-center"><?= round($total_perc / $count, 1) ?>%</td>
|
|
</tr>
|
|
</tfoot>
|
|
<?php endif; ?>
|
|
</table>
|
|
<?php endif; ?>
|
|
|
|
<?php if ($report_type === 'class' && $assessment_info): ?>
|
|
<div class="mb-4">
|
|
<h4 class="fw-bold text-center mb-4">CLASS PERFORMANCE REPORT</h4>
|
|
<div class="text-center mb-4">
|
|
<h5 class="mb-1"><?= htmlspecialchars($assessment_info['name']) ?></h5>
|
|
<p class="text-muted">Grade <?= htmlspecialchars($assessment_info['grade']) ?> | <?= htmlspecialchars($assessment_info['type']) ?> | Max Marks: <?= $assessment_info['total_marks'] ?></p>
|
|
</div>
|
|
</div>
|
|
<table class="table table-bordered mt-4">
|
|
<thead class="bg-light">
|
|
<tr>
|
|
<th>Student ID</th>
|
|
<th>Learner Name</th>
|
|
<th class="text-center">Marks Obtained</th>
|
|
<th class="text-center">Percentage</th>
|
|
<th class="text-center">Status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php
|
|
$total_marks = 0;
|
|
$present_count = 0;
|
|
foreach ($report_data as $row):
|
|
$has_marks = $row['marks_obtained'] !== null;
|
|
if ($has_marks) {
|
|
$perc = ($row['marks_obtained'] / $assessment_info['total_marks']) * 100;
|
|
$total_marks += $perc;
|
|
$present_count++;
|
|
}
|
|
?>
|
|
<tr>
|
|
<td><?= htmlspecialchars($row['student_id']) ?></td>
|
|
<td><?= htmlspecialchars($row['full_name']) ?></td>
|
|
<td class="text-center"><?= $has_marks ? $row['marks_obtained'] : '<span class="text-muted">N/A</span>' ?></td>
|
|
<td class="text-center"><?= $has_marks ? '<strong>'.round($perc, 1).'%</strong>' : '-' ?></td>
|
|
<td class="text-center">
|
|
<?php if ($has_marks): ?>
|
|
<span class="badge <?= $perc >= 50 ? 'bg-success' : 'bg-danger' ?> no-print">
|
|
<?= $perc >= 50 ? 'Pass' : 'Fail' ?>
|
|
</span>
|
|
<span class="d-none d-print-inline">
|
|
<?= $perc >= 50 ? 'Pass' : 'Fail' ?>
|
|
</span>
|
|
<?php else: ?>
|
|
<span class="text-muted">Absent/Pending</span>
|
|
<?php endif; ?>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
<?php if ($present_count > 0): ?>
|
|
<tfoot class="bg-light fw-bold">
|
|
<tr>
|
|
<td colspan="3" class="text-end">Class Average:</td>
|
|
<td class="text-center"><?= round($total_marks / $present_count, 1) ?>%</td>
|
|
<td></td>
|
|
</tr>
|
|
</tfoot>
|
|
<?php endif; ?>
|
|
</table>
|
|
<?php endif; ?>
|
|
|
|
<div class="mt-5 pt-4 border-top">
|
|
<div class="row">
|
|
<div class="col-4 text-center">
|
|
<div class="border-top pt-2 mt-4" style="border-top-style: dashed !important;">
|
|
<small class="text-muted">Teacher Signature</small>
|
|
</div>
|
|
</div>
|
|
<div class="col-4"></div>
|
|
<div class="col-4 text-center">
|
|
<div class="border-top pt-2 mt-4" style="border-top-style: dashed !important;">
|
|
<small class="text-muted">Principal Signature</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<?php include 'includes/footer.php'; ?>
|