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 / 81
CRAP
0.00% covered (danger)
0.00%
0 / 1630
AssignmentService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 81
88506.00
0.00% covered (danger)
0.00%
0 / 1630
 __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
 getAssignmentNum
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 13
 getAssiNum
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 16
 getAssignmentCountBySubject
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getAssignmentMarkListByStudent
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 18
 getAllAssignmentMarkListByStudentId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 18
 getCoValuesForAnAssignment
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 20
 getAssignmentNumByBatch
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 deleteAssignmentMarksById
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getAssignmentDetailsBySubjectId
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 22
 getAssignmentDetailsById
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getAssignmentDetailsByAssiNu
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 createAssignment
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 createNewAssignment
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 13
 updateAssignment
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 47
 updateAssignmentIsPublish
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 30
 deleteAssignment
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 42
 getStudentAssignmentMarkByAssiNu
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 createStudentAssignmentMarks
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 updateStudentAssignmentMarks
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 deleteStudentAssignmentMarks
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 getAssignmentDetailsBySbsId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 27
 isSubmissionAllowed
0.00% covered (danger)
0.00%
0 / 1
90.00
0.00% covered (danger)
0.00%
0 / 46
 getAssignmentNumsOfAsubject
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getMaxAssignmentNumber
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 11
 getBatchwiseMaxAssignmentNumber
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 24
 getBatchOrSubjectwiseAssignmentRules
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 20
 deleteBatchOrSubjectSpecificAssignmentRules
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 20
 getGeneralMaxAssignmentNumberByBatchId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getGeneralMaxAssignmentNumberDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 saveOrUpdateGeneralAssignmentRule
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 16
 deleteGeneralAssignmentRulesById
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 7
 getGeneralMaxAssignmentNumberByCourseTypeId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getMaxAssignmentNumberForPseudoSubject
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 15
 getAssignmentDetailsBySubmissionDate
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 22
 getAssignmentDetailsByBatchSemAndSubjectId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 getAllStudentMarksAndCoReportOfABatchAndSemester
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 21
 getStudentMaxMarkGivenForAssignmentByAssignmentID
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 getStudentMaxMarkGivenForPsassignment
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 saveAssessmentQuestion
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 20
 getAssessmentStructureByBatchSemSubject
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 22
 getAssessmentByAssignmentId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 39
 getAssignmentSubmittedStudentIds
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 12
 getAssignmentStudentListForQuestionWiseMarkEnrty
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 160
 assignmentMarkIsApproved
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 checkAssignmentMark
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 18
 upsertAssignmentStudentTotalMark
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 17
 upsertConfirmStudentAssignmentTotalMarks
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 18
 getStudentAssignmentDetailsByStudentId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 addStudentAssignment
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 18
 getPseudoSubjectAssignmentDetails
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 21
 createAssignmentForEachSubBatches
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 25
 getAllStudentMarksAndCoReportOfABatchAndSemesterForAssignment
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 59
 getAssignmentMarksOfAStudent
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getAssignmentList
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 14
 getExternalAssignmentDetailsBySubjectId
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 27
 getAssignmentListByStudent
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 26
 confirmStudentAssignment
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 unconfirmStudentAssignment
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 updateStudentAssignmentRemarks
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getAllAssignmentDetailsBySbsId
0.00% covered (danger)
0.00%
0 / 1
420.00
0.00% covered (danger)
0.00%
0 / 67
 getAssignmentStudentsForMarkEntry
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 59
 getAssignmentStudentsForMarkEntryWithCount
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 56
 saveBatchwiseAssignmentRules
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 16
 updateBatchwiseAssignmentRules
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 16
 getAssignmentDetailsByRequest
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 8
 deleteBatchwiseAssignmentRules
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 checkAssignmentQuestionWiseMarkEntry
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 14
 saveStudentAssignmentMarks
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 32
 updateAsyncReportDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 setAsyncDocStatus
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 getAssigmentAsyncFile
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 updateAssignmentIsPublishMarks
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 17
 findPseudoSubjectAssignment
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 15
 getSumOfQuestionMarksInAnAssignment
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 21
 getMaxStudentMarkInAnAssignment
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 17
 getAssignmentMarksByIds
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 getAssignmentMarkListByRequest
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 18
 getPseudoSubjectAssignmentList
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
<?php
namespace com\linways\core\ams\professional\service;
use com\linways\core\ams\professional\dto\Assignment;
use com\linways\core\ams\professional\dto\nba\NBAQuestion;
use com\linways\core\ams\professional\service\StudentService;
use com\linways\core\ams\professional\dto\StudentAssignmentDetails;
use com\linways\core\ams\professional\mapper\AssignmentServiceMapper;
use com\linways\core\ams\professional\exception\ProfessionalException;
use com\linways\core\ams\professional\service\SemesterService;
use com\linways\core\ams\professional\service\nba\NbaCoService;
use com\linways\core\ams\professional\request\AssignmentBatchSubjectRequest;
use com\linways\core\ams\professional\dto\StudentAssinments;
use com\linways\core\ams\professional\response\SearchStudentResponse;
class AssignmentService 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 = AssignmentServiceMapper::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;
    }
    /**
     * Get assignment numbers in a subbatch 
     * @param int $batchId
     * @param int $semId
     * @param int $subbatchId
     */
    
    public function getAssignmentNum($batchId,$semId,$subbatchId = null)
    {
        $condition = "";
        if($subbatchId){
            $condition = " AND subbatchID = $subbatchId ";
        }
        $sql = "SELECT DISTINCT assiNu FROM batch_assignment WHERE batchID=$batchId AND semID=$semId $condition ORDER BY assiNu ASC";
        
        try {
            
            $assignmentNum = $this->executeQueryForList($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode,$e->getMessage());
        }
        return $assignmentNum;
        
    }
    public function getAssiNum($batchId,$semId,$subjectId,$subbatchId = NULL)
    {
        $batchId = $this->realEscapeString($batchId);
        $subjectId = $this->realEscapeString($subjectId);
        $semId = $this->realEscapeString($semId);
        
        $sql = "SELECT assiNu, externalAssiNu FROM batch_assignment where batchID = ".$batchId." AND subjectID = ".$subjectId." AND semID = ".$semId."";
        
        if (!empty($subbatchId)) {
            $subbatchId = $this->realEscapeString($subbatchId);
            $sql .= " AND ( subbatchID = 0 OR subbatchID = ".$subbatchId.")";
        }
        try {
            
            $assignmentNum = $this->executeQueryForList($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode,$e->getMessage());
        }
        return $assignmentNum;
        
    }
    /**
     * Get count of assignments given for a subject in a sem
     * @param int $batchId
     * @param int $semID
     * @param int $subject
     * @throws ProfessionalException
     * @return $assignmentCount
     */
    public function getAssignmentCountBySubject($batchId,$semId,$subjectId)
    {
        $sql = "SELECT  count(distinct assiNu) as count from batch_assignment where batchID = $batchId and semID = $semId and subjectID = $subjectId AND assiNu is not null AND assiNu !=0";
        try {
            
            $assignmentCount = $this->executeQueryForObject($sql)->count;
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        
        return $assignmentCount;
    }
    
    /**
     * get student assignment marks
     * @param int $studentId
     * @param int $batchId
     * @param int $semId
     * @throws ProfessionalException
     * @return object|array|\com\linways\base\util\$objectList[]
     */
    public function getAssignmentMarkListByStudent($studentId, $batchId, $semId, $subjectId = null)
    {
        $assignmentList=NULL;
        $studentId= $this->realEscapeString($studentId);
        $batchId= $this->realEscapeString($batchId);
        $semId= $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        
        $sql = "SELECT sa.studentID, sa.studentName, ba.subjectID, sub.subjectName, ba.assignmentID, ba.assiNu, ba.max_mark, am.marksObtained,concat(ba.subjectID,ba.assignmentID,ba.assiNu) as subjAssign, ba.description,sub.subjectDesc,ba.is_published_student_marks as isPublishedStudentMarks FROM batch_assignment ba INNER JOIN subjects sub ON ba.subjectID = sub.subjectID INNER JOIN studentaccount sa ON ba.batchID=sa.batchID AND sa.studentID=$studentId LEFT JOIN assignment_marks am ON am.assignmentID=ba.assignmentID WHERE ba.batchID = $batchId AND ba.semID = $semId AND am.csID IS NULL AND ba.assiNu is not null AND ba.assiNu !=0 AND am.studentID = $studentId ";
        
        if($subjectId){
        $sql .= " AND sub.subjectID = $subjectId";
        }
        $sql .= " ORDER BY ba.assiNu ASC";
        try {
            
            $assignmentList = $this->executeQueryForList($sql,$this->mapper[AssignmentServiceMapper::GET_ASSIGNMENT_MARK_LIST_BY_STUDENT]);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        
        return $assignmentList;
    }
    /**
     * Undocumented function
     *
     * @param [type] $studentId
     * @param [type] $batchId
     * @param [type] $semId
     * @param [type] $subjectId
     * @return void
     */
    public function getAllAssignmentMarkListByStudentId($studentId, $batchId, $semId, $subjectId = null)
    {
        $assignmentList=NULL;
        $studentId= $this->realEscapeString($studentId);
        $batchId= $this->realEscapeString($batchId);
        $semId= $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        $sql = "SELECT ba.subjectID, sub.subjectName, ba.assignmentID, ba.assiNu, ba.max_mark as maxMarks, am.marksObtained,concat(ba.subjectID,ba.assignmentID,ba.assiNu) as subjAssign,ba.is_published_student_marks as isPublishedStudentMarks FROM batch_assignment ba INNER JOIN subjects sub ON ba.subjectID = sub.subjectID LEFT JOIN assignment_marks am ON am.assignmentID=ba.assignmentID WHERE ba.batchID = $batchId AND ba.semID = $semId AND am.csID IS NULL AND am.studentID = $studentId ";
        
        if($subjectId){
        $sql .= " AND sub.subjectID = $subjectId";
        }
        $sql .= " ORDER BY ba.assiNu ASC";
        try {
            
            $assignmentList = $this->executeQueryForList($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        
        return $assignmentList;
    }
    public function getCoValuesForAnAssignment($assignmentId, $studentId, $batchId, $semId, $subjectId){
        $assignmentId= $this->realEscapeString($assignmentId);
        $studentId= $this->realEscapeString($studentId);
        $batchId= $this->realEscapeString($batchId);
        $semId= $this->realEscapeString($semId);
        $subjectId =  $this->realEscapeString($subjectId);
        $sql = "SELECT  ba.max_mark as maxMarks, nco.nba_course_outcome_id, co.code, co.objective,nco.nba_course_outcome_value as courseOutcomeValue, am.marksObtained FROM batch_assignment ba INNER JOIN subjects sub ON ba.subjectID = sub.subjectID LEFT JOIN assignment_marks am ON am.assignmentID=ba.assignmentID LEFT JOIN nba_assignment_co_relation nco ON nco.nba_batch_assignment_id = ba.assignmentID AND nco.nba_batch_assignment_id = am.assignmentID LEFT JOIN nba_course_outcome co ON co.id = nco.nba_course_outcome_id WHERE ba.batchID = $batchId AND ba.semID = $semId AND am.csID IS NULL AND am.studentID = $studentId  AND sub.subjectID = $subjectId AND am.assignmentID = $assignmentId";
        try {
            
            $coList = $this->executeQueryForList($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        
        foreach($coList as $co){
            if(empty($co->courseOutcomeValue)){
                $co->coObtained = NULL;
                continue;
            }
            $co->coObtained = ($co->marksObtained/$co->maxMarks)*100;
        }
        
        return $coList;
    }
    
    
    public function getAssignmentNumByBatch($batchId)
    {
        $assignmentList=NULL;
        $sql = "SELECT DISTINCT(ba.assiNu) FROM batch_assignment ba INNER JOIN batches bth ON bth.batchID=ba.batchID  WHERE ba.batchID = '".$batchId."'";
        try {
            
            $assignmentList = $this->executeQueryForList($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $assignmentList;
    }
    
    /**
     * Delete assignment marks by assignentId
     * @param int $assignmentId
     * @return boolean
     */
    public function deleteAssignmentMarksById($assignmentId)
    {
        $assignmentId = $this->realEscapeString($assignmentId);
        $sql = "DELETE FROM assignment_marks WHERE assignmentID=$assignmentId";
        try{
            $this->executeQueryForList($sql);
        }catch (\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        
        return true;
    }
    
    /**
     * get assignment details by subject id
     * @param int $batchId
     * @param int $subjectId
     * @param int $staffId
     * @throws ProfessionalException
     * @return object|array|\com\linways\base\util\$objectList[]
     */
    public function getAssignmentDetailsBySubjectId($batchId, $subjectId, $staffId, $semId = null, $subbatchID = null)
    {
        $batchId = $this->realEscapeString($batchId);
        $subjectId = $this->realEscapeString($subjectId);
        $staffId = $this->realEscapeString($staffId);
        $conditions = "";
        if ( $semId ) {
            $semId = $this->realEscapeString($semId);
            $conditions .= " AND bs.semID = ".$semId." ";
        }
        if($subbatchID){
            $subbatchID = $this->realEscapeString($subbatchID);
            $conditions .= " AND bs.subbatchID = ".$subbatchID." ";
        }
        $assignmentList=[];
        $sql = "SELECT bs.assignmentID, bs.question, bs.description, bs.submissionDate, bs.submissionTime, bs.assiNu,bs.docName, bs.docPath, bs.max_mark, bs.returnDate, bs.subbatchID, if(bs.subbatchID=0, 'All', sub.subbatchName) AS subbatchName, restrictStudentSubmit, bs.is_published as isPublished, bs.externalAssiNu, bs.publishDate, bs.publishTime, bs.userType, bs.enableConfirm, bs.is_published_student_marks as isPublishedStudentMarks FROM batch_assignment bs LEFT JOIN subbatches sub ON bs.subbatchID=sub.subbatchID WHERE bs.batchID=$batchId AND bs.subjectID=$subjectId AND bs.staffID=$staffId ".$conditions." ORDER BY bs.assignmentID DESC";
        
        try{
            $assignmentList = $this->executeQueryForList($sql,$this->mapper[AssignmentServiceMapper::GET_ASSIGNMENT_DETAILS]);
        }catch (\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        
        return $assignmentList;
    }
    
    /**
     * get assignment details by assignmentId
     * @param int $assignmentId
     * @throws ProfessionalException
     * @return object|array|\com\linways\base\util\$objectList[]
     */
    public function getAssignmentDetailsById($assignmentId)
    {
        $assignmentId = $this->realEscapeString($assignmentId);
        
        $assignmentDetails=null;
        $sql = "select bs.assignmentID, bs.question, bs.description, bs.submissionDate, bs.submissionTime, bs.assiNu,bs.docName, bs.docPath, bs.max_mark, bs.returnDate, bs.subbatchID, if(bs.subbatchID=0, 'All', sub.subbatchName) as subbatchName, bs.externalAssiNu, bs.publishDate, bs.publishTime, bs.is_published as isPublished, bs.enableConfirm, bs.asyncReportsId, ar.lin_resource_id as linResourseId,bs.is_published_student_marks as isPublishedStudentMarks from batch_assignment bs LEFT JOIN subbatches sub ON bs.subbatchID=sub.subbatchID left join async_reports ar ON bs.asyncReportsId=ar.id where bs.assignmentID=$assignmentId";
        
        try{
            $assignmentDetails = $this->executeQueryForObject($sql,false,$this->mapper[AssignmentServiceMapper::GET_ASSIGNMENT_DETAILS]);
        }catch (\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        
        return $assignmentDetails;
    }
    /**
     * get assignment details for the subject by assiNu
     * @param int $batchId
     * @param int $semId
     * @param int $subjectId
     * @param int $assiNu
     * @throws ProfessionalException
     * @return boolean
     */
    public function getAssignmentDetailsByAssiNu($batchId, $semId, $subjectId, $assiNu)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $assiNu = $this->realEscapeString($assiNu);
        $subjectId = $this->realEscapeString($subjectId);
        
        $sql = "select assignmentID,max_mark from batch_assignment where batchId = $batchId and semId = $semId and subjectID = $subjectId and assiNu = $assiNu";
        
        try {
            
            $assignmentId = $this->executeQueryForObject($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
            
        }
        return $assignmentId;
    }
    /**
     * Create assignmet
     * @param StudentAssignmentDetails $assignmentDetail
     * @throws ProfessionalException
     * @return object|NULL|\com\linways\base\util\$objectList[]
     */
    public function createAssignment($assignmentDetail)
    {
        $assignmentDetail = $this->realEscapeObject($assignmentDetail);
        
        $sql = "INSERT into batch_assignment (question, submissionDate, batchID, staffID, subjectID, assiNu, semID, max_mark) values (\"$assignmentDetail->question\", UTC_TIMESTAMP(), $assignmentDetail->batchId$assignmentDetail->staffId$assignmentDetail->subjectId$assignmentDetail->assiNu$assignmentDetail->semId$assignmentDetail->maxMark )";
        
        try {
            
            return $this->executeQueryForObject($sql,true);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
            
        }
    }
    public function createNewAssignment($assignmentDetail)
    {
        $assignmentDetail = $this->realEscapeObject($assignmentDetail);
        $response = new \stdClass();
        $sql = "INSERT into batch_assignment (description, submissionDate, submissionTime, batchID, staffID, subjectID, assiNu, semID, max_mark, returnDate, subbatchID, restrictStudentSubmit, psID, publishDate, publishTime, userType, externalAssiNu, is_published, enableConfirm) values ('".$assignmentDetail->description."','$assignmentDetail->submissionDate','$assignmentDetail->submissionTime','$assignmentDetail->batchId','$assignmentDetail->staffId','$assignmentDetail->subjectId','$assignmentDetail->assiNu','$assignmentDetail->semId','$assignmentDetail->max_mark','$assignmentDetail->returnDate','$assignmentDetail->subbatchId', '$assignmentDetail->restrictStudentSubmit', '$assignmentDetail->pseudoSubjectId', '$assignmentDetail->publishDate', '$assignmentDetail->publishTime', '$assignmentDetail->userType', '$assignmentDetail->externalAssiNu', $assignmentDetail->isPublished, '$assignmentDetail->enableConfirm')";
        try {
            $response->batchAssignmentId = $this->executeQueryForObject($sql,true);
            $sql_insert_into_assessment_structure = "INSERT INTO assessment_structure ( subjectID, staffID, batchID, semID, maxMark, duration, subbatchID, assessment_key, assessment_type) VALUE ('$assignmentDetail->subjectId', '$assignmentDetail->staffId', '$assignmentDetail->batchId', '$assignmentDetail->semId', '$assignmentDetail->max_mark', '0', '$assignmentDetail->subbatchId', '".($assignmentDetail->externalAssiNu?$assignmentDetail->externalAssiNu:$assignmentDetail->assiNu)."', 'ASSIGNMENT')";
            $response->assessmentStructureId = $this->executeQuery($sql_insert_into_assessment_structure,true)->id;
            return $response;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function updateAssignment($assignmentDetail){
        $assignmentDetail = $this->realEscapeObject($assignmentDetail);
        $batchAssignmentConditions  = null;
            if ( $assignmentDetail->pseudoSubjectId ) {
                $batchAssignmentConditions  .= " 
                subjectID = '$assignmentDetail->subjectId
                AND staffID = '$assignmentDetail->staffId
                AND batchID='$assignmentDetail->batchId
                AND semID = '$assignmentDetail->semId
                AND subbatchID = '$assignmentDetail->subbatchId
                AND psID = '$assignmentDetail->pseudoSubjectId";
                if($assignmentDetail->assiNu)
                {
                  $batchAssignmentConditions  .= " AND assiNu = '$assignmentDetail->assiNu'";
                }
                else 
                {
                    $batchAssignmentConditions  .= " AND externalAssiNu = '$assignmentDetail->externalAssiNu'";
                }
            } else {
                $batchAssignmentConditions  .= " assignmentID IN ($assignmentDetail->id)";
            }
            $sql = "UPDATE batch_assignment SET
            description  = '" . $assignmentDetail->description . "',
            submissionDate     = '" . $assignmentDetail->submissionDate . "',
            submissionTime    = '" . $assignmentDetail->submissionTime . "',
            max_mark = '" . $assignmentDetail->max_mark . "',
            returnDate     = '" . $assignmentDetail->returnDate . "',
            publishDate = '".$assignmentDetail->publishDate."',
            publishTime = '".$assignmentDetail->publishTime."',
            restrictStudentSubmit     = '" . $assignmentDetail->restrictStudentSubmit . "',
            enableConfirm = '$assignmentDetail->enableConfirm'
            WHERE $batchAssignmentConditions ";
        try {
            $this->executeQueryForObject($sql,true);
            $condition = "";
            if($assignmentDetail->subbatchId){
                $condition .= "AND subbatchID = '$assignmentDetail->subbatchId'";
            }
            $sql_update_assessment_structure = "
                    UPDATE assessment_structure SET
                    maxMark = '" . $assignmentDetail->max_mark . "'
                    WHERE subjectID ='$assignmentDetail->subjectId' AND staffID = '$assignmentDetail->staffId' AND batchID='$assignmentDetail->batchId' AND semID = '$assignmentDetail->semId' AND assessment_key = '$assignmentDetail->assiNu' AND assessment_type = 'ASSIGNMENT'" .$condition."";
            return $this->executeQueryForObject($sql_update_assessment_structure,true);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
            
        }
    }
    public function updateAssignmentIsPublish($assignmentDetail){
        $assignmentDetail = $this->realEscapeObject($assignmentDetail);
        $batchAssignmentConditions  = null;
            if ( $assignmentDetail->pseudoSubjectId ) {
                $batchAssignmentConditions  .= " 
                subjectID = '$assignmentDetail->subjectId
                AND staffID = '$assignmentDetail->staffId
                AND batchID='$assignmentDetail->batchId
                AND semID = '$assignmentDetail->semId
                AND subbatchID = '$assignmentDetail->subbatchId
                AND psID = '$assignmentDetail->pseudoSubjectId";
                if($assignmentDetail->assiNu==0)
                {
                    $batchAssignmentConditions  .= "AND externalAssiNu = '$assignmentDetail->externalAssiNu'";
                }
                else
                {
                    $batchAssignmentConditions  .= "AND assiNu = '$assignmentDetail->assiNu'";
                }
            } else {
                $batchAssignmentConditions  .= " assignmentID IN ($assignmentDetail->id)";
            }
            $sql = "UPDATE batch_assignment SET
            is_published  = '" . $assignmentDetail->isPublished . "'
        
            WHERE $batchAssignmentConditions ";
        try {
            $this->executeQueryForObject($sql,true);
            
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
            
        }
    }
    public function deleteAssignment($assignmentDetail)
    {
        $assignmentDetail = $this->realEscapeObject($assignmentDetail);
        $batchAssignmentConditions  = null;
        if ( $assignmentDetail->pseudoSubjectId ) {
            $batchAssignmentConditions  .= " 
                AND subjectID = '$assignmentDetail->subjectId
                AND staffID = '$assignmentDetail->staffId
                AND batchID='$assignmentDetail->batchId
                AND semID = '$assignmentDetail->semId
                AND subbatchID = '$assignmentDetail->subbatchId
                AND psID = '$assignmentDetail->pseudoSubjectId";
            if($assignmentDetail->externalAssiNu)
            {
                $batchAssignmentConditions  .= " AND externalAssiNu = '$assignmentDetail->externalAssiNu";
            }
            else
            {
                $batchAssignmentConditions  .= " AND assiNu = '$assignmentDetail->assiNu";
            }
                
        } else {
            if($assignmentDetail->externalAssiNu)
            {
                $batchAssignmentConditions  .= " AND externalAssiNu = '$assignmentDetail->externalAssiNu";
            }
            
            $batchAssignmentConditions  .= " AND assignmentID IN ($assignmentDetail->assignmentID)";
        }
        $sql = "DELETE FROM batch_assignment WHERE assignmentID is not null $batchAssignmentConditions ";
        
        try {
            $condition="";
            if($assignmentDetail->subbatchId){
                $condition .= "AND subbatchID = '$assignmentDetail->subbatchId'";
            }
            $sql_delete_from_assessment_structure = "DELETE from assessment_structure where subjectID ='$assignmentDetail->subjectId' AND staffID = '$assignmentDetail->staffId' AND batchID='$assignmentDetail->batchId' AND semID = '$assignmentDetail->semId' AND assessment_key = '".($assignmentDetail->externalAssiNu?$assignmentDetail->externalAssiNu:$assignmentDetail->assiNu)."' AND assessment_type = 'ASSIGNMENT'" .$condition." ";
             $this->executeQuery($sql_delete_from_assessment_structure,true);
             return $this->executeQuery($sql,true);
            
            
        } catch (\Exception $e) {
            if($e->getCode() == 'CANNOT_DELETE_OR_UPDATE_ROW_FOREIGN_KEY_FAILED'){
                throw new ProfessionalException($e->getCode(), 'Assignment cannot be deleted since Assignment contain questions.');
            }
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
            
        }
    }
    /**
     * Get assignement mark of student by assignmentId
     * @param int $assignmentId
     * @param int $studentId
     * @throws ProfessionalException
     * @return object|NULL|\com\linways\base\util\$objectList[]
     */
    public function getStudentAssignmentMarkByAssiNu($assignmentId, $studentId)
    {
        $assignmentId = $this->realEscapeString($assignmentId);
        $studentId = $this->realEscapeString($studentId);
        
       $sql = "select marksObtained from assignment_marks am inner join batch_assignment ba on am.assignmentID = ba.assignmentID where am.assignmentID = $assignmentId and am.studentID = $studentId";   
       try {
           
           $assignmentMark = $this->executeQueryForObject($sql);
           
       } catch (\Exception $e) {
           
           throw new ProfessionalException($e->getCode(), $e->getMessage());
       }
       return $assignmentMark;
    }
    /**
     * Create assignment mark of student
     * @param StudentAssignmentDetails $assignmentDetail
     * @throws ProfessionalException
     * @return object|NULL|\com\linways\base\util\$objectList[]
     */
    public function createStudentAssignmentMarks($assignmentDetail)
    {
        $assignmentDetail = $this->realEscapeObject($assignmentDetail);
        
        $sql = "insert into assignment_marks (studentID, marksObtained, assignmentID, percentage) values ($assignmentDetail->studentId$assignmentDetail->mark$assignmentDetail->assignmentId$assignmentDetail->percentage)";
        
        try {
            
            return $this->executeQueryForObject($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
            
        }
    }
    /**
     * Update assignment mark of student
     * @param StudentAssignmentDetails $assignmentDetail
     * @throws ProfessionalException
     * @return \com\linways\base\dto\MySqlResult
     */
    public function updateStudentAssignmentMarks($assignmentDetail)
    {
        $sql = "update assignment_marks set marksObtained = $assignmentDetail->mark , percentage = $assignmentDetail->percentage where assignmentID = $assignmentDetail->assignmentId and studentID = $assignmentDetail->studentId";
        
        try {
            
            return $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Delete student assignment marks
     * @param int $studentId
     * @param int $assignmentId
     * @throws ProfessionalException
     * @return \com\linways\base\dto\MySqlResult
     */
    public function deleteStudentAssignmentMarks($studentId,$assignmentId)
    {
        $sql = "delete from assignment_marks where assignmentID = $assignmentId and  studentID = $studentId";
        
        try {
            
            return $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get assignment details in a date range by sbsId
     * @param int $sbsId
     * @param string $fromDate
     * @param string $toDate
     * @throws ProfessionalException
     * @return object|array|\com\linways\base\util\$objectList[]
     */
    public function getAssignmentDetailsBySbsId($sbsId, $fromDate, $toDate)
    {
        $sbsId = $this->realEscapeString($sbsId);
        $fromDate = $this->realEscapeString($fromDate);
        $toDate = $this->realEscapeString($toDate);
        
        $sbs = SubjectService::getInstance()->getSubjectDetailsBySbsId($sbsId);
        
        $semId = $sbs->semID;
        $batchId = $sbs->batchID;
        
        $semDetails = SemesterService::getInstance()->getSemDetailsBySemId($semId);
        $isCurrentSem = SemesterService::getInstance()->isCurrentSemester($batchId, $semId);
        
        if($isCurrentSem)
        {
            $sql = "select noOfassign, count(pending) as pending, sum(case when pending is null then 1 end) as submitted from (SELECT assignmentID, sa.studentID, isSubmited, count(assignmentID) as noOfassign,  sum(case when isSubmited = 0 then 1 end) as pending FROM batch_assignment ba inner join sbs_relation sr on ba.batchID = sr.batchID and ba.semID = sr.semID and ba.subjectID = sr.subjectID and ba.staffID = sr.staffID left join student_assinments sa on sa.assinmentID = ba.assignmentID  left join studentaccount sta on sa.studentID = sta.studentID left join semesters sem on sem.semID = sta.joiningSemId where sr.sbsID = $sbsId and ba.submissionDate between '$fromDate' and '$toDate' and sem.orderNo <= ".$semDetails->orderNo." group by sa.studentID) as assign; ";
        }
        else
        {
            $sql = "select noOfassign, count(pending) as pending, sum(case when pending is null then 1 end) as submitted from (SELECT assignmentID, sa.studentID, isSubmited, count(assignmentID) as noOfassign,  sum(case when isSubmited = 0 then 1 end) as pending FROM batch_assignment ba inner join sbs_relation sr on ba.batchID = sr.batchID and ba.semID = sr.semID and ba.subjectID = sr.subjectID and ba.staffID = sr.staffID left join student_assinments sa on sa.assinmentID = ba.assignmentID  left join studentaccount sta on sa.studentID = sta.studentID where sr.sbsID = ".$sbsId." and ba.submissionDate between '".$fromDate."' and '".$toDate."' and sa.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 = ".$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 = ".$batchId." and fsem.orderNo > ".$semDetails->orderNo." and joinedSem.orderNo <= ".$semDetails->orderNo.")  group by sa.studentID) as assign; ";
        }
        try
        {
            return $this->executeQueryForObject($sql);
        }
        catch (\Exception $e)
        {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function isSubmissionAllowed($assignmentID)
    {
        $allowed=true;
        $assignmentDetails='';
        $submissionDate='';
        $submissionTime='';
        $sql = "SELECT submissionDate, submissionTime, restrictStudentSubmit  from batch_assignment WHERE assignmentID=$assignmentID";
        try {
            
            $assignmentDetails = $this->executeQueryForObject($sql);
            if(!empty($assignmentDetails))
            {
                $restrictStudentSubmit = $assignmentDetails->restrictStudentSubmit;
                if($assignmentDetails->submissionDate && $restrictStudentSubmit=='1')
                {
                    $submissionDate = date('Y-m-d', strtotime($assignmentDetails->submissionDate));
                    $date = date("Y-m-d");
                    if($date == $submissionDate)
                    {
                        if($assignmentDetails->submissionTime)
                        {
                            $currentTime = date('H:i:s');
                            $submissionTime = date("H:i:s", strtotime($assignmentDetails->submissionTime));
                            if ($currentTime <= $submissionTime)
                            {
                                $allowed=true;
                            }
                            else
                            {
                                $allowed=false;
                            }
                        }
                    }
                    else if($date < $submissionDate)
                    {
                        $allowed=true;
                    }
                    else
                    {
                        $allowed=false;
                    }
                }
            }
            
            return $allowed;
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get assignment numbers given for a subject in a sem
     * @param int $batchId
     * @param int $subjectId
     * @param int $semId
     * @throws ProfessionalException
     * @return object|array|\com\linways\base\util\$objectList[]
     */
    public function getAssignmentNumsOfAsubject($batchId, $subjectId, $semId)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        
        $sql = "select distinct(assiNu) FROM batch_assignment bs WHERE bs.batchID=$batchId AND bs.subjectID=$subjectId AND bs.semID = $semId ORDER BY bs.assiNu;";
            try{
                return $this->executeQueryForList($sql);
        }catch (\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get max assignment number
     * @param int $batchId
     * @param int $subjectId
     * @param int $semId
     * @throws ProfessionalException
     * @return object|array|\com\linways\base\util\$objectList[]
     * @author Vishnu M
     */
    public function getMaxAssignmentNumber ( $batchId, $semId, $subjectId = null)
    {
        $maxAssignmentNum = 0;
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        $maxAssignmentNum = $this->getBatchwiseMaxAssignmentNumber ( $batchId, $semId, $subjectId );
        if ( !$maxAssignmentNum ) {
            $maxAssignmentNum = $this->getGeneralMaxAssignmentNumberByBatchId ( $batchId );
        }
          return $maxAssignmentNum > 0 ? $maxAssignmentNum : 0; 
    }
    public function getBatchwiseMaxAssignmentNumber ( $batchId, $semId, $subjectId = null ) {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        $maxAssignmentNum = 0;
        if ( $subjectId ) {
            $sqlSubjectSpecific = "SELECT maxassignmentNum FROM batchwise_assignment_rules WHERE batchID = ".$batchId." AND semID = ".$semId." AND subjectID = ".$subjectId."";
            try{
                $maxAssignmentNum = $this->executeQueryForObject($sqlSubjectSpecific)->maxassignmentNum;
            }
            catch (\Exception $e){
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
        }
        if ( !$maxAssignmentNum ) {
            $sql = "SELECT maxassignmentNum FROM batchwise_assignment_rules WHERE batchID = ".$batchId." AND semID = ".$semId." AND subjectID IS NULL";
            try {
                $maxAssignmentNum = $this->executeQueryForObject($sql)->maxassignmentNum;
            }
            catch (\Exception $e){
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
        }
        return $maxAssignmentNum > 0 ? $maxAssignmentNum : 0;
    }
    public function getBatchOrSubjectwiseAssignmentRules($request){
        $sql = "SELECT b.batchName,sem.semName,s.subjectName,ba.maxassignmentNum FROM batchwise_assignment_rules ba LEFT JOIN subjects s ON ba.subjectID = s.subjectID LEFT JOIN batches b ON b.batchID = ba.batchID LEFT JOIN semesters sem ON sem.semID = ba.semID WHERE 1=1";
        if($request->courseTypeId){
            $sql .= " AND b.courseTypeID = $request->courseTypeId";
        }
        if($request->batchId){
            $sql .= " AND b.batchID = $request->batchId";
        }
        if($request->semId){
            $sql .= " AND sem.semID = $request->semId";
        }
        if($request->subjectSpec){
            $sql .= " AND s.subjectName is not null";
        }
        try {
            return $this->executeQueryForList($sql);
        }
        catch (\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function deleteBatchOrSubjectSpecificAssignmentRules($request){
        
        $sql = "DELETE ba FROM batchwise_assignment_rules ba LEFT JOIN subjects s ON ba.subjectID = s.subjectID LEFT JOIN batches b ON b.batchID = ba.batchID LEFT JOIN semesters sem ON sem.semID = ba.semID WHERE 1=1";
        if($request->batchId){
            $sql .= " AND b.batchID = $request->batchId";
        }
        if($request->semId){
            $sql .= " AND sem.semID = $request->semId";
        }
        if($request->subjectSpec){
            $sql .= " AND s.subjectName is not null";
        }
        if($request->courseTypeId){
            $sql .= " AND b.courseTypeID = $request->courseTypeId";
        }
        try {
            return $this->executeQueryForList($sql);
        }
        catch (\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getGeneralMaxAssignmentNumberByBatchId ( $batchId ) {
        $batchId = $this->realEscapeString($batchId);
        $sql = "SELECT rule.maxassignmentNum FROM general_assignment_rules rule INNER JOIN batches b ON (rule.courseTypeID = b.courseTypeID) WHERE b.batchID = ".$batchId."";
        try {
            return $this->executeQueryForObject($sql)->maxassignmentNum;
        }
        catch (\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get assignment number rules defined for courses
     * @return array|null
     */
    public function getGeneralMaxAssignmentNumberDetails(){
        $sql = "";
        $sql = "SELECT ga.id, ga.maxassignmentNum, ct.typeName FROM general_assignment_rules ga, course_type ct WHERE ct.courseTypeID=ga.courseTypeID ORDER BY ga.id";
        try {
            return $this->executeQueryForList($sql);
        }
        catch (\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * save general assignment number rule
     * @param $courseTypeId
     * @param $assignmentNo
     * @return $id|null
     */
    public function saveOrUpdateGeneralAssignmentRule($courseTypeId,$assignmentNo){
        
        try{
            $sql_rule_exist = "SELECT maxassignmentNum,id FROM general_assignment_rules WHERE courseTypeID = $courseTypeId";
            $rule_exist = $this->executeQueryForObject($sql_rule_exist);
            if(empty($rule_exist)){
                $sql = "INSERT INTO general_assignment_rules (courseTypeID, maxassignmentNum) VALUES ($courseTypeId,$assignmentNo)";
                return $this->executeQueryForObject($sql, true);
            }
            else{
                $sql = "UPDATE general_assignment_rules SET maxassignmentNum = $assignmentNo  WHERE id = $rule_exist->id";
                return $this->executeQuery($sql);
            }
        } 
        catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    /**
     * delete general assignment number rule
     * @param $ruleId
     * @return null
     */
    public function deleteGeneralAssignmentRulesById($ruleId){
        $sql = "DELETE FROM general_assignment_rules WHERE id = $ruleId";
        try {
            return $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getGeneralMaxAssignmentNumberByCourseTypeId ( $courseTypeId ) {
        $courseTypeId = $this->realEscapeString($courseTypeId);
        $sql = "SELECT maxassignmentNum FROM general_assignment_rules WHERE courseTypeID = ".$courseTypeId."";
        try {
            return $this->executeQueryForObject($sql)->maxassignmentNum;
        }
        catch (\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getMaxAssignmentNumberForPseudoSubject ( $pseudoSubjectId )    {
        $maxAssignmentNum = 0;
        $pseudoSubjectId = $this->realEscapeString($pseudoSubjectId);
        $sql = "SELECT MAX(bar.maxassignmentNum) AS maxAssignmentNum FROM batchwise_assignment_rules bar INNER JOIN sbs_relation sbs ON (bar.batchID = sbs.batchID AND bar.semID = sbs.semID AND (bar.subjectID = sbs.subjectID OR bar.subjectID IS NULL)) INNER JOIN pseudosubjects_sbs psbs ON (psbs.sbsID = sbs.sbsID) WHERE psbs.pseudosubjectID = ".$pseudoSubjectId;
        try {
            $maxAssignmentNum = $this->executeQueryForObject($sql)->maxAssignmentNum;
            if ( !$maxAssignmentNum) {
                $sql = "SELECT MAX(gar.maxassignmentNum) AS maxAssignmentNum FROM general_assignment_rules gar INNER JOIN batches b ON (b.courseTypeID = gar.courseTypeID) INNER JOIN sbs_relation sbs ON (b.batchID = sbs.batchID AND b.semID = sbs.semID) INNER JOIN pseudosubjects_sbs psbs ON (psbs.sbsID = sbs.sbsID) WHERE psbs.pseudosubjectID = ".$pseudoSubjectId;
                $maxAssignmentNum = $this->executeQueryForObject($sql)->maxAssignmentNum;
            }
        }
        catch (\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
          return $maxAssignmentNum > 0 ? $maxAssignmentNum : 0; 
    }    
    /**
     * get assignment details by subject id
     * @param int $batchId
     * @param string $submissionDate
     * @param int $deptId
     * @throws ProfessionalException
     * @return object|array|\com\linways\base\util\$objectList[]
     */
    public function getAssignmentDetailsBySubmissionDate($submissionDate, $deptId='', $batchId='')
    {
        $batchId = $this->realEscapeString($batchId);
        $deptId = $this->realEscapeString($deptId);
        $submissionDate = $this->realEscapeString($submissionDate);
        $sql = "SELECT bs.batchID, bs.assignmentID, bs.question, bs.description, bs.submissionDate, bs.submissionTime, bs.assiNu,bs.docName, bs.docPath, bs.max_mark, bs.returnDate, bs.subbatchID, bs.question, if(bs.subbatchID=0, 'All', sub.subbatchName) AS subbatchName, bt.batchName, subj.subjectName, subj.subjectDesc, sa.staffName FROM batch_assignment bs INNER JOIN batches bt ON bt.batchID=bs.batchID AND bt.semID=bs.semID INNER JOIN subjects subj ON subj.subjectID=bs.subjectID INNER JOIN staffaccounts sa ON sa.staffID=bs.staffID LEFT JOIN subbatches sub ON bs.subbatchID=sub.subbatchID WHERE submissionDate='".date('Y-m-d', strtotime($submissionDate))."' AND bs.assiNu is not null AND bs.assiNu !=0 ";
        if($deptId)
        {
           $sql .="AND bt.deptID=$deptId ";
        }
        if($batchId)
        {
            $sql .="AND bs.batchID=$batchId ";
        }
        $sql .="ORDER BY bs.assignmentID DESC";
        try
        {
            return $this->executeQueryForList($sql);
        }
        catch(\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        
    }
    public function getAssignmentDetailsByBatchSemAndSubjectId($batchID, $semID, $subjectId){
        $batchID = $this->realEscapeString($batchID);
        $semID = $this->realEscapeString($semID);
        $subjectId = $this->realEscapeString($subjectId);
        
        $sql = "SELECT assignmentID as id, question, assiNu, max_mark as maxMark FROM batch_assignment WHERE batchID = $batchID AND subjectID = $subjectId AND semID = $semID ORDER BY assiNu";
        
        try
        {
            $assignmentList = $this->executeQueryForList($sql);
        }
        catch(\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $assignmentList;
    }
    public function getAllStudentMarksAndCoReportOfABatchAndSemester($batchID, $semID, $subjectId = null, $subbatchID = 0, $sortByColumn = "rollNo"){
        $batchID = $this->realEscapeString($batchID);
        $semID = $this->realEscapeString($semID);
        $subjectId = $this->realEscapeString($subjectId);
        $subbatchID = $this->realEscapeString($subbatchID);
        $sortByColumn = $this->realEscapeString($sortByColumn);
        try{
            $studentList = StudentService::getInstance()->getAllStudentsOfABatchByBatchIdSemIdAndSubbatchId($batchID, $semID,$subbatchID, $sortByColumn);
        }catch(\Exception $e){
            $studentList = null;
        }
        if(empty($studentList)){
            return null;
        }
        foreach($studentList as $student){
            $student->assignmentMarkAndCoDetails = $this->getAllAssignmentMarkListByStudentId($student->studentID, $batchID, $semID, $subjectId);
            foreach($student->assignmentMarkAndCoDetails as $markDetails){
                $markDetails->coList = $this->getCoValuesForAnAssignment($markDetails->assignmentID,$student->studentID, $batchID, $semID, $subjectId);
            }
        }
        return $studentList;
    }
    /**
     * to get the maximum mark gien for a student in an assignment by assignmentID
     *
     * @param int $assignmentID
     * @return int
     */
    public function getStudentMaxMarkGivenForAssignmentByAssignmentID($assignmentID)
    {
        $assignmentID = $this->realEscapeString($assignmentID);
        $sql="select MAX(marksObtained) as maxMarkObtained from assignment_marks where assignmentID='$assignmentID';";
        try
        {
            $maxMark= $this->executeQueryForObject($sql)->maxMarkObtained;    
        }
        catch(\Exception $e)
        {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $maxMark;
    }
    /**
     * To get the maximum mark given for a student in a pseudo assignment
     *
     * @param int $psID
     * @param int $assiNuP
     * @return int
     */
    public function getStudentMaxMarkGivenForPsassignment($psID,$assiNuP)
    {
        $psID = $this->realEscapeString($psID);
        $assiNu = $this->realEscapeString($assiNuP);
        $sql="select MAX(am.marksObtained) as mark from batch_assignment ba left join assignment_marks am on ba.assignmentID=am.assignmentID where ba.psID='$psID' and ba.assiNu='$assiNu';";
        try
        {
            $maxMark= $this->executeQueryForObject($sql)->mark;    
        }
        catch(\Exception $e)
        {
            throw new ProfessionalException($e->getCode(), $e->getMessage());    
        }
        return $maxMark;
    }
    /**
     * @param NBAQuestion $assessmentQuestion
     * @return Object|null
     * @throws ProfessionalException
     * @author Vishnu M (Fri, Jan 17, 2020)
     */
    public function saveAssessmentQuestion ( NBAQuestion $assessmentQuestion ) {
        $assessmentQuestion = $this->realEscapeObject($assessmentQuestion);
        $sql = null;
        $assessmentQuestionId = null;
        try {
            $sql = "INSERT INTO assessment_questions (question, mark, attachments, subjectID, sbs_id, public_question, blooms_level, lin_resource_id ) VALUES (
                '$assessmentQuestion->question',
                '$assessmentQuestion->mark',
                '$assessmentQuestion->attachments',
                '$assessmentQuestion->subjectID',
                '$assessmentQuestion->sbsId',
                '$assessmentQuestion->publicQuestion',
                '$assessmentQuestion->bloomsLevel',
                '$assessmentQuestion->linResourceId'
            )";
           $assessmentQuestionId = $this->executeQueryForObject($sql, true);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
        return $assessmentQuestionId;
    }
    /**
     * @param $request
     * @return Object|null
     * @throws ProfessionalException
     * @author Vishnu M
     */
    public function getAssessmentStructureByBatchSemSubject( $request ) {
        $request = $this->realEscapeObject($request);
        $sql = null;
        $assessmentStructure = null;
        try {
            $sql = "SELECT 
                        id
                    FROM 
                        assessment_structure 
                    WHERE 
                        batchID = '$request->batchId
                        AND semID = '$request->semId
                        AND subjectID = '$request->subjectId
                        AND subbatchID = '$request->subbatchId
                        AND staffID = '$request->staffId'
                        AND assessment_key = '$request->assessmentKey'
                        AND assessment_type = '$request->assessmentType";
            $assessmentStructure = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
        return $assessmentStructure;
    }
    /**
     * @param $assignmentId
     * @return Object|null
     * @throws ProfessionalException
     * @author Vishnu M
     */
    public function getAssessmentByAssignmentId($assignmentId) {
        $assignmentId = $this->realEscapeObject($assignmentId);
        $sql = null;
        $assessment = null;
        try {
            $sql = "SELECT 
                        ass.id,
                        ass.exam_type_id AS examTypeId,
                        ass.header,
                        ass.qpcode,
                        ass.subjectID AS subjectId,
                        ass.staffID AS staffId,
                        ass.batchID AS batchId,
                        ass.semID AS semId,
                        ass.maxMark,
                        ass.duration,
                        ass.subbatchID AS subbatchId,
                        ass.isPublic,
                        ass.isFinalised,
                        ass.isSubmitted,
                        ass.assessment_key AS assessmentKey,
                        ass.assessment_type AS assessmentType
                    FROM
                        assessment_structure ass
                            INNER JOIN
                        batch_assignment ba ON ass.batchID = ba.batchID
                            AND ass.semID = ba.semID
                            AND ass.subjectID = ba.subjectID
                            AND ass.staffID = ba.staffID
                            AND ass.subbatchID = ba.subbatchID
                            AND (ass.assessment_key = ba.assiNu OR ass.assessment_key = ba.externalAssiNu)
                            AND ass.assessment_type = 'ASSIGNMENT'
                    WHERE
                        ba.assignmentID = '$assignmentId";
            $assessment = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
        return $assessment;
    }
    public function getAssignmentSubmittedStudentIds($assignmentId)
    {
        $submittedStudentIds = [];
        $submittedStudentResult = [];
        $submittedStudentSql = "SELECT DISTINCT studentID as studentId from assignment_marks where assignmentID='$assignmentId'";
        $submittedStudentResult = $this->executeQueryForList($submittedStudentSql);
        if ($submittedStudentResult && count($submittedStudentResult) > 0) {
            foreach ($submittedStudentResult as $student) {
                $submittedStudentIds[] = $student->studentId;
            }
        }
        return $submittedStudentIds;
    }
    
    public function getAssignmentStudentListForQuestionWiseMarkEnrty($isCurrentSem,$semId,$batchId,$subbatchId,$assignmentId,$studentId = null)
    {
        $isCurrentSem = $this->realEscapeString($isCurrentSem);
        $semId = $this->realEscapeString($semId);
        $batchId = $this->realEscapeString($batchId);
        $subbatchId = $this->realEscapeString($subbatchId);
        $assignmentId = $this->realEscapeString($assignmentId);
        $sortByColumn = BatchService::getInstance()->getStudentSortByColumnOfABatch($batchId);
        if(empty($sortByColumn)){
            $sortByColumn = 'rollNo';
        }
        $condition = ""; 
        if(!empty($studentId)){
            $condition = " AND sa.studentID = $studentId";
        }
        
            if ($subbatchId) 
            {
                if($isCurrentSem)
                {
                    $sql = "select sa.studentID, sa.studentName,sa.rollNo,sa.studentAccount, asm.assessment_structure_questions_id,
                    asm.mark_obtained,sas.resourseId as resourceId, sas.isSubmited, sas.isConfirmed, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type,
                    rwasm.rubric_wise_assessment_id,
                    rwasm.rubric_wise_assessment_criteria_and_details_id,
                    rwasm.mark_obtained AS rubricMark,qa.question 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  LEFT JOIN 
                    assessment_student_marks asm ON (asm.studentID = sa.studentID and asm.assessment_id = $assignmentId AND asm.assessment_type = 'ASSIGNMENT') LEFT JOIN student_assinments sas ON sas.studentID = sa.studentID AND assinmentID =$assignmentId left join lin_resource lr ON lr.id=sas.resourseId  LEFT JOIN
                    assessment_structure_questions asq ON asq.id = asm.assessment_structure_questions_id
                        LEFT JOIN
                    rubric_wise_assessment rwa ON rwa.assessment_question_id = asq.assessment_questions_id
                        LEFT JOIN
                    rubric_wise_assessment_student_mark rwasm ON rwasm.rubric_wise_assessment_id = rwa.id
                        AND rwasm.student_id = sa.studentID 
                        LEFT JOIN 
                        assessment_questions qa ON qa.id = asq.assessment_questions_id
                        where sa.batchID=$batchId and ss.subbatchID = $subbatchId and joinedSem.orderNo <= sem.orderNo $condition ORDER BY sa.$sortByColumn;";
                }
                else 
                {
                    $semDetails = SemesterService::getInstance()->getSemDetailsBySemId($semId);
                    $sql= "SELECT 
                    sa.studentID,
                    sa.studentName,
                    rollNo,
                    sa.regNo,
                    asm.assessment_structure_questions_id,
                    asm.mark_obtained,
                    sas.resourseId AS resourceId,
                    sas.isSubmited,
                    sas.submissionDate,
                    lr.path,
                    lr.storage_object,
                    lr.backend_type,
                    sas.isConfirmed,
                    rwasm.rubric_wise_assessment_id,
                    rwasm.rubric_wise_assessment_criteria_and_details_id,
                    rwasm.mark_obtained AS rubricMark
                FROM
                    studentaccount sa
                        INNER JOIN
                    subbatch_student ss ON sa.studentID = ss.studentID
                        LEFT JOIN
                    assessment_student_marks asm ON (asm.studentID = sa.studentID
                        AND asm.assessment_id = $assignmentId
                        AND asm.assessment_type = 'ASSIGNMENT')
                        LEFT JOIN
                    student_assinments sas ON sas.studentID = sa.studentID
                        AND assinmentID = $assignmentId
                        LEFT JOIN
                    lin_resource lr ON lr.id = sas.resourseId
                        LEFT JOIN
                    assessment_structure_questions asq ON asq.id = asm.assessment_structure_questions_id
                        LEFT JOIN
                    rubric_wise_assessment rwa ON rwa.assessment_question_id = asq.assessment_questions_id
                        LEFT JOIN
                    rubric_wise_assessment_student_mark rwasm ON rwasm.rubric_wise_assessment_id = rwa.id
                        AND rwasm.student_id = sa.studentID
                WHERE
                    subbatchID = $subbatchId
                        AND sa.studentID IN (SELECT 
                            studentID
                        FROM
                            studentaccount sa
                                INNER JOIN
                            batches ba ON sa.batchID = ba.batchID
                                INNER JOIN
                            semesters sem ON sem.semID = ba.semID
                                INNER JOIN
                            semesters joinedSem ON sa.joiningSemId = joinedSem.semID
                        WHERE
                            ba.batchID = $batchId
                                AND joinedSem.orderNo <= $semDetails->orderNo  UNION SELECT 
                            sa.studentID
                                
                        FROM
                            failed_students fs
                                INNER JOIN
                            studentaccount sa ON sa.studentID = fs.studentID
                                INNER JOIN
                            semesters fsem ON fsem.semID = fs.failedInSemester
                                INNER JOIN
                            semesters joinedSem ON sa.joiningSemId = joinedSem.semID
                        WHERE
                            previousBatch = $batchId AND fsem.orderNo > $semDetails->orderNo 
                                AND joinedSem.orderNo <= $semDetails->orderNo )
                ORDER BY $sortByColumn";
                }
            }
            else
            {
                if($isCurrentSem)
                {
                    $sql = "select sa.studentID, sa.studentName,sa.rollNo, asm.assessment_structure_questions_id,
                    asm.mark_obtained,sas.resourseId as resourceId, sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sas.isConfirmed,
                    rwasm.rubric_wise_assessment_id,
                    rwasm.rubric_wise_assessment_criteria_and_details_id,
                    rwasm.mark_obtained AS rubricMark ,qa.question 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 LEFT JOIN 
                    assessment_student_marks asm ON (asm.studentID = sa.studentID and asm.assessment_id = $assignmentId AND asm.assessment_type = 'ASSIGNMENT') LEFT JOIN student_assinments sas ON sas.studentID = sa.studentID AND assinmentID =$assignmentId left join lin_resource lr ON lr.id=sas.resourseId  LEFT JOIN
                    assessment_structure_questions asq ON asq.id = asm.assessment_structure_questions_id
                        LEFT JOIN
                    rubric_wise_assessment rwa ON rwa.assessment_question_id = asq.assessment_questions_id
                        LEFT JOIN
                    rubric_wise_assessment_student_mark rwasm ON rwasm.rubric_wise_assessment_id = rwa.id
                        AND rwasm.student_id = sa.studentID 
                        LEFT JOIN 
                        assessment_questions qa ON qa.id = asq.assessment_questions_id where sa.batchID=$batchId and joinedSem.orderNo <= sem.orderNo $condition ORDER BY sa.$sortByColumn";
                }
                else 
                {
                    $semDetails = SemesterService::getInstance()->getSemDetailsBySemId($semId);
                    
                    $sql = "select sa.studentID, sa.studentName, sa.rollNo, sa.studentAccount, sa.regNo, asm.assessment_structure_questions_id,
                    asm.mark_obtained,sas.resourseId as resourceId, sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sas.isConfirmed,
                    rwasm.rubric_wise_assessment_id,
                    rwasm.rubric_wise_assessment_criteria_and_details_id,
                    rwasm.mark_obtained AS rubricMark,qa.question FROM studentaccount sa inner join batches ba on sa.batchID =  ba.batchID inner join semesters joinedSem on sa.joiningSemId = joinedSem.semID LEFT JOIN 
                    assessment_student_marks asm ON (asm.studentID = sa.studentID and asm.assessment_id = $assignmentId AND asm.assessment_type = 'ASSIGNMENT') LEFT JOIN student_assinments sas ON sas.studentID = sa.studentID AND assinmentID =$assignmentId left join lin_resource lr ON lr.id=sas.resourseId LEFT JOIN assessment_structure_questions asq ON asq.id = asm.assessment_structure_questions_id  LEFT JOIN
                    rubric_wise_assessment rwa ON rwa.assessment_question_id = asq.assessment_questions_id LEFT JOIN
                    rubric_wise_assessment_student_mark rwasm ON rwasm.rubric_wise_assessment_id = rwa.id AND rwasm.student_id = sa.studentID 
                    LEFT JOIN 
                    assessment_questions qa ON qa.id = asq.assessment_questions_id 
                    where ba.batchID = $batchId and joinedSem.orderNo <= $semDetails->orderNo 
                    UNION 
                    select sa.studentID, sa.studentName, sa.rollNo, sa.studentAccount, sa.regNo, asm.assessment_structure_questions_id,
                    asm.mark_obtained,sas.resourseId as resourceId, sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type,
                    sas.isConfirmed,rwasm.rubric_wise_assessment_id,
                    rwasm.rubric_wise_assessment_criteria_and_details_id,
                    rwasm.mark_obtained AS rubricMark,qa.question  from failed_students fs left join studentaccount sa on fs.studentID= sa.studentID LEFT JOIN 
                    assessment_student_marks asm ON (asm.studentID = sa.studentID and asm.assessment_id = $assignmentId AND asm.assessment_type = 'ASSIGNMENT') LEFT JOIN student_assinments sas ON sas.studentID = sa.studentID AND assinmentID =$assignmentId left join lin_resource lr ON lr.id=sas.resourseId inner join semesters fsem on fsem.semID = fs.failedInSemester inner join semesters joinedSem on sa.joiningSemId = joinedSem.semID  LEFT JOIN
                    assessment_structure_questions asq ON asq.id = asm.assessment_structure_questions_id
                        LEFT JOIN
                    rubric_wise_assessment rwa ON rwa.assessment_question_id = asq.assessment_questions_id
                        LEFT JOIN
                    rubric_wise_assessment_student_mark rwasm ON rwasm.rubric_wise_assessment_id = rwa.id
                        AND rwasm.student_id = sa.studentID             
                        LEFT JOIN 
                    assessment_questions qa ON qa.id = asq.assessment_questions_id where previousBatch =$batchId and fsem.orderNo > $semDetails->orderNo and joinedSem.orderNo <= $semDetails->orderNo  $condition order by $sortByColumn";
                }
            }
            try{
                return $this->executeQueryForList($sql, $this->mapper[AssignmentServiceMapper::GET_STUDENT_ASSESSMENT_QUESTION_AND_MARK]);
            }catch (\Exception $e) {
                throw new ProfessionalException ($e->getCode(), $e->getMessage());
            }
    }
    public function assignmentMarkIsApproved($assiNu,$batchId,$semId)
    {
        $assiNu = $this->realEscapeString($assiNu);
        $semId = $this->realEscapeString($semId);
        $batchId = $this->realEscapeString($batchId);
        $markApproved = "select isAproved from aprove_assignment_marks where semID=$semId and batchID=$batchId and assignmentnumber=$assiNu";
        try{
            return $this->executeQueryForObject($markApproved)->isAproved;
        }catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    public function checkAssignmentMark($assignmentId)
    {
        $assignmentId = $this->realEscapeString($assignmentId);
        try {
            $sql_check = "SELECT DISTINCT markID FROM assignment_marks WHERE assignmentID = ".$assignmentId."";
            $assessmentMarks = $this->executeQueryForList($sql_check);
            if(count($assessmentMarks)){
                 $sql_check_question_mark = "SELECT id FROM assessment_student_marks WHERE assessment_id = ".$assignmentId." AND assessment_type = 'ASSIGNMENT'";
                 $assessmentQuestionMarks = $this->executeQueryForList($sql_check_question_mark);
                 if(count($assessmentQuestionMarks)==0){
                     $enableAssessmentQuestionMarkEntry = 0;
                     return $enableAssessmentQuestionMarkEntry;
                 }
            }
            return $enableAssessmentQuestionMarkEntry = 1;
         } catch (\Exception $e) {
             throw new ProfessionalException ($e->getCode(), $e->getMessage());
         }
    }
    public function upsertAssignmentStudentTotalMark($assignmentDetail)
    {
        $assignmentDetail = $this->realEscapeObject($assignmentDetail);
        
        $sqlCheckMark = "SELECT t1.markID, t1.marksObtained, t1.studentID FROM assignment_marks t1  WHERE t1.studentID=$assignmentDetail->studentId AND t1.csID IS NULL AND t1.assignmentID = $assignmentDetail->assignmentId";
        $markResult =  $this->executeQueryForObject($sqlCheckMark);
        if ($markResult) {
            $sql = "UPDATE assignment_marks SET marksObtained=" . $assignmentDetail->studentTotalMark . ", percentage = " . $assignmentDetail->percentage . " where studentID=$assignmentDetail->studentId AND csID IS NULL and assignmentID = $assignmentDetail->assignmentId";
        } else {
            $sql = "insert into assignment_marks (studentID, marksObtained, assignmentID, percentage,psID) values ($assignmentDetail->studentId$assignmentDetail->studentTotalMark$assignmentDetail->assignmentId$assignmentDetail->percentage,$assignmentDetail->pseudoSubjectId)";
        }
        $sqlUpdateStatus = "update student_assinments set isSubmited=1, submissionDate= UTC_TIMESTAMP() where assinmentID=$assignmentDetail->assignmentId and  studentID=$assignmentDetail->studentId";
        try {
            $this->executeQueryForObject($sqlUpdateStatus);
            
            return $this->executeQueryForObject($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
            
        }
    }
    
    public function upsertConfirmStudentAssignmentTotalMarks($assignmentDetails){
        $assignmentDetails = $this->realEscapeArray($assignmentDetails);
        $values = [];
        $studentIDs = [];
       
        foreach( $assignmentDetails as $assignmentDetail) {
            $assignmentDetail->percentage = ($assignmentDetail->studentTotalMark / $assignmentDetail->totalMark) * 100;
            $assignmentDetail->pseudoSubjectId =  $assignmentDetail->pseudoSubjectId ? $assignmentDetail->pseudoSubjectId : 0;
            $studentIDs[] = $assignmentDetail->studentId;
            $values[] = "($assignmentDetail->studentId, '$assignmentDetail->studentTotalMark', $assignmentDetail->assignmentId$assignmentDetail->percentage$assignmentDetail->pseudoSubjectId)";
        }
        
         $sqlUpdateStatus = "UPDATE student_assinments SET isSubmited=1, submissionDate= UTC_TIMESTAMP() WHERE assinmentID = ".$assignmentDetails[0]->assignmentId." AND studentID IN (" .implode(",",$studentIDs) .")"; 
         
         $sql_insert = "INSERT INTO assignment_marks (studentID, marksObtained, assignmentID, percentage, psID) VALUES " .implode(",", $values) ."ON DUPLICATE KEY UPDATE marksObtained = VALUES (marksObtained),  percentage = VALUES (percentage)";
       
        try {
            $this->executeQuery($sqlUpdateStatus);
            return $this->executeQuery($sql_insert);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getStudentAssignmentDetailsByStudentId($studentId, $assignmentId)
    {
        $studentId = $this->realEscapeString($studentId);
        $assignmentId = $this->realEscapeString($assignmentId);
        $sql = "SELECT sa.studentAssinmentID, sa.resourseId, sa.docPDFPath, DATE_FORMAT(CONVERT_TZ(sa.docUploadtime,'+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s') as docUploadtime, sa.isSubmited, sa.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sa.isConfirmed, sa.assignmentStatus, sa.remarks FROM student_assinments sa left join lin_resource lr ON lr.id=sa.resourseId WHERE studentID = $studentId AND assinmentID =$assignmentId";
        try
        {
            return $this->executeQueryForObject($sql);
        }
        catch(\Exception $e)
        {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    
    public function addStudentAssignment(StudentAssinments $studentAssignments)
    {
        if(!$studentAssignments->studentAssinmentID)
        {
            $sql = "insert into student_assinments (assinmentID, docPDFPath, docImgPath, docSWFPath, studentID,isSubmited,resourseId, assignmentStatus, submissionDate, docUploadtime) values ('$studentAssignments->assinmentID','$studentAssignments->docPDFPath','$studentAssignments->docImgPath' ,'$studentAssignments->docSWFPath' ,'$studentAssignments->studentID',1,'$studentAssignments->resourseId', '$studentAssignments->assignmentStatus','$studentAssignments->submissionDate',utc_timestamp())";
        }
        else
        {
            $sql = "UPDATE student_assinments SET resourseId='$studentAssignments->resourseId', submissionDate='$studentAssignments->submissionDate',docUploadtime=utc_timestamp(), isSubmited=1, assignmentStatus='$studentAssignments->assignmentStatus' WHERE studentAssinmentID=$studentAssignments->studentAssinmentID";
        }
        try
        {
            return $this->executeQuery($sql,true);
        }
        catch(\Exception $e)
        {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $pseudoSubjectId 
     * @param $assiNu
     * @param $staffId
     */
    
    public function getPseudoSubjectAssignmentDetails($pseudoSubjectId,$assiNu,$staffId, $isExternal=0)
    {
        $pseudoSubjectId = $this->realEscapeString($pseudoSubjectId);
        $assiNu = $this->realEscapeString($assiNu);
        $staffId = $this->realEscapeString($staffId);
        $isExternal = $this->realEscapeString($isExternal);
        $sql = "SELECT ps.pseudosubjectID,sbs.batchID as batchId,sbs.semID as semId,sbs.subjectID,sbs.staffID,ps.subjectName,bat.batchDesc,bat.batchName,su.subbatchID as subbatchId,ba.assignmentID,ba.assiNu,
        ba.question, ba.description, ba.submissionDate, ba.submissionTime, ba.batchID, ba.staffID, ba.subjectID, ba.semID, ba.assiNu, ba.docPath, ba.docName, ba.max_mark, ba.returnDate, ba.psID, ba.subbatchID, ba.restrictStudentSubmit, ba.enableConfirm, ba.asyncReportsId, ar.lin_resource_id as linResourseId, ba.is_published_student_marks as isPublishedStudentMarks
        FROM pseudosubjects_sbs psbs
            INNER JOIN sbs_relation sbs ON sbs.sbsID = psbs.sbsID
            INNER JOIN pseudosubjects ps ON ps.pseudosubjectID = psbs.pseudosubjectID
            INNER JOIN subbatches su ON su.psID = psbs.pseudosubjectID AND su.batchID = sbs.batchID AND su.semID = sbs.semID
            INNER JOIN batches bat ON bat.batchID = sbs.batchID
             LEFT JOIN batch_assignment ba ON ba.batchID = sbs.batchID AND ba.semID = sbs.semID AND ba.subjectID = sbs.subjectID AND ba.staffID = sbs.staffID AND ".($isExternal?"ba.externalAssiNu = $assiNu":"ba.assiNu = $assiNu")." LEFT JOIN async_reports ar ON ba.asyncReportsId=ar.id
        WHERE psbs.pseudosubjectID = '$pseudoSubjectId' AND sbs.staffID = $staffId ORDER BY ba.assignmentID DESC;";
        try {
            return $this->executeQueryForList($sql);
        }
        catch(\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());    
        }
    }
    public function createAssignmentForEachSubBatches($assignmentDetail,$subbatches)
    {
        $assignmentDetail = $this->realEscapeObject($assignmentDetail);
        $subbatches = $this->realEscapeObject($subbatches);
        $sql = "INSERT INTO `batch_assignment` 
            (`question`, `description`, `submissionDate`, `submissionTime`, `batchID`, `staffID`, `subjectID`, `semID`, `assiNu`, `docPath`, `docName`, `max_mark`, `returnDate`, `psID`, `subbatchID`, `restrictStudentSubmit`) 
            VALUES ";
        $row = "";    
        foreach($subbatches as $subbatch)
        {
            $row =$row?$row.',':$row;
            $row .= "('$assignmentDetail->question', '$assignmentDetail->description',".($assignmentDetail->submissionDate?"'".$assignmentDetail->submissionDate."'":'NULL').", '$assignmentDetail->submissionTime', '$subbatch->batchId', '$assignmentDetail->staffID', '$assignmentDetail->subjectID', '$assignmentDetail->semID', '$assignmentDetail->assiNu', '', '', '$assignmentDetail->max_mark', ".($assignmentDetail->returnDate?"'".$assignmentDetail->returnDate."'":'NULL').", '$assignmentDetail->psID', '$subbatch->subbatchId', '$assignmentDetail->restrictStudentSubmit')";
        }
        try {
            if($row)
            {
                $this->executeQuery($sql.$row);
            }
            else 
            {
                return false;
            }
        } catch(\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());    
        }
    }
    public function getAllStudentMarksAndCoReportOfABatchAndSemesterForAssignment($batchID, $semID, $subjectId = null, $subbatchID = 0, $sortByColumn = "rollNo"){
        $batchID = $this->realEscapeString($batchID);
        $semID = $this->realEscapeString($semID);
        $subjectID = $this->realEscapeString($subjectId);
        $subbatchID = $this->realEscapeString($subbatchID);
        $sortByColumn = $this->realEscapeString($sortByColumn);
        try{
            $studentList = StudentService::getInstance()->getAllStudentsOfABatchByBatchIdSemIdAndSubbatchId($batchID, $semID,$subbatchID, $sortByColumn);
        }catch(\Exception $e){
            $studentList = null;
        }
        if(empty($studentList)){
            return null;
        }
        foreach($studentList as $student){
            $studentID = $student->studentID;
            $studentName = $student->studentName;
            $rollNo = $student->rollNo;
            $sql_type = "SELECT t1.assessment_id as assignmentId,t2.assiNu  from assessment_student_marks t1,batch_assignment t2 WHERE t1.assessment_id = t2.assignmentID
            AND t1.assessment_type = 'ASSIGNMENT' AND t1.studentID = \"" . $studentID . "\" AND t2.subjectID = \"" . $subjectID . "\" " . $condition . " GROUP BY assignmentId";
            $assignmentIdList = $this->executeQueryForList($sql_type);
            $student->assignments = [];
            foreach ($assignmentIdList as $row_type) {
                $assignmentId = $row_type->assignmentId;
                $assignmentNo = $row_type->assiNu;
                // $student->assignments[$assignmentId] = new \StdClass();
                $student->assignments[$assignmentId]->coList = [];
                $studentMarkList = NbaCoService::getInstance()->getCOReportOfAssignment($assignmentId, $studentID, $subjectID);
                $validStudentQuestionIds = NbaCoService::getInstance()->getSectionWiseValidQuestionIdsForCoCalculationOfAStudentForAssignment($assignmentId, $studentID);
                $student->assignments[$assignmentId]->marksObtained = $this->getAssignmentMarksOfAStudent($studentID,$assignmentId);
                // $result_mark = sql_query($sql_mark, $connect);
                if (!empty($studentMarkList)) {
                    //Assumption that all marks have same question paper id
                    $questionPaperId = $studentMarkList[0]->id;
                    $totalCoPercentList = NbaCoService::getInstance()->calculateTotalCOPercents($validStudentQuestionIds->nbaCourseOutcomeQuestionsIdList, $questionPaperId);
                    foreach ($studentMarkList as $row_mark) {
                        $row_mark = (array)$row_mark;
                        if (!in_array($row_mark['assessment_structure_questions_id'], $validStudentQuestionIds->nbaCourseOutcomeQuestionPaperQuestionsIdList) || !in_array($row_mark['assessment_questions_id'], $validStudentQuestionIds->nbaCourseOutcomeQuestionsIdList)) {
                            continue;
                        }
                        $assessment_structure_questions_id = $row_mark['assessment_structure_questions_id'];
                        $mark_obtained = $row_mark['mark_obtained'];
                        $maxMark = $row_mark['mark'];
                        $assessment_questions_id = $row_mark['assessment_questions_id'];
                        $nba_course_outcome_id = $row_mark['nba_course_outcome_id'];
                        $course_outcome_value = $row_mark['course_outcome_value'];
                        $course_outcome_question_paper_id = $row_mark['id'];
                        $course_outcome_value = $course_outcome_value / 100;
                        //1.Take distinct sections 
                        //2.Calculate Individual Section co total
                        $per_percent = $totalCoPercentList[$nba_course_outcome_id] / 100;
                        $percentage = ($mark_obtained / $maxMark) * ($course_outcome_value);
                        $exactValue = ($percentage / $per_percent) * 100;
                        $student->assignments[$assignmentId]->coList[$nba_course_outcome_id] += $exactValue;
                    }
                }
                foreach($student->assignments[$assignmentId]->coList as $key =>$co){
                    $student->assignments[$assignmentId]->coList[$key] = round($co,2);
                }
            }
            unset($values);
            unset($totalValue);
        }
        return $studentList;
    }
    public function getAssignmentMarksOfAStudent($studentId,$assignmentId)
    {
        $studentId = $this->realEscapeString($studentId);
       
        $assignmentId = $this->realEscapeString($assignmentId);
        $sql = "select marksObtained from assignment_marks WHERE assignmentID =$assignmentId AND studentID = $studentId  ";
        try {
            return $this->executeQueryForObject($sql)->marksObtained;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    
    public function getAssignmentList($batchId,$semId,$subjectId,$subBatchId = 0)
    {
        $batchId = $this->realEscapeString($batchId);
        $subjectId = $this->realEscapeString($subjectId);
        $semId = $this->realEscapeString($semId);
        $subBatchId = $this->realEscapeString($subBatchId);
        $cond = "";
        $cond .= $subBatchId?" AND subbatchID = ".$subBatchId."": "";
        $sql = "SELECT assignmentID as id, max_mark as maxMark,assiNu, submissionDate, description, returnDate, question, docPath, docName from batch_assignment WHERE batchID =$batchId AND semID = $semId AND subjectID = $subjectId ".$cond;
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    
    /**
     * get assignment details by subject id
     * @param int $batchId
     * @param int $subjectId
     * @param int $staffId
     * @throws ProfessionalException
     * @return object|array|\com\linways\base\util\$objectList[]
     */
    public function getExternalAssignmentDetailsBySubjectId($batchId, $subjectId, $staffId, $semId = null, $subbatchID = null, $userType=null)
    {
        $batchId = $this->realEscapeString($batchId);
        $subjectId = $this->realEscapeString($subjectId);
        $staffId = $this->realEscapeString($staffId);
        $conditions = "";
        if ( $semId ) {
            $semId = $this->realEscapeString($semId);
            $conditions .= " AND bs.semID = ".$semId." ";
        }
        if($subbatchID){
            $subbatchID = $this->realEscapeString($subbatchID);
            $conditions .= " AND bs.subbatchID = ".$subbatchID." ";
        }
        if($userType)
        {
            $userType = $this->realEscapeString($userType);
            $conditions .= " AND bs.userType = '".$userType."' ";
        }
        $assignmentList=[];
        $sql = "SELECT bs.assignmentID, bs.question, bs.description, bs.submissionDate, bs.submissionTime, bs.assiNu,bs.docName, bs.docPath, bs.max_mark, bs.returnDate, bs.subbatchID, if(bs.subbatchID=0, 'All', sub.subbatchName) AS subbatchName, restrictStudentSubmit, bs.is_published as isPublished, bs.publishDate, bs.publishTime, bs.userType, bs.externalAssiNu, bs.enableConfirm FROM batch_assignment bs LEFT JOIN subbatches sub ON bs.subbatchID=sub.subbatchID WHERE bs.batchID=$batchId AND bs.subjectID=$subjectId AND bs.staffID=$staffId ".$conditions." AND (bs.assiNu=0 OR bs.assiNu is null) ORDER BY bs.assignmentID DESC";
        
        try{
            $assignmentList = $this->executeQueryForList($sql,$this->mapper[AssignmentServiceMapper::GET_ASSIGNMENT_DETAILS]);
        }catch (\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        
        return $assignmentList;
    }
    
    /**
     * get student assignment list
     * @param int $studentId
     * @param int $batchId
     * @throws ProfessionalException
     * @return object|array|\com\linways\base\util\$objectList[]
     */
    public function getAssignmentListByStudent($studentId, $batchId, $staffId=null, $subjectId=null, $checkPublish = null)
    {
        $studentId= $this->realEscapeString($studentId);
        $batchId= $this->realEscapeString($batchId);
        $staffId= $this->realEscapeString($staffId);
        $subjectId= $this->realEscapeString($subjectId);
        $condition="";
        if($staffId)
        {
            $condition .=" AND (ba.staffID=$staffId OR ba.userType='ADMIN')";
        }
        if($subjectId)
        {
            $condition .=" AND ba.subjectID=$subjectID";
        }
        $checkCondition = "";
        if($checkPublish){
            $checkCondition .=" AND (((!ba.publishDate AND !ba.publishTime) OR ba.publishDate = '00-00-0000') OR (ba.publishDate AND ba.publishTime AND ba.publishDate <> '00-00-0000' AND concat(ba.publishDate,' ',ba.publishTime) <= '".date('Y-m-d h:i A')."')
            ) ";
        }
        $sql = "SELECT ba.assignmentID, ba.question, sub.subjectName, ba.submissionDate, ba.submissionTime, sub.subjectDesc,ba.docPath,ba.docName ,ba.assiNu, ba.externalAssiNu, ba.publishDate, ba.publishTime, sa.isSubmited, sa.submissionDate as submittedDate, sa.isConfirmed,sa.assignmentStatus FROM batch_assignment ba INNER JOIN subjects sub ON sub.subjectID=ba.subjectID INNER JOIN batches bt ON bt.batchID=ba.batchID AND bt.semID=ba.semID LEFT JOIN student_assinments sa ON sa.studentID=$studentId AND sa.assinmentID=ba.assignmentID LEFT JOIN subbatches subb ON subb.subbatchID=ba.subbatchID LEFT JOIN subbatch_student ss ON ss.subbatchID=subb.subbatchID AND ss.studentID=$studentId WHERE bt.batchID=$batchId AND ba.is_published =1 AND (ss.subbatchID is not null OR subb.subbatchID is null) $checkCondition order by ba.publishDate desc, str_to_date(ba.publishTime, '%l:%i %p') desc, ba.submissionDate asc";
        
        
        try {
            
            return $this->executeQueryForList($sql);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
    }
    
    
    public function confirmStudentAssignment($studentId, $assignmentId)
    {
        $studentId= $this->realEscapeString($studentId);
        $assignmentId= $this->realEscapeString($assignmentId);
        $sql="update student_assinments set isConfirmed=1, assignmentStatus='CONFIRMED' where studentID='$studentId' and assinmentID='$assignmentId'";
        try {
            return $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    
    public function unconfirmStudentAssignment($studentId, $assignmentId)
    {
        $studentId= $this->realEscapeString($studentId);
        $assignmentId= $this->realEscapeString($assignmentId);
        $sql="update student_assinments set isConfirmed=0, assignmentStatus='RECONFIRM_PENDING' where studentID='$studentId' and assinmentID='$assignmentId'";
        try {
            return $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    
    public function updateStudentAssignmentRemarks($studentId, $assignmentId, $remarks)
    {
        $studentId= $this->realEscapeString($studentId);
        $assignmentId= $this->realEscapeString($assignmentId);
        $remarks = $this->realEscapeString($remarks);
        $sql="update student_assinments set remarks='$remarks' where studentID='$studentId' and assinmentID='$assignmentId'";
        try {
            return $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getAllAssignmentDetailsBySbsId($request)
    {
        $request = $this->realEscapeObject($request);
        try{
            //SUBMITED const given in 'student_assinments' for submitted students
            $detailed_select = "select std.studentID,std.studentName,std.batchID,std.regNo,std.rollNo,concat('[',group_concat(distinct JSON_OBJECT('assignmentId',ba.assignmentID,'assignmentNo',ba.assiNu,'maxMark',ba.max_mark,'marksObtained',am.marksObtained,'status',sa.assignmentStatus)),']') as studentMarks";
            $minimal_select = "select ba.assignmentID,ba.assiNu,count(am.studentID) as submitted, count(std.studentID) as totalStudents,ba.max_mark,(sum(am.marksObtained)/(count(am.studentID)*ba.max_mark))*100 as averageMarks,ba.question,ba.description, concat(ba.submissionDate,' ',ba.submissionTime) as submissionDate,sum(if(sa.assignmentStatus = 'PENDING',1,0)) as pendingCount,sum(if(sa.assignmentStatus = 'SUBMITED',1,0)) as submittedCount";
            $condition = $request->assiNu?" and ba.assiNu = $request->assiNu ":"";
            $condition .= $request->semId?" and ba.semId = $request->semId ":"";
            $condition .= $request->subjectId?" and ba.subjectID = $request->subjectId ":"";
            
            switch ($request->subjectType) {
                case 'pseudoSubjects':
                    $condition .= $request->staffId?" and ba.staffID = '$request->staffId":"";
                    $join = " ,pstd.pseudosubjectID as pseudosubjectId,null as sbsId from batch_assignment ba 
                    inner join studentaccount std on std.batchID = ba.batchID
                    inner join pseudosubjects_students pstd on pstd.studentID = std.studentID and pstd.pseudosubjectID = ba.psID
                    inner join subbatch_student sstd on sstd.subbatchID = ba.subbatchID and pstd.studentID = sstd.studentID
                    left join assignment_marks am on am.studentID = pstd.studentID and am.assignmentID = ba.assignmentID 
                    left join student_assinments sa on sa.studentID = pstd.studentID and sa.assinmentID = ba.assignmentID and ba.batchID = sa.batchID
                    where ba.psID = ".$request->pseudoSubjectId . $condition;
                    $sql = $minimal_select.$join." group by ba.assiNu;";
                    $sql_detailed = $detailed_select.$join." group by std.studentID;";
                    break;
                case 'subBatch':
                    $condition .= $request->batchId?" and ba.batchId = $request->batchId ":"";
                    $condition .= $request->sbsId?" and sbs.sbsID = $request->sbsId ":"";
                    $condition .= $request->subjectId?" and ba.subjectID = $request->subjectId ":"";
                    $condition .= is_array($request->subBatchIds) && !empty($request->subBatchIds)?" and ba.subbatchID in (".implode(',',$request->subBatchIds).") ":"";
                    $condition .= !is_array($request->subBatchIds) && !empty($request->subBatchIds)?" and ba.subbatchID in (".$request->subBatchIds.") ":"";
                    $join = " ,null as pseudosubjectId,sbs.sbsID as sbsId from sbs_relation sbs
                    inner join subbatch_sbs ssbs on ssbs.sbsID = sbs.sbsID
                    inner join subbatches sub on sub.batchID = sbs.batchID and sub.semID = sbs.semID
                    inner join batch_assignment ba on ba.batchID=sbs.batchID and ba.staffID = sbs.staffID and ba.subjectID = sbs.subjectID and ba.semID = sbs.semID and ba.subbatchID in (sub.subbatchID,0)
                    inner join studentaccount std on std.batchID = sbs.batchID
                    inner join subbatch_student sstd on sstd.studentID = std.studentID and sstd.subbatchID = sub.subbatchID
                    left join assignment_marks am on am.assignmentID = ba.assignmentID and am.studentID = std.studentID
                    left join student_assinments sa on sa.studentID = std.studentID and sa.assinmentID = ba.assignmentID and ba.batchID = sa.batchID
                    where 1 = 1 ". $condition;
                    $sql = $minimal_select.$join." group by ba.assiNu,ba.assignmentID;";
                    $sql_detailed = $detailed_select.$join." group by std.studentID;";
                    break;
                case 'allBatch':
                    $condition .= $request->sbsId?" and sbs.sbsID = $request->sbsId ":"";
                    $condition .= $request->subjectId?" and ba.subjectID = $request->subjectId ":"";
                    $join = " ,null as pseudosubjectId,sbs.sbsID as sbsId from sbs_relation sbs
                    inner join batch_assignment ba on ba.batchID=sbs.batchID and ba.staffID = sbs.staffID and ba.subjectID = sbs.subjectID and ba.semID = sbs.semID and ba.subbatchID = 0
                    inner join studentaccount std on std.batchID = sbs.batchID
                    left join assignment_marks am on am.assignmentID = ba.assignmentID and am.studentID = std.studentID
                    left join student_assinments sa on sa.studentID = std.studentID and sa.assinmentID = ba.assignmentID and ba.batchID = sa.batchID
                    where 1=1 ". $condition;
                    $sql = $minimal_select.$join." group by ba.assiNu,ba.assignmentID;";
                    $sql_detailed = $detailed_select.$join." group by std.studentID;";
                break;
            }
            $assignments = new \stdClass();
            $assignments->basicDetails = $request->overallData?$this->executeQueryForList($sql):null;
            if($request->detailedData){
                $sqlSession = "SET SESSION group_concat_max_len = 1000000;";
                $this->executeQuery($sqlSession);
                $assignments->assignmentDetails = $this->executeQueryForList($sql_detailed);
            }else{
                $assignments->assignmentDetails = null;
            }
        }
        catch(\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $assignments;
    }
    public function getAssignmentStudentsForMarkEntry($request) {
        
        try {
            if($request->batchId)
            {
            $isCurrentSem = SemesterService::getInstance()->isCurrentSemester($request->batchId, $request->semId);
            $sortByColumn = BatchService::getInstance()->getStudentSortByColumnOfABatch($request->batchId);
            }
            $sortByColumn = $sortByColumn?$sortByColumn:'rollNo';
            $insert_sql='';
            if($request->psId)
            {
                $sql = "select sa.studentID, sa.regNo,sa.admissionNo, sa.studentName,sa.rollNo,sa.studentAccount, sas.studentAssinmentID, sas.resourseId, sas.docPDFPath, if(docUploadtime,DATE_FORMAT(CONVERT_TZ(sas.docUploadtime,'+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s'),'') as docUploadtime, sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sas.isConfirmed, sas.assignmentStatus, sas.remarks, sm.markID, sm.marksObtained, sm.percentage, bas.assignmentID, ba.batchName from  studentaccount sa inner join subbatch_student ss on sa.studentID = ss.studentID inner join subbatches sb ON sb.subbatchID=ss.subbatchID 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 inner join batch_assignment bas ON bas.psID=sb.psID and ba.batchID=bas.batchID left join student_assinments sas ON sas.studentID=sa.studentID AND sas.assinmentID=bas.assignmentID left join assignment_marks sm ON sm.studentID=sa.studentID AND sm.assignmentID=bas.assignmentID AND sm.csID IS NULL left join lin_resource lr ON lr.id=sas.resourseId where sb.psID = $request->psId and ".($request->isExternal?"bas.externalAssiNu = $request->assiNu":"bas.assiNu = $request->assiNu")." and joinedSem.orderNo <= sem.orderNo GROUP BY sa.studentID ORDER BY sa.$sortByColumn";
            }
            else
            {
                if($request->subbatchId)
                {
                    if($isCurrentSem)
                    {
                        $sql = "select sa.studentID, sa.regNo,sa.admissionNo, sa.studentName,sa.rollNo,sa.studentAccount, sas.studentAssinmentID, sas.resourseId, sas.docPDFPath, if(docUploadtime,DATE_FORMAT(CONVERT_TZ(sas.docUploadtime,'+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s'),'') as docUploadtime, sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sas.isConfirmed, sas.assignmentStatus, sas.remarks, sm.markID, sm.marksObtained, sm.percentage, $request->assignmentId as assignmentID 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 left join student_assinments sas ON sas.studentID=sa.studentID AND sas.assinmentID=$request->assignmentId left join assignment_marks sm ON sm.studentID=sa.studentID AND sm.assignmentID=sas.assinmentID AND sm.csID IS NULL left join lin_resource lr ON lr.id=sas.resourseId where sa.batchID=$request->batchId and ss.subbatchID = $request->subbatchId and joinedSem.orderNo <= sem.orderNo ORDER BY sa.$sortByColumn";
                        $insert_sql="insert ignore into student_assinments (assinmentID,studentID,batchID, assignmentStatus) SELECT $request->assignmentId, sa.studentID, sa.batchID, 'PENDING' 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 WHERE sa.batchID=$request->batchId and ss.subbatchID = $request->subbatchId and joinedSem.orderNo <= sem.orderNo";
                    }
                    else
                    {
                        $semDetails = SemesterService::getInstance()->getSemDetailsBySemId($request->semId);
                        
                        $sql = "select sa.studentID,sa.studentName, sa.rollNo, sa.regNo,sa.admissionNo, sas.studentAssinmentID, sas.resourseId, sas.docPDFPath, if(docUploadtime,DATE_FORMAT(CONVERT_TZ(sas.docUploadtime,'+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s'),'') as docUploadtime, sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sas.isConfirmed, sas.assignmentStatus, sas.remarks, sm.markID, sm.marksObtained, sm.percentage, $request->assignmentId as assignmentID from studentaccount sa  inner join subbatch_student ss on sa.studentID = ss.studentID left join student_assinments sas ON sas.studentID=sa.studentID AND sas.assinmentID=$request->assignmentId left join assignment_marks sm ON sm.studentID=sa.studentID AND sm.assignmentID=sas.assinmentID AND sm.csID IS NULL left join lin_resource lr ON lr.id=sas.resourseId  where  subbatchID = $request->subbatchId and  sa.studentID in(select studentID from studentaccount sa inner join batches ba on sa.batchID = ba.batchID inner join semesters sem on sem.semID = ba.semID inner join semesters joinedSem on sa.joiningSemId = joinedSem.semID  where ba.batchID = $request->batchId and joinedSem.orderNo <= $semDetails->orderNo union select sa.studentID from failed_students fs inner join studentaccount sa on sa.studentID = fs.studentID inner join semesters fsem on fsem.semID = fs.failedInSemester inner join semesters joinedSem on sa.joiningSemId = joinedSem.semID where previousBatch = $request->batchId and fsem.orderNo > $semDetails->orderNo and joinedSem.orderNo <= $semDetails->orderNo) ORDER BY $sortByColumn";
                        
                    }
                }
                else
                {
                    if($isCurrentSem)
                    {
                        $sql = "select sa.studentID, sa.regNo,sa.admissionNo, sa.studentName,sa.rollNo, sas.studentAssinmentID, sas.resourseId, sas.docPDFPath, if(docUploadtime,DATE_FORMAT(CONVERT_TZ(sas.docUploadtime,'+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s'),'') as docUploadtime, sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sas.isConfirmed, sas.assignmentStatus, sas.remarks, sm.markID, sm.marksObtained, sm.percentage, $request->assignmentId as assignmentID 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 left join student_assinments sas ON sas.studentID=sa.studentID AND sas.assinmentID=$request->assignmentId left join assignment_marks sm ON sm.studentID=sa.studentID AND sm.assignmentID=sas.assinmentID AND sm.csID IS NULL left join lin_resource lr ON lr.id=sas.resourseId where sa.batchID=$request->batchId and joinedSem.orderNo <= sem.orderNo ORDER BY sa.$sortByColumn";
                        
                        $insert_sql="insert ignore into student_assinments (assinmentID,studentID,batchID, assignmentStatus) SELECT $request->assignmentId, sa.studentID, sa.batchID, 'PENDING' 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 WHERE sa.batchID=$request->batchId and joinedSem.orderNo <= sem.orderNo";
                    }
                    else
                    {
                        //                     $sql = "select sa.studentID, sa.regNo,sa.admissionNo, sa.studentName, sa.rollNo, sa.studentAccount from studentaccount sa inner join batches ba on sa.batchID =  ba.batchID where ba.batchID = $batchID   union select sa.studentID, sa.regNo,sa.admissionNo, sa.studentName, sa.rollNo, sa.studentAccount from failed_students fs left join studentaccount sa on fs.studentID= sa.studentID where previousBatch = $batchID and failedInSemester > $semID order by rollNo";
                        
                        $semDetails = SemesterService::getInstance()->getSemDetailsBySemId($request->semId);
                        
                        $sql = "select sa.studentID, sa.studentName, sa.rollNo, sa.studentAccount, sa.regNo,sa.admissionNo, 
                        sas.studentAssinmentID, sas.resourseId, sas.docPDFPath, 
                        if(docUploadtime,DATE_FORMAT(CONVERT_TZ(sas.docUploadtime,'+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s'),'') as docUploadtime, 
                        sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sas.isConfirmed, sas.assignmentStatus, sas.remarks, 
                        sm.markID, sm.marksObtained, sm.percentage, $request->assignmentId as assignmentID from studentaccount sa 
                        inner join batches ba on sa.batchID =  ba.batchID inner join semesters joinedSem on sa.joiningSemId = joinedSem.semID 
                        left join student_assinments sas ON sas.studentID=sa.studentID AND sas.assinmentID=$request->assignmentId 
                        left join assignment_marks sm ON sm.studentID=sa.studentID AND sm.assignmentID=sas.assinmentID AND sm.csID IS NULL
                         left join lin_resource lr ON lr.id=sas.resourseId where ba.batchID = $request->batchId and joinedSem.orderNo <= $semDetails->orderNo 
                         union select sa.studentID, sa.studentName, sa.rollNo, sa.studentAccount, sa.regNo, sa.admissionNo, sas.studentAssinmentID, sas.resourseId, sas.docPDFPath, if(docUploadtime,DATE_FORMAT(CONVERT_TZ(sas.docUploadtime,'+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s'),'') as docUploadtime, sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sas.isConfirmed, sas.assignmentStatus, sas.remarks, sm.markID, sm.marksObtained, sm.percentage, $request->assignmentId as assignmentID 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 left join student_assinments sas ON sas.studentID=sa.studentID AND sas.assinmentID=$request->assignmentId left join assignment_marks sm ON sm.studentID=sa.studentID AND sm.assignmentID=sas.assinmentID AND sm.csID IS NULL left join lin_resource lr ON lr.id=sas.resourseId where previousBatch =$request->batchId and fsem.orderNo > $semDetails->orderNo and joinedSem.orderNo <= $semDetails->orderNo order by $sortByColumn";
                    }
                }
            }
            if($insert_sql)
            {
                $this->executeQuery($insert_sql);
            }
            return $this->executeQueryForList($sql);
    } catch (\Exception $e) {
        throw new ProfessionalException($e->getCode(), $e->getMessage());
    }
    }
    
    
    public function getAssignmentStudentsForMarkEntryWithCount($request) {
        
        try {
            if($request->batchId)
            {
            $isCurrentSem = SemesterService::getInstance()->isCurrentSemester($request->batchId, $request->semId);
            $sortByColumn = BatchService::getInstance()->getStudentSortByColumnOfABatch($request->batchId);
            }
            $sortByColumn = $sortByColumn?$sortByColumn:'rollNo';
            $insert_sql='';
            if($request->psId)
            {
                $sql = "select sa.studentID, sa.studentName,sa.rollNo,sa.studentAccount, sas.studentAssinmentID, sas.resourseId, sas.docPDFPath, if(docUploadtime,DATE_FORMAT(CONVERT_TZ(sas.docUploadtime,'+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s'),'') as docUploadtime, sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sas.isConfirmed, sas.assignmentStatus, sas.remarks, sm.markID, sm.marksObtained, sm.percentage, bas.assignmentID, ba.batchName from  studentaccount sa inner join subbatch_student ss on sa.studentID = ss.studentID inner join subbatches sb ON sb.subbatchID=ss.subbatchID 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 inner join batch_assignment bas ON bas.psID=sb.psID and ba.batchID=bas.batchID left join student_assinments sas ON sas.studentID=sa.studentID AND sas.assinmentID=bas.assignmentID left join assignment_marks sm ON sm.studentID=sa.studentID AND sm.assignmentID=bas.assignmentID AND sm.csID IS NULL left join lin_resource lr ON lr.id=sas.resourseId where sb.psID = $request->psId and ".($request->isExternal?"bas.externalAssiNu = $request->assiNu":"bas.assiNu = $request->assiNu")." and joinedSem.orderNo <= sem.orderNo GROUP BY sa.studentID ORDER BY sa.$sortByColumn";
            }
            else
            {
                if($request->subbatchId)
                {
                    if($isCurrentSem)
                    {
                        $sql = "select sa.studentID, sa.studentName,sa.rollNo,sa.studentAccount, sas.studentAssinmentID, sas.resourseId, sas.docPDFPath, if(docUploadtime,DATE_FORMAT(CONVERT_TZ(sas.docUploadtime,'+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s'),'') as docUploadtime, sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sas.isConfirmed, sas.assignmentStatus, sas.remarks, sm.markID, sm.marksObtained, sm.percentage, $request->assignmentId as assignmentID 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 left join student_assinments sas ON sas.studentID=sa.studentID AND sas.assinmentID=$request->assignmentId left join assignment_marks sm ON sm.studentID=sa.studentID AND sm.assignmentID=sas.assinmentID AND sm.csID IS NULL left join lin_resource lr ON lr.id=sas.resourseId where sa.batchID=$request->batchId and ss.subbatchID = $request->subbatchId and joinedSem.orderNo <= sem.orderNo ORDER BY sa.$sortByColumn";
                        $insert_sql="insert ignore into student_assinments (assinmentID,studentID,batchID, assignmentStatus) SELECT $request->assignmentId, sa.studentID, sa.batchID, 'PENDING' 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 WHERE sa.batchID=$request->batchId and ss.subbatchID = $request->subbatchId and joinedSem.orderNo <= sem.orderNo";
                    }
                    else
                    {
                        $semDetails = SemesterService::getInstance()->getSemDetailsBySemId($request->semId);
                        
                        $sql = "select sa.studentID, sa.studentName, rollNo, sa.regNo, sas.studentAssinmentID, sas.resourseId, sas.docPDFPath, if(docUploadtime,DATE_FORMAT(CONVERT_TZ(sas.docUploadtime,'+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s'),'') as docUploadtime, sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sas.isConfirmed, sas.assignmentStatus, sas.remarks, sm.markID, sm.marksObtained, sm.percentage, $request->assignmentId as assignmentID from studentaccount sa  inner join subbatch_student ss on sa.studentID = ss.studentID left join student_assinments sas ON sas.studentID=sa.studentID AND sas.assinmentID=$request->assignmentId left join assignment_marks sm ON sm.studentID=sa.studentID AND sm.assignmentID=sas.assinmentID AND sm.csID IS NULL left join lin_resource lr ON lr.id=sas.resourseId  where  subbatchID = $request->subbatchId and  sa.studentID in(select studentID from studentaccount sa inner join batches ba on sa.batchID = ba.batchID inner join semesters sem on sem.semID = ba.semID inner join semesters joinedSem on sa.joiningSemId = joinedSem.semID  where ba.batchID = $request->batchId and joinedSem.orderNo <= $semDetails->orderNo union select sa.studentID from failed_students fs inner join studentaccount sa on sa.studentID = fs.studentID inner join semesters fsem on fsem.semID = fs.failedInSemester inner join semesters joinedSem on sa.joiningSemId = joinedSem.semID where previousBatch = $request->batchId and fsem.orderNo > $semDetails->orderNo and joinedSem.orderNo <= $semDetails->orderNo) ORDER BY $sortByColumn";
                        
                    }
                }
                else
                {
                    if($isCurrentSem)
                    {
                        $sql = "select sa.studentID, sa.studentName,sa.rollNo, sas.studentAssinmentID, sas.resourseId, sas.docPDFPath, if(docUploadtime,DATE_FORMAT(CONVERT_TZ(sas.docUploadtime,'+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s'),'') as docUploadtime, sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sas.isConfirmed, sas.assignmentStatus, sas.remarks, sm.markID, sm.marksObtained, sm.percentage, $request->assignmentId as assignmentID 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 left join student_assinments sas ON sas.studentID=sa.studentID AND sas.assinmentID=$request->assignmentId left join assignment_marks sm ON sm.studentID=sa.studentID AND sm.assignmentID=sas.assinmentID AND sm.csID IS NULL left join lin_resource lr ON lr.id=sas.resourseId where sa.batchID=$request->batchId and joinedSem.orderNo <= sem.orderNo ORDER BY sa.$sortByColumn";
                        
                        $insert_sql="insert ignore into student_assinments (assinmentID,studentID,batchID, assignmentStatus) SELECT $request->assignmentId, sa.studentID, sa.batchID, 'PENDING' 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 WHERE sa.batchID=$request->batchId and joinedSem.orderNo <= sem.orderNo";
                    }
                    else
                    {
                        //                     $sql = "select sa.studentID, sa.studentName, sa.rollNo, sa.studentAccount from studentaccount sa inner join batches ba on sa.batchID =  ba.batchID where ba.batchID = $batchID   union select sa.studentID, sa.studentName, sa.rollNo, sa.studentAccount from failed_students fs left join studentaccount sa on fs.studentID= sa.studentID where previousBatch = $batchID and failedInSemester > $semID order by rollNo";
                        
                        $semDetails = SemesterService::getInstance()->getSemDetailsBySemId($request->semId);
                        
                        $sql = "select sa.studentID, sa.studentName, sa.rollNo, sa.studentAccount, sa.regNo, sas.studentAssinmentID, sas.resourseId, sas.docPDFPath, if(docUploadtime,DATE_FORMAT(CONVERT_TZ(sas.docUploadtime,'+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s'),'') as docUploadtime, sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sas.isConfirmed, sas.assignmentStatus, sas.remarks, sm.markID, sm.marksObtained, sm.percentage, $request->assignmentId as assignmentID from studentaccount sa inner join batches ba on sa.batchID =  ba.batchID inner join semesters joinedSem on sa.joiningSemId = joinedSem.semID left join student_assinments sas ON sas.studentID=sa.studentID AND sas.assinmentID=$request->assignmentId left join assignment_marks sm ON sm.studentID=sa.studentID AND sm.assignmentID=sas.assinmentID AND sm.csID IS NULL left join lin_resource lr ON lr.id=sas.resourseId where ba.batchID = $request->batchId and joinedSem.orderNo <= $semDetails->orderNo union select sa.studentID, sa.studentName, sa.rollNo, sa.studentAccount, sa.regNo, sas.studentAssinmentID, sas.resourseId, sas.docPDFPath, if(docUploadtime,DATE_FORMAT(CONVERT_TZ(sas.docUploadtime,'+00:00', @@global .time_zone), '%Y-%m-%d %H:%i:%s'),'') as docUploadtime, sas.isSubmited, sas.submissionDate,  lr.path, lr.storage_object, lr.backend_type, sas.isConfirmed, sas.assignmentStatus, sas.remarks, sm.markID, sm.marksObtained, sm.percentage, $request->assignmentId as assignmentID 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 left join student_assinments sas ON sas.studentID=sa.studentID AND sas.assinmentID=$request->assignmentId left join assignment_marks sm ON sm.studentID=sa.studentID AND sm.assignmentID=sas.assinmentID AND sm.csID IS NULL left join lin_resource lr ON lr.id=sas.resourseId where previousBatch =$request->batchId and fsem.orderNo > $semDetails->orderNo and joinedSem.orderNo <= $semDetails->orderNo order by $sortByColumn";
                    }
                }
            }
            if($insert_sql)
            {
                $this->executeQuery($insert_sql);
            }
            $sql_count="SELECT count(*) as totalRecord FROM (".$sql.") as stdnt";
            $studentCount = $this->executeQueryForObject($sql_count)->totalRecord;
            $studentDetails = new SearchStudentResponse();
            $studentDetails->totalRecords = $studentCount;
            $sql .= " LIMIT $request->startIndex,$request->endIndex";
            $studentDetails->students = $this->executeQueryForList($sql);
            return $studentDetails;
    } catch (\Exception $e) {
        throw new ProfessionalException($e->getCode(), $e->getMessage());
    }
    }
    /**
     * @param $batchId,$semId,$maxAssignmentNum
     * @throws ProfessionalException
     */
    public function saveBatchwiseAssignmentRules($batchId,$semId,$maxAssignmentNum,$subjectId=null){
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        $maxAssignmentNum = $this->realEscapeString($maxAssignmentNum);
        if($subjectId){
            $sql = "INSERT INTO batchwise_assignment_rules (batchID, semID, subjectID, maxassignmentNum) VALUES ($batchId,$semId,$subjectId,$maxAssignmentNum)";
        }
        else{
            $sql = "INSERT INTO batchwise_assignment_rules (batchID, semID, maxassignmentNum) VALUES ($batchId,$semId,$maxAssignmentNum)";
        }
        try {
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        
    }
    /**
     * @param $batchId,$semId,$maxAssignmentNum
     * @throws ProfessionalException
     */
    public function updateBatchwiseAssignmentRules($batchId,$semId,$maxAssignmentNum,$subjectId=null){
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        $maxAssignmentNum = $this->realEscapeString($maxAssignmentNum);
        if($subjectId){
            $sql = "UPDATE  batchwise_assignment_rules SET maxassignmentNum = $maxAssignmentNum WHERE batchID = $batchId AND semID = $semId AND subjectID = '$subjectId'";
        }
        else{
            $sql = "UPDATE  batchwise_assignment_rules SET maxassignmentNum = $maxAssignmentNum WHERE batchID = $batchId AND semID = $semId AND subjectID IS NULL";
        }
        try {
            return $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    
    public function getAssignmentDetailsByRequest(AssignmentBatchSubjectRequest $assignment)
    {
        $sql = "select ba.assiNu, ba.assignmentID, ba.max_mark, ba.submissionDate, ba.enableConfirm, ba.asyncReportsId, ar.lin_resource_id as linResourseId, ba.is_published_student_marks as isPublishedStudentMarks from batch_assignment ba left join async_reports ar ON ba.asyncReportsId=ar.id where ba.batchID=$assignment->batchId and ba.staffID=$assignment->staffId and ba.semID=$assignment->semId and ba.subjectID=$assignment->subjectId and ".($assignment->isExternal?"ba.externalAssiNu=$assignment->assiNu":"ba.assiNu=$assignment->assiNu")." and ba.subbatchID = $assignment->subbatchId";
        try {
            
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $batchId,$semId
     * @throws ProfessionalException
     */
    public function deleteBatchwiseAssignmentRules($batchId,$semId,$subjectId=null){
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        if($subjectId){
            $sql = "DELETE FROM  batchwise_assignment_rules WHERE batchID = $batchId AND semID = $semId AND subjectID = $subjectId";
        }
        else{
            $sql = "DELETE FROM  batchwise_assignment_rules WHERE batchID = $batchId AND semID = $semId AND subjectID IS NULL";
        }
        
        try {
            return $this->executeQuery($sql);
            
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    
    public function checkAssignmentQuestionWiseMarkEntry($assignmentId)
    {
        $assignmentId = $this->realEscapeString($assignmentId);
        $enableAssessmentQuestionMarkEntry=true;
        try {
                $sql_check_question_mark = "SELECT id FROM assessment_student_marks WHERE assessment_id = ".$assignmentId." AND assessment_type = 'ASSIGNMENT'";
                $assessmentQuestionMarks = $this->executeQueryForList($sql_check_question_mark);
                if(count($assessmentQuestionMarks)==0){
                    $enableAssessmentQuestionMarkEntry = false;
                }
                return $enableAssessmentQuestionMarkEntry;
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    
    public function saveStudentAssignmentMarks($assignmentStudentList)
    {
        try {
            foreach($assignmentStudentList as $assignment)
            {
                if($assignment->mark=='')
                {
                    $this->deleteStudentAssignmentMarks($assignment->studentId, $assignment->assignmentId);
                }
                else
                {
                    if($assignment->markId)
                    {
                        $this->updateStudentAssignmentMarks($assignment);
                    }
                    else
                    {
                        $this->createStudentAssignmentMarks($assignment);
                    }
                    $sqlCheck = "select studentAssinmentID from student_assinments where assinmentID='$assignment->assignmentId' and studentID ='$assignment->studentId'";
                    $studentAssinmentID = $this->executeQueryForObject($sqlCheck)->studentAssinmentID;
                    if($studentAssinmentID){
                        $sql = "update student_assinments set isSubmited=\"$assignment->isSubmited\", submissionDate=\"$assignment->submissionDate\", assignmentStatus=\"$assignment->status\" where assinmentID=\"$assignment->assignmentId\" and  studentID=$assignment->studentId"; 
                    }else{
                        $sql = "insert into student_assinments (assinmentID, studentID,isSubmited,assignmentStatus, submissionDate) values ('$assignment->assignmentId','$assignment->studentId','$assignment->isSubmited', '$assignment->status','$assignment->submissionDate')";
                    }
                    $this->executeQuery($sql);
                }
            }
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    
    public function updateAsyncReportDetails($asyncReportId, $assignmentId)
    {
        $sql  ="UPDATE batch_assignment SET asyncReportsId=$asyncReportId, asyncReportChanged=0 WHERE assignmentID=$assignmentId";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    
    public function setAsyncDocStatus($assignmentId)
    {
        $sql  ="UPDATE batch_assignment SET asyncReportChanged=1 WHERE assignmentID=$assignmentId";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    
    public function getAssigmentAsyncFile($assignmentId)
    {
        $sql="select ba.asyncReportsId, sr.lin_resource_id, lr.path, lr.storage_object, lr.backend_type from async_reports sr inner join batch_assignment ba ON ba.asyncReportsId=sr.id left join lin_resource lr ON lr.id=sr.lin_resource_id WHERE ba.assignmentID=$assignmentId";
        try {
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    
    public function updateAssignmentIsPublishMarks($assignmentDetail){
        $assignmentDetail = $this->realEscapeObject($assignmentDetail);
        $batchAssignmentConditions  = null;
        if ( $assignmentDetail->pseudoSubjectId ) {
            $batchAssignmentConditions  .= 
            " staffID = '$assignmentDetail->staffId
            AND psID = '$assignmentDetail->pseudoSubjectId";
            $batchAssignmentConditions  .= "AND assiNu = '$assignmentDetail->assiNu'";
        } else {
            $batchAssignmentConditions  .= " assignmentID IN ($assignmentDetail->id)";
        }
        $sql = "UPDATE batch_assignment SET is_published_student_marks  = '" . $assignmentDetail->isPublished . "' WHERE $batchAssignmentConditions ";
        try {
            $this->executeQueryForObject($sql,true);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function findPseudoSubjectAssignment($pseudoSubjectId,$assiNu,$isExternal = NULL){
        $pseudoSubjectId = $this->realEscapeString($pseudoSubjectId);
        $assiNu = $this->realEscapeString($assiNu);
        if($isExternal){
            $sql = "select * from batch_assignment where psID = '$pseudoSubjectId' and externalAssiNu = '$assiNu';";
        }
        else{
            $sql = "select * from batch_assignment where psID = '$pseudoSubjectId' and assiNu = '$assiNu';";
        }
        try {
            $data = $this->executeQueryForList($sql);
            return !empty($data)?true:false;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    
    public function getSumOfQuestionMarksInAnAssignment($request){
        $request = $this->realEscapeObject($request);
        if($request->pseudoSubjectId){
            $assSql = "select ba.assignmentID, ba.question, ba.description, ba.submissionDate, ba.submissionTime, ba.batchID, ba.staffID, ba.subjectID, ba.semID, ba.assiNu, ba.docPath, ba.docName, ba.max_mark, ba.returnDate, ba.psID, ba.subbatchID, ba.restrictStudentSubmit, ba.is_published, ba.publishDate, ba.publishTime, ba.userType, ba.externalAssiNu, ba.enableConfirm, ba.asyncReportsId, ba.asyncReportChanged from batch_assignment ba
            where ba.psID = $request->pseudoSubjectId and ".($request->extAssiNu?"ba.externalAssiNu = $request->extAssiNu":"ba.assiNu = $request->assiNu").";";
            $singleAssignment =  $this->executeQueryForObject($assSql);
            $assignmentId = $singleAssignment->assignmentID;
        }else{
            $assignmentId = $request->assignmentId;
        }
        $sql="select sum(mark) as totalMarks from batch_assignment ba
        inner join assessment_structure ast on ast.assessment_key = ba.assiNu and ba.semID = ast.semID and ba.batchID = ast.batchID and ast.subjectID = ba.subjectID and ast.subbatchID = ba.subbatchID and ast.assessment_type= 'ASSIGnMENT' 
        inner join assessment_structure_section ass on ass.assessment_structure_id = ast.id
        inner join assessment_structure_section_questions assq on assq.assessment_structure_section_id = ass.id
        inner join assessment_questions aq on aq.id = assq.assessment_question_id
        where ba.assignmentID = $assignmentId;";
        try {
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    public function getMaxStudentMarkInAnAssignment($request){
        $request = $this->realEscapeObject($request);
        if($request->pseudoSubjectId && $request->assiNu){
            $condition = "ba.psID = $request->pseudoSubjectId and ba.assiNu = $request->assiNu;";
        }else if($request->pseudoSubjectId && $request->extAssiNu){
            $condition = "ba.psID = $request->pseudoSubjectId and ba.externalAssiNu = $request->extAssiNu;";
        }else{
            $condition = "ba.assignmentID = $request->assignmentId;";
        }
        $sql="select max(marksObtained) as maxMark,count(studentID) as studentCount from batch_assignment ba
        inner join assignment_marks am on am.assignmentID = ba.assignmentID 
        where $condition";
        try {
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    public function getAssignmentMarksByIds($request){
        $request = $this->realEscapeObject($request);
        try{
            $sql = "SELECT t1.marksObtained FROM assignment_marks t1, batch_assignment t2 WHERE t1.assignmentID = t2.assignmentID AND t2.batchID = ".$request->batchId." AND t2.semID = ".$request->semId." AND t1.studentID = ".$request->studentId." AND t2.subjectID = ".$request->subjectId." AND t2.assiNu = ".$request->assiNu." and t1.csID IS NULL";
            return $this->executeQueryForObject($sql);
        }catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get student assignment marks
     * @param Object $request
     * @throws ProfessionalException
     * @return object|array|\com\linways\base\util\$objectList[]
     */
    public function getAssignmentMarkListByRequest($request)
    {
        $assignmentList=NULL;
        $request= $this->realEscapeObject($request);
        
        $sql = "SELECT sa.studentID, sa.studentName, ba.subjectID, sub.subjectName, ba.assignmentID, ba.assiNu, ba.max_mark, am.marksObtained,concat(ba.subjectID,ba.assignmentID,ba.assiNu) as subjAssign, ba.description,sub.subjectDesc FROM batch_assignment ba INNER JOIN subjects sub ON ba.subjectID = sub.subjectID INNER JOIN studentaccount sa ON ba.batchID=sa.batchID AND sa.studentID=$request->studentId LEFT JOIN assignment_marks am ON am.assignmentID=ba.assignmentID WHERE ba.batchID = $request->batchId AND ba.semID = $request->semId AND am.csID IS NULL AND ba.assiNu is not null AND ba.assiNu !=0 AND am.studentID = $request->studentId ";
        
        if($request->subjectId){
            $sql .= " AND sub.subjectID = $request->subjectId";
        }
        if($request->onlyIfPublishedStudentMarks){
            $sql .= " AND ba.is_published_student_marks = '1' ";
        }
        $sql .= " ORDER BY ba.assiNu ASC";
        try {
            
            $assignmentList = $this->executeQueryForList($sql,$this->mapper[AssignmentServiceMapper::GET_ASSIGNMENT_MARK_LIST_BY_STUDENT]);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        
        return $assignmentList;
    }
    
    public function getPseudoSubjectAssignmentList($pseudoSubjectId)
    {
        $pseudoSubjectId = $this->realEscapeString($pseudoSubjectId);
        $sql = "SELECT ba.assignmentID as id, ba.max_mark as maxMark,ba.assiNu, ba.submissionDate, ba.description, ba.returnDate, ba.question, ba.docPath, ba.docName from sbs_relation sbs
        inner join pseudosubjects_sbs psbs on psbs.sbsID = sbs.sbsID
        inner join batch_assignment ba on ba.batchID = sbs.batchID and ba.semID = sbs.semID and ba.subjectID = sbs.subjectID and ba.staffID = sbs.staffID
        where psbs.pseudosubjectID = '$pseudoSubjectId'
        group by ba.assiNu;";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
}