Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 10 |
CRAP | |
0.00% |
0 / 340 |
| BlockStudentReasonService | |
0.00% |
0 / 1 |
|
0.00% |
0 / 10 |
3660.00 | |
0.00% |
0 / 340 |
| __construct | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 3 |
|||
| saveBlockStudentReason | |
0.00% |
0 / 1 |
56.00 | |
0.00% |
0 / 34 |
|||
| validateSaveBlockStudentReason | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 10 |
|||
| insertBlockStudentReason | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 14 |
|||
| updateBlockStudentReason | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 22 |
|||
| deleteBlockStudentReason | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 23 |
|||
| getBlockStudentReasons | |
0.00% |
0 / 1 |
90.00 | |
0.00% |
0 / 39 |
|||
| getBlockReasonsByRegistration | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 27 |
|||
| getBlockStudentReport | |
0.00% |
0 / 1 |
156.00 | |
0.00% |
0 / 89 |
|||
| getBlockedStudentDetails | |
0.00% |
0 / 1 |
110.00 | |
0.00% |
0 / 79 |
|||
| <?php | |
| namespace com\linways\ec\core\service; | |
| use com\linways\base\util\MakeSingletonTrait; | |
| use com\linways\base\util\SecurityUtils; | |
| use com\linways\ec\core\constant\StatusConstants; | |
| use com\linways\ec\core\exception\ExamControllerException; | |
| use com\linways\ec\core\dto\BlockStudentReason; | |
| use com\linways\ec\core\logging\Events; | |
| use com\linways\ec\core\logging\entities\Staff; | |
| use com\linways\core\ams\professional\logging\AMSLogger; | |
| use com\linways\core\ams\professional\service\StaffService; | |
| use com\linways\base\util\TwigRenderer; | |
| use com\linways\core\ams\professional\util\PdfUtil; | |
| use com\linways\ec\core\request\SearchExamRegistrationRequest; | |
| use com\linways\ec\core\service\ExamRegistrationService; | |
| class BlockStudentReasonService extends BaseService | |
| { | |
| use MakeSingletonTrait; | |
| private function __construct() | |
| { | |
| $this->logger = AMSLogger::getLogger('exam-controller-log'); | |
| } | |
| /** | |
| * Save Block Student Reason | |
| * @param BlockStudentReason $blockStudentReason | |
| * @return $id | |
| */ | |
| public function saveBlockStudentReason(BlockStudentReason $blockStudentReason){ | |
| $blockStudentReason = $this->realEscapeObject($blockStudentReason); | |
| $blockStudentReason->createdBy = $GLOBALS['userId']; | |
| $blockStudentReason->updatedBy = $GLOBALS['userId']; | |
| $staffId = $GLOBALS['userId']; | |
| try { | |
| $this->validateSaveBlockStudentReason($blockStudentReason); | |
| if (!empty($blockStudentReason->id)) { | |
| $blockStudentReason->id = $this->updateBlockStudentReason($blockStudentReason); | |
| } else { | |
| $blockStudentReason->id = $this->insertBlockStudentReason($blockStudentReason); | |
| } | |
| AMSLogger::log_info($this->logger,Events::EC_SAVE_STUDENT_REASON, [ | |
| "staff" => new Staff(["id" => $staffId]), | |
| "request" => $blockStudentReason, | |
| "status" => StatusConstants::SUCCESS | |
| ]); | |
| } catch (\Exception $e) { | |
| AMSLogger::log_error($this->logger,Events::EC_SAVE_STUDENT_REASON, [ | |
| "staff" => new Staff(["id" => $staffId]), | |
| "request" => $blockStudentReason, | |
| "errorCode" => $e->getCode(), | |
| "errorMessage" => $e->getMessage(), | |
| "status" => StatusConstants::FAILED | |
| ]); | |
| if ($e->getCode() !== ExamControllerException::INVALID_PARAMETERS && $e->getCode() !== ExamControllerException::EMPTY_PARAMETERS && $e->getCode() !== "DUPLICATE_ENTRY") { | |
| throw new ExamControllerException($e->getCode(), "Failed to save block reason Type! Please try again"); | |
| } else if ($e->getCode() === ExamControllerException::DUPLICATE_ENTRY) { | |
| throw new ExamControllerException(ExamControllerException::DUPLICATE_ENTRY, "Cannot create block reason.This block reason already created"); | |
| } else { | |
| throw new ExamControllerException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| return $blockStudentReason->id; | |
| } | |
| /** | |
| * Validate Block Student Reason Request Before Saving | |
| * @param BlockStudentReason $blockStudentReason | |
| * @return NULL | |
| */ | |
| private function validateSaveBlockStudentReason(BlockStudentReason $blockStudentReason){ | |
| if (empty($blockStudentReason->name)){ | |
| throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS, " Block reason name is empty!"); | |
| } | |
| else if (empty($blockStudentReason->type)){ | |
| throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS, " Block reason type is empty!"); | |
| } | |
| else if (empty($blockStudentReason->blockPrivilegeUser->staffs)){ | |
| throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS, " Block privilage staff missing!"); | |
| } | |
| } | |
| /** | |
| * Insert Block Student Reason | |
| * @param FeeBlockStudentReasonType $blockStudentReason | |
| * @return $id | |
| */ | |
| private function insertBlockStudentReason(BlockStudentReason $blockStudentReason){ | |
| $properties = !empty($blockStudentReason->properties) ? "'" . json_encode($blockStudentReason->properties) . "'" : "'{}'"; | |
| $contactPersonId = !empty($blockStudentReason->contactPersonId) ? "'" .$blockStudentReason->contactPersonId . "'" : "NULL"; | |
| $blockPrivilegeUser = !empty($blockStudentReason->blockPrivilegeUser) ? "'" . json_encode($blockStudentReason->blockPrivilegeUser) . "'" : "'{}'"; | |
| $query = "INSERT INTO ec_block_student_reason | |
| (name,type,contact_person_id,block_privilege_user,properties,created_by,updated_by) | |
| VALUES | |
| ('$blockStudentReason->name','$blockStudentReason->type',$contactPersonId,$blockPrivilegeUser,$properties,'$blockStudentReason->createdBy','$blockStudentReason->updatedBy')"; | |
| try { | |
| $blockStudentReason->id = $this->executeQuery($query,true)->id; | |
| return $blockStudentReason->id; | |
| } catch (\Exception $e) { | |
| throw new ExamControllerException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Update Block Student Reason | |
| * @param BlockStudentReason $blockStudentReason | |
| * @return $blockStudentReason->id | |
| */ | |
| private function updateBlockStudentReason(BlockStudentReason $blockStudentReason) | |
| { | |
| $properties = !empty($blockStudentReason->properties) ? "'" . json_encode($blockStudentReason->properties) . "'" : "'{}'"; | |
| $contactPersonId = !empty($blockStudentReason->contactPersonId) ? "'" .$blockStudentReason->contactPersonId . "'" : "NULL"; | |
| $blockPrivilegeUser = !empty($blockStudentReason->blockPrivilegeUser) ? "'" . json_encode($blockStudentReason->blockPrivilegeUser) . "'" : "'{}'"; | |
| $query = "UPDATE | |
| ec_block_student_reason | |
| SET | |
| name = '$blockStudentReason->name', | |
| type = '$blockStudentReason->type', | |
| contact_person_id = $contactPersonId, | |
| block_privilege_user = $blockPrivilegeUser, | |
| properties = $properties, | |
| updated_by = '$blockStudentReason->updatedBy' | |
| WHERE | |
| id = '$blockStudentReason->id'"; | |
| try { | |
| $this->executeQuery($query); | |
| return $blockStudentReason->id; | |
| } catch (\Exception $e) { | |
| throw new ExamControllerException($e->getCode(), $e->getMessage()); | |
| } | |
| } | |
| /** | |
| * Delete Block Student Reason | |
| * @param String $id | |
| * @return NULL | |
| */ | |
| public function deleteBlockStudentReason($id){ | |
| $id = $this->realEscapeString($id); | |
| $staffId = $GLOBALS['userId']; | |
| $blockStudentReason = new \stdClass(); | |
| $blockStudentReason->id = $id; | |
| $currentBlockStudentReasonDetails = reset($this->getBlockStudentReasons($blockStudentReason)); | |
| if(empty($currentBlockStudentReasonDetails)){ | |
| throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Can't delete ! Block reason missing."); | |
| } | |
| $query = "DELETE FROM | |
| ec_block_student_reason | |
| WHERE | |
| id = '$id'"; | |
| try { | |
| $this->executeQuery($query); | |
| // LOGGING | |
| AMSLogger::log_info($this->logger,Events::EC_DELETE_STUDENT_REASON, [ | |
| "staff" => new Staff(["id" => $staffId]), | |
| "request" => $currentBlockStudentReasonDetails, | |
| "status" => StatusConstants::SUCCESS | |
| ]); | |
| }catch (\Exception $e) { | |
| throw new ExamControllerException(ExamControllerException::HAVE_RELATION,"Error deleting Block reason! Please try again"); | |
| } | |
| } | |
| /** | |
| * get Block Student Reason | |
| * @param $searchRequest | |
| * @return $blockStudentReasons | |
| */ | |
| public function getBlockStudentReasons($searchRequest){ | |
| $searchRequest = $this->realEscapeObject($searchRequest); | |
| try { | |
| $whereQuery = null; | |
| $whereQuery = ""; | |
| if (!empty($searchRequest->id)) { | |
| $blockStudentReasonIdString = is_array($searchRequest->id) ? "'" . implode("','", $searchRequest->id) . "'" : "'" . $searchRequest->id . "'"; | |
| $whereQuery .= " AND ebsr.id IN ( $blockStudentReasonIdString )"; | |
| } | |
| if (!empty($searchRequest->type)) { | |
| $blockStudentReasonTypeString = is_array($searchRequest->type) ? "'" . implode("','", $searchRequest->type) . "'" : "'" . $searchRequest->type . "'"; | |
| $whereQuery .= " AND ebsr.type IN ( $blockStudentReasonTypeString )"; | |
| } | |
| $query = "SELECT | |
| DISTINCT | |
| ebsr.id as id, | |
| ebsr.name as name, | |
| ebsr.type as type, | |
| ebsr.contact_person_id as contactPersonId, | |
| ebsr.block_privilege_user as blockPrivilegeUser, | |
| ebsr.properties | |
| FROM | |
| ec_block_student_reason ebsr | |
| WHERE | |
| 1 = 1 "; | |
| $blockStudentReasons = $this->executeQueryForList($query . $whereQuery); | |
| } catch (\Exception $e) { | |
| throw new ExamControllerException($e->getCode(), $e->getMessage()); | |
| } | |
| foreach($blockStudentReasons as $blockStudentReason){ | |
| $blockStudentReason->properties = json_decode($blockStudentReason->properties); | |
| $blockStudentReason->blockPrivilegeUser = json_decode($blockStudentReason->blockPrivilegeUser); | |
| $blockStudentReason->contactPerson = $blockStudentReason->contactPersonId ? StaffService::getInstance()->getStaffByIds([$blockStudentReason->contactPersonId]) : []; | |
| $blockStudentReason->staffs = StaffService::getInstance()->getStaffByIds($blockStudentReason->blockPrivilegeUser->staffs); | |
| $blockStudentReason->blockPrivilegeStaffIds = $blockStudentReason->blockPrivilegeUser->staffs; | |
| $blockStudentReason->isSemesterWise = $blockStudentReason->type =='SEMESTER_WISE' ? 1 : 0; | |
| $blockStudentReason->description = $blockStudentReason->properties->description ?? ''; | |
| } | |
| return $blockStudentReasons; | |
| } | |
| /** | |
| * get Block Reason By exam Registration | |
| * @param $searchRequest | |
| * @return $blockStudentReasons | |
| */ | |
| public function getBlockReasonsByRegistration($searchRequest){ | |
| $searchRequest = $this->realEscapeObject($searchRequest); | |
| try { | |
| $whereQuery = null; | |
| $whereQuery = ""; | |
| if (!empty($searchRequest->examRegistrationId)) { | |
| $examRegistrationIdString = is_array($searchRequest->examRegistrationId) ? "'" . implode("','", $searchRequest->examRegistrationId) . "'" : "'" . $searchRequest->examRegistrationId . "'"; | |
| $whereQuery .= " AND esbrm.exam_registration_id IN ( $examRegistrationIdString )"; | |
| } | |
| $query = "SELECT | |
| DISTINCT | |
| ebsr.id as id, | |
| ebsr.name as name, | |
| ebsr.type as type, | |
| ebsr.contact_person_id as contactPersonId, | |
| ebsr.block_privilege_user as blockPrivilegeUser, | |
| ebsr.properties | |
| FROM | |
| ec_block_student_reason ebsr | |
| INNER JOIN ec_student_block_reason_mapping esbrm ON esbrm.ec_block_student_reason_id = ebsr.id | |
| WHERE | |
| 1 = 1 "; | |
| $blockStudentReasons = $this->executeQueryForList($query . $whereQuery); | |
| } catch (\Exception $e) { | |
| throw new ExamControllerException($e->getCode(), $e->getMessage()); | |
| } | |
| return $blockStudentReasons; | |
| } | |
| /** | |
| * Get Block Student Report | |
| * @param $searchRequest | |
| * @return $programResult | |
| */ | |
| public function getBlockStudentReport($searchRequest) { | |
| $searchRequest = $this->realEscapeObject($searchRequest); | |
| $request = new \stdClass; | |
| $request->examRegistrationId = $searchRequest->examRegistrationId; | |
| if($searchRequest->reportType == 'STUDENT_WISE'){ | |
| $request->blockReasonId = $searchRequest->blockReasonId; | |
| } | |
| $resultData = new \stdClass; | |
| $requestForExamRegistration = new SearchExamRegistrationRequest; | |
| $requestForExamRegistration->id = $searchRequest->examRegistrationId; | |
| $resultData->examRegistration = reset(ExamRegistrationService::getInstance()->searchExamRegistration($requestForExamRegistration)); | |
| $students = $this->getBlockedStudentDetails($request); | |
| $batchWiseStudentData = []; | |
| if(empty($students)){ | |
| throw new ExamControllerException(ExamControllerException::NO_REPORTS_DETAILS_FOUND,"No details found."); | |
| } | |
| if($searchRequest->reportType == 'STUDENT_WISE'){ | |
| $templateName = "block-student-report-student-wise-template-1"; | |
| $blockStudentReason = new \stdClass(); | |
| $blockStudentReason->id = $searchRequest->blockReasonId; | |
| $resultData->blockReason = reset($this->getBlockStudentReasons($blockStudentReason)); | |
| $resultData->blockReason->contactPersonNames = array_column( $resultData->blockReason->contactPerson, "name"); | |
| $resultData->blockReason->contactPersonName = implode(",", $resultData->blockReason->contactPersonNames) ; | |
| foreach($students as $student){ | |
| if($resultData->blockReason->type == 'SUBJECT_WISE'){ | |
| $student->subjectNames = array_column( $student->subjects, "nameCode"); | |
| $student->subjectName = implode(",", $student->subjectNames); | |
| } | |
| else{ | |
| $student->subjectName ="ALL"; | |
| } | |
| $batchWiseStudentData[$student->groupId]->id = $student->groupId; | |
| $batchWiseStudentData[$student->groupId]->name = $student->groupName; | |
| $batchWiseStudentData[$student->groupId]->students[] = $student; | |
| } | |
| } | |
| elseif($searchRequest->reportType == 'BATCH_WISE'){ | |
| $templateName = "block-student-report-batch-wise-template-1"; | |
| $blockStudentReason = new \stdClass(); | |
| $resultData->blockReasons = $this->getBlockStudentReasons($blockStudentReason); | |
| $resultData->colspan = count($resultData->blockReasons) + 3; | |
| $templateName = "block-student-report-batch-wise-template-1"; | |
| foreach($students as $student){ | |
| if(!empty($student->blockReasons)){ | |
| $batchWiseStudentData[$student->groupId]->id = $student->groupId; | |
| $batchWiseStudentData[$student->groupId]->name = $student->groupName; | |
| $batchWiseStudentData[$student->groupId]->students[] = $student; | |
| } | |
| } | |
| } | |
| elseif($searchRequest->reportType == 'COURSE_WISE'){ | |
| $blockStudentReason = new \stdClass(); | |
| $resultData->blockReasons = $this->getBlockStudentReasons($blockStudentReason); | |
| $templateName = "block-student-report-subject-wise-template-1"; | |
| $resultData->colspan = count($resultData->blockReasons) + 4; | |
| foreach($students as $student){ | |
| if(!empty($student->subjects)){ | |
| $batchWiseStudentData[$student->groupId]->id = $student->groupId; | |
| $batchWiseStudentData[$student->groupId]->name = $student->groupName; | |
| $batchWiseStudentData[$student->groupId]->students[] = $student; | |
| } | |
| } | |
| } | |
| $resultData->students = $batchWiseStudentData; | |
| $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/blockStudentReports/$templateName.twig"), [ 'resultData'=>$resultData]); | |
| $prtContent = NULL; | |
| $prtContent .= '<html><head>'; | |
| $prtContent .= "<style> | |
| </style>"; | |
| $prtContent .= '</head><title>Block Student Report</title><body>'; | |
| $prtContent .= $responseHtml; | |
| $prtContent .= '</body></html>'; | |
| $totalWidth = 210 ; | |
| $totalHeight = 297; | |
| $options = array( | |
| 'page-width' => $totalWidth."mm", | |
| 'page-height' => $totalHeight."mm", | |
| 'dpi' => 96, | |
| 'margin-top' => "10mm", | |
| 'margin-left' => "10mm", | |
| 'margin-right' => "10mm", | |
| 'margin-bottom' => "10mm", | |
| 'binary' => "/usr/local/bin/wkhtmltopdf", // For Mac | |
| 'user-style-sheet' => realpath(DOCUMENT_ROOT . "/libcommon/bootstrap/css/bootstrap.min.css") | |
| ); | |
| $programResult = new \stdClass; | |
| $programResult->dispalyHtmlData = $responseHtml; | |
| $programResult->printData = PdfUtil::renderPdf($prtContent, $options); | |
| return $programResult; | |
| } | |
| /** | |
| * get Block Reason Details | |
| * @param $searchRequest | |
| * @return $studentSubjectDetails | |
| */ | |
| public function getBlockedStudentDetails($searchRequest){ | |
| $searchRequest = $this->realEscapeObject($searchRequest); | |
| try { | |
| $whereQuery = null; | |
| $orderBy = " ORDER BY CAST(spa.properties->>'$.registerNumber' AS CHAR) ASC "; | |
| $studentSubjectDetails = []; | |
| if (!empty($searchRequest->examRegistrationId)) { | |
| $examRegistrationIdString = is_array($searchRequest->examRegistrationId) ? "'" . implode("','", $searchRequest->examRegistrationId) . "'" : "'" . $searchRequest->examRegistrationId . "'"; | |
| $whereQuery .= " AND esbrm.exam_registration_id IN ( $examRegistrationIdString )"; | |
| } | |
| if (!empty($searchRequest->blockReasonId)) { | |
| $blockReasonIdString = is_array($searchRequest->blockReasonId) ? "'" . implode("','", $searchRequest->blockReasonId) . "'" : "'" . $searchRequest->blockReasonId . "'"; | |
| $whereQuery .= " AND esbrm.ec_block_student_reason_id IN ( $blockReasonIdString )"; | |
| } | |
| $query = "SELECT | |
| DISTINCT | |
| sa.studentID AS studentId, | |
| sa.studentName, | |
| spa.properties->>'$.registerNumber' as regNo, | |
| spa.properties->>'$.rollNumber' as rollNo, | |
| g.id AS groupId, | |
| g.name AS groupName, | |
| s.id AS subjectId, | |
| s.code AS subjectCode, | |
| s.name AS subjectName, | |
| ebsr.id as blockReasonId, | |
| ebsr.name as blockReasonName, | |
| ebsr.type as blockReasonType, | |
| ebsr.contact_person_id as contactPersonId, | |
| staff.staffName as contactPersonName | |
| FROM | |
| ec_student_block_reason_mapping esbrm | |
| INNER JOIN ec_block_student_reason ebsr ON ebsr.id = esbrm.ec_block_student_reason_id | |
| INNER JOIN ec_exam_registration_batch eerb ON eerb.ec_exam_registration_id = esbrm.exam_registration_id | |
| INNER JOIN `groups` g ON g.id = eerb.groups_id | |
| INNER JOIN program p ON p.id = g.properties ->> '$.programId' | |
| INNER JOIN student_program_account spa ON spa.student_id = esbrm.student_id AND spa.current_program_id = p.id | |
| INNER JOIN ec_exam_registration_subject eers ON eers.ec_exam_registration_batch_id = eerb.id | |
| INNER JOIN ec_student_assessment_registration esar ON esar.am_assessment_id = eers.am_assessment_id AND esar.student_id = esbrm.student_id | |
| INNER JOIN studentaccount sa ON sa.studentID = esbrm.student_id | |
| LEFT JOIN staffaccounts staff ON staff.staffID = ebsr.contact_person_id | |
| LEFT JOIN cm_academic_paper_subjects aps ON aps.id = esbrm.cm_academic_paper_subjects_id | |
| LEFT JOIN v4_ams_subject s ON aps.ams_subject_id = s.id | |
| WHERE | |
| 1 = 1 "; | |
| $studentDetails = $this->executeQueryForList($query . $whereQuery.$orderBy); | |
| foreach($studentDetails as $student){ | |
| $studentSubjectDetails[$student->studentId]->id = $student->studentId; | |
| $studentSubjectDetails[$student->studentId]->studentId = $student->studentId; | |
| $studentSubjectDetails[$student->studentId]->name = $student->studentName; | |
| $studentSubjectDetails[$student->studentId]->regNo = $student->regNo; | |
| $studentSubjectDetails[$student->studentId]->rollNo = $student->rollNo; | |
| $studentSubjectDetails[$student->studentId]->groupId = $student->groupId; | |
| $studentSubjectDetails[$student->studentId]->groupName = $student->groupName; | |
| if($student->blockReasonType == 'SEMESTER_WISE'){ | |
| $studentSubjectDetails[$student->studentId]->blockReasons[$student->blockReasonId]->id = $student->blockReasonId; | |
| $studentSubjectDetails[$student->studentId]->blockReasons[$student->blockReasonId]->name = $student->blockReasonName; | |
| $studentSubjectDetails[$student->studentId]->blockReasons[$student->blockReasonId]->type = $student->blockReasonType; | |
| $studentSubjectDetails[$student->studentId]->blockReasons[$student->blockReasonId]->contactPersonId = $student->contactPersonId; | |
| $studentSubjectDetails[$student->studentId]->blockReasons[$student->blockReasonId]->contactPersonName = $student->contactPersonName; | |
| } | |
| if($student->subjectId){ | |
| $studentSubjectDetails[$student->studentId]->subjects[$student->subjectId]->id = $student->subjectId; | |
| $studentSubjectDetails[$student->studentId]->subjects[$student->subjectId]->code = $student->subjectCode; | |
| $studentSubjectDetails[$student->studentId]->subjects[$student->subjectId]->name = $student->subjectName; | |
| $studentSubjectDetails[$student->studentId]->subjects[$student->subjectId]->nameCode = $student->subjectName." ( ". $student->subjectCode.") "; | |
| if($student->blockReasonType == 'SUBJECT_WISE'){ | |
| $studentSubjectDetails[$student->studentId]->subjects[$student->subjectId]->blockReasons[$student->blockReasonId]->id = $student->blockReasonId; | |
| $studentSubjectDetails[$student->studentId]->subjects[$student->subjectId]->blockReasons[$student->blockReasonId]->name = $student->blockReasonName; | |
| $studentSubjectDetails[$student->studentId]->subjects[$student->subjectId]->blockReasons[$student->blockReasonId]->type = $student->blockReasonType; | |
| $studentSubjectDetails[$student->studentId]->subjects[$student->subjectId]->blockReasons[$student->blockReasonId]->contactPersonId = $student->contactPersonId; | |
| $studentSubjectDetails[$student->studentId]->subjects[$student->subjectId]->blockReasons[$student->blockReasonId]->contactPersonName = $student->contactPersonName; | |
| } | |
| } | |
| } | |
| } catch (\Exception $e) { | |
| throw new ExamControllerException($e->getCode(), $e->getMessage()); | |
| } | |
| return $studentSubjectDetails; | |
| } | |
| } |