@php if (!isset($students)) { $students = isset($student) ? collect([$student]) : collect(); } if (!isset($resultsQuery)) { $resultsQuery = collect(); foreach ($students as $st) { $resultsQuery->put($st->id, $st->results ?? collect()); } } if (!isset($subjects)) { $subjectIds = $resultsQuery->flatten()->pluck('subject_id')->unique()->filter(); $subjects = \App\Models\Subject::whereIn('id', $subjectIds)->get(); } if (!isset($filters)) { $lastRes = $students->first()?->results?->last(); $filters = [ 'term' => $lastRes?->term ?? 'Annual Exams', 'academic_year' => $lastRes?->academic_year ?? ($students->first()?->academic_year ?: date('Y')), 'month' => '' ]; } if (!isset($selectedClass)) { $selectedClass = $students->first()?->class_level ?? ''; } if (!isset($rankings)) { $rankings = []; } if (!isset($classTeacherMap)) { $classTeacherMap = []; } if (!isset($classTeacherSignatureMap)) { $classTeacherSignatureMap = []; } if (!isset($reportService)) { $reportService = new \App\Services\ReportCardService(); } @endphp @foreach($students as $student) @php $results = $resultsQuery->get($student->id, collect()); $totalScoreSum = 0; $subjectCount = 0; $marksList = []; $marksMap = []; foreach($results as $res) { if ($res->subject) { $subjName = strtoupper(trim($res->subject->subject_name)); if (!isset($marksMap[$subjName])) { $marksMap[$subjName] = $res; if ($res->total_score !== null) { $totalScoreSum += $res->total_score; $subjectCount++; $marksList[] = (float)$res->total_score; } } } } $rawAvg = $subjectCount > 0 ? ($totalScoreSum / $subjectCount) : 0; $isFiftyMarkClass = app(\App\Services\GradeService::class)->isFiftyMarkClass($selectedClass); $average = $isFiftyMarkClass ? round($rawAvg / 2, 1) : round($rawAvg, 1); $cleanClass = trim(strtolower($selectedClass ?? '')); $levelTitle = 'PRIMARY'; if (str_starts_with($cleanClass, 'kg') || str_contains($cleanClass, 'nursery') || str_contains($cleanClass, 'kindergarten') || str_contains($cleanClass, 'baby') || str_contains($cleanClass, 'pre-unit') || str_contains($cleanClass, 'pre unit')) { $levelTitle = 'NURSERY'; } elseif (str_starts_with($cleanClass, 'form') || str_contains($cleanClass, 'secondary') || str_contains($cleanClass, 'o-level') || str_contains($cleanClass, 'a-level')) { $levelTitle = 'SECONDARY'; } $studentClassTeacher = $classTeacherMap[$student->id] ?? null; if (empty($studentClassTeacher) && isset($classTeacherName) && count($students) <= 1) { $studentClassTeacher = $classTeacherName; } if (empty($studentClassTeacher)) { $stClass = trim((string)($student->class_level ?? $selectedClass ?? '')); $stStream = trim((string)($student->stream ?? '')); $matchCls = \App\Models\SchoolClass::with('teacher') ->where('class_level', $stClass) ->when(!empty($stStream) && strcasecmp($stStream, 'no stream') !== 0, function($q) use ($stStream) { $q->where('stream', $stStream); }) ->first(); if ($matchCls) { $studentClassTeacher = $matchCls->teacher ? $matchCls->teacher->name : $matchCls->class_teacher; } } $studentClassTeacherSignature = $classTeacherSignatureMap[$student->id] ?? null; if (empty($studentClassTeacherSignature) && isset($classTeacherSignature) && count($students) <= 1) { $studentClassTeacherSignature = $classTeacherSignature; } if (empty($studentClassTeacherSignature) && !empty($studentClassTeacher)) { $teacherUser = \App\Models\User::where('name', $studentClassTeacher)->first(); if ($teacherUser) { $studentClassTeacherSignature = \App\Models\Setting::get('teacher_signature_' . $teacherUser->id); } if (!$studentClassTeacherSignature) { $studentClassTeacherSignature = \App\Models\Setting::get('teacher_signature_name_' . md5(strtolower(trim($studentClassTeacher)))); } } @endphp
@php $logoBase64 = \App\Models\Setting::getLogoBase64(); @endphp @if($logoBase64) @else


[SCHOOL LOGO] @endif

{{ \App\Models\Setting::get('school_name', 'LUINDO SCHOOLS OF TANZANIA') }}

@php $motto = \App\Models\Setting::get('school_motto'); $address = \App\Models\Setting::get('school_address'); $contact = \App\Models\Setting::get('school_contact'); $email = \App\Models\Setting::get('school_email'); $website = \App\Models\Setting::get('school_website'); @endphp @if($motto)
"{{ $motto }}"
@endif

@if($address){{ $address }}
@endif @if($contact)Phone: {{ $contact }}@endif @if($email) | Email: {{ $email }}@endif @if($website)
Website: {{ $website }}@endif

STUDENT ACADEMIC REPORT
@if($student->photo && file_exists(storage_path('app/public/' . $student->photo))) @else
[STUDENT
PHOTO]
@endif
Admission No. : {{ $student->admission_number }} Academic Year : {{ $filters['academic_year'] ?? '' }}
Student Name : {{ $student->first_name }} {{ $student->last_name }} Term : {{ $filters['term'] ?? '' }}{{ !empty($filters['month']) ? ' (' . (\App\Services\ResultEntryService::getMonthName($filters['month']) ?? $filters['month']) . ')' : '' }}
Gender : {{ $student->gender ?? '—' }}
Class : {{ $selectedClass }}
@foreach($subjects as $subject) @php $subjName = strtoupper(trim($subject->subject_name)); $res = $marksMap[$subjName] ?? null; $mark = $res ? $res->total_score : ''; $grade = $res ? $res->grade : ''; $remarks = $res ? $res->remarks : ''; @endphp @endforeach
SUBJECT TOTAL (100%) GRADE REMARK
{{ $subject->subject_name }} {{ $mark }} {{ $grade }} {{ $remarks }}
@php $gradeService = app(\App\Services\GradeService::class); $gradeCalc = $gradeService->calculate($average, $isFiftyMarkClass ? 50 : 100, $selectedClass); $overallGrade = $gradeCalc['grade'] ?? '-'; $rawPos = $rankings[$student->id] ?? null; $position = '-'; if ($rawPos !== null && $rawPos !== '-' && $rawPos !== '—') { if (strpos((string)$rawPos, '/') !== false) { $position = (string)$rawPos; } else { $totalCount = isset($students) ? count($students) : (isset($rankings) ? count($rankings) : 0); $position = $totalCount > 0 ? "{$rawPos}/{$totalCount}" : (string)$rawPos; } } $division = '—'; $divisionPoints = null; if ($levelTitle === 'SECONDARY') { $divDetails = $gradeService->calculateDivisionDetails($marksList, $selectedClass); $division = $divDetails['division']; $divisionPoints = $divDetails['points']; } @endphp Total Score: {{ $totalScoreSum }}   |   Average: {{ $average }}   |   Grade: {{ $overallGrade }} @if($levelTitle !== 'NURSERY')   |   Position: {{ $position }} @endif @if($levelTitle === 'SECONDARY') @if($division !== '—' && $division !== '-')   |   Division: {{ $division }} @if($divisionPoints !== null)   |   Points: {{ $divisionPoints }} @endif @endif @endif
CLASS TEACHER COMMENTS
{{ $reportService->generateTeacherComment($overallGrade) }}
Teacher Name : @if(!empty($studentClassTeacher)) {{ $studentClassTeacher }} @elseif(!empty($classTeacherName) && count($students) <= 1) {{ $classTeacherName }} @else @endif
Signature : @if(!empty($studentClassTeacherSignature) && file_exists(storage_path('app/public/' . $studentClassTeacherSignature))) @else @endif
Date :       /      / 20  
HEADTEACHER COMMENTS
{{ $reportService->generateHeadTeacherComment($overallGrade, $levelTitle) }}
@php $htType = $levelTitle === 'SECONDARY' ? 'secondary' : 'primary'; $htName = \App\Models\Setting::get('headteacher_name_'.$htType, ''); $htSign = \App\Models\Setting::get('headteacher_signature_'.$htType, ''); @endphp
Headteacher Name : @if(!empty($htName)) {{ $htName }} @else @endif
Signature : @if($htSign && file_exists(storage_path('app/public/' . $htSign))) @else @endif
Date :       /      / 20  
@endforeach