/home/techb158/ileadtechnology.com/SSM/app/Repositories/exam
NameSizeModeActions
ExamRepository.php78680644editdlrm
OnlineExamRepository.php272810644editdlrm
RecordRepository.php178300644editdlrm
ReportAnalysisRepository.php123070644editdlrm
ReportRepository.php399860644editdlrm
ScheduleRepository.php150910644editdlrm
Edit: /home/techb158/ileadtechnology.com/SSM/app/Repositories/exam/ReportRepository.php (39986B)
course_group = $course_group; $this->batch = $batch; $this->class_teacher = $class_teacher; $this->student_record = $student_record; $this->exam_schedule = $exam_schedule; $this->exam = $exam; $this->exam_term = $exam_term; $this->holiday = $holiday; $this->attendance = $attendance; } /** * Get exam report pre requisite. * * @return Array */ public function getPreRequisite() { $batches = $this->course_group->getBatchOption(); $exams = $this->exam->summary()->filterBySession()->get(); $exam_terms = $this->exam_term->filterBySession()->get(); $data = array(); foreach ($exams as $exam) { $exam_name = $exam->name; if ($exam->exam_term_id) { $exam_name .= ' ('.$exam->term->courseGroup->name.')'; } $data[] = array( 'id' => $exam->id, 'name' => $exam_name, 'course_group_id' => $exam->exam_term_id ? $exam->term->course_group_id : null, 'course_group_name' => $exam->exam_term_id ? $exam->term->courseGroup->name : null, ); } $types = [ array('text' => trans('exam.all_term_report'), 'value' => 'all_term'), array('text' => trans('exam.term_wise_report'), 'value' => 'term_wise'), array('text' => trans('exam.exam_wise_report'), 'value' => 'exam_wise'), array('text' => trans('exam.no_term_wise_report'), 'value' => 'no_term') ]; $exams = $data; return compact('batches', 'types', 'exams', 'exam_terms'); } /** * Get students for exam report * * @param array $array * @return array */ public function getStudents($params = array()) { $batch_id = gv($params, 'batch_id'); $batch = $this->batch->findOrFail($batch_id); $query = $this->student_record->with('student', 'batch')->filterBySession()->filterbyBatchId($batch_id); if (\Auth::user()->hasRole(config('system.default_role.parent'))) { $student_ids = \Auth::user()->Parent->Students->pluck('id')->all(); $query->whereHas('student', function ($q) use ($student_ids) { $q->whereIn('id', $student_ids); }); } elseif (\Auth::user()->hasRole(config('system.default_role.student'))) { $student_id = \Auth::user()->Student->id; $query->whereHas('student', function ($q) use ($student_id) { $q->where('id', $student_id); }); } if (\Auth::user()->can('access-exam-report')) { } elseif (\Auth::user()->can('access-class-teacher-wise-exam-report')) { $class_teachers = $this->getClassTeachers($batch_id); if (! amIClassTeacherOnDate($class_teachers)) { $query->whereNull('id'); } } $student_records = $query->select('student_records.*', \DB::raw('(SELECT concat_ws(" ", first_name,middle_name,last_name) FROM students WHERE student_records.student_id = students.id ) as name'))->orderBy('name','asc')->get(); $students = new StudentListCollection($student_records); return compact('students'); } /** * Get class teachers for exam report * @param integer $batch_id * @return ClassTeacher */ private function getClassTeachers($batch_id) { $class_teachers = $this->class_teacher->filterByBatchId($batch_id)->orderBy('date_effective', 'desc')->get(['employee_id','date_effective']); $employee_id = optional(\Auth::user()->Employee)->id; foreach ($class_teachers as $class_teacher) { $class_teacher->is_me = ($class_teacher->employee_id == $employee_id) ? true : false; } return $class_teachers; } public function getReport($params) { $batch_id = gv($params, 'batch_id'); $batch = $this->batch->findOrFail($batch_id); $student_record_id = gv($params, 'student_record_id'); $query = $this->student_record->with('student', 'admission', 'batch', 'batch.course', 'batch.subjects', 'student.parent'); if (\Auth::user()->hasRole(config('system.default_role.parent'))) { $student_ids = \Auth::user()->Parent->Students->pluck('id')->all(); $query->whereHas('student', function ($q) use ($student_ids) { $q->whereIn('id', $student_ids); }); } elseif (\Auth::user()->hasRole(config('system.default_role.student'))) { $student_id = \Auth::user()->Student->id; $query->whereHas('student', function ($q) use ($student_id) { $q->where('id', $student_id); }); } if (\Auth::user()->can('access-exam-report')) { } elseif (\Auth::user()->can('access-class-teacher-wise-exam-report')) { $class_teachers = $this->getClassTeachers($batch_id); if (! amIClassTeacherOnDate($class_teachers)) { $query->whereNull('id'); } } $student_record = $query->filterById($student_record_id)->first(); if (! $student_record) { throw ValidationException::withMessages(['message' => trans('user.permission_denied')]); } $type = gv($params, 'type'); $exam_term_id = gv($params, 'exam_term_id'); $exam_id = gv($params, 'exam_id'); if ($type == 'term_wise' && ! $exam_term_id) { throw ValidationException::withMessages(['message' => trans('validation.required', ['attribute' => trans('exam.term')])]); } if ($type == 'exam_wise' && ! $exam_id) { throw ValidationException::withMessages(['message' => trans('validation.required', ['attribute' => trans('exam.exam')])]); } $summary = array(); $term_header = array(); $header = array(); if ($type == 'all_term' || $type == 'term_wise') { $exam_terms = $this->exam_term->with([ 'exams', 'exams.schedules' => function ($q1) use ($batch_id) { $q1->where('batch_id', $batch_id); }, 'exams.schedules.assessment', 'exams.schedules.assessment.details', 'exams.schedules.records', 'exams.schedules.records.subject' ])->filterBySession()->whereHas('exams', function ($q2) use ($batch_id) { $q2->whereHas('schedules', function ($q3) use ($batch_id) { $q3->where('batch_id', $batch_id); }); })->when($exam_term_id, function ($query, $exam_term_id) { return $query->where('id', $exam_term_id); })->orderBy('position', 'asc')->get(); $previous_colspan = 0; foreach ($exam_terms as $exam_term) { $colspan = 0; $header = $this->getHeader($exam_term->exams, $header); foreach ($header as $value) { $colspan += count(gv($value, 'assessment_details')); } array_push($term_header, array( 'id' => $exam_term->id, 'name' => $exam_term->name, 'colspan' => $colspan - $previous_colspan )); $previous_colspan = $colspan; } } else { $exams = $this->exam->filterBySession()->with([ 'schedules' => function ($q1) use ($batch_id) { $q1->where('batch_id', $batch_id); }, 'schedules.grade', 'schedules.grade.details', 'schedules.assessment', 'schedules.assessment.details', 'schedules.records', 'schedules.records.subject' ])->whereHas('schedules', function ($q2) use ($batch_id) { $q2->where('batch_id', $batch_id); })->when($exam_id, function ($query, $exam_id) { return $query->where('id', $exam_id); })->when($type === 'no_term', function($query, $type) { return $query->where('exam_term_id', null); })->orderBy('position', 'asc')->get(); $header = $this->getHeader($exams, $header); } $summary['term_header'] = $term_header; $summary['header'] = $header; $subjects = array(); $exam_total = array(); $subject_assessment_total = array(); $exam_assessment_total = array(); $assessment_total = array(); $last_date = config('config.default_academic_session.start_date'); foreach ($student_record->batch->subjects->sortBy('position') as $subject) { $marks = array(); $has_no_exam = false; foreach ($header as $exam) { $single_assessment_detail_id = gv($exam, 'single_assessment_detail_id'); $records = gv($exam, 'records'); $show_subject_total = gbv($exam, 'show_subject_total'); $grade = gv($exam, 'grade'); $schedule_id = gv($exam, 'schedule_id'); $assessment_details = gv($exam, 'assessment_details'); $record = $records->firstWhere('subject_id', $subject->id); $student_marks = $record ? ($record->marks ? : []) : []; $date = $record ? toDate($record->date) : null; $student_mark = searchByKey($student_marks, 'id', $student_record->id); if ($date && $student_marks) { $last_date = $last_date > $date ? $last_date : $date; } $is_absent = gbv($student_mark, 'is_absent'); $obtained_marks = gv($student_mark, 'assessment_details', []); $subject_total = ''; foreach ($assessment_details as $assessment_detail) { $assessment_detail_id = gv($assessment_detail, 'id', 0); $assessment_detail_max_mark = gv($assessment_detail, 'max_mark'); $assessment_detail_is_applicable = 1; if ($record && $record->getOption('assessment_details')) { if ($assessment_detail_id > 0) { $assess_detail = searchByKey($record->getOption('assessment_details'), 'id', $assessment_detail_id); $assessment_detail_is_applicable = gbv($assess_detail, 'is_applicable'); $assessment_detail_max_mark = ($assessment_detail_is_applicable) ? gv($assess_detail, 'max_mark', 0) : 0; } else { $assessment_detail_max_mark = 0; foreach ($record->getOption('assessment_details') as $assess_detail) { $assessment_detail_max_mark += gbv($assess_detail, 'is_applicable') ? gv($assess_detail, 'max_mark', 0) : 0; } } } $obtained_mark = searchByKey($obtained_marks, 'id', $assessment_detail_id); if ($date && $assessment_detail_is_applicable) { if ($is_absent) { $mark = trans('exam.absent_code'); } elseif ($obtained_mark) { $is_absent = gbv($obtained_mark, 'is_absent'); $mark = $is_absent ? config('exam.absent_code') : (float) gv($obtained_mark, 'ob', 0); } else { $mark = ''; } } else { $mark = '-'; } if ($assessment_detail_id > 0) { if (is_numeric($mark)) { $subject_total = is_numeric($subject_total) ? $subject_total : 0; $subject_total += $mark; } } elseif (! $assessment_detail_id) { $mark = $subject_total; } $assessment_total[$schedule_id][$assessment_detail_id] = isset($assessment_total[$schedule_id][$assessment_detail_id]) ? $assessment_total[$schedule_id][$assessment_detail_id] : 0; if (is_numeric($assessment_total[$schedule_id][$assessment_detail_id]) && $date && $assessment_detail_id > 0) { $assessment_total[$schedule_id][$assessment_detail_id] += $assessment_detail_max_mark; } $exam_assessment_total[$schedule_id] = isset($exam_assessment_total[$schedule_id]) ? $exam_assessment_total[$schedule_id] : 0; if (is_numeric($exam_assessment_total[$schedule_id]) && $date && $assessment_detail_id > 0) { $exam_assessment_total[$schedule_id] += $assessment_detail_max_mark; } if (is_numeric($mark)) { if ($assessment_detail_id >= 0) { $subject_assessment_total[$schedule_id][$assessment_detail_id] = isset($subject_assessment_total[$schedule_id][$assessment_detail_id]) && is_numeric($subject_assessment_total[$schedule_id][$assessment_detail_id]) ? $subject_assessment_total[$schedule_id][$assessment_detail_id] : 0; $subject_assessment_total[$schedule_id][$assessment_detail_id] += $mark; } if ($assessment_detail_id > 0) { $exam_total[$schedule_id] = isset($exam_total[$schedule_id]) && is_numeric($exam_total[$schedule_id]) ? $exam_total[$schedule_id] : 0; $exam_total[$schedule_id] += $mark; } } else { $subject_assessment_total[$schedule_id][$assessment_detail_id] = isset($subject_assessment_total[$schedule_id][$assessment_detail_id]) ? $subject_assessment_total[$schedule_id][$assessment_detail_id] : $mark; $exam_total[$schedule_id] = isset($exam_total[$schedule_id]) ? $exam_total[$schedule_id] : $mark; } if ($assessment_detail_id < 1) { $mark = is_numeric($subject_total) ? $subject_total : ($date ? ($is_absent ? trans('exam.absent_code') : '') : '-'); } if ($grade && is_numeric($mark) && $assessment_detail_id == -1) { $mark = $this->getGrade($mark, $assessment_detail_max_mark, $grade); } $marks[] = $mark; } if ($grade && $assessment_detail_id < 0) { $max_mark = $show_subject_total ? $subject_assessment_total[$schedule_id][0] : ($single_assessment_detail_id ? $subject_assessment_total[$schedule_id][$single_assessment_detail_id] : 0); $subject_assessment_total[$schedule_id][-1] = $this->getGrade($max_mark, $exam_assessment_total[$schedule_id], $grade, 1); } } $subjects[] = array( 'id' => $subject->id, 'code' => $subject->code, 'name' => $subject->name, 'shortcode' => $subject->shortcode, 'marks' => $marks ); } foreach ($subjects as $index => $subject) { $unique = array_values(array_unique($subject['marks'])); if (count($unique) === 1 && $unique[0] == '-') { unset($subjects[$index]); } } $summary['subjects'] = $subjects; $summary['assessment_total'] = $assessment_total; $summary['exam_assessment_total'] = $exam_assessment_total; $summary['subject_assessment_total'] = $subject_assessment_total; $summary['exam_total'] = $exam_total; $observation_term_header = array(); $observation_header = array(); $batch->load('observation', 'observation.details', 'grade', 'grade.details'); if ($type == 'all_term' || $type == 'term_wise') { $observation_exam_terms = $this->getExams($batch, $exam_term_id, null, $type); foreach ($observation_exam_terms as $exam_term) { $include_term = 0; foreach ($exam_term->exams as $exam) { $schedule = $exam->schedules->first(); if ($schedule && $schedule->observation_marks) { array_push($observation_header, array( 'exam_id' => $exam->id, 'name' => $exam->name, 'schedule' => $schedule )); $include_term++; } } if ($include_term) { array_push($observation_term_header, array( 'id' => $exam_term->id, 'name' => $exam_term->name, 'colspan' => $exam_term->exams->count() )); } } } else { $observation_exams = $this->getExams($batch, null, $exam_id ? $exam_id : null, $type); foreach ($observation_exams as $exam) { $schedule = $exam->schedules->first(); if ($schedule->observation_marks) { array_push($observation_header, array( 'exam_id' => $exam->id, 'name' => $exam->name, 'schedule' => $schedule )); } } } $observation_params = array(); $observation_enabled = 0; $observation_details = $batch->exam_observation_id ? $batch->observation->details : []; foreach ($observation_details as $detail) { $marks = array(); foreach ($observation_header as $exam) { $schedule = gv($exam, 'schedule'); $observation_marks = $schedule->observation_marks; if ($schedule->observation_marks) { $observation_enabled = 1; } $observation_mark = searchByKey($observation_marks, 'id', $student_record->id); $obtained_marks = gv($observation_mark, 'observation_details', []); $obtained_mark = searchByKey($obtained_marks, 'id', $detail->id); $mark = gv($obtained_mark, 'ob', 0); if (is_numeric($mark)) { array_push($marks, $this->getGrade($mark, $detail->max_mark, $batch->grade)); } else { array_push($marks, ""); } } if ($observation_enabled) { $observation_params[] = array( 'id' => $detail->id, 'name' => $detail->name, 'marks' => $marks ); } } $last_date = (! $last_date) ? config('config.default_academic_session.end_date') : $last_date; $start_date = config('config.default_academic_session.start_date') >= toDate($student_record->date_of_entry) ? config('config.default_academic_session.start_date') : toDate($student_record->date_of_entry); $holidays = $this->holiday->filterBySession()->where('date', '<=', $last_date)->count(); $working_days = dateDiff($start_date, $last_date); $attendances = $this->attendance->dateOfAttendanceBetween(['start_date' => $start_date, 'end_date' => $last_date])->whereBatchId($batch_id)->where(function ($q) { $q->where(function ($q1) { $q1->whereNull('subject_id')->whereNull('session')->whereIsDefault(0); })->orWhere('is_default', 1); })->get(); $working_days = $attendances->count(); $total_absent = 0; foreach ($attendances as $attendance) { $absentees = $attendance->getAttendance('data'); if (searchByKey($absentees, 'id', $student_record->id)) { $total_absent++; } } $summary['observation_term_header'] = $observation_term_header; $summary['observation_header'] = $observation_header; $summary['observation_params'] = $observation_params; $summary['grade'] = isset($grade) ? $grade : null; $summary['working_days'] = $working_days; $summary['attendance'] = $working_days - $total_absent; $summary['attendance_percentage'] = $working_days ? round((($working_days - $total_absent) / $working_days) * 100, 2) : 0; return compact('student_record', 'summary'); } /** * Get headers for exam * @param Exam $exams * @param array $header * @return array */ private function getHeader($exams, $header = array()) { foreach ($exams as $exam) { $schedule = $exam->schedules->first(); if (! $schedule) { continue; } $assessment_details = $schedule->assessment->details->sortBy('position')->all(); $grade = $schedule->grade; $show_subject_total = (count($assessment_details) > 1) ? true : false; $single_assessment_detail_id = $schedule->assessment->details->first()->id; if ($show_subject_total) { array_push($assessment_details, array( 'id' => 0, 'name' => trans('exam.total'), 'code' => trans('exam.total_code'), 'position' => 100, 'max_mark' => $schedule->assessment->details->sum('max_mark'), 'pass_percentage' => 0 )); } if ($grade) { array_push($assessment_details, array( 'id' => -1, 'name' => trans('exam.grade'), 'code' => trans('exam.grade_code'), 'position' => 101, 'is_grading' => true, 'max_mark' => $schedule->assessment->details->sum('max_mark'), 'pass_percentage' => 0 )); } $records = $schedule->records; $header[] = array( 'exam_id' => $exam->id, 'schedule_id' => $schedule->id, 'name' => $exam->name, 'records' => $records, 'grade' => $grade, 'assessment_details' => $assessment_details, 'show_subject_total' => $show_subject_total, 'single_assessment_detail_id' => $single_assessment_detail_id, 'overall_pass_percentage' => $schedule->getOption('overall_pass_percentage'), 'show_result' => $schedule->getOption('show_result') ); } return $header; } /** * Get grade for given marks * @param numeric $mark * @param Grade $grade * @return string */ private function getGrade($mark, $max_mark, $grade, $show = false) { if (! is_numeric($mark) || ! $max_mark || ! is_numeric($max_mark)) { return; } if (! $grade) { return; } $percentage = round(formatNumber(($mark / $max_mark) * 100)); $grade_detail = $grade->details->sortByDesc('min_percentage')->filter(function ($elem, $key) use ($percentage) { return $elem->min_percentage <= $percentage && $elem->max_percentage >= $percentage; })->first(); if ($grade_detail) { return $grade_detail->name; } return; } /** * Get exam lists * @param Batch $batch * @param string $type * @return array */ private function getExams($batch, $exam_term_id, $exam_id, $type = null) { if (! $batch->exam_observation_id) { return []; } if ($type == 'all_term' || $type == 'term_wise') { return $this->exam_term->with([ 'exams', 'exams.schedules' => function ($q1) use ($batch) { $q1->where('batch_id', $batch->id); } ])->filterBySession()->whereHas('exams', function ($q2) use ($batch) { $q2->whereHas('schedules', function ($q3) use ($batch) { $q3->where('batch_id', $batch->id); }); })->when($exam_term_id, function ($query, $exam_term_id) { return $query->where('id', $exam_term_id); })->orderBy('position', 'asc')->get(); } else { $query = $this->exam->filterBySession(); if ($type != 'exam_wise') { $query->whereNull('exam_term_id'); } return $query->with([ 'schedules' => function ($q1) use ($batch) { $q1->where('batch_id', $batch->id); } ])->whereHas('schedules', function ($q2) use ($batch) { $q2->where('batch_id', $batch->id); })->when($exam_id, function ($query, $exam_id) { return $query->where('id', $exam_id); })->orderBy('position', 'asc')->get(); } } /** * Get topper list * @param array $params * @return array */ public function topperReport($params = array()) { $batch_id = gv($params, 'batch_id'); $exam_id = gv($params, 'exam_id'); if (\Auth::user()->hasAnyRole([config('system.default_role.student'), config('system.default_role.parent')])) { throw ValidationException::withMessages(['message' => trans('user.permission_denied')]); } if (! \Auth::user()->can('access-exam-report') && \Auth::user()->can('access-class-teacher-wise-exam-report')) { $class_teachers = $this->getClassTeachers($batch_id); if (! amIClassTeacherOnDate($class_teachers)) { throw ValidationException::withMessages(['message' => trans('user.permission_denied')]); } } $exam_schedule = $this->exam_schedule->with([ 'exam', 'assessment', 'assessment.details', 'grade', 'grade.details', 'records' => function ($q) { $q->whereNotNull('date')->orderBy('date', 'asc'); } ])->filterByExamId($exam_id)->filterByBatchId($batch_id)->first(); if (! $exam_schedule) { throw ValidationException::withMessages(['message' => trans('exam.could_not_find_schedule')]); } $batch = $this->batch->findOrFail($batch_id); $batch->load('subjects'); $last_date_of_exam = $exam_schedule->records->last()->date; $last_date_of_exam = toDate($last_date_of_exam); $student_records = $this->student_record->with('student', 'admission')->filterBySession()->filterbyBatchId($batch_id)->where('date_of_entry', '<=', $last_date_of_exam)->where(function ($q) use ($last_date_of_exam) { $q->where('date_of_exit', null)->orWhere(function ($q1) use ($last_date_of_exam) { $q1->where('date_of_exit', '!=', null)->where('date_of_exit', '>=', $last_date_of_exam); }); })->get(); $exam_assessment_details = $exam_schedule->assessment->details->sortBy('position'); $subjects = $batch->subjects->sortBy('position'); $header = array(); $assessment_header = array(); foreach ($subjects as $subject) { $record = $exam_schedule->records->where('date', '!=', null)->where('subject_id', $subject->id)->first(); if ($record) { $header[] = array('name' => $subject->code, 'shortcode' => $subject->shortcode, 'colspan' => $exam_assessment_details->count()); } } foreach ($exam_assessment_details as $exam_assessment_detail) { $assessment_header[] = $exam_assessment_detail->code; } $data = array(); foreach ($student_records as $student_record) { $row = array(); $student_total = 0; $max_mark = 0; foreach ($subjects as $subject) { $record = $exam_schedule->records->where('date', '!=', null)->where('subject_id', $subject->id)->first(); if (! $record) { continue; } $marks = $record->marks ? : []; $student_marks = searchByKey($marks, 'id', $student_record->id); $assessment_marks = gv($student_marks, 'assessment_details', []); $is_absent = gbv($student_marks, 'is_absent'); foreach ($exam_assessment_details as $exam_assessment_detail) { $assessment_detail_is_applicable = 1; $assessment_detail_max_mark = $exam_assessment_detail->max_mark; if ($record->getOption('assessment_details')) { if ($exam_assessment_detail->id > 0) { $assess_detail = searchByKey($record->getOption('assessment_details'), 'id', $exam_assessment_detail->id); $assessment_detail_is_applicable = gbv($assess_detail, 'is_applicable'); $assessment_detail_max_mark = ($assessment_detail_is_applicable) ? gv($assess_detail, 'max_mark', 0) : 0; // } else { // $assessment_detail_max_mark = 0; // foreach ($record->getOption('assessment_details') as $assess_detail) { // $assessment_detail_max_mark += gbv($assess_detail, 'is_applicable') ? gv($assess_detail, 'max_mark', 0) : 0; // } } } $max_mark += $assessment_detail_max_mark; $obtained_mark = searchByKey($assessment_marks, 'id', $exam_assessment_detail->id); if ($assessment_detail_is_applicable) { if ($is_absent) { $mark = trans('exam.absent_code'); } elseif ($obtained_mark) { $is_absent = gbv($obtained_mark, 'is_absent'); $mark = $is_absent ? config('exam.absent_code') : (float) gv($obtained_mark, 'ob', 0); } else { $mark = ''; } } else { $mark = '-'; } $student_total += (is_numeric($mark)) ? $mark : 0; array_push($row, $mark); } } $data['rows'][] = array( 'student' => $student_record->student->name, 'admission_number' => $student_record->admission->admission_number, 'marks' => $row, 'total' => $student_total, 'percentage' => ($max_mark) ? formatNumber(($student_total/$max_mark) * 100) : 0, 'grade' => ($exam_schedule->grade) ? $this->getGrade($student_total, $max_mark, $exam_schedule->grade) : null ); } array_multisort(array_column($data['rows'], 'total'), SORT_DESC, $data['rows']); $data['header'] = $header; $data['assessment_header'] = $assessment_header; $data['exam'] = $exam_schedule->exam->name; $data['batch'] = $batch->batch_with_course; $data['grade'] = $exam_schedule->grade ? true : false; return $data; } /** * Get student exam report * @param string $student_uuid * @param integer $student_record_id * @return array */ public function studentExamReport($student_uuid, $student_record_id) { $query = $this->student_record->with('batch', 'batch.subjects')->filterBySession()->whereId($student_record_id); if (\Auth::user()->hasRole(config('system.default_role.student'))) { $query->whereHas('student', function($q) use($student_uuid) { $q->whereUuid($student_uuid)->whereId(\Auth::user()->Student->id); }); } else if (\Auth::user()->hasRole(config('system.default_role.parent'))) { $query->whereHas('student', function($q) use($student_uuid) { $q->whereUuid($student_uuid)->whereIn('id', \Auth::user()->Parent->Students->pluck('id')->all()); }); } else { $query->whereHas('student', function($q) use($student_uuid) { $q->whereUuid($student_uuid); }); } $student_record = $query->first(); if (! $student_record) { throw ValidationException::withMessages(['message' => trans('student.could_not_find')]); } $exam_schedules = $this->exam_schedule->with('exam', 'records', 'assessment', 'assessment.details')->filterBySession()->whereBatchId($student_record->batch_id)->get(); $rows = array(); $header[] = array('key' => 'subject_name', 'label' => trans('academic.subject'), 'description' => ''); foreach($exam_schedules as $index => $exam_schedule) { $exam_assessment_details = $exam_schedule->assessment->details->sortBy('position'); $exam_total = 0; $exam_max_mark_total = 0; $columns = array(); $no_exams = $exam_schedule->records->count(); foreach ($student_record->batch->subjects as $subject_index => $subject) { if ($index === 0) { $header[] = array('key' => 'subject_'.$subject->id, 'label' => $subject->name, 'description' => ''); } if ($subject_index === 0) { $columns[] = array('key' => 'exam_schedule_'.$exam_schedule->id, 'label' => $exam_schedule->exam->name, 'description' => ''); } $record = $exam_schedule->records->where('date','!=',null)->where('subject_id', $subject->id)->first(); if (! $record) { $no_exams--; $columns[] = array('key' => 'marks_'.$exam_schedule->id.'_'.$subject->id, 'label' => '-', 'description' => ''); } else { $marks = $record->marks ? : []; $student_marks = searchByKey($marks, 'id', $student_record->id); $assessment_marks = gv($student_marks, 'assessment_details', []); $is_absent = gbv($student_marks, 'is_absent'); $ob_marks = array(); $subject_total = 0; $max_mark = 0; $no_subject_exam = $exam_assessment_details->count(); foreach ($exam_assessment_details as $exam_assessment_detail) { $assessment_detail_is_applicable = 1; $assessment_detail_max_mark = $exam_assessment_detail->max_mark; if ($record->getOption('assessment_details')) { if ($exam_assessment_detail->id > 0) { $assess_detail = searchByKey($record->getOption('assessment_details'), 'id', $exam_assessment_detail->id); $assessment_detail_is_applicable = gbv($assess_detail, 'is_applicable'); $assessment_detail_max_mark = ($assessment_detail_is_applicable) ? gv($assess_detail, 'max_mark', 0) : 0; } } $max_mark += $assessment_detail_max_mark; $obtained_mark = searchByKey($assessment_marks, 'id', $exam_assessment_detail->id); if ($assessment_detail_is_applicable) { if ($is_absent) { $mark = trans('exam.absent_code'); } elseif ($obtained_mark) { $is_absent = gbv($obtained_mark, 'is_absent'); $mark = $is_absent ? config('exam.absent_code') : (float) gv($obtained_mark, 'ob', 0); } else { $no_subject_exam--; $mark = ''; } } else { $mark = '-'; } $ob_marks[] = array( 'assessment_detail_name' => $exam_assessment_detail->name, 'assessment_detail_code' => $exam_assessment_detail->code, 'assessment_detail_max_mark' => $assessment_detail_max_mark, 'mark' => $mark ); $subject_total += (is_numeric($mark)) ? $mark : 0; $exam_total += (is_numeric($mark)) ? $mark : 0; $exam_max_mark_total += $assessment_detail_max_mark; } if ($no_subject_exam === 0) { $no_exams--; } $columns[] = array('key' => 'marks_'.$exam_schedule->id.'_'.$subject->id, 'label' => $subject_total, 'detail' => $ob_marks, 'description' => ''); } } $columns[] = array('key' => 'total_'.$exam_schedule->id, 'label' => $exam_total.'/'.$exam_max_mark_total, 'detail' => '', 'no_exams' => ($no_exams === 0 ? 1 : 0), 'description' => ''); $columns[] = array('key' => 'percentage_'.$exam_schedule->id, 'label' => ($exam_max_mark_total ? round(($exam_total / $exam_max_mark_total) * 100, 2) : ''), 'detail' => '', 'no_exams' => ($no_exams === 0 ? 1 : 0), 'description' => ''); $rows[] = $columns; } $header[] = array('key' => 'total', 'label' => trans('general.total'), 'description' => ''); $header[] = array('key' => 'percentage', 'label' => trans('exam.percentage'), 'description' => ''); return compact('header', 'rows'); } }