{$icon}

{$t}

{$b}

"; } // ── SCHOOL CONFIG ───────────────────────────────────────────────────────────── $school = [ 'name' => 'TNT CORE ACADEMY', 'sub' => 'Mixed Day And Boarding', 'address' => 'P.O. Box 777, Kampala, Uganda', 'phone' => '0700000000 / 0700000001', 'email' => 'info@tntcore.info', 'website' => 'www.tntcore.info', 'motto' => 'EXCELLENCE IN ALL WE DO', 'term' => 'Term 1', 'year' => 2026, 'next_begin' => '2026-09-01', 'term_end' => '2026-08-22', 'logo' => 'assets/images/school_logo.png', ]; // ── HELPERS ─────────────────────────────────────────────────────────────────── function isALevel(string $cls): bool { return in_array(strtolower(trim($cls)), ['s5','s6','senior5','senior 5','senior6','senior 6'], true); } define('O_LEVEL_SUBJECT_SCALE', 3.0); function safeFloat(?string $v): ?float { if ($v === null || trim($v) === '') return null; $f = floatval($v); return $f >= 0 ? $f : null; } function avg(array $vals): ?float { $f = array_filter($vals, fn($x) => $x !== null); return count($f) ? array_sum($f) / count($f) : null; } function gradeFromAvg(?float $a): string { if ($a === null) return '–'; if ($a >= 80) return 'D1'; if ($a >= 75) return 'D2'; if ($a >= 70) return 'C3'; if ($a >= 65) return 'C4'; if ($a >= 60) return 'C5'; if ($a >= 55) return 'C6'; if ($a >= 50) return 'P7'; if ($a >= 45) return 'P8'; return 'F9'; } function descFromGrade(string $g): string { return match($g) { 'D1','D2'=>'DISTINCTION', 'C3','C4','C5','C6'=>'CREDIT', 'P7','P8'=>'PASS', 'F9'=>'FAIL', default=>'–' }; } function gradeColor(string $g): string { return match($g) { 'D1','D2'=>'#065f46', 'C3','C4','C5','C6'=>'#1e40af', 'P7','P8'=>'#92400e', default=>'#991b1b' }; } function avgColor(?float $a): string { if ($a===null) return '#94a3b8'; if ($a>=75) return '#065f46'; if ($a>=55) return '#1e40af'; if ($a>=45) return '#92400e'; return '#991b1b'; } function fmtN(?float $v, int $dp=1): string { return $v !== null ? number_format($v, $dp) : '–'; } function fmtRaw(?string $v): string { if ($v===null||trim($v)==='') return '–'; return htmlspecialchars(trim($v)); } // ── LOGO URI ────────────────────────────────────────────────────────────────── $logo_uri = ''; if (!empty($school['logo']) && file_exists($school['logo'])) { $ext = strtolower(pathinfo($school['logo'], PATHINFO_EXTENSION)); $mime = match($ext){'svg'=>'image/svg+xml','png'=>'image/png','gif'=>'image/gif','webp'=>'image/webp',default=>'image/jpeg'}; $logo_uri = "data:{$mime};base64,".base64_encode(file_get_contents($school['logo'])); } // ── SUBJECT MAPS ────────────────────────────────────────────────────────────── $o_subjects = [ '535'=>['name'=>'PHYSICS', 'suffix'=>'phy', 'compulsory'=>true], '545'=>['name'=>'CHEMISTRY', 'suffix'=>'chem', 'compulsory'=>true], '553'=>['name'=>'BIOLOGY', 'suffix'=>'bio', 'compulsory'=>true], '456'=>['name'=>'MATHEMATICS', 'suffix'=>'mtc', 'compulsory'=>true], '112'=>['name'=>'ENGLISH', 'suffix'=>'eng', 'compulsory'=>true], '241'=>['name'=>'HISTORY', 'suffix'=>'his', 'compulsory'=>true], '273'=>['name'=>'GEOGRAPHY', 'suffix'=>'geo', 'compulsory'=>true], '208'=>['name'=>'LITERATURE', 'suffix'=>'lit', 'compulsory'=>false], '321'=>['name'=>'CRE', 'suffix'=>'cre', 'compulsory'=>false], '322'=>['name'=>'IRE', 'suffix'=>'ire', 'compulsory'=>false], '411'=>['name'=>'AGRICULTURE', 'suffix'=>'agr', 'compulsory'=>false], '615'=>['name'=>'ART & DESIGN', 'suffix'=>'art', 'compulsory'=>false], '512'=>['name'=>'ENTREPRENEURSHIP', 'suffix'=>'ent', 'compulsory'=>false], '125'=>['name'=>'COMPUTER STUDIES', 'suffix'=>'comp', 'compulsory'=>false], ]; $a_subjects = [ 'P210'=>['name'=>'HISTORY', 'suffix'=>'his', 'papers'=>3], 'P615'=>['name'=>'ART', 'suffix'=>'art', 'papers'=>4], '123' =>['name'=>'GEOGRAPHY', 'suffix'=>'geo', 'papers'=>3], 'S101'=>['name'=>'G/PAPER', 'suffix'=>'gpaper','papers'=>1], '125' =>['name'=>'COMPUTER STUDIES', 'suffix'=>'comp', 'papers'=>1], 'P101'=>['name'=>'PHYSICS', 'suffix'=>'phy', 'papers'=>3], 'P201'=>['name'=>'CHEMISTRY', 'suffix'=>'chem', 'papers'=>3], 'P301'=>['name'=>'BIOLOGY', 'suffix'=>'bio', 'papers'=>3], 'P401'=>['name'=>'MATHEMATICS', 'suffix'=>'mtc', 'papers'=>2], 'P501'=>['name'=>'ECONOMICS', 'suffix'=>'eco', 'papers'=>3], 'P601'=>['name'=>'LITERATURE', 'suffix'=>'lit', 'papers'=>3], 'P701'=>['name'=>'ENTREPRENEURSHIP', 'suffix'=>'ent', 'papers'=>2], ]; // ── ADMIN CLASS LIST ────────────────────────────────────────────────────────── $all_classes = []; if ($is_admin) { $cq = $conn->query("SELECT DISTINCT class FROM students WHERE class IS NOT NULL ORDER BY class ASC"); if ($cq) while ($r = $cq->fetch_assoc()) $all_classes[] = trim($r['class']); } ?> Report Card — <?= htmlspecialchars($school['name']) ?>
Admin Dispatch Console Unified Matrix View ·
prepare( "SELECT s.id, s.first_name, s.last_name, s.class, s.stream, s.sex, s.username, s.photo, s.combination, IFNULL(sfb.total_billed,0.00) AS total_fees, IFNULL(sfb.total_paid,0.00) AS total_paid FROM students s LEFT JOIN student_term_registration str ON str.student_id = s.id LEFT JOIN student_fees_balances sfb ON sfb.registration_id = str.id ORDER BY s.class ASC, s.first_name ASC" ); } else { $stmt = $conn->prepare( "SELECT s.id, s.first_name, s.last_name, s.class, s.stream, s.sex, s.username, s.photo, s.combination, IFNULL(sfb.total_billed,0.00) AS total_fees, IFNULL(sfb.total_paid,0.00) AS total_paid FROM students s LEFT JOIN student_term_registration str ON str.student_id = s.id LEFT JOIN student_fees_balances sfb ON sfb.registration_id = str.id WHERE LOWER(s.username)=LOWER(?) LIMIT 1" ); $stmt->bind_param("s", $session_user); } $stmt->execute(); $students = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); $stmt->close(); if (empty($students)) { echo "
⚠️

No Student Record Found

No active profile matching your registration token.

"; exit(); } ?>
🔍

No Matching Records

Adjust your search or filter criteria.

0) { echo "
💳

Report Card Locked

Hello ".htmlspecialchars($fullname)." — outstanding balance of UGX ".number_format($balance).".

Please settle your dues at the bursar's office.
"; continue; } $photo_src = ''; $ph = trim($stu['photo'] ?? ''); if (!empty($ph) && file_exists($ph)) { $ext = strtolower(pathinfo($ph, PATHINFO_EXTENSION)); $mime = match($ext){'png'=>'image/png','gif'=>'image/gif','webp'=>'image/webp',default=>'image/jpeg'}; $photo_src = "data:{$mime};base64,".base64_encode(file_get_contents($ph)); } elseif (!empty($ph) && filter_var($ph, FILTER_VALIDATE_URL)) { $photo_src = $ph; } $marks = []; $ms = $conn->prepare("SELECT * FROM marksheet WHERE LOWER(username)=LOWER(?) LIMIT 1"); if ($ms) { $ms->bind_param("s",$uname); $ms->execute(); $marks=$ms->get_result()->fetch_assoc()??[]; $ms->close(); } $pay_code = ''; $pc = $conn->prepare("SELECT payment_code FROM student_term_registration WHERE student_id=? LIMIT 1"); if ($pc) { $pc->bind_param("i",$stu['id']); $pc->execute(); $pcr=$pc->get_result()->fetch_assoc(); $pay_code=$pcr['payment_code']??''; $pc->close(); } $cls_comment=$hd_comment=''; $next_begin=$school['next_begin']; $term_end=$school['term_end']; $treq=''; $cd=$conn->prepare("SELECT class_teacher_comment,head_teacher_comment,next_term_begins,term_ends,school_requirements FROM student_reports WHERE student_id=? LIMIT 1"); if ($cd) { $cd->bind_param("i",$stu['id']); $cd->execute(); $cdr=$cd->get_result()->fetch_assoc(); if ($cdr) { $cls_comment=$cdr['class_teacher_comment']??''; $hd_comment=$cdr['head_teacher_comment']??''; $next_begin=$cdr['next_term_begins']?:$next_begin; $term_end=$cdr['term_ends']?:$term_end; $treq=$cdr['school_requirements']??''; } $cd->close(); } $total_subjects_count = 0; $running_marks_sum = 0.0; $table_body_html = ''; ?>
Logo
TNT CORE
ACADEMY

| Tel:
Email: | Web:

""
Student Photo
No Photo
Attached
OFFICIAL STUDENT ACADEMIC REPORT CARD
Student Name
Student ID / Lin
Class Year
Gender / Sex
Term / Session
Payment Code
$subj) { $base = $cls.'_'.$subj['suffix']; $c1 = $marks[$base.'_c1'] ?? null; $c2 = $marks[$base.'_c2'] ?? null; $c3 = $marks[$base.'_c3'] ?? null; if ($c1 === null && $c2 === null && $c3 === null && !$subj['compulsory']) continue; $mid_val = safeFloat($c1); $mot_val = safeFloat($c2); $eot_val = safeFloat($c3); // End Term calculated as the average of MOT (C2) and EOT (C3) $end_term_val = avg([$mot_val, $eot_val]); // Mid and End averaged together for the final dynamic score $subject_avg = avg([$mid_val, $end_term_val]); if ($subject_avg !== null) { $running_marks_sum += $subject_avg; $total_subjects_count++; } $grade = gradeFromAvg($subject_avg); $initials = htmlspecialchars($marks[$base.'_init'] ?? '–'); echo ""; } } else { // ── A-LEVEL PROCESSING ── foreach ($a_subjects as $code => $subj) { $base = $cls.'_'.$subj['suffix']; $has_data = false; for ($p=1; $p<=$subj['papers']; $p++) { if (array_key_exists($base."_p{$p}_mot", $marks) || array_key_exists($base."_p{$p}_eot", $marks)) { $has_data = true; break; } } if (!$has_data) continue; $subject_mid_papers = []; $subject_end_papers = []; for ($p=1; $p<=$subj['papers']; $p++) { $p_mot = safeFloat($marks[$base."_p{$p}_mot"] ?? null); $p_eot = safeFloat($marks[$base."_p{$p}_eot"] ?? null); if ($p_mot !== null) $subject_mid_papers[] = $p_mot; if ($p_eot !== null) $subject_end_papers[] = $p_eot; } $mid_term_val = count($subject_mid_papers) ? array_sum($subject_mid_papers) / count($subject_mid_papers) : null; $end_term_val = count($subject_end_papers) ? array_sum($subject_end_papers) / count($subject_end_papers) : null; $subject_avg = avg([$mid_term_val, $end_term_val]); if ($subject_avg !== null) { $running_marks_sum += $subject_avg; $total_subjects_count++; } $grade = gradeFromAvg($subject_avg); $initials = htmlspecialchars($marks[$base.'_init'] ?? '–'); echo ""; } } if ($total_subjects_count > 0): $term_average = $running_marks_sum / $total_subjects_count; ?>
Subject Code Subject Name Mid End Average Grade Initials
{$code} ".htmlspecialchars($subj['name'])." ".fmtN($mid_val)." ".fmtN($end_term_val)." ".fmtN($subject_avg)." {$grade} {$initials}
{$code} ".htmlspecialchars($subj['name'])." ".fmtN($mid_term_val)." ".fmtN($end_term_val)." ".fmtN($subject_avg)." {$grade} {$initials}
Subjects Graded: Term Overall Mean Average:
No registered assessments found for this student.
Grading Scale Metrics Reference
D1 - D2: 75% - 100% (Distinction)
C3 - C6: 55% - 74% (Credit)
P7 - P8: 45% - 54% (Pass)
F9: 0% - 44% (Fail)
Class Teacher Comment
Head Teacher Comment
Requirements
Term Closing Date
Next Term Commencement
Class Teacher Signature
Head Teacher Signature
TNT CORE VALIDATED