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 / 32
CRAP
0.00% covered (danger)
0.00%
0 / 782
StaffMentorSessionFeedbackService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 32
13572.00
0.00% covered (danger)
0.00%
0 / 782
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 5
 __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
 insertMentorSession
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 36
 confirmStaffMentorSessionFeedback
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 getMentorSessionListForStaffLogin
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getDetailsOfMentorSessionBySessionId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 32
 getDetailsOfMentorSessionBySessionIdToGiveFeedback
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 31
 saveMentorSessionStudentFeedbackByStaff
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 19
 updateMentorSessionStudentFeedbackByStaff
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 15
 getMentorSessionStudentFeedbackByStudentIdAndSessionNo
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 updateMentorSessionName
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 sendStudentListWhoNotSubmittedFeedbackToMentor
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 74
 sendStaffListWhoNotSubmittedFeedbackComments
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 49
 getStaffDetailsForMentorSessionFeedbackReportFilter
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 24
 getConsolidatedMentorSessionFeedbackReport
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 60
 getConsolidatedMentorSessionFeedbackReportMentees
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 61
 updateMentorSessionDetails
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 21
 getSessionDetails
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 13
 insertMentorSessionMaterial
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getMentorSessionMaterial
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 21
 deleteMentorSessionMaterial
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 19
 updateMentorSessionStudentAttendanceByStaff
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 getDetailsForDeletion
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 18
 DeleteSession
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 30
 getAllStaffsForReport
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getSessionsOfStaffs
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 26
 getSessionsOfAssociations
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 24
 getSessionDetailsForReport
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 40
 getSessionAttendanceForReport
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 39
 getMentorSessionAttendanceWithSessionId
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 21
 getStudentPresenceInASession
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 19
<?php
namespace com\linways\core\ams\professional\service;
use com\linways\base\dto\Email;
use com\linways\base\dto\EmailTo;
use com\linways\base\dto\EmailFrom;
use com\linways\base\service\EmailService;
use com\linways\core\ams\professional\service\CommonService;
use com\linways\core\ams\professional\service\ResourceService;
use com\linways\core\ams\professional\service\PseudoSubjectService;
use com\linways\core\ams\professional\request\RemoveResourceRequest;
use com\linways\core\ams\professional\dto\StaffMentorSessionFeedback;
use com\linways\core\ams\professional\request\GetPreSignedUrlRequest;
use com\linways\core\ams\professional\exception\ProfessionalException;
use com\linways\core\ams\professional\mapper\StaffMentorSessionFeedBackMapper;
use com\linways\core\ams\professional\mapper\MentorSessionFeedbackReportFilterMapper;
use com\linways\core\ams\professional\mapper\MentorSessionFeedbackReportOfStaffMapper;
use com\linways\core\ams\professional\request\MentorSessionFeedbackConsolidatedReportRequest;
use stdClass;
class StaffMentorSessionFeedbackService 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 = StaffMentorSessionFeedBackMapper::getInstance()->getMapper();
        $this->mapper1 = MentorSessionFeedbackReportOfStaffMapper::getInstance()->getMapper();
        $this->mapper2 = MentorSessionFeedbackReportFilterMapper::getInstance()->getMapper();
        
        
        
    }
    // Prevent any oustide instantiation of this class
    
    // /Condition 3 - Prevent any object or instance of that class to be cloned
    private function __clone()
    {}
    // Prevent any copy of this object
    
    // /Condition 4 - Have a single globally accessible static method
    public static function getInstance()
    {
        if (! is_object(self::$_instance)) // or if( is_null(self::$_instance) ) or if( self::$_instance == null )
            self::$_instance = new self();
            
            return self::$_instance;
    }
    /**
     * to create session for a pseudosubject by the staff
     * @param StaffMentorSessionFeedback $feedbackDetails
     * @throws ProfessionalException
     */
    public function insertMentorSession($feedbackDetails)
    {
        $feedbackDetails->psid = $this->realEscapeString($feedbackDetails->psid);
        $feedbackDetails->staffId = $this->realEscapeString($feedbackDetails->staffId);
        $feedbackDetails->date = $this->realEscapeString($feedbackDetails->date);
        $feedbackDetails->hour = $this->realEscapeString($feedbackDetails->hour);
        $feedbackDetails->end_time = $this->realEscapeString($feedbackDetails->end_time);
        $sessionNo = 0;
        $sessionCount = 0;
        $sessionName = "";
        $psbuIds = "";
        $pseudoSubjectSbs = PseudoSubjectService::getInstance()->getDetailsOfPseudosubjectSbs($feedbackDetails->staffId , $feedbackDetails->psid);
        $pseudoSubjectIds = PseudoSubjectService::getInstance()->getPesudeosubjectIdsbyBatchSubjectStaff($pseudoSubjectSbs->subjectID, $pseudoSubjectSbs->batchID, $pseudoSubjectSbs->staffID);
        $psbuId = [];
        foreach($pseudoSubjectIds as $id){
            $psbuId[] = $id->pseudosubjectID;
        }
        $psbuIds = implode(",", $psbuId);
        $sessionCountSql = "SELECT MAX(`session_no`) as count FROM mentor_session WHERE psid in ($psbuIds)";
        try {
            $sessionCount = $this->executeQueryForObject($sessionCountSql)->count;
            if($sessionCount == NULL || $sessionCount == "") {
                $sessionNo = 1;
            }else{
                $sessionNo = $sessionCount + 1;
            }
        
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        $sessionName = 'Session '.$sessionNo;
        
        $sql = "INSERT INTO mentor_session (session_name,session_no,hour,date,end_time,psid,staffId,created_by,created_date,updated_by,updated_date) VALUES ('$sessionName','$sessionNo','$feedbackDetails->hour','$feedbackDetails->date','$feedbackDetails->end_time','$feedbackDetails->psid','$feedbackDetails->staffId','$feedbackDetails->staffId',utc_timestamp(),'$feedbackDetails->staffId',utc_timestamp())";
        try {
            
            return $this->executeQueryForObject($sql, true);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }   
    /**
     * To final submit session by the staff
     * @param StaffMentorSessionFeedback $feedbackDetails
     * @throws ProfessionalException
     */
    
    public function confirmStaffMentorSessionFeedback($feedbackDetails)
    {
        $feedbackDetails->staffId = $this->realEscapeString($feedbackDetails->staffId);    
        $feedbackDetails->sessionId = $this->realEscapeString($feedbackDetails->sessionId);
        $feedbackDetails->isFinalSubmitted = $this->realEscapeString($feedbackDetails->isFinalSubmitted);
        $feedbackDetails->psid = $this->realEscapeString($feedbackDetails->psid);
        
        $sql = "UPDATE mentor_session SET isFinalSubmitted= '$feedbackDetails->isFinalSubmitted', updated_date = utc_timestamp(), updated_by = '$feedbackDetails->staffId' WHERE staffId = '$feedbackDetails->staffId' AND id = '$feedbackDetails->sessionId' AND psid='$feedbackDetails->psid'";
        
        try {    
            $this->executeQuery($sql);
            return true;            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    
     /**
     * To list mentor sessions
     * @param StaffMentorSessionFeedback $feedbackDetails
     * @throws ProfessionalException
     */
    
    public function getMentorSessionListForStaffLogin($feedbackDetails)
    {
        $feedbackDetails->psid = $this->realEscapeString($feedbackDetails->psid);    
        $feedbackDetails->staffId = $this->realEscapeString($feedbackDetails->staffId);
        
        $sql = "SELECT id as sessionId,session_name,session_no,hour,date,end_time,psid,staffId,isFinalSubmitted,if(session_end_date is null,if( end_time is null, concat(date,' ','11:59 PM'), concat(date,' ',end_time)),if( end_time is null, concat(session_end_date,' ','11:59 PM'), concat(session_end_date,' ',end_time))) as lastDate,session_end_date as sessionEndDate from mentor_session where psid='$feedbackDetails->psid' and staffId='$feedbackDetails->staffId' order by session_no desc;";
        
        try {
            
            $sessionList = $this->executeQueryForList($sql);
            return $sessionList;
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
     /**
     * To get details of mentor session
     * @param StaffMentorSessionFeedback $feedbackDetails
     * @throws ProfessionalException
     */
    
    public function getDetailsOfMentorSessionBySessionId($feedbackDetails)
    {
        $feedbackDetails->sessionId = $this->realEscapeString($feedbackDetails->sessionId);    
        $feedbackDetails->staffId = $this->realEscapeString($feedbackDetails->staffId);
        $feedbackDetails->sbsID = $this->realEscapeString($feedbackDetails->sbsID);
        $mentorSessionType = CommonService::getInstance()->getSettings("MENTOR_SESSION","MENTOR_SESSION_ATTENDANCE_TYPE");
        if($mentorSessionType == "TIMETABLE"){
            $sql = "SELECT ms.id,ms.session_no,ms.session_name,ms.hour,ms.date,ms.psid,ms.staffId,a.studentID,s.studentEmail as email,s.regNo,b.batchName,s.studentName,a.isAbsent,s.rollNo,mssf.feedback,mssf.isSubmitted 
            from mentor_session ms 
            inner join pseudosubjects_sbs psbs on ms.psid = psbs.pseudosubjectID 
            inner join  attendance a on a.sbsID = psbs.sbsID and ms.date= a.attendanceDate and ms.hour = a.hour and a.staffID = ms.staffId
            inner join studentaccount s  on s.studentId = a.studentId 
            inner join batches b on b.batchID = a.batchID  
            left join mentor_session_student_feedback mssf on mssf.session_id=ms.id and mssf.studentID = a.studentID where ms.id = '$feedbackDetails->sessionId' and ms.staffId='$feedbackDetails->staffId'";
        }
        else{
            $sql = "SELECT ms.id,ms.session_no,ms.session_name,ms.hour,ms.date,ms.psid,ms.staffId,pss.studentID,s.studentEmail as email,s.regNo,b.batchName,s.studentName,IF(msstf.is_absent is NULL,1,msstf.is_absent) as isAbsent,s.rollNo,mssf.feedback,mssf.isSubmitted 
            from mentor_session ms 
            inner join pseudosubjects_students pss on ms.psid = pss.pseudosubjectID 
            inner join pseudosubjects_sbs psbs on ms.psid = psbs.pseudosubjectID 
            inner join sbs_relation sbsr on sbsr.sbsID = psbs.sbsID
            inner join studentaccount s  on s.studentId = pss.studentId 
            inner join batches b on b.batchID = sbsr.batchID and s.batchID = b.batchID 
            left join mentor_session_student_feedback mssf on mssf.session_id=ms.id and mssf.studentID = pss.studentID 
            left join mentor_session_staff_feedback msstf on msstf.session_id=ms.id and msstf.studentID = pss.studentID where ms.id = '$feedbackDetails->sessionId' and ms.staffId='$feedbackDetails->staffId'";
        }
        
        
        try {
            $sessionList = $this->executeQueryForList($sql, $this->mapper [StaffMentorSessionFeedBackMapper::GET_MENTOR_SESSION_DETAILS]);
            return $sessionList;
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
     /**
     * To get details of mentor session
     * @param StaffMentorSessionFeedback $feedbackDetails
     * @throws ProfessionalException
     */
    
    public function getDetailsOfMentorSessionBySessionIdToGiveFeedback($feedbackDetails)
    {
        $feedbackDetails->sessionId = $this->realEscapeString($feedbackDetails->sessionId);    
        $feedbackDetails->staffId = $this->realEscapeString($feedbackDetails->staffId);
        $feedbackDetails->sbsID = $this->realEscapeString($feedbackDetails->sbsID);
        $mentorSessionType = CommonService::getInstance()->getSettings("MENTOR_SESSION","MENTOR_SESSION_ATTENDANCE_TYPE");
        if($mentorSessionType == "TIMETABLE"){
            $sql = "SELECT ms.id,ms.session_no,ms.session_name,ms.isFinalSubmitted,ms.hour,ms.date,ms.psid,ms.staffId,a.studentID,s.studentEmail as email,s.regNo,b.batchName,s.studentName,a.isAbsent,s.rollNo,mssf.feedback,if(ms.session_end_date is null,if( ms.end_time is null, concat(ms.date,' ','11:59 PM'), concat(ms.date,' ',ms.end_time)),if( ms.end_time is null, concat(ms.session_end_date,' ','11:59 PM'), concat(ms.session_end_date,' ',ms.end_time))) as lastDate,ms.session_end_date as sessionEndDate 
            from mentor_session ms 
            inner join pseudosubjects_sbs psbs on ms.psid = psbs.pseudosubjectID 
            inner join  attendance a on a.sbsID = psbs.sbsID and ms.date= a.attendanceDate and ms.hour = a.hour and a.staffID = ms.staffId
            inner join studentaccount s  on s.studentId = a.studentId 
            inner join batches b on b.batchID = a.batchID  
            left join mentor_session_staff_feedback mssf on mssf.session_id=ms.id and mssf.studentID = a.studentID where ms.id = '$feedbackDetails->sessionId' and ms.staffId='$feedbackDetails->staffId'";
        }
        else{
            $sql = "SELECT ms.id,ms.session_no,ms.session_name,ms.isFinalSubmitted,ms.hour,ms.date,ms.psid,ms.staffId,pss.studentID,s.studentEmail as email,s.regNo,b.batchName,s.studentName,IF(mssf.is_absent is NULL,1,mssf.is_absent) as isAbsent,s.rollNo,mssf.feedback,if(ms.session_end_date is null,if( ms.end_time is null, concat(ms.date,' ','11:59 PM'), concat(ms.date,' ',ms.end_time)),if( ms.end_time is null, concat(ms.session_end_date,' ','11:59 PM'), concat(ms.session_end_date,' ',ms.end_time))) as lastDate,ms.session_end_date as sessionEndDate 
            from mentor_session ms 
            inner join pseudosubjects_students pss on ms.psid = pss.pseudosubjectID 
            inner join pseudosubjects_sbs psbs on ms.psid = psbs.pseudosubjectID 
            inner join sbs_relation sbsr on sbsr.sbsID = psbs.sbsID
            inner join studentaccount s  on s.studentId = pss.studentId 
            inner join batches b on b.batchID = sbsr.batchID and s.batchID = b.batchID 
            left join mentor_session_staff_feedback mssf on mssf.session_id=ms.id and mssf.studentID = pss.studentID where ms.id = '$feedbackDetails->sessionId' and ms.staffId='$feedbackDetails->staffId'";
        }
        
        try {
            $sessionList = $this->executeQueryForList($sql, $this->mapper [StaffMentorSessionFeedBackMapper::GET_MENTOR_SESSION_DETAILS]);
            return $sessionList;
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * to save session feedback for a student by the staff
     * @param StaffMentorSessionFeedback $feedbackDetails
     * @throws ProfessionalException
     */
    public function saveMentorSessionStudentFeedbackByStaff($feedbackDetails)
    {
        $feedbackDetails->staffId = $this->realEscapeString($feedbackDetails->staffId);
        $feedbackDetails->studentId = $this->realEscapeString($feedbackDetails->studentId);
        if($feedbackDetails->studentId == ""){
            $feedbackDetails->studentId = null;
        }
        $feedbackDetails->sessionId = $this->realEscapeString($feedbackDetails->sessionId);
        $feedbackDetails->sessionNo = $this->realEscapeString($feedbackDetails->sessionNo);
        $feedbackDetails->feedback = $this->realEscapeString($feedbackDetails->feedback);
        $feedbackDetails->isAbsent = $this->realEscapeString($feedbackDetails->isAbsent);
        $feedback = ($feedbackDetails->feedback == 'null')?$feedbackDetails->feedback:"'".$feedbackDetails->feedback."'";
        $sql = "INSERT INTO mentor_session_staff_feedback (staffId,studentId,feedback,session_id,session_no,created_by,created_date,updated_by,updated_date,is_absent) VALUES ('$feedbackDetails->staffId',$feedbackDetails->studentId,$feedback,'$feedbackDetails->sessionId','$feedbackDetails->sessionNo','$feedbackDetails->staffId',utc_timestamp(),'$feedbackDetails->staffId',utc_timestamp(),'$feedbackDetails->isAbsent')";
        try {
            
            $this->executeQuery($sql);
            return true;
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }   
        /**
     * to update session feedback for a student by the staff
     * @param StaffMentorSessionFeedback $feedbackDetails
     * @throws ProfessionalException
     */
    public function updateMentorSessionStudentFeedbackByStaff($feedbackDetails)
    {
        $feedbackDetails->staffId = $this->realEscapeString($feedbackDetails->staffId);
        $feedbackDetails->studentId = $this->realEscapeString($feedbackDetails->studentId);    
        $feedbackDetails->feedback = $this->realEscapeString($feedbackDetails->feedback);
        $feedbackDetails->sessionId = $this->realEscapeString($feedbackDetails->sessionId);
        $feedbackDetails->sessionNo = $this->realEscapeString($feedbackDetails->sessionNo);
        $feedbackDetails->isAbsent = $this->realEscapeString($feedbackDetails->isAbsent);
        
        $sql = "UPDATE mentor_session_staff_feedback SET feedback= '$feedbackDetails->feedback', updated_date = utc_timestamp(),updated_by = '$feedbackDetails->staffId',is_absent= '$feedbackDetails->isAbsent' WHERE studentId='$feedbackDetails->studentId' AND staffId = '$feedbackDetails->staffId' AND session_id = '$feedbackDetails->sessionId' AND session_no = '$feedbackDetails->sessionNo";
        
        try {
            
            $this->executeQuery($sql);
            return true;
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
     
        /**
     * to check session feedback for a student by the staff is already saved or not
     * @param StaffMentorSessionFeedback $feedbackDetails
     * @throws ProfessionalException
     */
    public function getMentorSessionStudentFeedbackByStudentIdAndSessionNo($feedbackDetails)
    {
        $feedbackDetails->sessionId = $this->realEscapeString($feedbackDetails->sessionId);
        $feedbackDetails->studentId = $this->realEscapeString($feedbackDetails->studentId);
        $feedbackDetails->sessionNo = $this->realEscapeString($feedbackDetails->sessionNo);
        
        $sql = "SELECT id from  mentor_session_staff_feedback WHERE studentId='$feedbackDetails->studentId' AND session_no = '$feedbackDetails->sessionNo' AND `session_id` = '$feedbackDetails->sessionId";
        
        try {
            
            $feedbackId = $this->executeQueryForObject($sql)->id;
            return $feedbackId;
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
        
        /**
     * to check session feedback for a student by the staff is already saved or not
     */
    public function updateMentorSessionName($sessionId,$sessionName)
    {
        $sessionId = $this->realEscapeString($sessionId);
        $sessionName = $this->realEscapeString($sessionName);
        
        $sql = "UPDATE mentor_session SET session_name='$sessionName' WHERE id = '$sessionId";
        
        try {
            
            $this->executeQuery($sql);
            return true;
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
         /**
     * To get details of mentor session
     * @param StaffMentorSessionFeedback $feedbackDetails
     * @throws ProfessionalException
     */
    
    public function sendStudentListWhoNotSubmittedFeedbackToMentor($feedbackDetails)
    {
        global $college_MailFromID;
        global $MailFromName;
        $feedbackDetails->sessionId = $this->realEscapeString($feedbackDetails->sessionId);    
        $feedbackDetails->staffId = $this->realEscapeString($feedbackDetails->staffId);
        $feedbackDetails->sbsID = $this->realEscapeString($feedbackDetails->sbsID);
        $sessionsql = "select * from mentor_session where id='$feedbackDetails->sessionId'";
        $resultSql= "SELECT ms.id,ms.session_no,ms.session_name,ms.hour,ms.date,ms.psid,ms.staffId,a.studentID,s.studentEmail as email,s.regNo,b.batchName,s.studentName,a.isAbsent,s.rollNo,mssf.feedback,mssf.isSubmitted 
        from mentor_session ms 
        inner join pseudosubjects_sbs psbs on ms.psid = psbs.pseudosubjectID 
        inner join  attendance a on a.sbsID = psbs.sbsID and ms.date= a.attendanceDate and ms.hour = a.hour and a.staffID = ms.staffId
        inner join studentaccount s  on s.studentId = a.studentId 
        inner join batches b on b.batchID = a.batchID  
        inner join mentor_session_student_feedback mssf on mssf.session_id=ms.id and mssf.studentID = a.studentID where ms.id = '$feedbackDetails->sessionId' and ms.staffId='$feedbackDetails->staffId' and a.isAbsent=0;";
        try {
            $sessiondetails =  $this->executeQueryForObject($sessionsql);
            $result = $this->executeQueryForList($resultSql);
        if(count($result) > 0){
            $sql = "SELECT ms.id,ms.session_no,ms.session_name,ms.hour,ms.date,ms.psid,ms.staffId,a.studentID,s.studentEmail as email,s.regNo,b.batchName,s.studentName,a.isAbsent,s.rollNo,mssf.feedback,mssf.isSubmitted 
            from mentor_session ms 
            inner join pseudosubjects_sbs psbs on ms.psid = psbs.pseudosubjectID 
            inner join  attendance a on a.sbsID = psbs.sbsID and ms.date= a.attendanceDate and ms.hour = a.hour and a.staffID = ms.staffId
            inner join studentaccount s  on s.studentId = a.studentId 
            inner join batches b on b.batchID = a.batchID  
            left join mentor_session_student_feedback mssf on mssf.session_id=ms.id and mssf.studentID = a.studentID where ms.id = '$feedbackDetails->sessionId' and ms.staffId='$feedbackDetails->staffId' and a.isAbsent=0 and mssf.studentID is null
            union
            SELECT ms.id,ms.session_no,ms.session_name,ms.hour,ms.date,ms.psid,ms.staffId,a.studentID,s.studentEmail as email,s.regNo,b.batchName,s.studentName,a.isAbsent,s.rollNo,mssf.feedback,mssf.isSubmitted 
            from mentor_session ms 
            inner join pseudosubjects_sbs psbs on ms.psid = psbs.pseudosubjectID 
            inner join  attendance a on a.sbsID = psbs.sbsID and ms.date= a.attendanceDate and ms.hour = a.hour and a.staffID = ms.staffId
            inner join studentaccount s  on s.studentId = a.studentId 
            inner join batches b on b.batchID = a.batchID  
            inner join mentor_session_student_feedback mssf on mssf.session_id=ms.id and mssf.studentID = a.studentID where ms.id = '$feedbackDetails->sessionId' and ms.staffId='$feedbackDetails->staffId' and a.isAbsent=0 and mssf.feedback is not null and mssf.isSubmitted = 0";
        }else{
            $sql = "SELECT ms.id,ms.session_no,ms.session_name,ms.hour,ms.date,ms.psid,ms.staffId,a.studentID,s.studentEmail as email,s.regNo,b.batchName,s.studentName,a.isAbsent,s.rollNo,mssf.feedback,mssf.isSubmitted 
            from mentor_session ms 
            inner join pseudosubjects_sbs psbs on ms.psid = psbs.pseudosubjectID 
            inner join  attendance a on a.sbsID = psbs.sbsID and ms.date= a.attendanceDate and ms.hour = a.hour and a.staffID = ms.staffId
            inner join studentaccount s  on s.studentId = a.studentId 
            inner join batches b on b.batchID = a.batchID  
            left join mentor_session_student_feedback mssf on mssf.session_id=ms.id and mssf.studentID = a.studentID where ms.id = '$feedbackDetails->sessionId' and ms.staffId='$feedbackDetails->staffId' and a.isAbsent=0 ";
        }
    
        
        
            $staffSql = "SELECT * from staffaccounts where staffID='$feedbackDetails->staffId'";
            $staffDeatils = $this->executeQueryForObject($staffSql);
            $sessionList = $this->executeQueryForList($sql, $this->mapper [StaffMentorSessionFeedBackMapper::GET_MENTOR_SESSION_DETAILS]);
            $sessionList = $sessionList[0];
            $mailContent = "Students who have not submitted the feedback for ".$sessiondetails->session_name." (".$sessiondetails->date.") <br>";
            if(count($sessionList->studentList) > 0) {
                foreach($sessionList->studentList as $index => $student){
                    if($index > 0){
                        $mailContent .= ", ".$student->studentName ."(".$student->rollNo.")";
                    }else{
                        $mailContent .= $student->studentName ."(".$student->rollNo.")";
                    }
                }
            }else{
                $mailContent .= "No students!";
            }
            
            $emailObj = new Email();
            $emailFrom = new EmailFrom();
            $emailFrom->email = $college_MailFromID;
            $emailFrom->name = $MailFromName;
            $emailTo = new EmailTo();
            $emailTo->email = $staffDeatils->staffEmail;
            $emailTo->name = $staffDeatils->staffName;
            $emailObj->subject =$sessiondetails->session_name." - Students who have not submitted the feedback";
            $emailObj->body = $mailContent; 
            $emailObj->from = $emailFrom;
            $emailObj->to = $emailTo;
            EmailService::getInstance()->sendEmail($emailObj);
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
     /**
     * To get details of mentor session
     * @param StaffMentorSessionFeedback $feedbackDetails
     * @throws ProfessionalException
     */
    
    
    public function sendStaffListWhoNotSubmittedFeedbackComments()
    {
        global $college_MailFromID,$MailFromName;
        $incrementDays = json_decode(CommonService::getInstance()->getSettings("ACADEMICS","LAST_DATE_INCREMENT_FOR_MENTOR_SESSION_FEEDBACK"));
        $incrementDay = ($incrementDays->staffSideIncrementDays)+1;
        $currentDate =date('Y-m-d');
        $dateTo = date("Y-m-d", strtotime("$currentDate -$incrementDay day")); 
        $dateFrom = date("Y-m-d", strtotime("$dateTo - 6 day")); 
        $sql = "select ms.id,ms.session_name,s.staffName,s.staffAccount,s.staffCode,ms.isFinalSubmitted,ms.date,ms.hour from mentor_session ms inner join staffaccounts s on s.staffid=ms.staffid where ms.isFinalSubmitted = 0 and date between '$dateFrom' and '$dateTo'";
        $sessionList = $this->executeQueryForList($sql, $this->mapper1 [MentorSessionFeedbackReportOfStaffMapper::GET_MENTOR_SESSION_DETAILS_FOR_REPORT]);
        $mentorIncharge = CommonService::getInstance()->getSettings("ACADEMICS", "MENTOR_IN_CHARGE_FOR_MENTORING_SESSIONS");
        $staffSql = "SELECT staffName,staffEmail,staffcode from staffaccounts where staffAccount='$mentorIncharge'";
        $mentorInchargeDeatils = $this->executeQueryForObject($staffSql);
        
        try {
            $mailContent = "<h2><b>Staff who have not submitted the comments for Mentoring Sessions ( ".$dateFrom." to ".$dateTo." )</h2></b> <br>";
            if(count($sessionList) > 0){
                foreach($sessionList as $index => $date){
                    if(count($date->staffList) > 0) {
                        $mailContent .= "<b><h3>Mentoring Session on - ".$date->date."</b></h3><br>";
                        foreach($date->staffList as $index => $staff){
                            if(count($staff->sessionList) > 0){
                                $mailContent .= "<b>".$staff->staffName."(".$staff->staffCode.")</b><br>";
                                foreach($staff->sessionList as $sessionindex => $session){
                                        $mailContent .= $sessionindex+1 .") ".$session->session_name ."(Hour - ".$session->hour.")<br>";
                                }
                            }
                        }
                    }else{
                        $mailContent .= "No staffs!";
                    }
                }
            }else{
                $mailContent .= "No staffs!";
            }
            $emailObj = new Email();
            $emailFrom = new EmailFrom();
            $emailFrom->email = $college_MailFromID;
            $emailFrom->name = $MailFromName;
            $emailTo = new EmailTo();
            $emailTo->email = $mentorInchargeDeatils->staffEmail;
            $emailTo->name = $mentorInchargeDeatils->staffName;
            $emailObj->subject ="Staff who have not submitted the comments for mentoring sessions( ".$dateFrom." to ".$dateTo." )";
            $emailObj->body = $mailContent; 
            $emailObj->from = $emailFrom;
            $emailObj->to = $emailTo;
            EmailService::getInstance()->sendEmail($emailObj);
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
      /**
     *
     */
    public function getStaffDetailsForMentorSessionFeedbackReportFilter()
    {
       
        $sql = "SELECT s.staffID,
                        s.staffName,
                        p.pseudosubjectID,
                        p.subjectName,
                        b.batchID,
                        b.batchName,
                        ms.id,
                        ms.session_name from staffaccounts s 
                        inner join sbs_relation sbs on s.staffID = sbs.staffID 
                        inner join subjects sub on sub.subjectID = sbs.subjectID 
                        inner join pseudosubjects_sbs psbs on psbs.sbsID  = sbs.sbsID 
                        inner join pseudosubjects p on p.pseudosubjectID = psbs.pseudosubjectID
                        inner join pseudo_subject_type pst on pst.id = p.pseudo_subject_type_id  
                        inner join batches b on b.batchID = sbs.batchID 
                        inner join mentor_session ms on ms.psid = p.pseudosubjectID and ms.staffId = s.staffID
                    WHERE sub.subjectName = 'MENTOR' OR pst.code ='ASSOCIATION'";
        
        try {
        
            $staffDetails = $this->executeQueryForList($sql, $this->mapper2 [MentorSessionFeedbackReportFilterMapper::GET_MENTOR_SESSION_STAFF_DETAILS_FOR_REPORT_FILTER]);    
            return $staffDetails;
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
      /**
     *to get consolidated mentor session feedback report
     * @param MentorSessionFeedbackConsolidatedReportRequest $reportDetails
     * @throws ProfessionalException
     */
    public function getConsolidatedMentorSessionFeedbackReport($reportDetails)
    {
        $reportDetails->staffID = $this->realEscapeString($reportDetails->staffID);
        $reportDetails->fromDate = $this->realEscapeString($reportDetails->fromDate);
        $reportDetails->toDate = $this->realEscapeString($reportDetails->toDate);
        $reportDetails->batchID = $this->realEscapeString($reportDetails->batchID);
        $conditions = "";
        if($reportDetails->staffID){
            $conditions .= " AND ms.staffId = '$reportDetails->staffID";
        }
        if ($reportDetails->fromDate && $reportDetails->toDate) {
            $fromDate = date("Y-m-d", strtotime($reportDetails->fromDate));
            $toDate = date("Y-m-d", strtotime($reportDetails->toDate));
            $conditions .= " AND ms.date between '$fromDate' and '$toDate'";
        } else if ($toDate) {
            $toDate = date("Y-m-d", strtotime($reportDetails->toDate));
            $conditions .= " AND ms.date <= '$toDate'";
        } else if ($reportDetails->fromDate) {
            $fromDate = date("Y-m-d", strtotime($reportDetails->fromDate));
            $conditions .= " AND ms.date >= '$fromDate'";
        }
        if($reportDetails->batchID){
            $conditions .= " AND b.batchID = '$reportDetails->batchID";
        }
        $mentorSessionType = CommonService::getInstance()->getSettings("MENTOR_SESSION","MENTOR_SESSION_ATTENDANCE_TYPE");
        if($mentorSessionType == "TIMETABLE"){
            $sql = "SELECT a.isAbsent,st.staffAccount,st.staffName,st.staffCode,ms.id,ms.session_no,ms.session_name,ms.hour,ms.date,ms.psid,ms.staffId,a.studentID,s.studentEmail as email,s.regNo,b.batchName,s.studentName,s.rollNo,mssf.feedback,mssf.isSubmitted,ms.session_end_date
            from mentor_session ms 
            inner join pseudosubjects_sbs psbs on ms.psid = psbs.pseudosubjectID 
            inner join  attendance a on a.sbsID = psbs.sbsID and ms.date= a.attendanceDate and ms.hour = a.hour and a.staffID = ms.staffId
            inner join studentaccount s  on s.studentID = a.studentID 
            inner join batches b on b.batchID = a.batchID  
            left join mentor_session_student_feedback mssf on mssf.session_id=ms.id and mssf.studentID = a.studentID left join staffaccounts st on ms.staffId=st.staffID where 1=1 $conditions order by ms.session_no;";
        }
        else{
            $sql = "SELECT IF(msstf.is_absent is NULL,1,msstf.is_absent) as isAbsent,st.staffAccount,st.staffName,st.staffCode,ms.id,ms.session_no,ms.session_name,ms.hour,ms.date,ms.psid,ms.staffId,pss.studentID,s.studentEmail as email,s.regNo,b.batchName,s.studentName,s.rollNo,mssf.feedback,mssf.isSubmitted,ms.session_end_date
            from mentor_session ms 
            inner join pseudosubjects_students pss on ms.psid = pss.pseudosubjectID 
            inner join pseudosubjects_sbs psbs on ms.psid = psbs.pseudosubjectID 
            inner join sbs_relation sbsr on sbsr.sbsID = psbs.sbsID
            inner join studentaccount s  on s.studentID = pss.studentID 
            inner join batches b on b.batchID = sbsr.batchID and s.batchID = b.batchID 
            left join mentor_session_student_feedback mssf on mssf.session_id=ms.id and mssf.studentID = pss.studentID left join staffaccounts st on ms.staffId=st.staffID 
            left join mentor_session_staff_feedback msstf on msstf.session_id=ms.id and msstf.studentID = pss.studentID 
            where 1=1 $conditions order by ms.session_no;";
        }
        
        
        try {
            $list = $this->executeQueryForList($sql, $this->mapper1 [MentorSessionFeedbackReportOfStaffMapper::GET_MENTOR_SESSION_CONSOLIDATED_REPORT_FOR_MENTOR]);
            foreach($list[0]->studentList as $index => $student){
            $feedback = [];
                foreach($student->feedbackList as $session){
                    $sessionId =$session->session_id;
                    $feedback[$sessionId] = $session;
                }
                $list[0]->studentList[$index]->feedbackList = $feedback;
            }
        
            return $list[0];
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
     /**
     *to get consolidated mentor session feedback report
     * @param MentorSessionFeedbackConsolidatedReportRequest $reportDetails
     * @throws ProfessionalException
     */
    public function getConsolidatedMentorSessionFeedbackReportMentees($reportDetails)
    {
        $reportDetails->staffID = $this->realEscapeString($reportDetails->staffID);
        $reportDetails->fromDate = $this->realEscapeString($reportDetails->fromDate);
        $reportDetails->toDate = $this->realEscapeString($reportDetails->toDate);
        $reportDetails->batchID = $this->realEscapeString($reportDetails->batchID);
        $conditions = "";
        if($reportDetails->staffID){
            $conditions .= " AND ms.staffId = '$reportDetails->staffID";
        }
        if ($reportDetails->fromDate && $reportDetails->toDate) {
            $fromDate = date("Y-m-d", strtotime($reportDetails->fromDate));
            $toDate = date("Y-m-d", strtotime($reportDetails->toDate));
            $conditions .= " AND ms.date between '$fromDate' and '$toDate";
        } else if ($toDate) {
            $toDate = date("Y-m-d", strtotime($reportDetails->toDate));
            $conditions .= " AND ms.date <= '$toDate";
        } else if ($reportDetails->fromDate) {
            $fromDate = date("Y-m-d", strtotime($reportDetails->fromDate));
            $conditions .= " AND ms.date >= '$fromDate";
        }
        if($reportDetails->batchID){
            $conditions .= " AND b.batchID = '$reportDetails->batchID";
        }
        $mentorSessionType = CommonService::getInstance()->getSettings("MENTOR_SESSION","MENTOR_SESSION_ATTENDANCE_TYPE");
        if($mentorSessionType == "TIMETABLE"){
            $sql = "SELECT a.isAbsent,st.staffAccount,st.staffName,st.staffCode,ms.id,ms.session_no,ms.session_name,ms.hour,ms.date,ms.psid,ms.staffId,a.studentID,s.studentEmail as email,s.regNo,b.batchName,s.studentName,s.rollNo,mssf.feedback,ms.isFinalSubmitted as isSubmitted
            from mentor_session ms 
            inner join pseudosubjects_sbs psbs on ms.psid = psbs.pseudosubjectID 
            inner join  attendance a on a.sbsID = psbs.sbsID and ms.date= a.attendanceDate and ms.hour = a.hour and a.staffID = ms.staffId
            inner join studentaccount s  on s.studentId = a.studentId 
            inner join batches b on b.batchID = a.batchID  
            left join mentor_session_staff_feedback mssf on mssf.session_id=ms.id and mssf.studentID = a.studentID left join staffaccounts st on ms.staffId=st.staffID where 1=1 $conditions order by session_no";
        }
        else{
            $sql = "SELECT IF(msstf.is_absent is NULL,1,msstf.is_absent) as isAbsent,st.staffAccount,st.staffName,st.staffCode,ms.id,ms.session_no,ms.session_name,ms.hour,ms.date,ms.psid,ms.staffId,pss.studentID,s.studentEmail as email,s.regNo,b.batchName,s.studentName,s.rollNo,mssf.feedback,ms.isFinalSubmitted as isSubmitted
            from mentor_session ms  
            inner join pseudosubjects_students pss on ms.psid = pss.pseudosubjectID 
            inner join pseudosubjects_sbs psbs on ms.psid = psbs.pseudosubjectID 
            inner join sbs_relation sbsr on sbsr.sbsID = psbs.sbsID
            inner join studentaccount s  on s.studentId = pss.studentId 
            inner join batches b on b.batchID = sbsr.batchID and s.batchID = b.batchID 
            left join mentor_session_staff_feedback mssf on mssf.session_id=ms.id and mssf.studentID = pss.studentID 
            left join staffaccounts st on ms.staffId=st.staffID 
            left join mentor_session_staff_feedback msstf on msstf.session_id=ms.id and msstf.studentID = pss.studentID 
            where 1=1 $conditions order by session_no";
        }
        
        try {
            $list = $this->executeQueryForList($sql, $this->mapper1 [MentorSessionFeedbackReportOfStaffMapper::GET_MENTOR_SESSION_CONSOLIDATED_REPORT_FOR_MENTOR]);
            foreach($list[0]->studentList as $index => $student){
            $feedback = [];
                foreach($student->feedbackList as $session){
                    $sessionId =$session->session_id;
                    $feedback[$sessionId] = $session;
                }
                $list[0]->studentList[$index]->feedbackList = $feedback;
            }
            return $list[0];
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
        
    /**
     *to update Mentor Session 
     * @param StaffMentorSessionFeedback $feedbackDetails
     * @throws ProfessionalException
     */
    public function updateMentorSessionDetails($feedbackDetails)
    {
        $feedbackDetails = $this->realEscapeObject($feedbackDetails);
        $where = [];
        $set = [];
        $set[] =  "isFinalSubmitted= '$feedbackDetails->isFinalSubmitted'";
        $set[] = "updated_by = '$feedbackDetails->staffId'";
        $set[] = "updated_date = utc_timestamp()";
        $feedbackDetails->end_time?$set[] = "end_time = '$feedbackDetails->end_time'":NULL;
        $feedbackDetails->session_name?$set[] = "session_name ='$feedbackDetails->session_name'":NULL;
        $feedbackDetails->staffId?$where[] = "staffId = '$feedbackDetails->staffId'":NULL;
        $feedbackDetails->sessionId?$where[] = "id = '$feedbackDetails->sessionId'":NULL;
        $feedbackDetails->psid?$where[] = "psid='$feedbackDetails->psid'":NULL;
        $feedbackDetails->sessionEndDate?$set[] = "session_end_date ='$feedbackDetails->sessionEndDate'":NULL;
        $sql = "UPDATE mentor_session SET ".implode(",",$set)."  WHERE  ".implode(" AND ",$where)." ";
        
        try {    
            $this->executeQuery($sql);
            return true;            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * check Mentor Session
     * @param $sessionRequest
     * @throws ProfessionalException
     */
    public function getSessionDetails($sessionRequest){
        $sessionRequest = $this->realEscapeObject($sessionRequest);
        $sessionRequest->staffId?$where[] = "staffId = '$sessionRequest->staffId'":NULL;
        $sessionRequest->psid?$where[] = "psid='$sessionRequest->psid'":NULL;
        $sessionRequest->date?$where[] = "date='$sessionRequest->date'":NULL;
        $sessionRequest->hour?$where[] = "hour='$sessionRequest->hour'":NULL;
        $sql = "SELECT session_name,session_no,hour,date,end_time,psid,staffId FROM mentor_session WHERE ".implode(" AND ",$where)." ";
        try {    
            $sessionDetails = $this->executeQueryForObject($sql);
            return $sessionDetails;            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Save Session Material
     * @param $sessionRequest
     * @throws ProfessionalException
     */
    public function insertMentorSessionMaterial($request){
        $request = $this->realEscapeObject($request);
        // $request->linResourceId = $request->linResourceId?$request->linResourceId:NULL;
        $sql = "INSERT INTO mentor_session_attachments (session_id,lin_resource_id,url,user_type,created_by,created_date) values ('$request->sessionId','$request->linResourceId','$request->url','$request->userType','$request->userId',utc_timestamp())";
        try {    
            $mentorSessionId = $this->executeQuery($sql,true)->id;
            return $mentorSessionId;            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getMentorSessionMaterial($request){
        $request = $this->realEscapeObject($request);
        $sql = "SELECT id as materialId,session_id as sessionId,lin_resource_id as linResourceId,url from mentor_session_attachments WHERE session_id = '$request->sessionId'";
        try {    
            $sessionMaterials = $this->executeQueryForList($sql);
            foreach($sessionMaterials as $index => $material){
                if($material->linResourceId){
                    $getResourceRequest = new GetPreSignedUrlRequest;
                    $getResourceRequest->resourceId = $material->linResourceId;
                    $getResourceRequest->accessKey = getenv('AWS_ACCESS_KEY');
                    $getResourceRequest->secretKey = getenv('AWS_CLIENT_SECRET_KEY');
                    $sessionMaterials[$index]->resource = ResourceService::getInstance()->getPreSignedUrlByResourceId($getResourceRequest);
                }
                else{
                    $sessionMaterials[$index]->resource = NULL;
                }
            }
            return $sessionMaterials;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function deleteMentorSessionMaterial($request){
        $request = $this->realEscapeObject($request);
        $this->beginTransaction();
        if($request->resourceId){
            $removeRequest = new RemoveResourceRequest();
            $removeRequest->resourceId = $request->resourceId;
            $removeRequest->accessKey = getenv('AWS_ACCESS_KEY');
            $removeRequest->secretKey = getenv('AWS_CLIENT_SECRET_KEY');
            ResourceService::getInstance()->removeResource($removeRequest);
        }
        $sql = "DELETE FROM mentor_session_attachments WHERE id = '$request->id'";
        try{
            $this->executeQuery($sql);
            $this->commit();
            return;
        }catch (\Exception $e) {
            $this->rollback();
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * to update session attendance for a student by the staff
     * @param StaffMentorSessionFeedback $feedbackDetails
     * @throws ProfessionalException
     */
    public function updateMentorSessionStudentAttendanceByStaff($feedbackDetails)
    {
        $feedbackDetails->staffId = $this->realEscapeString($feedbackDetails->staffId);
        $feedbackDetails->studentId = $this->realEscapeString($feedbackDetails->studentId);    
        $feedbackDetails->sessionId = $this->realEscapeString($feedbackDetails->sessionId);
        $feedbackDetails->sessionNo = $this->realEscapeString($feedbackDetails->sessionNo);
        $feedbackDetails->isAbsent = $this->realEscapeString($feedbackDetails->isAbsent);
        
        $sql = "UPDATE mentor_session_staff_feedback SET updated_date = utc_timestamp(),updated_by = '$feedbackDetails->staffId',is_absent= '$feedbackDetails->isAbsent' WHERE studentId='$feedbackDetails->studentId' AND staffId = '$feedbackDetails->staffId' AND session_id = '$feedbackDetails->sessionId' AND session_no = '$feedbackDetails->sessionNo";
        
        try {
            
            $this->executeQuery($sql);
            return true;
            
        } catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param SessionID,staffID,psID
     * @return Array
     * @throws ProfessionalException
     */
    function getDetailsForDeletion($sessionID)
    {
        $sessionID = $this->realEscapeString($sessionID);
        $result = new stdClass();
        try{
            $sql_attachments = "SELECT count(lin_resource_id) as resources from mentor_session_attachments WHERE session_id = '$sessionID";
            $attachments = $this->executeQueryForObject($sql_attachments)->resources;
            $result->attachments = $attachments;
            $sql_staff_feedback = "SELECT count(studentId) as students FROM mentor_session_staff_feedback where session_id = '$sessionID";
            $staffFeedbacks = $this->executeQueryForObject($sql_staff_feedback)->students;
            $result->staffFeedbacks = $staffFeedbacks;
            $sql_student_feedback = "SELECT count(studentID) as feedbacks FROM mentor_session_student_feedback WHERE session_id = '$sessionID";
            $studentFeedbacks = $this->executeQueryForObject($sql_student_feedback)->feedbacks;
            $result->studentFeedbacks = $studentFeedbacks;
            return $result;
        }catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param SessionID
     * @return Boolean
     * @throws ProfessionalException
     */
    function DeleteSession($sessionID)
    {
        $sessionID = $this->realEscapeString($sessionID);
        try{
            $details = $this->getDetailsForDeletion($sessionID);
            if($details->attachments)
            {
                $sql = "";
                $sql = "DELETE from mentor_session_attachments WHERE session_id = '$sessionID'";
                $this->executeQuery($sql);
            }
            if($details->staffFeedbacks)
            {
                $sql = "";
                $sql = "DELETE FROM mentor_session_staff_feedback where session_id = '$sessionID'";
                $this->executeQuery($sql);
            }
            if($details->studentFeedbacks)
            {
                $sql = "";
                $sql = "DELETE FROM mentor_session_student_feedback WHERE session_id = '$sessionID";
                $this->executeQuery($sql);
            }
            $sql = "";
            $sql = "DELETE from mentor_session WHERE id = '$sessionID'";
            $this->executeQuery($sql);
            return true;
        }catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    function getAllStaffsForReport()
    {
        try{
            $sql = "SELECT DISTINCT ms.staffId as staffID,s.staffName  from mentor_session ms inner join staffaccounts s on s.staffID = ms.staffId ";
            return $this->executeQueryForList($sql);
        }
        catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    function getSessionsOfStaffs($staffIds)
    {
            $staffId = $this->realEscapeString($staffIds);
        try{
            $sql = "SELECT 
                        distinct p.pseudosubjectID as associationID,p.subjectName as associationName,s2.subjectID ,s2.subjectName ,s2.subjectDesc ,s2.syllabusName ,s.staffID ,s.staffName 
                    from
                        pseudosubjects p
                    inner join pseudo_subject_type pst on
                        pst.id = p.pseudo_subject_type_id
                    inner join pseudosubjects_sbs ps on 
                        ps.pseudosubjectID  = p.pseudosubjectID  
                    inner join sbs_relation sr on
                        sr.sbsID = ps.sbsID 
                    inner join subjects s2 on s2.subjectID = sr.subjectID 
                    inner join staffaccounts s on s.staffID = sr.staffID 
                    WHERE
                        pst.code = 'ASSOCIATION'
                        and pst.is_active = 1
                        and p.isFinalized = 1
                        and sr.staffID IN ($staffId)";
            return $this->executeQueryForList($sql);
        }
        catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    function getSessionsOfAssociations($psIds, $from, $to)
    {
        $psIds = $this->realEscapeArray($psIds);
        $from = $this->realEscapeString($from);
        $from = implode("-",array_reverse(explode('-', $from)));
        $to = $this->realEscapeString($to);
        $to = implode("-",array_reverse(explode('-', $to)));
        $psIds = implode(",",$psIds);
        try{
            $sql = "SELECT
                        ms.id as sessionID,
                        session_name as sessionName,
                        ms.psid,
                        p.subjectName,
                        ms.date 
                    FROM
                        mentor_session ms
        inner join pseudosubjects p on p.pseudosubjectID = ms.psid 
        WHERE ms.isFinalSubmitted =1 and psid IN ($psIds) AND ms.date BETWEEN '$from' AND '$to'
        order by ms.id";
            return $this->executeQueryForList($sql);
        }catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    function getSessionDetailsForReport($sessions)
    {
        $sessionIds = $this->realEscapeArray($sessions);
        $sessionIds = implode(",",$sessionIds);
        try{
            $sql = "SELECT
                        s.batchID ,
                        b.batchName ,
                        s2.semName ,
                        ms.id ,
                        ms.session_name ,
                        count(mssf.studentId ) as studentCount,
                        sum(mssf.is_absent) as absentCount,
                        ms.`date` ,
                        ms.`hour` ,
                        ms.psid ,
                        p.subjectName as associationName,
                        s3.subjectID ,
                        s3.subjectName ,
                        s3.subjectDesc ,
                        s3.syllabusName ,
                        s3.syllabusYear 
                    FROM
                        pseudosubjects_students ps
                        inner join mentor_session ms on ms.psid = ps.pseudosubjectID 
                        inner join mentor_session_staff_feedback mssf on mssf.session_id = ms.id 
                        inner join studentaccount s on s.studentID = ps.studentID 
                        inner join batches b on b.batchID = s.batchID 
                        inner join semesters s2 on s2.semID = b.semID 
                        inner join pseudosubjects p on p.pseudosubjectID = ms.psid
                        inner join pseudosubjects_sbs pss on pss.pseudosubjectID = p.pseudosubjectID
                        inner join sbs_relation sr on sr.sbsID = pss.sbsID
                        inner join subjects s3 on s3.subjectID = sr.subjectID
                    WHERE
                        ms.id in ($sessionIds)
                    GROUP by s.batchID,ms.id ";
            return $this->executeQueryForList($sql);
        }catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        
    }
    function getSessionAttendanceForReport($sessionIds, $associations)
    {
        try{
            $sessionIds = $this->realEscapeArray($sessionIds);
            $sessionIds = implode(",",$sessionIds);
            $associations = $this->realEscapeArray($associations);
            $associations = implode(",",$associations);
    
            $sql = "SELECT
                        p.pseudosubjectID ,
                        p.subjectName ,
                        s.studentID ,
                        s.studentName ,
                        s.regNo,
                        b.batchID ,
                        b.batchName ,
                        s2.semName ,
                        ms.id as sessionID,
                        ms.session_name ,
                        ms.`date` ,
                        ms.`hour` ,
                        mssf.is_absent
                    from
                        pseudosubjects_students ps
                    inner join pseudosubjects p on p.pseudosubjectID = ps.pseudosubjectID 
                    inner join studentaccount s on s.studentID = ps.studentID 
                    inner join mentor_session ms on ms.psid = p.pseudosubjectID 
                    left join mentor_session_staff_feedback mssf on mssf.session_id = ms.id and mssf.studentId = s.studentID 
                    inner join batches b on b.batchID = s.batchID 
                    inner join semesters s2 on s2.semID = b.semID 
                    WHERE
                        ps.pseudosubjectID in ($associations)
                    and ms.id in ($sessionIds)
                    GROUP BY ps.pseudosubjectID ,ps.studentID,mssf.session_id 
                    order by ps.pseudosubjectID ,ps.studentID ,ms.id";
            return $this->executeQueryForList($sql);
        }
        catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    function getMentorSessionAttendanceWithSessionId($sessionId, $staffId = null, $batchID)
    {
        $sessionId = $this->realEscapeString($sessionId);
        $batchID = $this->realEscapeString($batchID);
        if($staffId)
        {
            $staffId = $this->realEscapeString($staffId);
        }
        $sql = "SELECT ms.id,ms.session_no,ms.session_name,ms.isFinalSubmitted,ms.hour,ms.date,ms.psid,ms.staffId,pss.studentID,s.studentEmail as email,s.regNo,b.batchName,s.studentName,IF(mssf.is_absent is NULL,1,mssf.is_absent) as isAbsent,s.rollNo,mssf.feedback,if(ms.session_end_date is null,if( ms.end_time is null, concat(ms.date,' ','11:59 PM'), concat(ms.date,' ',ms.end_time)),if( ms.end_time is null, concat(ms.session_end_date,' ','11:59 PM'), concat(ms.session_end_date,' ',ms.end_time))) as lastDate,ms.session_end_date as sessionEndDate 
            from mentor_session ms 
            inner join pseudosubjects_students pss on ms.psid = pss.pseudosubjectID 
            inner join pseudosubjects_sbs psbs on ms.psid = psbs.pseudosubjectID 
            inner join sbs_relation sbsr on sbsr.sbsID = psbs.sbsID
            inner join studentaccount s  on s.studentId = pss.studentId 
            inner join batches b on b.batchID = sbsr.batchID and s.batchID = b.batchID 
            left join mentor_session_staff_feedback mssf on mssf.session_id=ms.id and mssf.studentID = pss.studentID where ms.id = '$sessionId' and s.batchID = '$batchID".($staffId ? " and ms.staffId='$staffId'" : "");
            try{
                return $this->executeQueryForList($sql);
            }catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    function getStudentPresenceInASession($sessionID, $studentID)
    {
        try{
            $sessionID = $this->realEscapeString($sessionID);
            $studentID = $this->realEscapeString($studentID);
            $sql = "SELECT
                            ps.studentID ,ms.id ,ms.session_name ,mssf.feedback ,mssf.is_absent as status
                        from
                            pseudosubjects_students ps
                        inner join mentor_session ms on
                            ms.psid = ps.pseudosubjectID
                        inner join mentor_session_staff_feedback mssf on 
                            mssf.session_id = ms.id 
                        WHERE
                            ms.id in ($sessionID) and mssf.studentId in ($studentID)";
            return $this->executeQueryForObject($sql);
        }catch (\Exception $e) {
            
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    
}