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 / 38
CRAP
0.00% covered (danger)
0.00%
0 / 1008
FalseNumberService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 38
25440.00
0.00% covered (danger)
0.00%
0 / 1008
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 1
 __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 / 4
 searchStudentFalseNumber
0.00% covered (danger)
0.00%
0 / 1
90.00
0.00% covered (danger)
0.00%
0 / 58
 getFalseNumber
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 41
 mapFalseNumber
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 66
 getMappedFalseNumber
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 21
 getStudentDetailsWithFalseNumberByBatchSemIdAndSubbatchId
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 53
 getExamRegisteredStudentFalseNumbers
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 24
 setFalseNumberStartRange
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 47
 getFalseNumberStartRange
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 setFalseNumbers
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 16
 getStudentsFalseNumberByBatchAndSubject
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 68
 getFalseNumberDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 19
 saveFalseNumberAlphaNumericCode
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 getFalseNumbersByExamRegistration
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 22
 saveStudentFalseNumbers
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 17
 getStudentFalseNumbersByExamRegistration
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 27
 getStudentsFalseNumberByBatchAndSubjectSem
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 68
 getFalseNumberSubjectDetails
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 24
 getSubjectGroupsExamRegistrationDetails
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 31
 getSubjectGroupsByExamRegDetails
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 30
 getFalseNumberBySubjectGroups
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 16
 saveStudentFalseNumbersWithAlphaNumericCodes
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 17
 getStudentFalseNumberDetailsWithpacketNoByExamSubjectRequest
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 37
 saveFolioNumberDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 getFolioNumberDetails
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 26
 deleteFolioNumber
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 saveStudentFolioNumber
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 15
 getBatchAssignedFolioNo
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getFalseNumbersByExams
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 14
 getFalseNumbersDetailsByStudentRegNo
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 30
 getMainBookNumberDetailsFromBookNo
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 16
 getGeneratedFalseNumbersByPrefix
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 18
 getGeneratedFalseNumbersByHall
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 15
 getFalseNumberDetailsByRequest
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 24
 getFalseNumberRangeAssignedForStaffByRequest
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 51
 getFalseNumbersByRequest
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 30
<?php
    namespace com\linways\core\ams\professional\service\examcontroller\falsenumber;
    use stdClass;
    use com\linways\core\ams\professional\service\BaseService;
    use com\linways\core\ams\professional\exception\ProfessionalException;
    use com\linways\core\ams\professional\service\SemesterService;
    use com\linways\core\ams\professional\constant\ExamType as ExamTypeConstant;
    use com\linways\core\ams\professional\constant\ExamType;   
    class FalseNumberService extends BaseService
    {
        private static $_instance = null;
        
        // /Condition 2 - Locked down the constructor
        private function __construct() {
        }
        // 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;
        }
        /**
         * 
         * @throws ProfessionalException
         * @return object|array|\com\linways\base\util\$objectList[]
         * @author Vishnu M
         */
        public function searchStudentFalseNumber ( $request ) { 
            $request = $this->realEscapeObject($request);
            $studentFalseNumber = [];
            $sql = null;
            $conditions = null;
            if ( $request->studentId ) {
                $conditions .= " AND ehas.studentID = $request->studentId ";
            }
            if ( $request->groupId ) {
                $conditions .= " AND ege.groupID = $request->groupId ";
            }
            if ( $request->hallId ) {
                $conditions .= " AND ehas.hallID = $request->hallId ";
            }
            if ( $request->examDate ) {
                $conditions .= " AND e.examDate = '$request->examDate";
            }
            if ( $request->examTypeId ) {
                $conditions .= " AND e.examTypeID = $request->examTypeId ";
            }
            if ( $request->unixStartTime && $request->endStartTime ) {
                $conditions .= " AND e.unixtime_start BETWEEN $request->unixStartTime AND $request->endStartTime ";
            }
            try {
                $sql = "SELECT 
                            sa.studentID AS studentId,
                            sa.regNo,
                            sa.studentName,
                            sa.myImage AS studentImage,
                            efn.false_number AS falseNumber,
                            e.examStartTime,
                            e.examEndTime
                        FROM
                            exam_group_exams ege
                                INNER JOIN
                            exam_hall_arranged_students ehas ON (ege.groupID = ehas.groupID
                                AND ege.examID = ehas.examID)
                                INNER JOIN
                            exam e ON (e.examID = ege.examID)
                                INNER JOIN
                            batches b ON (b.batchID = e.batchID)
                                INNER JOIN
                            subjects s ON (s.subjectID = e.subjectID)
                                INNER JOIN
                            studentaccount sa ON (ehas.studentID = sa.studentID)
                                INNER JOIN
                            examcontroller_false_number efn ON (efn.studentID = ehas.studentID
                                AND ehas.examID = efn.examID)
                        WHERE
                            sa.studentID IS NOT NULL 
                            $conditions 
                        ORDER BY sa.regNo ASC";
                $studentFalseNumber = $this->executeQueryForList($sql);
            }
            catch (\Exception $e) {
                throw new ProfessionalException ( $e->getCode(), $e->getMessage() );   
            }
            return $studentFalseNumber;
        }
        /**
         * @param FalseNoRequest $request
         * @return Object List|null
         * @throws ProfessionalException
         * @author Vishnu M
         */
        public function getFalseNumber ( $request ) {
            $request = $this->realEscapeObject($request);
            $conditions = null;
            if ( $request->studentId ) {
                $conditions .= " AND ecfn.studentID = '$request->studentId";
            }
            if ( $request->examRegId ) {
                $conditions .= " AND ecfn.examregID = '$request->examRegId";
            }
            else if ( $request->examSupplyId ) {
                $conditions .= " AND ecfn.exam_supplementary_id = '$request->examSupplyId";
            }
            if ( $request->examId ) {
                $conditions .= " AND ecfn.examID = '$request->examId";
            }
            if ( $request->batchId ) {
                $conditions .= " AND sa.batchID = '$request->batchId";
            }
            $sql = null;
            $falseNoList = null;
            try {
                $sql = "SELECT 
                            sa.studentID AS studentId,
                            sa.studentName,
                            sa.regNo,
                            ecfn.false_number AS falseNo,
                            ecfn.examregID AS examRegId,
                            ecfn.exam_supplementary_id AS examSupplyId,
                            ecfn.examID AS examId 
                        FROM 
                            examcontroller_false_number ecfn
                                INNER JOIN 
                            studentaccount sa ON sa.studentID = ecfn.studentID
                        WHERE 
                            ecfn.false_number IS NOT NULL
                            $conditions ORDER BY sa.regNo ASC";
                $falseNoList = $this->executeQueryForList($sql);
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
            return $falseNoList;
        }
/**
         * @param FalseNoRequest $request
         * @return Object List|null
         * @throws ProfessionalException
         * @author Sibin
         */
        public function mapFalseNumber($request){
            $request = $this->realEscapeObject($request);
            $examId=$request->examId;
            $examRegId=$request->examRegId;
            $studentList=$request->studentList;
            $isSupply= (int)$request->isSupply;
            $valueString="";
            $isExist="";
            $sqlUpdate='';
            $mapFalseNumber = null;
            if($isSupply){
                $examregColumn ="exam_supplementary_id";
            }
            else{
                $examregColumn ="examregID";
            }
            foreach($studentList as $student){
                $studentId=$student['studentID'];
                $falseNumber=$student['falseNumber'];
                if($falseNumber){
                    $sqlIsExist = "SELECT id,studentID from examcontroller_false_number
                                    where studentID='$studentId'
                                    and examID='$examId'
                                    and $examregColumn ='$examRegId'";
                try {
                    $isExist=$this->executeQueryForObject($sqlIsExist);
                } catch (\Exception $e) {
                    throw new ProfessionalException($e->getCode(), $e->getMessage());
                }
                //upadte entry
                if($isExist){
                    $sqlUpdate = "UPDATE examcontroller_false_number 
                                SET false_number ='$falseNumber'
                                where studentID='$studentId'
                                    and examID='$examId'
                                    and $examregColumn ='$examRegId'";
                            try {
                                $update=$this->executeQueryForObject($sqlUpdate);
                                $mapFalseNumber=true;
                            } catch (\Exception $e) {
                                throw new ProfessionalException($e->getCode(), $e->getMessage());
                            }
                }
                //insert  entry
                else{
                    if($valueString){
                        $valueString = $valueString . ",('$studentId','$falseNumber','$examRegId','$examId')";
                    }else{
                        $valueString = $valueString . "('$studentId','$falseNumber','$examRegId','$examId')";
                    }
                }
            }
            else{
                continue;
            }
                
                
               
            }
            $sql = null;
            if($valueString){
                try {
                    $sql = "INSERT into examcontroller_false_number(studentID,false_number,$examregColumn,examID)
                                values $valueString";
                    $this->executeQueryForObject($sql);
                    $mapFalseNumber=true;
                } catch (\Exception $e) {
                    throw new ProfessionalException($e->getCode(), $e->getMessage());
                }
            }
            
            return $mapFalseNumber;
        }
 
/**
         * @param examRegId,examId
         * @return  $studentList
         * @throws ProfessionalException
         * @author Sibin
         */
        public function getMappedFalseNumber($examRegId,$examId,$isSupply){
            $examRegId = $this->realEscapeString($examRegId);
            $examId = $this->realEscapeString($examId);
            $isSupply = (int)$this->realEscapeString($isSupply);
            if($isSupply){
                $examRegColumn="exam_supplementary_id";
            }
            else{
                $examRegColumn="examregID";
            }
            
            $studentList=[];
            $sql = null;
            try {
                $sql = "SELECT id,studentID,false_number as falseNumber,$examRegColumn,examID from examcontroller_false_number
                            where examID='$examId'
                            and $examRegColumn='$examRegId'";
               $studentList= $this->executeQueryForList($sql);
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
            return $studentList;
        }             
        
/*
    *get student list with false number
    * @param integer $batchID
    * @param integer $semID
    * @param integer $subbatchID
    * @param string $sortByColumn
    * @return $studentList
    */
    public function getStudentDetailsWithFalseNumberByBatchSemIdAndSubbatchId($batchID, $semID, $subbatchID = 0, $sortByColumn = 'regNo',$examRegId,$examId, $subjectId,$registeredStudentsOnly, $getAttendedStudentsOnly = false)
    {
        $sql = $joinExamReg = "";
        if($registeredStudentsOnly){
            $joinExamReg .="INNER JOIN exam_reg_studentchallan ersc
                                ON ersc.examregID ='$examRegId' AND ersc.studentID = sa.studentID AND ersc.paid =1
                            INNER JOIN exam_reg_studentsubject erss 
                                ON erss.examregID = ersc.examregID AND erss.studentID = sa.studentID AND erss.subjectID = '$subjectId'";
        }
        if ($getAttendedStudentsOnly) {
            $joinExamReg .= "INNER JOIN exam_attendance ea
                                ON ea.examID ='$examId' AND ea.studentID = sa.studentID AND ea.isAbsent = '0'";
        }
        if ($subbatchID) {
            $sql = "SELECT  DISTINCT (sa.studentID), sa.studentName,sa.batchID,sa.rollNo,sa.admissionNo,sa.regNo
                        from  studentaccount sa 
                            inner join subbatch_student ss 
                                on sa.studentID = ss.studentID 
                            inner join batches ba 
                                on  ba.batchID = sa.batchID  
                            inner join semesters sem 
                                on sem.semID = ba.semID 
                            inner join semesters joinedSem 
                                on sa.joiningSemId = joinedSem.semID  
                            $joinExamReg
                            where sa.batchID=$batchID 
                            and ss.subbatchID IN ($subbatchID
                            and joinedSem.orderNo <= sem.orderNo 
                            -- and efn.examregID='$examRegId'
                            -- and efn.examID = '$examId'
                            ORDER BY sa.$sortByColumn ASC";
        } else {
            $sql = "SELECT  DISTINCT (sa.studentID), sa.studentName,sa.batchID,sa.rollNo,sa.admissionNo,sa.regNo
                            from  studentaccount sa  
                                inner join batches ba 
                                    on  ba.batchID = sa.batchID  
                                inner join semesters sem 
                                    on sem.semID = ba.semID 
                                inner join semesters joinedSem 
                                    on sa.joiningSemId = joinedSem.semID  
                                $joinExamReg
                                where sa.batchID=$batchID 
                                and joinedSem.orderNo <= sem.orderNo
                                -- and efn.examregID='$examRegId'
                                -- and efn.examID = '$examId
                                ORDER BY sa.$sortByColumn ASC";
        }
        
        try {
            $studentList = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $studentList;
    }
    /**
     * @author Sibin
     */
    public function getExamRegisteredStudentFalseNumbers($examType, $examRegId, $batchId, $studentId)
    {
        $examType = $this->realEscapeString($examType);
        $examRegId = $this->realEscapeString($examRegId);
        $batchId = $this->realEscapeString($batchId);
        $studentId = $this->realEscapeString($studentId);
        $falseNumberDetails = [];
        if ($examType == ExamTypeConstant::REGULAR) {
            $sql = "SELECT e.examID,s.subjectID,s.subjectName,s.subjectDesc,e.examregID,e.supply_examreg_id,efn.false_number from exam e
                        INNER JOIN subjects s ON s.subjectID= e.subjectID
                        LEFT JOIN examcontroller_false_number efn ON efn.examID = e.examID AND efn.studentID = '$studentId' AND efn.examregID = e.examregID
                        WHERE e.examregID = '$examRegId' and e.batchID = '$batchId' order by e.examID";
        } else if ($examType == ExamTypeConstant::SUPPLY) {
            $sql = "SELECT e.examID,s.subjectID,s.subjectName,s.subjectDesc,e.examregID,e.supply_examreg_id,efn.false_number from exam e
                        INNER JOIN subjects s ON s.subjectID= e.subjectID
                        LEFT JOIN examcontroller_false_number efn ON efn.examID = e.examID AND efn.studentID = '$studentId' AND efn.exam_supplementary_id = e.supply_examreg_id
                        WHERE e.supply_examreg_id = '$examRegId' and e.batchID = '$batchId' order by e.examID";
        }
        try {
            $falseNumberDetails = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $falseNumberDetails;
    }
    /** 
     * @author sibin
     * set false number range
     */
    public function setFalseNumberStartRange($isSupply, $examRegId, $falseNoStart, $adminId){
        $isSupply = $this->realEscapeString($isSupply);
        $examRegId = $this->realEscapeString($examRegId);
        $falseNoStart = $this->realEscapeString($falseNoStart);
        $adminId = $this->realEscapeString($adminId);
        $result = 0;
        $isExist = "";
        $isExistFalseNoSql="";
        $isExistFalseNo="";
        //check fale no generated or not
        if($isSupply){
            $isExistFalseNoSql = "SELECT exam_supplementary_id from examcontroller_false_number
                    where exam_supplementary_id='$examRegId'";
        }else{
            $isExistFalseNoSql = "SELECT examRegId from examcontroller_false_number
                    where examRegId='$examRegId'";
        }
        try {
            $isExistFalseNo = $this->executeQueryForObject($isExistFalseNoSql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        if($isExistFalseNo){
            $result=2;
            return $result;
        }
        //check if already exist if yes update
        $isExistSql = "SELECT examRegId,isSupply,falseNumberStart 
                    from false_number_range
                    where examRegId='$examRegId' AND isSupply='$isSupply'";
        try {
            $isExist = $this->executeQueryForObject($isExistSql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        if($isExist){
            $sql = "UPDATE false_number_range set falseNumberStart='$falseNoStart',updated_by='$adminId
                        WHERE examRegId='$examRegId' AND isSupply='$isSupply'";
        }else{
            $sql = "INSERT into false_number_range(examRegId,isSupply,falseNumberStart,created_by)
                    values($examRegId,$isSupply,$falseNoStart,$adminId)";
        }
        try {
            $this->executeQueryForObject($sql);
            $result = 1;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $result;
    } 
    /** 
     * @author sibin
     * get false number range
     */
    public function getFalseNumberStartRange($isSupply, $examRegId){
        $isSupply = $this->realEscapeString($isSupply);
        $examRegId = $this->realEscapeString($examRegId);
        $flaseNumberDetails="";
        $sql = "SELECT examRegId,isSupply,falseNumberStart 
                    from false_number_range
                    where examRegId='$examRegId' AND isSupply='$isSupply'";
        try {
            $flaseNumberDetails = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $flaseNumberDetails;
    }
    /** 
     * @author sibin
     *set false numbers
     */
    public function setFalseNumbers($isSupply,$insertRegularStr)
    {
        //$insertRegularStr = $this->realEscapeString($insertRegularStr);
        $isSupply = $this->realEscapeString($isSupply);
        $result=0;
        if($isSupply){
            $sql = "INSERT into examcontroller_false_number (studentID, false_number, examID, exam_supplementary_id) values $insertRegularStr";
        }else{
            $sql = "INSERT into examcontroller_false_number (studentID, false_number, examID, examregID) values $insertRegularStr";
        }
        try {
            $this->executeQueryForObject($sql);
            $result=1;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $result;
    }
    /** 
     * @author sibin
     *get students false numbers by batch and subject
     */
    public function getStudentsFalseNumberByBatchAndSubject($examregId,$examSupplyRegId, $isSupply, $batchId, $examId, $limit)
    {
        $isSupply = $this->realEscapeString($isSupply);
        $examregId = $this->realEscapeString($examregId);
        $examSupplyRegId = $this->realEscapeString($examSupplyRegId);
        $batchId = $this->realEscapeString($batchId);
        $examId = $this->realEscapeString($examId);
        $limit = $this->realEscapeString($limit);
        $condition="";
        if( $batchId){
            $condition .="AND sa.batchID='$batchId'";
        }
        if($examId){
            $condition .="AND efn.examID='$examId'";
        }
        $subjectStudents = [];
        if ($isSupply==1) {
            $sql = "SELECT sa.studentName,sa.regNo,sa.studentAccount,sa.batchID,b.batchName,efn.examID,es.supplyDesc as examregName,efn.false_number,b.batchName,e.examCode,e.examName,e.examDate
                        from studentaccount sa,exam_supplementary es,examcontroller_false_number efn,batches b,exam e
                        WHERE efn.examID=e.examID 
                        AND    sa.batchID = b.batchID
                        AND sa.studentID = efn.studentID
                        AND es.id = efn.exam_supplementary_id 
                        AND b.batchID = e.batchID
                        AND efn.exam_supplementary_id ='$examSupplyRegId'
                        $condition
                        order by efn.false_number,sa.batchID,e.examID
                        $limit";
        } elseif($isSupply == 0) {
            $sql = "SELECT sa.studentName,sa.regNo,sa.studentAccount,sa.batchID,b.batchName,efn.examID,er.examregName as examregName,efn.false_number,b.batchName,e.examCode,e.examName,e.examDate
                        from studentaccount sa,exam_registration er,examcontroller_false_number efn,batches b,exam e
                        WHERE efn.examID=e.examID 
                        AND    sa.batchID = b.batchID
                        AND sa.studentID = efn.studentID
                        AND er.examregID = efn.examregID
                        AND b.batchID = e.batchID
                        AND efn.examregID ='$examregId'  
                        $condition
                        order by efn.false_number,sa.batchID,e.examID
                        $limit";
        }
        else{
            $sql="(SELECT sa.studentName,sa.regNo,sa.studentAccount,sa.batchID,b.batchName,efn.examID,es.supplyDesc as examregName,efn.false_number,b.batchName,e.examCode,e.examName,e.examDate
                        from studentaccount sa,exam_supplementary es,examcontroller_false_number efn,batches b,exam e
                        WHERE efn.examID=e.examID 
                        AND    sa.batchID = b.batchID
                        AND sa.studentID = efn.studentID
                        AND es.id = efn.exam_supplementary_id 
                        AND b.batchID = e.batchID
                        AND efn.exam_supplementary_id ='$examSupplyRegId'
                        $condition
                        order by sa.batchID,e.examID, sa.regNo) union (SELECT sa.studentName,sa.regNo,sa.studentAccount,sa.batchID,b.batchName,efn.examID,er.examregName as examregName,efn.false_number,b.batchName,e.examCode,e.examName,e.examDate
                        from studentaccount sa,exam_registration er,examcontroller_false_number efn,batches b,exam e
                        WHERE efn.examID=e.examID 
                        AND    sa.batchID = b.batchID
                        AND sa.studentID = efn.studentID
                        AND er.examregID = efn.examregID
                        AND b.batchID = e.batchID
                        AND efn.examregID ='$examregId'  
                        $condition
                        order by efn.false_number,sa.batchID,e.examID)$limit";
        }
        try {
            $subjectStudents= $this->executeQueryForList($sql);
            
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectStudents;
    }
    /**
     * @param FalseNo
     * @return Object List|null
     * @throws ProfessionalException
     */
    public function getFalseNumberDetails ( $falseNumber ) {
        $falseNumber = $this->realEscapeString($falseNumber);
        $sql = null;
        try {
            $sql = "SELECT 
                        studentID AS studentId,
                        examregID AS examRegId,
                        exam_supplementary_id AS examSupplyId,
                        examID AS examId 
                    FROM 
                        examcontroller_false_number
                    WHERE 
                        false_number ='$falseNumber'
                        ";
                $falseNoList = $this->executeQueryForObject($sql);
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
            return $falseNoList;
        }
        /** 
         *inert alpha_numeric_code
        */
        public function saveFalseNumberAlphaNumericCode($studentId,$examId,$alpha_numeric_code)
        {
            $studentId = $this->realEscapeString($studentId);
            $examId = $this->realEscapeString($examId);
            $alpha_numeric_code = $this->realEscapeString($alpha_numeric_code);
            $result=0;
                $sql = "UPDATE examcontroller_false_number set alpha_numeric_code = '$alpha_numeric_code' WHERE studentID=$studentId and examID=$examId";
          
            try {
                $this->executeQueryForObject($sql);
                $result=1;
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
            return $result;
        }
    /**
     * @param FalseNo
     * @return Object List|null
     * @throws ProfessionalException
     */
    public function getFalseNumbersByExamRegistration($request)
    {
        $request = $this->realEscapeObject($request);
        $sql = null;
        $result=[];
        if ($request->isSupply == 1) {
            $sql = "SELECT 
                        examID from examcontroller_false_number  where exam_supplementary_id  = '$request->examSupplyRegId'";
        } else if ($request->isSupply == 2) {
            $sql = "SELECT 
                        examID from examcontroller_false_number  where examregID  = '$request->examRegId' OR exam_supplementary_id  = '$request->examSupplyRegId'";
        } 
        else {
            $sql= "SELECT 
                        examID from examcontroller_false_number where examregID  = '$request->examRegId'";
        }
        try {
            $result = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $result;
    }
    /** 
     * @author sibin
     *set false numbers
     */
    public function saveStudentFalseNumbers($regularDetails, $supplyDetails )
    {
        //$insertRegularStr = $this->realEscapeString($insertRegularStr);
        $insertRegularStr = implode(",", $regularDetails);
        $insertSupplyStr = implode(",", $supplyDetails);
        try {
            if (!empty($supplyDetails)) {
                $sql = "INSERT into examcontroller_false_number (studentID, false_number, examID, exam_supplementary_id) values $insertSupplyStr";
                $this->executeQueryForObject($sql);
            }
            if (!empty($regularDetails)) {
                $sql = "INSERT into examcontroller_false_number (studentID, false_number, examID, examregID) values $insertRegularStr";
                $this->executeQueryForObject($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return true;
    }
    /** 
     * @author sibin
     *set false numbers
     */
    public function getStudentFalseNumbersByExamRegistration($request)
    {
        $request = $this->realEscapeObject($request);
        $studentList=[];
        if ($request->startIndex !== "" && $request->startIndex !== null) {
            if ($request->startIndex !== "" && $request->recordsPerPage) {
                $limitCondition = " LIMIT $request->startIndex , $request->recordsPerPage ";
            }
        }
        try {
            if ($request->examRegId) {
                $sql = "SELECT t1.studentName,t2.examregName as examName,t3.false_number,t1.regNo,t1.studentAccount,t4.batchName, t5.examCode, t5.examName, t5.examDate 
                        FROM studentaccount t1,exam_registration t2, examcontroller_false_number t3,batches t4, exam t5 where t3.examID = t5.examID and t1.batchID = t4.batchID and
                        t1.studentID = t3.studentID and t2.examregID = t3.examregID and t1.batchID = t4.batchID and t4.batchID = t5.batchID  and t3.examregID= $request->examRegId order by t1.regNo,t5.examID  $limitCondition";
                $studentList = $this->executeQueryForList($sql);
            }
            if ($request->examSupplyRegId) {
                $sql = "SELECT t1.studentName,t2.supplyDesc as examName,t3.false_number,t1.regNo,t1.studentAccount,t4.batchName, t5.examCode, t5.examName, t5.examDate 
                        FROM studentaccount t1,exam_supplementary t2, examcontroller_false_number t3,batches t4, exam t5 where t3.examID = t5.examID and t1.batchID = t4.batchID and t1.studentID = t3.studentID and 
                        t2.id = t3.exam_supplementary_id and t1.batchID = t4.batchID and t4.batchID = t5.batchID  and t3.exam_supplementary_id = $request->examSupplyRegId order by t1.regNo,t5.examID $limitCondition";
                $this->executeQueryForObject($sql);
                $studentList = array_merge($studentList, $this->executeQueryForList($sql));
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $studentList;
    }
    
    /** 
     *get students false numbers by batch and subject
     */
    public function getStudentsFalseNumberByBatchAndSubjectSem($examregId,$examSupplyRegId, $isSupply, $batchId, $examId, $limit)
    {
        $isSupply = $this->realEscapeString($isSupply);
        $examregId = $this->realEscapeString($examregId);
        $examSupplyRegId = $this->realEscapeString($examSupplyRegId);
        $batchId = $this->realEscapeString($batchId);
        $examId = $this->realEscapeString($examId);
        $limit = $this->realEscapeString($limit);
        $condition="";
        if( $batchId){
            $condition .="AND sa.batchID='$batchId'";
        }
        if($examId){
            $condition .="AND efn.examID='$examId'";
        }
        $subjectStudents = [];
        if ($isSupply==1) {
            $sql = "SELECT sa.studentName,sa.regNo,sa.studentAccount,sa.batchID,b.batchName,efn.examID,es.supplyDesc as examregName,efn.false_number,b.batchName,e.examCode,e.examName,e.examDate
                        from studentaccount sa,exam_supplementary es,examcontroller_false_number efn,batches b,exam e
                        WHERE efn.examID=e.examID 
                        AND    sa.batchID = b.batchID
                        AND sa.studentID = efn.studentID
                        AND es.id = efn.exam_supplementary_id 
                        AND b.batchID = e.batchID
                        AND efn.exam_supplementary_id ='$examSupplyRegId'
                        $condition
                        order by sa.batchID,e.examID
                        $limit";
        } elseif($isSupply == 0) {
            $sql = "SELECT sa.studentName,sa.regNo,sa.studentAccount,sa.batchID,b.batchName,efn.examID,er.examregName as examregName,efn.false_number,b.batchName,e.examCode,e.examName,e.examDate
                        from studentaccount sa,exam_registration er,examcontroller_false_number efn,batches b,exam e
                        WHERE efn.examID=e.examID 
                        AND    sa.batchID = b.batchID
                        AND sa.studentID = efn.studentID
                        AND er.examregID = efn.examregID
                        AND b.batchID = e.batchID
                        AND efn.examregID ='$examregId'  
                        $condition
                        order by sa.batchID,e.examID
                        $limit";
        }
        else{
            $sql="(SELECT sa.studentName,sa.regNo,sa.studentAccount,sa.batchID,b.batchName,efn.examID,es.supplyDesc as examregName,efn.false_number,b.batchName,e.examCode,e.examName,e.examDate
                        from studentaccount sa,exam_supplementary es,examcontroller_false_number efn,batches b,exam e
                        WHERE efn.examID=e.examID 
                        AND    sa.batchID = b.batchID
                        AND sa.studentID = efn.studentID
                        AND es.id = efn.exam_supplementary_id 
                        AND b.batchID = e.batchID
                        AND efn.exam_supplementary_id ='$examSupplyRegId'
                        $condition
                        order by sa.batchID,e.examID, sa.regNo) union (SELECT sa.studentName,sa.regNo,sa.studentAccount,sa.batchID,b.batchName,efn.examID,er.examregName as examregName,efn.false_number,b.batchName,e.examCode,e.examName,e.examDate
                        from studentaccount sa,exam_registration er,examcontroller_false_number efn,batches b,exam e
                        WHERE efn.examID=e.examID 
                        AND    sa.batchID = b.batchID
                        AND sa.studentID = efn.studentID
                        AND er.examregID = efn.examregID
                        AND b.batchID = e.batchID
                        AND efn.examregID ='$examregId'  
                        $condition
                        order by sa.batchID,e.examID)$limit";
        }
        try {
            $subjectStudents= $this->executeQueryForList($sql);
            
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectStudents;
    }
    /**
     * @param FalseNo
     * @return Object List|null
     * @throws ProfessionalException
     */
    public function getFalseNumberSubjectDetails($falseNumber,$isSupply)
    {
        $falseNumber = $this->realEscapeString($falseNumber);
        $isSupply = $this->realEscapeString($isSupply);
        $examRegIdField = $isSupply ? "supply_examreg_id": "examregID";
        $sql = null;
        try {
            $sql = "SELECT 
                        efn.studentID AS studentId,
                        efn.examID AS examId,
                        e.subjectID as subjectId,
                        e.$examRegIdField as examRegId,
                        e.batchID
                    FROM 
                        examcontroller_false_number efn
                        INNER JOIN exam e ON e.examID = efn.examID
                    WHERE 
                        efn.false_number ='$falseNumber'
                        ";
            $falseNoList = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $falseNoList;
    }
    /**
     * @param request
     * @return Object List|null
     * @throws ProfessionalException
     * author sibin
     */
    public function getSubjectGroupsExamRegistrationDetails($examRegistrationDetailsRequest)
    {
        $examRegistrationDetailsRequest = $this->realEscapeObject($examRegistrationDetailsRequest);
        $examRegistrationDetails = null;
        $courseTypeCondition = $sqlRegular = $sqlSupply = "";
        if ($examRegistrationDetailsRequest->courseTypeId) {
            $courseTypeCondition = " AND b.courseTypeID = $examRegistrationDetailsRequest->courseTypeId ";
        }
        $sqlRegular = "SELECT DISTINCT er.examregID AS id,er.examregName AS name,'REGULAR' AS examType FROM exam_registration er 
                        INNER JOIN exam_registration_batches erb ON er.examregID = erb.examregID 
                        INNER JOIN batches b ON erb.batchID = b.batchID 
                        INNER JOIN assignstaff_exam_group_relation aegr ON aegr.exam_registration_id = er.examregID
                        WHERE er.examregID = er.examregID $courseTypeCondition ORDER BY er.examYear DESC";
        $sqlSupply = "SELECT DISTINCT es.id AS id,es.supplyDesc AS name,'SUPPLY' AS examType FROM exam_supplementary es 
                        LEFT JOIN supply_improve_batches sib ON es.id = sib.exam_supplementary_id 
                        INNER JOIN batches b ON sib.batchID = b.batchID 
                        INNER JOIN assignstaff_exam_group_relation aegr ON aegr.exam_supplementary_id = es.id
                        WHERE es.id = es.id $courseTypeCondition ORDER BY es.examYear DESC";
        try {
            if ($examRegistrationDetailsRequest->examType == ExamType::REGULAR) {
                $examRegistrationDetails->REGULAR = $this->executeQueryForList($sqlRegular);
            } else if ($examRegistrationDetailsRequest->examType == ExamType::SUPPLY) {
                $examRegistrationDetails->SUPPLY = $this->executeQueryForList($sqlSupply);
            } else if ($examRegistrationDetailsRequest->examType == ExamType::BOTH) {
                $examRegistrationDetails->REGULAR = $this->executeQueryForList($sqlRegular);
                $examRegistrationDetails->SUPPLY = $this->executeQueryForList($sqlSupply);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $examRegistrationDetails;
    }
    /**
     * @param request
     * @return Object List|null
     * @throws ProfessionalException
     * author sibin
     */
    public function getSubjectGroupsByExamRegDetails($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = $sql = "";
        $subjectGroups = [];
        try {
            if ($request->examType == ExamType::REGULAR) {
                $condition = " aegr.exam_registration_id IN ($request->examRegId)";
            } else if ($request->examType == ExamType::SUPPLY) {
                $condition = " aegr.exam_supplementary_id IN ($request->supplyRegId)";
            } else if ($request->examType == ExamType::BOTH) {
                if ($request->examRegId) {
                    $condition .= " aegr.exam_registration_id IN ($request->examRegId)";
                }
                if ($request->supplyRegId) {
                    $condition .= " OR 
                              aegr.exam_supplementary_id IN ($request->supplyRegId)";
                }
            }
            $sql = "SELECT distinct aegr.assignstaff_exam_groupname_id as subjectGroupId ,aeg.group_name as groupName,aeg.examTypeFlag,
                        aegr.exam_id as examId,aegr.subjects_id as subjectId,s.subjectName,s.subjectDesc
                        FROM assignstaff_exam_group_relation aegr
                        INNER JOIN assignstaff_exam_groupname aeg ON aeg.id = aegr.assignstaff_exam_groupname_id
                        INNER JOIN subjects s ON s.subjectID = aegr.subjects_id
                        WHERE $condition GROUP BY aegr.assignstaff_exam_groupname_id";
            $subjectGroups = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectGroups;
    }
    /**
     * @param request
     * @return Object List|null
     * @throws ProfessionalException
     * author sibin
     */
    public function getFalseNumberBySubjectGroups($request)
    {
        $request = $this->realEscapeObject($request);
        $sql = "";
        $falseNumbers = [];
        try {
            $sql = "SELECT efn.studentID as studentId,sa.regNo,sa.studentName,sa.myImage,efn.false_number as falseNumber,efn.examID as examId,aegr.subjects_id as subjectId
                    FROM examcontroller_false_number efn 
                    INNER JOIN assignstaff_exam_group_relation aegr ON aegr.exam_id = efn.examID
                    INNER JOIN studentaccount sa ON sa.studentID = efn.studentID
                    WHERE aegr.assignstaff_exam_groupname_id IN ($request->groupId) order by sa.regNo,efn.examID";
            $falseNumbers = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return  $falseNumbers;
    }
    /** 
     * @author sibin
     *set false numbers with alpha numeric codes
     */
    public function saveStudentFalseNumbersWithAlphaNumericCodes($regularDetails, $supplyDetails)
    {
        //$insertRegularStr = $this->realEscapeString($insertRegularStr);
        $insertRegularStr = implode(",", $regularDetails);
        $insertSupplyStr = implode(",", $supplyDetails);
        try {
            if (!empty($supplyDetails)) {
                $sql = "INSERT into examcontroller_false_number (studentID, false_number, examID, exam_supplementary_id,alpha_numeric_code) values $insertSupplyStr";
                $this->executeQueryForObject($sql);
            }
            if (!empty($regularDetails)) {
                $sql = "INSERT into examcontroller_false_number (studentID, false_number, examID, examregID,alpha_numeric_code) values $insertRegularStr";
                $this->executeQueryForObject($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return true;
    }
    /** 
     * @author sibin
     *get StudentFalseNumberDetailsWithpacketNoByExamSubjectRequest
     */
    public function getStudentFalseNumberDetailsWithpacketNoByExamSubjectRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $sql = "";
        $studentList = [];
        $examRegField = $request->isSupply ? "supply_examreg_id" : "examregID";
        $externalMarkTable = $request->isPg ? "externalexammarks_finalized" : "exammarks_external";
        $condition = "";
        if($request->subjectId){
            $condition .= " AND e.subjectID IN ($request->subjectId";
        }
        if($request->batchId){
            $condition .= " AND e.batchID IN ($request->batchId";
        }
        if ($request->packetNo) {
            $packetNoValues = "";
            foreach ($request->packetNo as $packetNo) {
                $packetNoValues .= $packetNoValues ? ",\"$packetNo\"" : "\"$packetNo\"";
            }
            $request->packetNo = $packetNoValues;
            $condition .= " AND evps.packetNo IN ($request->packetNo";
        }
        $joinPacketsTable =  $request->leftJoinPackets ? ' LEFT JOIN '  : ' INNER JOIN ';
        try {
            $sql = "SELECT sa.studentID,sa.regNo,sa.studentName,evps.packetNo,efn.false_number as falseNumber,efn.alpha_numeric_code as alphaNumericCode,ee.mark 
                        FROM examcontroller_false_number efn
                        $joinPacketsTable examValuationStudentPacketsRelation evps ON evps.examId = efn.examID AND evps.studentId = efn.studentID
                        INNER JOIN exam e ON e.examID = efn.examID
                        INNER JOIN studentaccount sa ON sa.studentID = efn.studentID
                        LEFT JOIN $externalMarkTable ee ON ee.studentID = efn.studentID AND ee.examID = efn.examID
                        WHERE e.$examRegField IN ($request->examRegId)
                        $condition ORDER BY sa.regNo";
            $studentList = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $studentList;
    }
        /**
         * save folio number
         * @param courseType
         * @param batchStartYear
         * @throws ProfessionalException
         */
        public function saveFolioNumberDetails ( $courseType, $batchStartYear, $folioStart ) {
            $courseType = $this->realEscapeString($courseType);
            $batchStartYear = $this->realEscapeString($batchStartYear);
            $folioStart = $this->realEscapeString($folioStart);
            $sql = null;
            $condition = null;
            try {
                $sql = "INSERT INTO folioNumber_prefix (courseTypeID, year, prefix) VALUES($courseType$batchStartYear$folioStart)";
                $falseNoList = $this->executeQuery($sql);
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
            return $falseNoList;
        }
        /**
         * get folio number
         * @param courseType
         * @param batchStartYear
         * @throws ProfessionalException
         */
        public function getFolioNumberDetails ( $courseType, $batchStartYear ) {
            $courseType = $this->realEscapeString($courseType);
            $batchStartYear = $this->realEscapeString($batchStartYear);
            $sql = null;
            $condition = null;
            if($courseType){
                $condition .= " AND ct.courseTypeID = $courseType";
            }
            if($batchStartYear){
                $condition .= " AND fnp.year = $batchStartYear";
            }
            try {
                $sql = "SELECT 
                        fnp.id, fnp.prefix, fnp.year, fnp.courseTypeID, ct.course_Type, ct.typeName
                    FROM 
                        folioNumber_prefix fnp
                    LEFT JOIN course_type ct ON (ct.courseTypeID = fnp.courseTypeID)
                    WHERE
                        1=1 
                        $condition 
                        ";
                $falseNoList = $this->executeQueryForList($sql);
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
            return $falseNoList;
        }
        /**
         * delete folio number
         * @param id
         * @throws ProfessionalException
         */
        public function deleteFolioNumber ($id) {
            $id = $this->realEscapeString($id);
            $sql = null;
            try {
                $sql = "DELETE FROM folioNumber_prefix WHERE id = $id";
                $falseNoList = $this->executeQuery($sql);
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
            return $falseNoList;
        }
          /**
         * save folio number
         * @param id
         * @throws ProfessionalException
         */
        public function saveStudentFolioNumber ( $batchId, $batchStartYear, $studentId,$batchPriority,$folioNo ) {
            $batchId = $this->realEscapeString($batchId);
            $batchStartYear = $this->realEscapeString($batchStartYear);
            $studentId = $this->realEscapeString($studentId);
            $batchPriority = $this->realEscapeString($batchPriority);
            $folioNo = $this->realEscapeString($folioNo);
            $sql = null;
            $condition = null;
            try {
                $sql = "INSERT INTO generate_batchFolioNumber
                (batchID, batchPriority, studentID, folioNumber, `year`) VALUES($batchId$batchPriority$studentId$folioNo$batchStartYear)";
                return $this->executeQuery($sql);
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
        }
           /**
         * get folio number
         * @param courseType
         * @param batchStartYear
         * @throws ProfessionalException
         */
        public function getBatchAssignedFolioNo ( $batchIds) {
            $batchIds = $this->realEscapeString($batchIds);
            $sql = null;
            try {
                $sql = "SELECT folioNumber FROM generate_batchFolioNumber WHERE batchID IN ($batchIds)
                        ";
                $folioList = $this->executeQueryForList($sql);
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
            return $folioList;
        }
    /**
     * @param examIds
     * @return Object List|null
     * @throws ProfessionalException
     */
    public function getFalseNumbersByExams($request)
    {
        $request = $this->realEscapeObject($request);
        $sql = null;
        $result = [];       
        try {
            if($request->examIds){
                $sql = "SELECT false_number  as falseNumber from examcontroller_false_number where examID IN ($request->examIds)";
                $result = $this->executeQueryForList($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $result;
    }
    /**
     * @param request
     * @return Object List|null
     * @throws ProfessionalException
     */
    public function getFalseNumbersDetailsByStudentRegNo($request)
    {
        $request = $this->realEscapeObject($request);
        $sql = null;
        $result = [];
        try {
            if ($request->regNo) {
                $sql = "SELECT efn.studentID,sa.regNo,sa.studentName,e.batchID as batchId,b.batchName,e.semID as semId,
                        IF(e.examregID,er.examregName,es.supplyDesc) as examRegName,IF(e.examregID,'REGULAR',es.supplyDesc) as examType,
                        e.subjectID as subjectId,s.subjectName,s.subjectDesc,efn.examID,efn.false_number as falseNumber,ba.batchName as currentBatch,
                        ex.examregID as regularExamRegId,erx.examregName AS regularExamRegName
                        FROM examcontroller_false_number efn 
                        INNER JOIN studentaccount sa ON sa.studentID = efn.studentID
                        INNER JOIN exam e ON e.examID = efn.examID
                        INNER JOIN subjects s ON s.subjectID = e.subjectID
                        INNER JOIN batches b ON b.batchID = e.batchID
                        LEFT JOIN exam_registration er ON er.examregID = e.examregID
                        LEFT JOIN exam_supplementary es ON es.id = e.supply_examreg_id
                        LEFT JOIN batches ba ON ba.batchID = sa.batchID
                        LEFT JOIN exam ex ON ex.semID = e.semID AND ex.batchID = e.batchID AND ex.subjectID = e.subjectID AND ex.examregID IS NOT NULL
                        LEFT JOIN exam_registration erx ON erx.examregID = ex.examregID
                        WHERE sa.regNo='$request->regNo'
                        ORDER BY e.semID,e.subjectID,
                        IF(CAST(es.examYear AS SIGNED) = 0, 99999, CAST(es.examYear AS SIGNED)) ,IF(CAST(es.examMonth AS SIGNED) = 0, 99999, CAST(es.examMonth AS SIGNED))";
                $result = $this->executeQueryForList($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $result;
    }
    /**
     * Get main book number details
     * @param bookNo
     * @return Object List|null
     * @throws ProfessionalException
     */
    public function getMainBookNumberDetailsFromBookNo ( $bookNo ) {
        $bookNo = $this->realEscapeString($bookNo);
        $sql = null;
        try {
            $sql = "SELECT 
                        studentID AS studentId,
                        examID AS examId 
                    FROM 
                        ec_main_book_number
                    WHERE 
                        bookNo ='$bookNo'";
                $mainBookDetails = $this->executeQueryForObject($sql);
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $mainBookDetails;
    }
    /**
     * get false numbers 
     * @request
     */
    public function getGeneratedFalseNumbersByPrefix($request)
    {
        $request = $this->realEscapeObject($request);
        $condition ="";
        if(!$request->considerAllExamTypes){
            $condition .= " AND examregID NOT IN (0)";
        }
        $sql = null;
        try {
            $sql = "SELECT studentID,false_number,examregID,examID FROM examcontroller_false_number 
                    WHERE 1=1 
                    AND false_number LIKE '$request->prefixString%'  $condition
                    ORDER BY false_number ASC";
            $falseNoList = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $falseNoList;
    }
    /**
     * get false numbers 
     * @request
     */
    public function getGeneratedFalseNumbersByHall($request)
    {
        $request = $this->realEscapeObject($request);
        $sql = null;
        try {
            $sql = "SELECT t1.studentID, t2.studentName, t2.rollNo, t2.regNo, t3.false_number, t1.examID, t2.myImage,t3.alpha_numeric_code,t2.batchID,t1.seatNo,s.subjectName,s.subjectDesc
                    from exam_hall_arranged_students t1, studentaccount t2, examcontroller_false_number t3 
                    inner join exam e on e.examID = t3.examID
                    inner join subjects s on s.subjectID = e.subjectID
                    where t1.groupID='$request->groupID' and t1.hallID ='$request->hallID' and t1.studentID =t2.studentID and t2.batchID ='$request->batchID' and t1.studentID=t3.studentID and t1.examID=t3.examID and t2.studentID=t3.studentID order by t1.seatNo ASC";
            $falseNoList = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $falseNoList;
    }
    /**
     * @param FalseNo
     * @return Object List|null
     * @throws ProfessionalException
     */
    public function getFalseNumberDetailsByRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $sql = null;
        $condition = "";
        if($request->subjectId){
            $condition .= " AND e.subjectID IN ($request->subjectId)";
        }
        try {
            $sql = "SELECT 
                        efn.studentID AS studentId,
                        efn.examregID AS examRegId,
                        efn.exam_supplementary_id AS examSupplyId,
                        efn.examID AS examId 
                    FROM 
                        examcontroller_false_number efn
                        INNER JOIN exam e ON e.examID = efn.examID
                    WHERE 
                        efn.false_number = '$request->falseNumber$condition";
            $falseNoList = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $falseNoList;
    }
    /**
     * @param request
     * @return Object List|null
     * @throws ProfessionalException
     */
    public function getFalseNumberRangeAssignedForStaffByRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $sql = null;
        $condition = "";
        $falseNoRange= "";
        if((int)$request->isSupply){
            $examRegIdField = "exam_supplementary_id";
            $subjectFiled = "evss.subjectId";
        }else{
            $examRegIdField = "examregID";
            $subjectFiled = "erss.subjectID";
        }
        if ($request->examRegId) {
            $condition .= " AND erss.$examRegIdField IN ($request->examRegId)";
        }
        if ($request->subjectId) {
            $condition .= " AND $subjectFiled IN ($request->subjectId)";
        }
        if ($request->valuationCount) {
            $condition .= " AND evss.valuationCount IN ($request->valuationCount)";
        }
        if ($request->staffId) {
            $condition .= " AND evss.staffId IN ($request->staffId)";
        }
        try {
            if((int)$request->isSupply){
                $sql ="SELECT  MIN(CAST(efn.false_number AS CHAR)) AS startingFalseNumber,MAX(CAST(efn.false_number AS CHAR)) AS endingFalseNumber  FROM exam_supplementary_student_subjects erss
                INNER JOIN exam_supplementary_student_details ersc ON ersc.exam_supplementary_id = erss.exam_supplementary_id AND ersc.studentID= erss.studentID
                INNER JOIN exam ex ON ex.examID = erss.examID
                INNER JOIN examValuationStaffAssignedStudents evss ON evss.examRegId = erss.exam_supplementary_id AND evss.subjectId = ex.subjectID AND evss.studentId = erss.studentID
                INNER JOIN staffaccounts sa ON sa.staffID = evss.staffId
                INNER JOIN studentaccount s ON s.studentID = ersc.studentID
                INNER JOIN exam e ON e.supply_examreg_id = erss.exam_supplementary_id AND e.subjectID = evss.subjectId AND e.batchID = s.batchID
                INNER JOIN examcontroller_false_number efn ON efn.studentID = s.studentID AND efn.examID = e.examID
                WHERE ersc.paid=1 AND evss.examType = 'SUPPLY' $condition";
            }else{
                $sql = "SELECT  MIN(CAST(efn.false_number AS CHAR)) AS startingFalseNumber,MAX(CAST(efn.false_number AS CHAR)) AS endingFalseNumber  FROM exam_reg_studentsubject erss
                INNER JOIN exam_reg_studentchallan ersc ON ersc.examregID = erss.examregID AND ersc.studentID= erss.studentID
                INNER JOIN examValuationStaffAssignedStudents evss ON evss.examRegId = erss.examregID AND evss.subjectId = erss.subjectID AND evss.studentId = erss.studentID
                INNER JOIN staffaccounts sa ON sa.staffID = evss.staffId
                INNER JOIN studentaccount s ON s.studentID = ersc.studentID
                INNER JOIN exam e ON e.examregID = erss.examregID AND e.subjectID = erss.subjectID AND e.batchID = s.batchID
                INNER JOIN examcontroller_false_number efn ON efn.studentID = s.studentID AND efn.examID = e.examID
                WHERE ersc.paid=1 AND evss.examType = 'REGULAR' $condition";
            }
            $falseNoRange = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $falseNoRange;
    }
        /**
     * @param request
     * @return Object List|null
     * @throws ProfessionalException
     */
    public function getFalseNumbersByRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $sql = null;
        $condition = "";
        if($request->regularExamRegId){
            $condition .= " AND efn.examregID IN ($request->regularExamRegId)";
        }
        if(is_array($request->studentIds)){
            $request->studentIds = implode(",",$request->studentIds);
        }
        if($request->studentIds){
            $condition .= " AND efn.studentID IN ($request->studentIds)";
        }
        try {
            $sql = "SELECT 
                        efn.studentID AS studentId,
                        efn.false_number as falseNumber,
                        efn.examregID AS examRegId,
                        efn.exam_supplementary_id AS examSupplyId 
                    FROM 
                        examcontroller_false_number efn
                        INNER JOIN exam e ON e.examID = efn.examID
                    WHERE 
                        1=1 $condition GROUP BY efn.studentID";
            $falseNoList = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $falseNoList;
    }
}
?>