37970-vm/reports.php
Flatlogic Bot d987612018 v3
2026-01-30 14:44:46 +00:00

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'; ?>