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 / 68
CRAP
0.00% covered (danger)
0.00%
0 / 1260
SubjectPlanService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 68
49506.00
0.00% covered (danger)
0.00%
0 / 1260
 __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 / 2
 getInstance
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 5
 getActualPlanReport
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 64
 getSubjectActualPlanReport
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 27
 getPseudoSubjectActualPlanReport
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 36
 addSubjectPlanPopupPreference
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 30
 updateSubjectPlanPopupPreference
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 19
 getSubjectPlanPopupPreference
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 checkPopupHide
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 createModeOfInstruction
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 updateModeOfInstruction
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 getDefaultModeOfInstructionByBatch
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getSubjectPlan
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 22
 subjectPlanApprovelStatusBySbsId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 getWeeKWiseSubjectPlanDetails
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 57
 createActualplanCousreMat
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 20
 getActualplanCousreMat
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 21
 removeActualplanCousreMat
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 createProposedplanCousreMat
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 20
 removeProposedplanCousreMat
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 getProposedplanCousreMat
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 21
 getSubjectPlannerDetails
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 47
 getActualPlannerDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getProposedSubjectPlanDetailsBySbsId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getActualSubjectPlanDetailsBySbsId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 16
 addProposedSubjectPlanToCommunityBySbsId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 17
 getProposedSubjectPlanFromCommunityBySbsId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 changeSharingProposedSubjectPlanInCommunityBySbsId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 getProposedSubjectPlanFromCommunityBySubject
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getProposedSubjectPlanByIds
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 addProposedSubjectPlan
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 32
 addProposedPlanCopyInfo
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 getProposedPlanCopyInfoBySbsId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 getProposedSubjectPlanById
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getActualSubjectPlansCovered
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 25
 getProposedSubjectPlanBySbsID
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 deleteCourseMaterialFromActualPlan
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 17
 deleteCourseMaterialFromActualPlanByMaterialId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 13
 deleteCourseMaterialFromProposesPlan
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 17
 deleteCourseMaterialFromProposesPlanMaterialId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 13
 getProposedPlanCourseMaterials
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 21
 getActualPlanCourseMaterials
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 21
 addNewActualPlanVideoMaterial
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 18
 addNewProposedPlanVideoMaterial
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 18
 getActualPlanVideoMaterials
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 16
 getProposedPlanVideoMaterials
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 16
 deleteActualPlan
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 28
 deleteAllActualPlanCourseMaterialsRelation
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 deleteAllActualPlanVideoMaterialsRelation
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 getAllActualPlanVideoMaterials
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 deleteProposedPlan
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 29
 deleteAllProposedPlanCourseMaterialsRelation
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 deleteAllProposedPlanVideoMaterialsRelation
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 removeProposedPlanFromActualPlan
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getAllProposedPlanVideoMaterials
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 14
 getAllProposedPlanCourseMaterialIds
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 13
 getAllActualPlanCourseMaterialIds
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getSubjectProposedPlanByRequest
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 23
 getSubjectPlansByRequest
0.00% covered (danger)
0.00%
0 / 1
182.00
0.00% covered (danger)
0.00%
0 / 45
 getSubjectPlanDurationBySbsIdAndDate
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 27
 updateOnlineExamMappingProposedPlan
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 updateOnlineExamMappingProposedPlanPs
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getOnlineExamMappingProposedPlan
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getOnlineExamMappingProposedPlanPs
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getSubjectPlanDetails
0.00% covered (danger)
0.00%
0 / 1
90.00
0.00% covered (danger)
0.00%
0 / 74
 getSubjectActualPlanReportMoreDetails
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 37
 getProposedSubjectPlanFromCommunityByDiferentSubject
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 23
<?php
namespace com\linways\core\ams\professional\service;
use com\linways\core\ams\professional\exception\ProfessionalException;
use com\linways\core\ams\professional\dto\SubjectPlan;
use com\linways\core\ams\professional\mapper\SubjectPlanServiceMapper;
use com\linways\core\ams\professional\dto\SubjectPlanPopupPreference;
use com\linways\core\ams\professional\request\ActualPlanRequest;
use com\linways\core\ams\professional\request\AddNewActualPlanMaterialRequest;
use com\linways\core\ams\professional\request\AddNewProposedPlanMaterialRequest;
use com\linways\core\ams\professional\request\DeleteActualPlanRequest;
use com\linways\core\ams\professional\request\DeleteCourseMaterialRequest;
use com\linways\core\ams\professional\request\DeleteProposedPlanRequest;
use com\linways\core\ams\professional\request\GetPreSignedUrlRequest;
use com\linways\core\ams\professional\response\ActualPlanResponse;
use com\linways\core\ams\professional\dto\SubjectPlanPreference;
use com\linways\core\ams\professional\request\SubjectPlanRequest;
use stdClass;
class SubjectPlanService extends BaseService
{
    /**
     * Presence of a static member variable
     *
     * @var null
     */
    private static $_instance = null;
    /**
     * @var array
     */
    private $mapper = [];
    /**
     * Locked down the constructor
     *
     * SubjectPlanService constructor.
     */
    private function __construct()
    {
        $this->mapper = SubjectPlanServiceMapper::getInstance()->getMapper();
    }
    /**
     * Prevent any object or instance of that class to be cloned or Prevent any outside instantiation of this class
     */
    private function __clone()
    {
    }
    /**
     * Have a single globally accessible static method
     *
     * @return SubjectPlanService|null
     */
    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 actual plan report
     * @return SubjectPlan $subjectPlans
     * @throws ProfessionalException
     */
    public function getActualPlanReport($batchId, $semId)
    {
        $subjectPlans = [];
        $sql = "SELECT DISTINCT
                topicID,
                topicName,
                session,
                FROM_UNIXTIME(sbp.date, '%Y-%m-%d') AS subjectPlanDate,
                sbp.hour,
                staffName,
                subjectName,
                sbsr.sbsID,
                sub.subjectID,
                sbp.isCovered,
                (SELECT
                        (CASE
                                WHEN COUNT(DISTINCT a.studentID) > 0 THEN 1
                                ELSE 0
                            END)
                    FROM
                        attendance a
                    WHERE
                        a.attendanceDate = FROM_UNIXTIME(sbp.date, '%Y-%m-%d')
                            AND a.hour = sbp.hour
                            AND a.batchID = $batchId
                            AND a.semId = $semId) AS isAttendanceMarked,
                (SELECT
                        COUNT(DISTINCT a.studentID)
                    FROM
                        attendance a
                    WHERE
                        a.attendanceDate = FROM_UNIXTIME(sbp.date, '%Y-%m-%d')
                            AND a.hour = sbp.hour
                            AND a.batchID = $batchId
                            AND a.semId = $semId
                            AND a.isAbsent = 1) AS absenteesCount,
                (SELECT
                        GROUP_CONCAT(DISTINCT sa.rollNo)
                    FROM
                        attendance a
                            INNER JOIN
                        studentaccount sa ON sa.studentID = a.studentID
                    WHERE
                        a.attendanceDate = FROM_UNIXTIME(sbp.date, '%Y-%m-%d')
                            AND a.hour = sbp.hour
                            AND a.batchID = $batchId
                            AND a.semId = $semId
                            AND a.isAbsent = 1) AS absentees
            FROM
                sbs_relation sbsr
                    INNER JOIN
                subjectplan sbp ON sbp.sbsID = sbsr.sbsID
                    INNER JOIN
                staffaccounts sa ON sbsr.staffID = sa.staffID
                    INNER JOIN
                subjects sub ON sbsr.subjectID = sub.subjectID
            WHERE
                sbsr.batchID = $batchId AND sbsr.semID = $semId";
        try {
            $subjectPlans = $this->executeQueryForList($sql, $this->mapper[SubjectPlanServiceMapper::GET_ACTUAL_PLAN_REPORT]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectPlans;
    }
    /**
     * get actual plan report by subject
     * @param ActualPlanRequest $actualPlanRequest
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getSubjectActualPlanReport($actualPlanRequest)
    {
        $actualPlans = new ActualPlanResponse();
        $cond = "";
        if ($actualPlanRequest != NULL) {
            $sql_count = "SELECT count(sp.date) as totalRecord FROM subjectplan as sp WHERE sbsID = $actualPlanRequest->sbsId ";
            $sql = "SELECT sp.date, sp.hour, sp.module, sp.topicName, sp.isCovered, sp.day, sp.session, spr.pedagogy, sp.modeOfeLearning, spr.mode, sp.mode as modeActual,spr.content,spr.units FROM subjectplan sp LEFT JOIN subjectplan_proposed spr ON sp.proposed_topicID = spr.topicID WHERE sp.sbsID = $actualPlanRequest->sbsId ";
            if ($actualPlanRequest->subbatchId != null) {
                $cond = "AND sp.subbatchID=$actualPlanRequest->subbatchId";
            }
            $sql_count .= $cond;
            $sql .= $cond;
            if ($actualPlanRequest->sortOrder) {
                $sql .= " ORDER BY sp.date $actualPlanRequest->sortOrder, sp.hour, sp.session ";
            }
            try {
                $actualPlans->totalRecords = $this->executeQueryForObject($sql_count)->totalRecord;
                if ($actualPlanRequest->export) {
                    $actualPlanRequest->endIndex = $studentDetails->totalRecords;
                }
                $sql .= $sql_cond . "LIMIT $actualPlanRequest->startIndex,$actualPlanRequest->endIndex";
                $actualPlans->actualPlans = $this->executeQueryForList($sql);
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
        }
        return $actualPlans;
    }
    /**
     * get actual plan report by pseudo subject
     * @param ActualPlanRequest $actualPlanRequest
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getPseudoSubjectActualPlanReport($actualPlanRequest)
    {
        $actualPlans = new ActualPlanResponse();
        $cond = "";
        if ($actualPlanRequest != NULL) {
            $sql_count = "SELECT count(pssp.date) as totalRecord FROM ps_subjectplan pssp WHERE pssp.pssId = $actualPlanRequest->pssId ";
            $sql = "SELECT pssp.date, pssp.hour, pssp.module, pssp.topicName, pssp.isCovered, pssp.mode, pssp.day, pssp.session, sppr.pedagogy, pssp.modeOfeLearning, pssp.mode as modeActual , GROUP_CONCAT(lr.path) AS url,GROUP_CONCAT(DISTINCT plr.path) AS proposedUrl 
            FROM ps_subjectplan pssp 
            LEFT JOIN subjectplan_ps_proposed sppr ON sppr.topicID = pssp.proposed_topicID  
            LEFT JOIN ps_actual_plan_video_materials sapvm ON pssp.topicID = sapvm.ps_actual_plan_id 
            LEFT JOIN course_video_materials cvm ON sapvm.video_repository_id = cvm.id 
            LEFT JOIN ps_proposed_plan_video_materials spvm ON pssp.topicID = spvm.ps_proposed_plan_id
            LEFT JOIN course_video_materials  pcvm ON spvm.video_repository_id = pcvm.id 
            LEFT JOIN lin_resource lr ON lr.id = cvm.resource_id 
            LEFT JOIN lin_resource plr ON plr.id = pcvm.resource_id 
            WHERE pssp.pssId = $actualPlanRequest->pssId 
            group by pssp.topicID ";
            if((int)$actualPlanRequest->isCovered){
                $cond .= " AND pssp.isCovered = $actualPlanRequest->isCovered " ;
            }
            $sql_count .= $cond;
            $sql .= $cond;
            if ($actualPlanRequest->sortOrder) {
                $sql .= " ORDER BY pssp.date $actualPlanRequest->sortOrder, pssp.hour, pssp.session ";
            }
            try {
                $actualPlans->totalRecords = $this->executeQueryForObject($sql_count)->totalRecord;
                if(!$actualPlanRequest->notUseLimits){
                    $sql .= "LIMIT $actualPlanRequest->startIndex,$actualPlanRequest->endIndex";
                }
                $actualPlans->actualPlans = $this->executeQueryForList($sql);
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
        }
        return $actualPlans;
    }
    /**
     * add subject plan popup preference
     * @param SubjectPlanPopupPreference $subjectPlanPreference
     * @return \com\linways\base\dto\MySqlResult
     * @throws ProfessionalException
     */
    public function addSubjectPlanPopupPreference($subjectPlanPreference)
    {
        $sql = "INSERT INTO
                subjectPlanPreference
                (
                    deptId,
                    batchId,
                    popupHide,
                    buttonHide,
                    createdBy,
                    updatedBy,
                    createdDate,
                    updatedDate
                )
             VALUES
                (
                 $subjectPlanPreference->deptId,
                 $subjectPlanPreference->batchId,
                 $subjectPlanPreference->popupHide,
                 $subjectPlanPreference->buttonHide,
                 $subjectPlanPreference->createdBy,
                 $subjectPlanPreference->updatedBy,
                 utc_timestamp(),
                 utc_timestamp()
                )";
        try {
            return $this->executeQuery($sql, TRUE);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * update subject plan popup preference
     * @param SubjectPlanPopupPreference $subjectPlanPreference
     * @throws ProfessionalException
     */
    public function updateSubjectPlanPopupPreference($subjectPlanPreference)
    {
        $value = [];
        $sql = "UPDATE
                subjectPlanPreference
            SET ";
        if ($subjectPlanPreference->popupHide != NULL) {
            $value[] = "popupHide=$subjectPlanPreference->popupHide";
        }
        if ($subjectPlanPreference->buttonHide != NULL) {
            $value[] = "buttonHide=$subjectPlanPreference->buttonHide";
        }
        $sql .= implode(',', $value);
        $sql .= " WHERE id=$subjectPlanPreference->id";
        try {
            return $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get all subject plan preference by dept id
     * @param int $deptId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getSubjectPlanPopupPreference($deptId)
    {
        $batchDetails = NULL;
        $sql = "SELECT bth.batchId, bth.batchName, spp.id, spp.popupHide, spp.buttonHide FROM batches bth LEFT JOIN subjectPlanPreference spp ON spp.batchId=bth.batchID AND spp.deptId=bth.deptID WHERE bth.deptID=$deptId AND bth.batchHide=0 ORDER BY bth.batchId";
        try {
            $batchDetails = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $batchDetails;
    }
    /**
     * check popup preference using batch id
     * @param int $batchId
     * @return object|NULL|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function checkPopupHide($batchId)
    {
        $popupPreference = NULL;
        $sql = "SELECT popupHide,buttonHide FROM subjectPlanPreference WHERE batchId=$batchId";
        try {
            $popupPreference = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $popupPreference;
    }
    /**
     *
     * @param SubjectPlanPreference $defaultModeOfInstruction
     * @return \com\linways\base\dto\MySqlResult
     * @throws ProfessionalException
     */
    public function createModeOfInstruction($defaultModeOfInstruction)
    {
        $sql = "insert into default_mode_of_instruction (deptId,batchId,modeOfInstruction,createdBy,createdDate) values ($defaultModeOfInstruction->deptId,$defaultModeOfInstruction->batchId,'" . $defaultModeOfInstruction->modeOfInstruction . "',$defaultModeOfInstruction->createdBy, utc_timestamp())";
        try {
            return $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     *
     * @param SubjectPlanPreference $defaultModeOfInstruction
     * @return \com\linways\base\dto\MySqlResult
     * @throws ProfessionalException
     */
    public function updateModeOfInstruction($defaultModeOfInstruction)
    {
        $sql = "update default_mode_of_instruction set modeOfInstruction = '" . $defaultModeOfInstruction->modeOfInstruction . "', updatedBy = $defaultModeOfInstruction->updatedBy, updatedDate = utc_timestamp() where deptId = $defaultModeOfInstruction->deptId and batchId = $defaultModeOfInstruction->batchId";
        try {
            return $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     *
     * @param int $deptId
     * @param int $batchId
     * @return string
     * @throws ProfessionalException
     */
    public function getDefaultModeOfInstructionByBatch($deptId, $batchId)
    {
        $sql = "select modeOfInstruction from default_mode_of_instruction where deptId = $deptId  and batchId= $batchId";
        try {
            $modeOfInstruction = $this->executeQueryForObject($sql)->modeOfInstruction;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $modeOfInstruction;
    }
    /**
     *  get actual and proposed plan by subject
     * @param SubjectPlanRequest $subjectPlanRequest
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getSubjectPlan($subjectPlanRequest)
    {
        $subjectPlanRequest = $this->realEscapeObject($subjectPlanRequest);
        $subjectPlanList = [];
        if ($subjectPlanRequest->subbatchId) {
            $cond = "subbatchID IN(0," . $subjectPlanRequest->subbatchId . ")";
        } else {
            $cond = "subbatchID = 0";
        }
        $sql = "SELECT DISTINCT sp.topicID, sp.topicName, sp.module, sub.isCovered, sub.hour as actualHour, sp.hour as proposedHour, FROM_UNIXTIME(sp.date, '%Y-%m-%d') as proposedDate, sp.session".($subjectPlanRequest->needActualPlanId?',sub.topicID as actual_plan_topic_id':',null as actual_plan_topic_id')."
        FROM subjectplan_proposed sp 
        LEFT JOIN subjectplan sub ON sp.topicID = sub.proposed_topicID AND sub.sbsID = sp.sbsID AND sub.subbatchID = sp.subbatchID AND FROM_UNIXTIME(sub.date, '%Y-%m-%d') = '" . date('Y-m-d', strtotime($subjectPlanRequest->date)) . "
        WHERE sp.sbsID = $subjectPlanRequest->sbsId AND sp.$cond AND sp.topicID NOT IN (SELECT proposed_topicID FROM subjectplan WHERE sbsID = $subjectPlanRequest->sbsId AND FROM_UNIXTIME(date, '%Y-%m-%d') != '" . date('Y-m-d', strtotime($subjectPlanRequest->date)) . "' AND $cond AND isCovered = 2) GROUP BY sp.topicID ";
        if ($subjectPlanRequest->sortBy) {
            $sql .= " ORDER BY $subjectPlanRequest->sortBy $subjectPlanRequest->sortOrder ";
        }
        try {
            $subjectPlanList = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectPlanList;
    }
    /**
     * check subject paln for a subject is approved or not
     * @param int $sbsId
     * @return boolean
     * @throws ProfessionalException
     */
    public function subjectPlanApprovelStatusBySbsId($sbsId)
    {
        $sbsId = $this->realEscapeString($sbsId);
        $approverId = 0;
        $isApproved = false;
        $sql = "SELECT approverID FROM subjects_approve_status WHERE sbsID='$sbsId'";
        try {
            $approverId = $this->executeQueryForObject($sql);
            if ($approverId) {
                $isApproved = true;
            }
            return $isApproved;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $sbsId
     * @return Object|null
     * @throws ProfessionalException
     */
    public function getWeeKWiseSubjectPlanDetails($sbsId)
    {
        $sbsId = $this->realEscapeObject($sbsId);
        $subjectPlans = null;
        $sql = "SELECT DISTINCT sp.topicID, CONCAT(FROM_UNIXTIME(sp.date, '%Y'),WEEK(FROM_UNIXTIME(sp.date, '%Y-%m-%d'),1)) as yearWeek,
                FROM_UNIXTIME(sp.date, '%Y-%m-%d') as subjectPlanDate, sp.topicName, sp.topicDesc, sp.isImportant, sp.hour, sp.module,
                sp.pedagogy, subp.isCovered, sp.session,
                cm.id as material_id, cm.resource_id, cm.name as material_name, cm.description as material_description,
                cm1.id as proposed_material_id, cm1.resource_id as proposed_resource_id, cm1.name as proposed_material_name,
                cm1.description as proposed_material_description,
                cvm.id as actual_video_material_id,cvm.title as actual_video_material_name,lr.path as actual_video_material_url,
                cvm1.id as proposed_video_material_id,cvm1.title as proposed_video_material_name,lr1.path as proposed_video_material_url,
                temp.finalStatus
                FROM subjectplan_proposed sp
                LEFT JOIN subjectplan subp ON sp.topicID=subp.proposed_topicID
                LEFT JOIN courseMatActualPlanRelation map ON map.actualId=subp.topicID
                LEFT JOIN course_materials cm ON cm.id=map.cousreMatId AND cm.is_active=1
                LEFT JOIN subject_actual_plan_video_materials sapvm ON sapvm.subject_actual_plan_id = subp.topicID
                LEFT JOIN course_video_materials cvm on sapvm.video_repository_id = cvm.id
                LEFT JOIN lin_resource lr ON lr.id = cvm.resource_id
                LEFT JOIN courseMatProposedPlanRelation mpp ON mpp.proposedId=sp.topicID
                LEFT JOIN course_materials cm1 ON cm1.id=mpp.cousreMatId AND cm1.is_active=1
                LEFT JOIN subject_proposed_plan_video_materials sppvm ON sppvm.subject_proposed_plan_id = sp.topicID
                LEFT JOIN course_video_materials cvm1 on sppvm.video_repository_id = cvm1.id
                LEFT JOIN lin_resource lr1 ON lr1.id = cvm1.resource_id
                LEFT JOIN  (
                    SELECT MAX(isCovered) as finalStatus,proposed_topicID
                    FROM subjectplan WHERE sbsID = $sbsId
                ) AS temp ON temp.proposed_topicID=sp.topicID
                WHERE sp.sbsID=$sbsId
                ORDER BY sp.date, WEEK(FROM_UNIXTIME(sp.date, '%Y-%m-%d'),1), sp.hour desc";
        try {
            $subjectPlans = $this->executeQueryForList($sql, $this->mapper[SubjectPlanServiceMapper::GET_WEEKWISE_SUBJECTPLAN_DETAILS]);
            foreach ($subjectPlans as $subjectPlan) {
                foreach ($subjectPlan->subjectPlan as $plan) {
                    foreach ($plan->actualPlanCourseMaterials as $material) {
                        $request = new GetPreSignedUrlRequest();
                        $request->resourceId = $material->resourceId;
                        $request->secretKey = getenv("AWS_CLIENT_SECRET_KEY");
                        $request->accessKey = getenv("AWS_ACCESS_KEY");
                        $url = ResourceService::getInstance()->getPreSignedUrlByResourceId($request);
                        $material->url = $url->url;
                    }
                    foreach ($plan->proposedPlanCourseMaterials as $material) {
                        $request = new GetPreSignedUrlRequest();
                        $request->resourceId = $material->resourceId;
                        $request->secretKey = getenv("AWS_CLIENT_SECRET_KEY");
                        $request->accessKey = getenv("AWS_ACCESS_KEY");
                        $url = ResourceService::getInstance()->getPreSignedUrlByResourceId($request);
                        $material->url = $url->url;
                    }
                }
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectPlans;
    }
    /**
     * create relation between course material and actual plan
     * @param object $matDetails
     * @param int $actualId
     * @return object|NULL|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function createActualplanCousreMat($matDetails, $actualId)
    {
        if (count($matDetails->matIds)) {
            $sql = "INSERT INTO courseMatActualPlanRelation
                    (actualId,
                    cousreMatId,
                    createdBy,
                    createdDate,
                    updatedBy,
                    updatedDate) VALUES";
            foreach ($matDetails->matIds as $matId) {
                $sql .= "($actualId,'$matId',$matDetails->createdBy,utc_timestamp(),$matDetails->updatedBy,utc_timestamp()),";
            }
            $sql = rtrim($sql, ',');
        }
        try {
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * for get material Details of actual plan
     * @param int $actualId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getActualplanCousreMat($actualId)
    {
        $sql = "SELECT cr.cousreMatId, cm.name as materialName, cm.topic as materialTopic,
                cm.description as materialDesc,cm.resource_id as resourceId
                FROM courseMatActualPlanRelation cr
                INNER JOIN course_materials cm ON cm.id=cr.cousreMatId
                WHERE actualId=$actualId";
        try {
            $materials = $this->executeQueryForList($sql);
            foreach ($materials as $material) {
                $request = new GetPreSignedUrlRequest();
                $request->secretKey = getenv("AWS_CLIENT_SECRET_KEY");
                $request->accessKey = getenv("AWS_ACCESS_KEY");
                $request->resourceId = $material->resourceId;
                $url = ResourceService::getInstance()->getPreSignedUrlByResourceId($request);
                $material->materialDocPath = $url->url;
            }
            return $materials;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * remove actual plan course materials
     * @param int $id
     * @throws ProfessionalException
     */
    public function removeActualplanCousreMat($id)
    {
        $sql = "DELETE FROM courseMatActualPlanRelation WHERE actualId=$id";
        try {
            $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * create relation between course material and proposed plan
     * @param object $matDetails
     * @return object|NULL|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function createProposedplanCousreMat($matDetails, $proposedId)
    {
        if (count($matDetails->matIds)) {
            $sql = "INSERT INTO courseMatProposedPlanRelation
                    (proposedId,
                    cousreMatId,
                    createdBy,
                    createdDate,
                    updatedBy,
                    updatedDate) VALUES";
            foreach ($matDetails->matIds as $matId) {
                $sql .= "($proposedId,'$matId',$matDetails->createdBy,utc_timestamp(),$matDetails->updatedBy,utc_timestamp()),";
            }
            $sql = rtrim($sql, ',');
        }
        try {
            return $this->executeQueryForObject($sql, true);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * remove relation between proposed plan and course material
     * @param int $id
     * @throws ProfessionalException
     */
    public function removeProposedplanCousreMat($id)
    {
        $sql = "DELETE FROM courseMatProposedPlanRelation WHERE proposedId=$id";
        try {
            $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * for get material Details of proposed plan
     * @param int $proposedId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getProposedplanCousreMat($proposedId)
    {
        $sql = "SELECT cr.cousreMatId, cm.name as materialName, cm.topic asmaterialTopic, cm.description as materialDesc,
                cm.resource_id as resourceId
                FROM courseMatProposedPlanRelation cr
                INNER JOIN course_materials cm ON cm.id=cr.cousreMatId
                WHERE proposedId=$proposedId";
        try {
            $materials = $this->executeQueryForList($sql);
            foreach ($materials as $material) {
                $request = new GetPreSignedUrlRequest();
                $request->resourceId = $material->resourceId;
                $request->secretKey = getenv("AWS_CLIENT_SECRET_KEY");
                $request->accessKey = getenv("AWS_ACCESS_KEY");
                $url = ResourceService::getInstance()->getPreSignedUrlByResourceId($request);
                $material->materialDocPath = $url->url;
            }
            return $materials;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get subject planner hour details
     * @param int $sbsId
     * @param string $fromDate
     * @param string $toDate
     * @return unknown
     * @throws ProfessionalException
     */
    public function getSubjectPlannerDetails($sbsId, $toDate, $fromDate = NULL)
    {
        $sbsId = $this->realEscapeString($sbsId);
        $fromDate = $this->realEscapeString($fromDate);
        $toDate = $this->realEscapeString($toDate);
        if ($toDate) {
            $date = date_create($toDate);
            $toDate = date_format($date, "Y-m-d");
            unset($date);
        }
        if ($fromDate) {
            $date = date_create($fromDate);
            $fromDate = date_format($date, "Y-m-d");
        }
        $response = new \StdClass();
        if (empty($fromDate)) {
            $ProposedPlan = " <= UNIX_TIMESTAMP('$toDate')";
            $HoursTaken = " <= ('$toDate')";
        } else {
            $ProposedPlan = " BETWEEN UNIX_TIMESTAMP('$fromDate') AND UNIX_TIMESTAMP('$toDate')";
            $HoursTaken = " BETWEEN ('$fromDate') AND ('$toDate')";
        }
        $sql = "SELECT count(sp.hour) as expectedHrs, count(ac.hour) as hrsTakenAttn, count(sh.hour) as suspendedHrs , count(sp.hour) - count(ac.hour) - count(sh.hour) as pendingHrs, count(sp.hour) - count(ac.hour) as neededHrs  FROM subjectplan_proposed sp inner join sbs_relation sr on sr.sbsID = sp.sbsID left join attendance_confirm ac on sp.sbsID = ac.sbsID and ac.attendanceDate = from_unixtime(sp.date) and sp.hour = ac.hour left join suspended_hours sh on sh.suspendedDate = from_unixtime(sp.date) and sh.hour = sp.hour and sh.batchID = sr.batchID and sh.semID = sr.semID where sp.sbsID = $sbsId and date $ProposedPlan order by date, sp.hour;";
        $sqlForNoOfProposedPlans = "SELECT
                                        count(sp.topicID) as NoOfProposedPlans
                                    FROM
                                        subjectplan_proposed sp
                                    WHERE sp.sbsID = '$sbsId' AND sp.date$ProposedPlan";
        $sqlForNoOfHoursTaken = "    SELECT
                                        count(distinct attendanceDate,hour) as NoOfHoursTaken
                                    FROM
                                        attendance_confirm
                                    WHERE sbsID='$sbsId' AND attendanceDate    $HoursTaken;";
        try {
            $response->noOfProposedPlans = $this->executeQueryForObject($sqlForNoOfProposedPlans)->NoOfProposedPlans;
            $response->sqlForNoOfHoursTaken = $this->executeQueryForObject($sqlForNoOfHoursTaken)->NoOfHoursTaken;
            $response->NoofPeriodsPending = $response->noOfProposedPlans - $response->sqlForNoOfHoursTaken;
            $response->NoOfFullProposedPlans = SubjectPlanService::getInstance()->getProposedSubjectPlanBySbsID($sbsId);
            $response->NoofFullPeriodsPending = $response->NoOfFullProposedPlans - $response->sqlForNoOfHoursTaken;
            $proposedPlanDetails = $this->executeQueryForObject($sql);
            $response->suspendedHrs = $proposedPlanDetails->suspendedHrs;
            $response->pendingHrs = $proposedPlanDetails->pendingHrs;
            $response->neededHrs = $proposedPlanDetails->neededHrs;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $response;
    }
    /**
     * Get actual planner hour details
     * @param int $sbsId
     * @param string $fromDate
     * @param string $toDate
     * @return unknown
     * @throws ProfessionalException
     */
    public function getActualPlannerDetails($sbsId, $fromDate, $toDate)
    {
        $sbsId = $this->realEscapeString($sbsId);
        $fromDate = $this->realEscapeString($fromDate);
        $toDate = $this->realEscapeString($toDate);
        $sql = "SELECT count(sp.hour) as expectedHrs, count(ac.hour) as hrsTakenAttn, count(sh.hour) as suspendedHrs , count(sp.hour) - count(ac.hour) - count(sh.hour) as pendingHrs, count(sp.hour) - count(ac.hour) as neededHrs  FROM subjectplan sp inner join sbs_relation sr on sr.sbsID = sp.sbsID left join attendance_confirm ac on sp.sbsID = ac.sbsID and ac.attendanceDate = from_unixtime(sp.date) and sp.hour = ac.hour left join suspended_hours sh on sh.suspendedDate = from_unixtime(sp.date) and sh.hour = sp.hour and sh.batchID = sr.batchID and sh.semID = sr.semID where sp.sbsID = $sbsId and date between unix_timestamp('$fromDate') and unix_timestamp('$toDate') order by date, sp.hour;";
        try {
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get all proposed subject plans by sbsId
     * @param Integer $sbsId
     * @return Array $subjectplanProposed
     * @author Vishnu M
     */
    public function getProposedSubjectPlanDetailsBySbsId($sbsId)
    {
        $sbsId = (int)$this->realEscapeString($sbsId);
        $subjectplanProposed = [];
        $sql = "SELECT topicID, date,FROM_UNIXTIME(date, '%Y-%m-%d') as planDate, sbsID, topicName, topicDesc, isCovered, isImportant, hour, module, pedagogy, subbatchID, mode, day, timeInMinutes, percentageCovered, session,content FROM subjectplan_proposed WHERE sbsID = '" . $sbsId . "' ORDER BY date ASC";
        try {
            $subjectplanProposed = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectplanProposed;
    }
    /**
     * Get all Actual subject plans by sbsId
     * @param Integer $sbsId
     * @return Array $subjectplanActual
     * @author Vishnu M
     */
    public function getActualSubjectPlanDetailsBySbsId($sbsId, $isCovered = null)
    {
        $sbsId = (int)$this->realEscapeString($sbsId);
        $isCovered = $this->realEscapeString($isCovered);
        $subjectplanActual = [];
        $condition = null;
        if ($isCovered != NULL) {
            $condition = " AND isCovered = '$isCovered";
        }
        $sql = "SELECT topicID, date, sbsID, topicName, topicDesc, isCovered, isImportant, hour, module, subbatchID, mode, day, timeInMinutes, percentageCovered, proposed_topicID, material_id, session FROM subjectplan WHERE sbsID = '" . $sbsId . "$condition ORDER BY date ASC";
        try {
            $subjectplanActual = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectplanActual;
    }
    /**
     * Add proposed subject plan to community by sbsId
     * @param Integer $sbsId
     * @param Integer $staffId
     * @return Integer $id
     * @author Vishnu M
     */
    public function addProposedSubjectPlanToCommunityBySbsId($sbsId, $staffId, $other = false)
    {
        $sbsId = (int)$this->realEscapeString($sbsId);
        $id = null;
        if($other)
        {
            $sql = "INSERT INTO subjectplan_proposed_community (sbs_id, is_other, createdBy, createdDate, updatedBy, updatedDate) VALUES ('$sbsId',1 ,'$staffId', utc_timestamp(), '$staffId', utc_timestamp())";
        }
        else
        {
            $sql = "INSERT INTO subjectplan_proposed_community (sbs_id, createdBy, createdDate, updatedBy, updatedDate) VALUES ('$sbsId', '$staffId', utc_timestamp(), '$staffId', utc_timestamp())";
        }        try {
            $id = $this->executeQuery($sql, true);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $id;
    }
    /**
     * Get proposed subject plan from community by sbsId
     * @param Integer $sbsId
     * @return Object $subjectplan_proposed
     * @author Vishnu M
     */
    public function getProposedSubjectPlanFromCommunityBySbsId($sbsId)
    {
        $sbsId = (int)$this->realEscapeString($sbsId);
        $subjectplan_proposed = null;
        try {
            $sql = "SELECT id, sbs_id, is_shared FROM subjectplan_proposed_community WHERE sbs_id = '$sbsId";
            $subjectplan_proposed = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectplan_proposed;
    }
    /**
     * Soft Delete proposed subject plan from community by sbsId
     * @param Integer $sbsId
     * @return Boolean true
     * @author Vishnu M
     */
    public function changeSharingProposedSubjectPlanInCommunityBySbsId($sbsId, $other = false)
    {
        $sbsId = (int)$this->realEscapeString($sbsId);
        $other = $other ? 1 : 0;
        
        try {
            $sql = "UPDATE subjectplan_proposed_community 
                                SET is_shared = IF ( is_shared = 1, 0 , 1),
                                updatedDate = utc_timestamp(),
                                is_other = $other
                                WHERE sbs_id = '$sbsId'";            
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return true;
    }
    /**
     * Get proposed subject plan from community by sbsId
     * @param Integer $sbsId
     * @return Object $subjectplan_proposed
     * @author Vishnu M
     */
    public function getProposedSubjectPlanFromCommunityBySubject($sbsId)
    {
        $sbsId = (int)$this->realEscapeString($sbsId);
        $subjectplan_community = null;
        try {
            $sql = "SELECT sa.staffName, b.batchName, count(spp.topicID) AS proposedplans, sbs.sbsID FROM staffaccounts sa INNER JOIN sbs_relation sbs ON (sa.staffID = sbs.staffID) INNER JOIN batches b ON (b.batchID = sbs.batchID) INNER JOIN subjectplan_proposed_community spc ON (spc.sbs_id = sbs.sbsID) LEFT JOIN subjectplan_proposed spp ON (spp.sbsID = sbs.sbsID) WHERE sbs.subjectID = (SELECT subjectID FROM sbs_relation WHERE sbsID = '$sbsId') AND sbs.sbsID != '$sbsId' AND spc.is_shared = 1 GROUP BY spp.sbsID;";
            $subjectplan_community = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectplan_community;
    }
    /**
     * Get proposed subject plan from an array of topic ids
     * @param Array $topicIdArr
     * @return Array $proposed_subjectplan
     * @author Vishnu M
     */
    public function getProposedSubjectPlanByIds($topicIdArr)
    {
        $topicIdArr = $this->realEscapeArray($topicIdArr);
        $proposed_subjectplan = null;
        try {
            $sql = "SELECT topicID, date, sbsID, topicName, topicDesc, isCovered, isImportant, hour, module, pedagogy, subbatchID, mode, day, timeInMinutes, percentageCovered, session,content FROM subjectplan_proposed WHERE topicID IN (" . implode(",", $topicIdArr) . ")";            $proposed_subjectplan = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $proposed_subjectplan;
    }
    /**
     * Get proposed subject plan from an array of topic ids
     * @param ProposedPlan-Object $proposedPlan
     * @return Integer $topicId
     * @author Vishnu M
     */
    public function addProposedSubjectPlan($proposedPlan)
    {
        $proposedPlan = $this->realEscapeObject($proposedPlan);
        $topicId = null;
        try {
            $sql = "INSERT INTO subjectplan_proposed (date, sbsID, topicName, topicDesc, isCovered, isImportant, hour, module, pedagogy, subbatchID, mode, day, timeInMinutes, percentageCovered, session, created_by, created_date, updated_by, updated_date,content) VALUES (
                '" . $proposedPlan->subjectPlanDate . "',
                '" . $proposedPlan->sbsId . "',
                '" . $proposedPlan->topicName . "',
                '" . $proposedPlan->topicDesc . "',
                '" . $proposedPlan->isCovered . "',
                '" . $proposedPlan->isImportant . "',
                '" . $proposedPlan->hour . "',
                '" . $proposedPlan->module . "',
                '" . $proposedPlan->pedagogy . "',
                '" . $proposedPlan->subbatchID . "',
                '" . $proposedPlan->mode . "',
                '" . $proposedPlan->day . "',
                '" . $proposedPlan->timeInMinutes . "',
                '" . $proposedPlan->percentageCovered . "',
                '" . $proposedPlan->session . "',
                '" . $proposedPlan->created_by . "',
                utc_timestamp(),
                '" . $proposedPlan->created_by . "',
                utc_timestamp(),
                '". json_encode($proposedPlan->content) . "'
            )";
            $topicId = $this->executeQuery($sql, true);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $topicId;
    }
    /**
     * Get proposed subject plan from an array of topic ids
     * @param Integer $proposedPlanId
     * @param Integer $proposedPlanFromId
     * @param Integer $fromSbsId
     * @param Integer $staffId
     * @return Boolean true
     * @author Vishnu M
     */
    public function addProposedPlanCopyInfo($proposedPlanId, $proposedPlanFromId, $fromSbsId, $staffId)
    {
        $proposedPlanId = (int)$this->realEscapeString($proposedPlanId);
        $proposedPlanFromId = (int)$this->realEscapeString($proposedPlanFromId);
        $fromSbsId = (int)$this->realEscapeString($fromSbsId);
        $staffId = (int)$this->realEscapeString($staffId);
        try {
            $sql = "INSERT INTO subjectplan_proposed_copy_info (subjectplan_proposed_id, from_subjectplan_proposed_id, from_sbs_id, createdBy, createdDate, updatedBy, updatedDate) VALUES ('" . $proposedPlanId . "', '" . $proposedPlanFromId . "', '" . $fromSbsId . "', " . $staffId . ", utc_timestamp(), " . $staffId . ", utc_timestamp())";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return true;
    }
    /**
     * Get proposed subject plan copy info
     * @param Integer $sbsId
     * @return Array proposedPlanCopyInfo
     * @author Vishnu M
     */
    public function getProposedPlanCopyInfoBySbsId($fromSbsId, $sbsId)
    {
        $fromSbsId = (int)$this->realEscapeString($fromSbsId);
        $sbsId = (int)$this->realEscapeString($sbsId);
        $proposedPlanCopyInfo = [];
        try {
            $sql = "SELECT spci.subjectplan_proposed_id, spci.from_subjectplan_proposed_id, spci.from_sbs_id FROM subjectplan_proposed_copy_info spci INNER JOIN subjectplan_proposed sp ON (sp.topicID = spci.subjectplan_proposed_id) WHERE spci.from_sbs_id = '" . $fromSbsId . "' AND sp.sbsID = '" . $sbsId . "'";
            $proposedPlanCopyInfo = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $proposedPlanCopyInfo;
    }
    /**
     * Get proposed subject plan from an array of topic id
     * @param Integer $topicId
     * @return Object $proposed_subjectplan
     * @author Vishnu M
     */
    public function getProposedSubjectPlanById($topicId)
    {
        $topicId = (int)$this->realEscapeString($topicId);
        $proposed_subjectplan = null;
        try {
            $sql = "SELECT topicID, date, sbsID, topicName, topicDesc, isCovered, isImportant, hour, module, pedagogy, subbatchID, mode, day, timeInMinutes, percentageCovered, session,content FROM subjectplan_proposed WHERE topicID = '$topicId'";
            $proposed_subjectplan = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $proposed_subjectplan;
    }
    /**
     * Get proposed subject plan from an array of topic id
     * @param Integer $sbsId
     * @param String $fromDate
     * @param String $toDate
     * @return Object $actualSubjectPlan
     * @throws ProfessionalException
     * @author Vishnu M
     */
    public function getActualSubjectPlansCovered($sbsId, $fromDate = NULL, $toDate = NULL)
    {
        $sbsId = (int)$this->realEscapeString($sbsId);
        $fromDate = $this->realEscapeString($fromDate);
        $toDate = $this->realEscapeString($toDate);
        $condition = null;
        if ($fromDate && $toDate) {
            $fromDate = date("Y-m-d", strtotime($fromDate));
            $toDate = date("Y-m-d", strtotime($toDate));
            $condition = " AND date between unix_timestamp('$fromDate') and unix_timestamp('$toDate') ";
        } else if ($toDate) {
            $toDate = date("Y-m-d", strtotime($toDate));
            $condition = " AND date <= unix_timestamp('$toDate') ";
        } else if ($fromDate) {
            $fromDate = date("Y-m-d", strtotime($fromDate));
            $condition = " AND date >= unix_timestamp('$fromDate') ";
        }
        $actualSubjectPlan = null;
        try {
            $sql = "SELECT topicID, date, sbsID, topicName, topicDesc, isCovered, isImportant, hour, module, proposed_topicID, material_id, subbatchID, mode, day, timeInMinutes, percentageCovered, session FROM subjectplan WHERE isCovered = 2 AND sbsID = '$sbsId$condition ";
            $actualSubjectPlan = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $actualSubjectPlan;
    }
    /**
     * To get count of proposed subjectplan
     * @param Integer $sbsId
     * @return Int NoOfproposedPlan
     * @author Nandu
     */
    public function getProposedSubjectPlanBySbsID($sbsId)
    {
        $sbsID = (int)$this->realEscapeString($sbsID);
        try {
            $sql = "SELECT count(topicID) as NoOfproposedPlan FROM subjectplan_proposed sp WHERE sp.sbsID = '$sbsId';";
            $NoOfproposedPlan = $this->executeQueryForObject($sql)->NoOfproposedPlan;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $NoOfproposedPlan;
    }
    /**
     * @param $subjectPlanId
     * @param $courseMaterialId
     * @throws ProfessionalException
     */
    public function deleteCourseMaterialFromActualPlan($subjectPlanId, $courseMaterialId)
    {
        $subjectPlanId = $this->realEscapeString($subjectPlanId);
        $courseMaterialId = $this->realEscapeString($courseMaterialId);
        if (empty($subjectPlanId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_ACTUAL_PLAN_ID, "Invalid actual plan details given");
        }
        if (empty($courseMaterialId) && (int)$courseMaterialId) {
            throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_ID, "Invalid course materials details given");
        }
        $sql = "DELETE FROM courseMatActualPlanRelation
                WHERE actualId =$subjectPlanId AND cousreMatId= '$courseMaterialId'";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $courseMaterialId
     * @throws ProfessionalException
     */
    public function deleteCourseMaterialFromActualPlanByMaterialId($courseMaterialId)
    {
        $courseMaterialId = $this->realEscapeString($courseMaterialId);
        if (empty($courseMaterialId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_ID, "Invalid course materials details given");
        }
        $sql = "DELETE FROM courseMatActualPlanRelation
                WHERE cousreMatId= '$courseMaterialId'";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $proposedId
     * @param $courseMaterialId
     * @throws ProfessionalException
     */
    public function deleteCourseMaterialFromProposesPlan($proposedId, $courseMaterialId)
    {
        $proposedId = $this->realEscapeString($proposedId);
        $courseMaterialId = $this->realEscapeString($courseMaterialId);
        if (empty($proposedId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PROPOSED_PLAN_ID, "Invalid proposed plan details given");
        }
        if (empty($courseMaterialId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_ID, "Invalid course materials details given");
        }
        $sql = "DELETE FROM courseMatProposedPlanRelation
                WHERE  proposedId=$proposedId AND cousreMatId= '$courseMaterialId'";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $courseMaterialId
     * @throws ProfessionalException
     */
    public function deleteCourseMaterialFromProposesPlanMaterialId($courseMaterialId)
    {
        $courseMaterialId = $this->realEscapeString($courseMaterialId);
        if (empty($courseMaterialId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_ID, "Invalid course materials details given");
        }
        $sql = "DELETE FROM courseMatProposedPlanRelation
                WHERE  cousreMatId= '$courseMaterialId'";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $proposedId
     * @return array|object
     * @throws ProfessionalException
     */
    public function getProposedPlanCourseMaterials($proposedId)
    {
        $courseMaterialDetails = [];
        $sql = "SELECT cm.id, cm.name, cm.topic,cm.description, cm.resource_id as resourceId
                FROM courseMatProposedPlanRelation cr
                INNER JOIN course_materials cm ON cm.id = cr.cousreMatId
                WHERE cr.proposedId = $proposedId";
        try {
            $courseMaterialDetails = $this->executeQueryForList($sql);
            foreach ($courseMaterialDetails as $materialDetail) {
                $request = new GetPreSignedUrlRequest();
                $request->resourceId = $materialDetail->resourceId;
                $request->secretKey = getenv("AWS_CLIENT_SECRET_KEY");
                $request->accessKey = getenv("AWS_ACCESS_KEY");
                $url = ResourceService::getInstance()->getPreSignedUrlByResourceId($request);
                $materialDetail->url = $url->url;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $courseMaterialDetails;
    }
    /**
     * Returns all course materials assigned to actual plans
     *
     * @param int $actualId
     * @return array|object $courseMatDetails
     * @throws ProfessionalException
     */
    public function getActualPlanCourseMaterials($actualId)
    {
        $courseMaterialDetails = [];
        $sql = "SELECT cm.id, cm.name, cm.topic,cm.description, cm.resource_id as resourceId
                FROM courseMatActualPlanRelation cr
                INNER JOIN course_materials cm ON cm.id = cr.cousreMatId
                WHERE cr.actualId = $actualId";
        try {
            $courseMaterialDetails = $this->executeQueryForList($sql);
            foreach ($courseMaterialDetails as $materialDetail) {
                $request = new GetPreSignedUrlRequest();
                $request->resourceId = $materialDetail->resourceId;
                $request->secretKey = getenv("AWS_CLIENT_SECRET_KEY");
                $request->accessKey = getenv("AWS_ACCESS_KEY");
                $url = ResourceService::getInstance()->getPreSignedUrlByResourceId($request);
                $materialDetail->url = $url->url;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $courseMaterialDetails;
    }
    /**
     * @param AddNewActualPlanMaterialRequest $request
     * @return Object|integer
     * @throws ProfessionalException
     */
    public function addNewActualPlanVideoMaterial(AddNewActualPlanMaterialRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->materialId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_BATCH_VIDEO_REPOSITORY_ID, "Invalid video repository details given");
        }
        if (empty($request->actualPlanId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_ACTUAL_PLAN_ID, "Invalid actual plan details given");
        }
        $sql = "INSERT INTO subject_actual_plan_video_materials (subject_actual_plan_id, video_repository_id,
                created_by, created_date, updated_by, updated_date)
                VALUES ($request->actualPlanId,'$request->materialId',$request->createdBy,UTC_TIMESTAMP(),
                        $request->updatedBy,UTC_TIMESTAMP())";
        try {
            return $this->executeQueryForObject($sql, true);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param AddNewProposedPlanMaterialRequest $request
     * @return Object|integer
     * @throws ProfessionalException
     */
    public function addNewProposedPlanVideoMaterial(AddNewProposedPlanMaterialRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->materialId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_BATCH_VIDEO_REPOSITORY_ID, "Invalid video repository details given");
        }
        if (empty($request->proposedPlanId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PROPOSED_PLAN_ID, "Invalid proposed plan details given");
        }
        $sql = "INSERT INTO subject_proposed_plan_video_materials (subject_proposed_plan_id, video_repository_id,
                created_by, created_date, updated_by, updated_date)
                VALUES ($request->proposedPlanId,'$request->materialId',$request->createdBy,UTC_TIMESTAMP(),
                        $request->updatedBy,UTC_TIMESTAMP())";
        try {
            return $this->executeQueryForObject($sql, true);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $actualPlanId
     * @return Object|array
     * @throws ProfessionalException
     */
    public function getActualPlanVideoMaterials($actualPlanId)
    {
        $actualPlanId = (int)$this->realEscapeString($actualPlanId);
        if (empty($actualPlanId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_ACTUAL_PLAN_ID, "Invalid actual plan details given");
        }
        $sql = "SELECT cvm.id,cvm.title as name,lr.path as url,cvm.description
                FROM subject_actual_plan_video_materials sapvm
                INNER JOIN course_video_materials cvm on sapvm.video_repository_id = cvm.id
                INNER JOIN lin_resource lr ON lr.id = cvm.resource_id
                WHERE subject_actual_plan_id = $actualPlanId";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $proposedPlanId
     * @return Object|arra
     * @throws ProfessionalException
     */
    public function getProposedPlanVideoMaterials($proposedPlanId)
    {
        $proposedPlanId = (int)$this->realEscapeString($proposedPlanId);
        if (empty($proposedPlanId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PROPOSED_PLAN_ID, "Invalid proposed plan details given");
        }
        $sql = "SELECT cvm.id,cvm.title as name,lr.path as url,cvm.description
                FROM subject_proposed_plan_video_materials sapvm
                INNER JOIN course_video_materials cvm on sapvm.video_repository_id = cvm.id
                INNER JOIN lin_resource lr ON lr.id = cvm.resource_id
                WHERE subject_proposed_plan_id = $proposedPlanId";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param DeleteActualPlanRequest $request
     * @throws ProfessionalException
     */
    public function deleteActualPlan(DeleteActualPlanRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->actualPlanId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_ACTUAL_PLAN_ID, "Invalid actual plan details given");
        }
        try {
            if ($request->isDeleteCourseMaterials) {
                $courseMaterials = $this->getAllActualPlanCourseMaterialIds($request->actualPlanId);
                foreach ($courseMaterials as $material) {
                    $deleteRequest = new DeleteCourseMaterialRequest();
                    $deleteRequest->documentId = $material->id;
                    $deleteRequest->staffId = $request->staffId;
                    CourseMaterialService::getInstance()->deleteCourseMaterial($deleteRequest);
                }
                $videoMaterials = $this->getAllActualPlanVideoMaterials($request->actualPlanId);
                foreach ($videoMaterials as $material) {
                    VideoRepositoryService::getInstance()->deleteVideoMaterial($material->id);
                }
            } else {
                $this->deleteAllActualPlanCourseMaterialsRelation($request->actualPlanId);
                $this->deleteAllActualPlanVideoMaterialsRelation($request->actualPlanId);
            }
            $sql = "DELETE FROM subjectplan WHERE topicID = $request->actualPlanId";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Deleting actual plan course material relation
     *
     * @param $actualPlanId
     * @throws ProfessionalException
     */
    private function deleteAllActualPlanCourseMaterialsRelation($actualPlanId)
    {
        $sql = "DELETE FROM courseMatActualPlanRelation WHERE actualId = $actualPlanId";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Deleting actual plan video material relation
     *
     * @param $actualPlanId
     * @throws ProfessionalException
     */
    private function deleteAllActualPlanVideoMaterialsRelation($actualPlanId)
    {
        $sql = "DELETE FROM subject_actual_plan_video_materials WHERE subject_actual_plan_id = $actualPlanId";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $actualPlanId
     * @return Object
     * @throws ProfessionalException
     */
    private function getAllActualPlanVideoMaterials($actualPlanId)
    {
        $sql = "SELECT video_repository_id as id
                FROM subject_actual_plan_video_materials
                WHERE subject_actual_plan_id  =$actualPlanId";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param DeleteProposedPlanRequest $request
     * @throws ProfessionalException
     */
    public function deleteProposedPlan(DeleteProposedPlanRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->proposedPlanId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PROPOSED_PLAN_ID, "Invalid proposed plan details given");
        }
        try {
            if ($request->isDeleteCourseMaterials) {
                $courseMaterials = $this->getAllProposedPlanCourseMaterialIds($request->proposedPlanId);
                foreach ($courseMaterials as $material) {
                    $deleteRequest = new DeleteCourseMaterialRequest();
                    $deleteRequest->documentId = $material->id;
                    $deleteRequest->staffId = $request->staffId;
                    CourseMaterialService::getInstance()->deleteCourseMaterial($deleteRequest);
                }
                $videoMaterials = $this->getAllProposedPlanVideoMaterials($request->proposedPlanId);
                foreach ($videoMaterials as $material) {
                    VideoRepositoryService::getInstance()->deleteVideoMaterial($material->id);
                }
            } else {
                $this->deleteAllProposedPlanCourseMaterialsRelation($request->proposedPlanId);
                $this->deleteAllProposedPlanVideoMaterialsRelation($request->proposedPlanId);
            }
            $this->removeProposedPlanFromActualPlan($request->proposedPlanId);
            $sql = "DELETE FROM subjectplan_proposed WHERE topicID = $request->proposedPlanId";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Deleting all proposed plan course materials relation
     *
     * @param $proposedPlanId
     * @throws ProfessionalException
     */
    private function deleteAllProposedPlanCourseMaterialsRelation($proposedPlanId)
    {
        $sql = "DELETE FROM courseMatProposedPlanRelation WHERE proposedId = $proposedPlanId";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Deleting proposed plan video material relation
     *
     * @param $proposedPlanId
     * @throws ProfessionalException
     */
    private function deleteAllProposedPlanVideoMaterialsRelation($proposedPlanId)
    {
        $sql = "DELETE FROM ps_proposed_plan_video_materials WHERE ps_proposed_plan_id = $proposedPlanId";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $proposedPlanId
     * @throws ProfessionalException
     */
    private function removeProposedPlanFromActualPlan($proposedPlanId)
    {
        $sql = "UPDATE subjectplan SET proposed_topicID = NULL
                WHERE proposed_topicID=$proposedPlanId";
        try {
            $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $proposedPlanId
     * @return Object
     * @throws ProfessionalException
     */
    public function getAllProposedPlanVideoMaterials($proposedPlanId)
    {
        $proposedPlanId = (int)$this->realEscapeString($proposedPlanId);
        if (empty($proposedPlanId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PROPOSED_PLAN_ID, "Invalid proposed plan details given");
        }
        $sql = "SELECT video_repository_id as id
                FROM subject_proposed_plan_video_materials
                WHERE subject_proposed_plan_id  =$proposedPlanId";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $proposedPlanId
     * @return Object
     * @throws ProfessionalException
     */
    public function getAllProposedPlanCourseMaterialIds($proposedPlanId)
    {
        $proposedPlanId = (int)$this->realEscapeString($proposedPlanId);
        if (empty($proposedPlanId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PROPOSED_PLAN_ID, "Invalid proposed plan details given");
        }
        $sql = "SELECT cousreMatId as id FROM courseMatProposedPlanRelation
                WHERE proposedId =$proposedPlanId";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $actualPlanId
     * @return Object
     * @throws ProfessionalException
     */
    private function getAllActualPlanCourseMaterialIds($actualPlanId)
    {
        $sql = "SELECT cousreMatId as id FROM courseMatActualPlanRelation
                WHERE actualId =$actualPlanId";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getSubjectProposedPlanByRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = $request->topicId ? " and topicID = " . (int)$request->topicId . " " : "";
        $condition .= $request->topicIds ? " and topicID in (" . $request->topicIds . ") " : "";
        if ($request->isPseudosubject) {
            $condition .= $request->pseudosubjectId ? " and pssId = $request->pseudosubjectId " : "";
            $sql = "select topicID, date, pssId, topicName, topicDesc, isCovered, isImportant, hour, module, pedagogy, mode, day, session, approve,null as timeInMinutes,null as percentageCovered,oe_exam_id as onlineExamId from subjectplan_ps_proposed where 1=1 $condition;";
        } else {
            $condition .= $request->sbsId ? " and sbs.sbsID = $request->sbsId " : "";
            $condition .= $request->subjectId ? " and sbs.subjectID = '$request->subjectId" : "";
            $condition .= $request->batchId ? " and sbs.batchID = '$request->batchId" : "";
            $condition .= $request->semId ? " and sbs.semID = '$request->semId" : "";
            $condition .= $request->staffId ? " and sbs.staffId = $request->staffId " : "";
            $sql = "select sp.topicID, sp.date, sp.sbsID, sp.topicName, sp.topicDesc, sp.isCovered, sp.isImportant, sp.hour, sp.module, sp.pedagogy, sp.subbatchID, sp.mode, sp.day, sp.timeInMinutes, sp.percentageCovered, sp.session, sp.approve, sp.timeInMinutes, sp.percentageCovered,oe_exam_id as onlineExamId,sp.content from subjectplan_proposed sp
            inner join sbs_relation sbs on sbs.sbsID = sp.sbsID
            where 1=1 $condition;";
        }
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getSubjectPlansByRequest($request)
    {
        $where = [];
        if ($request->fromDate && $request->toDate) {
            $fromDate = date("Y-m-d", strtotime($request->fromDate));
            $toDate = date("Y-m-d", strtotime($request->toDate));
            $where[] = "((spp.date between unix_timestamp('$fromDate') and unix_timestamp('$toDate') ) OR (spp.date = 0))";
        } else if ($request->toDate) {
            $toDate = date("Y-m-d", strtotime($request->toDate));
            $where[] = "((spp.date <= unix_timestamp('$toDate') ) OR (spp.date = 0))";
        } else if ($request->fromDate) {
            $fromDate = date("Y-m-d", strtotime($request->fromDate));
            $where[] = "((spp.date >= unix_timestamp('$fromDate') ) OR (spp.date = 0))";
        }else if ($request->date) {
            $date = date("Y-m-d", strtotime($request->date));
            $where[] = "((spp.date = unix_timestamp('$date') ) OR (spp.date = 0))";
        }
        $request->sbsId?$where[] = " sbs.sbsID = $request->sbsId " :"";
        $request->staffId?$where[] = " sbs.staffId = $request->staffId " :"";
        $request->hourId?$where[] = " sp.hour = $request->hourId " :"";
        $request->batchId?$where[] = " sbs.batchID = $request->batchId " :"";
        $request->semId?$where[] = " sbs.semID = $request->semId " :"";
        $sql = "SELECT FROM_UNIXTIME(spp.date, '%Y-%m-%d') as sspDate,FROM_UNIXTIME(sp.date, '%Y-%m-%d') as spDate,spp.topicID as proposedPlanTopicID,spp.topicName as proposedPlanTopicName,spp.session,
        case
            when spp.subbatchID = 0 then 'ALL'
            when spp.subbatchID <> 0 then su.subbatchName
        END as subBatch,
        spp.isImportant,spp.hour as proposedPlanHour,spp.module as proposedPlanModule,spp.approve, spp.content, sp.topicID, sp.topicName, sp.topicDesc, sp.isImportant, sp.isCovered, sp.hour, sp.module, d.deptName, sbs.sbsID, st.staffID, st.staffName, sub.subjectID, sub.subjectName, bat.batchID, bat.batchName, sem.semName,spp.verify,spp.oe_exam_id as onlineExamId,spp.mode as proposedPlanMode,spp.pedagogy as proposedPlanPedagogy
        FROM sbs_relation sbs
        INNER JOIN subjectplan_proposed spp ON spp.sbsID = sbs.sbsID
        INNER JOIN staffaccounts st ON st.staffID = sbs.staffID
        INNER JOIN subjects sub ON sub.subjectID = sbs.subjectID
        INNER JOIN batches bat ON bat.batchID = sbs.batchID AND bat.semID = sbs.semID
        INNER JOIN semesters sem ON sem.semID = bat.semID
        INNER JOIN department d ON d.deptID = bat.deptID
        LEFT JOIN subbatches su on su.subbatchID = spp.subbatchID and sbs.batchID = su.batchID
        LEFT JOIN subjectplan sp ON sbs.sbsID = sp.sbsID AND spp.topicID = sp.proposed_topicID
        ".($where?" WHERE ".implode(' AND ',$where):"")."
        ORDER BY sbs.sbsID;";
        try {
            $result = $this->executeQueryForList($sql);
            return CommonService::getInstance()->htmlEntityDecodeArrayOfObjects($result);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * method to get subject plan duration by sbsId and dates
     * @param Int sbsID, fromdate.todate
     * @return Array
     * @throws ProfessionalException
     */
    public function getSubjectPlanDurationBySbsIdAndDate($sbsID, $fromDate, $toDate){
        $sql = "SELECT
                    sp.topicName,
                    bt.stratTime,
                    bt.endTime,
                    STR_TO_DATE(bt.stratTime, '%l:%i %p') as stratTime,
                    STR_TO_DATE(bt.endTime, '%l:%i %p') as endTime,
                    TIMEDIFF(cast(STR_TO_DATE(bt.endTime, '%l:%i %p') as TIME),cast(STR_TO_DATE(bt.stratTime, '%l:%i %p') as TIME)) AS duration,
                    sp.hour,
                    FROM_UNIXTIME(sp.date, '%Y-%m-%d') AS subjectPlanDate,
                    FROM_UNIXTIME(sp.date, '%h:%i:%s') AS subjectPlanTime,
                    sp.topicDesc
                FROM
                    subjectplan sp
                        LEFT JOIN
                    batch_timetable bt ON sp.sbsID = bt.sbsID
                        AND sp.hour = bt.hourID
                        AND FROM_UNIXTIME(sp.date, '%Y-%m-%d') = bt.timetableDate
                WHERE
                    sp.sbsID = '$sbsID'
                AND bt.timetableDate BETWEEN '$fromDate' AND '$toDate'";
        try{
            return $this->executeQueryForList($sql);
        }
        catch(\Exception $e){
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $proposedPlanId
     * @return Object
     * @throws ProfessionalException
     */
    public function updateOnlineExamMappingProposedPlan($proposedPlanId,$onlineExamId)
    {
        $sql = "UPDATE `subjectplan_proposed`
                SET `oe_exam_id`= '$onlineExamId'
                WHERE `topicID`='$proposedPlanId";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $proposedPlanId
     * @return Object
     * @throws ProfessionalException
     */
    public function updateOnlineExamMappingProposedPlanPs($proposedPlanId,$onlineExamId)
    {
        $sql = "UPDATE `subjectplan_ps_proposed`
                SET `oe_exam_id`= '$onlineExamId'
                WHERE `topicID`='$proposedPlanId";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getOnlineExamMappingProposedPlan($proposedPlanId)
    {
        $sql = "SELECT oe.id , oe.name
                from  subjectplan_proposed sp
                    inner join oe_exams oe on oe.id = sp.oe_exam_id
                    where sp.topicID = $proposedPlanId ";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getOnlineExamMappingProposedPlanPs($proposedPlanId)
    {
        $sql = "SELECT oe.id , oe.name
                from  subjectplan_ps_proposed sp
                    inner join oe_exams oe on oe.id = sp.oe_exam_id
                    where sp.topicID = $proposedPlanId ";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getSubjectPlanDetails($request)
    {
        $cond = "";
        if($request->subjectType == "pseudoSubjects"){
            if($request->sbsId){
                $cond .=" AND sr.sbsID = $request->sbsId ";
            }
            if($request->mode){
                $cond .=" AND sp.mode = '$request->mode";
            }
            if($request->pseudoSubjectId){
                $cond .=" AND  sp.pssId = '$request->pseudoSubjectId";
            }
            if($request->staffId){
                $cond .=" AND sa.staffID = '$request->staffId";
            }
            $sql = "SELECT sr.sbsID,sp.topicID AS proposedPlanId,subp.topicID AS actualPlanId,FROM_UNIXTIME(sp.date, '%Y-%m-%d') AS subjectPlanDate, sp.hour, sp.module, sp.topicName, null as subjectType,sp.mode as mode_of_instruction,
            CASE
                WHEN subp.isCovered = '0' THEN 'Not covered'
                WHEN subp.isCovered = '1' THEN 'Partially covered'
                WHEN subp.isCovered = '2' THEN 'Fully covered'
                else null
            END AS covered,sa.staffName,sp.session,
            (select group_concat(sa.rollNo)
                    from studentaccount sa left join  attendance at on sa.studentID = at.studentID
                    inner join sbs_relation Sbs on Sbs.sbsID = at.sbsID
                    inner join staffaccounts Sa on Sa.staffID = Sbs.staffID
                    where
                        at.attendanceDate = subjectPlanDate and at.isAbsent = 1
                        and at.hour = (CASE
                                            WHEN sp.hour IS NOT NULL THEN sp.hour
                                            else sp.session
                                        END
                        )
                        and Sa.staffID = $request->staffId
                    ) as absentees
            FROM subjectplan_ps_proposed sp
            LEFT JOIN ps_subjectplan subp ON sp.topicID=subp.proposed_topicID
            inner join pseudosubjects_sbs psbs on psbs.pseudosubjectID = sp.pssId
            INNER JOIN sbs_relation sr ON sr.sbsID = psbs.sbsID
            INNER JOIN staffaccounts sa on sa.staffID = sr.staffID
            WHERE 1=1  $cond";
        }
        else{
            if($request->sbsId){
                $cond .=" AND sr.sbsID = $request->sbsId ";
            }
            if($request->mode){
                $cond .=" AND sp.mode = '$request->mode";
            }
            $sql = "SELECT sp.sbsID,sp.topicID AS proposedPlanId,subp.topicID AS actualPlanId,FROM_UNIXTIME(sp.date, '%Y-%m-%d') AS subjectPlanDate, sp.hour, sp.module, sp.topicName, null as subjectType,sp.mode as mode_of_instruction,sp.content as content,
                    CASE
                        WHEN subp.isCovered = '0' THEN 'Not covered'
                        WHEN subp.isCovered = '1' THEN 'Partially covered'
                        WHEN subp.isCovered = '2' THEN 'Fully covered'
                        else null
                    END AS covered, sa.staffName,
                    (select group_concat(sa.rollNo)
                    from studentaccount sa left join  attendance at on sa.studentID = at.studentID
                    where
                        at.attendanceDate = subjectPlanDate and at.isAbsent = 1
                        and at.hour = sp.hour and at.sbsID = sp.sbsID
                    ) as absentees
                    FROM subjectplan_proposed sp
                    INNER JOIN subjectplan subp ON sp.topicID = subp.proposed_topicID
                    INNER JOIN sbs_relation sr ON sr.sbsID = subp.sbsID
                    INNER JOIN staffaccounts sa on sa.staffID = sr.staffID
                    WHERE 1=1 $cond";
        }
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getSubjectActualPlanReportMoreDetails($request){
        $sql= "SELECT sp.date,
                     sp.hour,
                     sp.module,
                     sp.topicName,
                     sp.isCovered,
                     sp.mode,
                     sp.day,
                     sp.session,
                     sppr.pedagogy,
                    sp.modeOfeLearning,
                     GROUP_CONCAT(distinct lr.path) as url,
                     GROUP_CONCAT(distinct plr.path) as proposedUrl 
                     from subjectplan sp 
                     INNER JOIN sbs_relation  sr on sp.sbsID = sr.sbsID 
                     LEFT JOIN subjectplan_proposed sppr ON sppr.topicID = sp.topicID  
                     LEFT  JOIN subject_actual_plan_video_materials sapvm  on sp.topicID = sapvm.subject_actual_plan_id 
                     LEFT JOIN course_video_materials cvm on sapvm.video_repository_id = cvm.id 
                     LEFT JOIN lin_resource lr ON lr.id = cvm.resource_id 
                     LEFT JOIN subjectplan_proposed spp ON spp.topicID=sp.proposed_topicID 
                     LEFT JOIN subject_proposed_plan_video_materials spvm ON spp.topicID=spvm.subject_proposed_plan_id 
                     LEFT JOIN course_video_materials pcvm on spvm.video_repository_id = pcvm.id 
                     LEFT JOIN lin_resource plr ON plr.id = pcvm.resource_id 
        where sr.staffID = $request->staffId and sr.subjectID = $request->subjectId and sr.batchID = $request->batchId" ;
        if($request->subBatchId)
        {
            $sql .= " AND sp.subbatchID = $request->subBatchId ";
        }
        if($request->dateSortBy)
        {
            $sql .= " group by sp.topicID ORDER BY sp.date $request->dateSortBy , sp.hour, sp.session";
        }
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get proposed subject plan of all subjects of same staffs from community by sbsId 
     * @param Integer $sbsId
     * @return Object $subjectplan_proposed
     * @author Ajay C
     */
    public function getProposedSubjectPlanFromCommunityByDiferentSubject($sbsId)
    {
        $sbsId = (int)$this->realEscapeString($sbsId);
        $subjectplan_community = null;
        try {
            $sql = "SELECT sa.staffName,
                                b.batchName,
                                 count(spp.topicID) AS proposedplans,
                                  sbs.sbsID 
                            FROM staffaccounts sa 
                            INNER JOIN sbs_relation sbs ON (sa.staffID = sbs.staffID) 
                            INNER JOIN batches b ON (b.batchID = sbs.batchID) 
                            INNER JOIN subjectplan_proposed_community spc ON (spc.sbs_id = sbs.sbsID) 
                            LEFT JOIN subjectplan_proposed spp ON (spp.sbsID = sbs.sbsID) 
                            WHERE sbs.subjectID IN (SELECT subjectID  from sbs_relation sr where staffID in(SELECT staffID  FROM sbs_relation WHERE sbsID = '$sbsId') and semID in (SELECT semID   FROM sbs_relation WHERE sbsID = '$sbsId')) 
                            AND (spc.is_shared = 1 OR spc.is_other = 1)
                            AND sbs.subjectID NOT IN (SELECT subjectID  FROM sbs_relation WHERE sbsID = '$sbsId') 
                            GROUP BY spp.sbsID;";
            $subjectplan_community = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectplan_community;
    }
}