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 / 18
CRAP
0.00% covered (danger)
0.00%
0 / 496
QuizAndSurveyService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 18
4692.00
0.00% covered (danger)
0.00%
0 / 496
 __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
 getAllQuizesOfAStudent
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 63
 getAllQuizesBySBS
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getQuizDetailsById
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getQuizAttendedStudentDetails
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 117
 getQuizQuestionsAndAnswersByQuizid
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getTotalScoreOfAStudentInAQuiz
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 20
 getAllQuizOfAStaff
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 19
 getTotalPointsOfAQuiz
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getAllStudentMarksAndCoReportOfABatchAndSemester
0.00% covered (danger)
0.00%
0 / 1
156.00
0.00% covered (danger)
0.00%
0 / 70
 getQuizAttendedStudentList
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 14
 getAllQuizzesBySbsId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 30
 studentMarksDetails
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 44
 getConsolidatedQuizReport
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 38
 getQuizzesSubectwise
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 27
 getMaxQuestionsInQuiz
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 7
<?php
namespace com\linways\core\ams\professional\service;
use com\linways\core\ams\professional\service\BaseService;
use com\linways\core\ams\professional\service\BatchService;
use com\linways\core\ams\professional\exception\ProfessionalException;
use com\linways\core\ams\professional\mapper\QuizAndSurveyServiceMapper;
use com\linways\core\ams\professional\request\SearchStudentRequest;
use com\linways\core\ams\professional\service\StudentService;
class QuizAndSurveyService 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 = QuizAndSurveyServiceMapper::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;
    }
    /**
     * 
     *
     * @param [int] $studentId
     * @return array
     */
    public function getAllQuizesOfAStudent($studentId){
        $sql = "";
        $quizList = [];
        $studentId = $this->realEscapeString($studentId);
        $sql = "SELECT 
        q.quizID AS id,
        q.quizName AS name,
        q.quizDesc AS description,
        q.timeLImit AS timeLimit,
        q.subjectID AS subjectId,
        sub.subjectName AS subjectName,
        sub.subjectDesc as subjectDescription,
        sem.semName as semesterName,
        sr.staffID AS staffId,
        sa.staffName,
        q.subbatchIDs AS subbatchIds,
        COUNT(qs.answerID) AS answered,
        IF(qsas.is_attended IS NOT NULL
                AND qsas.is_attended != 0,
            1,
            0) AS isAttended,
        TIMESTAMPDIFF(MINUTE,
            FROM_UNIXTIME(qsas.timeStart),
            FROM_UNIXTIME(qsas.timeEnd)) AS timeTakenByStudent
    FROM
        quiz q
            INNER JOIN
        subjects sub ON sub.subjectID = q.subjectID
            INNER JOIN
        sbs_relation sr ON sr.sbsID = q.sbsID
            AND sr.subjectID = q.subjectID
            AND q.unlocked = 1
            INNER JOIN
        semesters sem ON sr.semID = sem.semID
            INNER JOIN
            staffaccounts sa ON sa.staffID = sr.staffID
            INNER JOIN
        studentaccount sta ON sta.batchID = sr.batchID
            AND sta.studentID = '$studentId'
            LEFT JOIN
        quiz_quiz_questions qqq ON qqq.quizID = q.quizID
            LEFT JOIN
        quiz_studentanswer qs ON qs.studentID = sta.studentID
            AND qs.quizquestID = qqq.quizquestID
            LEFT JOIN
        quiz_student_answer_starttime qsas ON qsas.studentID = sta.studentID
            AND qsas.quizID = q.quizID
    GROUP BY q.quizID
    ORDER BY qsas.is_attended ASC";
            try{
                $quizList = $this->executeQueryForList($sql);
            }catch(\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        foreach($quizList as $key => $quiz){
            
            $sql = "select subbatchID from subbatch_student where subbatchID IN($quiz->subbatchIds) AND studentID = $studentId";
            $response = $this->executeQueryForObject($sql);
            if((empty($response) && $quiz->subbatchIds != "0")){
                array_splice($quizList,$key,1);
                continue;
            }
            // if($quiz->timeTakenByStudent >= $quiz->timeLimit){
            //     $quiz->isAttended = 1;
            // }
        }
        return $quizList;
    }
    public function getAllQuizesBySBS($subjectId, $batchId, $semId) {
        $sql = "";
        $quizList = [];
        $sql = "SELECT quizID, quizName FROM quiz WHERE sbsID in (SELECT sbsID FROM sbs_relation WHERE subjectID = '".$subjectId."' AND batchID = '".$batchId."' AND semID = '".$semId."')";
        try{
            $quizList = $this->executeQueryForList($sql);
        } catch(\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $quizList;
    }
    public function getQuizDetailsById($quizId)
    {
        $quizId = $this->realEscapeString($quizId);
        
        $sql = "SELECT quizID, quizName, quizDesc, deptID, q.subjectID, q.sbsID, passPercentage, timeLImit, immediate_result, show_correctans, unlocked, subbatchIDs, startDate, startTime, endDate, endTime, noOfQuestionsPerPage, is_question_shuffle, isFinalised, sr.batchID, sr.semID FROM quiz q inner join sbs_relation sr ON sr.sbsID = q.sbsID where quizID = ".$quizId."";
        
        try {
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getQuizAttendedStudentDetails($quizId, $sortByColumn = 'rollNo')
    {
        $quizId = $this->realEscapeString($quizId);
        $sortByColumn = $this->realEscapeString($sortByColumn);
        $quiz = $this->getQuizDetailsById($quizId);
        
        if(empty($sortByColumn)){
            try{
                $sortByColumn = BatchService::getInstance()->getStudentSortByColumnOfABatch($quiz->batchID);
            }catch(\Exception $e){
                $sortByColumn = 'rollNo';
            }
        }
        if(!empty($quiz))
        {
            $isCurrentSem = SemesterService::getInstance()->isCurrentSemester($quiz->batchID, $quiz->semID);
            $semDetails = SemesterService::getInstance()->getSemDetailsBySemId($quiz->semID);
            
            if(!empty($quiz->subbatchIDs))
            {
                // subbatch
                if($isCurrentSem)
                {
                    $sql = "select q.quizID, q.quizName, q.subjectID, q.sbsID, q.timeLimit, q.subbatchIDs, sta.studentID, sta.studentAccount, sta.studentName, sta.admissionNo, sta.regNo, sta.rollNo, qqq.quizquestID, qqq.questionID, qqq.question_order,qsq.question, qqqsta.answerID, qqqsta.answer, qqqsta.point FROM  quiz q
                        INNER JOIN
                    sbs_relation sr ON sr.sbsID = q.sbsID
                        AND sr.subjectID = q.subjectID
                        inner join subbatches sub on find_in_set(sub.subbatchID, q.subbatchIDs) and sub.batchID = sr.batchID inner join
                        subbatch_student ss on sub.subbatchID = ss.subbatchID inner join
                    studentaccount sta ON sta.batchID = sr.batchID and ss.studentID = sta.studentID
                    inner join semesters sem on sem.semID = sta.joiningSemId
                    left join quiz_quiz_questions qqq ON qqq.quizID = q.quizID
                    left join quiz_subject_questions qsq on qsq.questionID = qqq.questionID
                    left join quiz_studentanswer qs ON qs.studentID = sta.studentID
                    AND qs.quizquestID = qqq.quizquestID
                    left join quiz_quiz_question_answers qqqsta on qqqsta.answerID = qs.answerID and qqqsta.quizquestID = qs.quizquestID
                        LEFT JOIN
                    quiz_student_answer_starttime qsas ON qsas.studentID = sta.studentID
                        AND qsas.quizID = q.quizID where q.quizID = ".$quizId." and sem.orderNo <= ".$semDetails->orderNo." order by sta.$sortByColumn, qqq.questionID;";
                }
                else
                {
                    $sql = "select q.quizID, q.quizName, q.subjectID, q.sbsID, q.timeLimit, q.subbatchIDs, sta.studentID, sta.studentAccount, sta.studentName, sta.admissionNo, sta.regNo, sta.rollNo, qqq.quizquestID, qqq.questionID, qqq.question_order,qsq.question, qqqsta.answerID, qqqsta.answer, qqqsta.point FROM  quiz q
                        INNER JOIN
                    sbs_relation sr ON sr.sbsID = q.sbsID
                        AND sr.subjectID = q.subjectID
                        inner join subbatches sub on find_in_set(sub.subbatchID, q.subbatchIDs) and sub.batchID = sr.batchID inner join
                        subbatch_student ss on sub.subbatchID = ss.subbatchID inner join
                    studentaccount sta ON ss.studentID = sta.studentID
                    inner join semesters sem on sem.semID = sta.joiningSemId
                    left join quiz_quiz_questions qqq ON qqq.quizID = q.quizID
                    left join quiz_subject_questions qsq on qsq.questionID = qqq.questionID
                    left join quiz_studentanswer qs ON qs.studentID = sta.studentID
                    AND qs.quizquestID = qqq.quizquestID
                    left join quiz_quiz_question_answers qqqsta on qqqsta.answerID = qs.answerID and qqqsta.quizquestID = qs.quizquestID
                        LEFT JOIN
                    quiz_student_answer_starttime qsas ON qsas.studentID = sta.studentID
                        AND qsas.quizID = q.quizID where q.quizID = ".$quizId." and sem.orderNo <= ".$semDetails->orderNo." and sta.studentID in (select sa.studentID from studentaccount sa inner join batches ba on sa.batchID =  ba.batchID inner join semesters joinedSem on sa.joiningSemId = joinedSem.semID where ba.batchID = ".$quiz->batchID." and joinedSem.orderNo <= ".$semDetails->orderNo." union select sa.studentID from failed_students fs left join studentaccount sa on fs.studentID= sa.studentID inner join semesters fsem on fsem.semID = fs.failedInSemester inner join semesters joinedSem on sa.joiningSemId = joinedSem.semID where previousBatch = ".$quiz->batchID." and fsem.orderNo > ".$semDetails->orderNo." and joinedSem.orderNo <= ".$semDetails->orderNo.") order by sta.$sortByColumn, qqq.questionID;";
                }
            }
            else
            {
                if($isCurrentSem)
                {
                    $sql = "select q.quizID, q.quizName, q.subjectID, q.sbsID, q.timeLimit, q.subbatchIDs, sta.studentID, sta.studentAccount, sta.studentName, sta.admissionNo, sta.regNo, sta.rollNo, qqq.quizquestID, qqq.questionID, qqq.question_order,qsq.question, qqqsta.answerID, qqqsta.answer, qqqsta.point FROM  quiz q
                        INNER JOIN
                    sbs_relation sr ON sr.sbsID = q.sbsID
                        AND sr.subjectID = q.subjectID
                        inner join
                    studentaccount sta ON sta.batchID = sr.batchID 
                    inner join semesters sem on sem.semID = sta.joiningSemId
                    left join quiz_quiz_questions qqq ON qqq.quizID = q.quizID
                    left join quiz_subject_questions qsq on qsq.questionID = qqq.questionID
                    left join quiz_studentanswer qs ON qs.studentID = sta.studentID
                    AND qs.quizquestID = qqq.quizquestID
                    left join quiz_quiz_question_answers qqqsta on qqqsta.answerID = qs.answerID and qqqsta.quizquestID = qs.quizquestID
                        LEFT JOIN
                    quiz_student_answer_starttime qsas ON qsas.studentID = sta.studentID
                        AND qsas.quizID = q.quizID where q.quizID = ".$quizId." and sem.orderNo <= ".$semDetails->orderNo." order by sta.$sortByColumn, qqq.questionID";
                    
                }
                else 
                {
                    $sql = "select * from (select q.quizID, q.quizName, q.subjectID, q.sbsID, q.timeLimit, q.subbatchIDs, sta.studentID, sta.studentAccount, sta.studentName, sta.admissionNo, sta.regNo, sta.rollNo, qqq.quizquestID, qqq.questionID, qqq.question_order,qsq.question, qqqsta.answerID, qqqsta.answer, qqqsta.point FROM  quiz q
                        INNER JOIN
                    sbs_relation sr ON sr.sbsID = q.sbsID
                        AND sr.subjectID = q.subjectID
                        inner join
                    studentaccount sta ON sta.batchID = sr.batchID
                    inner join semesters sem on sem.semID = sta.joiningSemId
                    left join quiz_quiz_questions qqq ON qqq.quizID = q.quizID
                    left join quiz_subject_questions qsq on qsq.questionID = qqq.questionID
                    left join quiz_studentanswer qs ON qs.studentID = sta.studentID
                    AND qs.quizquestID = qqq.quizquestID
                    left join quiz_quiz_question_answers qqqsta on qqqsta.answerID = qs.answerID and qqqsta.quizquestID = qs.quizquestID
                        LEFT JOIN
                    quiz_student_answer_starttime qsas ON qsas.studentID = sta.studentID
                        AND qsas.quizID = q.quizID where q.quizID = ".$quizId." and sem.orderNo <= ".$semDetails->orderNo." union select q.quizID, q.quizName, q.subjectID, q.sbsID, q.timeLimit, q.subbatchIDs, sta.studentID, sta.studentAccount, sta.studentName, sta.admissionNo, sta.regNo, sta.rollNo, qqq.quizquestID, qqq.questionID, qqq.question_order,qsq.question, qqqsta.answerID, qqqsta.answer, qqqsta.point FROM  quiz q
                        INNER JOIN
                    sbs_relation sr ON sr.sbsID = q.sbsID
                        AND sr.subjectID = q.subjectID
                        inner join
                    failed_students fs on fs.previousBatch = sr.batchID inner join studentaccount sta ON sta.studentID = fs.studentID 
                    inner join semesters fsem on fs.failedInSemester = fsem.semID
                    inner join semesters sem on sem.semID = sta.joiningSemId
                    left join quiz_quiz_questions qqq ON qqq.quizID = q.quizID
                    left join quiz_subject_questions qsq on qsq.questionID = qqq.questionID
                    left join quiz_studentanswer qs ON qs.studentID = sta.studentID
                    AND qs.quizquestID = qqq.quizquestID
                    left join quiz_quiz_question_answers qqqsta on qqqsta.answerID = qs.answerID and qqqsta.quizquestID = qs.quizquestID
                        LEFT JOIN
                    quiz_student_answer_starttime qsas ON qsas.studentID = sta.studentID
                        AND qsas.quizID = q.quizID where q.quizID = ".$quizId." and sem.orderNo <= ".$semDetails->orderNo." and fs.previousBatch = ".$quiz->batchID." and fsem.orderNo > ".$semDetails->orderNo." ) as students order by $sortByColumn, questionID";
                }
            }
        }
        
        try {
            return $this->executeQueryForList($sql, $this->mapper[QuizAndSurveyServiceMapper::GET_QUIZ_ATTENDED_STUDENTS]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getQuizQuestionsAndAnswersByQuizid($quizId)
    {
        $quizId = $this->realEscapeString($quizId);
        
        $sql = "SELECT qsq.questionID, qsq.question, answerID, answer, point FROM quiz_subject_questions qsq inner join quiz_quiz_questions qqq on qsq.questionID =qqq.questionID left join quiz_quiz_question_answers qqqa on qqqa.quizquestID = qqq.quizquestID where qqq.quizID = ".$quizId." order by qqq.question_order,qsq.questionID, answerID";
        
        try {
            return $this->executeQueryForList($sql, $this->mapper[QuizAndSurveyServiceMapper::GET_QUIZ_QUESTIONS]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getTotalScoreOfAStudentInAQuiz($studentId, $quizId){
        $quizId = $this->realEscapeString($quizId);
        $studentId = $this->realEscapeString($studentId);
        $totalpoint = null;
        $questionIdsList = [];
        $sql = "SELECT quizquestID as questionId  from quiz_quiz_questions where quizID=$quizId";
        $questionIdsList = $this->executeQueryForList($sql);
        foreach($questionIdsList as $quizquestID)        
        {
            $sql="SELECT sum(t2.point) as totalPoint from quiz_studentanswer t1, quiz_quiz_question_answers t2 where t1.quizquestID=\"$quizquestID->questionId\" and t1.studentID=\"$studentId\" and t2.answerID = t1.answerID";
            $tempTotalPoint = $this->executeQueryForObject($sql)->totalPoint;
            if($tempTotalPoint != null){
                $totalpoint += $tempTotalPoint;
            }
            
        }
        if($totalpoint<0)
        {
            $totalpoint=0;
        }
        return $totalpoint;
    }
    /**
     * Undocumented function
     *
     * @param [type] $batchID
     * @param [type] $semID
     * @param [type] $subjectId
     * @param [type] $staffID
     * @return void
     */
    public function getAllQuizOfAStaff($batchID, $semID, $subjectId, $staffID){
        $batchID = $this->realEscapeString($batchID);
        $semID = $this->realEscapeString($semID);
        $subjectId = $this->realEscapeString($subjectId);
        $staffID = $this->realEscapeString($staffID);
        $batchDetails = BatchService::getInstance()->getBatchDetails($batchID);
        $sql ="select t1.sbsID, t2.deptID from sbs_relation t1, batches t2 where t1.staffID='$staffID' and t1.subjectID='$subjectId' and t1.batchID='$batchID' and t2.batchID = t1.batchID and t1.semID = ".$semID."";
        try{
            $sbsId = $this->executeQueryForObject($sql)->sbsID;
        }catch(\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        $sql = "SELECT quizID, quizName, quizDesc, passPercentage, timeLImit, immediate_result, show_correctans, unlocked, subbatchIDs, startDate, startTime, endDate, endTime, noOfQuestionsPerPage FROM quiz where deptID=\"$batchDetails->deptId\" and subjectID=\"$subjectId\" and sbsID=\"$sbsId\" ORDER BY quizID desc";
        try{
            $quizList = $this->executeQueryForList($sql);
        }catch(\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $quizList;
    }
    public function getTotalPointsOfAQuiz($quizId){
        $quizId = $this->realEscapeString($quizId);
        $sql = "SELECT quizquestID as questionId  from quiz_quiz_questions where quizID=$quizId";
        $questionIdsList = $this->executeQueryForList($sql);
        foreach($questionIdsList as $questionId){
            $tempPoint = 0;
            $sql = "select max(point) as maxPoint from quiz_quiz_question_answers where quizquestID=$questionId->questionId";
            $maxpoint += $this->executeQueryForObject($sql)->maxPoint;
        }
        return $maxpoint;
    }
    /**
     * Undocumented function
     *
     * @param [type] $batchID
     * @param [type] $semID
     * @param [type] $subjectId
     * @param integer $subbatchID
     * @param string $sortByColumn
     * @return void
     */
    public function getAllStudentMarksAndCoReportOfABatchAndSemester($batchID, $semID, $subjectId, $staffID, $subbatchID = 0, $sortByColumn = "rollNo"){
            $batchID = $this->realEscapeString($batchID);
            $semID = $this->realEscapeString($semID);
            $subjectId = $this->realEscapeString($subjectId);
            $staffID = $this->realEscapeString($staffID);
            $subbatchID = $this->realEscapeString($subbatchID);
            $sortByColumn = $this->realEscapeString($sortByColumn);
            $batchDetails = BatchService::getInstance()->getBatchDetails($batchID);
            $sql ="select t1.sbsID, t2.deptID from sbs_relation t1, batches t2 where t1.staffID='$staffID' and t1.subjectID='$subjectId' and t1.batchID='$batchID' and t2.batchID = t1.batchID and t1.semID = ".$semID."";
            $sbsId = $this->executeQueryForObject($sql)->sbsID;
            $sql = "SELECT quizID, quizName, quizDesc, passPercentage, timeLImit, immediate_result, show_correctans, unlocked, subbatchIDs, startDate, startTime, endDate, endTime, noOfQuestionsPerPage FROM quiz where deptID=\"$batchDetails->deptId\" and subjectID=\"$subjectId\" and sbsID=\"$sbsId\" ORDER BY quizID desc";
            $quizList = $this->executeQueryForList($sql);
            try{
                $studentList = StudentService::getInstance()->getAllStudentsOfABatchByBatchIdSemIdAndSubbatchId($batchID, $semID, $subbatchID, $sortByColumn);
            }catch(\Exception $e){
                $studentList = null;
            }
            if(empty($studentList)){
                return null;
            }
        foreach ($studentList as $student) {
            $student->quizes = [];
            foreach($quizList as $quiz){
                $student->quizes[$quiz->quizID] = new \StdClass();
                $student->quizes[$quiz->quizID]->totalPoint = $this->getTotalScoreOfAStudentInAQuiz($student->studentID, $quiz->quizID);
                $student->quizes[$quiz->quizID]->coList = [];
                $condition = " and t2.quizID = ". $quiz->quizID;
                $studentID = $student->studentID;
                $sql_type = "SELECT t1.quizquestID, t2.quizID from quiz_studentanswer t1,quiz_quiz_questions t2 WHERE t1.quizquestID = t2.quizquestID AND t1.studentID = '". $studentID . "' " . $condition . "";
                $res_type = $this->executeQueryForList($sql_type);
                if (!empty($res_type)) {
                    foreach ($res_type as $row_type) {
                        $quizquestID = $row_type->quizquestID;
                        $quizID_tmp = $row_type->quizID;
                        $sql_mark = "SELECT t2.point,t3.nba_course_outcome_id,t3.nba_course_outcome_value,t4.quizID,t3.quiz_questionID FROM quiz_studentanswer t1,quiz_quiz_question_answers t2,nba_quiz_question_co_relation t3,quiz_quiz_questions t4 WHERE t1.quizquestID = t4.quizquestID AND t2.quizquestID = t4.quizquestID AND t3.quiz_questionID = t4.quizquestID AND t1.answerID = t2.answerID AND t1.quizquestID = t2.quizquestID AND t2.quizquestID = t3.quiz_questionID AND t1.studentID = \"" . $studentID . "\" AND t1.quizquestID = \"" . $quizquestID . "\"  AND t1.quizquestID = t3.quiz_questionID";
                        $result_mark = $this->executeQueryForList($sql_mark);
                        if (!empty($result_mark)) {
                            foreach ($result_mark as $row_mark) {
                                $mark_obtained = $row_mark->point;
                                $nba_course_outcome_id = $row_mark->nba_course_outcome_id;
                                $course_outcome_value = $row_mark->nba_course_outcome_value;
                                $course_outcome_value = $course_outcome_value / 100;
                                $QUIZID = $row_mark->quizID;
                                $quiz_questionID = $row_mark->quiz_questionID;
                                $sql_maxpoint = "SELECT max(t1.point)as maxPoint FROM quiz_quiz_question_answers t1,quiz_quiz_questions t2 WHERE t1.quizquestID = t2.quizquestID AND t1.quizquestID = t2.quizquestID " . $condition . " AND t2.quizquestID = \"" . $quiz_questionID . "\"";
                                $maxpoint = null;
                                try{
                                    $maxpoint = $this->executeQueryForObject($sql_maxpoint)->maxPoint;
                                }catch(\Exception $e){
                                    $maxpoint = null;
                                }
                                $sql_per_value = "SELECT sum(t1.nba_course_outcome_value)/100 as coValue FROM nba_quiz_question_co_relation t1,quiz_quiz_questions t2 WHERE t1.quiz_questionID = t2.quizquestID AND t1.nba_course_outcome_id = \"" . $nba_course_outcome_id . "\" " . $condition . " and t2.quizID = \"" . $QUIZID . "\"";
                                
                                $per_percent = $this->executeQueryForObject($sql_per_value)->coValue;
                                if ($mark_obtained != 0.000) {
                                    $percentage = ($mark_obtained / $maxpoint) * $course_outcome_value;
                                    $exactValue = ($percentage / $per_percent) * 100;
                                    if($per_percent == 0){
                                        $exactValue = 0;
                                    }
                                    $student->quizes[$quiz->quizID]->coList[$nba_course_outcome_id]->coObtained += $exactValue;
                                } else {
                                    $student->quizes[$quiz->quizID]->coList[$nba_course_outcome_id]->coObtained += 0;
                                }
                            }
                        }
                    //check if this student has left this question unattempted
                    }
                }
            }
            }
            return $studentList;
    }
    public function getQuizAttendedStudentList($quizId, $subbatchID = 0)
    {
        $quizId = $this->realEscapeString($quizId);
        $subbatchID = $this->realEscapeString($subbatchID);
        if($subbatchID==0){
            $sql = "select * from quiz_student_answer_starttime where quizID = '$quizId' and is_attended =1";
        }else{
            $sql = "select * from quiz_student_answer_starttime qsas inner join subbatch_student ss ON (qsas.studentID = ss.studentID AND ss.subbatchID = '$subbatchID' )  where quizID = '$quizId' and is_attended =1";
        }
        
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getAllQuizzesBySbsId($request)
    {
        $request = $this->realEscapeObject($request);
        if(!empty($request->sbsIds)){
            $condition = " and qa.sbsID in (".implode(',',$request->sbsIds).") ";
        }else{
            $condition = " and qa.sbsID = ".$request->sbsId." ";
        }
        $sql = "SELECT qa.quizID,qa.quizName,qa.quizDesc,qa.passPercentage,qa.timeLImit,CONCAT(qa.startDate, ' ', qa.startTime) AS startDate,CONCAT(qa.endDate, ' ', qa.endTime) AS endDate,COUNT(std.studentID) AS totalStudents,GROUP_CONCAT(DISTINCT(json_object('batchId',sbs.batchID,'batchName',bat.batchName,'sbsId',sbs.sbsID))) AS identifyingContext,COUNT(is_attended) AS attended,'OldQuiz' AS type, if(sbs.semID = bat.semID,1,0) as currentBatch
            FROM sbs_relation sbs
                INNER JOIN batches bat ON bat.batchID = sbs.batchID 
                INNER JOIN quiz qa ON qa.sbsID = sbs.sbsID and sbs.subjectID = qa.subjectID and qa.deptID = bat.deptID
                INNER JOIN studentaccount std ON std.batchID = sbs.batchID
                LEFT JOIN quiz_student_answer_starttime qs3 ON qs3.quizID = qa.quizID AND std.studentID = qs3.studentID
                WHERE qa.subbatchIDs = 0 $condition
                GROUP BY qa.quizID
            UNION
            SELECT qa.quizID,qa.quizName,qa.quizDesc,qa.passPercentage,qa.timeLImit,CONCAT(qa.startDate, ' ', qa.startTime) AS startDate,CONCAT(qa.endDate, ' ', qa.endTime) AS endDate,COUNT(distinct sstd.studentID) AS totalStudents,GROUP_CONCAT(DISTINCT(json_object('batchId',sbs.batchID,'batchName',bat.batchName,'sbsId',sbs.sbsID))) AS identifyingContext,COUNT(is_attended) AS attended,'OldQuiz' AS type,if(sbs.semID = bat.semID,1,0) as currentBatch
            FROM sbs_relation sbs
                INNER JOIN quiz qa ON qa.sbsID = sbs.sbsID and sbs.subjectID = qa.subjectID
                INNER JOIN batches bat on bat.batchID = sbs.batchID
                INNER JOIN subbatch_student sstd ON FIND_IN_SET(sstd.subbatchID, qa.subbatchIDs)
                INNER JOIN studentaccount std on std.studentID = sstd.studentID and std.batchID = sbs.batchID 
                LEFT JOIN quiz_student_answer_starttime qs3 ON qs3.quizID = qa.quizID AND sstd.studentID = qs3.studentID
            WHERE sstd.studentID IS NOT NULL AND qa.subbatchIDs <> 0 $condition
            GROUP BY qa.quizID;";        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function studentMarksDetails($quizID)
    {
        $quiz = $this->getQuizDetailsById($quizID);
        if($quiz->subbatchIDs)
        {
            $sql = "select q.quizID,q.subjectID,sta.studentID, sta.studentName,sem.semName, sum(qqqsta.point) as marks,count(qsas.is_attended) as isAttended FROM  quiz q
            INNER JOIN
            sbs_relation sr ON sr.sbsID = q.sbsID
                AND sr.subjectID = q.subjectID
            inner join subbatches sub on find_in_set(sub.subbatchID, q.subbatchIDs) and sub.batchID = sr.batchID 
            inner join subbatch_student ss on sub.subbatchID = ss.subbatchID 
            inner join studentaccount sta ON sta.batchID = sr.batchID and ss.studentID = sta.studentID
            inner join semesters sem on sem.semID = sr.semID
            left join quiz_quiz_questions qqq ON qqq.quizID = q.quizID
            left join quiz_subject_questions qsq on qsq.questionID = qqq.questionID
            left join quiz_studentanswer qs ON qs.studentID = sta.studentID AND qs.quizquestID = qqq.quizquestID
            left join quiz_quiz_question_answers qqqsta on qqqsta.answerID = qs.answerID and qqqsta.quizquestID = qs.quizquestID
            LEFT JOIN quiz_student_answer_starttime qsas ON qsas.studentID = sta.studentID
            AND qsas.quizID = q.quizID where q.quizID = 9 
            group by sta.studentID
            order by sta.rollNo, qqq.questionID;";
        }
        else 
        {
            $sql = "select q.quizID,q.subjectID,sta.studentID, sta.studentName,bat.batchName,sem.semName, sum(qqqsta.point) as marks,count(qsas.is_attended) as isAttended FROM  quiz q
            INNER JOIN sbs_relation sr ON sr.sbsID = q.sbsID AND sr.subjectID = q.subjectID
            inner join semesters sem on sem.semID = sr.semID
            inner join studentaccount sta ON sta.batchID = sr.batchID 
            inner join batches bat on bat.batchID = sr.batchID
            left join quiz_quiz_questions qqq ON qqq.quizID = q.quizID
            left join quiz_subject_questions qsq on qsq.questionID = qqq.questionID
            left join quiz_studentanswer qs ON qs.studentID = sta.studentID
            AND qs.quizquestID = qqq.quizquestID
            left join quiz_quiz_question_answers qqqsta on qqqsta.answerID = qs.answerID and qqqsta.quizquestID = qs.quizquestID 
            LEFT JOIN quiz_student_answer_starttime qsas ON qsas.studentID = sta.studentID
            AND qsas.quizID = q.quizID where q.quizID = $quizID
            group by sta.studentID
            order by sta.rollNo, qqq.questionID;";
        }
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get consilodated quiz&survey report
     * @param $request
     * @return ArrayList 
     * @throws ProfessionalException
     */
    public function getConsolidatedQuizReport($request){
        $sql = "";
        $sql = "SELECT q.quizID,q.quizName,q.subjectID,s.subjectName,sa.staffName,sta.studentID,sta.rollNo,sta.regNo, sta.studentName,bat.batchName,sem.semName, sum(qqqsta.point) as markObtained,count(qsas.is_attended) as isAttended ,q.startDate ,q.endDate FROM  quiz q
        INNER JOIN sbs_relation sr ON sr.sbsID = q.sbsID AND sr.subjectID = q.subjectID AND  sr.semID = $request->semId
        INNER JOIN semesters sem ON sem.semID = sr.semID
        INNER JOIN studentaccount sta ON sta.batchID = sr.batchID 
        INNER JOIN batches bat ON bat.batchID = sr.batchID
        LEFT JOIN quiz_quiz_questions qqq ON qqq.quizID = q.quizID
        LEFT JOIN quiz_subject_questions qsq ON qsq.questionID = qqq.questionID
        LEFT JOIN quiz_studentanswer qs ON qs.studentID = sta.studentID
        AND qs.quizquestID = qqq.quizquestID
        LEFT JOIN quiz_quiz_question_answers qqqsta ON qqqsta.answerID = qs.answerID and qqqsta.quizquestID = qs.quizquestID 
        LEFT JOIN quiz_student_answer_starttime qsas ON qsas.studentID = sta.studentID
        AND qsas.quizID = q.quizID 
        LEFT JOIN subjects s ON s.subjectID = sr.subjectID
        LEFT JOIN staffaccounts sa ON sa.staffID = sr.staffID
        where bat.batchID=$request->batchId ";
        if($request->subjectId && $request->staffId){
            $sql_sbs = "SELECT sbs.sbsID, b.deptID from sbs_relation sbs inner join batches b on b.batchID = sbs.batchID  where sbs.staffID=$request->staffId and sbs.subjectID=$request->subjectId and sbs.batchID=$request->batchId  and sbs.semID = $request->semId";
            $sbsId = $this->executeQueryForObject($sql_sbs)->sbsID;
            if($sbsId){
                $sql .=" AND q.subjectID=$request->subjectId and q.sbsID=$sbsId";
            }
            else{
                return false;
            }
        }
        if($request->fromDate && $request->toDate){
            $sql .=" group by q.quizID, sta.studentID HAVING q.startDate >= '$request->fromDate' AND q.endDate <= '$request->toDate'  order by sta.rollNo, q.startDate";
        }
        else{
            $sql .=" group by q.quizID, sta.studentID order by sta.rollNo, q.startDate";
        }
        
        
        try {
            //$test= $this->executeQueryForList($sql);
            return $this->executeQueryForList($sql, $this->mapper[QuizAndSurveyServiceMapper::GET_QUIZ_REPORT]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get subect-wise quizzes
     * @param $request
     * @return ArrayList 
     * @throws ProfessionalException
     */
    public function getQuizzesSubectwise($request){
        $sql=" 
        SELECT q.quizID,q.quizName,q.startDate,q.subjectID,s.subjectName,sa.staffName,bat.batchName,sem.semName, q.endDate FROM  quiz q
        INNER JOIN sbs_relation sr ON sr.sbsID = q.sbsID AND sr.subjectID = q.subjectID
        INNER JOIN semesters sem ON sem.semID = sr.semID 
        INNER JOIN batches bat ON bat.batchID = sr.batchID 
        LEFT JOIN subjects s ON s.subjectID = sr.subjectID
        LEFT JOIN staffaccounts sa ON sa.staffID = sr.staffID
        where bat.batchID=$request->batchId and  sr.semID = $request->semId ";
        if($request->staffId){
            $sql .= " AND sa.staffID = $request->staffId";
        }
        if($request->subjectId){
            $sql .= " AND s.subjectID = $request->subjectId";
        }
        if($request->fromDate && $request->toDate){
            $sql .=" group by q.quizID HAVING q.startDate >= '$request->fromDate' AND q.endDate <= '$request->toDate'  order by q.startDate";
        }
        else{
            $sql .= " group by q.quizID order by q.startDate";
        }
        
        try {
            $result = $this->executeQueryForList($sql, $this->mapper[QuizAndSurveyServiceMapper::GET_SUBJECTWISE_QUIZZES]);
            return $result;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getMaxQuestionsInQuiz($quizId){
        try {
            //code...
            $sql1 = "SELECT count(quizquestID)+10 as maxOrderNumber from quiz_quiz_questions where quizID='".$quizId."';";
            return $this->executeQueryForObject($sql1)->maxOrderNumber;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
}
?>