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 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 639
UniversityExamService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 9
1892.00
0.00% covered (danger)
0.00%
0 / 639
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 __clone
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 getInstance
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 5
 getGradePointsOfStudentsForAnExam
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 131
 getUniversityExamListByBatchSemesterAndSubjectIds
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 getStudentEndSemesterExamMarks
0.00% covered (danger)
0.00%
0 / 1
182.00
0.00% covered (danger)
0.00%
0 / 332
 getUniversityExamMarksForConsolidatedMarkReport
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 46
 getMarksOfStudentsForAnExam
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 96
 updateGradeOfStudentBasedonUniversityMark
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
<?php
namespace com\linways\core\ams\professional\service;
use com\linways\core\ams\professional\service\ExamService;
use com\linways\core\ams\professional\dto\SettingsConstents;
use com\linways\core\ams\professional\service\CommonService;
use com\linways\core\ams\professional\constant\nba\NbaMethod;
use com\linways\core\ams\professional\service\CourseTypeService;
use com\linways\core\ams\professional\constant\SettingsConstants;
use com\linways\core\ams\professional\exception\ProfessionalException;
use com\linways\core\ams\professional\request\GetMarksStudentExamRequest;
use com\linways\core\ams\professional\request\GetGradePointOfStudentExamRequest;
use com\linways\core\ams\professional\constant\nba\UniversityStudentMarkCalculationMethod;
class UniversityExamService extends BaseService
{
    // /Condition 1 - Presence of a static member variable
    private static $_instance = null;
    
    // /Condition 2 - Locked down the constructor
    private function __construct()
    {
        // $this->mapper = UniversityExamServiceMapper::getInstance()->getMapper();
    }
    // Prevent any oustide instantiation of this class
    
    // /Condition 3 - Prevent any object or instance of that class to be cloned
    private function __clone()
    {
    }
    // Prevent any copy of this object
    
    // /Condition 4 - Have a single globally accessible static method
    public static function getInstance()
    {
        if (!is_object(self::$_instance)) // or if( is_null(self::$_instance) ) or if( self::$_instance == null )
        self::$_instance = new self();
        return self::$_instance;
    }
    /**
     * It gets all grade points of all the students who wrote an exam.
     *
     * @param [type] $examId
     * @return void
     */
    public function getGradePointsOfStudentsForAnExam(GetGradePointOfStudentExamRequest $request)
    {
        $request->examId = $this->realEscapeString($request->examId);
        $request->batchId = $this->realEscapeString($request->batchId);
        $request->semId = $this->realEscapeString($request->semId);
        $request->subjectId = $this->realEscapeString($request->subjectId);
        $request->studentId = $this->realEscapeString($request->studentId);
        $responseList = [];
        $sql = "";
        $conditionStatement = "";
        $grpStatement = " GROUP BY sta.studentID";
        $joins = "";
        if(!empty($request->studentId))
        {
            $conditionStatement .=  " AND us.studentID='$request->studentId'";
        }
        //-----------------Start Mark calculation method-----------------
        $markCalculationMethod = null;
        $markCalculationMethod = CommonService::getInstance()->getSettings(SettingsConstents::NBA, SettingsConstents::UNIVERSITY_EXAM_MARK_CALCULATION_METHOD);
        if(empty($markCalculationMethod)){
            $markCalculationMethod = UniversityStudentMarkCalculationMethod::AVERAGE;
        }
        if($markCalculationMethod == UniversityStudentMarkCalculationMethod::MINIMUM){
            $universityMarkSelectionStatement = "ug.percentFrom as averagePercent";
        }elseif($markCalculationMethod == UniversityStudentMarkCalculationMethod::MAXIMUM){
            $universityMarkSelectionStatement = "ug.percentTo as averagePercent";
        }
        elseif($markCalculationMethod == UniversityStudentMarkCalculationMethod::GRADEPOINT_PRODUCT_DIFFERENCE_BY_CONST){
            $universityMarkSelectionStatement = "((ug.gradePoint * MAX(ug1.gradePoint))- 3.75) as averagePercent";
            $joins .= "LEFT JOIN university_assignbatchcourse uabc ON uabc.batchID = ue.batchID LEFT JOIN university_gradepoints ug1 ON ug1.typeID = uabc.typeID ";
        }
        else{
            $universityMarkSelectionStatement = "(ug.percentFrom + ug.percentTo)/2 as averagePercent";
        }
        //-----------------End Mark calculation method-----------------
        $subbatches = BatchService::getInstance()->getSubbatchBySubject($request->subjectId, $request->semId, $request->batchId);
        $isCurrentSem = SemesterService::getInstance()->isCurrentSemester($request->batchId, $request->semId);
        if(!empty($subbatches))
        {
            if($isCurrentSem)
            {
                $sql = "SELECT sta.studentID AS studentId,
                    sta.studentName,
                    sta.admissionNo,
                    ue.examID AS examId,
                    ug.percentFrom,
                    ug.percentTo,
                    $universityMarkSelectionStatement,
                    ug.gradePoint,
                    ue.subjectID AS subjectId,
                    ue.batchID AS batchId,
                    ue.semID AS semId FROM sbs_relation sr inner join subbatch_sbs ssbs on sr.sbsID = ssbs.sbsID inner join subbatch_student ss on ss.subbatchID = ssbs.subbatchID inner join universityExams ue on ue.subjectID = sr.subjectID and ue.batchID = sr.batchID and sr.semID = ue.semID inner join studentaccount sta on sta.studentID = ss.studentID and sta.batchID = ue.batchID inner join  university_studentgrade us on us.studentID = sta.studentID and us.examID = ue.examID and us.semID = ue.semID INNER JOIN university_gradepoints ug ON ug.gradeID = us.gradeObtained $joins 
                    WHERE ue.examID = $request->examId $conditionStatement $grpStatement";
            }
            else 
            {
                $sql = "SELECT sta.studentID AS studentId,
                    sta.studentName,
                    sta.admissionNo,
                    ue.examID AS examId,
                    ug.percentFrom,
                    ug.percentTo,
                    $universityMarkSelectionStatement,
                    ug.gradePoint,
                    ue.subjectID AS subjectId,
                    ue.batchID AS batchId,
                    ue.semID AS semId FROM sbs_relation sr inner join subbatch_sbs ssbs on sr.sbsID = ssbs.sbsID inner join subbatch_student ss on ss.subbatchID = ssbs.subbatchID inner join universityExams ue on ue.subjectID = sr.subjectID and ue.batchID = sr.batchID and sr.semID = ue.semID inner join studentaccount sta on sta.studentID = ss.studentID inner join  university_studentgrade us on us.studentID = sta.studentID and us.examID = ue.examID and us.semID = ue.semID INNER JOIN university_gradepoints ug ON ug.gradeID = us.gradeObtained $joins WHERE ue.examID = $request->examId  and sta.studentID in (select studentID from studentaccount where batchID = $request->batchId union select studentID from failed_students where previousBatch = $request->batchId and failedInSemester > $request->semId$conditionStatement $grpStatement;";
            }
        }
        else 
        {
            if($isCurrentSem)
            {
                $sql = "SELECT
                    sta.studentID AS studentId,
                    sta.studentName,
                    sta.admissionNo,
                    ue.examID AS examId,
                    ug.percentFrom,
                    ug.percentTo,
                    $universityMarkSelectionStatement,
                    ug.gradePoint,
                    ue.subjectID AS subjectId,
                    ue.batchID AS batchId,
                    ue.semID AS semId
                FROM
                    universityExams ue
                        INNER JOIN
                    university_studentgrade us ON us.examID = ue.examID
                        AND ue.subjectID = us.subjectID
                        AND ue.semID = us.semID
                        INNER JOIN
                    studentaccount sta ON sta.studentID = us.studentID and sta.batchID = ue.batchID
                        INNER JOIN
                    university_gradepoints ug ON ug.gradeID = us.gradeObtained 
                      $joins 
                WHERE
                    ue.examID = $request->examId $conditionStatement $grpStatement";
            }
            else
            {
                $sql = "SELECT
                    sta.studentID AS studentId,
                    sta.studentName,
                    sta.admissionNo,
                    ue.examID AS examId,
                    ug.percentFrom,
                    ug.percentTo,
                    $universityMarkSelectionStatement,
                    ug.gradePoint,
                    ue.subjectID AS subjectId,
                    ue.batchID AS batchId,
                    ue.semID AS semId
                FROM
                    universityExams ue
                        INNER JOIN
                    university_studentgrade us ON us.examID = ue.examID
                        AND ue.semID = us.semID
                        INNER JOIN
                    studentaccount sta ON sta.studentID = us.studentID
                        INNER JOIN
                    university_gradepoints ug ON ug.gradeID = us.gradeObtained 
                      $joins 
                WHERE
                    ue.examID = $request->examId and sta.studentID in (select studentID from studentaccount where batchID = $request->batchId union select studentID from failed_students where previousBatch = $request->batchId and failedInSemester > $request->semId$conditionStatement $grpStatement";
            }
        }
        
        
        try {
            $responseList = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $responseList;
    }
    public function getUniversityExamListByBatchSemesterAndSubjectIds($batchId, $semId, $subjectId)
    {
        $sql = "";
        $responseList = [];
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        $sql = "SELECT examID as id, examName as name , examTotalMarks as totalMarks, subjectID as subjectId, batchID as batchId, semID as semId FROM universityExams WHERE  batchID = '$batchId' AND semID = '$semId' AND subjectID = '$subjectId";
        try {
            $responseList = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $responseList;
    }
    public function getStudentEndSemesterExamMarks($examId, $batchId, $semId, $subjectId)
    {
        $endSemesterExamMark = CommonService::getInstance()->getSettings(SettingsConstants::NBA, NbaMethod::OBE_END_SEMESTER_MARK_SELECTION);
        $examId = $this->realEscapeString($examId);
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        $subbatches = BatchService::getInstance()->getSubbatchBySubject($subjectId, $semId, $batchId);
        $isCurrentSem = SemesterService::getInstance()->isCurrentSemester($batchId, $semId);
        $courseType = CourseTypeService::getInstance()->getcourseTypeByBatchId($batchId);
        if($endSemesterExamMark==NbaMethod::OBE_END_SEMESTER_MARK_NOT_NORMALIZED){
            if($courseType->course_Type == 'UG'){
                if(!empty($subbatches))
                {
                    if($isCurrentSem)
                    {
                        $sql = "SELECT 
                        im.studentID as studentId,
                        im.batchID as batchId,
                        im.semID as semId,
                        im.subjectID as subjectId,
                        ee.mark as externalMark,
                        im.internalMarks as internalMark,
                        CASE
                            WHEN ee.mark is NULL AND gsm.marks is NULL THEN im.internalMarks
                            WHEN ee.mark is not NULL AND gsm.marks is not NULL THEN ee.mark+im.internalMarks+gsm.marks
                            WHEN ee.mark is NULL AND gsm.marks is not NULL THEN im.internalMarks+gsm.marks
                            WHEN ee.mark is not NULL AND gsm.marks is NULL THEN ee.mark+im.internalMarks
                        END AS totalMark
                    
                    FROM
                    sbs_relation sr inner join subbatch_sbs ssbs on sr.sbsID = ssbs.sbsID inner join subbatch_student ss on ss.subbatchID = ssbs.subbatchID  inner join studentaccount sta on sta.studentID = ss.studentID inner join
                        internal_marks im ON im.studentID = sta.studentID
                         left join 
                        exammarks_external ee ON (ee.studentID=im.studentID AND ee.examID = '$examId')
                        left join gracemarks_student_marks gsm ON gsm.examID = ee.examID and gsm.studentID = sta.studentID and gsm.semID = im.semID
                    WHERE
                    im.semID = '$semId' AND im.batchID = '$batchId'
                            AND im.subjectID = '$subjectId'
                            ";
                    }
                    else 
                    {
                        $sql = "SELECT 
                        im.studentID as studentId,
                        im.batchID as batchId,
                        im.semID as semId,
                        im.subjectID as subjectId,
                        ee.mark as externalMark,
                        im.internalMarks as internalMark,
                        CASE
                            WHEN ee.mark is NULL AND gsm.marks is NULL THEN im.internalMarks
                            WHEN ee.mark is not NULL AND gsm.marks is not NULL THEN ee.mark+im.internalMarks+gsm.marks
                            WHEN ee.mark is NULL AND gsm.marks is not NULL THEN im.internalMarks+gsm.marks
                            WHEN ee.mark is not NULL AND gsm.marks is NULL THEN ee.mark+im.internalMarks
                        END AS totalMark
                    
                    FROM
                    sbs_relation sr inner join subbatch_sbs ssbs on sr.sbsID = ssbs.sbsID inner join subbatch_student ss on ss.subbatchID = ssbs.subbatchID  inner join studentaccount sta on sta.studentID = ss.studentID inner join
                        internal_marks im ON im.studentID = sta.studentID
                         left join 
                        exammarks_external ee ON (ee.studentID=im.studentID AND ee.examID = '$examId')
                        left join gracemarks_student_marks gsm ON gsm.examID = ee.examID and gsm.studentID = sta.studentID and gsm.semID = im.semID
                    WHERE
                    im.semID = '$semId' AND im.batchID = '$batchId'
                            AND im.subjectID = '$subjectId'
                             AND sta.studentID IN (SELECT 
                            studentID
                        FROM
                            studentaccount
                        WHERE
                            batchID = '$batchId' UNION SELECT 
                            studentID
                        FROM
                            failed_students
                        WHERE
                            previousBatch = '$batchId'
                                AND failedInSemester > '$semId')";
                    }
                }
                else 
                {
                    if($isCurrentSem)
                    {
                        $sql = "SELECT 
                        im.studentID as studentId,
                        im.batchID as batchId,
                        im.semID as semId,
                        im.subjectID as subjectId,
                        ee.mark as externalMark,
                        im.internalMarks as internalMark,
                        CASE
                            WHEN ee.mark is NULL AND gsm.marks is NULL THEN im.internalMarks
                            WHEN ee.mark is not NULL AND gsm.marks is not NULL THEN ee.mark+im.internalMarks+gsm.marks
                            WHEN ee.mark is NULL AND gsm.marks is not NULL THEN im.internalMarks+gsm.marks
                            WHEN ee.mark is not NULL AND gsm.marks is NULL THEN ee.mark+im.internalMarks
                        END AS totalMark
                    
                    FROM
                        studentaccount sta
                         inner join     
                        internal_marks im ON sta.studentID=im.studentID
                         left join 
                        exammarks_external ee ON (ee.studentID=im.studentID AND ee.examID = '$examId')
                        left join gracemarks_student_marks gsm ON gsm.examID = ee.examID and gsm.studentID = sta.studentID and gsm.semID = im.semID
                    WHERE
                    im.semID = '$semId' AND im.batchID = '$batchId'
                            AND im.subjectID = '$subjectId'
                            ";
                    }
                    else
                    {
                        $sql = "SELECT 
                        im.studentID as studentId,
                        im.batchID as batchId,
                        im.semID as semId,
                        im.subjectID as subjectId,
                        ee.mark as externalMark,
                        im.internalMarks as internalMark,
                        CASE
                            WHEN ee.mark is NULL AND gsm.marks is NULL THEN im.internalMarks
                            WHEN ee.mark is not NULL AND gsm.marks is not NULL THEN ee.mark+im.internalMarks+gsm.marks
                            WHEN ee.mark is NULL AND gsm.marks is not NULL THEN im.internalMarks+gsm.marks
                            WHEN ee.mark is not NULL AND gsm.marks is NULL THEN ee.mark+im.internalMarks
                        END AS totalMark
                    
                    FROM
                        studentaccount sta
                         inner join     
                        internal_marks im ON sta.studentID=im.studentID
                         left join 
                        exammarks_external ee ON (ee.studentID=im.studentID AND ee.examID = '$examId')
                        left join gracemarks_student_marks gsm ON gsm.examID = ee.examID and gsm.studentID = sta.studentID and gsm.semID = im.semID
                    WHERE
                        im.semID = '$semId' AND im.batchID = '$batchId'
                            AND im.subjectID = '$subjectId'
                             AND sta.studentID IN (SELECT 
                            studentID
                        FROM
                            studentaccount
                        WHERE
                            batchID = '$batchId' UNION SELECT 
                            studentID
                        FROM
                            failed_students
                        WHERE
                            previousBatch = '$batchId'
                                AND failedInSemester > '$semId')";
                    }
                }
            }elseif($courseType->course_Type = "PG"){
                if(!empty($subbatches))
                {
                    if($isCurrentSem)
                    {
                        $sql = "SELECT 
                        im.studentID as studentId,
                        im.batchID as batchId,
                        im.semID as semId,
                        im.subjectID as subjectId,
                        ee.mark as externalMark,
                        im.internalMarks as internalMark,
                        CASE
                            WHEN ee.mark is NULL AND gsm.marks is NULL THEN im.internalMarks
                            WHEN ee.mark is not NULL AND gsm.marks is not NULL THEN ee.mark+im.internalMarks+gsm.marks
                            WHEN ee.mark is NULL AND gsm.marks is not NULL THEN im.internalMarks+gsm.marks
                            WHEN ee.mark is not NULL AND gsm.marks is NULL THEN ee.mark+im.internalMarks
                        END AS totalMark
                    
                    FROM
                    sbs_relation sr inner join subbatch_sbs ssbs on sr.sbsID = ssbs.sbsID inner join subbatch_student ss on ss.subbatchID = ssbs.subbatchID  inner join studentaccount sta on sta.studentID = ss.studentID inner join
                        internal_marks im ON im.studentID = sta.studentID
                        left join 
                        externalexammarks_finalized ee ON (ee.studentID=im.studentID AND ee.examID = '$examId')
                        left join gracemarks_student_marks gsm ON gsm.examID = ee.examID and gsm.studentID = sta.studentID and gsm.semID = im.semID
                    WHERE
                    im.semID = '$semId' AND im.batchID = '$batchId'
                            AND im.subjectID = '$subjectId'
                           ";
                    }
                    else 
                    {
                        $sql = "SELECT 
                        im.studentID as studentId,
                        im.batchID as batchId,
                        im.semID as semId,
                        im.subjectID as subjectId,
                        ee.mark as externalMark,
                        im.internalMarks as internalMark,
                        CASE
                            WHEN ee.mark is NULL AND gsm.marks is NULL THEN im.internalMarks
                            WHEN ee.mark is not NULL AND gsm.marks is not NULL THEN ee.mark+im.internalMarks+gsm.marks
                            WHEN ee.mark is NULL AND gsm.marks is not NULL THEN im.internalMarks+gsm.marks
                            WHEN ee.mark is not NULL AND gsm.marks is NULL THEN ee.mark+im.internalMarks
                        END AS totalMark
                    
                    FROM
                    sbs_relation sr inner join subbatch_sbs ssbs on sr.sbsID = ssbs.sbsID inner join subbatch_student ss on ss.subbatchID = ssbs.subbatchID  inner join studentaccount sta on sta.studentID = ss.studentID inner join
                        internal_marks im ON im.studentID = sta.studentID
                        left join 
                        externalexammarks_finalized ee ON (ee.studentID=im.studentID AND ee.examID = '$examId')
                        left join gracemarks_student_marks gsm ON gsm.examID = ee.examID and gsm.studentID = sta.studentID and gsm.semID = im.semID
                    WHERE
                    im.semID = '$semId' AND im.batchID = '$batchId'
                            AND im.subjectID = '$subjectId'
                             AND sta.studentID IN (SELECT 
                            studentID
                        FROM
                            studentaccount
                        WHERE
                            batchID = '$batchId' UNION SELECT 
                            studentID
                        FROM
                            failed_students
                        WHERE
                            previousBatch = '$batchId'
                                AND failedInSemester > '$semId')";
                    }
                }
                else 
                {
                    if($isCurrentSem)
                    {
                        $sql = "SELECT 
                        im.studentID as studentId,
                        im.batchID as batchId,
                        im.semID as semId,
                        im.subjectID as subjectId,
                        ee.mark as externalMark,
                        im.internalMarks as internalMark,
                        CASE
                            WHEN ee.mark is NULL AND gsm.marks is NULL THEN im.internalMarks
                            WHEN ee.mark is not NULL AND gsm.marks is not NULL THEN ee.mark+im.internalMarks+gsm.marks
                            WHEN ee.mark is NULL AND gsm.marks is not NULL THEN im.internalMarks+gsm.marks
                            WHEN ee.mark is not NULL AND gsm.marks is NULL THEN ee.mark+im.internalMarks
                        END AS totalMark
                    
                    FROM
                        studentaccount sta
                        inner join     
                        internal_marks im ON sta.studentID=im.studentID
                        left join 
                        externalexammarks_finalized ee ON (ee.studentID=im.studentID AND ee.examID = '$examId')
                        left join gracemarks_student_marks gsm ON gsm.examID = ee.examID and gsm.studentID = sta.studentID and gsm.semID = im.semID
                    WHERE
                    im.semID = '$semId' AND im.batchID = '$batchId'
                            AND im.subjectID = '$subjectId'
                            ";
                    }
                    else
                    {
                        $sql = "SELECT 
                        im.studentID as studentId,
                        im.batchID as batchId,
                        im.semID as semId,
                        im.subjectID as subjectId,
                        ee.mark as externalMark,
                        im.internalMarks as internalMark,
                        CASE
                            WHEN ee.mark is NULL AND gsm.marks is NULL THEN im.internalMarks
                            WHEN ee.mark is not NULL AND gsm.marks is not NULL THEN ee.mark+im.internalMarks+gsm.marks
                            WHEN ee.mark is NULL AND gsm.marks is not NULL THEN im.internalMarks+gsm.marks
                            WHEN ee.mark is not NULL AND gsm.marks is NULL THEN ee.mark+im.internalMarks
                        END AS totalMark
                    
                    FROM
                        studentaccount sta
                        inner join     
                        internal_marks im ON sta.studentID=im.studentID
                        left join 
                        externalexammarks_finalized ee ON (ee.studentID=im.studentID AND ee.examID = '$examId') 
                        left join gracemarks_student_marks gsm ON gsm.examID = ee.examID and gsm.studentID = sta.studentID and gsm.semID = im.semID
                    WHERE
                        im.semID = '$semId' AND im.batchID = '$batchId'
                            AND im.subjectID = '$subjectId
                            AND sta.studentID IN (SELECT 
                            studentID
                        FROM
                            studentaccount
                        WHERE
                            batchID = '$batchId' UNION SELECT 
                            studentID
                        FROM
                            failed_students
                        WHERE
                            previousBatch = '$batchId'
                                AND failedInSemester > '$semId')";
                    }
                }
            }
            try {
                $studentMarkList = $this->executeQueryForList($sql);
                if(empty($studentMarkList)){
                    $sql = "SELECT 
                        ee.studentID AS studentId,
                        $batchId AS batchId,
                        $semId AS semId,
                        $subjectId AS subjectId,
                        ee.mark AS totalMark
                    FROM
                        studentaccount sta
                            INNER JOIN
                        exammarks_external ee ON (ee.studentID = sta.studentID
                            AND ee.examID = '$examId')";
                    $studentMarkList = $this->executeQueryForList($sql);
                }
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
        }else{
            
            $sql = "SELECT 
                marks.student_id AS studentId,
                marks.total_marks,
                marks.batch_id AS batchId,
                marks.sem_id AS semId,
                marks.subject_id AS subjectId,
                marks.grade,
                marks.grade_point  As totalMark,
                eg.percentTo,
                MAX(egg.gradePoint) As maxMark
            FROM
                ec_subject_consolidated_mark_details marks
                    INNER JOIN
                assignedSubjectGradeBatches asgb ON asgb.batches_id = marks.batch_id
                    INNER JOIN
                exam_gradepoints eg ON eg.letterGrade = marks.grade
                    AND eg.schemeID = asgb.exam_gradingscheme_id
                    INNER JOIN
                exam_gradepoints egg ON egg.schemeID = asgb.exam_gradingscheme_id
            WHERE
            marks.batch_id = '$batchId' AND marks.sem_id = '$semId'
                        AND marks.subject_id = '$subjectId'
            GROUP BY marks.student_id";       
            try {
                $studentMarkList = $this->executeQueryForList($sql);
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            } 
        }
       
        
        return $studentMarkList;
    }
    
    public function getUniversityExamMarksForConsolidatedMarkReport($batchId,$semesterId,$subjectId,$studentId)
    {
        $batchId = $this->realEscapeString($batchId);
        $semesterId = $this->realEscapeString($semesterId);
        $subjectId = $this->realEscapeString($subjectId);
        $studentId = $this->realEscapeString($studentId);
        $response = new \StdClass;
        $query = "SELECT 
                    *
                FROM
                    universityExams ue
                        LEFT JOIN
                    university_examcredits uec ON uec.batchID = ue.batchID
                        AND uec.semID = ue.semID
                        AND uec.subjectID = ue.subjectID
                    WHERE ue.batchID='$batchId' AND ue.semID='$semesterId' AND ue.subjectId = '$subjectId';";
        try{
            $response->entryType = ExamService::getInstance()->getExamEntryType($batchId);
            $response->examDetails = $this->executeQueryForObject($query);
            if($response->entryType === "GRADE" && !empty($response->examDetails->examID))
            {
                $query = "SELECT
                            ue.examID AS examId,
                            ug.gradePoint
                        FROM
                            universityExams ue
                                INNER JOIN
                            university_studentgrade us ON us.examID = ue.examID
                                AND ue.subjectID = us.subjectID
                                AND ue.semID = us.semID
                                INNER JOIN
                            studentaccount sta ON sta.studentID = us.studentID
                                INNER JOIN
                            university_gradepoints ug ON ug.gradeID = us.gradeObtained
                        WHERE
                            ue.examID = ".$response->examDetails->examID." and sta.studentID ='$studentId' AND ue.semID='$semesterId' AND ue.batchID='$batchId' AND ue.subjectID='$subjectId' ;";
            } else if ($response->entryType === "MARK" && !empty($response->examDetails->examID)) {
                $query = "select um.subjectID,um.marksObtained,ue.examTotalMarks from universityExams ue
                INNER JOIN universityMarks um ON um.examID=ue.examID where um.studentID='$studentId' and ue.semID='$semesterId' and ue.subjectID='$subjectId' AND ue.examID='".$response->examDetails->examID."';";
            }
            $response->examMarks = $this->executeQueryForObject($query);
            return $response;
        }catch(\Exception $e)
        {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        
    }
    /**
     * It gets all grade points of all the students who wrote an exam.
     *
     * @param [type] $examId
     * @return void
     */
    public function getMarksOfStudentsForAnExam(GetMarksStudentExamRequest $request)
    {
        $request->examId = $this->realEscapeString($request->examId);
        $request->batchId = $this->realEscapeString($request->batchId);
        $request->semId = $this->realEscapeString($request->semId);
        $request->subjectId = $this->realEscapeString($request->subjectId);
        $request->studentId = $this->realEscapeString($request->studentId);
        $responseList = [];
        $sql = "";
        $conditionStatement = "";
        if(!empty($request->studentId))
        {
            $conditionStatement .=  " AND um.studentID='$request->studentId'";
        }
        $subbatches = BatchService::getInstance()->getSubbatchBySubject($request->subjectId, $request->semId, $request->batchId);
        $isCurrentSem = SemesterService::getInstance()->isCurrentSemester($request->batchId, $request->semId);
        if(!empty($subbatches))
        {
            if($isCurrentSem)
            {
                $sql = "SELECT distinct sta.studentID AS studentId,
                    sta.studentName,
                    sta.admissionNo,
                    ue.examID AS examId,
                    um.marksObtained,
                    um.percentage,
                    um.internalMark,
                    ue.subjectID AS subjectId,
                    ue.batchID AS batchId,
                    ue.semID AS semId FROM sbs_relation sr inner join subbatch_sbs ssbs on sr.sbsID = ssbs.sbsID inner join subbatch_student ss on ss.subbatchID = ssbs.subbatchID inner join universityExams ue on ue.subjectID = sr.subjectID and ue.batchID = sr.batchID and sr.semID = ue.semID inner join studentaccount sta on sta.studentID = ss.studentID and sta.batchID = ue.batchID INNER JOIN universityMarks um ON ue.examID = um.examID WHERE ue.examID = $request->examId $conditionStatement";
            }
            else 
            {
                $sql = "SELECT distinct sta.studentID AS studentId,
                    sta.studentName,
                    sta.admissionNo,
                    ue.examID AS examId,
                    um.marksObtained,
                    um.percentage,
                    um.internalMark,
                    ue.subjectID AS subjectId,
                    ue.batchID AS batchId,
                    ue.semID AS semId FROM sbs_relation sr inner join subbatch_sbs ssbs on sr.sbsID = ssbs.sbsID inner join subbatch_student ss on ss.subbatchID = ssbs.subbatchID inner join universityExams ue on ue.subjectID = sr.subjectID and ue.batchID = sr.batchID and sr.semID = ue.semID inner join studentaccount sta on sta.studentID = ss.studentID INNER JOIN universityMarks um ON ue.examID = um.examID WHERE ue.examID = $request->examId  and sta.studentID in (select studentID from studentaccount where batchID = $request->batchId union select studentID from failed_students where previousBatch = $request->batchId and failedInSemester > $request->semId$conditionStatement;";
            }
        }
        else 
        {
            if($isCurrentSem)
            {
                $sql = "SELECT
                    sta.studentID AS studentId,
                    sta.studentName,
                    sta.admissionNo,
                    ue.examID AS examId,
                    um.marksObtained,
                    um.percentage,
                    um.internalMark,
                    ue.subjectID AS subjectId,
                    ue.batchID AS batchId,
                    ue.semID AS semId
                FROM
                    universityExams ue
                    INNER JOIN universityMarks um ON ue.examID = um.examID
                        INNER JOIN
                    studentaccount sta ON sta.studentID = us.studentID and sta.batchID = ue.batchID
                WHERE
                    ue.examID = $request->examId $conditionStatement";
            }
            else
            {
                $sql = "SELECT
                    sta.studentID AS studentId,
                    sta.studentName,
                    sta.admissionNo,
                    ue.examID AS examId,
                    um.marksObtained,
                    um.percentage,
                    um.internalMark,
                    ue.subjectID AS subjectId,
                    ue.batchID AS batchId,
                    ue.semID AS semId
                FROM
                    universityExams ue
                    INNER JOIN universityMarks um ON ue.examID = um.examID
                        INNER JOIN
                    studentaccount sta ON sta.studentID = us.studentID
                WHERE
                    ue.examID = $request->examId and sta.studentID in (select studentID from studentaccount where batchID = $request->batchId union select studentID from failed_students where previousBatch = $request->batchId and failedInSemester > $request->semId$conditionStatement";
            }
        }
        
        
        try {
            $responseList = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $responseList;
    }
    /**
     * Update Grade of a student of a student based on University
     *
     * @param [type] $request
     * @return void
     */
    public function updateGradeOfStudentBasedonUniversityMark($request)
    {
        $deletionQuerySql = "delete us from university_studentgrade us inner join universityExams ue on us.examID = ue.examID and ue.subjectID = us.subjectID and ue.semID = us.semID inner join studentaccount sa on sa.batchID = ue.batchID where us.semID = '".$request->semId."' and sa.batchID = '".$request->batchId."' ;";
        $insertionQuerySql = "insert into university_studentgrade (examID, subjectID, gradeObtained, noOfChances, passType, semID, studentID)
        select um.examID,um.subjectID,ug.gradeID,um.chances,um.passType,um.semID,um.studentID from universityMarks um inner join universityExams ue on um.examID = ue.examID and ue.subjectID = um.subjectID and ue.semID = um.semID inner join university_assignbatchcourse ua on ua.batchID = ue.batchID inner join university_gradepoints ug on ug.typeID = ua.typeID and ((if(um.internalMark >0, um.internalMark, 0) + if(um.marksObtained >0, um.marksObtained, 0))/ (if(ue.maxInternal, ue.maxInternal, 0) + if(examTotalMarks, examTotalMarks, 0)))*100  between ug.percentFrom and ug.percentTo  where ue.batchID = '".$request->batchId."' and ue.semID = '".$request->semId."'; ";
        try {
            $this->executeQuery($deletionQuerySql);
            $this->executeQuery($insertionQuerySql);
        }catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
}