Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 797
HallTicketsService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 10
31862.00
0.00% covered (danger)
0.00%
0 / 797
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 getAllHallTickets
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 21
 getAllHallTicketsStudentData
0.00% covered (danger)
0.00%
0 / 1
7482.00
0.00% covered (danger)
0.00%
0 / 266
 getRegisteredStudentSubjectsDetailsForHallTickets
0.00% covered (danger)
0.00%
0 / 1
420.00
0.00% covered (danger)
0.00%
0 / 191
 setQrContents
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 10
 setQrContentsTemplate1
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 7
 setQrContentsTemplate2
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 11
 getStudentAssignedHallsAndSeatForExam
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 27
 getRegisteredStudentSubjectsDetailsForEligibilityReport
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 116
 getExamEligibilityReport
0.00% covered (danger)
0.00%
0 / 1
2550.00
0.00% covered (danger)
0.00%
0 / 146
<?php
namespace com\linways\ec\core\service;
use com\linways\ec\core\request\SearchRuleRequest;
use com\linways\ec\core\service\RuleService;
use com\linways\base\util\MakeSingletonTrait;
use com\linways\ec\core\exception\ExamControllerException;
use com\linways\core\ams\professional\service\ReligionService;
use com\linways\core\ams\professional\service\AdmissionService;
use com\linways\core\ams\professional\service\CampusTypeService;
use com\linways\base\util\TwigRenderer;
use com\linways\core\ams\professional\util\PdfUtil;
use com\linways\core\ams\professional\service\CommonService;
use com\linways\ec\core\service\HallTicketsGenerator\HallTicketsGenerator;
use com\linways\ec\core\service\CommonExamService;
use com\linways\ec\core\constant\ShortTermCourseTypeConstants;
use com\linways\ec\core\constant\ShortTermCourseModeConstants;
use com\linways\ec\core\mapper\HallTicketsServiceMapper;
use com\linways\ec\core\service\StudentExamRegistrationService;
use com\linways\core\ams\professional\service\StudentService;
use com\linways\ec\core\constant\SettingsConstants;
use com\linways\core\ams\professional\dto\SettingsConstents;
use com\linways\core\ams\professional\service\examcontroller\CommonExamService AS ProfessionalCommonExamService;
use com\linways\academics\core\service\attendance\AttendanceService;
use com\linways\academics\core\request\attendance\AttendanceTermWiseReport;
class HallTicketsService extends BaseService
{
    use MakeSingletonTrait;
    private function __construct() {
        $this->mapper = HallTicketsServiceMapper::getInstance()->getMapper();
    }
      /**
     * get All Hall Tickets 
     * @param $searchRequest 
     * @return $response 
     * @author Krishnajith
     */
    public function getAllHallTickets($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $request = new \stdClass;
            $request->departmentId = $searchRequest->departmentId;
            $request->groupId = $searchRequest->groupId;
            $request->academicTermId = $searchRequest->academicTermId;
            $request->examRegistrationId = $searchRequest->examRegistrationId;
            $request->registerNo = $searchRequest->registerNo;
            $request->challanNo = $searchRequest->challanNo;
            $request->studentId = $searchRequest->studentId;
            $request->examType = $searchRequest->examType;
            $request->rollNo = $searchRequest->rollNo;
            $request->checkIfNotEnableHallTicketExamAdmin = $searchRequest->checkIfNotEnableHallTicketExamAdmin;
            $request->isStudentSideHallTIcketRequest = $searchRequest->isStudentSideHallTIcketRequest;
            $programResult = HallTicketsGenerator::getInstance()->getHallTicketsResultData($request);
            return $programResult;
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
    }
    
     /**
     * get All Hall Tickets Student Data
     * @param $searchRequest 
     * @return $studentDetails 
     * @author Krishnajith
     */
    public function getAllHallTicketsStudentData($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $blockedSubjectsCountToBlockHallticket = CommonService::getInstance()->getSettings("EXAM_HALL_TICKET", "BLOCKED_SUBJECT_COUNT_TO_BLOCK_HALLTICKET");
            $searchRuleRequest = new SearchRuleRequest;
            $searchRuleRequest->name = "BLOCK_STUDENT_SETTINGS_RULE";
            $ruleObj = reset(RuleService::getInstance()->searchRule($searchRuleRequest))->rule;
            $blockedSubjectsCountToBlockHallticket = $ruleObj->blockedSubjectCountToBlockHallTicket ?? 0;
            $searchRuleRequest = new SearchRuleRequest;
            $searchRuleRequest->name = "HALL_TICKET_RULE";
            $hallTicketRule = reset(RuleService::getInstance()->searchRule($searchRuleRequest))->rule;
            $hallTicketRule = $hallTicketRule ? $hallTicketRule : new \stdClass;
            $isCheckFeeDueInStudentSideHallTicket = $hallTicketRule->isCheckFeeDueInStudentSideHallTicket == '1' ? true : false;
            $isCheckAttendanceDueInStudentSideHallTicket = $hallTicketRule->isCheckAttendanceDueInStudentSideHallTicket == '1' ? true : false;
            $isCheckAttendanceDueInControllerSideHallTicket = $hallTicketRule->isCheckAttendanceDueInControllerSideHallTicket == '1' ? true : false;
            $isCheckFeeDueInControllerSideHallTicket = $hallTicketRule->isCheckFeeDueInControllerSideHallTicket == '1' ? true : false;
            $request = new \stdClass;
            $request->departmentId = $searchRequest->departmentId;
            $request->groupId = $searchRequest->groupId;
            $request->academicTermId = $searchRequest->academicTermId;
            $request->examRegistrationId = $searchRequest->examRegistrationId;
            $request->registerNo = $searchRequest->registerNo;
            $request->studentId = $searchRequest->studentId;
            $request->rollNo = $searchRequest->rollNo;
            $request->orderBy = $searchRequest->orderBy;
            $request->excludedCourseTypeIds = $hallTicketRule->excludedCourseTypeIds ? $hallTicketRule->excludedCourseTypeIds : [];
            $shortTermCourseTypes = [];
            $shortTermCourseTypes[] = ShortTermCourseTypeConstants::MINOR;
            $shortTermCourseTypes[] = ShortTermCourseTypeConstants::MAJOR;
            $subjectSlotsRes = CommonExamService::getInstance()->getAllSubjectSlots();
            $subjectSlots = [];
            foreach($subjectSlotsRes as $slot){
                $subjectSlots[$slot->id] = $slot->name;
            }
            if($searchRequest->challanNo){
                $challanRequest = new \stdClass;
                $challanRequest->challanNo = $searchRequest->challanNo;
                $challanRequest->examType = $searchRequest->examType;
                $challanDetails = StudentExamRegistrationService::getInstance()->getStudentChallanDetails($challanRequest);
                if(empty($challanDetails)){
                    throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"No student found");
                }
                $request->studentId = $challanDetails->studentId;
                $request->examRegistrationId = $challanDetails->examRegistrationId;
            }
            $studentDetails = $this->getRegisteredStudentSubjectsDetailsForHallTickets($request);
            if(empty($studentDetails)){
                throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"No Students Found");
            }
            if(reset($studentDetails)->enableHallTicketExamAdmin != 1 && !$searchRequest->checkIfNotEnableHallTicketExamAdmin){
                throw new ExamControllerException(ExamControllerException::HALL_TICKET_NOT_ENABLED,"Hall ticket issue not enabled by exam controller");
            }
            if(reset($studentDetails)->enableHallTicketExamStudent != 1 && $searchRequest->checkIfNotEnableHallTicketExamAdmin){
                throw new ExamControllerException(ExamControllerException::HALL_TICKET_NOT_ENABLED,"Hall ticket not enabled by exam controller");
            }
            $showGenderWiseAttendance = false;
            if(($isCheckAttendanceDueInStudentSideHallTicket && $searchRequest->isStudentSideHallTIcketRequest) || $isCheckAttendanceDueInControllerSideHallTicket){
                $showGenderWiseAttendance = CommonService::getInstance()->getSettings(SettingsConstants::EXAM_CONTROLLER, "EXAM_REGISTRATION_GENDER_WISE_ATTENDANCE_CHECK");
            }
            foreach($studentDetails as $student){
                if($showGenderWiseAttendance){
                    if(empty($student->examRegistrationProperties->genderWiseMinimumAttendance)){
                        throw new ExamControllerException (ExamControllerException::INVALID_PARAMETERS,"Gender wise attendance rule not added. Please contact exam controller.");
                    }
                    if(empty($student->gender) || (strtoupper($student->gender) != 'MALE' && strtoupper($student->gender) != 'FEMALE'  && strtoupper($student->studentGender) != 'OTHER') ){
                        throw new ExamControllerException (ExamControllerException::INVALID_PARAMETERS,"Gender details not added. Please contact exam controller.");
                    }
                    $student->examRegistrationProperties->genderWiseMinimumAttendance = (array) $student->examRegistrationProperties->genderWiseMinimumAttendance;
                }
                else{
                    $showGenderWiseAttendance = false;
                }
                $student->studentImage  = CommonExamService::getInstance()->getStudentProfilePic($student->id);
                $student->studentSignature  = CommonExamService::getInstance()->getStudentSignPic($student->id);
                $student->haveMinAttendance = true;
                $student->isAppliedOpenCourse = true;
                $student->isEvaluationComplete = true;
                $blockedSubjectCount = 0;
                array_walk($student->streams, function($stream) use($student){
                    $student->streamNames[] = $stream->name;
                });
                $student->streamName = implode(" and ",$student->streamNames);
                $student->programName = $student->degreeName." - ".$student->streamName;
                $semesterNames = CommonExamService::getInstance()->getDifferentSemesterName($student->academicTermOrder,true);
                $student->semInRomanLetter = $semesterNames->romanLetter;
                $student->semInFullName = $semesterNames->fullName;
                $student->semInSemNumber = $semesterNames->semNumber;
                $student->academicExamYear = ($student->academicYear + (floor(($student->semInSemNumber - 1) / 2))) ." - ".($student->academicYear +  (floor(($student->semInSemNumber - 1) / 2)) + 1);
                $student->subjects = array_filter($student->subjects, function ($subject) use($student,$shortTermCourseTypes){
                    return !($student->examRegistrationProperties->isShortTermCourse && in_array($student->examRegistrationProperties->shortTermCourseType, $shortTermCourseTypes) && $subject->studentCourseMode == ShortTermCourseModeConstants::MOOC );
                });
                $student->isHallTicketBlocked = false;
                $student->blockingMsg = "";
                if($student->blockReasons) {
                    $blockReasonMsg = "Hall Ticket Blocked ";
                    foreach($student->blockReasons as $reason){
                        $blockReasonMsg .= "<br> * Due to ".$reason->name .". ";
                        $blockReasonMsg .= $reason->contactPersonName ? "Please contact ".$reason->contactPersonName :"";
                        $blockReasonMsg .= $reason->contactPersonDecription ? " ".$reason->contactPersonDecription :"";
                    }
                    $student->isHallTicketBlocked = true;
                    $student->blockingMsg = $blockReasonMsg;
                }
                $student->isShowOnlySession = $hallTicketRule->isShowOnlySession ?? false;
                foreach($student->subjects as $subKey => $subject){
                    if( $searchRequest->removeInternalOnlySubject ){
                        if( $subject->isInternal && !$subject->isExternal){
                            unset($student->subjects[$subKey]);
                            continue;
                        }
                    }
                    if( $searchRequest->removeNotTheorySubject ){
                        if($subject->classType != 'THEORY'){
                            unset($student->subjects[$subKey]);
                            continue;
                        }
                    }
                    $subject->slot = $subjectSlots[$subject->slotId] ?? '';
                    $subject->isInternalFailed = false;
                    $subject->isExternalFailed = false;
                    if($subject->subjectMarkDetails->internalResultStatus == 'FAILED'){
                        $subject->isInternalFailed = true;
                    }
                    if($subject->subjectMarkDetails->externalResultStatus == 'FAILED'){
                        $subject->isExternalFailed = true;
                    }
                    $subject->isSubjectBlocked = false;
                    $subject->blockingMsg = "";
                    if($subject->blockReasons) {
                        $blockReasonMsg = "Hall Ticket Blocked ";
                        foreach($subject->blockReasons as $reason){
                            $blockReasonMsg .= "<br> * Due to ".$reason->name .". ";
                            $blockReasonMsg .= $reason->contactPersonName ? "Please contact ".$reason->contactPersonName :"";
                            $blockReasonMsg .= $reason->contactPersonDecription ? " ".$reason->contactPersonDecription :"";
                        }
                        $subject->isSubjectBlocked = true;
                        $subject->blockingMsg = $blockReasonMsg;
                        $blockedSubjectCount ++;
                    }
                    $subject->assessmentDate =  $subject->assessmentDate ? date("d-m-Y", strtotime($subject->assessmentDate)) : '';
                    $subject->assessmentStartTime =  $subject->assessmentStartTime ? date("h:i A", strtotime($subject->assessmentStartTime)) : '';
                    $subject->session = (!empty($subject->assessmentStartTime) && strtotime($subject->assessmentStartTime) < strtotime("12:00 PM")) ? 'FN' : 'AN';
                    $subject->assessmentEndTime =  $subject->assessmentEndTime ? date("h:i A", strtotime($subject->assessmentEndTime)) : '';
                    if((($isCheckAttendanceDueInStudentSideHallTicket && $searchRequest->isStudentSideHallTIcketRequest) || $isCheckAttendanceDueInControllerSideHallTicket) && $student->examRegistrationProperties->criteriaDuringMinimumAttendance == 'SUBJECT_WISE'){
                        if($showGenderWiseAttendance){
                            if ( !empty($student->examRegistrationProperties->genderWiseMinimumAttendance)){
                                $subject->subjectProperties->minimumAttendancePercentage = $student->examRegistrationProperties->genderWiseMinimumAttendance[strtoupper($student->gender)];
                            }
                        }
                        $attendanceTermWiseReportRequest = new AttendanceTermWiseReport();
                        $attendanceTermWiseReportRequest->studentId = $student->id;
                        $attendanceTermWiseReportRequest->termId = $student->academicTermId;
                        $attendanceTermWiseReportRequest->paperSubjectId = $subject->id;
                        $attendanceTermWiseReportRequest->attendanceClosingDate = $student->examRegistrationBatchProperties->attendanceClosingDate;
                        $subject->attendanceDetails = reset(AttendanceService::getInstance()->getTermWiseStudentAttendanceConfirmedReport($attendanceTermWiseReportRequest));
                        if($subject->subjectProperties->minimumAttendancePercentage > $subject->attendanceDetails->attendancePercentage){
                            if($subject->isSubjectBlocked ){
                                $subject->blockingMsg .= "<br> * Due to attendance shortage";
                            }
                            else{
                                $subject->isSubjectBlocked = true;
                                $subject->blockingMsg = "Hall Ticket Blocked <br> * Due to attendance shortage";
                            }
                            $blockedSubjectCount ++;
                        }
                    }
                }
                $student->subjects = array_values($student->subjects);
                if($blockedSubjectsCountToBlockHallticket && !$student->isHallTicketBlocked){
                    if($blockedSubjectCount >= $blockedSubjectsCountToBlockHallticket){
                        if($student->isHallTicketBlocked){
                            $student->blockingMsg .= "<br> Hall Ticket Blocked";
                        }
                        else{
                            $student->isHallTicketBlocked = true;
                            $student->blockingMsg = "Hall Ticket Blocked";
                        }
                    }
                }
                $semesterNames = CommonExamService::getInstance()->getDifferentSemesterName($student->academicTermOrder,true);
                $student->semInRomanLetter = $semesterNames->romanLetter;
                $student->semInFullName = $semesterNames->fullName;
                $student->semInSemNumber = $semesterNames->semNumber;
                $student->currentDate = date('d-m-Y');
                $student->examMonthYear = date("F Y", strtotime($student->examYear."-".$student->examMonth));
                $student->examMonthName = date("F", strtotime($student->examYear."-".$student->examMonth));
                $student->examRegType = $student->examRegistrationType == "REGULAR" ? "Regular" : "Supplementary";
                $student->qrCodeContents = $this->setQrContents($student,$hallTicketRule);
                if((($isCheckAttendanceDueInStudentSideHallTicket && $searchRequest->isStudentSideHallTIcketRequest) || $isCheckAttendanceDueInControllerSideHallTicket) && $student->examRegistrationProperties->criteriaDuringMinimumAttendance == 'SEMESTER_WISE'){
                    $minAttendanceForExamReg = json_decode(CommonService::getInstance()->getSettings(SettingsConstents::EXAM_CONTROLLER, SettingsConstents::SEMESTER_EXAM_SETTINGS))->minAttendanceForExamReg;
                    if($minAttendanceForExamReg->enableDayWiseAttendanceChecking){
                        $semWiseRequest = new \stdClass;
                        $semWiseRequest->studentId = $student->id;
                        $semWiseRequest->termId = $student->academicTermId;
                        $semWiseRequest->examRegistrationId = $student->examRegistrationid;
                        $semWiseRequest->studentGender = $student->gender;
                        $semWiseRequest->workFlowId = $student->examRegistrationProperties->workFlowId;
                        $semWiseCriteria = ProfessionalCommonExamService::getInstance()->checkStudentSemesterWiseAttendanceCriteriaForExamRegistration($semWiseRequest);
                        if ( $semWiseCriteria->workflowId && $semWiseCriteria->eligibleForCondonation && !$semWiseCriteria->eligibleToApplyByDayWiseAttendance && !$examRegistration->isApplied && !$examRegistration->isRegistered){
                            $examRegistration->redirectToWorkFlowModule = 1;
                        }
                        if ( !$semWiseCriteria->eligibleToApplyByDayWiseAttendance && !$semWiseCriteria->isCondonationApproved){
                            $student->isHallTicketBlocked = true;
                            $student->blockingMsg = "Hall Ticket Blocked <br> * Due to attendance shortage";
                        }
                    }
                    else{
                        $attendanceTermWiseReportRequest = new AttendanceTermWiseReport();
                        $attendanceTermWiseReportRequest->studentId = $student->id;
                        $attendanceTermWiseReportRequest->termId = $student->academicTermId;
                        $student->attendanceDetails = reset(AttendanceService::getInstance()->getTermWiseStudentAttendanceConfirmedReport($attendanceTermWiseReportRequest));
                        if($student->examRegistrationProperties->minimumAttendancePercentage > $student->attendanceDetails->attendancePercentage){
                            if($student->isHallTicketBlocked){
                                $student->blockingMsg .= "<br> * Due to attendance shortage";
                            }
                            else{
                                $student->isHallTicketBlocked = true;
                                $student->blockingMsg = "Hall Ticket Blocked <br> * Due to attendance shortage";
                            }
                        }
                    }
                }
                if(($isCheckFeeDueInStudentSideHallTicket && $searchRequest->isStudentSideHallTIcketRequest) || $isCheckFeeDueInControllerSideHallTicket){
                    // This is a curl call
                    $curl = curl_init();
                    $domain = "";
                    if ($_SERVER['HTTP_HOST'] != 'localhost') {
                        $domain = rtrim($_SERVER['HTTP_HOST']);
                    }
                    if (getenv("DEBUG") !== "true") {
                        $handlerUrl = "https://" . $domain . "/fm/api/v1/my-fee/".$student->id;
                    } else {
                        $handlerUrl = "http://localhost/fm/api/v1/my-fee/".$student->id;
                    }
                    $header = $GLOBALS['_SERVER']['REDIRECT_HTTP_AUTHORIZATION'];
                    $headers = array(
                        'Content-Type:application/json',
                        'Authorization:' . $header
                    );
                    // Query parameters
                    $queryParams = array(
                        'studentId' => $student->id
                    );
                    $queryString = $queryParams ? http_build_query($queryParams) : '';
                    curl_setopt($curl, CURLOPT_URL, $handlerUrl . '?' . $queryString);
                    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
                    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
                    $curl_response = curl_exec($curl);
                    // Check for errors
                    if ($curl_response === false) {
                        return false;
                    }
                    else {
                        $decodedResponse = json_decode($curl_response);
                        $studentFeeSummary = $decodedResponse->data;
                    }
                    // Close cURL resource
                    curl_close($curl);
                    if(!empty($studentFeeSummary)){
                        foreach($studentFeeSummary as $semFee) {
                            if($semFee->totalBalance > 0) {
                                throw new ExamControllerException(ExamControllerException::HALL_TICKET_BLOCKED,"Your hall ticket is currently on hold due to unpaid fees. Please pay any outstanding balances ");
                            }
                        }
                    }
                }
            }
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentDetails;
    }
    /**
     * get Registered Student Subjects Details
     * @param $searchRequest 
     * @return $studentRegistrationDetails 
     * @author Krishnajith
     */
    public function getRegisteredStudentSubjectsDetailsForHallTickets($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            if($searchRequest->orderBy == 'ROLL_NO'){
                $orderBy = " ORDER BY spa.properties->>'$.rollNumber' ASC , aa.properties_value ->>'$.assessmentDate' ASC ,CAST(ap.properties ->> '$.order' AS UNSIGNED) ASC";
            }
            else{
                $orderBy = " ORDER BY spa.properties->>'$.registerNumber' ASC , aa.properties_value ->>'$.assessmentDate' ASC ,CAST(ap.properties ->> '$.order' AS UNSIGNED) ASC";
            } 
            $whereQuery = "";
            $groupByQuery = "";
            if(!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','",$searchRequest->groupId) . "'" : "'".$searchRequest->groupId."'";
                $whereQuery .= " AND g.id IN ( $groupIdString )";
            }
            if(!empty($searchRequest->departmentId)) {
                $departmentIdString = is_array($searchRequest->departmentId) ? "'" . implode("','",$searchRequest->departmentId) . "'" : "'".$searchRequest->departmentId."'";
                $whereQuery .= " AND dept.deptID IN ( $departmentIdString )";
            }
            if(!empty($searchRequest->academicTermId)) {
                $academicTermIdString = is_array($searchRequest->academicTermId) ? "'" . implode("','",$searchRequest->academicTermId) . "'" : "'".$searchRequest->academicTermId."'";
                $whereQuery .= " AND act.id IN ( $academicTermIdString )";
            }
            if(!empty($searchRequest->examRegistrationId)) {
                $examRegistrationIdString = is_array($searchRequest->examRegistrationId) ? "'" . implode("','",$searchRequest->examRegistrationId) . "'" : "'".$searchRequest->examRegistrationId."'";
                $whereQuery .= " AND eer.id IN ( $examRegistrationIdString )";
            }
            if(!empty($searchRequest->examRegistrationType)) {
                $whereQuery .= " AND eer.type = '$searchRequest->examRegistrationType'";
            }
            if(!empty($searchRequest->registerNo)) {
                $registerNoString = is_array($searchRequest->registerNo) ? "'" . implode("','",$searchRequest->registerNo) . "'" : "'".$searchRequest->registerNo."'";
                $whereQuery .= " AND spa.properties->>'$.registerNumber' IN ( $registerNoString )";
            }
            if(!empty($searchRequest->rollNo)) {
                $rollNoString = is_array($searchRequest->rollNo) ? "'" . implode("','",$searchRequest->rollNo) . "'" : "'".$searchRequest->rollNo."'";
                $whereQuery .= " AND spa.properties->>'$.rollNumber' IN ( $rollNoString )";
            }
            if(!empty($searchRequest->studentId)) {
                $studentIdString = is_array($searchRequest->studentId) ? "'" . implode("','",$searchRequest->studentId) . "'" : "'".$searchRequest->studentId."'";
                $whereQuery .= " AND sa.studentID IN ( $studentIdString )";
            }
            if(!empty($searchRequest->considerPublishedTimeTable)) {
                $whereQuery .= " AND eer.properties ->> '$.publishExamTimeTableStudent' = 1";
            }
            if(!empty($searchRequest->excludedCourseTypeIds)) {
                $whereQuery .= " AND aps.properties ->> '$.subjectTypeId' NOT IN ('" . implode("','", $searchRequest->excludedCourseTypeIds) . "')";
            }
        
            $query = "SELECT DISTINCT
                        sa.studentID AS id,
                        sa.studentID AS studentId,
                        sa.myImage AS studentImage,
                        sa.studentBirthday AS DOB,
                        sa.studentPhone,
                        sa.studentAddress,
                        sa.studentName,
                        spa.properties->>'$.rollNumber' AS rollNo,
                        spa.properties->>'$.registerNumber' AS regNo,
                        sa.admissionNo,
                        sa.myImage,
                        sa.studentMother AS motherName, 
                        sa.studentFather AS fatherName, 
                        sa.studentGender,
                        sa.abcID as abcId,
                        g.id AS groupId,
                        g.name AS groupName,
                        g.properties ->> '$.startYear' AS academicYear,
                        eer.type AS examRegistrationType,
                        eer.id AS examRegistrationid,
                        eer.name AS examRegistrationName,
                        eer.properties ->> '$.examYear' AS examYear,
                        eer.properties ->> '$.examMonth' AS examMonth,
                        eer.properties ->> '$.enableHallTicketExamAdmin' AS enableHallTicketExamAdmin,
                        eer.properties ->> '$.enableHallTicketExamStudent' AS enableHallTicketExamStudent,
                        eer.properties AS examRegistrationProperties,
                        eerb.properties AS examRegistrationBatchProperties,
                        act.id as academicTermId,
                        act.name as academicTermName,
                        act.properties ->> '$.orderNo' as academicTermOrder,
                        dept.deptID,
                        dept.school_id as schoolId,
                        deg.name as degreeName,
                        p.stream_id as streamId,
                        p.name as currentProgramName,
                        str.name as streamName,
                        deg.id as degreeId,
                        dept.deptName,
                        ct.courseTypeID,
                        ct.typeName as courseTypeName,
                        s.code as subjectCode,
                        aps.properties ->> '$.syllabusName' AS syllabusName,
                        s.name as subjectName,
                        eers.properties as subjectProperties,
                        eers.cm_academic_paper_subjects_id as academicPaperSubjectId,
                        aps.properties ->>'$.credit' AS subjectCredit,
                        aps.properties ->>'$.externalMaxMark' AS externalMaxMark,
                        aps.properties ->>'$.InternalMaxMark' AS internalMaxMark,
                        aps.properties ->> '$.isInternal' as isInternal,
                        aps.properties ->> '$.isExternal' as isExternal,
                        aps.properties ->>'$.subjectTypeId' AS subjectTypeId,
                        aps.properties ->>'$.classType' AS classType, 
                        aps.properties ->>'$.courseCode' AS courseCode,
                        aps.slot_id as slotId,
                        ap.properties ->> '$.order' AS subjectOrder,
                        aa.id as assessmentId,
                        aa.identifying_context as assessmentIdentifyingContext,
                        aa.properties_value as assessmentProperties,
                        aa.properties_value ->>'$.assessmentDate' AS assessmentDate,
                        aa.properties_value ->>'$.startTime' AS assessmentStartTime,
                        aa.properties_value ->>'$.endTime' AS assessmentEndTime,
                        esar.properties->>'$.hallticketStatus' AS hallticketStatus,
                        esar.properties->>'$.registrationStatus' AS registrationStatus,
                        esar.properties->>'$.hallticketBlockedReasons' AS hallticketBlockedReasons,
                        esar.properties->>'$.registrationBlockedReasons' AS registrationBlockedReasons,
                        esar.properties->>'$.courseMode' AS studentCourseMode,
                        esar.properties->>'$.studentSeprateAssessmentDate' AS studentSeprateAssessmentDate,
                        esar.properties->>'$.studentSeprateAssessmentStartTime' AS studentSeprateAssessmentStartTime,
                        esar.properties->>'$.studentSeprateAssessmentEndTime' AS studentSeprateAssessmentEndTime,
                        esbrm.ec_block_student_reason_id as blockStudentReasonId,
                        ebsr.name as blockReasonName,
                        cpsa.staffName as blockReasoncontactPersonName,
                        ebsr.properties ->> '$.description' AS contactPersonDecription,
                        esbrmSub.ec_block_student_reason_id as subjectBlockStudentReasonId,
                        ebsrSub.name as subjectBlockReasonName,
                        cpsaSub.staffName as subjectBlockReasoncontactPersonName,
                        ebsrSub.properties ->> '$.description' AS SubjectContactPersonDecription,
                        ecsmd.mark_details as subjectMarkDetails,
                        cst.name as subjectTypeName
                    FROM
                        `groups` g
                    INNER JOIN ec_exam_registration_batch eerb ON
                        eerb.groups_id = g.id
                    INNER JOIN ec_exam_registration_subject eers ON
                        eers.ec_exam_registration_batch_id = eerb.id
                    INNER JOIN  cm_academic_paper_subjects aps ON 
                        eers.cm_academic_paper_subjects_id = aps.id
                    INNER JOIN  cm_academic_paper ap ON 
                        ap.id = aps.cm_academic_paper_id
                    INNER JOIN am_assessment aa ON
                        aa.id = eers.am_assessment_id
                    INNER JOIN  v4_ams_subject s ON 
                        aps.ams_subject_id = s.id
                    INNER JOIN ec_exam_registration eer ON
                        eer.id = eerb.ec_exam_registration_id
                    INNER JOIN program p ON
                        p.id = CAST(g.properties ->> '$.programId' AS CHAR)
                    INNER JOIN ec_student_assessment_registration esar ON
                        esar.am_assessment_id = eers.am_assessment_id AND CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID' AND esar.ec_exam_registration_type = eer.type 
                    INNER JOIN student_program_account spa ON 
                        spa.current_program_id = p.id AND 
                        spa.student_id = esar.student_id 
                    INNER JOIN studentaccount sa ON 
                        sa.studentID = esar.student_id
                    INNER JOIN department dept ON
                        dept.deptID = g.properties ->> '$.departmentId'
                    INNER JOIN  academic_term act ON 
                        act.id = CAST(eerb.properties ->> '$.academicTermId'AS CHAR)
                    INNER JOIN degree deg ON
                        deg.id = p.degree_id
                    LEFT JOIN stream str ON
                        JSON_SEARCH( p.stream_id, 'one', str.id) IS NOT NULL
                    INNER JOIN `course_type` ct ON
                        ct.courseTypeID = p.course_type_id
                    LEFT JOIN ec_student_block_reason_mapping esbrm ON
                        esbrm.student_id = sa.studentID AND esbrm.exam_registration_id = eer.id AND
                        esbrm.blocking_type = 'HALL_TICKET_BLOCKING' AND esbrm.cm_academic_paper_subjects_id IS NULL
                    LEFT JOIN ec_block_student_reason ebsr ON 
                        ebsr.id = esbrm.ec_block_student_reason_id AND
                        ebsr.type = 'SEMESTER_WISE'
                    LEFT JOIN staffaccounts cpsa ON 
                        cpsa.staffID = ebsr.contact_person_id 
                    LEFT JOIN ec_student_block_reason_mapping esbrmSub ON
                        esbrmSub.student_id = sa.studentID AND esbrmSub.exam_registration_id = eer.id AND
                        esbrmSub.blocking_type = 'HALL_TICKET_BLOCKING' AND esbrmSub.cm_academic_paper_subjects_id = aps.id
                    LEFT JOIN ec_block_student_reason ebsrSub ON 
                        ebsrSub.id = esbrmSub.ec_block_student_reason_id AND
                        ebsrSub.type = 'SUBJECT_WISE'
                    LEFT JOIN staffaccounts cpsaSub ON 
                        cpsaSub.staffID = ebsrSub.contact_person_id 
                    LEFT JOIN ec_consolidated_subject_mark_details ecsmd ON 
                        ecsmd.cm_academic_paper_subjects_id = aps.id AND ecsmd.student_id = esar.student_id
                    LEFT JOIN cm_subject_types cst ON 
                        cst.id = aps.properties ->> '$.subjectTypeId'
                    WHERE 1=1 AND (CAST(esar.properties ->> '$.syllabusSubType' AS CHAR) != 'MOOC' OR esar.properties ->> '$.syllabusSubType' IS NULL) ";
            $studentRegistrationDetails = $this->executeQueryForList($query.$whereQuery.$groupByQuery.$orderBy, $this->mapper[HallTicketsServiceMapper::GET_HALL_TICKET_DETAILS]);
            
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentRegistrationDetails;
    }
   
    /**
     * Set QR code contents for the student
     * @param $student
     * @return string
     */
    private function setQrContents($student,$hallTicketRule) {
        switch($hallTicketRule->qrCodeTemplate){
            case '1':
                return $this->setQrContentsTemplate1($student);
            case '2':
                return $this->setQrContentsTemplate2($student);
            default:
                return $this->setQrContentsTemplate1($student);
        }
        return $qrContents;
    }
    /**
     * Set QR code contents for the student
     * @param $student
     * @return string
     */
    private function setQrContentsTemplate1($student) {
        $qrContents = "";
        $qrContents .= "Name: " . $student->studentName . "\n";
        $qrContents .= "Admission No: " . $student->admissionNo . "\n";
        $qrContents .= "Register No: " . $student->registerNo . "\n";
        $qrContents .= "Program: " . $student->programName . "\n";
        return $qrContents;
    }
    private function setQrContentsTemplate2($student) {
        $collegeData = CommonExamService::getInstance()->getCollegeDetails();
        $qrContents = "";
        $qrContents .= "Registration No: " . $student->rollNo . "\n";
        $qrContents .= "Name: " . $student->studentName . "\n";
        $qrContents .= "Course: " . $student->programName . "\n";
        $qrContents .= "Collage: " . $collegeData->collegeName . "\n";
        $qrContents .= "Examination: " . $student->examRegistrationName . "\n";
        $qrContents .= "Sem: " . $student->academicTermId . "\n";
        $subjectNames = implode(",",array_column($student->subjects, 'name'));
        //removed subjectnames from qr code for better visibility
        // $qrContents .= "Subjects: " . $subjectNames . "\n";
        return $qrContents;
    }
    /**
     * Get student assigned halls for exam
     * @param Object $request
     */
    public function getStudentAssignedHallsAndSeatForExam($request){
        $request = $this->realEscapeObject($request);
        try {
            $sql = "SELECT 
                        eeh.id, 
                        eeh.name, 
                        ehta.properties->>'$.seatNo' AS seatNo,
                        ehagas.am_assessment_id AS assessmentId 
                    FROM 
                        ec_hall_arrangement_group_assigned_student ehagas 
                    INNER JOIN ec_hall_arrangement_group_assigned_hall ehagah ON 
                        ehagah.id = ehagas.ec_hall_arrangement_group_assigned_hall_id 
                    INNER JOIN ec_exam_hall eeh ON 
                        eeh.id = ehagah.ec_exam_hall_id 
                    INNER JOIN ec_exam_hall_template_arrangement ehta ON
                        ehagas.ec_exam_hall_template_arrangement_id = ehta.id 
                    WHERE 
                        ehagas.student_id = '$request->studentId' AND ehagah.is_locked = '1' ";
            $assignedStudents = (array)$this->executeQueryForList($sql);
            $studentExamHalls = [];
            foreach($assignedStudents as $student){
                $studentExamHalls[$student->assessmentId] = $student;
            }
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(), $e->getMessage());
        }
        return $studentExamHalls;
    }
    
    /**
     * get Registered Student Subjects Details For Eligibility Report
     * @param $searchRequest 
     * @return $studentRegistrationDetails 
     * @author Krishnajith
     */
    public function getRegisteredStudentSubjectsDetailsForEligibilityReport($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            if($searchRequest->orderBy == 'ROLL_NO'){
                $orderBy = " ORDER BY spa.properties->>'$.rollNumber' ASC , aa.properties_value ->>'$.assessmentDate' ASC ,CAST(ap.properties ->> '$.order' AS UNSIGNED) ASC";
            }
            else{
                $orderBy = " ORDER BY spa.properties->>'$.registerNumber' ASC , aa.properties_value ->>'$.assessmentDate' ASC ,CAST(ap.properties ->> '$.order' AS UNSIGNED) ASC";
            } 
            $whereQuery = "";
            $groupByQuery = "";
            if(!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','",$searchRequest->groupId) . "'" : "'".$searchRequest->groupId."'";
                $whereQuery .= " AND g.id IN ( $groupIdString )";
            }
           
            if(!empty($searchRequest->examRegistrationId)) {
                $examRegistrationIdString = is_array($searchRequest->examRegistrationId) ? "'" . implode("','",$searchRequest->examRegistrationId) . "'" : "'".$searchRequest->examRegistrationId."'";
                $whereQuery .= " AND eer.id IN ( $examRegistrationIdString )";
            }
            if(!empty($searchRequest->programId)) {
                $programIdString = is_array($searchRequest->programId) ? "'" . implode("','",$searchRequest->programId) . "'" : "'".$searchRequest->programId."'";
                $whereQuery .= " AND p.id IN ( $programIdString )";
            }
            if(!empty($searchRequest->courseTypeId)) {
                $courseTypeIdString = is_array($searchRequest->courseTypeId) ? "'" . implode("','",$searchRequest->courseTypeId) . "'" : "'".$searchRequest->courseTypeId."'";
                $whereQuery .= " AND ct.courseTypeID IN ( $courseTypeIdString )";
            }
        
            $query = "SELECT DISTINCT
                        sa.studentID AS id,
                        sa.studentID AS studentId,
                        sa.studentBirthday AS DOB,
                        sa.studentName,
                        spa.properties->>'$.rollNumber' AS rollNo,
                        spa.properties->>'$.registerNumber' AS regNo,
                        sa.admissionNo,
                        g.id AS groupId,
                        g.name AS groupName,
                        eer.type AS examRegistrationType,
                        eer.id AS examRegistrationid,
                        eer.name AS examRegistrationName,
                        eer.properties AS examRegistrationProperties,
                        eerb.properties AS examRegistrationBatchProperties,
                        p.name as currentProgramName,
                        ct.courseTypeID,
                        ct.typeName as courseTypeName,
                        s.code as subjectCode,
                        s.name as subjectName,
                        eers.properties as subjectProperties,
                        eerb.properties ->> '$.academicTermId' as academicTermId,
                        act.name as academicTermName,
                        eers.cm_academic_paper_subjects_id as academicPaperSubjectId,
                        aa.id as assessmentId,
                        aa.properties_value ->>'$.assessmentDate' AS assessmentDate,
                        aa.properties_value ->>'$.startTime' AS assessmentStartTime,
                        aa.properties_value ->>'$.endTime' AS assessmentEndTime,
                        esbrm.ec_block_student_reason_id as blockStudentReasonId,
                        ebsr.name as blockReasonName,
                        cpsa.staffName as blockReasoncontactPersonName,
                        ebsr.properties ->> '$.description' AS contactPersonDecription,
                        esbrmSub.ec_block_student_reason_id as subjectBlockStudentReasonId,
                        ebsrSub.name as subjectBlockReasonName,
                        cpsaSub.staffName as subjectBlockReasoncontactPersonName,
                        ebsrSub.properties ->> '$.description' AS SubjectContactPersonDecription
                    FROM
                        `groups` g
                    INNER JOIN ec_exam_registration_batch eerb ON
                        eerb.groups_id = g.id
                    INNER JOIN ec_exam_registration_subject eers ON
                        eers.ec_exam_registration_batch_id = eerb.id
                    INNER JOIN  cm_academic_paper_subjects aps ON 
                        eers.cm_academic_paper_subjects_id = aps.id
                    INNER JOIN  cm_academic_paper ap ON 
                        ap.id = aps.cm_academic_paper_id
                    INNER JOIN am_assessment aa ON
                        aa.id = eers.am_assessment_id
                    INNER JOIN  v4_ams_subject s ON 
                        aps.ams_subject_id = s.id
                    INNER JOIN ec_exam_registration eer ON
                        eer.id = eerb.ec_exam_registration_id
                    INNER JOIN  academic_term act ON 
                        act.id = CAST(eerb.properties ->> '$.academicTermId'AS CHAR)
                    INNER JOIN program p ON
                        p.id = CAST(g.properties ->> '$.programId' AS CHAR)
                    INNER JOIN ec_student_assessment_registration esar ON
                        esar.am_assessment_id = eers.am_assessment_id AND CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID' AND esar.ec_exam_registration_type = eer.type 
                    INNER JOIN student_program_account spa ON 
                        spa.current_program_id = p.id AND 
                        spa.student_id = esar.student_id 
                    INNER JOIN studentaccount sa ON 
                        sa.studentID = esar.student_id
                    INNER JOIN `course_type` ct ON
                        ct.courseTypeID = p.course_type_id
                    LEFT JOIN ec_student_block_reason_mapping esbrm ON
                        esbrm.student_id = sa.studentID AND esbrm.exam_registration_id = eer.id AND
                        esbrm.blocking_type = 'HALL_TICKET_BLOCKING' AND esbrm.cm_academic_paper_subjects_id IS NULL
                    LEFT JOIN ec_block_student_reason ebsr ON 
                        ebsr.id = esbrm.ec_block_student_reason_id AND
                        ebsr.type = 'SEMESTER_WISE'
                    LEFT JOIN staffaccounts cpsa ON 
                        cpsa.staffID = ebsr.contact_person_id 
                    LEFT JOIN ec_student_block_reason_mapping esbrmSub ON
                        esbrmSub.student_id = sa.studentID AND esbrmSub.exam_registration_id = eer.id AND
                        esbrmSub.blocking_type = 'HALL_TICKET_BLOCKING' AND esbrmSub.cm_academic_paper_subjects_id = aps.id
                    LEFT JOIN ec_block_student_reason ebsrSub ON 
                        ebsrSub.id = esbrmSub.ec_block_student_reason_id AND
                        ebsrSub.type = 'SUBJECT_WISE'
                    LEFT JOIN staffaccounts cpsaSub ON 
                        cpsaSub.staffID = ebsrSub.contact_person_id 
                    WHERE 1=1 AND (CAST(esar.properties ->> '$.syllabusSubType' AS CHAR) != 'MOOC' OR esar.properties ->> '$.syllabusSubType' IS NULL) ";
            $studentRegistrationDetails = $this->executeQueryForList($query.$whereQuery.$groupByQuery.$orderBy, $this->mapper[HallTicketsServiceMapper::GET_HALL_TICKET_DETAILS]);
            
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentRegistrationDetails;
    }
    /**
     * get Exam Eligibility Report
     * @param $searchRequest 
     * @return $studentDetails 
     * @author Krishnajith
     */
     public function getExamEligibilityReport($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $blockedSubjectsCountToBlockHallticket = CommonService::getInstance()->getSettings("EXAM_HALL_TICKET", "BLOCKED_SUBJECT_COUNT_TO_BLOCK_HALLTICKET");
            $searchRuleRequest = new SearchRuleRequest;
            $searchRuleRequest->name = "BLOCK_STUDENT_SETTINGS_RULE";
            $ruleObj = reset(RuleService::getInstance()->searchRule($searchRuleRequest))->rule;
            $blockedSubjectsCountToBlockHallticket = $ruleObj->blockedSubjectCountToBlockHallTicket ?? 0;
            $searchRuleRequest = new SearchRuleRequest;
            $searchRuleRequest->name = "HALL_TICKET_RULE";
            $hallTicketRule = reset(RuleService::getInstance()->searchRule($searchRuleRequest))->rule;
            $hallTicketRule = $hallTicketRule ? $hallTicketRule : new \stdClass;
            $isCheckAttendanceDueInControllerSideHallTicket = $hallTicketRule->isCheckAttendanceDueInControllerSideHallTicket == '1' ? true : false;
            $request = new \stdClass;
            $request->programId = $searchRequest->programId;
            $request->groupId = $searchRequest->groupId;
            $request->examRegistrationId = $searchRequest->examRegistrationId;
            $request->courseTypeId = $searchRequest->courseTypeId;
            $studentDetails = $this->getRegisteredStudentSubjectsDetailsForEligibilityReport($request);
            if(empty($studentDetails)){
                throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"No Students Found");
            }
           
            $showGenderWiseAttendance = false;
            if($isCheckAttendanceDueInControllerSideHallTicket){
                $showGenderWiseAttendance = CommonService::getInstance()->getSettings(SettingsConstants::EXAM_CONTROLLER, "EXAM_REGISTRATION_GENDER_WISE_ATTENDANCE_CHECK");
            }
            foreach($studentDetails as $student){
                if($showGenderWiseAttendance){
                    if(empty($student->examRegistrationProperties->genderWiseMinimumAttendance)){
                        throw new ExamControllerException (ExamControllerException::INVALID_PARAMETERS,"Gender wise attendance rule not added. Please contact exam controller.");
                    }
                    if(empty($student->gender) || (strtoupper($student->gender) != 'MALE' && strtoupper($student->gender) != 'FEMALE'  && strtoupper($student->studentGender) != 'OTHER') ){
                        throw new ExamControllerException (ExamControllerException::INVALID_PARAMETERS,"Gender details not added. Please contact exam controller.");
                    }
                    $student->examRegistrationProperties->genderWiseMinimumAttendance = (array) $student->examRegistrationProperties->genderWiseMinimumAttendance;
                }
                else{
                    $showGenderWiseAttendance = false;
                }
                $student->isHallTicketBlocked = false;
                $student->blockingMsg = "";
                if($student->blockReasons) {
                    $blockReasonMsg = "Hall Ticket Blocked ";
                    foreach($student->blockReasons as $reason){
                        $blockReasonMsg .= "<br> * Due to ".$reason->name .". ";
                        $blockReasonMsg .= $reason->contactPersonName ? "Please contact ".$reason->contactPersonName :"";
                        $blockReasonMsg .= $reason->contactPersonDecription ? " ".$reason->contactPersonDecription :"";
                    }
                    $student->isHallTicketBlocked = true;
                    $student->blockingMsg = $blockReasonMsg;
                }
                foreach($student->subjects as $subKey => $subject){
                    $subject->isSubjectBlocked = false;
                    $subject->blockingMsg = "";
                    if($subject->blockReasons) {
                        $blockReasonMsg = "Hall Ticket Blocked ";
                        foreach($subject->blockReasons as $reason){
                            $blockReasonMsg .= "<br> * Due to ".$reason->name .". ";
                            $blockReasonMsg .= $reason->contactPersonName ? "Please contact ".$reason->contactPersonName :"";
                            $blockReasonMsg .= $reason->contactPersonDecription ? " ".$reason->contactPersonDecription :"";
                        }
                        $subject->isSubjectBlocked = true;
                        $subject->blockingMsg = $blockReasonMsg;
                        $blockedSubjectCount ++;
                    }
                    $subject->assessmentDate =  $subject->assessmentDate ? date("d-m-Y", strtotime($subject->assessmentDate)) : '';
                    $subject->assessmentStartTime =  $subject->assessmentStartTime ? date("h:i A", strtotime($subject->assessmentStartTime)) : '';
                    $subject->assessmentEndTime =  $subject->assessmentEndTime ? date("h:i A", strtotime($subject->assessmentEndTime)) : '';
                    if(($isCheckAttendanceDueInControllerSideHallTicket) && $student->examRegistrationProperties->criteriaDuringMinimumAttendance == 'SUBJECT_WISE'){
                        if($showGenderWiseAttendance){
                            if ( !empty($student->examRegistrationProperties->genderWiseMinimumAttendance)){
                                $subject->subjectProperties->minimumAttendancePercentage = $student->examRegistrationProperties->genderWiseMinimumAttendance[strtoupper($student->gender)];
                            }
                        }
                        $attendanceTermWiseReportRequest = new AttendanceTermWiseReport();
                        $attendanceTermWiseReportRequest->studentId = $student->id;
                        $attendanceTermWiseReportRequest->termId = $student->academicTermId;
                        $attendanceTermWiseReportRequest->paperSubjectId = $subject->id;
                        $attendanceTermWiseReportRequest->attendanceClosingDate = $student->examRegistrationBatchProperties->attendanceClosingDate;
                        $subject->attendanceDetails = reset(AttendanceService::getInstance()->getTermWiseStudentAttendanceConfirmedReport($attendanceTermWiseReportRequest));
                        if($subject->subjectProperties->minimumAttendancePercentage > $subject->attendanceDetails->attendancePercentage){
                            if($subject->isSubjectBlocked ){
                                $subject->blockingMsg .= "<br> * Due to attendance shortage";
                            }
                            else{
                                $subject->isSubjectBlocked = true;
                                $subject->blockingMsg = "Hall Ticket Blocked <br> * Due to attendance shortage";
                            }
                            $blockedSubjectCount ++;
                        }
                    }
                }
                $student->subjects = array_values($student->subjects);
                if($blockedSubjectsCountToBlockHallticket && !$student->isHallTicketBlocked){
                    if($blockedSubjectCount >= $blockedSubjectsCountToBlockHallticket){
                        if($student->isHallTicketBlocked){
                            $student->blockingMsg .= "<br> Hall Ticket Blocked";
                        }
                        else{
                            $student->isHallTicketBlocked = true;
                            $student->blockingMsg = "Hall Ticket Blocked";
                        }
                    }
                }
               
                $student->examRegType = $student->examRegistrationType == "REGULAR" ? "Regular" : "Supplementary";
                $student->qrCodeContents = $this->setQrContents($student,$hallTicketRule);
                if((($isCheckAttendanceDueInStudentSideHallTicket && $searchRequest->isStudentSideHallTIcketRequest) || $isCheckAttendanceDueInControllerSideHallTicket) && $student->examRegistrationProperties->criteriaDuringMinimumAttendance == 'SEMESTER_WISE'){
                    $minAttendanceForExamReg = json_decode(CommonService::getInstance()->getSettings(SettingsConstents::EXAM_CONTROLLER, SettingsConstents::SEMESTER_EXAM_SETTINGS))->minAttendanceForExamReg;
                    if($minAttendanceForExamReg->enableDayWiseAttendanceChecking){
                        $semWiseRequest = new \stdClass;
                        $semWiseRequest->studentId = $student->id;
                        $semWiseRequest->termId = $student->academicTermId;
                        $semWiseRequest->examRegistrationId = $student->examRegistrationid;
                        $semWiseRequest->studentGender = $student->gender;
                        $semWiseRequest->workFlowId = $student->examRegistrationProperties->workFlowId;
                        $semWiseCriteria = ProfessionalCommonExamService::getInstance()->checkStudentSemesterWiseAttendanceCriteriaForExamRegistration($semWiseRequest);
                        if ( $semWiseCriteria->workflowId && $semWiseCriteria->eligibleForCondonation && !$semWiseCriteria->eligibleToApplyByDayWiseAttendance && !$examRegistration->isApplied && !$examRegistration->isRegistered){
                            $examRegistration->redirectToWorkFlowModule = 1;
                        }
                        if ( !$semWiseCriteria->eligibleToApplyByDayWiseAttendance && !$semWiseCriteria->isCondonationApproved){
                            $student->isHallTicketBlocked = true;
                            $student->blockingMsg = "Hall Ticket Blocked <br> * Due to attendance shortage";
                        }
                    }
                    else{
                        $attendanceTermWiseReportRequest = new AttendanceTermWiseReport();
                        $attendanceTermWiseReportRequest->studentId = $student->id;
                        $attendanceTermWiseReportRequest->termId = $student->academicTermId;
                        $student->attendanceDetails = reset(AttendanceService::getInstance()->getTermWiseStudentAttendanceConfirmedReport($attendanceTermWiseReportRequest));
                        if($student->examRegistrationProperties->minimumAttendancePercentage > $student->attendanceDetails->attendancePercentage){
                            if($student->isHallTicketBlocked){
                                $student->blockingMsg .= "<br> * Due to attendance shortage";
                            }
                            else{
                                $student->isHallTicketBlocked = true;
                                $student->blockingMsg = "Hall Ticket Blocked <br> * Due to attendance shortage";
                            }
                        }
                    }
                }
            }
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentDetails;
    }
 
    
    
}