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 / 16
CRAP
0.00% covered (danger)
0.00%
0 / 954
ExamRevaluationService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 16
18090.00
0.00% covered (danger)
0.00%
0 / 954
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 4
 saveExamRevaluationFeeForGroup
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 23
 deleteExamRevaluationBatchGroup
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 getRevaluationRegisterdStudentDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 24
 getRevaluationStudentSubjects
0.00% covered (danger)
0.00%
0 / 1
506.00
0.00% covered (danger)
0.00%
0 / 88
 getStudentsRegisteredSubjectsForRevaluation
0.00% covered (danger)
0.00%
0 / 1
90.00
0.00% covered (danger)
0.00%
0 / 112
 getAllRevaluationsByParentRegistrations
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 27
 saveStudentRevaluationMarks
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 51
 getRevaluationReport
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 57
 getRevaluatedStudentDetails
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 100
 getRevaluationExamRegistrationCount
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 29
 getRevaluationBlankReport
0.00% covered (danger)
0.00%
0 / 1
210.00
0.00% covered (danger)
0.00%
0 / 67
 getNearestMarks
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 14
 getRevaluationReportWithNoImprovementStudent
0.00% covered (danger)
0.00%
0 / 1
870.00
0.00% covered (danger)
0.00%
0 / 150
 getAllStudentsMarksForRevaluation
0.00% covered (danger)
0.00%
0 / 1
90.00
0.00% covered (danger)
0.00%
0 / 116
 getRevaluationDigitalValuationReport
0.00% covered (danger)
0.00%
0 / 1
182.00
0.00% covered (danger)
0.00%
0 / 79
<?php
namespace com\linways\ec\core\service;
use com\linways\base\util\MakeSingletonTrait;
use com\linways\ec\core\exception\ExamControllerException;
use com\linways\ec\core\mapper\ExamRevaluationServiceMapper;
use com\linways\ec\core\mapper\ExamRegistrationServiceMapper;
use com\linways\core\ams\professional\logging\AMSLogger;
use com\linways\ec\core\logging\Events;
use com\linways\ec\core\logging\entities\Staff;
use com\linways\core\ams\professional\service\CommonService;
use com\linways\ec\core\request\SearchExamRegistrationRequest;
use com\linways\ec\core\service\ExamRegistrationService;
use com\linways\base\util\TwigRenderer;
use com\linways\core\ams\professional\util\PdfUtil;
use com\linways\ec\core\service\GradeSchemeService;
use com\linways\ec\core\service\ExamValuationService;
use com\linways\core\ams\professional\service\StaffService;
use com\linways\core\ams\professional\request\api\GetAllFacultiesRequest;
use com\linways\ec\core\service\RuleService;
use com\linways\ec\core\request\SearchRuleRequest;
use com\linways\core\ams\professional\constant\StatusConstants;
class ExamRevaluationService extends BaseService
{
    use MakeSingletonTrait;
    private function __construct() {
        $this->mapper = ExamRevaluationServiceMapper::getInstance()->getMapper();
        $this->mapper2 = ExamRegistrationServiceMapper::getInstance()->getMapper();
        $this->logger = AMSLogger::getLogger('exam-controller-log');
    }
    /**
     * Save exam revaluation batch group fee
     * @return $id
     */
    public function saveExamRevaluationFeeForGroup ( $revaluationFee )
    {
        $revaluationFee = $this->realEscapeObject($revaluationFee);
        $revaluationFee->createdBy = $GLOBALS['userId'] ?? $revaluationFee->createdBy;
        $revaluationFee->updatedBy = $GLOBALS['userId'] ?? $revaluationFee->updatedBy;
        
        $feeObj = new \stdClass();
        $feeObj->revaluationFee = $revaluationFee->revaluationFee;
        $feeObj->feeTemplateId = $revaluationFee->feeTemplateId;
        $feeObj->paymentMethods = $revaluationFee->paymentMethods;
        $feeJson = json_encode($feeObj);
        $query = "UPDATE
                exam_revaluation_batch_groups
            SET
                fee_properties = '$feeJson',
                updated_by = '$revaluationFee->updatedBy'
            WHERE
                id = '$revaluationFee->batchGroupId'";
        try{
            $this->executeQuery($query);
        }catch(\Exception $e) {
            throw new ExamControllerException ($e->getCode(),$e->getMessage());   
        }
        return $revaluationFee->batchGroupId;
    }    
    
    /**
     * Delete exam revaluation batch group 
     * @return $id
     */
    public function deleteExamRevaluationBatchGroup ( $groupId )
    {
        $groupId = $this->realEscapeString($groupId);
        $query = "DELETE
            FROM
                exam_revaluation_batch_groups
            WHERE
                id = '$groupId'";
        try{
            return $this->executeQuery($query);
        }catch(\Exception $e) {
            throw new ExamControllerException ($e->getCode(),$e->getMessage());   
        }
    }    
    /**
     *  Get Revaluation Registered Student Details
     * @params examRegistrationId
     * @return studentList
     */
    public function getRevaluationRegisterdStudentDetails($request){
        $request = $this->realEscapeObject($request);
        $limitQuerry = "Limit 1";
        $whereQuery = '';
        $query = " SELECT 
            esar.student_id as studentId,
            esar.am_assessment_id as assessmentId
        FROM
            ec_exam_registration_batch eerb
        INNER JOIN ec_exam_registration_subject eers ON
            eers.ec_exam_registration_batch_id = eerb.id 
        INNER JOIN ec_student_assessment_registration esar ON
            esar.am_assessment_id = eers.am_assessment_id
        INNER JOIN  ec_exam_registration eer ON
            eer.id = eerb.ec_exam_registration_id AND eer.type = esar.ec_exam_registration_type
        INNER JOIN  exam_revaluation_batch_groups erbg ON
            erbg.ec_exam_revaluation_id = eerb.ec_exam_registration_id AND FIND_IN_SET(eerb.groups_id, erbg.group_ids->'$.groupIds')
        WHERE eerb.ec_exam_registration_id = '$request->examRegistrationId' AND erbg.id = '$request->batchGroupId'";
        try {
            $studentList = $this->executeQueryForList($query. $whereQuery.$limitQuerry);
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentList;
    }
    /**
     * get Internal Mark Subject List
     * @param $searchRequest 
     * @return $response 
     */
    public function getRevaluationStudentSubjects($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $response = new \stdClass;
            $request = new \stdClass;
            $request->revaluationId = $searchRequest->revaluationId;
            $request->revaluationType = $searchRequest->revaluationType;
            $request->assessmentId = $searchRequest->assessmentId;
            $request->assessmentIds = $searchRequest->assessmentIds;
            // $request->groupId = $searchRequest->groupId;
            $subjectList = [];
            $subjects =  $this->getStudentsRegisteredSubjectsForRevaluation($request);
            // grouping same subject code
            foreach($subjects as $subject){
                $subjectList[$subject->subjectCode.$subject->revaluationType]->id = $subject->id;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->academicTermId = $subject->academicTermId;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->academicTermName = $subject->academicTermName;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->academicPaperSubjectId = $subject->academicPaperSubjectId;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->groupId = $subject->groupId;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->programId = $subject->programId;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->groupName = $subject->groupName;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->subjectId = $subject->subjectId;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->subjectCode = $subject->subjectCode;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->subjectName = $subject->subjectName;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->assessmentId = $subject->assessmentId;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->assessmentIds = $subjectList[$subject->subjectCode.$subject->revaluationType]->assessmentIds ? array_merge($subjectList[$subject->subjectCode.$subject->revaluationType]->assessmentIds,  array_column( $subject->assessmentIds, "assessmentId")) : array_column( $subject->assessmentIds, "assessmentId");
                $subjectList[$subject->subjectCode.$subject->revaluationType]->revaluationType = $subject->revaluationType;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->revaluationTypeName = $subject->revaluationTypeName;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->isInternal = $subject->isInternal;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->isExternal = $subject->isExternal;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->externalMaxMark = $subject->externalMaxMark;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->internalMaxMark = $subject->internalMaxMark;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->courseTypeId = $subject->courseTypeId;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->revaluationProperty = $subject->revaluationProperty;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->valuationRule = $subject->valuationRule;
                $subjectList[$subject->subjectCode.$subject->revaluationType]->students = $subjectList[$subject->subjectCode.$subject->revaluationType]->students ? array_merge($subjectList[$subject->subjectCode.$subject->revaluationType]->students,$subject->students) : $subject->students;
            }
            $subjectList = array_values($subjectList);
            foreach($subjectList as $subject){
                $subject->isError = $subject->internalMaxMark ? false : true;
                $subject->markEnteredStudentCount = 0;
                $subject->revaluationId = $searchRequest->revaluationId;
                array_walk($subject->students,function($student,$key) use($subject, $response){
                    $student->revaluationMark = $student->revaluationMark ? round($student->revaluationMark, 2) : $student->revaluationMark ;
                    $student->valuationMark2 = $student->valuationMark2 ? round($student->valuationMark2, 2) : $student->valuationMark2 ;
                    $student->internalMark = $student->internalMark ? round($student->internalMark, 2) : $student->internalMark ;
                    $student->valuationMark3 = $student->valuationMark3 ? round($student->valuationMark3, 2) : $student->valuationMark3 ;
                    $student->externalMark = $student->externalMark ? round($student->externalMark, 2) : $student->externalMark ;
                    $student->oldRevaluationMark = $student->revaluationMark;
                    $student->revaluationId = $subject->revaluationId;
                    if($student->finalizeVal2 && $student->hasEligibleThirdVal){
                        $subject->hasThirdValuation = true;
                    }
                    if($student->finalizeVal2){
                        $subject->hasFinalizedVal2 = true;
                    }
                    if($student->finalizeVal3){
                        $subject->hasFinalizedVal3 = true;
                    }
                    if($student->finalizeRevaluation){
                        $subject->hasFinalizedRevaluation = true;
                    }
                });
                $subject->totalStudentCount = count($subject->students);
            }
            $valuationSettings =  CommonService::getInstance()->getSettings("EXAM_REVALUATION", "ENABLE_VALUATION_BASE_MARK_ENTRY_FOR_REVALUATION");
            $valuationSettings = json_decode($valuationSettings);
            $response->enableValuation = false;
            if($valuationSettings->enableValuation == 1){
                if($valuationSettings->considerAllCourses){
                    $response->enableValuation = true;
                }
                else if(!empty($valuationSettings->courseTypeId)){
                    $sampleStudentCourseType = current($subjectList)->courseTypeId;
                    if(in_array($sampleStudentCourseType, $valuationSettings->courseTypeId)){
                        $response->enableValuation = true;
                    }
                }
            }
            if( reset($subjectList)->courseTypeId ){
                $markDiffDetails = ExamValuationService::getInstance()->getExternalValuationMarkDifference(reset($subjectList)->courseTypeId);
                $markDiff = $markDiffDetails->markDiff;
            }
            $response->subjectList = $subjectList;
            $response->thirdValuationMargin = (integer)$markDiff;
            $response->scheme = $markDiffDetails->scheme;
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $response;
    }
        /**
     * get Assigned Subject Students Details For Internal Mark Entry
     * @param $searchRequest 
     * @return $subjectWiseInternalMarkDetails 
     */
    public function getStudentsRegisteredSubjectsForRevaluation($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try
        {
            $orderBy = " ORDER BY s.name ASC , sa.regNo ASC";
            $whereQuery = "";
            if(!empty($searchRequest->revaluationId)) {
                $whereQuery .= " AND eer.id IN ( '$searchRequest->revaluationId' )";
            }
            if(!empty($searchRequest->revaluationType)) {
                $whereQuery .= " AND esar.identifying_context->>'$.revaluationType' IN ( '$searchRequest->revaluationType' )";
            }
            if(!empty($searchRequest->studentId)) {
                $whereQuery .= " AND esar.student_id IN ( '$searchRequest->studentId' )";
            }
            if(!empty($searchRequest->assessmentId)) {
                $whereQuery .= " AND esar.am_assessment_id IN ( '$searchRequest->assessmentId' )";
            }
            if(!empty($searchRequest->assessmentIds)) {
                $assessmentIdsString = is_array($searchRequest->assessmentIds) ? "'" . implode("','",$searchRequest->assessmentIds) . "'" : "'".$searchRequest->assessmentIds."'";
                $whereQuery .= " AND esar.am_assessment_id IN ( $assessmentIdsString )";
            }
            if(!empty($searchRequest->orderByHighestMark)){
                $orderBy = " ORDER BY ostm.mark_obtained DESC";
            }
            $query = "SELECT
                g.id AS groupId,
                g.name AS groupName,
                g.properties ->>'$.programId'  AS programId,
                caps.id AS academicPaperSubjectId,
                caps.properties ->> '$.isInternal' as isInternal,
                caps.properties ->> '$.isExternal' as isExternal,
                caps.properties ->> '$.externalMaxMark' as externalMaxMark,
                caps.properties ->> '$.internalMaxMark' as internalMaxMark,
                s.id AS subjectId,
                s.code AS subjectCode,
                s.name AS subjectName,
                spa.student_id AS studentId,
                sa.studentName AS studentName,
                spa.properties->>'$.rollNumber' AS studentRollNo,
                spa.properties->>'$.registerNumber' AS studentRegisterNo,
                p.course_type_id as courseTypeId,
                esar.am_assessment_id AS assessmentId,
                oe.id AS oeExamId,
                esar.identifying_context->>'$.revaluationType' AS revaluationType,
                CONCAT( caps.id,  CAST(esar.identifying_context->>'$.revaluationType'AS CHAR) ) as revalPaperSubjectId,
                ef.examFeesName AS revaluationTypeName,
                im.internal_mark AS internalMark,
                erm.mark_obtained  AS revaluationMark,
                erm2.mark_obtained  AS valuationMark2,
                erm3.mark_obtained  AS valuationMark3,
                ostm2.attendance_status AS isAbsent,
                ostm2.mark_obtained  AS externalMark,
                erm2.properties ->> '$.finalizedMark' as finalizeVal2,
                erm3.properties ->> '$.finalizedMark' as finalizeVal3,
                erm.properties ->> '$.finalizedMark' as finalizeRevaluation,
                erm2.properties ->> '$.hasEligibleThirdValuation' as hasEligibleThirdVal,
                eer.properties as revaluationProperty,
                eerb.properties ->> '$.valuationRule' as valuationRule
            FROM
                ec_student_assessment_registration esar
            INNER JOIN ec_exam_registration eer ON
                eer.`type` = esar.ec_exam_registration_type AND eer.id = CAST(esar.identifying_context->>'$.examRegistrationId' AS CHAR)
            INNER JOIN ec_exam_registration_batch eerb ON
                eerb.ec_exam_registration_id = eer.id 
            INNER JOIN ec_exam_registration eer2 ON
                eer2.id = eer.properties->>'$.parentExamRegistrationId' AND 
                eer2.trashed IS NULL
            INNER JOIN ec_exam_registration_batch eerbParent ON
                eerbParent.ec_exam_registration_id = eer2.id  AND 
                eerb.groups_id = eerbParent.groups_id
            INNER JOIN ec_exam_registration_subject eers2 ON     
                eers2.ec_exam_registration_batch_id = eerbParent.id 
            INNER JOIN cm_academic_paper_subjects caps ON
                caps.id = eers2.cm_academic_paper_subjects_id AND eers2.am_assessment_id = esar.am_assessment_id 
            INNER JOIN oe_exams oe ON
                oe.assessment_id = esar.am_assessment_id AND oe.is_deleted = 0
            INNER JOIN v4_ams_subject s ON
                s.id = caps.ams_subject_id
            INNER JOIN `groups` g ON
                g.id = eerb.groups_id
                AND g.`type` = 'BATCH'
            INNER JOIN department d ON
                d.deptID = g.properties ->> '$.departmentId'
            INNER JOIN studentaccount sa ON
                sa.studentID = esar.student_id
            INNER JOIN program p ON 
                p.id = g.properties->>'$.programId'
            INNER JOIN student_program_account spa ON 
                spa.current_program_id = p.id AND 
                spa.student_id = esar.student_id 
            INNER JOIN exam_feestype ef ON
                ef.examfeesID = CAST(esar.identifying_context->>'$.revaluationType' AS CHAR)
            LEFT JOIN ec_internal_marks im ON
                im.groups_id = eerb.groups_id AND 
                im.academic_paper_subjects_id = caps.id AND 
                im.academic_term_id = CAST(eerb.properties ->> '$.academicTermId' AS CHAR) AND im.student_id = sa.studentID
            LEFT JOIN ec_revaluation_mark erm ON 
                erm.student_id = sa.studentID AND erm.am_assessment_id = esar.am_assessment_id AND erm.revaluation_type = CAST(esar.identifying_context->>'$.revaluationType'AS CHAR) AND erm.valuation_count = 'FINALIZED'
            LEFT JOIN ec_revaluation_mark erm2 ON 
                erm2.student_id = sa.studentID AND erm2.am_assessment_id = esar.am_assessment_id AND erm2.revaluation_type = CAST(esar.identifying_context->>'$.revaluationType'AS CHAR) AND erm2.valuation_count = '2'
            LEFT JOIN ec_revaluation_mark erm3 ON 
                erm3.student_id = sa.studentID AND erm3.am_assessment_id = esar.am_assessment_id AND erm3.revaluation_type = CAST(esar.identifying_context->>'$.revaluationType'AS CHAR) AND erm3.valuation_count = '3'
            LEFT JOIN oe_student_total_mark ostm2 ON 
                ostm2.student_id = sa.studentID AND ostm2.am_assessment_id = esar.am_assessment_id AND (ostm2.valuation_type IS NULL OR ostm2.valuation_type = '') AND ostm2.valuation_count = 'FINALIZED'
            WHERE eer.type = 'REVALUATION' AND esar.properties ->>'$.feeStatus' = 'PAID' AND esar.properties ->>'$.registrationStatus' = 'REGISTERED' AND eer.trashed IS NULL ";
            $subjectWiseMarkDetails = $this->executeQueryForList($query.$whereQuery.$orderBy, $this->mapper[ExamRevaluationServiceMapper::GET_REVALUATION_STUDENT_SUBJETCS]);
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectWiseMarkDetails;
    }
    /**
     *  Get ALl Revaluation By Parent Registration
     * @params examRegistrationId
     * @return studentList
     */
    public function getAllRevaluationsByParentRegistrations($request){
        $request = $this->realEscapeObject($request);
        $whereQuery = "";
        if(!empty($request->revaluationId)) {
            $whereQuery .= " AND eer.id NOT IN ( '$request->revaluationId' )";
        }
        if(!empty($request->examRegistrationId)) {
            $whereQuery .= " AND eer.properties->>'$.parentExamRegistrationId' IN ( '$request->examRegistrationId' )";
        }
        $query = " SELECT 
                eer.id,
                eer.identifying_context,        
                eer.name,
                eer.type,
                eer.properties,
                eer.fees_properties,
                eer.trashed
            FROM
                ec_exam_registration eer 
            WHERE 
                eer.type = 'REVALUATION' AND eer.trashed IS NULL";
        try {
            $registrations = $this->executeQueryForList($query. $whereQuery,$this->mapper2[ExamRegistrationServiceMapper::SEARCH_CURRENT_EXAM_REVALUATION]);
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $registrations;
    }
            /**
         * Save online exam users' total mark
         * @param ObjectArray $examUserMarks
         * @return Boolean true
         * @throws OnlineExamException
         * @author Vishnu M
         */
        public function saveStudentRevaluationMarks ($revaluationMarks) {
            $revaluationMarks = $this->realEscapeArray($revaluationMarks);
            $values = [];
            if ( empty ( $revaluationMarks ) ) {
                throw new ExamControllerException (ExamControllerException::EMPTY_PARAMETERS, "Empty Parameters! Please specify marks to save");
            }
            foreach ( $revaluationMarks as $revaluationMark ) {
                $revaluationMark->properties = $revaluationMark->properties ? json_encode($revaluationMark->properties) : "{}";
                $values[] = "(
                    '$revaluationMark->studentId',
                    '$revaluationMark->revaluationId',
                    '$revaluationMark->assessmentId',
                    '$revaluationMark->revaluationType',
                    '$revaluationMark->valuationCount',
                    '$revaluationMark->markObtained',
                    '$revaluationMark->properties',
                    '$revaluationMark->createdBy'
                )";
                $staffId = $revaluationMark->createdBy;
            }
            try {
                $sql = "INSERT INTO `ec_revaluation_mark` (
                            `student_id`, 
                            `ec_exam_registration_id`, 
                            `am_assessment_id`, 
                            `revaluation_type`, 
                            `valuation_count`, 
                            `mark_obtained`, 
                            `properties`, 
                            `created_by`
                        ) VALUES  " . implode(', ', $values). " ON DUPLICATE KEY UPDATE 
                            `mark_obtained` = VALUES(mark_obtained),
                            `properties` = VALUES(properties),
                            `updated_by` = VALUES(created_by)";
                $this->executeQuery($sql);
                AMSLogger::log_info($this->logger,Events::EC_SAVE_REVALUATION_MARK, [
                    "staff" => new Staff(["id" => $staffId]),
                    "request" => $revaluationMarks,
                    "status" => StatusConstants::SUCCESS
                ]);
            } catch (\Exception $e) {
                AMSLogger::log_error($this->logger,Events::EC_SAVE_REVALUATION_MARK, [
                    "staff" => new Staff(["id" => $staffId]),
                    "request" => $revaluationMarks,
                    "errorCode" => $e->getCode(),
                    "errorMessage" => $e->getMessage(),
                    "status" => StatusConstants::FAILED
                ]);
                throw new ExamControllerException ($e->getCode(), $e->getMessage());
            }
            return true;
        }
         /**
     * Get Revaluation Report
     * @param $searchRequest 
     * @return $programResult 
     */
    public function getRevaluationReport($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        $request = new \stdClass;
        $request->revaluationId = $searchRequest->revaluationId;
        $request->revaluationType = $searchRequest->revaluationType;
        $resultData = new \stdClass;
        $templateName = "revaluation-report-template-1";
        if(empty($request->revaluationId)){
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Invailed Request");
        }
        $requestForExamRegistration = new SearchExamRegistrationRequest;
        $requestForExamRegistration->id = $request->revaluationId;
        $examRegistration = reset(ExamRegistrationService::getInstance()->searchExamRegistration($requestForExamRegistration));
        $resultData =  $this->getRevaluatedStudentDetails($request);
        $collegeData = CommonExamService::getInstance()->getCollegeDetails();
        $searchRuleRequest = new SearchRuleRequest;
        $searchRuleRequest->name = "REVALUATION_SETTINGS_RULE";
        $revaluationRule = reset(RuleService::getInstance()->searchRule($searchRuleRequest))->rule;
        $settings = new \stdClass;
        $settings->enableFalseNo = 0;
        $settings->hideEmailAndType = 0;
        $settings->displayMaxMark = 0;
        $settings->displayAllValuationMarks = 0;
        $settings->enableRevaluationMark = 1;
        $settings->displayExamRegName = 1;
        if($revaluationRule->revaluationReportSettings){
            $settings->enablePacketNo = $revaluationRule->revaluationReportSettings->enablePacketNo ? 1 : 0;
            $settings->enableFalseNo = $revaluationRule->revaluationReportSettings->enableFalseNo ? 1 : 0;
            $settings->enableRevaluationMark = $revaluationRule->revaluationReportSettings->enableRevaluationMark ? 1 : 0;
        }
        if(empty($resultData)){
            throw new ExamControllerException(ExamControllerException::NO_REPORTS_DETAILS_FOUND,"No details found.");
        }
        $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/revaluationReport/$templateName.twig"), [ 'students'=>$resultData,'college'=>$collegeData,'examRegistration'=>$examRegistration,'settings'=>$settings]);
        $prtContent = NULL;
            $prtContent .= '<html><head>';
            $prtContent .= "<style>
                </style>";
            $prtContent .= '</head><title>Moderation Report</title><body>';
            $prtContent .= $responseHtml;
            $prtContent .= '</body></html>';
            $totalWidth = 297;
            $totalHeight = 210;
            $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;
    }
      /**
     * get Revaluated Student Details 
     * @param $searchRequest 
     * @return $subjectWiseInternalMarkDetails 
     */
    public function getRevaluatedStudentDetails($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try
        {
            $orderBy = " ORDER BY s.name ASC , spa.properties->>'$.registerNumber' ASC";
            $whereQuery = "";
            if(!empty($searchRequest->revaluationId)) {
                $whereQuery .= " AND eer.id IN ( '$searchRequest->revaluationId' )";
            }
            if(!empty($searchRequest->revaluationType)) {
                $whereQuery .= " AND esar.identifying_context->>'$.revaluationType' IN ( '$searchRequest->revaluationType' )";
            }
            if(!empty($searchRequest->academicPaperSubjectId)) {
                $academicPaperSubjectIdString = is_array($searchRequest->academicPaperSubjectId) ? "'" . implode("','",$searchRequest->academicPaperSubjectId) . "'" : "'".$searchRequest->academicPaperSubjectId."'";
                $whereQuery .= " AND caps.id IN ( $academicPaperSubjectIdString )";
            }
            $query = "SELECT
                g.id AS groupId,
                g.name AS groupName,
                caps.id AS academicPaperSubjectId,
                caps.properties ->> '$.isInternal' as isInternal,
                caps.properties ->> '$.isExternal' as isExternal,
                caps.properties ->> '$.externalMaxMark' as externalMaxMark,
                caps.properties ->> '$.internalMaxMark' as internalMaxMark,
                s.id AS subjectId,
                s.code AS subjectCode,
                s.name AS subjectName,
                spa.student_id AS studentId,
                sa.studentName AS studentName,
                sa.studentEmail AS studentEmail,
                spa.properties->>'$.rollNumber' AS studentRollNo,
                spa.properties->>'$.registerNumber' AS studentRegisterNo,
                esar.am_assessment_id AS assessmentId,
                esarparent.properties->>'$.falseNo' AS falseNo,
                oe.id AS oeExamId,
                esar.identifying_context->>'$.revaluationType' AS revaluationType,
                CONCAT( caps.id,  CAST(esar.identifying_context->>'$.revaluationType'AS CHAR) ) as revalPaperSubjectId,
                ef.examFeesName AS revaluationTypeName,
                im.internal_mark AS internalMark,
                erm.mark_obtained  AS revaluationMark,
                erm2.mark_obtained  AS mark2,
                erm3.mark_obtained  AS mark3,
                ostm2.attendance_status AS isAbsent,
                ostm2.mark_obtained  AS externalMark,
                erm.properties ->> '$.finalizedMark' as finalizeRevaluation
            FROM
                ec_student_assessment_registration esar
            INNER JOIN ec_exam_registration eer ON
                eer.`type` = esar.ec_exam_registration_type AND eer.id = CAST(esar.identifying_context->>'$.examRegistrationId' AS CHAR)
            INNER JOIN ec_exam_registration_batch eerb ON
                eerb.ec_exam_registration_id = eer.id 
            INNER JOIN ec_exam_registration eer2 ON
                eer2.id = eer.properties->>'$.parentExamRegistrationId' AND 
                eer2.trashed IS NULL
            INNER JOIN ec_exam_registration_batch eerbParent ON
                eerbParent.ec_exam_registration_id = eer2.id  AND 
                eerb.groups_id = eerbParent.groups_id
            INNER JOIN ec_exam_registration_subject eers2 ON     
                eers2.ec_exam_registration_batch_id = eerbParent.id 
            INNER JOIN cm_academic_paper_subjects caps ON
                caps.id = eers2.cm_academic_paper_subjects_id AND eers2.am_assessment_id = esar.am_assessment_id 
            INNER JOIN oe_exams oe ON
                oe.assessment_id = esar.am_assessment_id AND oe.is_deleted = 0
            INNER JOIN v4_ams_subject s ON
                s.id = caps.ams_subject_id
            INNER JOIN `groups` g ON
                g.id = eerb.groups_id
                AND g.`type` = 'BATCH'
            INNER JOIN studentaccount sa ON
                sa.studentID = esar.student_id
            INNER JOIN program p ON 
                p.id = g.properties->>'$.programId'
            INNER JOIN student_program_account spa ON 
                spa.current_program_id = p.id AND 
                spa.student_id = esar.student_id 
            INNER JOIN exam_feestype ef ON
                ef.examfeesID = CAST(esar.identifying_context->>'$.revaluationType' AS CHAR)
            LEFT JOIN ec_internal_marks im ON
                im.groups_id = eerb.groups_id AND 
                im.academic_paper_subjects_id = caps.id AND 
                im.academic_term_id = CAST(eerb.properties ->> '$.academicTermId' AS CHAR) AND im.student_id = sa.studentID
            LEFT JOIN ec_revaluation_mark erm ON 
                erm.student_id = sa.studentID AND erm.am_assessment_id = esar.am_assessment_id AND erm.revaluation_type = CAST(esar.identifying_context->>'$.revaluationType'AS CHAR) AND erm.valuation_count = 'FINALIZED'
            LEFT JOIN ec_revaluation_mark erm2 ON 
                erm2.student_id = sa.studentID AND erm2.am_assessment_id = esar.am_assessment_id AND erm2.revaluation_type = CAST(esar.identifying_context->>'$.revaluationType'AS CHAR) AND erm2.valuation_count = '2'
            LEFT JOIN ec_revaluation_mark erm3 ON 
                erm3.student_id = sa.studentID AND erm3.am_assessment_id = esar.am_assessment_id AND erm3.revaluation_type = CAST(esar.identifying_context->>'$.revaluationType'AS CHAR) AND erm3.valuation_count = '3'
            LEFT JOIN oe_student_total_mark ostm2 ON 
                ostm2.student_id = sa.studentID AND ostm2.am_assessment_id = esar.am_assessment_id AND (ostm2.valuation_type IS NULL OR ostm2.valuation_type = '') AND ostm2.valuation_count = 'FINALIZED'
            INNER JOIN ec_student_assessment_registration esarparent ON
                esarparent.student_id = esar.student_id AND
                esarparent.am_assessment_id = esar.am_assessment_id AND
                esarparent.ec_exam_registration_type = eer2.type
            WHERE eer.type = 'REVALUATION' AND esar.properties ->>'$.feeStatus' = 'PAID' AND esar.properties ->>'$.registrationStatus' = 'REGISTERED' AND eer.trashed IS NULL ";
            $revaluatedStudentDetails = $this->executeQueryForList($query.$whereQuery.$orderBy);
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $revaluatedStudentDetails;
    }
     /**
     * Get all exam registation count
     * Features : Dashboard
     */
    public function getRevaluationExamRegistrationCount($request)
    {
        $request = $this->realEscapeObject($request);
        try {
            $sql = "SELECT  
                        eer.id,
                        eer.name, 
                        MIN(erbg.startDate) AS startDate,  
                        MAX(erbg.endDate) AS endDate,  
                        eer.properties
                    FROM
                        ec_exam_registration eer 
                    INNER JOIN exam_revaluation_batch_groups erbg ON 
                        erbg.ec_exam_revaluation_id = eer.id 
                    WHERE
                        `type` = '$request->examType' AND trashed IS NULL GROUP BY eer.id";
            $examRegistrationList =  $this->executeQueryForList($sql);
            $examRegistrationDetails =  new \stdClass;
            $examRegistrationDetails->totalCount =  count($examRegistrationList);
            $today = date("Y-m-d H:i");
            foreach ($examRegistrationList as $examRegistrationDetail ){
                if((strtotime($today) <= strtotime($examRegistrationDetail->endDate)) && (strtotime($today) >= strtotime($examRegistrationDetail->startDate))){
                    $examRegistrationDetails->onGoingCount++;
                }
            }
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $examRegistrationDetails;
    }
       /**
     * Get Revaluation Blank Report
     * @param $searchRequest 
     * @return $programResult 
     */
    public function getRevaluationBlankReport($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        $request = new \stdClass;
        $request->revaluationId = $searchRequest->revaluationId;
        $request->academicPaperSubjectId = $searchRequest->academicPaperSubjectId;
        $additionalInfo = new \stdClass;
        $subjects = [];
        $resultData = new \stdClass;
        $templateName = "revaluation-blank-report-template-1";
        if(empty($request->revaluationId)){
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Invailed Request");
        }
        $revaluatedStudents =  $this->getRevaluatedStudentDetails($request);
        if(empty($revaluatedStudents)){
            throw new ExamControllerException(ExamControllerException::NO_REPORTS_DETAILS_FOUND,"No students found.");
        }
        foreach($revaluatedStudents as $student){
            $subjects[$student->subjectId]->id = $student->subjectId;
            $subjects[$student->subjectId]->subjectCode = $student->subjectCode;
            $subjects[$student->subjectId]->subjectName = $student->subjectName;
            $student->mark1 = $student->externalMark ? round($student->externalMark) :"";
            $student->mark2 = $student->mark2 ? round($student->mark2) :"";
            $student->mark3 = $student->mark3 ? round($student->mark3) :"";
            if($student->mark1 && $student->mark2 && $student->mark3){
                $student->nearestMarks = $this->getNearestMarks($student);
                if($student->nearestMarks){
                    if(in_array($student->mark1,$student->nearestMarks)){
                        $student->considerMark1 = true;
                    }
                    if(in_array($student->mark2,$student->nearestMarks)){
                        $student->considerMark2 = true;
                    }
                    if(in_array($student->mark3,$student->nearestMarks)){
                        $student->considerMark3 = true;
                    }
                }
            }
            $subjects[$student->subjectId]->students[] = $student;
        }
        $requestForExamRegistration = new SearchExamRegistrationRequest;
        $requestForExamRegistration->id = $request->revaluationId;
        $additionalInfo->examRegistration = reset(ExamRegistrationService::getInstance()->searchExamRegistration($requestForExamRegistration));
        $additionalInfo->collegeData = CommonExamService::getInstance()->getCollegeDetails();
        
        
       
        $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/revaluationReport/$templateName.twig"), [ 'subjects'=>$subjects,'additionalInfo'=>$additionalInfo]);
        $prtContent = NULL;
            $prtContent .= '<html><head>';
            $prtContent .= "<style>
                </style>";
            $prtContent .= '</head><title>Moderation 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;
    }
    function getNearestMarks($student){
        $arr = [$student->mark1, $student->mark2, $student->mark3];
        $keys = array_keys($arr);
        $nearest = max($arr) - min($arr) + 1;
        $result = [];
        for ($key = 0, $length = count($arr); $key < $length; $key++) {
            for ($innerKey = $key + 1; $innerKey < $length; $innerKey++) {
                if (($diff = abs($arr[$keys[$key]] - $arr[$keys[$innerKey]])) < $nearest) {
                    $result = [$arr[$keys[$key]], $arr[$keys[$innerKey]]];
                    $nearest = $diff;
                }
            }
        }
        return $result;
    }
      /**
     * Get Revaluation Report
     * @param $searchRequest 
     * @return $programResult 
     */
    public function getRevaluationReportWithNoImprovementStudent($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        $request = new \stdClass;
        $request->examRevaluationId = $searchRequest->revaluationId;
        $request->academicPaperSubjectIds = $searchRequest->academicPaperSubjectId;
        $request->groupId = $searchRequest->groupId;
        $request->isShowStudentWithNoImprovement = $searchRequest->isShowStudentWithNoImprovement == 'true' ? true : false;
        
        $resultData = new \stdClass;
        $templateName = "revaluation-report-template-2";
        if(empty($request->examRevaluationId)){
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Invailed Request");
        }
        $requestForExamRegistration = new SearchExamRegistrationRequest;
        $requestForExamRegistration->id = $request->examRevaluationId;
        $examRegistration = reset(ExamRegistrationService::getInstance()->searchExamRegistration($requestForExamRegistration));
        $request->currentRevaluationType = reset($examRegistration->properties->revaluationFeeTypeIds);
        $studentSubjects = [];
        $students =  $this->getAllStudentsMarksForRevaluation($request);
        if(empty($students)){
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"No Students.");
        }
        if(!empty($examRegistration->properties->parentRevaluationRegistrationIds)){
            $parentRequest = new \stdClass;
            $requestForParentExamRegistration = new SearchExamRegistrationRequest;
            $requestForParentExamRegistration->id = reset($examRegistration->properties->parentRevaluationRegistrationIds);
            $parentExamRegistration = reset(ExamRegistrationService::getInstance()->searchExamRegistration($requestForParentExamRegistration));
            $parentRequest->currentRevaluationType = reset($parentExamRegistration->properties->revaluationFeeTypeIds);
            $parentRequest->examRevaluationId = $parentExamRegistration->id;
            $parentRequest->academicPaperSubjectIds = $searchRequest->academicPaperSubjectId;
            $parentRequest->groupId = $searchRequest->groupId;
            $parentRevaluatedStudents =  $this->getAllStudentsMarksForRevaluation($parentRequest);
        }
        foreach($students as $student){
            $studentSubjects[$student->subjectId]->id = $student->subjectId;
            $studentSubjects[$student->subjectId]->name = $student->subjectName;
            $studentSubjects[$student->subjectId]->code = $student->subjectCode;
            $studentSubjects[$student->subjectId]->students[$student->id]->id = $student->id;
            $studentSubjects[$student->subjectId]->students[$student->id]->name = $student->studentName;
            $studentSubjects[$student->subjectId]->students[$student->id]->regNo = $student->regNo;
            $studentSubjects[$student->subjectId]->students[$student->id]->falseNo = $student->falseNo;
            $studentSubjects[$student->subjectId]->students[$student->id]->groupName = $student->groupName;
            $studentSubjects[$student->subjectId]->students[$student->id]->internalMark = $student->internalMark;
            if(empty($examRegistration->properties->parentRevaluationRegistrationIds)){
                $studentSubjects[$student->subjectId]->students[$student->id]->oldMark = $student->parentExamMark + 0;
            }
            else{
                foreach($parentRevaluatedStudents as $parentRevaluatedStudent){
                    if($parentRevaluatedStudent->subjectId == $student->subjectId && $student->id == $parentRevaluatedStudent->id){
                        $studentSubjects[$student->subjectId]->students[$student->id]->oldMark = $parentRevaluatedStudent->parentExamMark > $parentRevaluatedStudent->revaluationMark ? $parentRevaluatedStudent->parentExamMark :  $parentRevaluatedStudent->revaluationMark;
                    }
                }
            }
            $studentSubjects[$student->subjectId]->students[$student->id]->isThirdValMark = $student->thirdValReq =='1' ? true : false;
            $studentSubjects[$student->subjectId]->students[$student->id]->finalizedMark = $studentSubjects[$student->subjectId]->students[$student->id]->oldMark >= $student->revaluationMark + 0 ? null : $student->revaluationMark + 0;
            $studentSubjects[$student->subjectId]->students[$student->id]->totalMark = $studentSubjects[$student->subjectId]->students[$student->id]->finalizedMark ?  $student->internalMark + $studentSubjects[$student->subjectId]->students[$student->id]->finalizedMark : $studentSubjects[$student->subjectId]->students[$student->id]->oldMark + $student->internalMark;
            $studentSubjects[$student->subjectId]->students[$student->id]->isActiveStudent = true;
            if(($studentSubjects[$student->subjectId]->students[$student->id]->finalizedMark > $studentSubjects[$student->subjectId]->students[$student->id]->oldMark)){
                $studentSubjects[$student->subjectId]->students[$student->id]->isActiveStudent = false;
            }
            if($studentSubjects[$student->subjectId]->students[$student->id]->isActiveStudent && !$request->isShowStudentWithNoImprovement){
                $studentSubjects[$student->subjectId]->students[$student->id]->isThirdValMark = false;
            }
            if($request->isShowStudentWithNoImprovement){
                $studentSubjects[$student->subjectId]->students[$student->id]->finalizedMark = $student->revaluationMark + 0;
            }
            $searchRequestForGradeScheme = new \stdClass();
            $searchRequestForGradeScheme->groupId = $student->groupId;
            $searchRequestForGradeScheme->academicTermId = $student->academicTermId;
            $searchRequestForGradeScheme->academicPaperSubjectId = $student->academicPaperSubjectId;
            $subjectGradeSchemeArray = GradeSchemeService::getInstance()->getAllSubjectGradeSchemesByRequest($searchRequestForGradeScheme);
            $subjectGradeKey = array_search($student->academicPaperSubjectId, array_column( $subjectGradeSchemeArray, "id"));
            $gradeDetails = [];
            if($subjectGradeKey || $subjectGradeKey === 0){
                $gradeDetails = $subjectGradeSchemeArray[$subjectGradeKey]->grades;
            }
            $maxGradePercent =  max(array_column($gradeDetails,"rangeTo"));
            $schemeType = "PERCENTAGE";
            $passCriteriaArray[$student->academicTermId] = GradeSchemeService::getInstance()->getSubjectPassCriteriaByAcademicPaperSubject($student->academicTermId, $schemeType);
            $checkPassPercentCriteria = new \stdClass();
            $checkPassPercentCriteria->courseTypeMethod = $student->courseTypeMethod;
            $checkPassPercentCriteria->schemeType = $subjectGradeSchemeArray[$subjectGradeKey]->schemeType ? $subjectGradeSchemeArray[$subjectGradeKey]->schemeType : "PERCENTAGE";
            $checkPassPercentCriteria->isInternal = $student->isInternal;
            $checkPassPercentCriteria->internalMaxMark = $student->internalMaxMark;
            $checkPassPercentCriteria->isExternal = $student->isExternal;
            $checkPassPercentCriteria->externalMaxMark = $student->externalMaxMark;
            $checkPassPercentCriteria->internalMark = round($student->internalMark, 2 );
            $checkPassPercentCriteria->passPercentConfig = $passCriteriaArray[$student->academicTermId];
            $checkPassPercentCriteria->externalMark = round ( $studentSubjects[$student->subjectId]->students[$student->id]->oldMark, 2 );
            $checkPassPercentCriteria->maxGradePercent = $maxGradePercent;
            $checkPassPercentCriteria->gradeDetails = $gradeDetails;
            $subjectPassCriteriaOld = CommonExamService::getInstance()->checkIsFailedByPassPercentCreditCriteria ( $checkPassPercentCriteria );
            $studentSubjects[$student->subjectId]->students[$student->id]->oldGrade = $subjectPassCriteriaOld->grade->letterGrade;
            if($studentSubjects[$student->subjectId]->students[$student->id]->finalizedMark && !$request->isShowStudentWithNoImprovement){
                $checkPassPercentCriteria = new \stdClass();
                $checkPassPercentCriteria->courseTypeMethod = $student->courseTypeMethod;
                $checkPassPercentCriteria->schemeType = $subjectGradeSchemeArray[$subjectGradeKey]->schemeType ? $subjectGradeSchemeArray[$subjectGradeKey]->schemeType : "PERCENTAGE";
                $checkPassPercentCriteria->isInternal = $student->isInternal;
                $checkPassPercentCriteria->internalMaxMark = $student->internalMaxMark;
                $checkPassPercentCriteria->isExternal = $student->isExternal;
                $checkPassPercentCriteria->externalMaxMark = $student->externalMaxMark;
                $checkPassPercentCriteria->internalMark = round($student->internalMark, 2 );
                $checkPassPercentCriteria->passPercentConfig = $passCriteriaArray[$student->academicTermId];
                $checkPassPercentCriteria->externalMark = round ($studentSubjects[$student->subjectId]->students[$student->id]->finalizedMark, 2 );
                $checkPassPercentCriteria->maxGradePercent = $maxGradePercent;
                $checkPassPercentCriteria->gradeDetails = $gradeDetails;
                $subjectPassCriteriaNew = CommonExamService::getInstance()->checkIsFailedByPassPercentCreditCriteria ( $checkPassPercentCriteria );
                $studentSubjects[$student->subjectId]->students[$student->id]->newGrade = $subjectPassCriteriaNew->grade->letterGrade;
            }
            else if($request->isShowStudentWithNoImprovement){
                $studentSubjects[$student->subjectId]->students[$student->id]->newGrade =  $subjectPassCriteriaOld->grade->letterGrade;
            }
        }
        if($request->isShowStudentWithNoImprovement){
            foreach($studentSubjects as $key => $subject){
                $subject->students = (array_filter($subject->students ,function($value){
                    return $value->isActiveStudent == true;
                }));
                if(empty($subject->students)){
                    unset($studentSubjects[$key]);
                }
            }
        }
        // $resultData =  $this->processRevaluationReportWithNoImprovementStudent($students,$request);
        $collegeData = CommonExamService::getInstance()->getCollegeDetails();
        $settings = new \stdClass;
        
        if(empty($studentSubjects)){
            throw new ExamControllerException(ExamControllerException::NO_REPORTS_DETAILS_FOUND,"No details found.");
        }
        $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/revaluationReport/$templateName.twig"), [ 'studentsDetails'=>$studentSubjects,'college'=>$collegeData,'examRegistration'=>$examRegistration,'settings'=>$settings]);
        $prtContent = NULL;
            $prtContent .= '<html><head>';
            $prtContent .= "<style>
                </style>";
            $prtContent .= '</head><title>Moderation Report</title><body>';
            $prtContent .= $responseHtml;
            $prtContent .= '</body></html>';
            $totalWidth = 297;
            $totalHeight = 210;
            $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;
    }
     /**
     * get AllStudent By ExamRegistrationSubject For Digital Valuation
     * @param request $request
     */
    public function getAllStudentsMarksForRevaluation($request){
        $request = $this->realEscapeObject($request);
        try {
            $joinQuery = null;
            $orderBy = null;
            $whereQuery = null;
            if(!empty($request->currentRevaluationType)) {
                $whereQuery .= " AND esar.identifying_context->>'$.revaluationType' IN ( '$request->currentRevaluationType' )";
            }
            if(!empty($request->academicPaperSubjectIds)) {
                $academicPaperSubjectIdsString = is_array($request->academicPaperSubjectIds) ? "'" . implode("','",$request->academicPaperSubjectIds) . "'" : "'".$request->academicPaperSubjectIds."'";
                $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ( $academicPaperSubjectIdsString )";
            }
            if(!empty($request->examRevaluationId)) {
                $examRevaluationIdString = is_array($request->examRevaluationId) ? "'" . implode("','",$request->examRevaluationId) . "'" : "'".$request->examRevaluationId."'";
                $whereQuery .= " AND eer.id IN ( $examRevaluationIdString )";
            }
            if(!empty($request->groupId)) {
                $groupIdString = is_array($request->groupId) ? "'" . implode("','",$request->groupId) . "'" : "'".$request->groupId."'";
                $whereQuery .= " AND g.id IN ( $groupIdString )";
            }
            
            $query = "SELECT
                    DISTINCT sa.studentID as id,
                    sa.studentID ,
                    sa.studentName,
                    spa.properties->>'$.registerNumber' AS regNo,
                    oe.id as onlineExamId,
                    s.id as subjectId,
                    s.name as subjectName,
                    s.code as subjectCode,
                    g.name as groupName,
                    g.id as groupId,
                    act.id as academicTermId,
                    ct.course_Type AS courseTypeMethod, 
                    esar.am_assessment_id as assessmentId,
                    eers.cm_academic_paper_subjects_id as academicPaperSubjectId,
                    esarParent.properties ->> '$.falseNo' as falseNo,
                    esarParent.properties ->> '$.alphaNumericCode' as alphaNumericCode,
                    esar.valuation_details as valuationDetails,
                    erm.id  AS finalizedValuationId,
                    erm.mark_obtained  AS revaluationMark,
                    ostmf.attendance_status AS isAbsent,
                    ostmf.mark_obtained AS oldRevaluationMark,
                    ostmf.properties AS finalizedMarkProperties,
                    esmdsubcon.mark_details ->>'$.externalMark' AS firstValuationMark,
                    esmdsubcon.mark_details ->>'$.internalMark' AS internalMark,
                    esmdsubcon.mark_details ->>'$.isExternal' AS isExternal,
                    esmdsubcon.mark_details ->>'$.isInternal' AS isInternal,
                    esmdsubcon.mark_details ->>'$.externalMaxMark' AS externalMaxMark,
                    esmdsubcon.mark_details ->>'$.internalMaxMark' AS internalMaxMark,
                    ostmParent.mark_obtained as parentExamMark,
                    erm2.mark_obtained as secondValuationMark,
                    erm3.mark_obtained as thirdValuationMark,
                    erm2.properties ->> '$.hasEligibleThirdValuation' as thirdValReq
                FROM
                    ec_student_assessment_registration esar
                INNER JOIN studentaccount sa ON
                    sa.studentID = esar.student_id
                INNER JOIN am_assessment aa ON
                    aa.id = esar.am_assessment_id
                INNER JOIN oe_exams oe ON
                    oe.identifying_context ->> '$.assessmentId' = aa.id AND oe.is_deleted = 0
                INNER JOIN ec_exam_registration_subject eers ON
                    eers.am_assessment_id = aa.id
                INNER JOIN ec_exam_registration_batch eerb ON
                    eerb.id = eers.ec_exam_registration_batch_id
                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 `groups` g ON 
                    g.id = eerb.groups_id
                INNER JOIN program p ON 
                    p.id = g.properties->>'$.programId'
                INNER JOIN `course_type` ct ON
                    ct.courseTypeID = p.course_type_id
                INNER JOIN student_program_account spa ON 
                    spa.student_id  = esar.student_id  AND
                    spa.current_program_id = p.id 
                INNER JOIN cm_academic_paper_subjects caps ON
                    caps.id = eers.cm_academic_paper_subjects_id
                INNER JOIN v4_ams_subject s ON
                    s.id = caps.ams_subject_id
                INNER JOIN  academic_term act ON 
                    act.id = CAST(eerb.properties ->> '$.academicTermId'AS CHAR)
                LEFT JOIN ec_student_assessment_registration esarParent ON
                    esar.student_id = esarParent.student_id AND 
                    esar.am_assessment_id = esarParent.am_assessment_id AND
                    eerp.type = esarParent.ec_exam_registration_type
                LEFT JOIN ec_revaluation_mark erm ON 
                    erm.student_id = sa.studentID AND erm.am_assessment_id = esar.am_assessment_id AND erm.revaluation_type = CAST(esar.identifying_context->>'$.revaluationType'AS CHAR) AND erm.valuation_count = 'FINALIZED'
                LEFT JOIN oe_student_total_mark ostmf ON 
                    ostmf.student_id = sa.studentID AND ostmf.am_assessment_id = esar.am_assessment_id AND ostmf.valuation_count = 'FINALIZED' AND (ostmf.valuation_type  = 'REVALUATION') 
                LEFT JOIN oe_student_total_mark ostmParent ON 
                    ostmParent.student_id = sa.studentID AND ostmParent.am_assessment_id = esar.am_assessment_id AND ostmParent.valuation_count = 'FINALIZED' AND (ostmParent.valuation_type = '' OR ostmParent.valuation_type  IS NULL) 
                LEFT JOIN ec_revaluation_mark erm3 ON 
                    erm3.student_id = sa.studentID AND erm3.am_assessment_id = esar.am_assessment_id AND erm3.revaluation_type = CAST(esar.identifying_context->>'$.revaluationType'AS CHAR) AND erm3.valuation_count = '3'
                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_revaluation_mark erm2 ON 
                    erm2.student_id = sa.studentID AND erm2.am_assessment_id = esar.am_assessment_id AND erm2.revaluation_type = CAST(esar.identifying_context->>'$.revaluationType'AS CHAR) AND erm2.valuation_count = '2'
                $joinQuery
                WHERE
                    esar.ec_exam_registration_type = eer.type AND
                    CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND 
                    CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID'
                    $whereQuery ";
                
                
            $studentsMarkDetails = $this->executeQueryForList($query);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $studentsMarkDetails;
    }
    /**
     * Get Revaluation Report (Digital Valuation)
     * @param $searchRequest 
     * @return $programResult 
     */
    public function getRevaluationDigitalValuationReport($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        $request = new \stdClass;
        $request->examRevaluationId = $searchRequest->revaluationId;
        $request->isShowMark = $searchRequest->isShowMark == 'true' ? true : false;
        
        $templateName = "revaluation-digital-valuation-report-template";
        if(empty($request->examRevaluationId)){
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Invailed Request");
        }
        $requestForExamRegistration = new SearchExamRegistrationRequest;
        $requestForExamRegistration->id = $request->examRevaluationId;
        $examRegistration = reset(ExamRegistrationService::getInstance()->searchExamRegistration($requestForExamRegistration));
        $request->currentRevaluationType = reset($examRegistration->properties->revaluationFeeTypeIds);
        $request->examRegistrationId = $searchRequest->revaluationId;
        $students = ExamValuationService::getInstance()->getAllStudentByRevaluationRegistrationSubjectForDigitalValuation($request);
        if(empty($students)){
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"No Students.");
        }
        $getAllFacultiesRequest = new GetAllFacultiesRequest;
        $staffs = StaffService::getInstance()->getAllFacultiesForApi($getAllFacultiesRequest);
        $staffsArray = [];
        foreach($staffs as $staff){
            $staffsArray[$staff->id] = $staff;
        }
        usort($students, function($a, $b) {
            return $a->regNo <=> $b->regNo;
        });
        foreach($students as $student){
            $student->valuationDetails = json_decode($student->valuationDetails);
            if(!empty($student->valuationDetails->assignedValuationStaffs)){
                foreach($student->valuationDetails->assignedValuationStaffs as $valuationStaff){
                    if($valuationStaff->count == '1'){
                        $student->firstValuationStaffs = $valuationStaff->addiitonalExamniners;
                    }
                    if($valuationStaff->count == '2'){
                        $student->secondValuationStaffs = $valuationStaff->addiitonalExamniners;
                    }
                }
                if(!empty( $student->firstValuationStaffs )){
                    $student->firstValuationStaffDetails = array_map(function($staff) use ($staffsArray){
                        return $staffsArray[$staff];
                    },$student->firstValuationStaffs);
                    $student->firstValuationStaffNames = implode("," ,array_column($student->firstValuationStaffDetails,"name"));
                    $student->valuatedStaffs[] = "Valuation 1 : ".$student->firstValuationStaffNames;
                }
                if(!empty( $student->secondValuationStaffs )){
                    $student->secondValuationStaffDetails = array_map(function($staff) use ($staffsArray){
                        return $staffsArray[$staff];
                    },$student->secondValuationStaffs);
                    $student->secondValuationStaffNames = implode("," ,array_column($student->secondValuationStaffDetails,"name"));
                    $student->valuatedStaffs[] = "Valuation 2 : ".$student->secondValuationStaffNames;
                }
            }
        }
        $settings = new \stdClass;
        $settings->isShowMark = $request->isShowMark;
        $settings->previousMarkHead =  $examRegistration->parentExamRegistrationType == 'REGULAR' ? 'Regular' : 'Supply';
        $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/revaluationReport/$templateName.twig"), [ 'students'=>$students,'examRegistration'=>$examRegistration,'settings'=>$settings]);
        $prtContent = NULL;
            $prtContent .= '<html><head>';
            $prtContent .= "<style>
                </style>";
            $prtContent .= '</head><title>Moderation Report</title><body>';
            $prtContent .= $responseHtml;
            $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->dispalyHtmlData = $responseHtml;
        $programResult->printData = PdfUtil::renderPdf($prtContent, $options);
        return  $programResult;
    }
    
}