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 / 30
CRAP
0.00% covered (danger)
0.00%
0 / 1854
StudentMarkListService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 30
56406.00
0.00% covered (danger)
0.00%
0 / 1854
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 getStudentListAndOtherDetails
0.00% covered (danger)
0.00%
0 / 1
342.00
0.00% covered (danger)
0.00%
0 / 83
 getconsolidatedMarkSheetForBatch
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 15
 getIndividualMarkCardForStudents
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 11
 getAllRegistredStudentMarkDetails
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 83
 getAllRegistredStudentMarkDetailsDummyData
0.00% covered (danger)
0.00%
0 / 1
306.00
0.00% covered (danger)
0.00%
0 / 264
 getUniversityMarkListTemplate
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 17
 getSupplementaryConsolidatedMarkSheetForBatch
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 23
 getSupplementaryStudentDetails
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 14
 getSupplementaryIndividualMarkCardForStudents
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 19
 getMarkHistoryForStudentSubject
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 57
 processSupplementaryStudentData
0.00% covered (danger)
0.00%
0 / 1
380.00
0.00% covered (danger)
0.00%
0 / 143
 getExamRegistrationDetailsDataForConsolidatedAndIndividualReports
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 48
 getCollegeDetailsForConsolidatedAndIndividualReports
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getAllGradeScemesByCurriculum
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 44
 getCurrentStudentExamResult
0.00% covered (danger)
0.00%
0 / 1
702.00
0.00% covered (danger)
0.00%
0 / 109
 getconsolidatedResultSheetStaffSide
0.00% covered (danger)
0.00%
0 / 1
156.00
0.00% covered (danger)
0.00%
0 / 47
 getAllStudentSubjectMarkDetailsByRequest
0.00% covered (danger)
0.00%
0 / 1
182.00
0.00% covered (danger)
0.00%
0 / 84
 getAllRegistredStudentRevaluationMarkDetails
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 103
 getRevaluationMemoForStudents
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 8
 getStudentSubjectCreditDetails
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 38
 getAllRegistredStudentMarkDetailsForGradeUpgradation
0.00% covered (danger)
0.00%
0 / 1
210.00
0.00% covered (danger)
0.00%
0 / 194
 getRevaluationStudentListAndOtherDetails
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 42
 getAllRevaluationRegistredStudentMarkDetails
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 84
 getRevaluationIndividualMarkCardForStudents
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 11
 getExamRegistrationDetailsDataForRevaluationIndividualReports
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 47
 getFinalMarkCardForStudents
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 33
 getCurrentStudentBatchDetails
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 51
 getCurrentStudentExamResultMultipleSemesters
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 101
 getStudentSubjectResults
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 69
<?php
namespace com\linways\ec\core\service;
use com\linways\ec\core\dto\ExamRegistrationBatch;
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\mapper\StudentMarkListServiceMapper;
use com\linways\ec\core\request\SearchExamRegistrationBatchRequest;
use com\linways\ec\core\service\ExamRegistrationService;
use com\linways\ec\core\service\CommonExamService;
use com\linways\ec\core\constant\SettingsConstants;
use com\linways\core\ams\professional\service\CommonService;
use com\linways\ec\core\constant\StudentExamRegistrationStatus;
use com\linways\ec\core\constant\ExamRegistrationTypeConstants;
use com\linways\core\ams\professional\util\CommonUtil;
use com\linways\ec\core\service\RegularConsolidatedMarkListGenerator\RegularConsolidatedMarkListGenerator;
use com\linways\ec\core\service\RegularIndividualMarkCardGenerator\RegularIndividualMarkCardGenerator;
use com\linways\ec\core\service\SupplementaryConsolidatedMarkListGenerator\SupplementaryConsolidatedMarkListGenerator;
use com\linways\ec\core\service\SupplementaryIndividualMarkCardGenerator\SupplementaryIndividualMarkCardGenerator;
use com\linways\ec\core\service\RevaluationIndividualMarkCardGenerator\RevaluationIndividualMarkCardGenerator;
use com\linways\ec\core\service\RevaluationMemoGenerator\RevaluationMemoGenerator;
use com\linways\ec\core\service\StudentExamRegistrationService;
use com\linways\ec\core\request\SearchRuleRequest;
use com\linways\ec\core\service\ExamRegistrationBatchService;
use com\linways\ec\core\service\RuleService;
use com\linways\core\ams\professional\util\PdfUtil;
use com\linways\base\util\TwigRenderer;
use TCPDFBarcode;
class StudentMarkListService extends BaseService
{
    use MakeSingletonTrait;
    private function __construct() {
        $this->mapper = StudentMarkListServiceMapper::getInstance()->getMapper();
    }
      /**
     * get Passed Students In Supply ExamRegistrations
     * @param $searchRequest 
     * @return $programResult 
     */
    public function getStudentListAndOtherDetails($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $searchRuleRequest = new SearchRuleRequest;
        $searchRuleRequest->name = "INDIVIDUAL_MARK_CARD_SETTINGS";
        $individualMarkCardSettings = reset(RuleService::getInstance()->searchRule($searchRuleRequest))->rule;
        $isSeperateNewAndOldFormatMarkCard = false;
        $displayOnlineMarksCard = false;
        $enableWithHeldReason = false;
        $isShowSemestersForPgDiploma = false;
        $isSPlusRInSupplementaryMarkCard = false;
        $isOnlySPlusRInSupplementaryMarkCard = false;
        $request = new \stdClass;
        $response = new \stdClass;
        $response->firstYearSemesterList = [];
        $examRegistrationDetails = new \stdClass;
        $request->groupId = $searchRequest->groupId;
        $request->examRegistrationId = $searchRequest->examRegistrationId;
        $examRegistrationDetailsArray = ExamRegistrationService::getInstance()->searchDetailedExamRegistrationDetails($request);
        if(empty($examRegistrationDetailsArray)){
            throw new ExamControllerException(ExamControllerException::NO_DETAILS_FOUND,"No Details Found");
        }
        else{
            $examRegistrationDetails->name = $examRegistrationDetailsArray[0]->name;
            $examRegistrationDetails->id = $examRegistrationDetailsArray[0]->id;
            $examRegistrationDetails->type = $examRegistrationDetailsArray[0]->type;
            $examRegistrationDetails->groupId = $examRegistrationDetailsArray[0]->groups[0]->groupId;
            $examRegistrationDetails->groupName = $examRegistrationDetailsArray[0]->groups[0]->groupName;
            $examRegistrationDetails->courseTypeID = $examRegistrationDetailsArray[0]->groups[0]->courseTypeID;
            $examRegistrationDetails->courseTypeName = $examRegistrationDetailsArray[0]->groups[0]->courseTypeName;
            $examRegistrationDetails->batchStartYear = $examRegistrationDetailsArray[0]->groups[0]->batchStartYear;
            $examRegistrationDetails->deptID = $examRegistrationDetailsArray[0]->groups[0]->deptID;
            $examRegistrationDetails->deptName = $examRegistrationDetailsArray[0]->groups[0]->deptName;
            $examRegistrationDetails->degreeName = $examRegistrationDetailsArray[0]->groups[0]->degreeName;
            $examRegistrationDetails->academicTermId = $examRegistrationDetailsArray[0]->groups[0]->academicTermId;
            $examRegistrationDetails->academicTermName = $examRegistrationDetailsArray[0]->groups[0]->academicTermName;
            if(($examRegistrationDetails->courseTypeName == "PG") && ($examRegistrationDetails->degreeName == "DIPLOMA")){
                $isShowSemestersForPgDiploma = true;
                $response->firstYearSemesterList = CommonExamService::getInstance()->getFirstYearSemesters();
            }
            if($individualMarkCardSettings && $individualMarkCardSettings->isSeperateNewAndOldFormat){
                $isSeperateNewAndOldFormatMarkCard = true;
            }
            if($individualMarkCardSettings && $individualMarkCardSettings->displayRegularOnlineMarkCard){
                $displayOnlineMarksCard = true;
            }
            if($individualMarkCardSettings && $individualMarkCardSettings->enableReasonForWithHeld){
                $enableWithHeldReason = true;
            }
            if($individualMarkCardSettings && $individualMarkCardSettings->isSPlusRInSupplementaryMarkCard){
                $isSPlusRInSupplementaryMarkCard = true;
            }
            if($individualMarkCardSettings && $individualMarkCardSettings->isOnlySPlusRInSupplementaryMarkCard){
                $isOnlySPlusRInSupplementaryMarkCard = true;
            }
            $studentsDetails = $this->getAllRegistredStudentMarkDetails($request);
            $registeredStudents = [];
            if( $individualMarkCardSettings->sortByRollNumber ){
                uasort($studentsDetails, function($a, $b) {
                    return ($a->rollNo > $b->rollNo);
                });
            }
            foreach($studentsDetails as $student){
                $registeredStudents[$student->studentId]->studentId = $student->studentId;
                $registeredStudents[$student->studentId]->isSelected = false;
                $registeredStudents[$student->studentId]->studentName = $student->studentName;
                $registeredStudents[$student->studentId]->regNo = $student->regNo;
                $registeredStudents[$student->studentId]->rollNo = $student->rollNo;
                $registeredStudents[$student->studentId]->withHeldStatus = $student->isResultWithHeld ? true : false;
                $registeredStudents[$student->studentId]->examRegistrationId = $examRegistrationDetails->id ;
            }
            if(empty($registeredStudents)){
                throw new ExamControllerException(ExamControllerException::NO_DETAILS_FOUND,"No Details Found");
            }
            $registeredStudents = array_values($registeredStudents); 
            $response->examRegistrationDetails = $examRegistrationDetails;
            $response->studentList = $registeredStudents;
            $response->displayOnlineMarksCard = $displayOnlineMarksCard;
            $response->enableWithHeldReason = $enableWithHeldReason;
            $response->isShowSemestersForPgDiploma = $isShowSemestersForPgDiploma;
            $response->isSeperateNewAndOldFormatMarkCard = $isSeperateNewAndOldFormatMarkCard;
            $response->isSPlusRInSupplementaryMarkCard = $isSPlusRInSupplementaryMarkCard;
            $response->isOnlySPlusRInSupplementaryMarkCard = $isOnlySPlusRInSupplementaryMarkCard;
            return $response;
        }
    }
    public function getconsolidatedMarkSheetForBatch($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $request = new \stdClass;
        $request->groupId = $searchRequest->groupId;
        $request->examRegistrationId = $searchRequest->examRegistrationId;
        $request->hideSeal = false;
        $request->hideExternalOrInternalMark = false;
        if($searchRequest->hideExternalOrInternalMark =="true" || $searchRequest->hideExternalOrInternalMark === true){
            $request->hideExternalOrInternalMark = true;
        }
        if($searchRequest->hideSeal =="true" || $searchRequest->hideSeal === true){
            $request->hideSeal = true;
        }
        $programResult = RegularConsolidatedMarkListGenerator::getInstance()->getConsolidatedMarkListResultData($request);
        return $programResult;
    }
    public function getIndividualMarkCardForStudents($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $request = new \stdClass;
        $request->groupId = $searchRequest->groupId;
        $request->examRegistrationId = $searchRequest->examRegistrationId;
        $request->markCardOption = $searchRequest->markCardOption;
        $request->displayContentOptions = $searchRequest->displayContentOptions;
        $request->selectedSemesters = $searchRequest->selectedSemesters;
        $request->studentId = $searchRequest->studentId;
        $programResult = RegularIndividualMarkCardGenerator::getInstance()->getIndividualMarkCardResultData($request);
        return $programResult;
    }
     /**
     * get All Registered Students Details
     * @param $searchRequest 
     * @return $studentDataDetails 
     */
    public function getAllRegistredStudentMarkDetails($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try
        {
            $orderBy = "ORDER BY spa.properties->>'$.registerNumber' ASC";
            $whereQuery = "";
            if(!empty($searchRequest->courseTypeId)) {
                $whereQuery .= " AND p.course_type_id = '$searchRequest->courseTypeId'";
            }
            if(!empty($searchRequest->admissionYear)) {
                $whereQuery .= " AND g.properties ->> '$.startYear' = '$searchRequest->admissionYear'";
            }
            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->studentId)) {
                $studentIdString = is_array($searchRequest->studentId) ? "'" . implode("','",$searchRequest->studentId) . "'" : "'".$searchRequest->studentId."'";
                $whereQuery .= " AND spa.student_id IN ( $studentIdString )";
            }
            if(!empty($searchRequest->orderByRollNo)) {
                $orderBy = "ORDER BY spa.properties->>'$.rollNumber' ASC";
            }
            $query = "SELECT DISTINCT
                            sa.studentID AS id,
                            sa.studentID AS studentId,
                            sa.studentName,
                            spa.properties->>'$.registerNumber' as regNo,
                            spa.properties->>'$.rollNumber' as rollNo,
                            g.id AS groupId,
                            g.name AS groupName,
                            act.id AS academicTermId,
                            act.name AS academicTerm,
                            d.deptName,
                            d.deptID,
                            eserd.properties->>'$.isResultWithHeld' AS isResultWithHeld,
                            eserd.properties->>'$.universityExamSeatNo' AS seatNo,
                            eserd.properties->>'$.universityExamSeatNo' AS seatNoOld
                        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  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 = g.properties ->> '$.programId'
                        INNER JOIN ec_student_assessment_registration esar ON
                            esar.am_assessment_id = eers.am_assessment_id AND 
                            esar.ec_exam_registration_type = eer.type AND 
                            ((CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND 
                            CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID') OR  
                            esar.properties->>'$.studentAttendanceStatus' = 'FE' AND
                            esar.properties->>'$.registrationStatus' ='NOT_REGISTERED' )
                        INNER JOIN student_program_account spa ON 
                            spa.student_id  = esar.student_id  AND
                            spa.current_program_id = p.id 
                        INNER JOIN studentaccount sa ON 
                            sa.studentID = esar.student_id
                        INNER JOIN department d ON
                            d.deptID = g.properties ->> '$.departmentId'
                        INNER JOIN  academic_term act ON 
                            act.id = CAST(eerb.properties ->> '$.academicTermId'AS CHAR) 
                        INNER JOIN ec_student_exam_registration_details eserd ON
                            eserd.student_id = esar.student_id AND 
                            eserd.ec_exam_registration_id = eer.id 
                        WHERE 1=1 ";
            $studentDataDetails = $this->executeQueryForList($query.$whereQuery.$orderBy);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentDataDetails;
    }
    /**
     * get All Registered Students Details
     * @param $searchRequest 
     */
    public function getAllRegistredStudentMarkDetailsDummyData($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try
        {
            $orderBy = "ORDER BY spa.properties->>'$.registerNumber' ASC , CAST(cap.properties ->> '$.order' AS UNSIGNED) ASC , CAST(aps.properties ->> '$.order' AS UNSIGNED) ASC ";
            $joinCondition = "";
            if ( $searchRequest->orderByCurriculum ){
                $joinCondition = " INNER JOIN cm_syllabus_academic_term_settings csats ON csats.id = cap.cm_syllabus_academic_term_settings_id 
                INNER JOIN cm_curriculum_syllabus_relation ccsr ON ccsr.cm_syllabus_id = csats.cm_syllabus_id AND ccsr.cm_curriculum_id = g.cm_curriculum_id ";
                
                $orderBy = "ORDER BY spa.properties->>'$.registerNumber' ASC , ccsr.orderNo ASC, CAST(cap.properties ->> '$.order' AS UNSIGNED) ASC , CAST(aps.properties ->> '$.order' AS UNSIGNED) ASC ";
            }
            $whereQuery = "";
            if(!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','",$searchRequest->groupId) . "'" : "'".$searchRequest->groupId."'";
                $whereQuery .= " AND g.id IN ( $groupIdString )";
            }
            if(!empty($searchRequest->selectedSemesters)) {
                $semesterIdString = is_array($searchRequest->selectedSemesters) ? "'" . implode("','",$searchRequest->selectedSemesters) . "'" : "'".$searchRequest->selectedSemesters."'";
                $whereQuery .= " AND act.id IN ( $semesterIdString )";
            }
            if(!empty($searchRequest->examRegistrationId)) {
                $examRegistrationIdString = is_array($searchRequest->examRegistrationId) ? "'" . implode("','",$searchRequest->examRegistrationId) . "'" : "'".$searchRequest->examRegistrationId."'";
                $whereQuery .= " AND eer.id IN ( $examRegistrationIdString )";
            }
            if(!empty($searchRequest->studentId)) {
                $studentIdString = is_array($searchRequest->studentId) ? "'" . implode("','",$searchRequest->studentId) . "'" : "'".$searchRequest->studentId."'";
                $whereQuery .= " AND sa.studentID IN ( $studentIdString )";
            }
            if(!empty($searchRequest->excludeMinorHonor)) {
                $whereQuery .= " AND  ( (eer.properties ->> '$.isHonorCourse' IS NULL OR eer.properties ->> '$.isHonorCourse' != '1') AND (eer.properties ->> '$.isMinorCourse' IS NULL OR eer.properties ->> '$.isMinorCourse' != '1'))";
            }
            $query = "SELECT DISTINCT
                        sa.studentID AS id,
                        sa.studentID AS studentId,
                        sa.studentName,
                        sa.studentMother AS motherName,
                        spa.properties->>'$.rollNumber' AS rollNo,
                        spa.properties->>'$.registerNumber' AS regNo,
                        spa.properties->>'$.universityRegisterNumber' AS universityRegNo,
                        sa.admissionNo,
                        sa.studentBirthday as dob,
                        sa.myImage, 
                        sa.fatherName as fatherName,
                        sa.reservationID AS reservationID,
                        g.properties ->> '$.startYear' as startYear,
                        sa.abcId as abcId,
                        sa.student_aadhar_name AS studentAadharName,
                        sa.studentGender,
                        g.id AS groupId,
                        g.name AS groupName,
                        g.properties ->> '$.optionName' AS batchOptionName,
                        act.id AS academicTermId,
                        act.name AS academicTermName,
                        act.properties ->>'$.orderNo' AS academicOrderNo,
                        dept.deptID,
                        deg.name AS degreeName,
                        deg.description AS degreeDescription,
                        deg.id AS degreeId,
                        religion.religionName AS religionName,
                        dept.deptName,
                        dept.departmentDesc as deptDesc,
                        ct.courseTypeID,
                        ct.typeName AS courseTypeName,
                        ct.course_Type AS courseType,
                        g.properties ->> '$.startYear' AS academicYear,
                        eer.type AS latestExamType,
                        eer.properties ->> '$.examYear' AS latestExamYear,
                        eer.properties ->> '$.examMonth' AS latestExamMonth,
                        COALESCE(cap.properties ->> '$.order', 0) * 100 + COALESCE(aps.properties ->> '$.order', 0) as subjectPriority,
                        eserd.properties->>'$.universityExamSeatNo' AS universityExamSeatNo,
                        esmdsem.mark_details ->>'$.sgpa' AS semesterSgpa,
                        esmdsem.mark_details ->>'$.percentage' AS semesterPercentage,
                        esmdsem.mark_details ->>'$.grade' AS semesterGrade,
                        esmdsem.mark_details ->>'$.markObtained' AS semesterMarkObtained,
                        esmdsem.mark_details ->>'$.class' AS semesterClass,
                        esmdsem.mark_details ->>'$.totalMarks' AS semesterTotalMarks,
                        esmdsem.mark_details ->>'$.credit' AS semesterCredit,
                        esmdsem.mark_details ->>'$.gradePoint' AS semesterGradePoint,
                        esmdsem.mark_details ->>'$.creditGradePoint' AS semesterCreditGradePoint,
                        esmdsem.mark_details ->>'$.totalEarnedCredits' AS totalEarnedCredits,
                        esmdsem.mark_details ->>'$.semesterCgpa' AS semesterCgpa,
                        esmdsem.mark_details AS semesterMarkDetails,
                        esmdsem.mark_history AS semesterMarkHistory,
                        esmdsem.failed_status AS semesterFailedStatus,
                        str.name AS streamName,
                        str.properties->>'$.abbreviation' AS streamDesc,
                        s.code AS subjectCode,
                        aps.properties ->> '$.syllabusName' AS syllabusName,
                        aps.properties ->> '$.classType' AS classType,
                        aps.properties ->>'$.courseCode' AS courseCode,
                        aps.properties ->> '$.excludeSubjectFromTotal' AS excludeSubjectFromTotal,
                        scat.subjectcatID AS subjectCategoryId,
                        scat.subjectcatName AS subjectCategoryName,
                        scat.subjectcatPriority AS subjectCategoryPriority,
                        s.id AS amsSubjectId,
                        s.name AS subjectName,
                        s.description AS subjectDesc,
                        eers.cm_academic_paper_subjects_id AS academicPaperSubjectId,
                        esmdsub.mark_details ->>'$.markObtained' AS subjectMarkObtained,
                        esmdsub.mark_details ->>'$.isExternalFailed' AS isExternalFailed,
                        esmdsub.mark_details ->>'$.externalGrade' AS subjectExtrenalGrade,
                        esmdsub.mark_details ->>'$.externalGradePoint' AS subjectExternalGradePoint,
                        esmdsub.mark_details ->>'$.percentageObtainedExternal' AS percentageObtainedExternal,
                        esmdsub.mark_details ->>'$.percentageObtainedInternal' AS percentageObtainedInternal,
                        esmdsub.mark_details ->>'$.wgpa' AS subjectWgpa,
                        esmdsub.mark_details->>'$.attendanceStatus' AS subjectAttendanceStatus,
                        esmdsub.class AS subjectClass,
                        esmdsub.percentage AS subjectPercentage,
                        esmdsub.grade AS subjectGrade,
                        esmdsub.failed_status AS subjectFailedStatus,
                        esmdsub.mark_details ->>'$.externalMark' AS externalMark,
                        IF (esmdsubcon.mark_details ->>'$.graceMark' IS NULL,0,esmdsubcon.mark_details ->>'$.graceMark') AS graceMark,
                        esmdsub.mark_details ->>'$.gradePoint' AS subGradePoint,
                        esmdsub.mark_details ->>'$.gradePoint' AS subjectGradePoint,
                        esmdsub.mark_details ->>'$.creditGradePoint' AS subCreditGradePoint,
                        esmdsub.mark_details ->>'$.creditGradePoint' AS subjectCreditGradePoint,
                        esmdsub.mark_details ->>'$.internalAttendanceStatus' AS internalAttendanceStatus,
                        esmdsub.mark_details ->>'$.internalGrade' AS subjectInternalGrade,
                        esmdsub.mark_details ->>'$.internalGradePoint' AS subjectInternalGradePoint,
                        esmdsub.mark_details ->>'$.isInternalNull' AS isInternalNull,
                        esmdsub.mark_details ->>'$.internalMark' AS internalMark,
                        esmdsub.mark_details ->>'$.revaluationId' AS subjectRevaluationId,
                        esmdsub.mark_details ->>'$.hasRevaluationMark' AS subjectHasRevaluationMark,
                        esmdsub.mark_details ->>'$.withoutRevaluationIsFailed' AS subjectWithoutRevaluationIsFailed,
                        esmdsub.mark_details ->>'$.withoutRevaluationGrade' AS subjectWithoutRevaluationGrade,
                        esmdsub.mark_details ->>'$.subCoursesResultStatus' AS subCoursesResultStatus,
                        esmdsub.mark_details ->>'$.subCoursesInternalMaxMark' AS subCoursesInternalMaxMark,
                        esmdsub.mark_details ->>'$.subCoursesExternalMaxMark' AS subCoursesExternalMaxMark,
                        esmdsub.mark_details ->>'$.subCoursesTotalMaxMark' AS subCoursesTotalMaxMark,
                        esmdsub.mark_details ->>'$.subCoursesInternalMark' AS subCoursesInternalMark,
                        esmdsub.mark_details ->>'$.subCoursesExternalMark' AS subCoursesExternalMark,
                        esmdsub.mark_details ->>'$.subCoursesGradePoint' AS subCoursesGradePoint,
                        esmdsub.mark_details ->>'$.subCoursesGrade' AS subCoursesGrade,
                        esmdsub.mark_details ->>'$.subCoursesTotalObtainedMark' AS subCoursesTotalObtainedMark,
                        esmdsub.mark_details ->>'$.subCoursesCreditGradePoint' AS subCoursesCreditGradePoint,
                        esar.properties ->>'$.studentAttendanceStatus' AS studentInternalAttendanceStatus,
                        IF(esar.properties->>'$.syllabusSubType' = 'MOOC',1,0) AS isMoocSubject,
                        esar.properties->>'$.MOOC_SUBJECT_CODE' as moocSubjectCode, 
                        esar.properties->>'$.MOOC_SUBJECT_NAME' as moocSubjectName,
                        esar.properties->>'$.MOOC_SUBJECT_MONTH_YEAR' as moocSubjectMonthYear,
                        esar.properties->>'$.syllabusSubType' as syllabusSubType,
                        esar.properties->>'$.moocCertificateStatus' as moocCertificateStatus,
                        esar.properties->>'$.registrationType' as registrationType,
                        esmdsubcon.mark_details ->>'$.internalAttendance' AS subjectInternalAttendance,
                        esmdsubcon.mark_details ->>'$.credit' AS subjectCredit,
                        esmdsubcon.mark_details ->>'$.externalMaxMark' AS externalMaxMark,
                        esmdsubcon.mark_details ->>'$.internalMaxMark' AS internalMaxMark,
                        esmdsubcon.mark_details ->>'$.totalMarks' AS subjectTotalMarks,
                        esmdsubcon.mark_details ->>'$.isExternal' AS isExternal,
                        esmdsubcon.mark_details ->>'$.isInternal' AS isInternal,
                        esmdsubcon.mark_details ->>'$.isInternalFailed' AS isInternalFailed,
                        esmdsubcon.mark_details ->>'$.categoryCode' AS subjectCategoryCode,
                        esmdsubcon.mark_details ->>'$.internalPassPercentage' AS subjectInternalPassPercentage,
                        esmdsubcon.mark_details ->>'$.externalPassPercentage' AS subjectExternalPassPercentage,
                        esmdsubcon.mark_details ->>'$.aggregatePassPercentage' AS subjectAggregatePassPercentage,
                        esmdsubcon.mark_history AS subjectMarkHistory,
                        esmdsubcon.mark_details AS subjectConsolidatedMarkDetails,
                       
                        ecmdcourse.mark_details ->>'$.cgpa' AS cgpa,
                        ecmdcourse.percentage AS overallPercentage,
                        ecmdcourse.mark_details ->>'$.grade' AS overallGrade,
                        ecmdcourse.mark_details ->>'$.class' AS overallClass,
                        ecmdcourse.mark_details ->>'$.markObtained' AS courseObtainedMark,
                        ecmdcourse.mark_details ->>'$.totalMarks' AS courseTotalMark,
                        ecmdcourse.mark_details ->>'$.creditxMark' AS courseCreditxMark,
                        ecmdcourse.mark_details ->>'$.creditGradePoint' AS courseCreditGradePoint,
                        ecmdcourse.mark_details ->>'$.credit' AS courseTotalCredit,
                        ecmdcourse.mark_details ->>'$.wgp' AS courseWgp,
                        ecmdcourse.mark_details ->>'$.wgpa' AS courseWgpa,
                        ecmdcourse.mark_details ->>'$.gradePoint' AS courseGradePoint,
                        ecmdcourse.failed_status AS courseFailedStatus,
                        esbrm.ec_block_student_reason_id as blockStudentReasonId,
                        ebsr.name as blockReasonName,
                        cpsa.staffName as contactPersonName,
                        ebsr.properties ->> '$.description' AS contactPersonDecription,
                        eserd.properties->>'$.isResultWithHeld' AS isResultWithHeld,
                        eer.id as examRegId,
                        eerb.properties as examBatchProperties,
                        eer.type as examType,
                        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 cap ON 
                        cap.id = aps.cm_academic_paper_id
                    $joinCondition
                    INNER JOIN  v4_ams_subject s ON 
                        aps.ams_subject_id = s.id
                    INNER JOIN program p ON
                        p.id = g.properties ->> '$.programId'
                    INNER JOIN ec_exam_registration eer ON
                        eer.id = eerb.ec_exam_registration_id
                    INNER JOIN ec_student_assessment_registration esar ON
                        esar.am_assessment_id = eers.am_assessment_id AND 
                        esar.ec_exam_registration_type = eer.type AND
                        ((CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND 
                            CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID' ) OR 
                            CAST(esar.properties->>'$.studentAttendanceStatus' AS CHAR) = 'FE' AND
                            CAST(esar.properties->>'$.registrationStatus' AS CHAR) ='NOT_REGISTERED')
                    INNER JOIN ec_student_exam_registration_details eserd ON
                        eserd.student_id = esar.student_id AND 
                        eserd.ec_exam_registration_id = eer.id 
                    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
                    INNER JOIN `course_type` ct ON
                        ct.courseTypeID = p.course_type_id
                    LEFT JOIN stream str ON
                         JSON_SEARCH( p.stream_id, 'one', str.id) IS NOT NULL
                    INNER JOIN ec_semester_mark_details esmdsem ON
                        esmdsem.groups_id = eerb.groups_id AND esmdsem.academic_term_id = act.id AND esmdsem.student_id = sa.studentID 
                    LEFT JOIN  ec_course_mark_details ecmdcourse ON
                        ecmdcourse.groups_id = eerb.groups_id AND ecmdcourse.student_id = sa.studentID 
                    INNER JOIN ec_subject_mark_details esmdsub ON
                        esmdsub.ec_exam_registration_id = eerb.ec_exam_registration_id AND esmdsub.groups_id = eerb.groups_id AND esmdsub.cm_academic_paper_subjects_id = eers.cm_academic_paper_subjects_id AND esmdsub.student_id = sa.studentID 
                    INNER JOIN ec_consolidated_subject_mark_details esmdsubcon ON
                        esmdsubcon.groups_id = eerb.groups_id AND esmdsubcon.cm_academic_paper_subjects_id = eers.cm_academic_paper_subjects_id AND esmdsubcon.student_id = sa.studentID 
                    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 = 'RESULT_BLOCKING'
                    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 subject_category scat ON
                        scat.subjectcatID = aps.properties ->> '$.subjectTypeId' 
                    LEFT JOIN religion religion ON
                        religion.religionID = sa.religion
                    LEFT JOIN cm_subject_types cst ON cst.id = aps.subject_type_id
                    WHERE 1=1";
            $studentMarkDetails = $this->executeQueryForList($query.$whereQuery.$orderBy, $this->mapper[StudentMarkListServiceMapper::OVER_ALL_MARK_DETAILS]);
            foreach($studentMarkDetails as $student){
                $student->isResultBlocked = false;
                $student->blockingMsg = "";
                if($student->blockReasons ) {
                    $blockReasonMsg = "Result 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->isResultBlocked = true;
                    $student->blockingMsg = $blockReasonMsg;
                }
            }
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentMarkDetails;
    }
     /**
     * Method for getting mark list template for an examType
     * @input $examType
     * Return marklistTemplate
     * @author Krishnajith
     */
    
    public function getUniversityMarkListTemplate($examType){
        $sql = null;
        $examType = $this->realEscapeString($examType);
        $markListTemplate = null;
        $sql = "SELECT 
                    templateName AS templateName 
                FROM 
                    universityMarkListTemplates 
                WHERE 
                    examType = '$examType' AND 
                    isActive = 1";
        try {
            $markListTemplate = $this->executeQueryForObject($sql)->templateName;
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(), $e->getMessage());
        }
        return $markListTemplate;
    }
    /**
     * Get Supplementary consolidated mark sheet
     * @param searchRequest
     * @return programResult
     * @author Krishnajith
     */
    public function getSupplementaryConsolidatedMarkSheetForBatch($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $request = new \stdClass;
        $request->groupId = $searchRequest->groupId;
        $searchrequest = new \stdClass;
        $searchrequest->examRegistrationId = $searchRequest->examRegistrationId;
        $searchrequest->groupId = $searchRequest->groupId;
        $examRegistrationDetails = ExamRegistrationService::getInstance()->searchDetailedExamRegistrationDetails($searchrequest);
        $request->selectedSemesters = $examRegistrationDetails[0]->groups[0]->academicTermId;
        $request->examMonth = $examRegistrationDetails[0]->examMonth;
        $request->examYear = $examRegistrationDetails[0]->examYear;
        $request->examRegistrationId = $searchRequest->examRegistrationId;
        $request->marksCardType = $searchRequest->marksCardType;
        $request->hideSeal = false;
        $request->hideExternalOrInternalMark = false;
        if($searchRequest->hideExternalOrInternalMark =="true" || $searchRequest->hideExternalOrInternalMark === true){
            $request->hideExternalOrInternalMark = true;
        }
        if($searchRequest->hideSeal =="true" || $searchRequest->hideSeal === true){
            $request->hideSeal = true;
        }
        $programResult = SupplementaryConsolidatedMarkListGenerator::getInstance()->getConsolidatedMarkListResultData($request);
        return $programResult;
    }
     /**
     * Get Supplementary consolidated mark sheet
     * @param searchRequest
     * @return programResult
     * @author Krishnajith
     */
    public function getSupplementaryStudentDetails($searchRequest){
    
        $searchRequest = $this->realEscapeObject($searchRequest);
        $request = new \stdClass;
        $request->groupId = $searchRequest->groupId;
        $request->hideSeal = false;
        $request->hideExternalOrInternalMark = false;
        if($searchRequest->hideExternalOrInternalMark =="true" || $searchRequest->hideExternalOrInternalMark === true){
            $request->hideExternalOrInternalMark = true;
        }
        if($searchRequest->hideSeal =="true" || $searchRequest->hideSeal === true){
            $request->hideSeal = true;
        }
        $programResult = SupplementaryConsolidatedMarkListGenerator::getInstance()->getConsolidatedMarkListResultData($request);
        return $programResult;
    }
    /**
     * Get Supplementary Individual mark sheet
     * @param searchRequest
     * @return programResult
     * @author Krishnajith
     */
    public function getSupplementaryIndividualMarkCardForStudents($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $request = new \stdClass;
        $request->groupId = $searchRequest->groupId;
        $request->examRegistrationId = $searchRequest->examRegistrationId;
        $searchrequest = new \stdClass;
        $searchrequest->examRegistrationId = $searchRequest->examRegistrationId;
        $searchrequest->groupId = $searchRequest->groupId;
        $examRegistrationDetails = ExamRegistrationService::getInstance()->searchDetailedExamRegistrationDetails($searchrequest);
        $request->selectedSemesters = $examRegistrationDetails[0]->groups[0]->academicTermId;
        $request->examMonth = $examRegistrationDetails[0]->examMonth;
        $request->examYear = $examRegistrationDetails[0]->examYear;
        $request->supplementaryExamRegistrationId = $searchRequest->examRegistrationId;
        $request->markCardOption = $searchRequest->markCardOption;
        $request->displayContentOptions = $searchRequest->displayContentOptions;
        $request->selectedSemesters = $searchRequest->selectedSemesters;
        $request->studentId = $searchRequest->studentId;
        $programResult = SupplementaryIndividualMarkCardGenerator::getInstance()->getIndividualMarkCardResultData($request);
        return $programResult;
    }
    /**
     * Get Mark History For Student Subject
     * @param searchRequest
     * @return markHistory
     * @author Krishnajith
     */
    public function getMarkHistoryForStudentSubject($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try
        {
            $orderBy = "ORDER BY eer.properties ->> '$.examYear' ASC , eer.properties ->> '$.examMonth' ASC";
            $whereQuery = "";
            if(!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','",$searchRequest->groupId) . "'" : "'".$searchRequest->groupId."'";
                $whereQuery .= " AND g.id IN ( $groupIdString )";
            }
            if(!empty($searchRequest->studentId)) {
                $studentIdString = is_array($searchRequest->studentId) ? "'" . implode("','",$searchRequest->studentId) . "'" : "'".$searchRequest->studentId."'";
                $whereQuery .= " AND sa.studentID IN ( $studentIdString )";
            }
            if(!empty($searchRequest->academicPaperSubjectId)) {
                $academicPaperSubjectIdString = is_array($searchRequest->academicPaperSubjectId) ? "'" . implode("','",$searchRequest->academicPaperSubjectId) . "'" : "'".$searchRequest->academicPaperSubjectId."'";
                $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ( $academicPaperSubjectIdString )";
            }
            $query = "SELECT DISTINCT
                        esmdsub.percentage as percentage,
                        esmdsub.grade as grade,
                        esmdsub.failed_status as failedStatus,
                        esmdsub.total_mark AS markObtained,
                        esmdsub.class AS class,
                        CAST(esmdsub.mark_details ->>'$.externalMark' AS DECIMAL(8,2)) +  CAST(IF (esmdsubcon.mark_details ->>'$.graceMark' IS NULL,0,esmdsubcon.mark_details ->>'$.graceMark') AS DECIMAL(8,2)) AS externalMark,
                        esmdsub.mark_details ->>'$.resultStatus' AS isExternalFailed,
                        esmdsub.mark_details ->>'$.wgpa' AS wgpa,
                        1 AS isExternal,
                        eer.id AS examRegistrationId,
                        eer.type AS examType,
                        eer.properties ->> '$.examYear' AS examYear,
                        eer.properties ->> '$.examMonth' AS examMonth
                    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 ec_exam_registration eer ON
                        eer.id = eerb.ec_exam_registration_id
                    INNER JOIN ec_student_assessment_registration esar ON
                        esar.am_assessment_id = eers.am_assessment_id
                        esar.ec_exam_registration_type = eer.type AND
                        CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND 
                        CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID'
                    INNER JOIN studentaccount sa ON 
                        sa.studentID = esar.student_id
                    INNER JOIN ec_subject_mark_details esmdsub ON
                        esmdsub.ec_exam_registration_id = eerb.ec_exam_registration_id AND esmdsub.groups_id = eerb.groups_id AND esmdsub.cm_academic_paper_subjects_id = eers.cm_academic_paper_subjects_id AND esmdsub.student_id = sa.studentID 
                    WHERE 1=1";
            $marksHistory = $this->executeQueryForList($query.$whereQuery.$orderBy);
            
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $marksHistory;
    }
    /**
     * processSupplementaryStudentData
     * @param studentDetails
     * @return studentDetails
     * @author Krishnajith
     */
    public function processSupplementaryStudentData($studentMarkDetails,$examRegistrationDetails){
        $response = new \stdClass;
        $totalStudentDetails = new \stdClass;
        $totalStudentDetails->totalStudents = count($studentMarkDetails);
        $displaySubjectArray = [];
        $displaySubjectCategories = [];
        $studentsDetails = [];
        foreach($studentMarkDetails as $student){
            $barcodeObj = new TCPDFBarcode($student->studentDetails->registerNo, 'C128');
            $studentsDetails[$student->id]->barcodeObj = $barcodeObj->getBarcodeHTML($w = 1, $h = 30, $color = 'black');
            $studentsDetails[$student->id]->id = $student->id;
            $studentsDetails[$student->id]->isResultBlocked = $student->isResultBlocked;
            $studentsDetails[$student->id]->blockingMsg = $student->blockingMsg;
            $studentsDetails[$student->id]->name = $student->studentDetails->name;
            $studentsDetails[$student->id]->isPG = $student->studentDetails->courseType == "PG" ? true : false;
            $studentsDetails[$student->id]->myImage = $student->studentDetails->myImage;
            $studentsDetails[$student->id]->registerNo = $student->studentDetails->registerNo;
            $studentsDetails[$student->id]->rollNo = $student->studentDetails->rollNo;
            $studentsDetails[$student->id]->admissionNo = $student->studentDetails->admissionNo;
            $studentsDetails[$student->id]->passPercentageDisplayMessage = $student->studentDetails->academicYear < 2019 ?  "For a pass in each course 35% mark or P grade is necessary." : "For a pass in each course 35% mark or P grade is necessary.";
            $studentsDetails[$student->id]->roundOff = $student->studentDetails->academicYear < 2019 ?  2 : 3;
            if ($student->studentDetails->courseType == "PG"){
                $studentsDetails[$student->id]->roundOff = 2;
            }
            foreach($student->academicTerms as $academicTerm){
                $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->id = $academicTerm->id;
                $semesterNames = CommonExamService::getInstance()->getDifferentSemesterName($academicTerm->name);
                $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semInRomanLetter = $semesterNames->romanLetter;
                $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semInFullName = $semesterNames->fullName;
                $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semInSemNumber = $semesterNames->semNumber;
                $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterWiseFailedStatus = $academicTerm->isFailed;
                foreach($academicTerm->markHistory as $semMarkHistory){
                    if($semMarkHistory->examRegistrationId == $examRegistrationDetails->examRegistrationId){
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->examRegistrationWiseFailedStatus = $semMarkHistory->failedStatus;
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->failedStatus = $semMarkHistory->failedStatus;
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterGrade = $semMarkHistory->grade;
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterCredit = $academicTerm->credit;
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterGradePoint = $semMarkHistory->gradePoint;
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterCreditGradePoint = $semMarkHistory->creditGradePoint;
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterSgpa = round($semMarkHistory->sgpa, $studentsDetails[$student->id]->roundOff);
                        // in this case using for CCM to get accurate sgpa.please don't do round off of this semesterRawSgpa variable  
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterRawSgpa = $semMarkHistory->sgpa;
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterpassPercentage = $academicTerm->passPercentage;
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterTotalMinimumMarks = $academicTerm->totalMarks *  $academicTerm->passPercentage / 100;
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterTotalMarks = $academicTerm->totalMarks;
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterMarkObtained = $semMarkHistory->supplyMarkObtained;
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterMarkObtainedInWord = strtoupper(CommonUtil::convertNumberToWords($semMarkHistory->totalMarks))." ONLY";
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterPercentage = round($semMarkHistory->percentage,2);
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterClass = $semMarkHistory->class;
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterCgpa = $semMarkHistory->semesterCgpa;
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->earnedCredits = $semMarkHistory->totalEarnedCredits;
                        $studentsDetails[$student->id]->overallClass =  $semMarkHistory->class;
                        $studentsDetails[$student->id]->overallGrade= $semMarkHistory->grade;
                        $studentsDetails[$student->id]->failedStatus = $semMarkHistory->failedStatus;
                        $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->examType = $semMarkHistory->historyType;
                    }
                }
                foreach( $academicTerm->subjects as $subject){
                    $displaySubjectArray[$subject->id]= $subject;
                    $displaySubjectCategories[$subject->categoryId]->categoryId = $subject->categoryId;
                    $displaySubjectCategories[$subject->categoryId]->categoryName = $subject->categoryName;
                    $displaySubjectCategories[$subject->categoryId]->subjects[$subject->id] = $subject;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->id = $subject->id;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->name = $subject->name;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->code = $subject->code;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->priority = $subject->priority;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->externalMaxMark = $subject->externalMaxMark;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->internalMaxMark = $subject->internalMaxMark;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->class = $subject->class;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->grade = $subject->grade;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->percentage = round($subject->percentage,2);
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->internalMark = $studentsDetails[$student->id]->isPG ? $subject->internalGradePoint : $subject->internalMark;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->externalMark = $studentsDetails[$student->id]->isPG ? $subject->externalGradePoint : $subject->externalMark;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->totalMaxMark = $subject->totalMarks;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->markObtained = $studentsDetails[$student->id]->isPG ? $subject->gradePoint : $subject->markObtained;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->markObtainedInWord =  strtoupper(CommonUtil::convertNumberToWords((int)$subject->markObtained));
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->failedStatus = $subject->isFailed;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->attendanceStatus = $subject->attendanceStatus;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->credit = $subject->credit;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->creditGradePoint = $subject->credit * $subject->gradePoint;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->gradePoint = $subject->gradePoint;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->internalGrade = $subject->internalGrade;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->externalGrade = $subject->externalGrade;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->internalGradePoint = $subject->internalGradePoint;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->externalGradePoint = $subject->externalGradePoint;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->wgpa = $subject->wgpa;
                   $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->percentageObtainedExternal = $subject->percentageObtainedExternal;
                   $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->percentageObtainedInternal = $subject->percentageObtainedInternal;
    
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->isExternalFailed = $subject->isExternalFailed;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->isInternalFailed = $subject->isInternalFailed;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->isInternal = $subject->isInternal;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->isExternal = $subject->isExternal;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->categoryId = $subject->categoryId;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->categoryName = $subject->categoryName;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->internalPassPercentage = $subject->internalPassPercentage;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->externalPassPercentage = $subject->externalPassPercentage;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->aggregatePassPercentage = $subject->aggregatePassPercentage;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->internalMinimumMark = $subject->internalMaxMark * $subject->internalPassPercentage / 100;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->externalMinimumMark = $subject->externalMaxMark * $subject->externalPassPercentage / 100;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->totalMinimumMark = $subject->totalMarks * $subject->aggregatePassPercentage / 100;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->internalLetterGrade = $subject->internalLetterGrade;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->internalAttendanceStatus = $subject->internalAttendanceStatus;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->externalLetterGrade = $subject->externalLetterGrade;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjectCategories[$subject->categoryId]->categoryId = $subject->categoryId;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjectCategories[$subject->categoryId]->categoryName = $subject->categoryName;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjectCategories[$subject->categoryId]->subjects[$subject->id] = $subject;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->latestExamYear = $subject->latestExamYear;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->latestExamMonth = $subject->latestExamMonth;
                    $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects[$subject->id]->latestExamMonthName = ExamRegistrationService::getInstance()->getMonthName($subject->latestExamMonth);
                }
                // $studentsDetails[$student->id]->academicTerms[$academicTerm->id]->semesterCreditGradePoint = array_sum(array_column($studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects,'creditGradePoint'));
            }
            
            if(count($student->academicTerms) > 1){
                $studentsDetails[$student->id]->overallClass = $student->class;
                $studentsDetails[$student->id]->overallGrade= $student->grade;
                $studentsDetails[$student->id]->failedStatus = $student->isFailed;
            }
        }
        uasort($studentsDetails[$student->id]->academicTerms[$academicTerm->id]->subjects, function($a, $b) {
            return ($a->priority > $b->priority);
        });
        $displaySubjectCategories = array_values($displaySubjectCategories); 
        foreach($displaySubjectCategories as $displaySubjectCategory){
            $displaySubjectCategory->subjects = array_values($displaySubjectCategory->subjects); 
        }
        uasort($displaySubjectArray, function($a, $b) {
            return ($a->priority > $b->priority);
        });
        $displaySubjectArray = array_values($displaySubjectArray); 
        foreach($studentsDetails as $student){
            $student->academicTerms = array_values($student->academicTerms); 
            foreach($student->academicTerms as $academicTerm){
                $academicTerm->subjects = array_values($academicTerm->subjects); 
                $academicTerm->subjectCategories = array_values($academicTerm->subjectCategories); 
                foreach($academicTerm->subjectCategories as $subCategory){
                    $subCategory->subjects = array_values($subCategory->subjects); 
                    $subCategory->totaCategoryAwardedMark = 0;
                    foreach($subCategory->subjects as $subject){
                        $subCategory->totaCategoryAwardedMark += $subject->internalMark + $subject->externalMark;
                    }
                    
                }
            } 
        }
        $response->studentsDetails = $studentsDetails;
        $response->displaySubjects = $displaySubjectArray;
        $response->displaySubjectCategories = $displaySubjectCategories;
        return $response;
    }
    /**
     * get Exam Registration Details Data For Consolidated And Individual Reports
     * @param searchRequest
     * @return examRegistrationDetails
     * @author Krishnajith
     */
    public function getExamRegistrationDetailsDataForConsolidatedAndIndividualReports($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $searchRequest->examRegistrationId = $searchRequest->examRegistrationId;
        $examRegistrationDetails = new \stdClass;
        $examRegistrationDetailsArray = ExamRegistrationService::getInstance()->searchDetailedExamRegistrationDetails($searchRequest);
        if(empty($examRegistrationDetailsArray)){
            throw new ExamControllerException(ExamControllerException::NO_DETAILS_FOUND,"No Details Found");
        }
        $examRegistrationDetails->name = $examRegistrationDetailsArray[0]->name;
        $examRegistrationDetails->properties = $examRegistrationDetailsArray[0]->properties;
        $examRegistrationDetails->examYear = $examRegistrationDetailsArray[0]->examYear;
        $examRegistrationDetails->examMonth = $examRegistrationDetailsArray[0]->examMonth;
        $examRegistrationDetails->examMonthName = $examRegistrationDetailsArray[0]->examMonthName;
        $examRegistrationDetails->type = $examRegistrationDetailsArray[0]->type;
        $examRegistrationDetails->groupId = $examRegistrationDetailsArray[0]->groups[0]->groupId;
        $examRegistrationDetails->groupName = $examRegistrationDetailsArray[0]->groups[0]->groupName;
        $examRegistrationDetails->departmentDesc = $examRegistrationDetailsArray[0]->groups[0]->departmentDesc;
        $examRegistrationDetails->degreeDescription = $examRegistrationDetailsArray[0]->groups[0]->degreeDescription;
        $examRegistrationDetails->courseTypeID = $examRegistrationDetailsArray[0]->groups[0]->courseTypeID;
        $examRegistrationDetails->courseTypeName = $examRegistrationDetailsArray[0]->groups[0]->courseTypeName;
        $examRegistrationDetails->academicTermName = $examRegistrationDetailsArray[0]->groups[0]->academicTermName;
        $examRegistrationDetails->academicTermYear = $examRegistrationDetailsArray[0]->groups[0]->academicTermYear;
        $examRegistrationDetails->academicOrderNo = $examRegistrationDetailsArray[0]->groups[0]->academicOrderNo;
        $examRegistrationDetails->departmentSpecialization = $examRegistrationDetailsArray[0]->groups[0]->departmentSpecialization;
        $examRegistrationDetails->academicTermYearRoman = strtoupper(CommonUtil::convertNumberToRoman($examRegistrationDetails->academicTermYear));
        $examRegistrationDetails->academicTermId = $examRegistrationDetailsArray[0]->groups[0]->academicTermId;
        $semesterNames = CommonExamService::getInstance()->getDifferentSemesterName($examRegistrationDetails->academicTermName);
        $examRegistrationDetails->semInRomanLetter = $semesterNames->romanLetter;
        $examRegistrationDetails->semInFullName = $semesterNames->fullName;
        $examRegistrationDetails->semInSemNumber = $semesterNames->semNumber;
        $examRegistrationDetails->batchStartYear = $examRegistrationDetailsArray[0]->groups[0]->batchStartYear;
        $examRegistrationDetails->deptID = $examRegistrationDetailsArray[0]->groups[0]->deptID;
        $examRegistrationDetails->deptName = $examRegistrationDetailsArray[0]->groups[0]->deptName;
        $examRegistrationDetails->degreeName = $examRegistrationDetailsArray[0]->groups[0]->degreeName ;
        $examRegistrationDetails->degreeDescription = $examRegistrationDetailsArray[0]->groups[0]->degreeDescription ;
        $examRegistrationDetails->streamName = $examRegistrationDetailsArray[0]->groups[0]->streamName;
        $examRegistrationDetails->finalTermId = $examRegistrationDetailsArray[0]->groups[0]->properties->finalTermId;
        $examRegistrationDetails->publishingStartDate = $examRegistrationDetailsArray[0]->groups[0]->examBatchProperties->publishingStartDate;
        $examRegistrationDetails->supplyOrImprove = $examRegistrationDetailsArray[0]->type;
        $examRegistrationDetails->degreeStreamName = $examRegistrationDetailsArray[0]->groups[0]->degreeName." ".$examRegistrationDetailsArray[0]->groups[0]->streamName;
        $examRegistrationDetails->programName = $examRegistrationDetailsArray[0]->groups[0]->programName;
        $examRegistrationDetails->isHonorCourse = reset($examRegistrationDetailsArray)->properties->isHonorCourse == "1" ? true : false;
        $examRegistrationDetails->isMinorCourse = reset($examRegistrationDetailsArray)->properties->isMinorCourse == "1" ? true : false;
        $examRegistrationDetails->examBatchProperties = $examRegistrationDetailsArray[0]->groups[0]->examBatchProperties;
        $request = new \stdClass; 
        $request->groupId = $examRegistrationDetails->groupId;
        $gradeSchemes = $this->getAllGradeScemesByCurriculum($request);
        
        
        return $examRegistrationDetails;
    }
    /**
     * get College Details  For Consolidated And Individual Reports
     * @return collegeData
     * @author Krishnajith
     */
    public function getCollegeDetailsForConsolidatedAndIndividualReports(){
        $collegeData = new \stdClass;
        $collegeData->collageName = $GLOBALS['COLLEGE_NAME'];
        if($GLOBALS['UNIVERSITY_NAME']){
            $collegeData->universityName = "AUTONOMOUS COLLEGE AFFILIATED TO ".$GLOBALS['UNIVERSITY_NAME'];
        }
        else{
            $collegeData->universityName = "AUTONOMOUS COLLEGE ";
        }
        return $collegeData;
    }
     /**
     * get All Grade Scemes By Curriculum
     * @return semesterName
     * @author Krishnajith
     */
    public function getAllGradeScemesByCurriculum($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $whereQuery = "";
            if(!empty($searchRequest->courseTypeId)) {
                $whereQuery .= " AND g.properties ->> '$.courseTypeId' = '$searchRequest->courseTypeId'";
            }
            if(!empty($searchRequest->admissionYear)) {
                $whereQuery .= " AND g.properties ->> '$.startYear' = '$searchRequest->admissionYear'";
            }
            if(!empty($searchRequest->groupId)) {
                $groupIdString =  is_array($searchRequest->groupId) ? "'" . implode("','",$searchRequest->groupId) . "'" : "'".$searchRequest->groupId."'";
                $whereQuery .= " AND g.id IN ($groupIdString)";
            }
            $orderBy = " ORDER BY gr.name ASC";
            $query = "SELECT
                        DISTINCT  gr.id,
                        gr.name,
                        gr.range_from,
                        gr.range_to,
                        gr.properties,
                        gs.type
                    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
                        aps.id = eers.cm_academic_paper_subjects_id
                    INNER JOIN cm_academic_paper ap ON
                        ap.id = aps.cm_academic_paper_id
                    INNER JOIN cm_syllabus_academic_term_settings sats ON
                        sats.id = ap.cm_syllabus_academic_term_settings_id
                    INNER JOIN grade_scheme gs ON
                        gs.id = CAST(sats.properties ->> '$.gradeSchemId'AS CHAR)
                    INNER JOIN grade gr ON 
                        gr.grade_scheme_id = gs.id";
            $gradeSchemrs =  $this->executeQueryForList($query.$whereQuery.$orderBy);
           
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $gradeSchemrs;
    }
     /**
     * get current student exam result
     * @param $searchRequest
     * @return $programResult
     * @author Krishnajith
     */
    public function getCurrentStudentExamResult($searchRequest){
        try{
            $request = new \stdClass;
            $searchRequest = $this->realEscapeObject($searchRequest);
            $request->studentId = $searchRequest->studentId;
            $request->academicTermId = $searchRequest->academicTermId;
            $request->examRegistrationId = $searchRequest->examRegistrationId;
            $request->examType = $searchRequest->examType ?? 'REGULAR';
            $request->mappingType = "EXAM_REGISTRATION";
            // to check is enable minor honour Exam Registration
            $isEnableMinorHonorExamRegistration = false;
            $searchExamRuleRequest = new SearchRuleRequest;
            $searchExamRuleRequest->name = 'EXAM_REGISTRATION_CREATION_RULE';
            $ruleObj = reset(RuleService::getInstance()->searchRule($searchExamRuleRequest));
            if($ruleObj){
                $isEnableMinorHonorExamRegistration = $ruleObj->rule->isEnableMinorHonorExamRegistration == '1' ? true : false;
                $searchRequest->notConsiderPublishEndDate = $ruleObj->rule->notConsiderPublishEndDate == '1' ? true : false;
            }
            $request->isEnableMinorHonorExamRegistration = $isEnableMinorHonorExamRegistration;
            
            if($request->examType == 'REVALUATION'){
                $searchRuleRequest = new SearchRuleRequest;
                $searchRuleRequest->name = "REVALUATION_SETTINGS_RULE";
                $settingsRule = reset(RuleService::getInstance()->searchRule($searchRuleRequest))->rule;
                $isShowIndividualMarkCard =  $settingsRule->isShowIndividualMarkCard ? true : false;            
                $request->registrationStatus[] = StudentExamRegistrationStatus::REGISTERED;
                $currentExamRegistration = reset(StudentExamRegistrationService::getInstance()->getStudentRevaluationDetails($request));
                if(!$currentExamRegistration->examRevaluationBatchProperties->isResultPublished){
                    throw new ExamControllerException (ExamControllerException::RESULT_NOT_PUBLISHED,"Result not published");
                }
                else{
                    if($currentExamRegistration->examRegistrationPaymentProperties->isResultWithHeld == 1){
                        throw new ExamControllerException (ExamControllerException::STUDENT_WITH_HELD,"Your result is withheld. Please contact controller of examination");
                    }
                    else if(strtotime($currentExamRegistration->examRevaluationBatchProperties->publishingStartDate) > strtotime(date("Y-m-d H:i"))){
                        throw new ExamControllerException (ExamControllerException::RESULT_NOT_PUBLISHED,"Result not published");
                    }
                    else if(strtotime($currentExamRegistration->examRevaluationBatchProperties->publishingEndDate) < strtotime(date("Y-m-d H:i")) && !($searchRequest->notConsiderPublishEndDate)){
                        throw new ExamControllerException (ExamControllerException::RESULT_NOT_PUBLISHED,"Result not available since publish date exceeded");
                    }
                    else{
                        if($isShowIndividualMarkCard){
                            $requestForMarkCard = new \stdClass;
                            $requestForMarkCard->examRegistrationId = $currentExamRegistration->id;
                            $requestForMarkCard->studentId = $request->studentId;
                            $displayContentOptions = new \stdClass;
                            $displayContentOptions->enableDateFlag = 1;
                            $displayContentOptions->principalSignFlag = $displayContentOptions->principalNameFlag = 1;
                            $displayContentOptions->collegeSealFlag = $displayContentOptions->collegeHeaderAndLogoFlag = 1;
                            $displayContentOptions->examControllerSignFlag = $displayContentOptions->examControllerNameFlag = 1;
                            $requestForMarkCard->displayContentOptions = $displayContentOptions;
                            $programResult = RevaluationIndividualMarkCardGenerator::getInstance()->getIndividualMarkCardResultData($requestForMarkCard);
                        }
                        else{
                            $requestForMarkCard = new \stdClass;
                            $requestForMarkCard->examRegistrationId = $currentExamRegistration->id;
                            $requestForMarkCard->studentId = $request->studentId;
                            $programResult = RevaluationMemoGenerator::getInstance()->getRevaluationMemoResultData($requestForMarkCard);
                        }
                    }
                }
            }
            else{
                if($searchRequest->examType == 'MINOR' || $searchRequest->examType == 'HONOUR'){
                    $request->isMinorExamOnly = $searchRequest->examType == 'MINOR' ? true : false;
                    $request->isHonourExamOnly = $searchRequest->examType == 'HONOUR' ? true : false;
                    $request->examType = "REGULAR";
                    $request->isEnableMinorHonorExamRegistration = false;
                }
                $request->registrationStatus == StudentExamRegistrationStatus::REGISTERED;
                $currentExamRegistration = reset(StudentExamRegistrationService::getInstance()->getRegisteredStudentExamRegistrationDetails($request));
                if(!$currentExamRegistration->batchProperties->isResultPublished){
                    throw new ExamControllerException (ExamControllerException::RESULT_NOT_PUBLISHED,"Result not published");
                }
                else{
                    if($currentExamRegistration->examRegistrationPaymentProperties->isResultWithHeld == 1){
                        throw new ExamControllerException (ExamControllerException::STUDENT_WITH_HELD,"Your result is withheld. Please contact controller of examination");
                    }
                    else if(strtotime($currentExamRegistration->batchProperties->publishingStartDate) > strtotime(date("Y-m-d"))){
                        throw new ExamControllerException (ExamControllerException::RESULT_NOT_PUBLISHED,"Result not published");
                    }
                    else if(strtotime($currentExamRegistration->batchProperties->publishingEndDate) < strtotime(date("Y-m-d")) && !($searchRequest->notConsiderPublishEndDate)){
                        throw new ExamControllerException (ExamControllerException::RESULT_NOT_PUBLISHED,"Result not available since publish date exceeded");
                    }
                    else{
                        $requestForMarkCard = new \stdClass;
                        $requestForMarkCard->isStudentSideExamResult = true;
                        $requestForMarkCard->examRegistrationId = $currentExamRegistration->id;
                        $requestForMarkCard->studentId = $request->studentId;
                        $requestForMarkCard->academicTermId = $request->academicTermId;
                        $requestForMarkCard->isMinorOrHonour = ($searchRequest->examType == 'MINOR' || $searchRequest->examType == 'HONOUR') ? true : false;
                        if($currentExamRegistration->examRegistrationType == ExamRegistrationTypeConstants::REGULAR){
                            $displayContentOptions = new \stdClass;
                            $displayContentOptions->enableDateFlag = 1;
                            $displayContentOptions->principalSignFlag = $displayContentOptions->principalNameFlag = 1;
                            $displayContentOptions->collegeSealFlag = $displayContentOptions->collegeHeaderAndLogoFlag = 1;
                            $displayContentOptions->examControllerSignFlag = $displayContentOptions->examControllerNameFlag = 1;
                            $requestForMarkCard->displayContentOptions = $displayContentOptions;
                            $programResult = RegularIndividualMarkCardGenerator::getInstance()->getIndividualMarkCardResultData($requestForMarkCard);
                        }
                        else if($currentExamRegistration->examRegistrationType == ExamRegistrationTypeConstants::SUPPLEMENTARY){
                            $programResult = SupplementaryIndividualMarkCardGenerator::getInstance()->getIndividualMarkCardResultData($requestForMarkCard);
                        }
                    }
                }
            }
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $programResult;
    }
    public function getconsolidatedResultSheetStaffSide($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $programResult = new \stdClass;
        $batchSearchRequest = new SearchExamRegistrationBatchRequest();
        $batchSearchRequest->examRegistrationId = $searchRequest->examRegistrationId;
        $batchSearchRequest->groupId = $searchRequest->groupId;
        $batchDetails = reset(ExamRegistrationBatchService::getInstance()->searchExamRegistrationBatch($batchSearchRequest));
        $searchRuleRequest = new SearchRuleRequest;
        $searchRuleRequest->name = "RESULT_SHEET_SETTINGS_RULE";
        $rule = reset(RuleService::getInstance()->searchRule($searchRuleRequest))->rule;
        $isNotCheckResultPublishDate = $rule->isNotCheckResultPublishDate ? true : false;
        $isNotCheckResultPublishEndDate = $rule->isNotCheckResultPublishEndDate ? true : false;
        if(!$batchDetails->properties->isResultPublished){
            $programResult->errorMsg = "Semester result sheet is not available";
        }
        else{
            if($batchDetails->properties->isResultWithHeld == 1 && !$isNotCheckResultPublishDate){
                $programResult->errorMsg = "Result is withheld. Please contact controller of examination";
            }
            else if(strtotime($batchDetails->properties->publishingStartDate) > strtotime(date("Y-m-d")) && !$isNotCheckResultPublishDate){
                $programResult->errorMsg = "Result not published";
            }
            else if(strtotime($batchDetails->properties->publishingEndDate) < strtotime(date("Y-m-d")) && !$isNotCheckResultPublishDate && !($isNotCheckResultPublishEndDate)){
                $programResult->errorMsg = "Result not available since publish date exceeded";
            }
            else{
                if($batchDetails->examRegistrationType == 'REGULAR'){
                    $request = new \stdClass;
                    $request->groupId = $searchRequest->groupId;
                    $request->examRegistrationId = $searchRequest->examRegistrationId;
                    $request->hideSeal = true;
                    $request->hideExternalOrInternalMark = true;
                    $request->isStaffSideExamResultSheet = true;
                    $programResult = RegularConsolidatedMarkListGenerator::getInstance()->getConsolidatedMarkListResultData($request);
                }
                else{
                    $request = new \stdClass;
                    $request->groupId = $searchRequest->groupId;
                    $request->examRegistrationId = $searchRequest->examRegistrationId;
                    $request->hideSeal = true;
                    $request->hideExternalOrInternalMark = true;
                    $request->isStaffSideExamResultSheet = true;
                    $programResult = SupplementaryConsolidatedMarkListGenerator::getInstance()->getConsolidatedMarkListResultData($request);
                }
            }
        }
        return $programResult;
    }
    
    /**
     * get All Student Subject Details Details
     * @param $searchRequest 
     */
    public function getAllStudentSubjectMarkDetailsByRequest($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try
        {
            $whereQuery = "";
            if(!empty($searchRequest->studentId)) {
                $studentIdString = is_array($searchRequest->studentId) ? "'" . implode("','",$searchRequest->studentId) . "'" : "'".$searchRequest->studentId."'";
                $whereQuery .= " AND esmd.student_id IN ( $studentIdString )";
            }
            if(!empty($searchRequest->academicTermId)) {
                $academicTermIdString = is_array($searchRequest->academicTermId) ? "'" . implode("','",$searchRequest->academicTermId) . "'" : "'".$searchRequest->academicTermId."'";
                $whereQuery .= " AND eerb.properties->>'$.academicTermId' IN ( $academicTermIdString )";
            }
            if(!empty($searchRequest->upToAcademicTermOrderNo)) {
                $whereQuery .= " AND  act.properties ->>'$.orderNo' <= $searchRequest->upToAcademicTermOrderNo ";
            }
            if(!empty($searchRequest->upToAcademicTermOrderNoExceptCurrent)) {
                $whereQuery .= " AND  act.properties ->>'$.orderNo' < $searchRequest->upToAcademicTermOrderNoExceptCurrent ";
            }
            if(!empty($searchRequest->isHonorCourse)) {
                $whereQuery .= " AND  eer.properties ->> '$.isHonorCourse' = '1' ";
            }
            else if(!empty($searchRequest->isMinorCourse)) {
                $whereQuery .= " AND  eer.properties ->> '$.isMinorCourse' = '1' ";
            }
            else{
                $whereQuery .= " AND  ( (eer.properties ->> '$.isHonorCourse' IS NULL OR eer.properties ->> '$.isHonorCourse' != '1') AND (eer.properties ->> '$.isMinorCourse' IS NULL OR eer.properties ->> '$.isMinorCourse' != '1'))";
            }
            
            if($searchRequest->examMonthLimit && $searchRequest->examYearLimit){
                $whereQuery .= " AND UNIX_TIMESTAMP(CONCAT ( eer.properties ->> '$.examYear' ,'-', eer.properties ->> '$.examMonth','-01')) <=  UNIX_TIMESTAMP('$searchRequest->examYearLimit-$searchRequest->examMonthLimit-01') ";
            }
            if(!empty($searchRequest->examRegistrationType)) {
                $whereQuery .= " AND eer.`type` = '$searchRequest->examRegistrationType'  ";
            }
           
            $query = "SELECT 
                    esmd.cm_academic_paper_subjects_id AS paperSubjectId,
                    esmd.mark_details ->>'$.markObtained' AS subjectMarkObtained,
                    esmd.failed_status AS subjectFailedStatus,
                    esmd.mark_details ->>'$.externalMark' AS externalMark,
                    esmd.mark_details ->>'$.gradePoint' AS subjectGradePoint,
                    esmd.mark_details ->>'$.attendanceStatus' AS subjectAttendanceStatus,
                    esmd.mark_details ->>'$.isFinalSemSubject' AS isFinalSemSubject,
                    esmd.mark_details ->>'$.isProjectGroupSubject' AS isProjectGroupSubject,
                    esmd.mark_details ->>'$.finalSemProjectCredit' AS finalSemProjectCredit,
                    esmd.mark_details ->>'$.creditGradePointProject' AS creditGradePointProject,
                    act.id AS academicTermId,
                    act.properties ->>'$.orderNo' AS academicOrderNo,
                    esmd.mark_details ->>'$.creditGradePoint' AS subjectCreditGradePoint,
                    esmd.mark_details ->>'$.excludeSubjectFromTotal' AS excludeSubjectFromTotal,
                    esmd.mark_details ->>'$.revaluationId' AS subjectRevaluationId,
                    esmd.mark_details ->>'$.hasRevaluationMark' AS subjectHasRevaluationMark,
                    esmd.mark_details ->>'$.withoutRevaluationIsFailed' AS subjectWithoutRevaluationIsFailed,
                    esmd.mark_details ->>'$.withoutRevaluationCreditGradePoint' AS subjectWithoutRevaluationCreditGradePoint,
                    esmd.mark_details ->>'$.withoutRevaluationGrade' AS subjectWithoutRevaluationGrade,
                    ecsmd.mark_details ->>'$.credit' AS credit,
                    eer.properties ->> '$.examYear' AS examYear, 
                    eer.properties ->> '$.examMonth' AS examMonth,
                    eer.id AS examregid,
                    eerb.properties ->>'$.isResultPublished' AS isResultPublished,
                    eerb.properties ->>'$.publishingStartDate' AS publishingStartDate
                FROM
                    ec_subject_mark_details esmd 
                INNER JOIN ec_consolidated_subject_mark_details ecsmd ON 
                    ecsmd.student_id = esmd.student_id AND 
                    ecsmd.groups_id = esmd.groups_id AND 
                    ecsmd.cm_academic_paper_subjects_id = esmd.cm_academic_paper_subjects_id  
                INNER JOIN ec_exam_registration_subject eers ON 
                    eers.cm_academic_paper_subjects_id = ecsmd.cm_academic_paper_subjects_id
                INNER JOIN ec_exam_registration_batch eerb ON 
                    eerb.groups_id = ecsmd.groups_id AND 
                    eerb.id =  eers.ec_exam_registration_batch_id
                INNER JOIN ec_exam_registration eer ON 
                    eer.id = esmd.ec_exam_registration_id 
                    AND eer.id = eerb.ec_exam_registration_id
                INNER JOIN  academic_term act ON 
                    act.id = CAST(eerb.properties ->> '$.academicTermId'AS CHAR)
                WHERE 1=1 AND esmd.is_active = 1 AND eer.trashed IS NULL";
            $studentMarkDetails = $this->executeQueryForList($query.$whereQuery);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentMarkDetails;
    }
    /**
     * get All Revaluatiom Registered Students Mark Details
     * @param $searchRequest 
     */
    public function getAllRegistredStudentRevaluationMarkDetails($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try
        {
            $orderBy = "ORDER BY spa.properties->>'$.registerNumber' ASC";
            $whereQuery = "";
            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->studentId)) {
                $studentIdString = is_array($searchRequest->studentId) ? "'" . implode("','",$searchRequest->studentId) . "'" : "'".$searchRequest->studentId."'";
                $whereQuery .= " AND sa.studentID IN ( $studentIdString )";
            }
            $query = "SELECT DISTINCT
                        sa.studentID AS id,
                        sa.studentID AS studentId,
                        sa.studentName,
                        spa.properties->>'$.rollNumber' AS rollNo,
                        spa.properties->>'$.registerNumber' AS regNo,
                        spa.properties->>'$.universityRegisterNumber' AS universityRegNo,
                        sa.admissionNo,
                        sa.myImage,
                        sa.studentGender,
                        g.id AS groupId,
                        g.name AS groupName,
                        act.id AS academicTermId,
                        act.name AS academicTermName,
                        dept.deptID,
                        deg.name AS degreeName,
                        deg.id AS degreeId,
                        dept.deptName,
                        ct.courseTypeID,
                        ct.typeName AS courseTypeName,
                        ct.course_Type AS courseType,
                        g.properties ->> '$.startYear' AS academicYear,
                        eerp.name as parentExamRegistrationName,
                        eerp.id as parentExamRegistrationId,
                        eer.name as revaluationName,
                        eer.type AS latestExamType,
                        eer.properties ->> '$.examYear' AS latestExamYear,
                        eer.properties ->> '$.examMonth' AS latestExamMonth,
                        s.code AS subjectCode,
                        aps.properties ->> '$.syllabusName' AS syllabusName,
                        s.name AS subjectName,
                        eers.cm_academic_paper_subjects_id AS academicPaperSubjectId,
                        esmdsubcon.mark_details ->>'$.internalMark' AS internalMark,
                        esmdsubcon.mark_details ->>'$.externalMaxMark' AS externalMaxMark,
                        esmdsubcon.mark_details ->>'$.internalMaxMark' AS internalMaxMark,
                        esmdsubcon.mark_details ->>'$.totalMarks' AS subjectTotalMarks,
                        esmdsubcon.mark_details ->>'$.isExternal' AS isExternal,
                        esmdsubcon.mark_details ->>'$.isInternal' AS isInternal,
                        esmdsubcon.mark_history AS subjectMarkHistory
                    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  v4_ams_subject s ON 
                        aps.ams_subject_id = s.id
                    INNER JOIN program p ON
                        p.id = g.properties ->> '$.programId'
                    INNER JOIN ec_exam_registration eerp ON
                        eerp.id = eerb.ec_exam_registration_id AND
                        eerp.trashed IS NULL
                    INNER JOIN ec_exam_registration eer ON
                        eer.properties->>'$.parentExamRegistrationId' = eerp.id AND 
                        eer.trashed IS NULL
                    INNER JOIN ec_student_assessment_registration esar ON
                        esar.am_assessment_id = eers.am_assessment_id AND 
                        esar.ec_exam_registration_type = eer.type AND
                        CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND 
                        CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID'
                    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
                    INNER JOIN `course_type` ct ON
                        ct.courseTypeID = p.course_type_id
                    INNER JOIN ec_consolidated_subject_mark_details esmdsubcon ON
                        esmdsubcon.groups_id = eerb.groups_id AND esmdsubcon.cm_academic_paper_subjects_id = eers.cm_academic_paper_subjects_id AND esmdsubcon.student_id = sa.studentID 
                    WHERE 1=1";
            $studentMarkDetails = $this->executeQueryForList($query.$whereQuery.$orderBy, $this->mapper[StudentMarkListServiceMapper::OVER_ALL_REVALUATION_MARK_DETAILS]);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentMarkDetails;
    }
     /**
     * Revaluation Memo
     * @param $searchRequest 
     */
    public function getRevaluationMemoForStudents($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $request = new \stdClass;
        $request->examRegistrationId = $searchRequest->examRegistrationId;
        $request->studentId = $searchRequest->studentId;
        $request->isShowMarkAndGradeInRevaluation = true;
        $programResult = RevaluationMemoGenerator::getInstance()->getRevaluationMemoResultData($request);
        return $programResult;
    }
    /**
     * get student subject credit details
     * @return subjectList
     */
    public function getStudentSubjectCreditDetails($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $whereQuery = "";
            if(!empty($searchRequest->studentId)) {
                $studentIdString = is_array($searchRequest->studentId) ? "'" . implode("','",$searchRequest->studentId) . "'" : "'".$searchRequest->studentId."'";
                $whereQuery .= " AND ecsmd.student_id IN ( $studentIdString )";
            }
            $orderBy = " ORDER BY eerb.properties->>'$.academicTermId' ASC";
            $query = "SELECT 
                        ecsmd.student_id AS studentId, 
                        ecsmd.cm_academic_paper_subjects_id AS paperSubjectId,
                        ecsmd.failed_status AS FailedStatus,
                        ecsmd.credit,
                        ecsmd.mark_details->>'$.creditGradePoint' AS creditGradePoint,
                        ecsmd.mark_details->>'$.grade' AS grade,
                        ecsmd.mark_details->>'$.gradePoint' AS gradePoint,    
                        eerb.properties->>'$.academicTermId'  AS academicTermId,
                        at2.name  AS academicTermName
                    FROM
                        ec_consolidated_subject_mark_details ecsmd 
                    INNER JOIN ec_exam_registration_subject eers ON 
                        eers.cm_academic_paper_subjects_id = ecsmd.cm_academic_paper_subjects_id
                    INNER JOIN ec_exam_registration_batch eerb ON 
                        eerb.groups_id = ecsmd.groups_id AND 
                        eerb.id = eers.ec_exam_registration_batch_id
                    INNER JOIN ec_exam_registration eer ON 
                        eer.id = eerb.ec_exam_registration_id
                    INNER JOIN academic_term at2 ON 
                        at2.id = eerb.properties->>'$.academicTermId'  
                    WHERE 
                        1 =1 AND eer.`type` = 'REGULAR' AND ecsmd.is_active = 1 AND eer.trashed IS NULL  ";
            $studentSubject =  $this->executeQueryForList($query.$whereQuery.$orderBy, $this->mapper[StudentMarkListServiceMapper::GET_STUDENT_SUBJECT_CREDIT_DETAILS]);
           
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentSubject;
    }
        /**
     * get All Registered Students Details
     * @param $searchRequest 
     */
    public function getAllRegistredStudentMarkDetailsForGradeUpgradation($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try
        {
            $orderBy = "ORDER BY spa.properties->>'$.registerNumber' ASC , CAST(cap.properties ->> '$.order' AS UNSIGNED) ASC , CAST(aps.properties ->> '$.order' AS UNSIGNED) ASC ";
            $whereQuery = "";
            if(!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','",$searchRequest->groupId) . "'" : "'".$searchRequest->groupId."'";
                $whereQuery .= " AND g.id IN ( $groupIdString )";
            }
            if(!empty($searchRequest->selectedSemesters)) {
                $semesterIdString = is_array($searchRequest->selectedSemesters) ? "'" . implode("','",$searchRequest->selectedSemesters) . "'" : "'".$searchRequest->selectedSemesters."'";
                $whereQuery .= " AND act.id IN ( $semesterIdString )";
            }
            if(!empty($searchRequest->examRegistrationId)) {
                $examRegistrationIdString = is_array($searchRequest->examRegistrationId) ? "'" . implode("','",$searchRequest->examRegistrationId) . "'" : "'".$searchRequest->examRegistrationId."'";
                $whereQuery .= " AND eer.id IN ( $examRegistrationIdString )";
            }
            if(!empty($searchRequest->studentId)) {
                $studentIdString = is_array($searchRequest->studentId) ? "'" . implode("','",$searchRequest->studentId) . "'" : "'".$searchRequest->studentId."'";
                $whereQuery .= " AND sa.studentID IN ( $studentIdString )";
            }
            if(!empty($searchRequest->assessmentIds)) {
                $assessmentIdStr = is_array($searchRequest->assessmentIds) ? "'" . implode("','",$searchRequest->assessmentIds) . "'" : "'".$searchRequest->assessmentIds."'";
                $whereQuery .= " AND eers.am_assessment_id IN ( $assessmentIdStr )";
            }
            $innerJoin = "";
            $columns = "";
            if(!empty($searchRequest->considerAppliedStudents)) {
                $innerJoin = "INNER JOIN oe_student_total_mark ostm ON 
                ostm.student_id = sa.studentID AND ostm.am_assessment_id = esar.am_assessment_id AND ostm.valuation_type = 'GRADE_UPGRADATION'";
                $columns = " ostm.mark_obtained AS gradeUpgradedMark,";
            }
            if(!empty($searchRequest->considerResolutionAppliedStudents)) {
                $innerJoin = "INNER JOIN oe_student_total_mark ostm ON 
                ostm.student_id = sa.studentID AND ostm.am_assessment_id = esar.am_assessment_id AND ostm.valuation_type = 'MODERATION'";
                $columns = " ostm.mark_obtained AS gradeUpgradedMark,";
            }
            $query = "SELECT DISTINCT
                        sa.studentID AS id,
                        sa.studentID AS studentId,
                        sa.studentName,
                        spa.properties->>'$.rollNumber' AS rollNo,
                        spa.properties->>'$.registerNumber' AS regNo,
                        spa.properties->>'$.universityRegisterNumber' AS universityRegNo,
                        sa.admissionNo,
                        sa.myImage,
                        sa.studentGender,
                        g.id AS groupId,
                        g.name AS groupName,
                        g.properties ->> '$.optionName' AS batchOptionName,
                        act.id AS academicTermId,
                        act.name AS academicTermName,
                        act.properties ->>'$.orderNo' AS academicOrderNo,
                        dept.deptID,
                        deg.name AS degreeName,
                        deg.description AS degreeDescription,
                        deg.id AS degreeId,
                        dept.deptName,
                        ct.courseTypeID,
                        ct.typeName AS courseTypeName,
                        ct.course_Type AS courseType,
                        g.properties ->> '$.startYear' AS academicYear,
                        eer.type AS latestExamType,
                        eer.properties ->> '$.examYear' AS latestExamYear,
                        eer.properties ->> '$.examMonth' AS latestExamMonth,
                        cap.properties ->> '$.order' as subjectPriority,
                        esmdsem.mark_details ->>'$.sgpa' AS semesterSgpa,
                        esmdsem.mark_details ->>'$.percentage' AS semesterPercentage,
                        esmdsem.mark_details ->>'$.grade' AS semesterGrade,
                        esmdsem.mark_details ->>'$.markObtained' AS semesterMarkObtained,
                        esmdsem.mark_details ->>'$.class' AS semesterClass,
                        esmdsem.mark_details ->>'$.totalMarks' AS semesterTotalMarks,
                        esmdsem.mark_details ->>'$.credit' AS semesterCredit,
                        esmdsem.mark_details ->>'$.gradePoint' AS semesterGradePoint,
                        esmdsem.mark_details ->>'$.creditGradePoint' AS semesterCreditGradePoint,
                        esmdsem.mark_details ->>'$.totalEarnedCredits' AS totalEarnedCredits,
                        esmdsem.mark_details ->>'$.semesterCgpa' AS semesterCgpa,
                        esmdsem.mark_history AS semesterMarkHistory,
                        esmdsem.failed_status AS semesterFailedStatus,
                        str.name AS streamName,
                        str.properties->>'$.abbreviation' AS streamDesc,
                        s.code AS subjectCode,
                        aps.properties ->> '$.syllabusName' AS syllabusName,
                        s.name AS subjectName,
                        eers.cm_academic_paper_subjects_id AS academicPaperSubjectId,
                        eers.am_assessment_id AS assessmentId,
                        oe.id AS oeExamId,
                        esmdsub.mark_details ->>'$.markObtained' AS subjectMarkObtained,
                        esmdsub.mark_details ->>'$.isExternalFailed' AS isExternalFailed,
                        esmdsub.mark_details ->>'$.externalGrade' AS subjectExtrenalGrade,
                        esmdsub.mark_details ->>'$.externalGradePoint' AS subjectExternalGradePoint,
                        esmdsub.mark_details ->>'$.percentageObtainedExternal' AS percentageObtainedExternal,
                        esmdsub.mark_details ->>'$.percentageObtainedInternal' AS percentageObtainedInternal,
                        esmdsub.mark_details ->>'$.wgpa' AS subjectWgpa,
                        esmdsub.mark_details->>'$.attendanceStatus' AS subjectAttendanceStatus,
                        esmdsub.class AS subjectClass,
                        esmdsub.percentage AS subjectPercentage,
                        esmdsub.grade AS subjectGrade,
                        esmdsub.failed_status AS subjectFailedStatus,
                        esmdsub.mark_details ->>'$.externalMark' AS externalMark,
                        IF (esmdsubcon.mark_details ->>'$.graceMark' IS NULL,0,esmdsubcon.mark_details ->>'$.graceMark') AS graceMark,
                        esmdsub.mark_details ->>'$.gradePoint' AS subGradePoint,
                        esmdsub.mark_details ->>'$.gradePoint' AS subjectGradePoint,
                        esmdsub.mark_details ->>'$.creditGradePoint' AS subCreditGradePoint,
                        esmdsub.mark_details ->>'$.creditGradePoint' AS subjectCreditGradePoint,
                        esmdsub.mark_details ->>'$.internalAttendanceStatus' AS internalAttendanceStatus,
                        esmdsub.mark_details ->>'$.internalGrade' AS subjectInternalGrade,
                        esmdsub.mark_details ->>'$.internalGradePoint' AS subjectInternalGradePoint,
                        esmdsub.mark_details ->>'$.isInternalNull' AS isInternalNull,
                        esmdsub.mark_details ->>'$.internalMark' AS internalMark,
                        esmdsubcon.mark_details ->>'$.internalAttendance' AS subjectInternalAttendance,
                        esmdsubcon.mark_details ->>'$.credit' AS subjectCredit,
                        esmdsubcon.mark_details ->>'$.externalMaxMark' AS externalMaxMark,
                        esmdsubcon.mark_details ->>'$.internalMaxMark' AS internalMaxMark,
                        esmdsubcon.mark_details ->>'$.totalMarks' AS subjectTotalMarks,
                        esmdsubcon.mark_details ->>'$.isExternal' AS isExternal,
                        esmdsubcon.mark_details ->>'$.isInternal' AS isInternal,
                        esmdsubcon.mark_details ->>'$.isInternalFailed' AS isInternalFailed,
                        esmdsubcon.mark_details ->>'$.categoryCode' AS subjectCategoryCode,
                        esmdsubcon.mark_details ->>'$.internalPassPercentage' AS subjectInternalPassPercentage,
                        esmdsubcon.mark_details ->>'$.externalPassPercentage' AS subjectExternalPassPercentage,
                        esmdsubcon.mark_details ->>'$.aggregatePassPercentage' AS subjectAggregatePassPercentage,
                        esmdsubcon.mark_history AS subjectMarkHistory,
                        esmdsubcon.mark_details  subjectConsolidatedMarkDetails,
                       
                        ecmdcourse.mark_details ->>'$.cgpa' AS cgpa,
                        ecmdcourse.percentage AS overallPercentage,
                        ecmdcourse.mark_details ->>'$.grade' AS overallGrade,
                        ecmdcourse.mark_details ->>'$.class' AS overallClass,
                        ecmdcourse.mark_details ->>'$.markObtained' AS courseObtainedMark,
                        ecmdcourse.mark_details ->>'$.totalMarks' AS courseTotalMark,
                        ecmdcourse.mark_details ->>'$.creditxMark' AS courseCreditxMark,
                        ecmdcourse.mark_details ->>'$.creditGradePoint' AS courseCreditGradePoint,
                        ecmdcourse.mark_details ->>'$.credit' AS courseTotalCredit,
                        ecmdcourse.mark_details ->>'$.wgp' AS courseWgp,
                        ecmdcourse.mark_details ->>'$.wgpa' AS courseWgpa,
                        ecmdcourse.mark_details ->>'$.gradePoint' AS courseGradePoint,
                        $columns
                        ecmdcourse.failed_status AS courseFailedStatus
                        
                    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 cap ON 
                        cap.id = aps.cm_academic_paper_id
                    INNER JOIN  v4_ams_subject s ON 
                        aps.ams_subject_id = s.id
                    INNER JOIN program p ON
                        p.id = g.properties ->> '$.programId'
                    INNER JOIN ec_exam_registration eer ON
                        eer.id = eerb.ec_exam_registration_id
                    INNER JOIN ec_student_assessment_registration esar ON
                        esar.am_assessment_id = eers.am_assessment_id AND 
                        esar.ec_exam_registration_type = eer.type AND
                        CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND 
                        CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID'
                    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
                    INNER JOIN `course_type` ct ON
                        ct.courseTypeID = p.course_type_id
                    LEFT JOIN stream str ON
                         JSON_SEARCH( p.stream_id, 'one', str.id) IS NOT NULL
                    INNER JOIN ec_semester_mark_details esmdsem ON
                        esmdsem.groups_id = eerb.groups_id AND esmdsem.academic_term_id = act.id AND esmdsem.student_id = sa.studentID 
                    LEFT JOIN  ec_course_mark_details ecmdcourse ON
                        ecmdcourse.groups_id = eerb.groups_id AND ecmdcourse.student_id = sa.studentID 
                    INNER JOIN ec_subject_mark_details esmdsub ON
                        esmdsub.ec_exam_registration_id = eerb.ec_exam_registration_id AND esmdsub.groups_id = eerb.groups_id AND esmdsub.cm_academic_paper_subjects_id = eers.cm_academic_paper_subjects_id AND esmdsub.student_id = sa.studentID 
                    INNER JOIN ec_consolidated_subject_mark_details esmdsubcon ON
                        esmdsubcon.groups_id = eerb.groups_id AND esmdsubcon.cm_academic_paper_subjects_id = eers.cm_academic_paper_subjects_id AND esmdsubcon.student_id = sa.studentID 
                    INNER JOIN oe_exams oe ON
                        oe.assessment_id = esar.am_assessment_id AND oe.is_deleted = 0
                        $innerJoin
                    WHERE 1=1";
            $studentMarkDetails = $this->executeQueryForList($query.$whereQuery.$orderBy, $this->mapper[StudentMarkListServiceMapper::OVER_ALL_MARK_DETAILS]);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentMarkDetails;
    }
    /**
    * get revalution Student details
    * @param $searchRequest 
    * @return $programResult 
    */
    public function getRevaluationStudentListAndOtherDetails($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $searchRuleRequest = new SearchRuleRequest;
        $searchRuleRequest->name = "INDIVIDUAL_MARK_CARD_SETTINGS";
        $individualMarkCardSettings = reset(RuleService::getInstance()->searchRule($searchRuleRequest))->rule;
        $request = new \stdClass;
        $response = new \stdClass;
        $examRegistrationDetails = new \stdClass;
        $request->groupId = $searchRequest->groupId;
        $request->examRegistrationId = $searchRequest->examRegistrationId;
        $studentsDetails = $this->getAllRevaluationRegistredStudentMarkDetails($request);
        if(empty($studentsDetails)){
            throw new ExamControllerException(ExamControllerException::NO_DETAILS_FOUND,"No Details Found");
        }
        $examRegistrationDetails->name = reset($studentsDetails)->examRegistrationName;
        $examRegistrationDetails->id = reset($studentsDetails)->examRegistrationId;
        $examRegistrationDetails->type = reset($studentsDetails)->examRegistrationType;
        $examRegistrationDetails->groupId = reset($studentsDetails)->groupId;
        $examRegistrationDetails->groupName = reset($studentsDetails)->groupName;
        $examRegistrationDetails->academicTermId = reset($studentsDetails)->academicTermId;
        $examRegistrationDetails->academicTermName = reset($studentsDetails)->academicTerm;
        $registeredStudents = [];
        if( $individualMarkCardSettings->sortByRollNumber ){
            uasort($studentsDetails, function($a, $b) {
                return ($a->rollNo > $b->rollNo);
            });
        }
        foreach($studentsDetails as $student){
            $registeredStudents[$student->studentId]->studentId = $student->studentId;
            $registeredStudents[$student->studentId]->isSelected = false;
            $registeredStudents[$student->studentId]->studentName = $student->studentName;
            $registeredStudents[$student->studentId]->regNo = $student->regNo;
            $registeredStudents[$student->studentId]->rollNo = $student->rollNo;
            $registeredStudents[$student->studentId]->withHeldStatus = $student->isResultWithHeld ? true : false;
            $registeredStudents[$student->studentId]->examRegistrationId = $student->examRegistrationId ;
        }
        if(empty($registeredStudents)){
            throw new ExamControllerException(ExamControllerException::NO_DETAILS_FOUND,"No Details Found");
        }
        $registeredStudents = array_values($registeredStudents); 
        $response->examRegistrationDetails = $examRegistrationDetails;
        $response->studentList = $registeredStudents;
        return $response;
        
    }
     /**
     * get All Revaluation Registered Students Details
     * @param $searchRequest 
     * @return $studentDataDetails 
     */
    public function getAllRevaluationRegistredStudentMarkDetails($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $orderBy = "ORDER BY spa.properties->>'$.registerNumber' ASC";
            $whereQuery = "";
            if(!empty($searchRequest->courseTypeId)) {
                $whereQuery .= " AND p.course_type_id = '$searchRequest->courseTypeId'";
            }
            if(!empty($searchRequest->admissionYear)) {
                $whereQuery .= " AND g.properties ->> '$.startYear' = '$searchRequest->admissionYear'";
            }
            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->studentId)) {
                $studentIdString = is_array($searchRequest->studentId) ? "'" . implode("','",$searchRequest->studentId) . "'" : "'".$searchRequest->studentId."'";
                $whereQuery .= " AND spa.student_id IN ( $studentIdString )";
            }
            if(!empty($searchRequest->orderByRollNo)) {
                $orderBy = "ORDER BY spa.properties->>'$.rollNumber' ASC";
            }
            $query = "SELECT DISTINCT
                        sa.studentID AS id,
                        sa.studentID AS studentId,
                        sa.studentName,
                        spa.properties->>'$.registerNumber' as regNo,
                        spa.properties->>'$.rollNumber' as rollNo,
                        eer.name as examRegistrationName,
                        eer.id as examRegistrationId,
                        eer.type as examRegistrationType,
                        g.id AS groupId,
                        g.name AS groupName,
                        act.id AS academicTermId,
                        act.name AS academicTerm,
                        d.deptName,
                        d.deptID,
                        eserd.properties->>'$.isResultWithHeld' AS isResultWithHeld
                    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  v4_ams_subject s ON 
                        aps.ams_subject_id = s.id
                    INNER JOIN program p ON
                        p.id = g.properties ->> '$.programId'
                    INNER JOIN ec_exam_registration eerp ON
                        eerp.id = eerb.ec_exam_registration_id AND
                        eerp.trashed IS NULL
                    INNER JOIN ec_exam_registration eer ON
                        eer.properties->>'$.parentExamRegistrationId' = eerp.id AND 
                        eer.trashed IS NULL
                    INNER JOIN ec_student_assessment_registration esar ON
                        esar.am_assessment_id = eers.am_assessment_id AND 
                        esar.ec_exam_registration_type = eer.type AND
                        CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND 
                        CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID'
                    INNER JOIN student_program_account spa ON 
                        spa.student_id  = esar.student_id  AND
                        spa.current_program_id = p.id 
                    INNER JOIN studentaccount sa ON 
                        sa.studentID = esar.student_id
                    INNER JOIN department d ON
                        d.deptID = g.properties ->> '$.departmentId'
                    INNER JOIN  academic_term act ON 
                        act.id = CAST(eerb.properties ->> '$.academicTermId'AS CHAR) 
                    LEFT JOIN ec_student_exam_registration_details eserd ON
                        eserd.student_id = esar.student_id AND 
                        eserd.ec_exam_registration_id = eer.id 
                    WHERE 1=1 ";
            $studentDataDetails = $this->executeQueryForList($query.$whereQuery.$orderBy);
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentDataDetails;
    }
    /**
     * Get Revaluation Individual mark sheet
     * @param searchRequest
     * @return programResult
     * @author Krishnajith
     */
    public function getRevaluationIndividualMarkCardForStudents($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $request = new \stdClass;
        $request->groupId = $searchRequest->groupId;
        $request->examRegistrationId = $searchRequest->examRegistrationId;
        $request->markCardOption = $searchRequest->markCardOption;
        $request->displayContentOptions = $searchRequest->displayContentOptions;
        $request->selectedSemesters = $searchRequest->selectedSemesters;
        $request->studentId = $searchRequest->studentId;
        $programResult = RevaluationIndividualMarkCardGenerator::getInstance()->getIndividualMarkCardResultData($request);
        return $programResult;
    }
     /**
     * get Exam Registration Details Data For Revaluation Individual Report
     * @param searchRequest
     * @return examRegistrationDetails
     * @author Krishnajith
     */
    public function getExamRegistrationDetailsDataForRevaluationIndividualReports($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $examRegistrationDetails = new \stdClass;
        $examRegistrationDetailsArray = ExamRegistrationService::getInstance()->searchDetailedExamRevaluationDetails($searchRequest);
        if(empty($examRegistrationDetailsArray)){
            throw new ExamControllerException(ExamControllerException::NO_DETAILS_FOUND,"No Details Found");
        }
        $examRegistrationDetails->examRegistrationId = $examRegistrationDetailsArray[0]->id;
        $examRegistrationDetails->name = $examRegistrationDetailsArray[0]->name;
        $examRegistrationDetails->parentExamRegistrationId = $examRegistrationDetailsArray[0]->parentExamRegistrationId;
        $examRegistrationDetails->properties = $examRegistrationDetailsArray[0]->properties;
        $examRegistrationDetails->examYear = $examRegistrationDetailsArray[0]->examYear;
        $examRegistrationDetails->examMonth = $examRegistrationDetailsArray[0]->examMonth;
        $examRegistrationDetails->examMonthName = $examRegistrationDetailsArray[0]->examMonthName;
        $examRegistrationDetails->type = $examRegistrationDetailsArray[0]->type;
        $examRegistrationDetails->groupId = $examRegistrationDetailsArray[0]->groups[0]->groupId;
        $examRegistrationDetails->groupName = $examRegistrationDetailsArray[0]->groups[0]->groupName;
        $examRegistrationDetails->departmentDesc = $examRegistrationDetailsArray[0]->groups[0]->departmentDesc;
        $examRegistrationDetails->degreeDescription = $examRegistrationDetailsArray[0]->groups[0]->degreeDescription;
        $examRegistrationDetails->courseTypeID = $examRegistrationDetailsArray[0]->groups[0]->courseTypeID;
        $examRegistrationDetails->courseTypeName = $examRegistrationDetailsArray[0]->groups[0]->courseTypeName;
        $examRegistrationDetails->academicTermName = $examRegistrationDetailsArray[0]->groups[0]->academicTermName;
        $examRegistrationDetails->academicTermYear = $examRegistrationDetailsArray[0]->groups[0]->academicTermYear;
        $examRegistrationDetails->academicOrderNo = $examRegistrationDetailsArray[0]->groups[0]->academicOrderNo;
        $examRegistrationDetails->academicTermYearRoman = strtoupper(CommonUtil::convertNumberToRoman($examRegistrationDetails->academicTermYear));
        $examRegistrationDetails->academicTermId = $examRegistrationDetailsArray[0]->groups[0]->academicTermId;
        $semesterNames = CommonExamService::getInstance()->getDifferentSemesterName($examRegistrationDetails->academicTermName);
        $examRegistrationDetails->semInRomanLetter = $semesterNames->romanLetter;
        $examRegistrationDetails->semInFullName = $semesterNames->fullName;
        $examRegistrationDetails->semInSemNumber = $semesterNames->semNumber;
        $examRegistrationDetails->batchStartYear = $examRegistrationDetailsArray[0]->groups[0]->batchStartYear;
        $examRegistrationDetails->deptID = $examRegistrationDetailsArray[0]->groups[0]->deptID;
        $examRegistrationDetails->deptName = $examRegistrationDetailsArray[0]->groups[0]->deptName;
        $examRegistrationDetails->degreeName = $examRegistrationDetailsArray[0]->groups[0]->degreeName ;
        $examRegistrationDetails->degreeDescription = $examRegistrationDetailsArray[0]->groups[0]->degreeDescription ;
        $examRegistrationDetails->streamName = $examRegistrationDetailsArray[0]->groups[0]->streamName;
        $examRegistrationDetails->finalTermId = $examRegistrationDetailsArray[0]->groups[0]->properties->finalTermId;
        $examRegistrationDetails->publishingStartDate = $examRegistrationDetailsArray[0]->groups[0]->examBatchProperties->publishingStartDate;
        $examRegistrationDetails->supplyOrImprove = $examRegistrationDetailsArray[0]->type;
        $examRegistrationDetails->degreeStreamName = $examRegistrationDetailsArray[0]->groups[0]->degreeName." ".$examRegistrationDetailsArray[0]->groups[0]->streamName;
        $examRegistrationDetails->programName = $examRegistrationDetailsArray[0]->groups[0]->programName;
        $examRegistrationDetails->isHonorCourse = reset($examRegistrationDetailsArray)->properties->isHonorCourse == "1" ? true : false;
        $examRegistrationDetails->isMinorCourse = reset($examRegistrationDetailsArray)->properties->isMinorCourse == "1" ? true : false;
        $request = new \stdClass; 
        $request->groupId = $examRegistrationDetails->groupId;
        $gradeSchemes = $this->getAllGradeScemesByCurriculum($request);
        return $examRegistrationDetails;
    }
    /**
     * get Final Consolidated Mark Card
     * @param $searchRequest
     * @return $programResult
     * @author Krishnajith
     */
     public function getFinalMarkCardForStudents($searchRequest){
        try{
            $searchRequest = $this->realEscapeObject($searchRequest);
            $request = new \stdClass;
            $request->studentId = $searchRequest->studentId;
            $student = $this->getCurrentStudentBatchDetails($request);
            if(!empty($student)){
                if($student->withHeldStatus == '1' ){
                    throw new ExamControllerException (ExamControllerException::STUDENT_WITH_HELD,"Result Withheld");
                }
                else if($student->isResultPublished !== '1' ){
                    throw new ExamControllerException (ExamControllerException::RESULT_NOT_PUBLISHED,"Result not published");
                }
                else if(strtotime($student->publishingStartDate) > strtotime(date("Y-m-d"))){
                    throw new ExamControllerException (ExamControllerException::RESULT_NOT_PUBLISHED,"Result not published");
                }
                else if(strtotime($student->publishingEndDate) < strtotime(date("Y-m-d")) && !($searchRequest->notConsiderPublishEndDate)){
                    throw new ExamControllerException (ExamControllerException::RESULT_NOT_PUBLISHED,"Result not available since publish date exceeded");
                }
                else{
                    $requestForFCMarkCard = new \stdClass;
                    $requestForFCMarkCard->isStudentSideExamResult = true;
                    $requestForFCMarkCard->studentId = $request->studentId;
                    $requestForFCMarkCard->groupId = $student->groupId; 
                    $requestForFCMarkCard->isStudentSideExamResult = '1'; 
                    $programResult = FinalConsolidatedMarksCardGenerator::getInstance()->getFinalConsolidatedMarksCard($requestForFCMarkCard);
                }
            }
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $programResult;
    }
    
    
    /**
     * get Current student Batch Details
     * @param $searchRequest 
     * @return $student
     * @author Krishnajith
     */
    public function getCurrentStudentBatchDetails($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $whereQuery = "";
            if(!empty($searchRequest->studentId)) {
                $studentIdString = is_array($searchRequest->studentId) ? "'" . implode("','",$searchRequest->studentId) . "'" : "'".$searchRequest->studentId."'";
                $whereQuery .= " AND s.studentID IN ( $studentIdString )";
            }
            $query = "SELECT DISTINCT
                            s.studentID as id,
                            g.id AS groupId,
                            g.name AS groupName,
                            p.name as programName,
                            g.properties ->>'$.programId'  AS programId,
                            ct.courseTypeID as courseTypeId,
                            ct.typeName as courseTypeName,
                            spa.student_id AS studentId,
                            spa.properties->>'$.rollNumber' AS studentRollNo,
                            IF(IFNULL(spa.properties ->> '$.registerNumber', 'null') = 'null','',spa.properties ->> '$.registerNumber') AS studentRegisterNo,
                            s.studentName AS studentName,
                            ebad.properties->>'$.isPublishFCMC' AS isResultPublished,
                            ebad.properties->>'$.startDateFCMC' AS publishingStartDate,
                            ebad.properties->>'$.endDateFCMC' AS publishingEndDate,
                            esad.properties->>'$.withHeldStatus' as withHeldStatus
                        FROM 
                            studentaccount s 
                        INNER JOIN student_program_account spa
                            ON spa.student_id = s.studentID
                        INNER JOIN student_program_batch_log spbl 
                            ON spbl.program_student_id = spa.id 
                        INNER JOIN `program` p 
                            ON p.id = spbl.program_id
                        INNER JOIN `groups` g 
                            ON g.id = spbl.batch_group_id
                        INNER JOIN `course_type` ct ON
                            ct.courseTypeID = p.course_type_id
                        INNER JOIN group_members gm ON
                            gm.groups_id = g.id AND 
                            gm.members->>'$.studentId' = spa.id
                        LEFT JOIN ec_batch_additional_details ebad ON ebad.groups_id = g.id
                        LEFT JOIN ec_student_additional_details esad ON 
                            esad.student_id = s.studentID AND
                            esad.program_id = p.id AND
                            esad.type = 'FINAL_MARK_CARD' 
                        WHERE 1=1 ";
            $student = $this->executeQueryForObject($query.$whereQuery);
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $student;
    }
     /**
     * get current student exam result
     * @param $searchRequest
     * @return $programResult
     * @author Krishnajith
     */
     public function getCurrentStudentExamResultMultipleSemesters($searchRequest){
        try{
            $request = new \stdClass;
            $searchRequest = $this->realEscapeObject($searchRequest);
            $request->studentId = $searchRequest->studentId;
            $request->academicTermId = $searchRequest->academicTermId;
            $request->examType = $searchRequest->examType ;
            $request->mappingType = "EXAM_REGISTRATION";
            $request->orderBySemester = 1;
            $dispalyHtmlData = "";
            $request->registrationStatus == StudentExamRegistrationStatus::REGISTERED;
            $collegeData = CommonExamService::getInstance()->getCollegeDetails();
            $examType = 'EC_REGULAR_INDIVIDUAL';
            $markListTemplate = StudentMarkListService::getInstance()->getUniversityMarkListTemplate($examType);    
            $frontPage = '';
            if( $markListTemplate == 'Template_9'){
                $frontPage = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/RegularIndividualMarkCards/Template9/frontPage1.twig"), [ 'college'=>$collegeData ]);
            }
            $currentExamRegistrations = StudentExamRegistrationService::getInstance()->getRegisteredStudentExamRegistrationDetails($request);
            $result = 0;
            foreach ( $currentExamRegistrations as $currentExamRegistration){
                if(!$currentExamRegistration->batchProperties->isResultPublished){
                    continue;
                    // throw new ExamControllerException (ExamControllerException::RESULT_NOT_PUBLISHED,"Result not published");
                }
                else{
                    if($currentExamRegistration->examRegistrationPaymentProperties->isResultWithHeld == 1){
                        continue;
                        // throw new ExamControllerException (ExamControllerException::STUDENT_WITH_HELD,"Your result is withheld. Please contact controller of examination");
                    }
                    else if(strtotime($currentExamRegistration->batchProperties->publishingStartDate) > strtotime(date("Y-m-d"))){
                        continue;
                        // throw new ExamControllerException (ExamControllerException::RESULT_NOT_PUBLISHED,"Result not published");
                    }
                    else{
                        $requestForMarkCard = new \stdClass;
                        $requestForMarkCard->isStudentSideExamResult = true;
                        $requestForMarkCard->examRegistrationId = $currentExamRegistration->id;
                        $requestForMarkCard->studentId = $request->studentId;
                        $requestForMarkCard->academicTermId = $currentExamRegistration->batchProperties->academicTermId;
                        if($currentExamRegistration->examRegistrationType == ExamRegistrationTypeConstants::REGULAR){
                            $displayContentOptions = new \stdClass;
                            $displayContentOptions->enableDateFlag = 1;
                            $displayContentOptions->principalSignFlag = $displayContentOptions->principalNameFlag = 1;
                            $displayContentOptions->collegeSealFlag = $displayContentOptions->collegeHeaderAndLogoFlag = 1;
                            $displayContentOptions->examControllerSignFlag = $displayContentOptions->examControllerNameFlag = 1;
                            $requestForMarkCard->displayContentOptions = $displayContentOptions;
                            $programResult = RegularIndividualMarkCardGenerator::getInstance()->getIndividualMarkCardResultData($requestForMarkCard);
                        }
                        else if($currentExamRegistration->examRegistrationType == ExamRegistrationTypeConstants::SUPPLEMENTARY){
                            $programResult = SupplementaryIndividualMarkCardGenerator::getInstance()->getIndividualMarkCardResultData($requestForMarkCard);
                        }
                        $result = 1;
                        $dispalyHtmlData .=  $programResult->dispalyHtmlData;
                    }
                    
                }
            }
            if ( empty($result) ){
                throw new ExamControllerException (ExamControllerException::NO_DETAILS_FOUND,"No details found");
            }
            $prtContent = NULL;
            $prtContent .= '<html><head>';
            $prtContent .= "<style>
                                .bg-image{
                    background:  url('$collegeData->waterMark') repeat ;
                    width:100%;
                    background-size: 100% 100%;
                    height:100%;
                }
                @media print 
                    {
                        @page {
                        margin:0 2mm 0 2mm;
                        zoom: 500%!important;
                        }
                        html, body {
                            width: 297mm;
                            height: 200mm;
                        }
                    }
                </style>";
            $prtContent .= "</head><title>Exam Notification</title><body><div style='height:100vh!important;' class='bg-image'>";
            $prtContent .= $frontPage."</div>".$dispalyHtmlData;
            $prtContent .= '</body></html>';
            $totalWidth = 297;
            $totalHeight = 210;
            $options = array(
                'page-width'     => $totalWidth."mm",
                'page-height'    => $totalHeight."mm",
                'dpi'            => 96,
                'margin-top' => "9mm",
                'margin-left' => "10mm",
                'margin-right' => "10mm",
                'margin-bottom' => "9mm",
                // 'binary' => "/usr/local/bin/wkhtmltopdf", // For Mac
                'user-style-sheet' => realpath(DOCUMENT_ROOT . "/libcommon/bootstrap/css/bootstrap.min.css")
            );
    
            $programResult = new \stdClass;
            $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        $programResult->dispalyHtmlData = $dispalyHtmlData;
        return $programResult;
    }
    
        /**
     * get student subject result details
     * @param $searchRequest 
     * @return $student
     * @author Sibin
     */
    public function getStudentSubjectResults($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $whereQuery = "";
            if(!empty($searchRequest->academicPaperSubjectIds)) {
                $academicPaperSubjectIdsString = is_array($searchRequest->academicPaperSubjectIds) ? "'" . implode("','",$searchRequest->academicPaperSubjectIds) . "'" : "'".$searchRequest->academicPaperSubjectIds."'";
                $whereQuery .= " AND cap.id IN ( $academicPaperSubjectIdsString )";
            }
            if(!empty($searchRequest->courseTypeId)) {
                $courseTypeIdsString = is_array($searchRequest->courseTypeId) ? "'" . implode("','",$searchRequest->courseTypeId) . "'" : "'".$searchRequest->courseTypeId."'";
                $whereQuery .= " AND p.course_type_id IN ( $courseTypeIdsString )";
            }
            if(!empty($searchRequest->academicTermId)) {
                $academicTermIdsString = is_array($searchRequest->academicTermId) ? "'" . implode("','",$searchRequest->academicTermId) . "'" : "'".$searchRequest->academicTermId."'";
                $whereQuery .= " AND eerb.academicTermId IN ( $academicTermIdsString )";
            }
            if(!empty($searchRequest->admissionYear)) {
                $admissionYearString = is_array($searchRequest->admissionYear) ? "'" . implode("','",$searchRequest->admissionYear) . "'" : "'".$searchRequest->admissionYear."'";
                $whereQuery .= " AND g.properties->>'$.startYear' IN ( $admissionYearString )";
            }
            $orderBy = " ORDER BY spa.properties->> '$.registerNumber' ASC";
            $query = "SELECT
                            sa.studentID,
                            sa.studentName,
                            spa.properties->> '$.registerNumber' AS registerNumber,
                            esmd.mark_details->>'$.internalMark' AS internalMark,
                            esmd.mark_details->>'$.externalMark' AS externalMark,
                            esmd.mark_details->>'$.markObtained' AS markObtained,
                            esmd.mark_details->>'$.grade' AS grade,
                            esmd.mark_details->>'$.resultStatus' AS resultStatus,
                            esmd.mark_details->>'$.attendanceStatus' AS attendanceStatus,
                            esmd.mark_details->>'$.subCoursesGrade' AS subCoursesGrade,
                            esmd.mark_details->>'$.subCoursesInternalMark' AS subCoursesInternalMark,
                            esmd.mark_details->>'$.subCoursesExternalMark' AS subCoursesExternalMark,
                            esmd.mark_details->>'$.subCoursesTotalObtainedMark' AS subCoursesTotalObtainedMark,
                            g.id AS groupId,
                            g.name AS groupName,
                            s.id AS subjectId,
                            s.name AS subjectName,
                            s.code AS subjectCode
                        from
                            cm_academic_paper_subjects cap
                        INNER JOIN ec_exam_registration_subject eers ON
                            eers.cm_academic_paper_subjects_id = cap.id
                        INNER JOIN ec_exam_registration_batch eerb ON
                            eerb.id = eers.ec_exam_registration_batch_id
                        INNER JOIN ec_exam_registration eer ON
                            eer.id = eerb.ec_exam_registration_id
                            AND eer.`type` = 'REGULAR'
                        INNER JOIN ec_subject_mark_details esmd ON
                            esmd.ec_exam_registration_id = eer.id
                            AND esmd.groups_id = eerb.groups_id
                            AND esmd.cm_academic_paper_subjects_id = cap.id
                        INNER JOIN `groups` g ON
                            g.id = eerb.groups_id
                        INNER JOIN program p ON
                            p.id = g.properties ->> '$.programId'
                        INNER JOIN studentaccount sa ON
                            sa.studentID = esmd.student_id
                        INNER JOIN student_program_account spa ON
                            spa.student_id = sa.studentID
                        INNER JOIN v4_ams_subject s ON s.id = cap.ams_subject_id
                        WHERE 1=1";
            $students = $this->executeQueryForList($query.$whereQuery.$orderBy);
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $students;
    }
    
    
}