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 / 79
CRAP
0.00% covered (danger)
0.00%
0 / 1674
MarkService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 79
98910.00
0.00% covered (danger)
0.00%
0 / 1674
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 3
 __clone
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 1
 getInstance
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 5
 getBackpaperCount
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 getBacklogCount
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getStudentCgpa
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 28
 createStudentUniversityGrade
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 16
 updateStudentUniversityGrade
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 removeStudentUniversityGrade
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 getTotalCreditsBySem
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 19
 createStudentSgpaCgpa
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 updateStudentSgpaCgpa
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 getStudentSgpa
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 19
 isStudentUniversityGradeEntered
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 getStudentExamMarkDetailsByExamId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 updateStudentExamMark
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 createStudentExamMark
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 isNormalisedMarksApproved
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 isNormalisedMarksPublished
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 changeNormalisedMarksApprovalStatus
0.00% covered (danger)
0.00%
0 / 1
420.00
0.00% covered (danger)
0.00%
0 / 58
 getStudentSubjectMarksCgpa
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 getStudentMarksCgpa
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 getStudentUniversityExamTotalMarks
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getStudentSgpaCpga
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 checkIfFailedSubjCreditConsidered
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 12
 getMarkListRegularDiplomaIndividual
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 46
 getCourseGrade
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 19
 getStudentGraceMarkPG
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 getStudentGraceMark
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 getClassAvgByExamId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 18
 getTotalMarksOfAStudentByExamType
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 getStudentInternalAddedMark
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 18
 hasInternalMarkFinalised
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 24
 getStudentNormalizedMark
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 19
 getStudentExamMark
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 17
 updateStudentExamMarks
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 18
 insertStudentExamMark
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 20
 logStudentMarks
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 insertStaffValuatedAnswerSheetCount
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 11
 updateStaffValuatedAnswerSheetCount
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 setConfirmStaffValuatedAnswerSheetCount
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 16
 getStaffValuatedAnswerSheetCount
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 31
 saveStudentExamMarkAndLog
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 19
 getStudentExamMarkEditLog
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 16
 getSubjectsWithStudentMark
0.00% covered (danger)
0.00%
0 / 1
380.00
0.00% covered (danger)
0.00%
0 / 230
 saveUgStudentExternalExamMark
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 30
 savePgStudentExternalExamMark
0.00% covered (danger)
0.00%
0 / 1
210.00
0.00% covered (danger)
0.00%
0 / 42
 saveStudentFinilizedExternalExamMark
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 21
 saveStudentsForThirdValuation
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 21
 getFormulaByExamRegId
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 28
 getAllRuleConstants
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 15
 deleteThirdValStudents
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 20
 deleteStudentFinalizedMark
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 getStudentsExternalMarksByExam
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 20
 getStudentRvStatus
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 checkStudentInNormaliseMark
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 19
 savePgStudentExternalExamMarkAndAttendance
0.00% covered (danger)
0.00%
0 / 1
306.00
0.00% covered (danger)
0.00%
0 / 56
 getStaffIDNormaliseMarkBySubjectIdAndBatchId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 18
 saveUgStudentsExternalMark
0.00% covered (danger)
0.00%
0 / 1
90.00
0.00% covered (danger)
0.00%
0 / 25
 saveStudentInternalMarkLog
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 38
 getStudentInternalMarkEditLog
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 18
 getOeExamMarkConfirmedStudentByExam
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 35
 removeConfirmedStatusOfOeExamMarkConfirmedStudent
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 28
 getExamMarkFinalizedOeStudentsMarkDetailsBySubject
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 32
 getThirdValuationStudentCount
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 16
 getNormaliseMarks
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 16
 getNormaliseMarksRules
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 14
 deleteStudentExamMarkAndUpdateAttendance
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 19
 getStudentRvStatusPg
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 resetStudentExamMarkAndUpdateAttendance
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 19
 saveStudentExamMarkLog
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 23
 prepareLog
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 16
 getAuditCoursePassDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 deleteAuditCoursePassDetails
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 11
 saveAuditCoursePassDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getEligibleExternalMarksForConversion
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 28
 convertExternalMarks
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 30
 checkExternalMarksSavedStatus
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 13
 saveStudentSgpaCgpa
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 16
<?php
namespace com\linways\core\ams\professional\service;
use com\linways\base\util\SecurityUtils;
use com\linways\core\ams\professional\dto\StudentExamMark;
use com\linways\core\ams\professional\mapper\MarkServiceMapper;
use com\linways\core\ams\professional\exception\ProfessionalException;
use com\linways\core\ams\professional\request\CreateStudentMarkLogRequest;
use com\linways\core\ams\professional\dto\examcontroller\exam\StudentMarkEditLog;
use com\linways\core\ams\professional\dto\ExamType;
class MarkService extends BaseService
{
    // /Condition 1 - Presence of a static member variable
    private static $_instance = null;
    
    private $mapper = [];
    
    // /Condition 2 - Locked down the constructor
    private function __construct()
    {
        $this->mapper = MarkServiceMapper::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;
    }
    /**
     * To get count of backpapers of a student
     * @param int $studentId
     * @param int $courseTypeId
     * @throws ProfessionalException
     * @return unknown
     */
    public function getBackpaperCount($studentId, $courseTypeId)
    {
        
        $studentId = $this->realEscapeString($studentId);
        $courseTypeId = $this->realEscapeString($courseTypeId);
        $sql = "select sum(CASE WHEN (gradeObtained in (select gradeID from university_gradepoints where gradePoint = 0 and typeID = $courseTypeId)) THEN 1 else 0 END) AS backpapers 
 from  university_studentgrade  where studentID = $studentId";
        try {
            
            $backpapers = $this->executeQueryForObject($sql)->backpapers;
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        
        return  $backpapers;
    }
    /**
     * To get count of backhistories of a student
     * @param int $studentId
     * @param int $courseTypeId
     * @throws ProfessionalException
     * @return unknown
     */
    public function getBacklogCount($studentId, $courseTypeId)
    {
        $studentId = $this->realEscapeString($studentId);
        $courseTypeId = $this->realEscapeString($courseTypeId);
        
        $sql = "select sum(case when (((noOfChances) > 1) || ((noOfChances = 1) && (gradeObtained  in (select gradeID from university_gradepoints where gradePoint = 0 and typeID = $courseTypeId) ))) then 1 else 0 end) as backhistory     from  university_studentgrade  where studentID = $studentId";
        try {
            
            $backhistory = $this->executeQueryForObject($sql)->backhistory;
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        
        return  $backhistory;
    }
    /**
     * To get the cgpa of a student
     * @param unknown $studentId
     * @param unknown $batchId
     * @throws ProfessionalException
     * @return number
     */
    public function getStudentCgpa($studentId, $batchId)
    {
        $studentId = $this->realEscapeString($studentId);
        $batchId = $this->realEscapeString($batchId);
        
        $sql_cg = "select sum(credit*gradePoint) as sum from university_studentgrade us left join university_gradepoints ug on ug.gradeID = us.gradeObtained left join university_examcredits uc on uc.subjectID = us.subjectID  where studentID = $studentId and batchID = $batchId";
        
        if($this->checkIfFailedSubjCreditConsidered($batchId))
        {
            $sql_credit = "select sum(credit) as sum from  university_studentgrade us left join university_examcredits ue on ue.subjectID= us.subjectID  where  batchID = $batchId and studentID=$studentId";
        }
        else 
        {
            $sql_credit = "select sum(case when ugp.gradePoint !=0 then credit else 0 end) as sum from  university_studentgrade us left join university_examcredits ue on ue.subjectID= us.subjectID left join university_gradepoints ugp on ugp.gradeID = us.gradeObtained  where  batchID = $batchId and studentID=$studentId";
        }
        
        try {
            
            $cgs = $this->executeQueryForObject($sql_cg)->sum;
            $credit = $this->executeQueryForObject($sql_credit)->sum;
            if($credit != 0)
            {
                $cgpa = $cgs/$credit;
            }
            else 
            {
                $cgpa = 0;
            }
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $cgpa;
    }
    /**
     * Insert student university exam details
     * @param StudentUniversityExamGradewise $studentGrade
     * @throws ProfessionalException
     * @return \com\linways\base\connection\Object
     */
    public function createStudentUniversityGrade($studentGrade)
    {
        $universityGrade = $studentGrade->universityExamGrade[0];
        $studentId = $this->realEscapeString($studentGrade->studentId);
        $examId = $this->realEscapeString($universityGrade->examId);
        $subjectId = $this->realEscapeString($universityGrade->subjectId);
        $grades = $this->realEscapeString($universityGrade->gradeObtained);
        $noOfChances = $this->realEscapeString($universityGrade->noOfChances);
        $passType = $this->realEscapeString($universityGrade->passType);
        $semId = $this->realEscapeString($universityGrade->semId);
        
        $sql = "insert into university_studentgrade (examID, subjectID, gradeObtained, noOfChances, passType, semID, studentID) values ($examId,$subjectId$grades$noOfChances, '".$passType."', $semId$studentId)";
        
        try {
            
                        return $this->executeQueryForObject($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
    }
    /**
     * Update student university exam details
     * @param unknown $studentGrade
     * @throws ProfessionalException
     * @return \com\linways\base\connection\Object
     */
    public function updateStudentUniversityGrade($studentGrade)
    {
        $universityGrade = $studentGrade->universityExamGrade[0];
        $examId = $this->realEscapeString($universityGrade->examId);
        $grades = $this->realEscapeString($universityGrade->gradeObtained);
        $noOfChances = $this->realEscapeString($universityGrade->noOfChances);
        $passType = $this->realEscapeString($universityGrade->passType);
        $studentId = $this->realEscapeString($studentGrade->studentId);
        
        $sql = "update university_studentgrade set gradeObtained = $grades, noOfChances = $noOfChances, passType = '".$passType."' where examID = $examId and studentID = $studentId";
        
        try {
            
            return $this->executeQueryForObject($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
    }
    
    /**
     * remove student university mark by examId and studentId
     * @param int $examId
     * @param int $studentId
     * @throws ProfessionalException
     * @return null
     */
    public function removeStudentUniversityGrade($examId, $studentId)
    {
        $sql="DELETE FROM university_studentgrade WHERE examID=$examId and studentID=$studentId";
        try {
            
            return $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
    }
    /**
     * Get total credits of subjects by sem
     * @param int $batchId
     * @param int $semId
     * @throws ProfessionalException
     * @return unknown
     */
    public function getTotalCreditsBySem($batchId, $semId, $studentId)
    {
        $semId = $this->realEscapeString($semId);
        $batchId = $this->realEscapeString($batchId);
        $studentId = $this->realEscapeString($studentId);
        
        if($this->checkIfFailedSubjCreditConsidered($batchId))
        {
            $sql = "select sum(credit) as sum from  university_studentgrade us left join university_examcredits ue on ue.subjectID= us.subjectID  where  batchID = $batchId and studentID=$studentId and us.semID = $semId";
        }
        else 
        {
            $sql = "select sum(case when ugp.gradePoint !=0 then credit else 0 end) as sum from  university_studentgrade us left join university_examcredits ue on ue.subjectID= us.subjectID left join university_gradepoints ugp on ugp.gradeID = us.gradeObtained where  batchID = $batchId and studentID=$studentId and us.semID = $semId";
        }
        
        try {
            
            $total_credits = $this->executeQueryForObject($sql)->sum;
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        
        return $total_credits;
    }
    /**
     * create student sgpa_cgpa
     * @param int $semId
     * @param int $studentId
     * @param int $sgpa
     * @param int $cgpa
     * @param int $total_credit
     * @throws ProfessionalException
     * @return \com\linways\base\connection\Object
     */
    public function createStudentSgpaCgpa($semId, $studentId, $sgpa, $cgpa, $total_credit, $total_marks = 0, $failed_subjects = 0)
    {
        $semId = $this->realEscapeString($semId);
        $studentId = $this->realEscapeString($studentId);
        $sgpa = $this->realEscapeString($sgpa);
        $cgpa = $this->realEscapeString($cgpa);
        $total_credit = $this->realEscapeString($total_credit);
        $failed_subjects = $this->realEscapeString($failed_subjects);
        
        $sql = "insert into sgpa_cgpa (semID, studentID, sgpa, cgpa, total_credit, total_marks, failed_subjects) values ($semId$studentId$sgpa$cgpa, '$total_credit', $total_marks$failed_subjects)";
        
        try {
            
            return $this->executeQueryForObject($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
    }
       /**
        * update student sgpa_cgpa
        * @param int $semId
        * @param int $studentId
        * @param int $sgpa
        * @param int $cgpa
        * @param int $total_credit
        * @throws ProfessionalException
        * @return \com\linways\base\connection\Object
        */
    public function updateStudentSgpaCgpa($semId, $studentId, $sgpa, $cgpa, $total_credit, $total_marks = 0, $failed_subjects = 0)
    {
        $semId = $this->realEscapeString($semId);
        $studentId = $this->realEscapeString($studentId);
        $sgpa = $this->realEscapeString($sgpa);
        $cgpa = $this->realEscapeString($cgpa);
        $total_credit = $this->realEscapeString($total_credit);
        $failed_subjects = $this->realEscapeString($failed_subjects);
        
        $sql = "update sgpa_cgpa set sgpa = $sgpa, cgpa = $cgpa, total_credit = '$total_credit',failed_subjects = $failed_subjects,total_marks = $total_marks  where semID = $semId and studentID = $studentId";
        
        try {
            
            return $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        
    }
    /**
     * Get student sgpa
     * @param int $batchId
     * @param int $semId
     * @param int $studentId
     * @throws ProfessionalException
     * @return int
     */
    public function getStudentSgpa($batchId, $semId, $studentId)
    {
        $semId = $this->realEscapeString($semId);
        $studentId = $this->realEscapeString($studentId);
        $batchId = $this->realEscapeString($batchId);
        
        if($this->checkIfFailedSubjCreditConsidered($batchId))
        {
            $sql = "select sum(credit * gradePoint)/sum(credit) as sgpa from  university_studentgrade us left join university_examcredits ue on ue.subjectID= us.subjectID left join university_gradepoints ug on ug.gradeID = us.gradeObtained  where  batchID = $batchId and studentID=$studentId and us.semID = $semId";
        }
        else 
        {
            $sql = "select sum(credit * gradePoint)/sum(case when ug.gradePoint !=0 then credit else 0 end) as sgpa from  university_studentgrade us left join university_examcredits ue on ue.subjectID= us.subjectID left join university_gradepoints ug on ug.gradeID = us.gradeObtained  where  batchID = $batchId and studentID=$studentId and us.semID = $semId";
        }
        
        try {
            
            $sgpa = $this->executeQueryForObject($sql)->sgpa;
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        
        return $sgpa;
    }
    /**
     * 
     * @param int examId
     * @param int $studentId
     * @throws ProfessionalException
     * @return boolean
     */
    public function isStudentUniversityGradeEntered($examId, $studentId)
    {
        $semId = $this->realEscapeString($semId);
        $studentId = $this->realEscapeString($studentId);
        
        $sql = "select examID from university_studentgrade where studentID = $studentId and examID = $examId";
        try {
            
            $examId = $this->executeQueryForObject($sql)->examID;
            if($examId)
            {
                return true;
            }
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        
        return false;
        
    }
    /**
     * Get exam mark of a student by examId
     * @param int $studentId
     * @param int $examId
     * @throws ProfessionalException
     * @return object|NULL|\com\linways\base\util\$objectList[]
     */
    public function getStudentExamMarkDetailsByExamId($studentId,$examId)
    {
        $studentId = $this->realEscapeString($studentId);
        $examId = $this->realEscapeString($examId);
        
        $sql = "select examID, marksObtained, percentage, examTypeID from student_marks where studentID = $studentId and examID = $examId";
        
        try {
            
            $examMark = $this->executeQueryForObject($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
            
        }
        return $examMark;
    }
    /**
     * update student exam mark
     * @param StudentExamMark $studentExamMark
     * @throws ProfessionalException
     * @return \com\linways\base\dto\MySqlResult
     */
    public function updateStudentExamMark($studentExamMark)
    {
        $studentExamMark = $this->realEscapeObject($studentExamMark);
        
        $sql = "update student_marks set marksObtained = $studentExamMark->marksObtained, percentage = $studentExamMark->percentage where studentID = $studentExamMark->studentId and examID = $studentExamMark->examId";
        
        try {
            
            return $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
            
        }
    }
    /**
     * create student exam mark
     * @param StudentExamMark $studentExamMark
     * @throws ProfessionalException
     * @return \com\linways\base\dto\MySqlResult
     */
    public function createStudentExamMark($studentExamMark)
    {
        $studentExamMark = $this->realEscapeObject($studentExamMark);
        
        $sql = "insert into student_marks (batchID, studentID, examID, marksObtained, subjectID, staffID, percentage, semID, examTypeID) values ($studentExamMark->batchId$studentExamMark->studentId$studentExamMark->examId$studentExamMark->marksObtained$studentExamMark->subjectId$studentExamMark->staffId, '$studentExamMark->percentage', $studentExamMark->semId$studentExamMark->examTypeId)";
        
        try {
            
            return $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
            
        }
    }
    
    /**
     * Check if normalised marks is approved or not.
     * @param int $batchId
     * @param int $semId
     * @param int $subjectId
     * @return boolean
     */
    public function isNormalisedMarksApproved($batchId, $semId, $subjectId)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        
        $sql = "SELECT isAproved FROM aprove_normalise_mark WHERE batchID = $batchId AND semID = $semId AND subjectID = $subjectId";
        
        try {
        
            return  $this->executeQueryForObject($sql)->isAproved;
        
        } catch (\Exception $e) {
        
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        
        }
    }
    
    /**
     * Check if normalised marks is published or not.
     * @param int $batchId
     * @param int $semId
     * @param int $subjectId
     * @throws ProfessionalException
     * @return \com\linways\base\dto\MySqlResult
     */
    public function isNormalisedMarksPublished($batchId, $semId, $subjectId)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
         
        $sql = "SELECT isPublished FROM aprove_normalise_mark WHERE batchID = $batchId AND semID = $semId AND subjectID = $subjectId";
         
        try {
             
            return $this->executeQueryForObject($sql)->isPublished;
             
        } catch (\Exception $e) {
             
            throw new ProfessionalException($e->getCode(),$e->getMessage());
             
        }
    }
    
    public function changeNormalisedMarksApprovalStatus($batchId, $semId, $subjectId, $staffId, $isApproved = NULL, $isPublished = NULL)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        $staffId = $this->realEscapeString($staffId);
        $isApproved = $this->realEscapeString($isApproved);
        $isPublished = $this->realEscapeString($isPublished);
        $isApprovedCond = NULL;
        $isPublishedCond = NULL;
        
        $sqlCheck = "SELECT isAproved FROM aprove_normalise_mark WHERE batchID = $batchId AND semID = $semId AND subjectID = $subjectId";
        
        try {
            //If already a record exists
            $currentStatus = $this->executeQueryForObject($sqlCheck)->isAproved;
            if($currentStatus != NULL)
            {
                if($isApproved != NULL)
                {
                    $isApprovedCond = " isAproved = $isApproved";
                }
                if($isPublished != NULL && $currentStatus == 1)
                {
                    if($isApproved != NULL)
                    {
                        $isApprovedCond .= ", ";
                    }
                    $isPublishedCond = " isPublished = $isPublished";
                }
                $sql = "UPDATE aprove_normalise_mark SET $isApprovedCond $isPublishedCond , updatedDate = utc_timestamp(), updatedBy=$staffId  WHERE batchID = $batchId AND semID = $semId AND subjectID = $subjectId";
                if($isApprovedCond != NULL || $isPublishedCond != NULL || $isApproved == 1)
                {
                    $this->executeQuery($sql);
                }
            }
            else if($isApproved == 1) 
            {
                $sql="select p.pseudosubjectID as pseudosubjectID from pseudosubjects_sbs p inner join sbs_relation s on s.sbsID = p.sbsID where batchID='$batchId' and semID='$semId' and s.subjectID='$subjectId';";
                $pseudosubjects=$this->executeQueryForList($sql);
                if(!empty($pseudosubjects)){
                    foreach($pseudosubjects as $pseudosubject){
                        $pseudosubjectID=!empty($pseudosubject->pseudosubjectID)?$pseudosubject->pseudosubjectID:"NULL";
                        $sql = "INSERT INTO aprove_normalise_mark(batchID, semID, isAproved, subjectID, staffID, createdBy, createdDate, updatedBy, updatedDate, pseudosubjectID) VALUES('$batchId', '$semId', '$isApproved', '$subjectId', '$staffId', '$staffId', utc_timestamp(), $staffId, utc_timestamp(), $pseudosubjectID)";
                        if($isApprovedCond != NULL || $isPublishedCond != NULL || $isApproved == 1)
                        {
                            $this->executeQuery($sql);
                        }
                    }
                }
                else{
                    $sql = "INSERT INTO aprove_normalise_mark(batchID, semID, isAproved, subjectID, staffID, createdBy, createdDate, updatedBy, updatedDate, pseudosubjectID) VALUES('$batchId', '$semId', '$isApproved', '$subjectId', '$staffId', '$staffId', utc_timestamp(), $staffId, utc_timestamp(), NULL)";
                    if($isApprovedCond != NULL || $isPublishedCond != NULL || $isApproved == 1)
                    {
                        $this->executeQuery($sql);
                    }
                }
                
            }
             
        } catch (\Exception $e) {
             
            throw new ProfessionalException($e->getCode(),$e->getMessage());
             
        }
    }
    /**
     * Get student subject cgpa in marks scheme
     * @param int $batchId
     * @param int $semId
     * @param int $totalPercentage
     * @param int $subjectId
     * @throws ProfessionalException
     * @return unknown
     */
    public function getStudentSubjectMarksCgpa($batchId, $semId, $totalPercentage, $subjectId)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $totalPercentage = $this->realEscapeString($totalPercentage);
        $subjectId = $this->realEscapeString($subjectId);
        
        $sql = "SELECT credit * (SELECT ug.gradePoint FROM university_gradepoints ug INNER JOIN university_assignbatchcourse uab on uab.typeID = ug.typeID WHERE ug.percentFrom <= $totalPercentage AND ug.percentTo >= $totalPercentage AND uab.batchID=$batchId) as subjectCredit FROM university_examcredits WHERE batchID = $batchId AND semID = $semId AND subjectID = $subjectId";
        
        try {
            $cgpa = $this->executeQueryForObject($sql)->subjectCredit;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $cgpa;
    }
    /**
     * Get student cgpa by markScheme
     * @param int $batchId
     * @param int $semId
     * @param int $studentId
     * @throws ProfessionalException
     */
    public function getStudentMarksCgpa($batchId, $semId, $studentId)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $studentId = $this->realEscapeString($studentId);
        
        $sql = "select sum(credit) as creditSum from university_examcredits where batchId = $batchId and semID = $semId";
        
        $sql_credit = "select sum(cg)as totalCredit from universityMarks where studentId = $studentId and semID = $semId";
        
        try {
            $creditSum = $this->executeQueryForObject($sql)->creditSum;
            $totalCredit = $this->executeQueryForObject($sql)->totalCredit;
            $cgpa = $totalCredit == 0 ? 0 : ($creditSum/$totalCredit);
            
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $cgpa;
    }
    /**
     * Get student total marks
     * @param int $studentId
     * @param int $semId
     * @throws ProfessionalException
     * @return unknown
     */
    public function getStudentUniversityExamTotalMarks($studentId, $semId)
    {
        $semId = $this->realEscapeString($semId);
        $studentId = $this->realEscapeString($studentId);
        
        $sql = "select sum(if(internalMark, internalMark, 0)) + sum(if(marksObtained, marksObtained, 0)) as totalMarks from universityMarks where studentID = $studentId and semID = $semId";
        
        try {
            $totalMarks = $this->executeQueryForObject($sql)->totalMarks;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $totalMarks;
    }
    /**
     * Get student sgps_cgpa
     * @param int $studentId
     * @param int $semId
     * @throws ProfessionalException
     * @return unknown
     */
    public function getStudentSgpaCpga($studentId, $semId)
    {
        $semId = $this->realEscapeString($semId);
        $studentId = $this->realEscapeString($studentId);
        
        $sql = "select failed_subjects, total_marks, sgpa, cgpa, total_credit from sgpa_cgpa where studentID = $studentId and semID = $semId";
        
        try {
            $sgpa_cgpa = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $sgpa_cgpa;
    }
    /**
     * Check if failed subject credit should be considered
     * when calculating sgpa and cgpa by batchId
     * returns true if failed subj considered 
     * @param int $batchId
     * @throws ProfessionalException
     * @return boolean 
     */
    public function checkIfFailedSubjCreditConsidered($batchId)
    {
        $batchId = $this->realEscapeString($batchId);
        
        $sql = "select considerFailedSubjectCredit from university uni inner join batches ba on ba.universityId = uni.id where batchID = $batchId and considerFailedSubjectCredit = 0";
        
        try {
            $considerFailedSubjectCredit =  $this->executeQueryForObject($sql);
            if($considerFailedSubjectCredit)
               return false;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return true;
    }
    /**
     *
     * @param int $examRegId
     * @param int $batchId
     * @param int $semId
     * @param int $studentId
     * @throws ProfessionalException
     * @return array StudentExamSubjectMark
     *
     */
    public function getMarkListRegularDiplomaIndividual($examRegId, $batchId, $semId, $studentId)
    {
        $studentMarkList = [];        
        $sql = "SELECT  DISTINCT e.subjectID as subjectId,
                s.subjectName,
                s.subjectDesc as subjectDescription,
                e.examID as examId,
                im.internalMarks,
                
                ee.mark as externalMarks,
                ( (case when im.internalMarks is null then 0 else im.internalMarks end) + (case when ee.mark is null then 0 else ee.mark end)) as totalMarks,
                ((case when imss.maxInternalMarks is null then 0 else imss.maxInternalMarks end) + e.examTotalMarks) as examTotalMaxMarks ,
                round(
                ((( (case when im.internalMarks is null then 0 else im.internalMarks end) + (case when ee.mark is null then 0 else ee.mark end)) / ((case when imss.maxInternalMarks is null then 0 else imss.maxInternalMarks end) + e.examTotalMarks)) * 100),2) as percentage,
                sa.studentID as studentId,
                sa.studentName,
                e.examregID as examRegId,
                ea.isAbsent,
    mgsd.id as subjectGroupId,
    mgsd.subjectTitle as subjectGroupName,
    mgsd.subjectCode as subjectGroupCode,
    (case when mgs.id is null  then 0 else 1 end) as isGroupedSubject,
    (case when mgs.id is null then 'THEORY' else (case when mgs.isPractical = 1 then 'LAB' else 'THEORY' end) end) as subjectType
  from exam e
                INNER JOIN subjects s on s.subjectID = e.subjectID
                INNER JOIN exam_reg_studentsubject erss on erss.examregID = e.examregID and erss.subjectID = e.subjectID
                 LEFT JOIN exam_reg_studentchallan ersc on ersc.examregID = e.examregID
                LEFT JOIN internal_marks_submitted ims on ims.batchID = e.batchID and ims.semID = e.semID and
                 ims.subjectID = e.subjectID
                LEFT JOIN internal_marks im on im.batchID = ims.batchID and im.semID = ims.semID and
                 im.subjectID = ims.subjectID and im.studentID = ersc.studentID
                 
                 LEFT JOIN internal_marks_settings imss on imss.batchID = e.batchID and imss.semID = e.semID and
                 imss.subjectID = e.subjectID
                 LEFT JOIN exammarks_external ee on e.examID = ee.examID and ersc.studentID = ee.studentID
                 LEFT JOIN studentaccount sa on ersc.studentID = sa.studentID
                 LEFT JOIN exam_attendance ea on ea.examID = e.examID and ea.studentID = sa.studentID
LEFT JOIN marklist_group_subjects mgs on mgs.subjects_id = s.subjectID
        LEFT JOIN marklist_group_subjects_details mgsd on mgsd.id = mgs.marklist_group_subjects_details_id
WHERE e.examregID = $examRegId and e.batchID = $batchId and e.semID = $semId and  ersc.paid = 1
                AND sa.studentId = $studentId order by s.subjectName;
            ";
        
        try {
            $studentMarkList = $this->executeQueryForList($sql, $this->mapper[MarkServiceMapper::GET_MARK_LIST_REGULAR_DIPLOMA]);
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        
//         $studentExamMark = MarkListUtil::splitSubjectMarksByGroup($studentMarkList);
        return $studentMarkList;
    }
    /**
     * Method for getting course grade of a courseType
     *
     * @param int $percentage
     * @param int $courseTypeId
     * @return CourseGrade $courseGrade
     */
    public function getCourseGrade($percentage, $courseTypeId) {
        $courseGrade= null;
        
        $sql = "SELECT eg.gradePointID as gradePointId,
                eg.schemeID as schemeId,
                eg.percentFrom,
                eg.percentTo,
                eg.lettergrade as letterGrade,
                eg.gradePoint,
                eg.failstatus as failStatus,
                egs.courseTypeID as courseTypeId  FROM exam_gradepoints
                eg INNER JOIN exam_gradingscheme egs  on egs.schemeID = eg.schemeID
                WHERE egs.courseTypeID = $courseTypeId
                AND  (eg.percentFrom <= $percentage and eg.percentTo >= $percentage);"    ;
        try {
            $courseGrade = $this->executeQueryForObject ( $sql );
        } catch ( \Exception $e ) {
            
            throw new ProfessionalException( $e->getCode (), $e->getMessage () );
        }
        
        return $courseGrade;
    }
    /**
     * Get student grace mark for PG
     * @param int $examId
     * @param int $studentId
     * @param int $subjectId
     * @throws ProfessionalException
     * @return unknown
     */
    public function getStudentGraceMarkPG($examId,$studentId,$subjectId)
    {
        $sql = '';
        $examId = $this->realEscapeObject($examId);
        $studentId = $this->realEscapeObject($studentId);
        $subjectId = $this->realEscapeObject($subjectId);
        
        $studentGraceMark = null;
        
        try{
            $sql = "SELECT gsm.adminUpdatedMarks AS correctMark FROM gracemarks_student_marks gsm WHERE gsm.studentID = $studentId AND examID = $examId AND subjectID = $subjectId AND gsm.approve = 1 AND gsm.fianlize = 1";
            $studentGraceMark = $this->executeQueryForObject($sql)->correctMark;
            
        }catch (\Exception $e){
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        
        return $studentGraceMark;
    }
    /**
     * Get student grace mark
     * @param int $examId
     * @param int $studentId
     * @param int $subjectId
     * @throws ProfessionalException
     * @return unknown
     */
    public function getStudentGraceMark($examId,$studentId,$subjectId)
    {
        $sql = '';
        $examId = $this->realEscapeObject($examId);
        $studentId = $this->realEscapeObject($studentId);
        $subjectId = $this->realEscapeObject($subjectId);
        
        $studentGraceMark = null;
        
        try{
            $sql = "SELECT gsm.marks AS studentGraceMark FROM gracemarks_student_marks gsm WHERE gsm.studentID = $studentId AND examID = $examId AND subjectID = $subjectId AND gsm.approve = 1 AND gsm.fianlize = 1";
            $studentGraceMark = $this->executeQueryForObject($sql)->studentGraceMark;
            
        }catch (\Exception $e){
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        
        return $studentGraceMark;
    }
    /**
     * Get class average by examId
     * @param int $examId
     * @throws ProfessionalException
     * @return unknown
     */
    public function getClassAvgByExamId($examId, $considerAbsentees =false)
    {
        $examId = $this->realEscapeObject($examId);
        $considerAbsentees = $this->realEscapeString($considerAbsentees);
        
        if($considerAbsentees)
        {
            $sqlCond = " sum(if(sm.marksObtained != '-0.001' AND sm.marksObtained !='-1',sm.marksObtained,0))/ count(if(sm.marksObtained != '-.001' ,sm.studentId,0)) ";
        }
        else
        {
            $sqlCond = " sum(if(sm.marksObtained != '-0.001' AND sm.marksObtained !='-1',sm.marksObtained,0))/ count(if(sm.marksObtained != '-.001' AND sm.marksObtained !='-1',sm.studentId,0)) ";
        }
        $sql = "select ".$sqlCond."  as totalObtained from student_marks sm inner join exam ex on sm.examID = ex.examID inner join studentaccount sa on sa.studentID = sm.studentID and sa.batchID = sm.batchID where ex.examID = ".$examId."";
        try {
            return $this->executeQueryForObject($sql)->totalObtained;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get total marks of a student by exam type
     * @param int $examTypeId
     * @param int $batchId
     * @param int $semId
     * @param int $studentId
     * @throws ProfessionalException
     * @return unknown
     */
    public function getTotalMarksOfAStudentByExamType($examTypeId, $batchId, $semId, $studentId)
    {
        $examTypeId = $this->realEscapeString($examTypeId);
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $studentId = $this->realEscapeString($studentId);
        
        $sql = "select sum(if(sm.marksObtained != '-0.001' AND sm.marksObtained !='-1',sm.marksObtained,0)) as total from student_marks sm where examTypeID = ".$examTypeId." and studentID = ".$studentId." and batchID = ".$batchId." and semID = ".$semId."";
        try {
            return $this->executeQueryForObject($sql)->total;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * To get student's internal added mark 
     * @param int $studentID
     * @param int $staffID
     * @param int $batchID
     * @param int $subjectID 
     */
    public function getStudentInternalAddedMark($studentID,$staffID,$batchID,$subjectID)
    {
        $studentID = $this->realEscapeString($studentID);
        $staffID = $this->realEscapeString($staffID);
        $batchID = $this->realEscapeString($batchID);
        $subjectID = $this->realEscapeString($subjectID);
        $sql="SELECT markID, marksObtained, normalisedMark, percentage FROM normalise_marks WHERE batchID = '$batchID' AND studentID = '$studentID' AND subjectID = '$subjectID' AND staffID = '$staffID'";
        try
        {
            $result = $this->executeQueryForObject($sql);
            $result->grace = $result->normalisedMark-$result->marksObtained;
            $result->total = $result->normalisedMark;
            return $result;
        }
        catch(\Exception $e)
        {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * To check wether batch internal mark finalised or not
     * @param int $batchID
     * @param int $subjectID
     * @param int $semID
     * @param int $subbatchID
     */
    public function hasInternalMarkFinalised($batchID,$subjectID,$semID,$subbatchID)
    {
        if($subbatchID)
        {
            $sql = "SELECT n.normalisedMark ,n.studentID FROM normalise_marks n
            INNER JOIN subbatch_student s ON n.studentID = s.studentID
            WHERE n.batchID='$batchID' AND n.subjectID='$subjectID' AND n.semID='$semID' AND subbatchID='$subbatchID' GROUP BY n.studentID LIMIT 1;";
        }
        else
        {
            $sql="SELECT normalisedMark FROM normalise_marks WHERE batchID='$batchID' AND subjectID='$subjectID' AND semID='$semID';";
        }
        try
        {
            $result = $this->executeQueryForObject($sql);
            if ($result)
            return true;
            else
            return false;
        }
        catch(\Exception $e)
        {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * To get student's normalized mark 
     * @param int $studentId
     * @param int $batchId
     * @param int $semId
     * @param int $subjectId 
     */
    public function getStudentNormalizedMark($studentId, $batchId, $semId, $subjectId) {
        $studentId  = $this->realEscapeString($studentId);
        $batchId    = $this->realEscapeString($batchId);
        $semId      = $this->realEscapeString($semId);
        $subjectId  = $this->realEscapeString($subjectId);
        $result     = NULL;
        $sql = "SELECT markID, subjectID, batchID, semID, studentID, marksObtained, normalisedMark, percentage FROM normalise_marks WHERE batchID = '$batchId' AND studentID = '$studentId' AND subjectID IN ($subjectId) AND semID = '$semId";
        try {
            $results = $this->executeQueryForList($sql);
            foreach ($results as $result ) {
                $result->grace = $result->normalisedMark - $result->marksObtained;
                $result->total = $result->normalisedMark;
            }
            
            return $results;
        }
        catch(\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $result;
    }
    /**
     * create student exam mark
     * @param StudentExamMark $studentExamMark
     * @throws ProfessionalException
     * @return \com\linways\base\dto\MySqlResult
     */
    public function getStudentExamMark($studentExamMark)
    {
        $studentExamMark = $this->realEscapeObject($studentExamMark);
        
        $sql = "SELECT markID, marksObtained 
        FROM student_marks 
        WHERE 
            batchID = $studentExamMark->batchId AND
            studentID = $studentExamMark->studentId  AND
            examID = $studentExamMark->examId  AND
            subjectID = $studentExamMark->subjectId  AND
            semID = $studentExamMark->semId  AND
            examTypeID = $studentExamMark->examTypeId";
        
        try {
            
            return $this->executeQueryForObject($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
            
        }
    }
    /**
     * update student exam marks for subject in exam of semester of batch
     * @param StudentExamMark $studentExamMark
     * @throws ProfessionalException
     * @return \com\linways\base\dto\MySqlResult
     */
    public function updateStudentExamMarks($studentExamMark)
    {
        $studentExamMark = $this->realEscapeObject($studentExamMark);
        
        $sql = "UPDATE student_marks 
        SET marksObtained = $studentExamMark->marksObtained
            percentage = $studentExamMark->percentage 
        WHERE 
            batchID = $studentExamMark->batchId AND
            studentID = $studentExamMark->studentId  AND
            examID = $studentExamMark->examId  AND
            subjectID = $studentExamMark->subjectId  AND
            semID = $studentExamMark->semId  AND
            examTypeID = $studentExamMark->examTypeId";
        
        try {
            
            return $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
            
        }
    }
    /**
     * create student exam mark
     * @param StudentExamMark $studentExamMarkList
     * @throws ProfessionalException
     * @return \com\linways\base\dto\MySqlResult
     */
    public function insertStudentExamMark($studentExamMarkList)
    {
        $studentExamMarkList = $this->realEscapeObject($studentExamMarkList);
        $valueStringList = NULL;
        $valueString = "";
        foreach ($studentExamMarkList as $studentExamMark ) {
            $valueStringList[] = "($studentExamMark->batchId$studentExamMark->studentId$studentExamMark->examId$studentExamMark->marksObtained$studentExamMark->subjectId$studentExamMark->staffId, '$studentExamMark->percentage', $studentExamMark->semId$studentExamMark->examTypeId)";
        }
        $valueString = implode(',',$valueStringList);
        $sql = "INSERT INTO 
            student_marks (batchID, studentID, examID, marksObtained, subjectID, staffID, percentage, semID, examTypeID) 
        VALUES 
            $valueString
        ON DUPLICATE KEY UPDATE 
            marksObtained = VALUES(marksObtained), percentage = VALUES(percentage)";
        
        try {
            
            return $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
            
        }
    }
    /**
     * Log student mark entry
     * Ignore if duplicate entry for student mark.
     */
    public function logStudentMarks(CreateStudentMarkLogRequest $request)
    {
        $request = $this->realEscapeObject($request);
        $query = "INSERT IGNORE INTO student_marks_log (studentID,examID,marksObtained,staffID,created_date) VALUES ('$request->studentId','$request->examId','$request->marksObtained','$request->createdBy',UTC_TIMESTAMP())";
        try{
            $this->executeQuery($query);
        }catch(\Exception $e)
        {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
    }
    /**
     * Enter staff valuated answer sheet count 
     * 
     */
    public function insertStaffValuatedAnswerSheetCount($request)
    {
        $request = $this->realEscapeObject($request);
        $query = "INSERT INTO staff_exam_valuation_answer_sheet_count (assignstaff_exam_groupname_id, exam_id, staffaccounts_id, valuated_answer_sheet_count, created_by) VALUES (".($request->groupId ? $request->groupId : 'NULL').",".($request->examId ? $request->examId : 'NULL').",$request->staffId$request->valuatedAnswerSheetCount$request->createdBy)";
        try{
            $id = $this->executeQuery($query,true);
        }catch(\Exception $e)
        {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $id;
    }
    /**
     * Enter staff valuated answer sheet count 
     * 
     */
    public function updateStaffValuatedAnswerSheetCount($id, $valuatedAnswerSheetCount,$staffId)
    {
        $id = $this->realEscapeString($id);
        $valuatedAnswerSheetCount = $this->realEscapeString($valuatedAnswerSheetCount);
        $query = "UPDATE staff_exam_valuation_answer_sheet_count SET valuated_answer_sheet_count = $valuatedAnswerSheetCount,updated_by = '$staffId' WHERE id = $id";
        try{
            $this->executeQuery($query);
        }catch(\Exception $e)
        {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return;
    }
    /**
     * update is_confirm flag 
     * 
     */
    public function setConfirmStaffValuatedAnswerSheetCount($id, $isConfirm = false,$staffId)
    {
        $id = $this->realEscapeString($id);
        $isConfirm = $this->realEscapeString($isConfirm);
        $isConfirmValue = 0;
        if ($isConfirm) {
            $isConfirmValue = 1;
        }
        $query = "UPDATE staff_exam_valuation_answer_sheet_count SET is_confirmed = '$isConfirmValue',updated_by = '$staffId' WHERE id = $id";
        try{
            $this->executeQuery($query);
        }catch(\Exception $e)
        {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return;
    }
    /**
     * get staff valuated answer sheet count 
     * 
     */
    public function getStaffValuatedAnswerSheetCount($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = "";
        try{
            if ($request->groupId) {
                $condition .= " AND assignstaff_exam_groupname_id = $request->groupId";
            }
            else if ($request->examId) {
                $condition .= " AND exam_id = $request->examId";
            }
            else{
                throw new ProfessionalException(ProfessionalException::INVALID_REQUEST,'Either Group or Exam required');
            }
            if (!$request->staffId) {
                throw new ProfessionalException(ProfessionalException::INVALID_REQUEST,'Staff can not be null');
            }
            $query = "SELECT 
                id,
                valuated_answer_sheet_count AS answerSheetCount
            FROM
                staff_exam_valuation_answer_sheet_count
            WHERE
                staffaccounts_id = '$request->staffId'
                $condition";
            $valuatedAnswerSheetCountObj = $this->executeQueryForObject($query);
        }catch(\Exception $e)
        {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $valuatedAnswerSheetCountObj;
    }
    /**
     * Update or add new exam mark
     * 
     */
    public function saveStudentExamMarkAndLog($request)
    {
        $request = $this->realEscapeObject($request);
        try {
            $sql = "INSERT INTO externalexammarks_finalized (examID, studentID, mark) VALUES ('$request->examId','$request->studentId',$request->mark) ON DUPLICATE KEY UPDATE mark = VALUES(mark)";
                $this->executeQuery($sql);
            $sql = "INSERT INTO exammarks_external (examID, studentID, mark, adminID) VALUES ('$request->examId','$request->studentId',$request->mark,$request->staffId) ON DUPLICATE KEY UPDATE mark = VALUES(mark)";
                $this->executeQuery($sql);
            $sql_absent = "INSERT INTO exam_attendance (examID, studentID, isAbsent) VALUES ('$request->examId','$request->studentId',0) ON DUPLICATE KEY UPDATE isAbsent = VALUES(isAbsent)";
                $this->executeQuery($sql_absent);
            $id = SecurityUtils::getRandomString();
            $log = json_encode($request->log);
            $sql = "INSERT INTO ec_student_mark_edit_log (id,exam_id,student_id,log,created_by,created_date)
            VALUES ('$id',$request->examId,'$request->studentId','[$log]','$request->staffId',now()) ON DUPLICATE KEY UPDATE `log` = JSON_MERGE(`log`,'$log'), updated_by = VALUES(created_by)";
                $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return true;
    }
    /**
     * Update or add new exam mark
     * 
     */
    public function getStudentExamMarkEditLog($request)
    {
        $request = $this->realEscapeObject($request);
        try {
            $sql = "SELECT
                `log`
            FROM
                ec_student_mark_edit_log
            WHERE
                student_id = '$request->studentId'
                AND exam_id = '$request->examId'";
            $log = $this->executeQueryForObject($sql);
            
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $log;
    }
    /**
     * fetch subject with student mark
     * 
     */
    public function getSubjectsWithStudentMark($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = "";
        if (empty($request->semId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Semester can not be null");
        }
        else{
            $semIdString = is_array($request->semId) ? implode(",",$request->semId) : $request->semId;
            $condition .= " AND e.semID IN ($semIdString";
        }
        if (empty($request->examRegId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Exam registration can not be null");
        }
        else{
            $examRegIdString = is_array($request->examRegId) ? implode(",",$request->examRegId) : $request->examRegId;
            if ($request->isSupply) {
                $condition .= " AND e.supply_examreg_id IN ($examRegIdString";
            }
            else{
                $condition .= " AND e.examregID IN ($examRegIdString";
            }
        }
        if (!isset($request->isUg)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Unable to conform batch course type");
        }
        else{
            $courseType = $request->isUg ? 'UG' : 'PG';
        }
        if (empty($request->staffId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Staff can not be null");
        }
        else{
            $condition .= $request->isSupply ? ($request->staffSubjects ? "AND FIND_IN_SET ('$request->staffId',evs.staffIDs)" : "")  : " AND FIND_IN_SET ('$request->staffId',evs.staffIDs) ";
        }
        if (!empty($request->batchId)) {
            $batchIdString = is_array($request->batchId) ? implode(",",$request->batchId) : $request->batchId;
            $condition .= " AND e.batchID IN ($batchIdString";
        }
        if (!empty($request->subjectId)) {
            $subjectIdString = is_array($request->subjectId) ? implode(",",$request->subjectId) : $request->subjectId;
            $condition .= " AND s.subjectID IN ($subjectIdString";
        }
        $staffSubjectsCondition="";
        if($request->staffSubjects){
            $staffSubjectsCondition = " INNER JOIN exam_valuation_staffs evs ON evs.examID = e.examID ";
        }
        try {
            $sqlRegular = "SELECT
                ersf.batchID AS batchId,
                s.subjectID AS subjectId,
                s.subjectName,
                s.syllabusName,
                s.subjectDesc,
                e.examID AS examId,
                e.examTotalMarks,
                sa.studentID AS studentId,
                sa.regNo,
                sa.studentName,
                sa.admissionNo,
                IF(vd.firstval_Dateend = '', null, vd.firstval_Dateend) AS firstValidationEndDate,
                IF(vd.firstval_Datestart = '', null, vd.firstval_Datestart) AS firstValidationStartDate,
                IF(vd.secondval_Dateend = '', null, vd.secondval_Dateend) AS secondValidationEndDate,
                IF(vd.secondval_Datestart = '', null, vd.secondval_Datestart) AS secondValidationStartDate,
                ecfn.false_number AS falseNumber,
                eem.mark,
                eem.valuationCount,
                ee.mark AS externalMark,
                eef.mark AS externalMarkFinilized,
                eets.thirdvalstudentID AS eligible3rdVal,
                ea.isAbsent,
                s.isTheory
            FROM
                exam_registration_subject_fees ersf
            INNER JOIN subjects s ON
                s.subjectID = ersf.subjectID
            INNER JOIN exam e ON
                e.batchID = ersf.batchID
                AND e.semID = ersf.semID
                AND e.subjectID = ersf.subjectID
                AND e.subjectID = s.subjectID
                AND e.examregID = ersf.examregID
            INNER JOIN exam_reg_studentsubject erss ON
                erss.examregID = ersf.examregID
                AND erss.examregID = e.examregID
                AND erss.subjectID = e.subjectID
                AND erss.subjectID = s.subjectID
                AND erss.subjectID = ersf.subjectID
            INNER JOIN studentaccount sa ON
                sa.studentID = erss.studentID
                AND sa.batchID = ersf.batchID
                AND sa.batchID = e.batchID
            INNER JOIN exam_valuation_staffs evs ON 
                evs.examID = e.examID
            LEFT JOIN valuationdates vd ON
                vd.batchID = e.batchID
                AND vd.batchID = ersf.batchID
                AND vd.batchID = sa.batchID
                AND vd.examregID = erss.examregID
                AND vd.examregID = ersf.examregID
                AND vd.examregID = e.examregID
            LEFT JOIN examcontroller_false_number ecfn ON
                ecfn.examregID = erss.examregID
                AND ecfn.examregID = ersf.examregID
                AND ecfn.examregID = e.examregID
                AND ecfn.examID = e.examID
                AND ecfn.examID = evs.examID
                AND ecfn.studentID = erss.studentID
                AND ecfn.studentID = sa.studentID
            LEFT JOIN exammarks_external ee ON
                ee.examID = e.examID
                AND ee.examID = evs.examID
                AND ee.studentID = erss.studentID
                AND ee.studentID = sa.studentID
            LEFT JOIN externalexammarks_finalized eef ON
                eef.examID = e.examID
                AND eef.examID = evs.examID
                AND eef.studentID = erss.studentID
                AND eef.studentID = sa.studentID
            LEFT JOIN external_exammarks eem ON
                eem.examID = e.examID
                AND eem.examID = evs.examID
                AND eem.studentID = erss.studentID
                AND eem.studentID = sa.studentID
            LEFT JOIN externalexam_thirdvalstudents eets ON
                eets.examID = e.examID
                AND eets.examID = evs.examID
                AND eets.studentID = erss.studentID
                AND eets.studentID = sa.studentID
            LEFT JOIN exam_valuation_closed evc ON
                evc.examID = e.examID
                AND evc.examID = evs.examID
            LEFT JOIN exam_attendance ea ON 
                ea.examID = e.examID 
                AND ea.studentID = sa.studentID
            WHERE
                ersf.subjectID = ersf.subjectID
                $condition";
            $sqlSupply = "SELECT
                e.batchID AS batchId,
                s.subjectID AS subjectId,
                s.subjectName,
                s.syllabusName,
                s.subjectDesc,
                e.examID AS examId,
                e.examTotalMarks,
                sa.studentID AS studentId,
                sa.regNo,
                sa.studentName,
                sa.admissionNo,
                IF(es.valuation_endDate = '', null, es.valuation_endDate) AS firstValidationEndDate,
                IF(es.valuation_startDate = '', null, es.valuation_startDate) AS firstValidationStartDate,
                IF(esv.valuation_endDate = '', null, esv.valuation_endDate) AS secondValidationEndDate,
                IF(esv.valuation_startDate = '', null, esv.valuation_startDate) AS secondValidationStartDate,
                ecfn.false_number AS falseNumber,
                eem.mark,
                eem.valuationCount,
                ee.mark AS externalMark,
                eef.mark AS externalMarkFinilized,
                eets.thirdvalstudentID AS eligible3rdVal,
                ea.isAbsent,
                s.isTheory
                FROM
                    exam_supplementary_student_subjects esss
                INNER JOIN exam re ON
                    re.examID = esss.examID
                INNER JOIN exam e ON
                    e.batchID = re.batchID
                    AND e.subjectID = re.subjectID
                    AND e.semID = re.semID
                    AND e.supply_examreg_id = esss.exam_supplementary_id
                INNER JOIN subjects s ON
                    s.subjectID = e.subjectID
                    AND s.subjectID = re.subjectID
                INNER JOIN studentaccount sa ON
                    sa.studentID = esss.studentID
                    AND sa.batchID = re.batchID
                    AND sa.batchID = e.batchID
                INNER JOIN exam_supplementary es ON
                    es.id = esss.exam_supplementary_id
                $staffSubjectsCondition
                LEFT JOIN exam_supplementary_valdates esv ON
                    esv.exam_supplementary_id = esss.exam_supplementary_id
                    AND esv.valuationCount = 2
                LEFT JOIN examcontroller_false_number ecfn ON
                    ecfn.exam_supplementary_id = esss.exam_supplementary_id
                    AND ecfn.exam_supplementary_id = e.supply_examreg_id
                    AND ecfn.examID = e.examID
                    --     AND ecfn.examID = evs.examID
                    AND ecfn.studentID = esss.studentID
                    AND ecfn.studentID = sa.studentID
                LEFT JOIN exammarks_external ee ON
                    ee.examID = e.examID
                    --     AND ee.examID = evs.examID
                    AND ee.studentID = esss.studentID
                    AND ee.studentID = sa.studentID
                LEFT JOIN externalexammarks_finalized eef ON
                    eef.examID = e.examID
                    --     AND eef.examID = evs.examID
                    AND eef.studentID = esss.studentID
                    AND eef.studentID = sa.studentID
                LEFT JOIN external_exammarks eem ON
                    eem.examID = e.examID
                    --     AND eem.examID = evs.examID
                    AND eem.studentID = esss.studentID
                    AND eem.studentID = sa.studentID
                LEFT JOIN externalexam_thirdvalstudents eets ON
                    eets.examID = e.examID
                    --     AND eets.examID = evs.examID
                    AND eets.studentID = esss.studentID
                    AND eets.studentID = sa.studentID
                LEFT JOIN exam_valuation_closed evc ON
                    evc.examID = e.examID
                    --     AND evc.examID = evs.examID
                LEFT JOIN exam_attendance ea ON 
                    ea.examID = e.examID 
                    AND ea.studentID = sa.studentID
                WHERE e.subjectID = e.subjectID
                $condition";
            if (!isset($request->isSupply)) {
                throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Unable to conform Exam type");
            }
            else{
                $sql = $request->isSupply ? $sqlSupply : $sqlRegular;
            }
            $students = $this->executeQueryForList($sql);
            
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $students;
    }
     /**
     * Update or add new exam mark
     * 
     */
    public function saveUgStudentExternalExamMark($students,$staffId)
    {
        $students = $this->realEscapeArray($students);
        $staffId = $this->realEscapeString($staffId);
        $eefValues = [];
        $eeValues = [];
        if (empty($students)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Students can not be null");
        }
        if (empty($staffId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Staff can not be null");
        }
        foreach ($students as $student) {
            if (empty($student->examId) || empty($student->studentId)) {
                throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Some students have no valid data");
            }
            $eefValues[] = "('$student->examId','$student->studentId',".($student->externalMark ? $student->externalMark : 0). "," . ($student->isRevalued ? 1 : 0) . ")";
            $eeValues[] = "('$student->examId','$student->studentId',".($student->externalMark ? $student->externalMark : 0).",$staffId,".($student->isRevalued ? 1: 0).")";
        }
        try {
            $eefValuesString = implode(", ",$eefValues);
            $sql = "INSERT INTO externalexammarks_finalized (examID, studentID, mark,isRevalued) VALUES $eefValuesString ON DUPLICATE KEY UPDATE mark = VALUES(mark), isRevalued = VALUES(isRevalued),updated_by = $staffId";
            $this->executeQuery($sql);
            $eeValuesString = implode(", ",$eeValues);
            $sql = "INSERT INTO exammarks_external (examID, studentID, mark, staffID, isRevalued) VALUES $eeValuesString ON DUPLICATE KEY UPDATE mark = VALUES(mark), isRevalued = VALUES(isRevalued),updated_by = $staffId";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return;
    }
    public function savePgStudentExternalExamMark($students,$request)
    {
        $students = $this->realEscapeArray($students);
        $request = $this->realEscapeObject($request);
        $eemValues = [];
        $eeValues = [];
        $markEnteringPersonColumn = "";
        if (empty($students)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Students can not be null");
        }
        if (empty($request->staffId) && empty($request->adminId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Staff can not be null");
        }
        else{
            $markEnteringPersonColumn = empty($request->staffId) ? "adminID" : "staffID";
            $markEnteringPersonId = empty($request->staffId) ? $request->adminId : $request->staffId;
        }
        if (empty($request->valuationCount)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Valuation count can not be null");
        }
        foreach ($students as $student) {
            if (empty($student->examId) || empty($student->studentId)) {
                throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Some students have no valid data");
            }
            $eemValues[] = "('$student->examId','$student->studentId',".($student->mark ? $student->mark : 0).",$request->valuationCount)";
            $eeValues[] = "('$student->examId','$student->studentId',".($student->mark ? $student->mark : 0).",$markEnteringPersonId)";
        }
        try {
            
            if ($request->valuationCount == 1) {
                $eeValuesString = implode(", ",$eeValues);
                $sql = "INSERT INTO exammarks_external (examID, studentID, mark, $markEnteringPersonColumn) VALUES $eeValuesString ON DUPLICATE KEY UPDATE mark = VALUES(mark)";
                $this->executeQuery($sql);
            }
            else {
                $eemValuesString = implode(", ",$eemValues);
                $sql = "INSERT INTO external_exammarks (examID, studentID, mark, valuationCount) VALUES $eemValuesString ON DUPLICATE KEY UPDATE mark = VALUES(mark)";
                $this->executeQuery($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return;
    }
    public function saveStudentFinilizedExternalExamMark($students)
    {
        $students = $this->realEscapeArray($students);
        $eefValues = [];
        if (empty($students)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Students can not be null");
        }
        foreach ($students as $student) {
            if (empty($student->examId) || empty($student->studentId)) {
                throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Some students have no valid data");
            }
            $eefValues[] = "('$student->examId','$student->studentId',".($student->externalMark ? $student->externalMark : 0).")";
        }
        try {
            $eefValuesString = implode(", ",$eefValues);
            $sql = "INSERT INTO externalexammarks_finalized (examID, studentID, mark) VALUES $eefValuesString ON DUPLICATE KEY UPDATE mark = VALUES(mark)";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return;
    }
    public function saveStudentsForThirdValuation($students)
    {
        $students = $this->realEscapeArray($students);
        $values = [];
        if (empty($students)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Students can not be null");
        }
        foreach ($students as $student) {
            if (empty($student->examId) || empty($student->studentId)) {
                throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Some students have no valid data");
            }
            $values[] = "('$student->examId','$student->studentId')";
        }
        try {
            $valuesString = implode(", ",$values);
            $sql = "INSERT INTO externalexam_thirdvalstudents (examID, studentID) VALUES $valuesString ON DUPLICATE KEY UPDATE examID = VALUES(examID)";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return;
    }
    public function getFormulaByExamRegId($examRegId, $isSupply=false)
    {
        $examRegId = $this->realEscapeString($examRegId);
        $isSupply = $this->realEscapeString($isSupply);
        $examRegColumnName = "exam_registration_id";
        if ($isSupply) {
            $examRegColumnName = "exam_supplementary_id";
        }
        try{
            if (empty($examRegId)) {
                throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Invalid Exam Registraion");
            }
            $query = "SELECT
                evrf.id,
                evrf.formulaName,
                evrf.formula
            FROM
                exam_valuation_rule_relation evrr
            INNER JOIN exam_valuation_rule_formula evrf ON
                evrf.id = evrr.exam_valuation_rule_formula_id
            WHERE
                ".$examRegColumnName." = '$examRegId'";
            $formula = $this->executeQueryForObject($query);
        }catch(\Exception $e)
        {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $formula;
    }
    public function getAllRuleConstants()
    {
        try{
            $query = "SELECT
                id,
                constantName,
                constantValue
            FROM
                exam_valuation_rule_constant";
            $constants = $this->executeQueryForList($query);
        }catch(\Exception $e)
        {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $constants;
    }
    /**
     * @param $studentId,examId
     * delete from third valuation students
     */
    public function deleteThirdValStudents($request)
    {
        $request = $this->realEscapeObject($request);
        $result = null;
        $condition = "";
        if ($request->isRevaluation) {
            $condition .= " AND revaluationFlag = 1";
        }
        $sql = "DELETE FROM externalexam_thirdvalstudents WHERE examID = '$request->examID' AND studentID='$request->studentID$condition";
        $deleteMarkSql = "DELETE FROM  external_exammarks WHERE examID = '$request->examID' AND studentID='$request->studentID' AND valuationCount='3'";
        try {
            $this->executeQueryForObject($sql);
            if (!$request->isRevaluation){
                $this->executeQueryForObject($deleteMarkSql);
            }
            $result = true;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $result;
    }
    /**
     * @param $courseTypeId
     * delete from finalized marks
     */
    public function deleteStudentFinalizedMark($request)
    {
        $request = $this->realEscapeObject($request);
        $result = null;
        $sql = "DELETE FROM externalexammarks_finalized WHERE examID = '$request->examID' AND studentID='$request->studentID'";
        try {
            $this->executeQueryForObject($sql);
            $result = true;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $result;
    }
    /**
     * @param $examId,valuation count
     * get Students External Marks By Exam
     */
    public function getStudentsExternalMarksByExam($request)
    {
        $request = $this->realEscapeObject($request);
        $valuationCountCondition = "";
        $sql = "";
        $studentsMarks = null;
        if ($request->valuationCount == 2 || $request->valuationCount == 3) {
            $tableName = "external_exammarks";
            $valuationCountCondition = "AND valuationCount = $request->valuationCount";
        }
        else{
            $tableName = "exammarks_external";
        }
        $sql = "SELECT examID,studentID,mark from $tableName WHERE  examID IN($request->examIds$valuationCountCondition";
        try {
            $studentsMarks = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $studentsMarks;
    }
        /**
     * @param $examId,studentId
     * get Students External Marks By Exam
     */
    public function getStudentRvStatus($examId, $studentId)
    {
        $examId = $this->realEscapeString($examId);
        $studentId = $this->realEscapeString($studentId);
        $sql = "SELECT isRevalued from exammarks_external WHERE  examID =$examId and studentID =$studentId";
        try {
            $resposnse = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $resposnse[0]->isRevalued;
    }
    /**
     * Method to check student exist in normalise mark
     * @param Integer
     * @return Boolean
     * @throws ProfessionalException
     */
    public function checkStudentInNormaliseMark($studentID,$subjectID,$batchID,$semID)
    {
        
        $sql = "SELECT 
                    markID
                FROM
                    normalise_marks
                WHERE
                    studentID = '$studentID' AND batchID = '$batchID'
                        AND subjectID = '$subjectID'
                        AND semID = '$semID'";
        try {
            $result = $this->executeQueryForList($sql);
            if($result){
                return true;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return false;
    }
    public function savePgStudentExternalExamMarkAndAttendance($students,$request)
    {
        $students = $this->realEscapeArray($students);
        $request = $this->realEscapeObject($request);
        $eemValues = [];
        $eeValues = [];
        $markEnteringPersonColumn = "";
        if (empty($students)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Students can not be null");
        }
        if (empty($request->staffId) && empty($request->adminId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Staff can not be null");
        }
        else{
            $markEnteringPersonColumn = empty($request->staffId) ? "adminID" : "staffID";
            $markEnteringPersonId = empty($request->staffId) ? $request->adminId : $request->staffId;
        }
        if (empty($request->valuationCount)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Valuation count can not be null");
        }
        foreach ($students as $student) {
            if (empty($student->examId) || empty($student->studentId)) {
                throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER,"Some students have no valid data");
            }
            if($student->mark == "AB"){
                $isAbsent = 1;
            }elseif($student->mark == "MAL"){
                $isAbsent = 2;
            }
            else{
                $isAbsent = 0;
            }
            $eemValues[] = "('$student->examId','$student->studentId',".($student->mark ? $student->mark : 0).",$request->valuationCount)";
            if(!$isAbsent){
                $eeValues[] = "('$student->examId','$student->studentId',".($student->mark ? $student->mark : 0).",$markEnteringPersonId)";
            }
            $exAtt[] = "('$student->examId','$student->studentId','$isAbsent')";
        }
        try {
            
            if ($request->valuationCount == 1) {
                $eeValuesString = implode(", ",$eeValues);
                $sql = "INSERT INTO exammarks_external (examID, studentID, mark, $markEnteringPersonColumn) VALUES $eeValuesString ON DUPLICATE KEY UPDATE mark = VALUES(mark)";
                $exAttString = implode(", ",$exAtt);
                $sql2 = "INSERT INTO exam_attendance (examID, studentID, isAbsent) VALUES $exAttString ON DUPLICATE KEY UPDATE isAbsent = VALUES(isAbsent)";
                $this->executeQuery($sql);
                $this->executeQuery($sql2);
            }
            else {
                $eemValuesString = implode(", ",$eemValues);
                $sql = "INSERT INTO external_exammarks (examID, studentID, mark, valuationCount) VALUES $eemValuesString ON DUPLICATE KEY UPDATE mark = VALUES(mark)";
                $this->executeQuery($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return;
    }
    
    /**
     * method to get staffID of normalise_mark
     * @param Int batchID, subjectID
     * @return StaffID
     * @throws ProfessionalException
     * 
     */
    public function getStaffIDNormaliseMarkBySubjectIdAndBatchId($subjectID,$batchID)
    {   
        $batchID = $this->realEscapeString($batchID);
        $subjectID = $this->realEscapeString($subjectID);
        try {
            $sql = "SELECT 
                        staffID
                    FROM
                        normalise_marks
                    WHERE
                        subjectID = '$subjectID' AND batchID = '$batchID'
                    GROUP BY staffID";
            $staffID = $this->executeQueryForObject($sql)->staffID;
            return $staffID;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return false;
    }
    /**
     * Update or add new exam mark for ug students
     * 
     */
    public function saveUgStudentsExternalMark($students, $staffId)
    {
        $students = $this->realEscapeArray($students);
        $staffId = $this->realEscapeString($staffId);
        $eeValues = [];
        if (empty($students)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER, "Students can not be null");
        }
        if (empty($staffId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER, "Staff can not be null");
        }
        foreach ($students as $student) {
            if (empty($student->examId) || empty($student->studentId)) {
                throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER, "Some students have no valid data");
            }
            $eeValues[] = "('$student->examId','$student->studentId'," . ($student->externalMark ? $student->externalMark : 0) . ",$staffId," . ($student->isRevalued ? 1 : 0) . ")";
        }
        try {
            $eeValuesString = implode(", ", $eeValues);
            $sql = "INSERT INTO exammarks_external (examID, studentID, mark, staffID, isRevalued) VALUES $eeValuesString ON DUPLICATE KEY UPDATE mark = VALUES(mark), isRevalued = VALUES(isRevalued)";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return;
    }
    /**
     * Update or add new internal mark log
     * 
     */
    public function saveStudentInternalMarkLog($request)
    {
        $request = $this->realEscapeObject($request);
        $studentList = $request->studentList;
        $insertValues = [];
        date_default_timezone_set('Asia/Kolkata');
        $t=time();  
        try {
            foreach ($studentList as $student) {
                $student = (object) $student;
                if($student->internalMarks != $student->oldInternalMarks || $student->remarks != $student->oldRemarks){
                    $log = new StudentMarkEditLog();
                    $log->oldMark = $student->oldInternalMarks;
                    $log->newMark = $student->internalMarks;
                    $log->remarks = $student->remarks;
                    $log->markType = "INTERNAL_MARK";
                    $log->actionTakenTime = date("d-m-Y h:i A",$t);
                    $log->updatedStaffId = $_SESSION['adminID'];
                    $log->updatedStaffName = $request->staffName;
                    $log->updatedStaffType = "EXAM_CONTROLLER";
                    $log->menuName = $request->menu;
                    $log = json_encode($log);
                    $id = SecurityUtils::getRandomString();
                    $insertValues = "('$id',$request->subjectId,$request->batchId,$request->semId,'$student->studentID','[$log]','$request->staffId',now())";
                    if (!empty($insertValues)) {
                        // $insertValues = implode(",", $insertValues);
                        $sql = "INSERT INTO im_student_mark_edit_log (id,subjectId,batchId,semId,student_id,log,created_by,created_date)
                        VALUES $insertValues ON DUPLICATE KEY UPDATE `log` = JSON_MERGE(`log`,'$log'), updated_by = VALUES(created_by)";
                        $this->executeQuery($sql);
                    }
                    unset($log);
                    unset($insertValues);
                    unset($id);
                }
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return true;
    }
    /**
     * get Student InternalMark EditLog
     * 
     */
    public function getStudentInternalMarkEditLog($request)
    {
        $request = $this->realEscapeObject($request);
        try {
            $sql = "SELECT
                `log`
            FROM
                im_student_mark_edit_log
            WHERE
                student_id = '$request->studentID'
                AND subjectId = '$request->subjectID
                AND batchId = '$request->batchID'
                AND semId = '$request->semId'";
            $log = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $log;
    }
    /**
     * get Oe Exam Mark Confirmed Students
     * author sibin
     */
    public function getOeExamMarkConfirmedStudentByExam($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = "";
        if($request->studentId){
            $condition .= " AND oec.oe_users_id IN ($request->studentId)";
        }
        if ($request->reviewId) {
            $condition .= " AND oec.review_id IN ($request->reviewId)";
        }else{
            $condition .= " AND oec.review_id IS NULL";
        }
        if(!$request->revaluationId){
            $condition .=" AND oec.revaluation_id IS NULL";
        }
        $studentList = [];
        try {
            $sql = "SELECT
                    oe.id as oeExamId,oec.oe_users_id as studentId,efn.false_number as falseNumber,oec.is_confirmed as isConfirmed,oec.valuation_count as valuationCount,oec.review_id as reviewId
                FROM
                    oe_exams oe
                    INNER JOIN oe_exam_marks_confirm oec 
                        ON oec.oe_exams_id = oe.id
                    INNER JOIN examcontroller_false_number efn 
                        ON efn.examID = $request->examId AND efn.studentID = oec.oe_users_id
                WHERE
                    JSON_CONTAINS(oe.identifying_context,
                    '{\"examId\": \"$request->examId\"}') 
                    AND oec.is_confirmed = 1 AND oec.valuation_count = '$request->valuationCount$condition
                    GROUP BY oec.oe_users_id ORDER BY efn.false_number";
            $studentList = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $studentList;
    }
    /**
     * remove Oe Exam Mark Confirmed Student state
     * author sibin
     */
    public function removeConfirmedStatusOfOeExamMarkConfirmedStudent($request)
    {
        $request = $this->realEscapeObject($request);
        $condition ="";
        if($request->valuationType){
            if($request->valuationType == "valuer"){
                $condition .=" AND review_id IS NULL";
            }else if ($request->valuationType == "reviewer"){
                $condition .=" AND review_id = 1";
            }
        }
        if(!$request->revaluationId){
            $condition .=" AND revaluation_id IS NULL";
        }
        try {
            $sql = "UPDATE
                        oe_exam_marks_confirm
                        SET
                        is_confirmed = '0'
                        WHERE
                        oe_exams_id = '$request->oeExamId'
                        AND oe_users_id = '$request->studentId'
                        AND valuation_count = '$request->valuationCount$condition";
                $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return true;
    }
    /**
     * @author Sibin
     * get oe exam marks students mark finalized by examregid and subjectid
     */
    public function getExamMarkFinalizedOeStudentsMarkDetailsBySubject($request)
    {
        $request = $this->realEscapeObject($request);
        $externalMarksTableJoin = "LEFT";
        $externalMarksTable = "exammarks_external";
        if($request->isPg){
            $externalMarksTable = "externalexammarks_finalized";
        }
        if($request->showFinalizedMarksOnly){
            $externalMarksTableJoin = "INNER";
        }
        $sql = "SELECT distinct erss.studentID,sa.regNo,sa.studentName,e.examID,e.batchID,e.semID,e.subjectID,e.examTotalMarks,
                oe.id as oeExamId,oec1.exam_mark as mark1,oec1.is_confirmed as mark1Confirm,oec2.exam_mark as mark2,oec2.is_confirmed as mark2Confirm
                ,oec3.exam_mark as mark3,oec3.is_confirmed as mark3Confirm,ee.mark as markFinalized
                FROM exam_reg_studentsubject erss
                INNER JOIN exam_reg_studentchallan ersc ON ersc.studentID = erss.studentID AND ersc.examregID = erss.examregID
                INNER JOIN studentaccount sa ON sa.studentID = erss.studentID
                INNER JOIN exam_registration_batches erb ON erb.examregID = erss.examregID AND erb.batchID = sa.batchID
                INNER JOIN exam e ON e.examregID = erss.examregID AND e.subjectID = erss.subjectID AND e.batchID = sa.batchID AND e.semID = erb.semID
                INNER JOIN oe_exams oe ON JSON_UNQUOTE(JSON_EXTRACT(oe.identifying_context, '$.examId')) = e.examID
                LEFT JOIN oe_exam_marks_confirm oec1 ON oec1.oe_exams_id = oe.id AND oec1.oe_users_id = erss.studentID AND oec1.valuation_count = 1
                LEFT JOIN oe_exam_marks_confirm oec2 ON oec2.oe_exams_id = oe.id AND oec2.oe_users_id = erss.studentID AND oec2.valuation_count = 2
                LEFT JOIN oe_exam_marks_confirm oec3 ON oec3.oe_exams_id = oe.id AND oec3.oe_users_id = erss.studentID AND oec3.valuation_count = 3
                $externalMarksTableJoin JOIN $externalMarksTable ee ON ee.examID = e.examID AND ee.studentID = erss.studentID
                WHERE erss.examregID = '$request->examRegId' AND erss.subjectID = '$request->subjectId' AND e.examID = '$request->examId' AND ersc.paid=1 
                group by sa.studentID order by sa.regNo";
        try {
            $subjectStudents = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectStudents;
    }
     /**
     * @param $subjectId,examId
     * get third valuation students count
     */
    public function getThirdValuationStudentCount($request)
    {
        $request = $this->realEscapeObject($request);
        $examRegField = ($request->examType == ExamType::SUPPLY) ? "supply_examreg_id" : "examregID";
        $condition="";
        if($request->isRevaluation){
            $condition .=" AND etv.revaluationFlag = 1";
        }
        $result = null;
        $sql = " SELECT COUNT(thirdvalstudentID) as studentCount from externalexam_thirdvalstudents etv INNER JOIN exam ex ON(etv.examID = ex.examID ) WHERE ex.$examRegField = '$request->examRegId' and ex.subjectID = '$request->subjectId'
                    $condition";
        try {
            return $this->executeQueryForObject($sql)->studentCount;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    
    /**
     * To get student's internal added mark 
     * @param int $studentID
     * @param int $staffID
     * @param int $batchID
     * @param int $subjectID 
     */
    public function getNormaliseMarks($request)
    {
        $request = $this->realEscapeObject($request);
        $where = [];
        $request->batchId?$where[] = "batchID = '".$request->batchId."'":null; 
        $request->studentId?$where[] = "studentID = '".$request->studentId."'":null; 
        $request->semId?$where[] = "semID = '".$request->semId."'":null; 
        $request->subejctId?$where[] = "subejctID = '".$request->subejctId."'":null; 
        $request->staffId?$where[] = "staffID = '".$request->staffId."'":null; 
        $sql="SELECT markID, marksObtained, normalisedMark, percentage FROM normalise_marks 
        " . ($where ? " WHERE " . implode(' AND ', $where) : "") . " ";
        try{
            return $this->executeQueryForList($sql);
        }catch(\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    
    /**
     * To get student's internal mark rules
     * @param int $studentID
     * @param int $staffID
     * @param int $batchID
     * @param int $subjectID 
     */
    public function getNormaliseMarksRules($request)
    {
        $request = $this->realEscapeObject($request);
        $where = [];
        $request->batchId?$where[] = "batch_id = '".$request->batchId."'":null; 
        $request->semId?$where[] = "sem_id = '".$request->semId."'":null; 
        $request->subejctId?$where[] = "subject_id = '".$request->subejctId."'":null; 
        $sql="SELECT id,isAttendance,roundOffAttnPercent from normalization_rule3_subject 
        " . ($where ? " WHERE " . implode(' AND ', $where) : "") . " ";
        try{
            return $this->executeQueryForList($sql);
        }catch(\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * delete marks and update exam attendance on ab,mal
     * 
     */
    public function deleteStudentExamMarkAndUpdateAttendance($request)
    {
        $request = $this->realEscapeObject($request);
        try {
            $sql = "DELETE FROM externalexammarks_finalized WHERE examID = '$request->examId' AND  studentID = '$request->studentId'";
            $this->executeQuery($sql);
            $sql = "DELETE FROM exammarks_external WHERE examID = '$request->examId' AND  studentID = '$request->studentId'";
            $this->executeQuery($sql);
            $sql_absent = "INSERT INTO exam_attendance (examID, studentID, isAbsent) VALUES ('$request->examId','$request->studentId',1) ON DUPLICATE KEY UPDATE isAbsent = VALUES(isAbsent)";
            $this->executeQuery($sql_absent);
            $id = SecurityUtils::getRandomString();
            $log = json_encode($request->log);
            $sql = "INSERT INTO ec_student_mark_edit_log (id,exam_id,student_id,log,created_by,created_date)
            VALUES ('$id',$request->examId,'$request->studentId','[$log]','$request->staffId',now()) ON DUPLICATE KEY UPDATE `log` = JSON_MERGE(`log`,'$log'), updated_by = VALUES(created_by)";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return true;
    }
    /**
     * @param $examId,studentId
     * get pg Students External Marks By Exam
     */
    public function getStudentRvStatusPg($examId, $studentId)
    {
        $examId = $this->realEscapeString($examId);
        $studentId = $this->realEscapeString($studentId);
        $sql = "SELECT isRevalued from externalexammarks_finalized WHERE  examID =$examId and studentID =$studentId";
        try {
            $resposnse = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $resposnse[0]->isRevalued;
    }
    /**
     * delete marks and update exam attendance on ab,mal
     * 
     */
    public function resetStudentExamMarkAndUpdateAttendance($request)
    {
        $request = $this->realEscapeObject($request);
        try {
            $sql = "UPDATE externalexammarks_finalized set mark = 0 WHERE examID = '$request->examId' AND  studentID = '$request->studentId'";
            $this->executeQuery($sql);
            $sql = "UPDATE exammarks_external set mark = 0 WHERE examID = '$request->examId' AND  studentID = '$request->studentId'";
            $this->executeQuery($sql);
            $sql_absent = "INSERT INTO exam_attendance (examID, studentID, isAbsent) VALUES ('$request->examId','$request->studentId',1) ON DUPLICATE KEY UPDATE isAbsent = VALUES(isAbsent)";
            $this->executeQuery($sql_absent);
            $id = SecurityUtils::getRandomString();
            $log = json_encode($request->log);
            $sql = "INSERT INTO ec_student_mark_edit_log (id,exam_id,student_id,log,created_by,created_date)
            VALUES ('$id',$request->examId,'$request->studentId','[$log]','$request->staffId',now()) ON DUPLICATE KEY UPDATE `log` = JSON_MERGE(`log`,'$log'), updated_by = VALUES(created_by)";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return true;
    }
    /**
     * Update or add new/old exam mark log
     * 
     */
    public function saveStudentExamMarkLog($request)
    {
        if (is_array($request)) {
            $request = (object)$request;
        }
        $request = $this->realEscapeObject($request);
        if (!$request->log) {
            $request->log = $this->prepareLog($request);
            if(!$request->log){
                return false;
            }
        }
        $request->createdBy = $request->updatedStaffId ? $request->updatedStaffId : $_SESSION['adminID'];
        try {
            $id = SecurityUtils::getRandomString();
            $log = json_encode($request->log);
            $sql = "INSERT INTO ec_student_mark_edit_log (id,exam_id,student_id,log,created_by,created_date)
            VALUES ('$id',$request->examId,'$request->studentId','[$log]','$request->createdBy',now()) ON DUPLICATE KEY UPDATE `log` = JSON_MERGE(`log`,'$log'), updated_by = VALUES(created_by)";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return true;
    }
    public function prepareLog($request)
    {
        $log = new StudentMarkEditLog();
        $log->oldMark = $request->oldMark;
        $log->newMark = $request->mark;
        if($log->newMark != $log->oldMark){
            $log->remarks = $request->remarks ? $request->remarks : "DIRECT_MARK_ENTRY";
            $log->markType = $request->markType ? $request->markType : "EXTERNAL_MARK";
            $log->actionTakenTime = date("d-m-Y h:i A");
            $log->updatedStaffId = $request->updatedStaffId ? $request->updatedStaffId : $_SESSION['adminID'];
            $log->updatedStaffName = $request->updatingStaffName;
            $log->updatedStaffType = "EXAM_CONTROLLER";
            return $log;
        }else{
            return false;
        }
    }
    //get audit course pass details
    public function getAuditCoursePassDetails($request){
        $request = $this->realEscapeObject($request);
        try {
            $sql = "SELECT aud.studentID,aud.semID,aud.subjectID,aud.flag,sa.batchID as batchId FROM audit_course_student_pass_details aud 
                    INNER JOIN studentaccount sa ON sa.studentID = aud.studentID
                    where aud.semID=$request->semId and aud.subjectID =$request->subjectId AND sa.batchID = $request->batchId";
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    //delete audit course pass details
    public function deleteAuditCoursePassDetails($request){
        $request = $this->realEscapeObject($request);
        try {
            if($request->semId && $request->subjectId && $request->studentIds){
                $sql = "DELETE FROM audit_course_student_pass_details
                WHERE semID=$request->semId and subjectID =$request->subjectId AND studentID IN ($request->studentIds)";
                return $this->executeQueryForObject($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    //save audit course pass details
    public function saveAuditCoursePassDetails($entries){
        $entries = $this->realEscapeArray($entries);
        $entriesStr = implode(",",$entries);
        try {
            $sql = "INSERT INTO audit_course_student_pass_details (studentID,semID,subjectID,flag) VALUES $entriesStr";
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    //get eligible marks for external mark conversion
    public function getEligibleExternalMarksForConversion($request){
        $request = $this->realEscapeObject($request);
        $subjectIds = implode(',' ,$request->subjectIds);
        try {
            if($request->isPg){
                $tableName = "externalexammarks_finalized";
            }else{
                $tableName = "exammarks_external";
            }
            if($request->examType == "REGULAR"){
                $examRegField = "e.examregID";
            }else{
                $examRegField = "e.supply_examreg_id";
            }
            if($request->examRegId && $subjectIds ){
                $sql = "SELECT ee.examID,ee.studentID FROM $tableName ee
                        JOIN exam e ON ee.examID = e.examID
                        WHERE $examRegField = '$request->examRegId
                            AND e.semID IN ('$request->semId') 
                            AND e.subjectID IN ($subjectIds
                            AND COALESCE(ee.isRevalued, 0) = 0
                            AND COALESCE(e.examTotalMarks, 0) != 0
                            AND COALESCE(e.valuationMaxMark, 0) != 0";
                return $this->executeQueryForList($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    //convert external mark entry
    public function convertExternalMarks($request){
        $request = $this->realEscapeObject($request);
        $subjectIds = implode(',' ,$request->subjectIds);
        try {
            if($request->isPg){
                $tableName = "externalexammarks_finalized";
            }else{
                $tableName = "exammarks_external";
            }
            if($request->examType == "REGULAR"){
                $examRegField = "e.examregID";
            }else{
                $examRegField = "e.supply_examreg_id";
            }
            if($request->examRegId && $subjectIds ){
                $sql = "UPDATE $tableName ee
                        JOIN exam e ON ee.examID = e.examID
                        SET ee.mark = ROUND(CAST(ee.mark AS DECIMAL(5,2)) * CAST(e.examTotalMarks AS DECIMAL(5,2)) / CAST(e.valuationMaxMark AS DECIMAL(5,2))),ee.isRevalued =1
                        WHERE $examRegField = '$request->examRegId
                            AND e.semID IN ('$request->semId') 
                            AND e.subjectID IN ($subjectIds
                            AND COALESCE(ee.isRevalued, 0) = 0
                            AND COALESCE(e.examTotalMarks, 0) != 0
                            AND COALESCE(e.valuationMaxMark, 0) != 0";
                $result = $this->executeQueryForObject($sql,true);
                return $result;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    //check external mark entry
    public function checkExternalMarksSavedStatus($request){
        $request = $this->realEscapeObject($request);
        try {
            if($request->isPg){
                $tableName = "externalexammarks_finalized";
            }else{
                $tableName = "exammarks_external";
            }
            $sql = "SELECT mark from $tableName where examID IN ($request->examIds)";
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    //save student sgpa cgpa
    public function saveStudentSgpaCgpa($request){
        //$request = $this->realEscapeObject($request);
        try {
            if(!empty($request->sgpaInsertValues) && !empty($request->cgpaInsertValues)){
                //sgpa
                $sgpaStr = implode(",",$request->sgpaInsertValues);
                $sql = "INSERT INTO student_semwise_sgpa_regular (studentID,courseTypeID,batchID,semID,sgpa,lettergrade) VALUES $sgpaStr ON DUPLICATE KEY UPDATE sgpa = VALUES(sgpa),lettergrade = VALUES(lettergrade)";
                $this->executeQuery($sql);
                //cgpa
                $cgpaStr = implode(",",$request->cgpaInsertValues);
                $sql = "INSERT INTO student_final_cgpa_credits_regular (studentID,courseTypeID,batchID,semID,cgpa,overallgrade) VALUES $cgpaStr ON DUPLICATE KEY UPDATE cgpa = VALUES(cgpa),overallgrade = VALUES(overallgrade)";
                $this->executeQuery($sql);  
                return true;
            }else{
                return false;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
}