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 / 14
CRAP
0.00% covered (danger)
0.00%
0 / 1201
SupplementaryExamReportService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 14
21756.00
0.00% covered (danger)
0.00%
0 / 1201
 getSubjectWiseSupplementaryStatusReport
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 78
 getAllStudentDetailsListForSubjectWiseSupplementaryStatus
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 72
 getAllSupplementaryStudentStatusReport
0.00% covered (danger)
0.00%
0 / 1
600.00
0.00% covered (danger)
0.00%
0 / 166
 getYearWiseSupplementaryResultAnalysis
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 73
 getCourseWiseSupplementaryResultAnalysis
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 70
 getAllStudentDetailsForSupplementaryResult
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 105
 getYearWiseFailedStudentList
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 95
 getExamWiseFailedStudentList
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 88
 getSupplementaryResultAnalysisTemplate
0.00% covered (danger)
0.00%
0 / 1
462.00
0.00% covered (danger)
0.00%
0 / 115
 getFailedStudentListReport
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 77
 getSupplyStudentStatusReport
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 75
 getSupplyDateWiseReport
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 34
 getSupplementaryCasteCategoryResultAnalysis
0.00% covered (danger)
0.00%
0 / 1
420.00
0.00% covered (danger)
0.00%
0 / 138
 getSgpaByMonthYear
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 15
<?php
namespace com\linways\ec\core\service;
use com\linways\ec\core\request\SearchRuleRequest;
use com\linways\ec\core\service\RuleService;
use com\linways\base\util\MakeSingletonTrait;
use com\linways\ec\core\exception\ExamControllerException;
use com\linways\core\ams\professional\service\ReligionService;
use com\linways\core\ams\professional\service\AdmissionService;
use com\linways\core\ams\professional\service\CampusTypeService;
use com\linways\base\util\TwigRenderer;
use com\linways\core\ams\professional\util\PdfUtil;
use com\linways\core\ams\professional\service\CommonService;
use com\linways\ec\core\service\ExamRegistrationService;
use com\linways\ec\core\request\SearchExamRegistrationRequest;
use com\linways\ec\core\service\ExamRegistrationSubjectService;
use com\linways\core\ams\professional\service\CourseTypeService;
use com\linways\core\ams\professional\util\CommonUtil;
use com\linways\core\ams\professional\constant\ExamType; 
use com\linways\core\ams\professional\dto\SettingsConstents;
use com\linways\base\util\SecurityUtils;
use com\linways\ec\core\request\SearchExamRegistrationBatchRequest;
use com\linways\ec\core\dto\StudentMarkDetails;
use com\linways\ec\core\dto\exam\StudentDetails;
use com\linways\ec\core\dto\exam\AcademicTermMark;
use com\linways\ec\core\dto\exam\RegularExam;
use com\linways\ec\core\dto\exam\ExamSubject;
use com\linways\ec\core\service\CommonExamService;
use com\linways\ec\core\service\NominalRollService;
use com\linways\ec\core\service\RegularExamReportService;
use com\linways\ec\core\service\GradeSchemeService;
class SupplementaryExamReportService extends BaseService
{
    use MakeSingletonTrait;
    
     /**
     * get Subject Wise Supplementary Status Report
     * @param $searchRequest 
     * @return $response 
     */
    public function getSubjectWiseSupplementaryStatusReport($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $response = new \stdClass;
            $request = new \stdClass;
            $additionalDetails = new \stdClass;
            $additionalDetails->collageName = $GLOBALS['COLLEGE_NAME'];
            $additionalDetails->admissionYear = $searchRequest->admissionYear;
             // Rule for Supply Examination report rule
            $searchRuleRequest = new SearchRuleRequest;
            $searchRuleRequest->name = "SUPPLY_EXAM_REPORT_RULE";
            $supplyReportRule = reset(RuleService::getInstance()->searchRule($searchRuleRequest))->rule;
            $additionalDetails->showMarks = $supplyReportRule->isShowMarksInSubjectWiseSupplyStatusReport == '1' ? true : false;
            $request->courseTypeId = $searchRequest->courseTypeId;
            $request->academicTermId = $searchRequest->academicTermId;
            $request->admissionYear = $searchRequest->admissionYear;
            $request->subjectTypes = $searchRequest->subjectTypeIds;
            $subjectDetails=[];
            $subectDetailsArray = [];
            $studentsDetails = $this->getAllStudentDetailsListForSubjectWiseSupplementaryStatus($request);
            if(empty($studentsDetails)){
                throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"No Students In Exam Registration");
            }
            else{
                foreach($studentsDetails as $student){
                    $additionalDetails->semester = $student->academicTerm;
                    $subjectDetails[$student->academicPaperSubjectId]->subjectCode = $student->subjectCode;
                    $subjectDetails[$student->academicPaperSubjectId]->subjectName = $student->subjectName;
                    $subjectDetails[$student->academicPaperSubjectId]->academicPaperSubjectId = $student->academicPaperSubjectId;
                    $subjectDetails[$student->academicPaperSubjectId]->students[$student->studentId]->studentId = $student->studentId;
                    $subjectDetails[$student->academicPaperSubjectId]->students[$student->studentId]->studentName = $student->studentName;
                    $subjectDetails[$student->academicPaperSubjectId]->students[$student->studentId]->regNo = $student->regNo;
                    $subjectDetails[$student->academicPaperSubjectId]->students[$student->studentId]->studentEmail = $student->studentEmail;
                    $subjectDetails[$student->academicPaperSubjectId]->students[$student->studentId]->studentPhone = $student->studentPhone;
                    $subjectDetails[$student->academicPaperSubjectId]->students[$student->studentId]->groupName = $student->groupName;
                    $subjectDetails[$student->academicPaperSubjectId]->students[$student->studentId]->internalMark = $student->internalMark;
                    $subjectDetails[$student->academicPaperSubjectId]->students[$student->studentId]->externalMark = $student->externalMark;
                    $subjectDetails[$student->academicPaperSubjectId]->students[$student->studentId]->attendanceStatus = $student->attendanceStatus;
                    $subjectDetails[$student->academicPaperSubjectId]->students[$student->studentId]->externalMaxMark = $student->externalMaxMark;
                    $subjectDetails[$student->academicPaperSubjectId]->students[$student->studentId]->internalMaxMark = $student->internalMaxMark;
                }
                $subectDetailsArray = array_values($subjectDetails);
                foreach($subectDetailsArray as $subectDetail){
                    $subectDetail->students = array_values($subectDetail->students);
                }
            }
            if(empty($subectDetailsArray)){
                throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"No Students In Exam Registration");
            }
            else{
                $templateName = "PrintSubjectWiseSupplementaryStatus";
                $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/SupplementaryExamReports/$templateName.twig"), [ 'subjects'=>$subectDetailsArray ,'additionalDetails'=>$additionalDetails]);
                $prtContent = NULL;
                $prtContent .= '<html><head>';
                $prtContent .= "";
                $prtContent .= '</head><title>Supplementary Status (Subject Wise)</title><body>';
                $prtContent .= $responseHtml;
                $prtContent .= '</body></html>';
                $options = array(
                    'page-width'     => "210mm",
                    'page-height'    => "297mm",
                    'dpi'            => 96,
                    'margin-top' => "10mm",
                    'margin-left' => "10mm",
                    'margin-right' => "10mm",
                    'margin-bottom' => "10mm",
                    // 'binary' => "/usr/local/bin/wkhtmltopdf", // For Mac
                    'user-style-sheet' => realpath(DOCUMENT_ROOT . "/libcommon/bootstrap/css/bootstrap.min.css")
                );
            $programResult = new \stdClass;
            $programResult->dispalyHtmlData = $responseHtml;
            $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
                return  $programResult;
            }
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $response;
    }
     /**
     * get All Students For Subject Wise SUPPLEMENTARY Status
     * @param $searchRequest 
     * @return $studentDetails 
     */
    public function getAllStudentDetailsListForSubjectWiseSupplementaryStatus($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $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->academicTermId)) {
                $whereQuery .= " AND CAST(eerb.properties ->> '$.academicTermId' AS CHAR) = '$searchRequest->academicTermId'";
            }
            if(!empty($searchRequest->examRegistrationId)) {
                $whereQuery .= " AND eerb.ec_exam_registration_id = '$searchRequest->examRegistrationId'";
            }
            if(!empty($searchRequest->subjectTypes)){
                $whereQuery .= " AND aps.properties ->> '$.subjectTypeId' IN (" ."'" . implode("', '", $searchRequest->subjectTypes) . "'" .")";
            }
            $query = "SELECT DISTINCT
                        sa.studentID as studentId,
                        sa.studentName,
                        sa.regNo,
                        sa.studentEmail,
                        sa.studentPhone,
                        eer.name as examRegistrationName,
                        g.name as groupName,
                        act.name as academicTerm,
                        eers.am_assessment_id as assessmentId,
                        eerb.ec_exam_registration_id as examRegistrationId,
                        eers.cm_academic_paper_subjects_id as academicPaperSubjectId,
                        s.code as subjectCode,
                        s.name as subjectName,
                        eer.name as examRegistrationName,
                        esmd.mark_details ->> '$.internalMark' as internalMark,
                        esmd.mark_details ->> '$.externalMark' as externalMark,
                        esmd.mark_details ->> '$.attendanceStatus' as attendanceStatus,
                        aps.properties->>'$.externalMaxMark' as externalMaxMark,
                        aps.properties ->> '$.internalMaxMark' as internalMaxMark
                    FROM
                        `groups` g
                    INNER JOIN program p ON
                        p.id  = g.properties->>'$.programId'
                    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 AND 
                        CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND 
                        CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID' AND 
                        esar.ec_exam_registration_type = eer.type 
                    INNER JOIN studentaccount sa ON 
                        sa.studentID = esar.student_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  academic_term act ON 
                        act.id = CAST(eerb.properties ->> '$.academicTermId'AS CHAR) 
                    INNER JOIN ec_consolidated_subject_mark_details esmd ON
                        esmd.groups_id = eerb.groups_id AND esmd.cm_academic_paper_subjects_id = eers.cm_academic_paper_subjects_id AND esmd.student_id = sa.studentID AND esmd.failed_status != 'PASSED'
                    WHERE 1=1 ";
            $studentDetails = $this->executeQueryForList($query.$whereQuery);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentDetails;
    }
    /**
     * get Subject Wise Supplementary Status Report
     * @param $searchRequest 
     * @return $response 
     */
    public function getAllSupplementaryStudentStatusReport($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $response = new \stdClass;
            $request = new \stdClass;
            $additionalDetails = new \stdClass;
            $additionalDetails->collageName = $GLOBALS['COLLEGE_NAME'];
            $dispalayType = $searchRequest->dispalayType;
            $request->examRegistrationId = $searchRequest->examRegistrationId;
            $request->examRegistrationId = $searchRequest->examRegistrationId;
            $request->academicPaperSubjectIds = $searchRequest->academicPaperSubjectIds;
            $request->feeStatus = $searchRequest->feeStatus;
            $request->orderBy = $searchRequest->orderBy;
            $toDate = $searchRequest->toDate;
            $fromDate = $searchRequest->fromDate;
            $subjectDetails=[];
            $subectDetailsArray = [];
            $studentDetails=[];
            $studentDetailsArray=[];
            $studentsDetails = ExamRegistrationService::getInstance()->getAllExamRegistredStudentDetails($request);
            if(empty($studentsDetails)){
                throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"No Registred Students In This Exam Registration");
            }
            else{
                if($dispalayType =="SUBJECT_WISE"){
                    foreach($studentsDetails as $student){
                        if((!empty($toDate)) && (!empty($fromDate))){
                            $toDate = date('Y-m-d', strtotime($toDate));
                            $fromDate = date('Y-m-d', strtotime($fromDate));
                            if(((date('Y-m-d', strtotime($student->studentExamRegistrationDate)) > $fromDate) && ($student->studentExamRegistrationDate != null )) || ((date('Y-m-d', strtotime($student->studentExamRegistrationDate)) < $toDate) && ($student->studentExamRegistrationDate  != null))){
                                $additionalDetails->examRegistrationName = $student->examRegistrationName;
                                $subjectDetails[$student->subjectCode]->subjectCode = $student->subjectCode;
                                $subjectDetails[$student->subjectCode]->subjectName = $student->subjectName;
                                $subjectDetails[$student->subjectCode]->academicPaperSubjectId = $student->academicPaperSubjectId;
                                $subjectDetails[$student->subjectCode]->students[$student->studentId]->studentId = $student->studentId;
                                $subjectDetails[$student->subjectCode]->students[$student->studentId]->studentName = $student->studentName;
                                $subjectDetails[$student->subjectCode]->students[$student->studentId]->regNo = $student->regNo;
                                $subjectDetails[$student->subjectCode]->students[$student->studentId]->studentEmail = $student->studentEmail;
                                $subjectDetails[$student->subjectCode]->students[$student->studentId]->studentPhone = $student->studentPhone;
                                $subjectDetails[$student->subjectCode]->students[$student->studentId]->groupName = $student->groupName;
                            }
                        }
                        else{
                            $additionalDetails->examRegistrationName = $student->examRegistrationName;
                            $subjectDetails[$student->subjectCode]->subjectCode = $student->subjectCode;
                            $subjectDetails[$student->subjectCode]->subjectName = $student->subjectName;
                            $subjectDetails[$student->subjectCode]->academicPaperSubjectId = $student->academicPaperSubjectId;
                            $subjectDetails[$student->subjectCode]->students[$student->studentId]->studentId = $student->studentId;
                            $subjectDetails[$student->subjectCode]->students[$student->studentId]->studentName = $student->studentName;
                            $subjectDetails[$student->subjectCode]->students[$student->studentId]->regNo = $student->regNo;
                            $subjectDetails[$student->subjectCode]->students[$student->studentId]->studentEmail = $student->studentEmail;
                            $subjectDetails[$student->subjectCode]->students[$student->studentId]->studentPhone = $student->studentPhone;
                            $subjectDetails[$student->subjectCode]->students[$student->studentId]->groupName = $student->groupName;
                        }
                    }
                    $subectDetailsArray = array_values($subjectDetails);
                    foreach($subectDetailsArray as $subectDetail){
                        $subectDetail->students = array_values($subectDetail->students);
                    }
                    if(empty($subectDetailsArray)){
                        throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"No Students Registered In This Exam Registration Between These Dates");
                    }
                    else{
                        $templateName = "SupplementaryReportSubjectWise";
                        $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/SupplementaryExamReports/$templateName.twig"), [ 'subjects'=>$subectDetailsArray ,'additionalDetails'=>$additionalDetails]);
                        $prtContent = NULL;
                        $prtContent .= '<html><head>';
                        $prtContent .= "<style>
                            h6 {font-size: 26px;} .text-center { text-align: center;} .align-middle {vertical-align: middle;}; tr.noBorder td {border: 0;  border-collapse:collapse;}
                            table, th, td {border: 1px solid black;border-collapse: collapse;}
                            </style>";
                        $prtContent .= '</head><title>Supplementary Report (Subject Wise)</title><body>';
                        $prtContent .= $responseHtml;
                        $prtContent .= '</body></html>';
                        $totalWidth = 210;
                        $totalHeight = 297;
                        $options = array(
                            'page-width'     => $totalWidth."mm",
                            'page-height'    => $totalHeight."mm",
                            'dpi'            => 96,
                            'margin-top' => "9mm",
                            'margin-left' => "1mm",
                            'margin-right' => "1mm",
                            '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->dispalyHtmlData = $responseHtml;
                        $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
                        return  $programResult;
                    }
                } 
                elseif($dispalayType =="STUDENT_WISE"){
                    foreach($studentsDetails as $student){
                        if((!empty($toDate)) && (!empty($toDate))){
                            $toDate = date('Y-m-d', strtotime($toDate));
                            $fromDate = date('Y-m-d', strtotime($fromDate));
                            if(((date('Y-m-d', strtotime($student->studentExamRegistrationDate)) > $fromDate) && ($student->studentExamRegistrationDate != null )) && ((date('Y-m-d', strtotime($student->studentExamRegistrationDate)) < $toDate) && ($student->studentExamRegistrationDate  != null))){
                                $additionalDetails->examRegistrationName = $student->examRegistrationName;
                                $studentDetails[$student->studentId][$student->academicPaperSubjectId]->subjectCode = $student->subjectCode;
                                $studentDetails[$student->studentId][$student->academicPaperSubjectId]->subjectName = $student->subjectName;
                                $studentDetails[$student->studentId][$student->academicPaperSubjectId]->academicPaperSubjectId = $student->academicPaperSubjectId;
                                $studentDetails[$student->studentId][$student->academicPaperSubjectId]->studentId = $student->studentId;
                                $studentDetails[$student->studentId][$student->academicPaperSubjectId]->studentName = $student->studentName;
                                $studentDetails[$student->studentId][$student->academicPaperSubjectId]->regNo = $student->regNo;
                                $studentDetails[$student->studentId][$student->academicPaperSubjectId]->studentEmail = $student->studentEmail;
                                $studentDetails[$student->studentId][$student->academicPaperSubjectId]->studentPhone = $student->studentPhone;
                                $studentDetails[$student->studentId][$student->academicPaperSubjectId]->groupName = $student->groupName;
                            }
                        }
                        else{
                            $additionalDetails->examRegistrationName = $student->examRegistrationName;
                            $studentDetails[$student->studentId][$student->academicPaperSubjectId]->subjectCode = $student->subjectCode;
                            $studentDetails[$student->studentId][$student->academicPaperSubjectId]->subjectName = $student->subjectName;
                            $studentDetails[$student->studentId][$student->academicPaperSubjectId]->academicPaperSubjectId = $student->academicPaperSubjectId;
                            $studentDetails[$student->studentId][$student->academicPaperSubjectId]->studentId = $student->studentId;
                            $studentDetails[$student->studentId][$student->academicPaperSubjectId]->studentName = $student->studentName;
                            $studentDetails[$student->studentId][$student->academicPaperSubjectId]->regNo = $student->regNo;
                            $studentDetails[$student->studentId][$student->academicPaperSubjectId]->studentEmail = $student->studentEmail;
                            $studentDetails[$student->studentId][$student->academicPaperSubjectId]->studentPhone = $student->studentPhone;
                            $studentDetails[$student->studentId][$student->academicPaperSubjectId]->groupName = $student->groupName;
                        }
                    }
                    foreach($studentDetails as $studentSubject){
                        foreach($studentSubject as $student){
                            $studentDetailsArray[] = $student;
                        }
                    }
                    if(empty($studentDetailsArray)){
                        throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"No Registred Students In This Exam Registration");
                    }
                    $templateName = "SupplementaryReportStudentWise";
                    $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/SupplementaryExamReports/$templateName.twig"), [ 'students'=>$studentDetailsArray ,'additionalDetails'=>$additionalDetails]);
                    $prtContent = NULL;
                    $prtContent .= '<html><head>';
                    $prtContent .= "<style>
                        h6 {font-size: 26px;} .text-center { text-align: center;} .align-middle {vertical-align: middle;}; tr.noBorder td {border: 0;  border-collapse:collapse;}
                        table, th, td {border: 1px solid black;border-collapse: collapse;}
                        </style>";
                    $prtContent .= '</head><title>Supplementary Report (Student Wise)</title><body>';
                    $prtContent .= $responseHtml;
                    $prtContent .= '</body></html>';
                    $totalWidth = 210;
                    $totalHeight = 297;
                    $options = array(
                        'page-width'     => $totalWidth."mm",
                        'page-height'    => $totalHeight."mm",
                        'dpi'            => 96,
                        'margin-top' => "9mm",
                        'margin-left' => "1mm",
                        'margin-right' => "1mm",
                        '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->dispalyHtmlData = $responseHtml;
                    $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
                    return  $programResult;
                } 
            }
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $response;
    }
     /**
     * get Year Wise Supplementary result analysis Report
     * @param $searchRequest 
     * @return $response 
     */
    public function getYearWiseSupplementaryResultAnalysis($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $response = new \stdClass;
            $request = new \stdClass;
            $additionalDetails = new \stdClass;
            $additionalDetails->collageName = $GLOBALS['COLLEGE_NAME'];
            $request->courseTypeId = $searchRequest->courseType;
            $request->admissionYear = $searchRequest->admissionYear;
            $request->examRegistrationIds = $searchRequest->examRegistrationIds;
            $examRegistrations=[];
            $studentsDetails = $this->getAllStudentDetailsForSupplementaryResult($request);
            if(empty($studentsDetails)){
                throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"No Registred Students In This Exam Registration");
            }
            else{
                foreach($studentsDetails as $student){
                    $additionalDetails->examRegistrationName = $student->examRegistrationName;
                    $examRegistrations[$student->examRegistrationId]->examRegistrationId = $student->examRegistrationId;
                    $examRegistrations[$student->examRegistrationId]->examRegistrationName = $student->examRegistrationName;
                    $examRegistrations[$student->examRegistrationId]->academicTerm = $student->academicTerm;
                    $examRegistrations[$student->examRegistrationId]->subjects[$student->academicPaperSubjectId]->academicPaperSubjectId = $student->academicPaperSubjectId;
                    $examRegistrations[$student->examRegistrationId]->subjects[$student->academicPaperSubjectId]->subjectName = $student->subjectName;
                    $examRegistrations[$student->examRegistrationId]->subjects[$student->academicPaperSubjectId]->subjectCode = $student->subjectCode;
                    $examRegistrations[$student->examRegistrationId]->subjects[$student->academicPaperSubjectId]->appeared++;
                    if($student->failedStatus == 'FAILED' ){
                        $examRegistrations[$student->examRegistrationId]->subjects[$student->academicPaperSubjectId]->failed++;
                    }
                    else{
                        $examRegistrations[$student->examRegistrationId]->subjects[$student->academicPaperSubjectId]->passed++;
                    }
                }
                $examRegistrationsArray = array_values($examRegistrations);
                foreach($examRegistrationsArray as $examRegistration){
                    foreach($examRegistration->subjects as $subject){
                        $subject->passPercentage = round ( ( 100 * $subject->passed / $subject->appeared ), 2);
                    }
                    $examRegistration->subjects = array_values($examRegistration->subjects);
                }
                $templateName = "SupplementaryYearWiseResultAnalysis";
                $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/SupplementaryExamReports/$templateName.twig"), [ 'examRegistrations'=>$examRegistrationsArray ,'additionalDetails'=>$additionalDetails]);
                $prtContent = NULL;
                $prtContent .= '<html><head>';
                $prtContent .= "<style>
                    h6 {font-size: 26px;} .text-center { text-align: center;} .align-middle {vertical-align: middle;}; tr.noBorder td {border: 0;  border-collapse:collapse;}
                    table, th, td {border: 1px solid black;border-collapse: collapse;}
                    </style>";
                $prtContent .= '</head><title>Supplementary Result Analysis (Year Wise)</title><body>';
                $prtContent .= $responseHtml;
                $prtContent .= '</body></html>';
                $totalWidth = 210;
                $totalHeight = 297;
                $options = array(
                    'page-width'     => $totalWidth."mm",
                    'page-height'    => $totalHeight."mm",
                    'dpi'            => 96,
                    'margin-top' => "9mm",
                    'margin-left' => "1mm",
                    'margin-right' => "1mm",
                    '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->dispalyHtmlData = $responseHtml;
                $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
                return  $programResult;
            }
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $response;
    }
      /**
     * get Course Wise Supplementary result analysis Report
     * @param $searchRequest 
     * @return $response 
     */
    public function getCourseWiseSupplementaryResultAnalysis($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $response = new \stdClass;
            $request = new \stdClass;
            $additionalDetails = new \stdClass;
            $additionalDetails->collageName = $GLOBALS['COLLEGE_NAME'];
            $request->examRegistrationId = $searchRequest->examRegistrationId;
            $request->courseTypeId = $searchRequest->courseType;
            $request->admissionYear = $searchRequest->admissionYear;
            $examRegistration = new \stdClass;;
            $studentsDetails = $this->getAllStudentDetailsForSupplementaryResult($request);
            if(empty($studentsDetails)){
                throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"No Registred Students In This Exam Registration");
            }
            else{
                foreach($studentsDetails as $student){
                    $additionalDetails->examRegistrationName = $student->examRegistrationName;
                    $examRegistration->examRegistrationId = $student->examRegistrationId;
                    $examRegistration->examRegistrationName = $student->examRegistrationName;
                    $examRegistration->academicTerm = $student->academicTerm;
                    $examRegistration->subjects[$student->academicPaperSubjectId]->academicPaperSubjectId = $student->academicPaperSubjectId;
                    $examRegistration->subjects[$student->academicPaperSubjectId]->subjectName = $student->subjectName;
                    $examRegistration->subjects[$student->academicPaperSubjectId]->subjectCode = $student->subjectCode;
                    $examRegistration->subjects[$student->academicPaperSubjectId]->appeared++;
                    if($student->failedStatus == 'FAILED' ){
                        $examRegistration->subjects[$student->academicPaperSubjectId]->failed++;
                    }
                    else{
                        $examRegistration->subjects[$student->academicPaperSubjectId]->passed++;
                    }
                }
                foreach($examRegistration->subjects as $subject){
                    $subject->passPercentage = round ( ( 100 * $subject->passed / $subject->appeared ), 2);
                }
                $examRegistration->subjects = array_values($examRegistration->subjects);
                
                $templateName = "SupplementaryCourseWiseResultAnalysis";
                $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/SupplementaryExamReports/$templateName.twig"), [ 'examRegistration'=>$examRegistration ,'additionalDetails'=>$additionalDetails]);
                $prtContent = NULL;
                $prtContent .= '<html><head>';
                $prtContent .= "<style>
                    h6 {font-size: 26px;} .text-center { text-align: center;} .align-middle {vertical-align: middle;}; tr.noBorder td {border: 0;  border-collapse:collapse;}
                    table, th, td {border: 1px solid black;border-collapse: collapse;}
                    </style>";
                $prtContent .= '</head><title>Supplementary Result Analysis (Course Wise)</title><body>';
                $prtContent .= $responseHtml;
                $prtContent .= '</body></html>';
                $totalWidth = 210;
                $totalHeight = 297;
                $options = array(
                    'page-width'     => $totalWidth."mm",
                    'page-height'    => $totalHeight."mm",
                    'dpi'            => 96,
                    'margin-top' => "9mm",
                    'margin-left' => "1mm",
                    'margin-right' => "1mm",
                    '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->dispalyHtmlData = $responseHtml;
                $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
                return  $programResult;
            }
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $response;
    }
      /**
     * get All Students For Subject Wise SUPPLEMENTARY Status
     * @param $searchRequest 
     * @return $studentDetails 
     */
    public function getAllStudentDetailsForSupplementaryResult($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try
        {
            $finalized = '"FINALIZED"';
            $whereQuery = "";
            $sortBy = "ORDER BY spa.properties->>'$.registerNumber' ASC";
            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->examRegistrationIds)) {
                $examRegistrationIdsString= "'" . implode("', '", $searchRequest->examRegistrationIds) . "'" ;
                $whereQuery .= " AND eerb.ec_exam_registration_id  IN ($examRegistrationIdsString)";
            }
            if(!empty($searchRequest->examRegistrationId)) {
                $examRegistrationIdString = is_array($searchRequest->examRegistrationId) ? "'" . implode("','", $searchRequest->examRegistrationId) . "'" : "'" . $searchRequest->examRegistrationId . "'";
                $whereQuery .= " AND eerb.ec_exam_registration_id IN ( $examRegistrationIdString )";
                // $whereQuery .= " AND eerb.ec_exam_registration_id  = '$searchRequest->examRegistrationId' ";
            }
            if(!empty($searchRequest->isGetOnlyFailedStudent)) {
                if($searchRequest->isGetOnlyFailedStudent){
                    $whereQuery .= " AND esmd.failed_status = 'FAILED'"; 
                }
            }
            if(!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','", $searchRequest->groupId) . "'" : "'" . $searchRequest->groupId . "'";
                $whereQuery .= " AND g.id IN ( $groupIdString )";
            }
            $query = "SELECT DISTINCT
                        sa.studentID as studentId,
                        sa.studentName,
                        spa.properties->>'$.registerNumber' as regNo,
                        g.id as groupId,
                        g.name as groupName,
                        act.id as academicTermId,
                        act.name as academicTerm,
                        ct.typeName AS courseTypeName,
                        eer.name as examName,
                        eer.properties ->> '$.examYear' as examYear,
                        MONTHNAME(STR_TO_DATE(eer.properties ->> '$.examMonth', '%m')) AS examMonthName,
                        eers.am_assessment_id as assessmentId,
                        aa.properties_value ->>'$.assessmentDate' AS assessmentDate,
                        aa.properties_value ->>'$.startTime' AS assessmentStartTime,
                        aa.properties_value ->>'$.endTime' AS assessmentEndTime,
                        eers.valuation_details as valuationDetails,
                        eerb.ec_exam_registration_id as examRegistrationId,
                        eers.cm_academic_paper_subjects_id as academicPaperSubjectId,
                        s.code as subjectCode,
                        s.name as subjectName,
                        eer.name as examRegistrationName,
                        esar.properties ->> '$.registeredDate' as studentExamRegistrationDate,
                        esmd.failed_status as failedStatus,
                        esmd.mark_details ->> '$.attendanceStatus' as absentStatus,
                        esmd.mark_details ->>'$.revaluationId' AS subjectRevaluationId,
                        esmd.mark_details ->>'$.hasRevaluationMark' AS subjectHasRevaluationMark,
                        esmd.mark_details ->>'$.withoutRevaluationIsFailed' AS subjectWithoutRevaluationIsFailed,
                        esmdsubcon.failed_status AS subjectConsolidatedFailedStatus,
                        eerb.properties AS examBatchProperties,
                        eserd.properties->>'$.isResultWithHeld' AS isResultWithHeld
                    FROM
                        `groups` g
                    INNER JOIN program p ON
                        p.id = CAST(g.properties ->> '$.programId' AS CHAR)
                    INNER JOIN `course_type` ct ON
                        ct.courseTypeID = p.course_type_id
                    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 am_assessment aa ON
                        aa.id = eers.am_assessment_id
                    INNER JOIN ec_exam_registration eer ON
                        eer.id = eerb.ec_exam_registration_id AND eer.type = 'SUPPLEMENTARY'
                    INNER JOIN ec_student_assessment_registration esar ON
                        esar.am_assessment_id = eers.am_assessment_id AND 
                        CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND 
                        CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID' AND
                        esar.ec_exam_registration_type = eer.type 
                    INNER JOIN ec_student_exam_registration_details eserd ON 
                        eserd.student_id = esar.student_id AND 
                        eserd.ec_exam_registration_id = eer.id 
                    INNER JOIN studentaccount sa ON 
                        sa.studentID = esar.student_id
                    INNER JOIN student_program_account spa
                        ON spa.student_id = sa.studentID
                    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  academic_term act ON 
                        act.id = CAST(eerb.properties ->> '$.academicTermId'AS CHAR) 
                    INNER JOIN ec_subject_mark_details esmd ON
                        esmd.ec_exam_registration_id = eerb.ec_exam_registration_id AND esmd.groups_id = eerb.groups_id AND esmd.cm_academic_paper_subjects_id = eers.cm_academic_paper_subjects_id AND esmd.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 
                    WHERE 1=1 ";
            $studentDetails = $this->executeQueryForList($query.$whereQuery.$sortBy);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentDetails;
    }
       /**
     * get Year Wise Supplementary Failed Students
     * @param $searchRequest 
     * @return $response 
     */
    public function getYearWiseFailedStudentList($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $request = new \stdClass;
            $additionalDetails = new \stdClass;
            $additionalDetails->collageName = $GLOBALS['COLLEGE_NAME'];
            $courseType = CourseTypeService::getInstance()->getCourseTypesById ($searchRequest->courseType);
            $additionalDetails->courseAndYear = $courseType->courseTypeMethod ."-".$searchRequest->admissionYear;
            $request->examRegistrationIds = $searchRequest->examRegistrationIds;
            $request->courseTypeId = $searchRequest->courseType;
            $request->isGetOnlyFailedStudent = true;
            $request->admissionYear = $searchRequest->admissionYear;
            $isConsiderAbsenteesAsFailed = $searchRequest->isConsiderAbsenteesAsFailed;
            $batches=[];
            $batchesArray = [];
            $studentsDetails = $this->getAllStudentDetailsForSupplementaryResult($request);
            if(empty($studentsDetails)){
                throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"No Registred Students In This Exam Registration");
            }
            else{
                if($isConsiderAbsenteesAsFailed == "true"){
                    foreach($studentsDetails as $student){
                        $additionalDetails->examRegistrationName = $student->examRegistrationName;
                        $batches[$student->groupId]->groupId = $student->groupId;
                        $batches[$student->groupId]->groupName = $student->groupName;
                        $batches[$student->groupId]->students[$student->studentId]->studentId = $student->studentId;
                        $batches[$student->groupId]->students[$student->studentId]->studentName = $student->studentName;
                        $batches[$student->groupId]->students[$student->studentId]->regNo = $student->regNo;
                        $batches[$student->groupId]->students[$student->studentId]->semsters[$student->academicTermId]->academicTermId = $student->academicTermId;
                        $batches[$student->groupId]->students[$student->studentId]->semsters[$student->academicTermId]->academicTerm = $student->academicTerm;
                        $batches[$student->groupId]->students[$student->studentId]->semsters[$student->academicTermId]->subjects[$student->academicPaperSubjectId]->academicPaperSubjectId = $student->academicPaperSubjectId;
                        $batches[$student->groupId]->students[$student->studentId]->semsters[$student->academicTermId]->subjects[$student->academicPaperSubjectId]->subjectCode = $student->subjectCode;
                        $batches[$student->groupId]->students[$student->studentId]->semsters[$student->academicTermId]->subjects[$student->academicPaperSubjectId]->subjectName = $student->subjectName;
                    }
                }
                else{
                    foreach($studentsDetails as $student){
                        if($student->absentStatus != 'ABSENT' || $student->absentStatus == null){
                            $additionalDetails->examRegistrationName = $student->examRegistrationName;
                            $batches[$student->groupId]->groupId = $student->groupId;
                            $batches[$student->groupId]->groupName = $student->groupName;
                            $batches[$student->groupId]->students[$student->studentId]->studentId = $student->studentId;
                            $batches[$student->groupId]->students[$student->studentId]->studentName = $student->studentName;
                            $batches[$student->groupId]->students[$student->studentId]->regNo = $student->regNo;
                            $batches[$student->groupId]->students[$student->studentId]->semsters[$student->academicTermId]->academicTermId = $student->academicTermId;
                            $batches[$student->groupId]->students[$student->studentId]->semsters[$student->academicTermId]->academicTerm = $student->academicTerm;
                            $batches[$student->groupId]->students[$student->studentId]->semsters[$student->academicTermId]->subjects[$student->academicPaperSubjectId]->academicPaperSubjectId = $student->academicPaperSubjectId;
                            $batches[$student->groupId]->students[$student->studentId]->semsters[$student->academicTermId]->subjects[$student->academicPaperSubjectId]->subjectCode = $student->subjectCode;
                            $batches[$student->groupId]->students[$student->studentId]->semsters[$student->academicTermId]->subjects[$student->academicPaperSubjectId]->subjectName = $student->subjectName;
                        }
                    }
                }
                
                $batchesArray = array_values($batches);
                foreach($batchesArray as $batch){
                    $batch->students = array_values($batch->students);
                    foreach($batch->students as $student){
                        $student->semsters = array_values($student->semsters);
                        foreach($student->semsters as $semster){
                            $semster->subjects = array_values($semster->subjects);
                        }
                    }
                }
                $templateName = "FailedStudentList-YearWise";
                $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/SupplementaryExamReports/$templateName.twig"), [ 'batches'=>$batchesArray ,'additionalDetails'=>$additionalDetails]);
                $prtContent = NULL;
                $prtContent .= '<html><head>';
                $prtContent .= "<style>
                    h6 {font-size: 26px;} .text-center { text-align: center;} .align-middle {vertical-align: middle;}; tr.noBorder td {border: 0;  border-collapse:collapse;}
                    table, th, td {border: 1px solid black;border-collapse: collapse;}
                    </style>";
                $prtContent .= '</head><title>Failed Student List (Year Wise)</title><body>';
                $prtContent .= $responseHtml;
                $prtContent .= '</body></html>';
                $totalWidth = 210;
                $totalHeight = 297;
                $options = array(
                    'page-width'     => $totalWidth."mm",
                    'page-height'    => $totalHeight."mm",
                    'dpi'            => 96,
                    'margin-top' => "9mm",
                    'margin-left' => "1mm",
                    'margin-right' => "1mm",
                    '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->dispalyHtmlData = $responseHtml;
                $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
                return  $programResult;
            }
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
    }
    /**
     * get Year Wise Supplementary Failed Students
     * @param $searchRequest 
     * @return $response 
     */
    public function getExamWiseFailedStudentList($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $request = new \stdClass;
            $additionalDetails = new \stdClass;
            $additionalDetails->collageName = $GLOBALS['COLLEGE_NAME'];
            $courseType = CourseTypeService::getInstance()->getCourseTypesById ($searchRequest->courseType);
            $additionalDetails->courseAndYear = $courseType->courseTypeMethod ."-".$searchRequest->admissionYear;
            $request->examRegistrationId = $searchRequest->examRegistrationId;
            $request->courseTypeId = $searchRequest->courseType;
            $request->isGetOnlyFailedStudent = true;
            $request->admissionYear = $searchRequest->admissionYear;
            $isConsiderAbsenteesAsFailed = $searchRequest->isConsiderAbsenteesAsFailed;
            $batches=[];
            $batchesArray = [];
            $studentsDetails = $this->getAllStudentDetailsForSupplementaryResult($request);
            if(empty($studentsDetails)){
                throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"No Registred Students In This Exam Registration");
            }
            else{
                $additionalDetails->examRegistrationName = $studentsDetails[0]->examRegistrationName;
                $additionalDetails->academicTerm = $studentsDetails[0]->academicTerm;
                if($isConsiderAbsenteesAsFailed == "true"){
                    foreach($studentsDetails as $student){
                        $batches[$student->groupId]->groupId = $student->groupId;
                        $batches[$student->groupId]->groupName = $student->groupName;
                        $batches[$student->groupId]->students[$student->studentId]->studentId = $student->studentId;
                        $batches[$student->groupId]->students[$student->studentId]->studentName = $student->studentName;
                        $batches[$student->groupId]->students[$student->studentId]->regNo = $student->regNo;
                        $batches[$student->groupId]->students[$student->studentId]->subjects[$student->academicPaperSubjectId]->academicPaperSubjectId = $student->academicPaperSubjectId;
                        $batches[$student->groupId]->students[$student->studentId]->subjects[$student->academicPaperSubjectId]->subjectCode = $student->subjectCode;
                        $batches[$student->groupId]->students[$student->studentId]->subjects[$student->academicPaperSubjectId]->subjectName = $student->subjectName;
                    }
                }
                else{
                    foreach($studentsDetails as $student){
                        if($student->absentStatus != 'ABSENT' || $student->absentStatus == null){
                            $batches[$student->groupId]->groupId = $student->groupId;
                            $batches[$student->groupId]->groupName = $student->groupName;
                            $batches[$student->groupId]->students[$student->studentId]->studentId = $student->studentId;
                            $batches[$student->groupId]->students[$student->studentId]->studentName = $student->studentName;
                            $batches[$student->groupId]->students[$student->studentId]->regNo = $student->regNo;
                            $batches[$student->groupId]->students[$student->studentId]->subjects[$student->academicPaperSubjectId]->academicPaperSubjectId = $student->academicPaperSubjectId;
                            $batches[$student->groupId]->students[$student->studentId]->subjects[$student->academicPaperSubjectId]->subjectCode = $student->subjectCode;
                            $batches[$student->groupId]->students[$student->studentId]->subjects[$student->academicPaperSubjectId]->subjectName = $student->subjectName;
                        }
                    }
                }
                $batchesArray = array_values($batches);
                foreach($batchesArray as $batch){
                    $batch->students = array_values($batch->students);
                    foreach($batch->students as $student){
                        $student->subjects = array_values($student->subjects);
                    }
                }
                $templateName = "FailedStudentList-ExamWise";
                $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/SupplementaryExamReports/$templateName.twig"), [ 'batches'=>$batchesArray ,'additionalDetails'=>$additionalDetails]);
                $prtContent = NULL;
                $prtContent .= '<html><head>';
                $prtContent .= "<style>
                    h6 {font-size: 26px;} .text-center { text-align: center;} .align-middle {vertical-align: middle;}; tr.noBorder td {border: 0;  border-collapse:collapse;}
                    table, th, td {border: 1px solid black;border-collapse: collapse;}
                    </style>";
                $prtContent .= '</head><title>Failed Student List (Exam Wise)</title><body>';
                $prtContent .= $responseHtml;
                $prtContent .= '</body></html>';
                $totalWidth = 210;
                $totalHeight = 297;
                $options = array(
                    'page-width'     => $totalWidth."mm",
                    'page-height'    => $totalHeight."mm",
                    'dpi'            => 96,
                    'margin-top' => "9mm",
                    'margin-left' => "1mm",
                    'margin-right' => "1mm",
                    '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->dispalyHtmlData = $responseHtml;
                $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
                return  $programResult;
            }
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
    }
     /**
     * get Supplementary result analysis Report
     * @param $searchRequest 
     * @return $response 
     */
    public function getSupplementaryResultAnalysisTemplate($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $response = new \stdClass;
            $request = new \stdClass;
            $additionalDetails = new \stdClass;
            $additionalDetails->collageName = $GLOBALS['COLLEGE_NAME'];
            $request->examRegistrationId = $searchRequest->examRegistrationIds;
            $request->courseTypeId = $searchRequest->courseType;
            $request->admissionYear = $searchRequest->admissionYear;
            $request->groupId = $searchRequest->groupId;
            $examRegistration = new \stdClass;;
            if( $searchRequest->isStaffSideView == 'true'){
                $requestForExamRegistration = new SearchExamRegistrationRequest;
                $requestForExamRegistration->parentExamRegistrationId = $request->examRegistrationId;
                $revaluationRegistrations = ExamRegistrationService::getInstance()->getAllExamRevaluation($requestForExamRegistration);    
            }
            $studentsDetails = $this->getAllStudentDetailsForSupplementaryResult($request);
            if(empty($studentsDetails)){
                throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"Result analysis not available");
            }
            else{
                foreach($studentsDetails as $key=> $student){
                    if( $searchRequest->isStaffSideView == 'true'){
                        $examBatchProperties = json_decode($student->examBatchProperties);
                        if($student->isResultWithHeld == '1' ||  (!($examBatchProperties->isResultPublished ) ||  (($examBatchProperties->isResultPublished) && (strtotime($examBatchProperties->publishingStartDate) > strtotime(date("Y-m-d H:i")))))) {
                            unset($studentMarkDetails[$key]);
                            $student = null;                        
                        }
                    }
                    if($student){
                        if( $searchRequest->isStaffSideView == 'true'){
                            if ( $student->subjectHasRevaluationMark ){
                                $currentRegistration = reset(array_filter($revaluationRegistrations,function($value)use($student){
                                    return $value->id == $student->subjectRevaluationId;
                                }));
                                $revaluationBatch = reset(array_filter($currentRegistration->groups,function($value)use($student){
                                    return $value->id == $student->groupId;
                                }));
                                if ( $revaluationBatch->properties->isResultPublished != 1 || strtotime($revaluationBatch->properties->publishingStartDate) > strtotime(date("Y-m-d H:i"))){
                                    $student->failedStatus = $student->subjectWithoutRevaluationIsFailed == 1 ? "FAILED" : "PASSED";
                                    $student->isFailed = $student->failedStatus;
                                }
                            }
                        }
                        $additionalDetails->examRegistrationName = $student->examRegistrationName;
                        $additionalDetails->examYear = $student->examYear;
                        $additionalDetails->examMonthName = $student->examMonthName;
                        $additionalDetails->courseTypeName = $student->courseTypeName;
                        $examRegistration->examRegistrationId = $student->examRegistrationId;
                        $examRegistration->courseTypeName = $student->courseTypeName;
                        $examRegistration->academicTerm = $student->academicTerm;
                        $examRegistration->subjects[$student->subjectCode]->academicTerm = $student->academicTerm;
                        $semesterNames = CommonExamService::getInstance()->getDifferentSemesterName($student->academicTerm);
                        $examRegistration->subjects[$student->subjectCode]->semNumber = $semesterNames->semNumber;
                        $examRegistration->subjects[$student->subjectCode]->academicPaperSubjectId = $student->academicPaperSubjectId;
                        $examRegistration->subjects[$student->subjectCode]->subjectName = $student->subjectName;
                        $examRegistration->subjects[$student->subjectCode]->subjectCode = $student->subjectCode;
                        $examRegistration->subjects[$student->subjectCode]->appeared++;
                        if( $student->absentStatus == "ABSENT"){
                            $examRegistration->subjects[$student->subjectCode]->absent++;
                            $examRegistration->subjects[$student->subjectCode]->appeared--;
                        }
                        else if($student->failedStatus == 'FAILED' ){
                            $examRegistration->subjects[$student->subjectCode]->failed++;
                        }
                        else{
                            $examRegistration->subjects[$student->subjectCode]->passed++;
                        }
                    }
                }
                if(empty($examRegistration->subjects)){
                    throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"Result analysis not available");
                }
                foreach($examRegistration->subjects as $subject){
                    if ( empty($subject->appeared )){
                        $subject->passPercentage = 0;
                    }
                    else{
                        $subject->passPercentage = round ( ( 100 * $subject->passed / $subject->appeared ), 2);
                    }
                }
                $examRegistration->subjects = array_values($examRegistration->subjects);
                
                $templateName = "SupplementaryResultAnalysisTemplate";
                $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/SupplementaryExamReports/$templateName.twig"), [ 'examRegistration'=>$examRegistration ,'additionalDetails'=>$additionalDetails]);
                $prtContent = NULL;
                $prtContent .= '<html><head>';
                $prtContent .= "<style>
                    h6 {font-size: 26px;} .text-center { text-align: center;} .align-middle {vertical-align: middle;}; tr.noBorder td {border: 0;  border-collapse:collapse;}
                    table, th, td {border: 1px solid black;border-collapse: collapse;}
                    </style>";
                $prtContent .= '</head><title>Supplementary Result Analysis (Course Wise)</title><body>';
                $prtContent .= $responseHtml;
                $prtContent .= '</body></html>';
                $totalWidth = 210;
                $totalHeight = 297;
                $options = array(
                    'page-width'     => $totalWidth."mm",
                    'page-height'    => $totalHeight."mm",
                    'dpi'            => 96,
                    'margin-top' => "9mm",
                    'margin-left' => "1mm",
                    'margin-right' => "1mm",
                    '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->dispalyHtmlData = $responseHtml;
                $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
                return  $programResult;
            }
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $response;
    }
    /**
     * Get Failed Student List
     * @param $searchRequest 
     * @return $programResult 
     */
    public function getFailedStudentListReport($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest); 
        $failedStudents = [];
        $considerSupplementaryResult = false;
       
        $request = new \stdClass;
        $request->examRegistrationId = $searchRequest->examRegistrationId;
        $request->academicTermId = $searchRequest->academicTermId;
        $request->groupId = $searchRequest->groupId;
        $request->courseTypeId = $searchRequest->courseTypeId;
        $request->religionId = $searchRequest->religionId;
        $request->reservationId = $searchRequest->reservationId;
        $request->campusTypeId = $searchRequest->campusTypeId;
        $request->gender = $searchRequest->gender;
        // Rule for Regular Failed Student List
        $searchRuleRequest = new SearchRuleRequest;
        $searchRuleRequest->name = "FAILED_STUDENT_LIST_RULE";
        $failedStudentListRule = RuleService::getInstance()->searchRule($searchRuleRequest);
        $failedStudentListRule = $failedStudentListRule ? reset($failedStudentListRule) : null;
        if(!empty($failedStudentListRule)){
            $considerSupplementaryResult = $failedStudentListRule->rule->considerConsolidatedResultInSupplyFailedStudentList;
        }
        $additionalData = new \stdClass;
        $studentMarkDetails = $this->getAllStudentDetailsForSupplementaryResult($request);
        if(empty($studentMarkDetails)){
            throw new ExamControllerException(ExamControllerException::NO_REPORTS_DETAILS_FOUND,"No student(s) registered.");
        }
        foreach($studentMarkDetails as $student){
            $additionalData->examName = $student->examName;
            $additionalData->semesterName = $student->academicTerm;
            $failedStudentsGroups[$student->groupId]->id = $student->groupId;
            $failedStudentsGroups[$student->groupId]->name = $student->groupName;
            $failedStudentsGroups[$student->groupId]->students[$student->studentId]->id = $student->studentId;
            $failedStudentsGroups[$student->groupId]->students[$student->studentId]->registerNo = $student->regNo;
            $failedStudentsGroups[$student->groupId]->students[$student->studentId]->name = $student->studentName;
            $failedStudentsGroups[$student->groupId]->students[$student->studentId]->subjects = [];
            $failedStudentsGroups[$student->groupId]->semesterName = $student->academicTerm;
            $failedStudentsGroups[$student->groupId]->students[$student->studentId]->currentFailedStatus = $considerSupplementaryResult ? $student->subjectConsolidatedFailedStatus : $student->failedStatus;
            if($searchRequest->absenteesAsFailedStatus =='true'){
                $failedStudentsGroups[$student->groupId]->students[$student->studentId]->currentFailedStatus = $student->absentStatus == 'ABSENT' ? 'FAILED' :  $failedStudentsGroups[$student->groupId]->students[$student->studentId]->currentFailedStatus;
            }
            else{
                $failedStudentsGroups[$student->groupId]->students[$student->studentId]->currentFailedStatus = $student->absentStatus == 'ABSENT' ? 'PASSED' :  $failedStudentsGroups[$student->groupId]->students[$student->studentId]->currentFailedStatus;
            }
            if( $failedStudentsGroups[$student->groupId]->students[$student->studentId]->currentFailedStatus == 'FAILED'){
                $failedStudentsGroups[$student->groupId]->students[$student->studentId]->subjects[$student->academicPaperSubjectId]->id = $student->academicPaperSubjectId;
                $failedStudentsGroups[$student->groupId]->students[$student->studentId]->subjects[$student->academicPaperSubjectId]->code = $student->subjectCode;
                $failedStudentsGroups[$student->groupId]->students[$student->studentId]->subjects[$student->academicPaperSubjectId]->name = $student->subjectName;
            }
        }
       
        if(empty($failedStudentsGroups)){
            throw new ExamControllerException(ExamControllerException::NO_REPORTS_DETAILS_FOUND,"No Failed students in exam registration.");
        }
        $collegeData = CommonExamService::getInstance()->getCollegeDetails();
        $templateName = "Template_1_failed_student_list_report";
        $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/SupplementaryExamReports/$templateName.twig"), [ 'groups'=>$failedStudentsGroups,'data'=>$collegeData,'additionalData'=>$additionalData ]);
        $prtContent = NULL;
            $prtContent .= '<html><head>';
            $prtContent .= "<style>
                </style>";
            $prtContent .= '</head><title>Failed Student List</title><body>';
            $prtContent .= $responseHtml;
            $prtContent .= '</body></html>';
            $totalWidth = 297;
            $totalHeight = 210;
            $options = array(
                'page-width'     => $totalHeight."mm",
                'page-height'    => $totalWidth."mm",
                'dpi'            => 96,
                'margin-top' => "9mm",
                'margin-left' => "1mm",
                'margin-right' => "1mm",
                '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->dispalyHtmlData = $responseHtml;
        $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
        return  $programResult;
    }
    /**
     * get Supply Student Status Report
     * @param $searchRequest 
     * @return $response 
     */
    public function getSupplyStudentStatusReport($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $response = new \stdClass;
            $request = new \stdClass;
            $additionalDetails = new \stdClass;
            $additionalDetails->collageName = $GLOBALS['COLLEGE_NAME'];
            $request->examRegistrationId = $searchRequest->examRegistrationIds;
            $request->courseTypeId = $searchRequest->courseType;
            $request->admissionYear = $searchRequest->admissionYear;
            $request->groupId = $searchRequest->groupId;
            $examRegistration = new \stdClass;;
            $studentsDetails = $this->getAllStudentDetailsForSupplementaryResult($request);
            if(empty($studentsDetails)){
                throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"Result analysis not available");
            }
            else{
                foreach($studentsDetails as $key=> $student){
                    $student->valuationDetails = json_decode($student->valuationDetails);
                    $additionalDetails->examRegistrationName = $student->examRegistrationName;
                    $additionalDetails->examYear = $student->examYear;
                    $additionalDetails->examMonthName = $student->examMonthName;
                    $examRegistration->subjects[$student->subjectCode]->academicTerm = $student->academicTerm;
                    $semesterNames = CommonExamService::getInstance()->getDifferentSemesterName($student->academicTerm);
                    $examRegistration->subjects[$student->subjectCode]->semNumber = $semesterNames->semNumber;
                    $examRegistration->subjects[$student->subjectCode]->academicPaperSubjectId = $student->academicPaperSubjectId;
                    $examRegistration->subjects[$student->subjectCode]->subjectName = $student->subjectName;
                    $examRegistration->subjects[$student->subjectCode]->subjectCode = $student->subjectCode;
                    $examRegistration->subjects[$student->subjectCode]->batchName = $student->groupName;
                    $examRegistration->subjects[$student->subjectCode]->examDate = date("d-m-Y", strtotime($student->assessmentDate));
                    if($student->absentStatus == 'PRESENT'){
                        $examRegistration->subjects[$student->subjectCode]->attendedStudentCount = $examRegistration->subjects[$student->subjectCode]->attendedStudentCount + 1;
                    }
                    if($student->absentStatus == 'PRESENT'){
                        $examRegistration->subjects[$student->subjectCode]->valuatedStudentCount = $examRegistration->subjects[$student->subjectCode]->valuatedStudentCount + 1;
                    }
                }
                if(empty($examRegistration->subjects)){
                    throw new ExamControllerException(ExamControllerException::NO_STUDENTS_IN_THIS_EXAM_REGISTRATION,"Result analysis not available");
                }
                foreach($examRegistration->subjects as $subject){
                }
                $examRegistration->subjects = array_values($examRegistration->subjects);
                $templateName = "SupplementaryStudentStatusTemplate";
                $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/SupplementaryExamReports/$templateName.twig"), [ 'examRegistration'=>$examRegistration ,'additionalDetails'=>$additionalDetails]);
                $prtContent = NULL;
                $prtContent .= '<html><head>';
                $prtContent .= "<style>
                    </style>";
                $prtContent .= '</head><title>Supplementary Student Status Report</title><body>';
                $prtContent .= $responseHtml;
                $prtContent .= '</body></html>';
                $totalWidth = 210;
                $totalHeight = 297;
                $options = array(
                    'page-width'     => $totalWidth."mm",
                    'page-height'    => $totalHeight."mm",
                    'dpi'            => 96,
                    'margin-top' => "9mm",
                    'margin-left' => "1mm",
                    'margin-right' => "1mm",
                    '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->dispalyHtmlData = $responseHtml;
                $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
                return  $programResult;
            }
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $response;
    }
    /**
     * Get Supply Date wise Report
     * @param $searchRequest 
     * @return $programResult 
     */
    public function getSupplyDateWiseReport($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest); 
        $request = new \stdClass;
        $request->examRegistrationId = $searchRequest->examRegistrationId;
        $request->examDate = $searchRequest->examDate;
        $students = NominalRollService::getInstance()->getAllExamRegisteredStudentDetailsForNominalRoll($request);
        if(empty($students)){
            throw new ExamControllerException(ExamControllerException::NO_STUDENT_IN_THE_BATCH_SUBJECT,"No details found.");
        }
        $templateName = "supply-date-wise-report-template";
        $additionalInfo->examRegistrationName = reset($students)->examRegistrationName;
        $additionalInfo->collegeData = CommonExamService::getInstance()->getCollegeDetails();
        $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/SupplementaryExamReports/$templateName.twig"), [ 'students'=>$students,'additionalInfo'=>$additionalInfo]);
        $prtContent = NULL;
            $prtContent .= '<html><head>';
            $prtContent .= "<style>
                </style>";
            $prtContent .= '</head><title>Supply Exam Date Wise Report</title><body>';
            $prtContent .= $responseHtml;
            $prtContent .= '</body></html>';
            $options = array(
                'page-width'     => "210mm",
                'page-height'    => "297mm",
                'dpi'            => 96,
                'margin-top' => "1mm",
                'margin-left' => "1mm",
                'margin-right' => "1mm",
                'margin-bottom' => "1mm",
                // 'binary' => "/usr/local/bin/wkhtmltopdf", // For Mac
                'user-style-sheet' => realpath(DOCUMENT_ROOT . "/libcommon/bootstrap/css/bootstrap.min.css")
            );
        $programResult = new \stdClass;
        $programResult->dispalyHtmlData = $responseHtml;
        $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
        return  $programResult;
    }
    
    
    public function getSupplementaryCasteCategoryResultAnalysis($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest); 
        try{
            $additionalDetails = new \stdClass;
            $additionalDetails->collegeData = CommonExamService::getInstance()->getCollegeDetails();
            $requestForExamRegistration = new \stdClass;
            $casteCategoryStudents = [];
            $gradeList = [];
            $additionalDetails->currentDate = date("d M Y");
            $requestForExamRegistration->examRegistrationId = $searchRequest->examRegistrationId;
            $requestForExamRegistration->groupId = $searchRequest->groupId;
            $examRegistration = reset(ExamRegistrationService::getInstance()->searchDetailedExamRegistrationDetails($requestForExamRegistration));
            if(!empty($examRegistration)){
                $additionalDetails->examRegistrationName = $examRegistration->name;
                $additionalDetails->examRegistrationType = $examRegistration->type; 
                $additionalDetails->degreeDescription = reset($examRegistration->groups)->degreeDescription;
                $additionalDetails->endYear = reset($examRegistration->groups)->properties->endYear;
                $additionalDetails->startYear = reset($examRegistration->groups)->properties->startYear;
                $additionalDetails->academicTermName = reset($examRegistration->groups)->academicTermName;
                $semesterNames = CommonExamService::getInstance()->getDifferentSemesterName($additionalDetails->academicTermName);
                $additionalDetails->academicTermRoman = $semesterNames->romanLetter;
                
            }
            $gradeSchemeRequest = new \stdClass;
            $gradeSchemeRequest->examRegistrationId = $searchRequest->examRegistrationId;
            $gradeSchemeRequest->groupId = array_column($examRegistration->groups,'groupId');
            $gradeSchemeRequest->requestType = "SEMESTER";
            $grades = GradeSchemeService::getInstance()->getAllSemesterSubjectCurriculumGrades($gradeSchemeRequest);
            foreach($grades as $grade){
                if($grade->failStatus != '1'){
                    $gradeList[$grade->gradeName] = $grade;
                }
            }
            $gradeList["PASS"]->gradeName = "PASS";
            $gradeList["ATKT"]->gradeName = "ATKT";
            $gradeList["FAIL"]->gradeName = "FAIL";
            $additionalDetails->gradeList = $gradeList;
            $casteCategoryResultAnalysisRequest = new \stdClass;
            $casteCategoryResultAnalysisRequest->examRegistrationId = $searchRequest->examRegistrationId;
            $casteCategoryResultAnalysisRequest->groupId = $searchRequest->groupId;
            // $casteCategoryResultAnalysisRequest->academicTermId = reset($examRegistration->groups)->academicTermId;
            $studentMarkDetails = RegularExamReportService::getInstance()->getAllRegistredStudentOverAllDetails($casteCategoryResultAnalysisRequest);
            foreach($studentMarkDetails as $student){
                $currentAcademicTerm = reset(array_filter(reset($student->academicTerms)->markHistory,function($value)use($searchRequest){
                    return $value->examRegistrationId == $searchRequest->examRegistrationId;
                }));
                if( empty($currentAcademicTerm) ){
                    continue;
                }
                $reservationId = $student->studentDetails->reservationId;
                $casteId = $student->studentDetails->casteId;
                $studentGender = $student->studentDetails->gender;
                $studentGrade = $currentAcademicTerm->grade;
                $semesterMarksRequest = new \stdClass;
                $semesterMarksRequest->studentId = $student->id;
                $semesterMarksRequest->academicTermId = reset($examRegistration->groups)->academicTermId;
                $semesterMarks = MarksCardService::getInstance()->getStudentSemesterMarkDetails($semesterMarksRequest);
                $arrearCount = 0;
                foreach($semesterMarks as $semKey => $semester){
                    foreach($semester->subjects as $subject){
                        $currentSubject = $this->getSgpaByMonthYear($subject->subjectMarkHistory, $examRegistration, 1);
                        if (count($subject->subjectMarkHistory) > 1){
                            $regularStudentHistory = reset(array_filter($subject->subjectMarkHistory,function($value){
                                return $value->examMarkType == "REGULAR";
                            }));
                            if( $regularStudentHistory && ($currentSubject->internalMark != $regularStudentHistory->internalMark) ){
                                if( empty($currentSubject->externalMarkObtainedInExam ) && !$regularStudentHistory->isExternalFailed ){
                                    $currentSubject->resultStatus = $subject->markDetails->isFailed ? 'FAILED' : 'PASSED';
                                }
                            }
                        }
                        $arrearCount = $currentSubject->resultStatus == "FAILED" ? $arrearCount+1 : $arrearCount;
                    }
                }
                $casteCategoryStudents[$student->studentDetails->batchId]->id = $student->studentDetails->batchId;
                $casteCategoryStudents[$student->studentDetails->batchId]->name = $student->studentDetails->batchName;
                $casteCategoryStudents[$student->studentDetails->batchId]->category[$reservationId]->id = $reservationId;
                $casteCategoryStudents[$student->studentDetails->batchId]->category[$reservationId]->name = $student->studentDetails->reservationName;
                if(empty($casteCategoryStudents[$student->studentDetails->batchId]->category[$reservationId]->genders[$studentGender])){
                    $casteCategoryStudents[$student->studentDetails->batchId]->categoryCount++;
                }
                $casteCategoryStudents[$student->studentDetails->batchId]->category[$reservationId]->genders[$studentGender]->id = $studentGender;
                $casteCategoryStudents[$student->studentDetails->batchId]->category[$reservationId]->genders[$studentGender]->name = ucwords($studentGender);
                $casteCategoryStudents[$student->studentDetails->batchId]->category[$reservationId]->genders[$studentGender]->totalStudent++;
                $casteCategoryStudents[$student->studentDetails->batchId]->totalStudent++;
                if($currentAcademicTerm->failedStatus == "FAILED"){
                    // $studentSubjects = reset($student->academicTerms)->subjects;
                    // $failedSubjects = array_filter($studentSubjects,function($value){
                    //     return $value->isFailed == "FAILED";
                    // });
                    if($arrearCount > 2){
                        $casteCategoryStudents[$student->studentDetails->batchId]->category[$reservationId]->genders[$studentGender]->grades["FAIL"]++;
                        $casteCategoryStudents[$student->studentDetails->batchId]->gradeGrandTotal["FAIL"]++;    
                    }
                    else{
                        $casteCategoryStudents[$student->studentDetails->batchId]->category[$reservationId]->genders[$studentGender]->grades["ATKT"]++;
                        $casteCategoryStudents[$student->studentDetails->batchId]->gradeGrandTotal["ATKT"]++;    
                    }
                }
                else{
                    $casteCategoryStudents[$student->studentDetails->batchId]->category[$reservationId]->genders[$studentGender]->grades["PASS"]++;
                    $casteCategoryStudents[$student->studentDetails->batchId]->category[$reservationId]->genders[$studentGender]->grades[$studentGrade]++;
                    $casteCategoryStudents[$student->studentDetails->batchId]->gradeGrandTotal["PASS"]++;
                    $casteCategoryStudents[$student->studentDetails->batchId]->gradeGrandTotal[$studentGrade]++;
                }
            }
            $casteCategoryStudents = array_values($casteCategoryStudents);
            array_walk($casteCategoryStudents, function($student){
                $student->castes = array_values($student->castes);
            });
            if(empty($casteCategoryStudents)){
                throw new ExamControllerException(ExamControllerException::NO_REPORTS_DETAILS_FOUND,"No Entry In This Exam Registration");
            }
            else{
                $templateName = "casteCategoryWiseResultAnalysis";
                $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/regularExamReportTwigs/$templateName.twig"), [ 'casteCategoryStudents'=>$casteCategoryStudents ,'additionalDetails'=>$additionalDetails]);
                $prtContent = NULL;
                    $prtContent .= '<html><head>';
                    $prtContent .= "<style>
                        h5 {font-size: 26px;} .text-center { text-align: center;} .align-middle {vertical-align: middle;}; tr.noBorder td {border: 0;  border-collapse:collapse;}
                        table, th, td {border: 1px solid black;border-collapse: collapse;}
                        </style>";
                    $prtContent .= '</head><title>Caste Category Wise Result Anaysis</title><body>';
                    $prtContent .= $responseHtml;
                    $prtContent .= '</body></html>';
                    $totalWidth = 297;
                    $totalHeight = 210;
                    $options = array(
                        'page-width'     => $totalHeight."mm",
                        'page-height'    => $totalWidth."mm",
                        'dpi'            => 96,
                        'margin-top' => "3mm",
                        'margin-left' => "10mm",
                        'margin-right' => "10mm",
                        'margin-bottom' => "5mm",
                        // 'binary' => "/usr/local/bin/wkhtmltopdf", // For Mac
                        'user-style-sheet' => realpath(DOCUMENT_ROOT . "/libcommon/bootstrap/css/bootstrap.min.css")
                    );
                $programResult = new \stdClass;
                $programResult->dispalyHtmlData = $responseHtml;
                $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
            }
            
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return  $programResult;
    }
    protected function getSgpaByMonthYear($markHistory, $request, $subjectRequest){
        $currentHistory = '';
        if( $subjectRequest ){
            $currentHistory = array_filter($markHistory,function($value)use($request){
                return $value->examYear."-".date("m", mktime(0, 0, 0, (int)$value->examMonth, 10))  <= $request->examYear."-".date("m", mktime(0, 0, 0, (int)$request->examMonth, 10)); 
            });
            usort($currentHistory, function($a, $b) {
                return ($a->examYear."-".date("m", mktime(0, 0, 0, (int)$a->examMonth, 10))."-".$a->examMarkType) < ($b->examYear."-".date("m", mktime(0, 0, 0, (int)$b->examMonth, 10))."-".$b->examMarkType);
            });
        }
        else{
            
            $currentHistory = array_filter($markHistory,function($value)use($request){
                return $value->examYear."-".date("m", mktime(0, 0, 0, (int)$value->examMonth, 10))  <= $request->examYear."-".date("m", mktime(0, 0, 0, (int)$request->examMonth, 10)); 
            });
            usort($currentHistory, function($a, $b) {
                return ($a->examYear."-".date("m", mktime(0, 0, 0, (int)$a->examMonth, 10))."-".$a->historyType) < ($b->examYear."-".date("m", mktime(0, 0, 0, (int)$b->examMonth, 10))."-".$b->historyType);
            });
        }
       
        return reset($currentHistory);
    }
    
   
    
    
}