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 / 189
CRAP
0.00% covered (danger)
0.00%
0 / 4145
SubjectService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 189
440232.00
0.00% covered (danger)
0.00%
0 / 4145
 __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
 getSubject
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 searchSubjects
0.00% covered (danger)
0.00%
0 / 1
156.00
0.00% covered (danger)
0.00%
0 / 80
 getCountOfStudentsEnrolledToASubject
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 9
 getSubjectStaffDetailsBySubject
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getSemSubjects
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getSemElectiveSubjects
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getTutorSubjectIdIfExists
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 11
 createTutorSubject
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 getSubjectDetailsBySbsId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 30
 getSbsDetailsByBatch
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 getSbsDetailsByStaffId
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 22
 isSubjectAssignedToBatch
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 13
 deleteSubjectById
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 getPseudoSubjectDetailsById
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getPseudoSubjectBatchDetailsById
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getPseudoSubjectSbsIdsByStaffId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getPseudoSubjectSbsIdsById
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 getSubjectsByHandlingDepartmentId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 getSubjectsFromDepartments
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 isPseudoSubjectBySbsId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 14
 getPseudoSubjectBySbsId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getPseudoSubjectStudentById
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getNumberOfStudentsInAPseudoSubjectByPseudoSubjectId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 getSbsIdsBySubjectId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 checkSubjectCategory
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getSBSIdBySubjectIdAndStaffIdAndSemId
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 31
 getAllSubjectCategories
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getCategoryCodes
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 saveCategoryCode
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 17
 deleteCategoryCode
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 listPaperTypes
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 savePaperType
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 deletePaperType
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getCourseTypes
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getSubjectDetailsOfAbsentees
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 27
 updateFinalizePsuedoSubject
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getSubjectCategoryByName
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getAllSecondLanguages
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getSubjectsByStudent
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 26
 getSbsDetailsBysubjectId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getSubjectByCourseTypeSemCategory
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 18
 getSubjectsHavingGradeScheme
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 17
 getSubjectsByStaffAndBatch
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 25
 getSubjectsByBatchId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getSubjectDetailsByDate
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 18
 removeOrUpdateDuplicateSubjects
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 40
 getRepeatingSubjectsBySubjectCode
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 findValidSubjectFromRepeatingSubjects
0.00% covered (danger)
0.00%
0 / 1
156.00
0.00% covered (danger)
0.00%
0 / 39
 updateCorrectSubjectIdToAllRefTables
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 24
 checkSubjectAlreadyMappedThenDeleteFromExamSubjectCredit
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 checkSubjectAlreadyMappedThenDeleteFromSBSRelation
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 checkSubjectAlreadyMappedThenDeleteFromInternalMarks
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 checkSubjectAlreadyMappedThenDeleteFromInternalMarksSettings
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 checkSubjectAlreadyMappedThenDeleteFromExamSubjectRegistration
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 14
 insertIfNotExistSemesterSubjectRelation
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 17
 insertIfNotExistDepartmentSubjectRelation
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 17
 deleteSubject
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 findCountOfSubjectReferences
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 33
 getSubjectsBySubBatch
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 26
 getAllSubjectsByCourseTypeId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 searchSubjectByString
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getSubjectsByCategoryBatchSem
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 getSecondlanguageDetailsByID
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getSupplementeryExamSubjectBySubjectIDStudentIDandCourseType
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 23
 getStudentSubjectIDBySubjectGroupID
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 30
 getSubjectBySbsId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getSubjectsByRequest
0.00% covered (danger)
0.00%
0 / 1
420.00
0.00% covered (danger)
0.00%
0 / 62
 searchSubjectCategories
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 29
 searchSubjectsWithSubjectCategories
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 29
 getAllSubjectHandlingDepartments
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 16
 getAllHandlingDepartmentSubjectsOfExamRegistration
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 51
 getPaperTypeByName
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getSecondLanguageByName
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 insertSubjectFromExcel
0.00% covered (danger)
0.00%
0 / 1
1056.00
0.00% covered (danger)
0.00%
0 / 140
 getSubjectByCodeAndYear
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 16
 getAllSubjectsByDepartmentAndSemester
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 20
 getAllSyllabusYearsByDepartmentIds
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 13
 getAllSubjectGroups
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 getSubjectGroupSubjectsByBatchSem
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 27
 getSubjectsBySem
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 getBasicSubjectDetailsBySubjectId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 getAllCourseMaterials
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 18
 copyCourseMaterials
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 17
 getSubjectToAssignCredits
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 42
 saveSubjectsCredit
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 40
 getSubjectGroupSubjectType
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 29
 getSubjectNames
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 getStudentGroupedSubjects
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 getStudentGroupedSubjectsSyllabusName
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 20
 getGroupedSubjectDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 getSubjectByCode
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 20
 getSubjectsBySemInOrder
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 20
 getPseudoSubjectIds
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 24
 getSupplySubjectsBySupplyExamRegId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 25
 getSubjectCategoriesBySubject
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 24
 getSubjectListByBatchIdAndSemId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 21
 getSubjectInternalExternalStatus
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 getBatchSubjectCategoryDetails
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 38
 getSbsDetailsByBatchId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 addBatchSemSubjectCategoryRelation
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 23
 getSubjectByBatchIDAndSubjectCode
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getDistinctSubjectCategory
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getSubjectCategoryBySubject
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 15
 getMarklistSubjectGroup
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 38
 getBatchSemGroupedSubjectDetails
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 40
 getSubjectListBySbs
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 17
 getSecondLanguageBySubjectId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 21
 copyBatchSemSubjectCategoryRelation
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 32
 getSubjectsByBatchAndSem
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 30
 mapSemesterSubjectsToImportMarks
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 32
 getSbsDetailsBysubjectBatchAndSem
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 getConcatenatedSubjectNameBySubjectIds
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 7
 getSecondLanguageDetailsBySubjectId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 25
 getSecondLanguagesBySubjectIds
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 25
 getSubjectDetailsBySubjectIds
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 19
 getStudentSecLangExamSubjectByRequest
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 25
 getAllSubjectsByRequest
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 33
 getSyllabusYearOfSbsSubjects
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 16
 getSubjectDetailsByDeptIdSemIdCourseTypeId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 17
 getSbsSubjectSyllabusYearByDeptIdSemIdCourseTypeId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getSubjectToAssignInternalMarkSettings
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 39
 saveInternalMarkSettings
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 getAllSubjectsByBatchIdAndSemId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 22
 getOpenCourseSubjectsByRequest
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 15
 getOpenCourseSubjectsBatchesDetailsByRequest
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 19
 getOpenCourseSubjectsStudentsMarksDetailsByRequest
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 20
 getNormalisedMarks
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 17
 getNormalisedMarksOfPseudoSubject
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 getSubjectPaperTypeDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getExamSubjectsByExamRegistrationRequest
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 51
 getSubjectsByStaffBatchSem
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 29
 getSubjectsByStaffIdAndBatchId
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 31
 subjectCreditDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getSubjectByCourseTypeSemIdAndBatchStartYear
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 14
 getRegularExamSubjectsByStudentIdAndRegId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 35
 getRegularExamSubjectsByStudentIdAndExamRegId
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 56
 getExamSubjectsByExamRegistrationAndDepartment
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 33
 getSubjectCreditDetailsByRequest
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 23
 getSubjectsPatternIdAndYear
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 27
 getDepartmentWiseubjectDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 29
 getStudentSecLangAndElective
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 37
 getAllSubjectsByHandlingDepartmentId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 19
 getSubjectCategoryBySubjectId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 getSubjectInstitutionalAverage
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 19
 saveSubjectInstitutionalAverage
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 17
 getHallTicketSubjectCategory
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 19
 saveHallTicketSubjectCategory
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 31
 assignSelectedSubjectGroups
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 16
 deleteSelectedAssignSubjectGroups
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 12
 getStudentAppliedSubjectDetails
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 59
 getAllExamSubjectByRequest
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 19
 getCommonSubjectsWithBatches
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 21
 getAllSubjectByRequest
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 13
 getAllSubjectCategoryUsedInABatch
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 getCategorySubjectByRequest
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 15
 getInternalSubjectsBySemInOrder
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 33
 getDistinctExamRegistrationSubjectsByCourse
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getSubjectByExamDateBatchRequest
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 getDeptWiseSubjectDetails
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 28
 getSubjectByBatchIDSubjectCodeRequest
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 15
 getSubjectMaxMarkBatchExamMarkDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 25
 getSubjectsByExamRegistration
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 23
 getSubjectByStaffRequest
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 49
 getGroupSubjectsByBatchSubject
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 22
 getSubjectsOfSemester
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 17
 getSyllabusUploadedDetailsBySubjectRequest
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 65
 saveQuestionBackSyllabysSettings
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 17
 saveQuestionBackSyllabusResourceId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getSubjectsAssignedWithSecondLanguageAndCbeRequestStatus
0.00% covered (danger)
0.00%
0 / 1
240.00
0.00% covered (danger)
0.00%
0 / 151
 getSubjectByName
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getSbsRelationBySubjectName
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getSubjectCategories
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 7
 getAllSubjectsWithSyllabusCodeByDepartmentAndSemester
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 20
 getAllSubjectWithSyllabusCodeByRequest
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 18
 searchSubjectByStringWithSyllabusCode
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 getSubjectDetailsBySbsIdWithEvaluations
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 33
 getStudentExamSubjectsForRegistration
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 65
 getAllSecApplications
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 23
 createSecApplication
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 26
 updateSecApplication
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 26
 replaceSubjectsByBatchSemSubject
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 88
 getQuestionBackSyllabusResourceId
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 12
 getSubjectEcGroupSubjectsByBatchSem
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 33
 getStudentMinorHonoursPseudoSubjectBasketName
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 25
 getSubjectDetailsByClusterID
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 7
 getAllSubjectCategoriesv4
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
<?php
namespace com\linways\core\ams\professional\service;
use TheSeer\Tokenizer\Exception;
use Elasticsearch\Endpoints\Indices\Alias\Delete;
use com\linways\core\ams\professional\dto\Subject;
use com\linways\core\ams\professional\util\CommonUtil;
use com\linways\core\ams\professional\constant\ExamType;
use com\linways\core\ams\professional\constant\PaperTypes;
use com\linways\core\ams\professional\dto\SettingsConstents;
use com\linways\core\ams\professional\service\CommonService;
use com\linways\core\ams\professional\service\StudentService;
use com\linways\core\ams\professional\constant\SubjectConstants;
use com\linways\core\ams\professional\mapper\SubjectServiceMapper;
use com\linways\core\ams\professional\request\SearchSubjectRequest;
use com\linways\core\ams\professional\response\SearchSubjectResponse;
use com\linways\core\ams\professional\exception\ProfessionalException;
use com\linways\core\ams\professional\request\GetPseudoSubjectIdRequest;
use com\linways\core\ams\professional\request\GetSubjectCategoriesRequest;
use com\linways\core\ams\professional\constant\examcontroller\CourseTypeConstants;
use com\linways\core\ams\professional\request\GetSubjectsThatNotAssignedToFacultyRequest;
use com\linways\core\ams\professional\request\SearchSubjectsWithSubjectCategoriesRequest;
use com\linways\core\ams\professional\response\GetCountOfStudentsEnrolledInSubjectResponse;
use com\linways\core\ams\professional\service\BatchService;
use DateTime;
use stdClass;
class SubjectService extends BaseService
{
    /**
     * @var null
     */
    private static $_instance = null;
    /**
     * @var array
     */
    private $mapper = [];
    /**
     * Subject table referring tables
     * @var array
     */
    private $refSubjectsTablesWithSubjectIDColumn = [
        'aprove_normalise_mark',
        'batchMasterTimetableHour',
        'batch_assignment',
        'batch_timetable',
        'batch_timetable_coursefile',
        'batchwise_assignment_rules',
        'bulk_add_feedback_about_student',
        'committee',
        'course',
        'course_materials',
        'course_objective',
        'course_objective_question_paper',
        'dynamicfeedback_student_courseselect',
        'ebook_info',
        'exam',
        'examEnrollmentFees',
        'exam_cancelled',
        'exam_controller_qp_staff',
        'exam_reg_studentsubject',
        'exam_registration_subject_fees',
        'exam_subjectcredit',
        'gracemarks_student_marks',
        'gracemarks_student_marks_temp',
        'internal_assessment',
        'internal_assessment_column_status',
        'internal_assessment_student_column_mark',
        'internal_marks',
        'internal_marks_edit_submitted',
        'internal_marks_settings',
        'internal_marks_submitted',
        'labExperiment',
        'labStudentTemplateColumnMark',
        'lab_experiments',
        'messageRecipeints',
        'message_batch',
        'nba_aggr_formula',
        'nba_course_outcome',
        'assessment_structure',
        'assessment_questions',
        'nba_map_extra_activities_to_course_outcome',
        'nba_sub_aggr_formula',
        'nba_subject_tree_mapping',
        'normalise_marks',
        'question_paper_assignments',
        'question_paper_bank',
        'question_paper_module_weightages',
        'question_paper_pool',
        'question_paper_sections',
        'quiz',
        'quiz_subject_questions',
        'quiz_type',
        'sbs_relation',
        'sessional_marks_settings',
        'student_marks',
        'universityExams',
        'universityMarks',
        'university_examcredits',
        'university_studentgrade',
        'exam_examReg_subject_answerSheet_group',
        'exam_examReg_subject_answerSheet_group_config',
        'exam_examReg_subject_valuation_staff'
    ];
    /**
     * Subject table referring tables
     * @var array
     */
    private $refSubjectsTablesWithSubject_IDColumn = [
        'exam_subject_grading_scheme',
        'nba_co_attainment',
        'nba_co_attainment_rules',
        'nba_po_attainment_node_assessment',
        'nba_po_attainment_subject',
        'nba_rubrics_to_assessment_mapping',
        'nba_subject_assessment_co_value',
        'nba_subject_assessment_po_value',
        'nba_subject_node_co_value',
        'nba_subject_node_po_value',
        'nba_university_exam_co_mapping_rules',
        'normalization_rule3_subject'
    ];
    private $refSubjectsTableWithSubjects_IDColumn = [
        'subjectGroups_subjects'
    ];
    /**
     * Locked down the constructor
     * Prevent any outside instantiation of this class
     *
     * SubjectService constructor.
     */
    private function __construct()
    {
        $this->mapper = SubjectServiceMapper::getInstance()->getMapper();
    }
    /**
     * Prevent any object or instance of that class to be cloned
     * Prevent any copy of this object
     * @author jithinvijayan
     */
    private function __clone()
    {
    }
    /**
     * Have a single globally accessible static method
     *
     * @return SubjectService|null
     * @author jithinvijayan
     */
    public static function getInstance()
    {
        if (!is_object(self::$_instance))
            self::$_instance = new self();
        return self::$_instance;
    }
    /**
     * Get Subject Details
     * @param int $subjectId
     * @return object $subject
     * @throws ProfessionalException
     */
    public function getSubject($subjectId)
    {
        $subject = NULL;
        $subjectId = $this->realEscapeString($subjectId);
        $sql = "SELECT subjectID as id, subjectName as name, subjectDesc as description, syllabusName, subjectPriority as priority, hdl_deptID as hdlDeptId, paperTypeId, subjectcatID, isTheory, no_of_modules, syllabusYear, secondLangaugeId, courseTypeID, universityAllottedHours
                FROM subjects WHERE subjectID = " . $subjectId;
        try {
            $subject = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subject;
    }
    /**
     * Undocumented function
     *
     * @param SearchSubjectRequest $searchSubjectRequest
     * @return SearchSubjectResponse
     * @throws ProfessionalException
     */
    public function searchSubjects(SearchSubjectRequest $searchSubjectRequest)
    {
        $searchSubjectRequest = $this->realEscapeObject($searchSubjectRequest);
        $subjectDetails = new SearchSubjectResponse();
        $condition = "";
        if (empty($searchSubjectRequest)) {
            throw new ProfessionalException(ProfessionalException::INVALID_PARAMETER, 'Empty parameter given to function');
        }
        $sqlCount = 'SELECT
                        COUNT(sub.subjectID) AS totalRecord
                    FROM
                        subjects sub
                            INNER JOIN
                        sbs_relation sbs ON sbs.subjectID = sub.subjectID
                            INNER JOIN
                        sd_relation sd ON sd.subjectID = sub.subjectID
                            INNER JOIN
                        subject_sem_relation ssr ON ssr.subjectID = sub.subjectID
                            AND ssr.subjectID = sd.subjectID
                            INNER JOIN
                        department d ON d.deptID = sub.hdl_deptID
                            INNER JOIN
                        staffaccounts sta ON sta.staffID = sbs.staffID
                            INNER JOIN
                        batches bat ON bat.batchID = sbs.batchID
                    WHERE
                        sub.subjectID > 0';
        $sql = 'SELECT DISTINCT
                    sub.subjectID as subjectId, sub.subjectName, sub.subjectDesc, sub.syllabusName,sub.subjectcatID, sub.paperTypeId,sub.secondLangaugeId,GROUP_CONCAT( DISTINCT sta.staffName ) as staffNames,sub.subjectPriority
                FROM
                    subjects sub
                        INNER JOIN
                    sbs_relation sbs ON sbs.subjectID = sub.subjectID
                        INNER JOIN
                    sd_relation sd ON sd.subjectID = sub.subjectID
                        INNER JOIN
                    subject_sem_relation ssr ON ssr.subjectID = sub.subjectID
                        AND ssr.subjectID = sd.subjectID AND sbs.semID = ssr.semID
                        INNER JOIN
                    department d ON d.deptID = sub.hdl_deptID
                        INNER JOIN
                    staffaccounts sta ON sta.staffID = sbs.staffID
                        INNER JOIN
                    batches bat ON bat.batchID = sbs.batchID
                WHERE
                    sub.subjectID > 0';
        // if($searchSubjectRequest->name)
        // {
        //     $condition .=" AND sub.subjectName like '%$searchSubjectRequest->name%' ";
        // }
        // if($searchSubjectRequest->desc)
        // {
        //     $condition .=" AND sub.subjectDesc like '%$searchSubjectRequest->desc%' ";
        // }
        // if($searchSubjectRequest->type)
        // {
        //     $condition .=" AND sub.paperTypeId ='$searchSubjectRequest->type' ";
        // }
        // if($searchSubjectRequest->syllabusName)
        // {
        //     $condition .=" AND sub.syllabusName like '%$searchSubjectRequest->syllabusName%' ";
        // }
        if ($searchSubjectRequest->id) {
            $condition .= " AND sub.subjectID='$searchSubjectRequest->id";
        }
        if (!$searchSubjectRequest->showHiddenSubjects) {
            $condition .= " AND sub.hide = '0' ";
        }
        if ($searchSubjectRequest->subjectCategoryIdList) {
            $condition .= " AND sub.subjectcatID IN (" . (implode(',', $searchSubjectRequest->subjectCategoryIdList) ? implode(',', $searchSubjectRequest->subjectCategoryIdList) : $searchSubjectRequest->subjectCategoryIdList) . ") ";
        }
        if ($searchSubjectRequest->batchID) {
            $condition .= " AND sbs.batchID ='$searchSubjectRequest->batchID";
        }
        if ($searchSubjectRequest->semID) {
            $condition .= " AND ssr.semID ='$searchSubjectRequest->semID";
        }
        if ($searchSubjectRequest->excludePseudoSubjects) {
            $condition .= " AND sbs.isPseudosubject = 0 ";
        }
        // if($searchSubjectRequest->ids != NULL && count($searchSubjectRequest->ids >0))
        // {
        //     $condition .=" AND sub.subjectID IN (".implode(',', $searchSubjectRequest->ids).") ";
        // }
        // if($searchSubjectRequest->deptId)
        // {
        //     $condition .=" AND sd.deptID='$searchSubjectRequest->deptId' ";
        // }
        // if($searchSubjectRequest->category)
        // {
        //     $condition .=" AND sub.subjectcatID = '$searchSubjectRequest->category' ";
        // }
        // if($searchSubjectRequest->hdl_deptID)
        // {
        //     $condition .=" AND sub.hdl_deptID='$searchSubjectRequest->hdl_deptID' ";
        // }
        // if($searchSubjectRequest->syllabusYear)
        // {
        //     $condition .=" AND sub.syllabusYear='$searchSubjectRequest->syllabusYear' ";
        // }
        // if($searchSubjectRequest->courseTypeID)
        // {
        //     $condition .=" AND sub.courseTypeID ='$searchSubjectRequest->courseTypeID' ";
        // }
        $condition .= " GROUP BY sub.subjectID ";
        if ($searchSubjectRequest->sortBy) {
            $condition .= " order by $searchSubjectRequest->sortBy $searchSubjectRequest->sortOrder ";
        }
        $sqlCount .= $condition;
        $sql .= $condition;
        if (!$searchSubjectRequest->export) {
            $sql .= " LIMIT $searchSubjectRequest->startIndex,$searchSubjectRequest->endIndex";
        }
        try {
            $subjectDetails->totalRecords = $this->executeQueryForObject($sqlCount)->totalRecord;
            $subjectDetails->subjects = $this->executeQueryForList($sql, $this->mapper[SubjectServiceMapper::SEARCH_SUBJECTS]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * Gives the count of students learning a subject in a particular batch.
     *
     * @param GetCountOfStudentsEnrolledInSubjectRequest $request
     * @return void
     */
    public function getCountOfStudentsEnrolledToASubject($request)
    {
        $subjectDetails = $this->getSubject($request->subjectId);
        $subjectResponse = new GetCountOfStudentsEnrolledInSubjectResponse();
        $subjectResponse->subjectId = $subjectDetails->id;
        $subjectResponse->subjectName = $subjectDetails->name;
        $subjectResponse->subjectDescription = $subjectDetails->description;
        $subjectResponse->studentCount = count(StudentService::getInstance()->getAllStudentsByBatchIdSemIdSubjectId($request->batchId, $request->semId, $request->subjectId));
        return $subjectResponse;
    }
    /**
     * @param $subjectId
     * @param $batchId
     * @param $semId
     * @return Object
     * @throws ProfessionalException
     */
    public function getSubjectStaffDetailsBySubject($subjectId, $batchId, $semId)
    {
        $sql = "SELECT sa.staffCode, sa.staffName, sbs.sbsID, sub.subjectName, sub.subjectDesc ,sa.isResigned FROM staffaccounts sa,sbs_relation sbs,subjects sub WHERE sbs.subjectID=$subjectId AND sbs.batchID=$batchId AND sbs.semID=$semId AND sa.staffID=sbs.staffID and sbs.subjectID=sub.subjectID";
        try {
            $subjectDetails = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * Get subjects in a sem
     * @param int $batchId
     * @param int $semId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getSemSubjects($batchId, $semId)
    {
        $sql = "select  sr.subjectID, sub.subjectName,sub.subjectDesc,sub.subjectcatID,sub.secondLangaugeId from sbs_relation sr inner join subjects sub  on sub.subjectID = sr.subjectID where  sr.batchID = $batchId and sr.semID=$semId and sub.subjectName not in (\"" . Subject::TUTOR_SUBJECT . "\") group by sr.subjectID order by sr.subjectID";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * Get elective subjects in a sem
     * @param int $batchId
     * @param int $semId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getSemElectiveSubjects($batchId, $semId)
    {
        $sql = "select sp.paperTypeName,sa.staffName,sr.subjectID, sub.subjectName,sub.subjectDesc from sbs_relation sr inner join subjects sub  on sub.subjectID = sr.subjectID  INNER join staffaccounts sa on sa.staffID=sr.staffID INNER join subjectPaperType sp on sp.id=sub.paperTypeId where  sr.batchID = $batchId and sr.semID=$semId AND sp.paperTypeName=\"" . PaperTypes::ELECTIVE . "\" group by sr.subjectID order by sr.subjectID";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * To get the id of the subject TUTOR
     * @return boolean
     * @throws ProfessionalException
     */
    public function getTutorSubjectIdIfExists()
    {
        $sql = " select subjectID from subjects where deptID=0 and subjectName =\"" . Subject::TUTOR_SUBJECT . "\" ";
        try {
            $subjectId = $this->executeQueryForObject($sql)->subjectID;
            if ($subjectId)
                return $subjectId;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return false;
    }
    /**
     * Create a subject named TUTOR
     * @return \com\linways\base\dto\MySqlResult
     * @throws ProfessionalException
     */
    public function createTutorSubject()
    {
        $sql = "insert into subjects (subjectName, subjectDesc, deptID, syllabusName, hdl_deptID, hide) value(\"" . Subject::TUTOR_SUBJECT . "\",\"" . Subject::TUTOR_SUBJECT . "\",0,\"" . Subject::TUTOR_SUBJECT . "\",0,1)";
        try {
            return $this->executeQuery($sql, true);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get subject and staff details by sbs id
     * @param int $sbsId
     * @return object|NULL|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getSubjectDetailsBySbsId($sbsId)
    {
        $sbsId = $this->realEscapeString($sbsId);
        $subjectDetails = null;
        $sql = "SELECT sa.staffID,
                     sa.staffCode,
                     sa.staffName,
                     sbs.sbsID,
                     sub.subjectID,
                     sub.subjectName,
                     sub.syllabusName,
                     sub.subjectDesc as description,
                     bth.batchName,
                     sem.semName,
                     dept.deptName,
                     sub.universityAllottedHours,
                     sbs.semID,
                     sbs.batchID FROM staffaccounts sa  
                     INNER JOIN sbs_relation sbs ON sa.staffID=sbs.staffID 
                     INNER JOIN subjects sub ON sbs.subjectID=sub.subjectID 
                     INNER JOIN batches bth ON bth.batchID=sbs.batchID 
                     INNER JOIN semesters sem ON sem.semID=bth.semID 
                     INNER JOIN department dept ON dept.deptID=bth.deptID WHERE sbs.sbsID=$sbsId";
        try {
            $subjectDetails = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),
                         $e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * Get assigned sbs details of a batch by batchId and semId
     * @param int $batchId
     * @param int $semId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getSbsDetailsByBatch($batchId, $semId)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $sbsDetails = [];
        $sql_sbs = "select distinct sbs.batchID, sbs.sbsID, sub.syllabusName, sub.subjectName, sbs.sbsID, sa.staffCode, sa.staffName, sub.subjectDesc, sbs.csID, sbs.subjectID, sa.staffID, sb.psID, sb.subbatchID from sbs_relation sbs INNER JOIN subjects sub ON sub.subjectID=sbs.subjectID INNER JOIN staffaccounts sa ON sa.staffID=sbs.staffID LEFT JOIN subbatch_sbs ss ON ss.sbsID=sbs.sbsID LEFT JOIN subbatches sb ON sb.subbatchID=ss.subbatchID where sbs.batchID=\"$batchId\" and sbs.semID=\"$semId\"  GROUP BY sbs.sbsID ORDER BY sub.subjectID ASC, sbs.sbsID ASC, sb.subbatchID DESC";
        try {
            $sbsDetails = $this->executeQueryForList($sql_sbs);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $sbsDetails;
    }
    /**
     * Get assigned sbs details of a batch by batchId and semId
     * @param int $batchId
     * @param int $semId
     * @param int $staffId
     * @param int $subjectId
     * @return object|NULL|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getSbsDetailsByStaffId($batchId, $semId, $staffId, $subjectId = null)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $staffId = $this->realEscapeString($staffId);
        $subjectId = $this->realEscapeString($subjectId);
        $sbsDetails = null;
        $sql = "select sbs.batchID, sbs.sbsID, sub.subjectName, sbs.sbsID, sa.staffCode, sa.staffName, sub.subjectDesc, sbs.csID, sbs.subjectID from sbs_relation sbs, subjects sub, staffaccounts sa where  sub.subjectID=sbs.subjectID AND sa.staffID=sbs.staffID AND sbs.batchID=\"$batchId\" AND sbs.semID=\"$semId\" AND sbs.staffID=$staffId ";
        if ($subjectId) {
            $sql .= "AND sbs.subjectID=$subjectId ";
        }
        $sql .= "ORDER BY sub.subjectID ASC, sbs.sbsID ASC";
        try {
            if ($subjectId) {
                $sbsDetails = $this->executeQueryForObject($sql);
            } else {
                $sbsDetails = $this->executeQueryForList($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $sbsDetails;
    }
    /**
     * check whether a subject  is assigned to a batch
     * @param int $subjectId
     * @return boolean
     * @throws ProfessionalException
     */
    public function isSubjectAssignedToBatch($subjectId)
    {
        $isAssigned = false;
        $sql = "SELECT count(sbsID) AS batchCound FROM sbs_relation WHERE subjectID=$subjectId";
        try {
            $batchCound = $this->executeQueryForObject($sql)->batchCound;
            if ($batchCound) {
                $isAssigned = true;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $isAssigned;
    }
    /**
     * delete subject by id
     * @param int $subjectId
     * @return object|NULL|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function deleteSubjectById($subjectId)
    {
        $sql_sd = "DELETE FROM sd_relation WHERE subjectID=$subjectId";
        $sql_ss = "DELETE FROM subject_sem_relation WHERE subjectID=$subjectId";
        $sql_sub = "DELETE FROM subjects WHERE subjectID=$subjectId";
        try {
            $this->executeQueryForObject($sql_sd);
            $this->executeQueryForObject($sql_ss);
            return $this->executeQueryForObject($sql_sub);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get pseudo subject details by id
     * @param int $suSubId
     * @return object|NULL|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getPseudoSubjectDetailsById($suSubId)
    {
        $pseudoSubjectDetails = NULL;
        $sql = "SELECT distinct psub.pseudosubjectID, psub.subjectName, dept.deptName, GROUP_CONCAT(DISTINCT sa.staffName) AS staffName, sbs.subjectID, sbs.semID, sbs.batchID FROM pseudosubjects psub LEFT JOIN pseudosubjects_sbs psbs ON psbs.pseudosubjectID=psub.pseudosubjectID LEFT JOIN department dept ON dept.deptID=psub.hdl_deptID LEFT JOIN sbs_relation sbs ON sbs.sbsID=psbs.sbsID LEFT JOIN staffaccounts sa ON sa.staffID=sbs.staffID WHERE psub.pseudosubjectID=$suSubId";
        try {
            $pseudoSubjectDetails = $this->executeQueryForObject($sql, FALSE, $this->mapper[SubjectServiceMapper::GET_PSEUDO_SUBJECT_BY_ID]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $pseudoSubjectDetails;
    }
    /**
     * get pseudo subject details by id
     * @param int $suSubId
     * @return object|NULL|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getPseudoSubjectBatchDetailsById($suSubId)
    {
        $pseudoSubjectDetails = NULL;
        $sql = "SELECT sr.batchID,ps.pseudosubjectID, ps.subjectName, dp.deptName, dp.departmentDesc, sr.subjectID, sr.semID, sm.semName FROM pseudosubjects_sbs pss INNER JOIN  pseudosubjects  ps ON ps.pseudosubjectID=pss.pseudosubjectID INNER JOIN sbs_relation sr ON sr.sbsID=pss.sbsID INNER JOIN batches bt ON bt.batchID=sr.batchID INNER JOIN semesters sm ON sm.semID=sr.semID INNER JOIN department dp ON dp.deptID=bt.deptID WHERE ps.pseudosubjectID=$suSubId";
        try {
            $pseudoSubjectDetails = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $pseudoSubjectDetails;
    }
    /**
     * get pseudo subject related sbsId
     * @param int $suSubId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getPseudoSubjectSbsIdsByStaffId($suSubId, $staffId)
    {
        $suSubId = $this->realEscapeString($suSubId);
        $staffId = $this->realEscapeString($staffId);
        $sql = "SELECT group_concat(ss.sbsID) as sbsIDs FROM subbatch_sbs ss INNER JOIN subbatches sub ON sub.subbatchID=ss.subbatchID inner join sbs_relation sr ON sr.sbsID=ss.sbsID WHERE sub.psID=$suSubId AND sr.staffID=$staffId";
        try {
            return $this->executeQueryForObject($sql)->sbsIDs;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get pseudo subject related sbsId
     * @param int $suSubId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getPseudoSubjectSbsIdsById($suSubId)
    {
        $sql = "SELECT group_concat(sbsID) as sbsIDs FROM pseudosubjects_sbs WHERE pseudosubjectID=$suSubId";
        try {
            return $this->executeQueryForObject($sql)->sbsIDs;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * This service is used to find the subjects assigned to running semesters by handling department
     * Get subject details by handling department
     *
     * @param int $hdl_deptId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getSubjectsByHandlingDepartmentId($hdl_deptId)
    {
        $hdl_deptId = $this->realEscapeString($hdl_deptId);
        $sql = "SELECT sub.subjectID, subjectName, subjectDesc, syllabusName, sbs.batchID, sbs.semID
                FROM sbs_relation sbs
                INNER JOIN batches bat ON sbs.batchID = bat.batchID AND sbs.semID = bat.semID
                INNER JOIN subjects sub ON sub.subjectID = sbs.subjectID
                WHERE hdl_deptID = '$hdl_deptId' AND sub.subjectName NOT IN (\"" . Subject::TUTOR_SUBJECT . "\")";
        try {
            $subjectDetails = $this->executeQueryForList($sql, $this->mapper[SubjectServiceMapper::GET_SUBJECTS_BY_DEPARTMENT]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * Returns subjects under a department
     *
     * @param $departmentId
     * @return Object
     * @throws ProfessionalException
     * @author jithinvijayan
     */
    public function getSubjectsFromDepartments($departmentId)
    {
        $sql = "SELECT subjectID as id, subjectName as code, subjectDesc as name, syllabusName,syllabusYear
                FROM subjects
                WHERE hdl_deptID = $departmentId AND subjectName NOT IN (\"" . Subject::TUTOR_SUBJECT . "\")";
        try {
            $response = $this->executeQueryForList($sql);
            $response = CommonUtil::decodeHtmlSpecialChars($response);
            return $response;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * check sbsid is belongs to pseudo subject
     * @param int $sbsId
     * @return boolean
     * @throws ProfessionalException
     */
    public function isPseudoSubjectBySbsId($sbsId)
    {
        $sbsId = $this->realEscapeString($sbsId);
        $sql = "SELECT pseudosubjectID as psId FROM pseudosubjects_sbs WHERE sbsID=$sbsId";
        try {
            $psId = $this->executeQueryForObject($sql)->psId;
            if ($psId) {
                return true;
            } else {
                return false;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get pseudo subject details by sbsId
     * @param int $sbsId
     * @return object|NULL|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getPseudoSubjectBySbsId($sbsId)
    {
        $sbsId = $this->realEscapeString($sbsId);
        $sql = "SELECT ps.* FROM pseudosubjects ps INNER JOIN pseudosubjects_sbs psb ON psb.pseudosubjectID=ps.pseudosubjectID WHERE psb.sbsID='$sbsId'";
        try {
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get pseudo subject students by pseudo subject id
     * @param int $pssubId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getPseudoSubjectStudentById($pssubId)
    {
        $pssubId = $this->realEscapeString($pssubId);
        $sql = "SELECT t1.studentID, t2.studentName, t2.rollNo, t2.studentAccount, t2.regNo, t3.batchName, t3.batchID, t4.deptName FROM pseudosubjects_students t1, studentaccount t2, batches t3, department t4 WHERE t1.studentID = t2.studentID AND t3.batchID = t2.batchID AND t4.deptID = t3.deptID AND t1.pseudosubjectID=$pssubId order by t3.batchName, t2.rollNo";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Undocumented function
     *
     * @param [type] $pssubId
     * @return void
     */
    public function getNumberOfStudentsInAPseudoSubjectByPseudoSubjectId($pssubId)
    {
        $pssubId = $this->realEscapeString($pssubId);
        $sql = "SELECT count(t1.studentID) as totalRecords FROM pseudosubjects_students t1
                INNER JOIN studentaccount t2 ON t1.studentID = t2.studentID
                WHERE t1.pseudosubjectID=$pssubId";
        try {
            $totalRecords = $this->executeQueryForObject($sql)->totalRecords;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $totalRecords;
    }
    /**
     * To get subject details by subjectId
     * @param int $subjectId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getSbsIdsBySubjectId($subjectId)
    {
        $subjectId = $this->realEscapeString($subjectId);
        $sql = "select group_concat(sbsID) as sbsId from sbs_relation sbs inner join batches bat on sbs.batchID = bat.batchID and sbs.semID = bat.semID inner join subjects sub on sub.subjectID = sbs.subjectID where sub.subjectID = $subjectId";
        try {
            $subjectDetails = $this->executeQueryForObject($sql)->sbsId;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * Check whether a subject is of given category
     * @param int $subjectId
     * @param string $subjectcatID
     * @return int
     * @throws ProfessionalException
     */
    public function checkSubjectCategory($subjectId, $subjectcatID)
    {
        $subjectId = $this->realEscapeString($subjectId);
        $subjectcatID = $this->realEscapeString($subjectcatID);
        $sql = "SELECT IF(s.subjectcatID = '" . $subjectcatID . "' || subc.parentID = '" . $subjectcatID . "', 1, 0) as flag FROM subjects s INNER JOIN subject_category subc ON subc.subjectcatID = s.subjectcatID WHERE s.subjectID = " . $subjectId . "";
        try {
            return $this->executeQueryForObject($sql)->flag;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Return sbs id by staff id, subject id and batch id
     * @param integer $subjectId
     * @param integer $batchId
     * @param integer $staffId
     * @return integer|null
     * @throws ProfessionalException
     */
    public function getSBSIdBySubjectIdAndStaffIdAndSemId($subjectId, $batchId, $staffId, $semId =null)
    {
        $sbsid = null;
        $batchId = $this->realEscapeString($batchId);
        $subjectId = $this->realEscapeString($subjectId);
        $staffId = $this->realEscapeString($staffId);
        $semId = $this->realEscapeString($semId);
        $joinCondition ="";
        $semester = "";
        if (empty($batchId))
            throw new ProfessionalException(ProfessionalException::INVALID_BATCH_ID, "Invalid batch id");
        if (empty($subjectId))
            throw new ProfessionalException(ProfessionalException::INVALID_SUBJECT_ID, "Invalid subject id");
        if (empty($staffId))
            throw new ProfessionalException(ProfessionalException::INVALID_STAFF_ID, "Invalid staff id");
        if(empty($semId)) {
            $joinCondition = " AND sb.semID = b.semID";
        }
        else {
            $semester = " AND sb.semID = $semId";
        }
        $sql = "SELECT sbsID FROM sbs_relation sb
                INNER JOIN batches b ON b.batchID = sb.batchID $joinCondition
                WHERE sb.batchID=$batchId AND subjectID=$subjectId AND staffID=$staffId $semester";
        try {
            $result = $this->executeQueryForObject($sql);
            $sbsid = $result->sbsID;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $sbsid;
    }
    // ProfessionalIntegration
    /**
     * Method for getting all subject categories
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     * @author Ranjith Balachandran
     */
    public function getAllSubjectCategories()
    {
        $sql = '';
        $subjectCatDetails = [];
        try {
            $sql = "SELECT subjectcatID AS subjectCatId, subjectcatName AS categoryName, subjectcatPriority, code, parentID AS parentId FROM subject_category";
            $subjectCatDetails = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectCatDetails;
    }
    /**
     * Method for getting all category codes
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     * @author Ranjith Balachandran
     */
    public function getCategoryCodes()
    {
        $categoryDetails = [];
        try {
            $sql = "SELECT sc.subjectcatName AS categoryName, cc.categoryCode,ct.typeName,ct.courseTypeID AS courseTypeId,sc.subjectcatID AS subjectCatId,cc.id AS categoryCodeId FROM subject_category sc INNER JOIN categoryCode cc ON sc.subjectcatID = cc.subject_category_id INNER JOIN course_type ct ON ct.courseTypeID = cc.course_type_id";
            $categoryDetails = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $categoryDetails;
    }
    /**
     * Method for saving category code
     * @param unknown $categoryName
     * @param unknown $courseTypeId
     * @param unknown $categoryId
     * @param unknown $categoryCodeId
     * @throws ProfessionalException
     * @author Ranjith Balachandran
     */
    public function saveCategoryCode($categoryName, $courseTypeId, $categoryId, $categoryCodeId = null)
    {
        $sql = '';
        $categoryName = $this->realEscapeString($categoryName);
        $courseTypeId = $this->realEscapeString($courseTypeId);
        $categoryId = $this->realEscapeString($categoryId);
        $categoryCodeId = $this->realEscapeString($categoryCodeId);
        if ($categoryCodeId) {
            $sql = "UPDATE categoryCode SET categoryCode = '$categoryName', subject_category_id = '$categoryId', course_type_id = '$courseTypeId' WHERE id = $categoryCodeId";
        } else {
            $sql = "INSERT INTO categoryCode (subject_category_id,course_type_id,categoryCode) VALUES ('$categoryId','$courseTypeId','$categoryName')";
        }
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Method for deleting category Code
     * @param unknown $categoryCodeId
     * @throws ProfessionalException
     * @author Ranjith Balachandran
     */
    public function deleteCategoryCode($categoryCodeId)
    {
        $categoryCodeId = $this->realEscapeString($categoryCodeId);
        $sql = "DELETE FROM categoryCode WHERE id = " . $categoryCodeId . "";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Method for getting paperTypes
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     * @author Ranjith Balachandran
     */
    public function listPaperTypes()
    {
        $paperTypes = [];
        try {
            $sql = "SELECT id AS paperTypeId, paperTypeName, paperTypeCode FROM subjectPaperType";
            $paperTypes = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $paperTypes;
    }
    /**
     * method for adding paperType
     * @param unknown $paperTypeName
     * @param unknown $paperTypeCode
     * @param unknown $paperTypeId
     * @throws ProfessionalException
     * @author Ranjith Balachandran
     */
    public function savePaperType($paperTypeName, $paperTypeCode, $paperTypeId = null)
    {
        $paperTypeName = $this->realEscapeString($paperTypeName);
        $paperTypeCode = $this->realEscapeString($paperTypeCode);
        $paperTypeId = $this->realEscapeString($paperTypeId);
        if ($paperTypeId) {
            $sql = "UPDATE subjectPaperType SET paperTypeName = '" . $paperTypeName . "', paperTypeCode = '" . $paperTypeCode . "' WHERE id = " . $paperTypeId . "";
        } else {
            $sql = "INSERT INTO subjectPaperType (paperTypeName, paperTypeCode) VALUES ('" . $paperTypeName . "','" . $paperTypeCode . "')";
        }
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Method for deleting paper Types
     * @param unknown $paperTypeId
     * @throws ProfessionalException
     * @author RanjithBalachandran
     */
    public function deletePaperType($paperTypeId)
    {
        $paperTypeId = $this->realEscapeString($paperTypeId);
        $sql = "DELETE FROM subjectPaperType WHERE id = " . $paperTypeId . "";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getCourseTypes()
    {
        $courseTypes = [];
        $sql = "SELECT courseTypeID, typeName, typeDesc, sec_lang, markgrade, extval_required, course_Type, courseTypeFlag FROM course_type";
        try {
            $courseTypes = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $courseTypes;
    }
    /**
     * Method to get subject details of the faculty who confirmed an attendance.
     * @param unknown $batchId
     * @param unknown $subbatchId
     * @param unknown $semId
     * @param unknown $hour
     * @param date $attendanceDate
     * @return object|NULL|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getSubjectDetailsOfAbsentees($batchId, $subbatchId, $semId, $hour, $attendanceDate)
    {
        $batchId = $this->realEscapeString($batchId);
        $subbatchId = $this->realEscapeString($subbatchId);
        $semId = $this->realEscapeString($semId);
        $hour = $this->realEscapeString($hour);
        $attendanceDate = $this->realEscapeString($attendanceDate);
        $sql = "";
        $sql = "SELECT
                    sub.subjectID, sub.subjectName, sub.subjectDesc
                FROM
                    attendance_confirm ac
                        INNER JOIN
                    sbs_relation sbs ON sbs.sbsID = ac.sbsID AND ac.batchID = '$batchId'
                        AND ac.semID = '$semId'
                        AND ac.subbatchID = '$subbatchId'
                        AND ac.hour = '$hour'
                        AND ac.attendanceDate = '$attendanceDate'
                        INNER JOIN
                    subjects sub ON sub.subjectID = sbs.subjectID";
        $subjectDetails = null;
        try {
            $subjectDetails = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * Update pseudosubject isFinalize flag
     * @param int $psId
     * @param int $finalise
     * @return \com\linways\base\dto\MySqlResult
     * @throws ProfessionalException
     */
    public function updateFinalizePsuedoSubject($psId, $finalise)
    {
        $psId = $this->realEscapeString($psId);
        $finalise = $this->realEscapeString($finalise);
        try {
            $sql = "update pseudosubjects set isFinalized = " . $finalise . " where pseudosubjectID = $psId";
            return $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getSubjectCategoryByName($category)
    {
        $category = $this->realEscapeString($category);
        $subjectCatDetails = null;
        try {
            $sql = "SELECT subjectcatID AS subjectCatId, subjectcatName AS categoryName FROM subject_category WHERE subjectcatName = '" . $category . "'";
            $subjectCatDetails = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectCatDetails;
    }
    /**
     * Get all second languages created
     * @return Array $secondLanguages
     * @throws ProfessionalException
     * @author Vishnu M
     */
    public function getAllSecondLanguages()
    {
        $secondLanguages = [];
        try {
            $sql = "SELECT secondlangaugeID, secondLangaugeName, secondLangaugedesc, showforadmission, secondLangaugeCode FROM secondLangauge";
            $secondLanguages = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $secondLanguages;
    }
    /**
     * Method to get all subjects learnt by a student of a batch in a particular semester.
     * @param unknown $studentId
     * @param unknown $batchId
     * @param unknown $semId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     * @author gadheyan
     */
    public function getSubjectsByStudent($studentId, $batchId, $semId)
    {
        $subjectList = null;
        $studentId = $this->realEscapeString($studentId);
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $sql = "";
        $sql = " SELECT DISTINCT sub.subjectID as subjectId,sub.subjectName,sub.subjectDesc, ssbs.subbatchID, sub.subjectcatID,sub.syllabusName,sub.secondLangaugeId FROM
        pseudosubjects_students pss
        INNER JOIN pseudosubjects_sbs psbs ON psbs.pseudosubjectID = pss.pseudosubjectID AND pss.studentID = $studentId
        INNER JOIN sbs_relation sbs ON sbs.sbsID=psbs.sbsID AND sbs.batchID = $batchId AND sbs.semID = $semId
        INNER JOIN subjects sub ON sbs.subjectID = sub.subjectID
        INNER JOIN subbatch_sbs ssbs ON (sbs.sbsID = ssbs.sbsID) WHERE sub.subjectName NOT IN (\"" . Subject::TUTOR_SUBJECT . "\") UNION
        SELECT DISTINCT sub.subjectID as subjectId,sub.subjectName,sub.subjectDesc , sbsbs.subbatchID, sub.subjectcatID,sub.syllabusName,sub.secondLangaugeId FROM  subbatch_student sbst
        INNER JOIN subbatch_sbs sbsbs ON sbsbs.subbatchID = sbst.subbatchID AND sbst.studentID = $studentId
        INNER JOIN sbs_relation sbs ON sbsbs.sbsID = sbs.sbsID AND sbs.batchID = $batchId AND sbs.semID = $semId
        INNER JOIN subjects sub ON sub.subjectID = sbs.subjectID WHERE sub.subjectName NOT IN (\"" . Subject::TUTOR_SUBJECT . "\") UNION
        SELECT DISTINCT sub.subjectID as subjectId,sub.subjectName,sub.subjectDesc, null, sub.subjectcatID,sub.syllabusName,sub.secondLangaugeId FROM subjects sub
        INNER JOIN sbs_relation sbs ON sbs.subjectID = sub.subjectID
        WHERE sub.subjectName NOT IN (\"" . Subject::TUTOR_SUBJECT . "\") AND sbs.sbsID NOT IN (SELECT sbsID FROM subbatch_sbs) AND sbs.batchID = $batchId AND sbs.semID = $semId AND sbs.isPseudosubject = 0";
        try {
            $subjectList = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectList;
    }
    /**
     * Get assigned sbs details of a subject
     * @param int $subjectId
     * @param int $semId
     * @param int $batchId
     * @return object|NULL|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getSbsDetailsBysubjectId($subjectId, $semId, $batchId)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        $sql = "select sa.staffID, sbs.batchID, sbs.sbsID, sub.subjectName, sbs.sbsID, sa.staffCode, sa.staffName, sub.subjectDesc, sbs.csID, sbs.subjectID from sbs_relation sbs, subjects sub, staffaccounts sa where  sub.subjectID=sbs.subjectID AND sa.staffID=sbs.staffID AND sbs.batchID=\"$batchId\" AND sbs.semID=\"$semId\" AND sbs.subjectID=$subjectId  ORDER BY sub.subjectID ASC, sbs.sbsID ASC";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @author Vishnu M
     */
    public function getSubjectByCourseTypeSemCategory($courseTypeId, $semId, $batchStartYear, $subjectCategory = NULL)
    {
        $courseTypeId = (int) $this->realEscapeString($courseTypeId);
        $semId = (int) $this->realEscapeString($semId);
        $batchStartYear = (int) $this->realEscapeString($batchStartYear);
        $subjectCategory = (int) $this->realEscapeString($subjectCategory);
        $sqlCondition = null;
        $subjects = [];
        if ($subjectCategory) {
            $sqlCondition = " AND s.subjectcatID = '$subjectCategory";
        }
        // $sql = "SELECT subjectID, subjectName, subjectDesc, isTheory, deptID FROM subjects WHERE courseTypeID = '$courseTypeId' AND semID = '$semId' $sqlCondition ORDER BY subjectPriority ASC, subjectName ASC";
        $sql = "SELECT s.subjectID, s.syllabusName, s.subjectName, s.subjectDesc, s.isTheory, s.deptID FROM subjects s INNER JOIN sbs_relation sbs ON (s.subjectID = sbs.subjectID) INNER JOIN batches b ON (b.batchID = sbs.batchID) WHERE s.courseTypeID = '$courseTypeId' AND sbs.semID = '$semId' AND b.batchStartYear = '$batchStartYear$sqlCondition GROUP BY sbs.subjectID";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * @author Vishnu M
     */
    public function getSubjectsHavingGradeScheme($courseTypeId, $semId, $subjectCategory = NULL)
    {
        $courseTypeId = (int) $this->realEscapeString($courseTypeId);
        $semId = (int) $this->realEscapeString($semId);
        $subjectCategory = (int) $this->realEscapeString($subjectCategory);
        $sqlCondition = null;
        $subjects = [];
        if ($subjectCategory) {
            $sqlCondition = " AND s.subjectcatID = '$subjectCategory";
        }
        $sql = "SELECT s.subjectID, s.subjectName, s.subjectDesc, s.isTheory, s.deptID, esgs.grade_scheme_id AS schemeId FROM subjects s INNER JOIN exam_subject_grading_scheme esgs ON (s.subjectID = esgs.subject_id) WHERE s.courseTypeID = '$courseTypeId' AND s.semID = '$semId$sqlCondition ORDER BY s.subjectPriority ASC, s.subjectName ASC";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * Get all subject teaching by a staff in a batch
     * @param Integer $staffId
     * @param Integer $batchId
     * @return Array $subjects
     * @throws ProfessionalException
     * @author Vishnu M
     */
    public function getSubjectsByStaffAndBatch($staffId = false, $batchId)
    {
        $staffId = (int) $this->realEscapeString($staffId);
        $batchId = (int) $this->realEscapeString($batchId);
        $condition = "";
        if ($staffId) {
            $condition .= " sbs.staffID = '$staffId' AND";
        }
        if ($batchId) {
            $condition .= " sbs.batchID = '$batchId' AND";
        }
        $subjects = [];
        $sql = "SELECT s.subjectID, s.subjectName, s.subjectDesc, s.isTheory, s.deptID
        FROM subjects s
        INNER JOIN sbs_relation sbs ON (s.subjectID = sbs.subjectID)
        INNER JOIN batches b ON sbs.batchID = b.batchID AND b.semID = sbs.semID
        LEFT JOIN department dept ON dept.deptID = b.deptID
        WHERE $condition b.isPassOut = 0 AND dept.deptShow = 1";
        $sql .= " ORDER BY s.subjectPriority ASC, s.subjectName ASC";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * Get all subjects in a batch
     * @param Integer $batchId
     * @return Array $subjects
     * @throws ProfessionalException
     * @author Vishnu M
     */
    public function getSubjectsByBatchId($batchId)
    {
        $batchId = (int) $this->realEscapeString($batchId);
        $subjects = [];
        $sql = "SELECT s.subjectID, s.subjectName, s.syllabusName, s.subjectDesc, sbs.sbsID, sbs.batchID, sbs.semID, sem.semName FROM subjects s INNER JOIN sbs_relation sbs ON (s.subjectID = sbs.subjectID) INNER JOIN semesters sem ON (sbs.semID = sem.semID) WHERE sbs.batchID = '$batchId' GROUP BY s.subjectID ORDER BY sbs.semID ASC, s.subjectPriority ASC";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * @param string $date
     * @param int $batchID
     * @param int $semID
     * @param string $hour
     * to get distict list of subject for a date
     * @return Object
     * @throws ProfessionalException
     */
    public function getSubjectDetailsByDate($date, $batchID, $semID, $hour)
    {
        $date = $this->realEscapeString($date);
        $batchID = $this->realEscapeString($batchID);
        $semID = $this->realEscapeString($semID);
        $hour = $this->realEscapeString($hour);
        $sql = "select a.hour ,a.batchId, a.sbsID, sb.subjectID ,sub.subjectName, sub.subjectDesc, sb.sbsID, staff.staffName, staff.staffCode
                from attendance_confirm a
                inner join sbs_relation sb on a.sbsID = sb.sbsId
                inner join staffaccounts staff on  staff.staffID = sb.staffID
                left join subjects sub on sb.subjectID = sub.subjectID
                where a.attendanceDate='$date' and a.hour='$hour' and a.batchId='$batchID' and a.semID='$semID' group by sb.subjectID,a.hour;";
        try {
            $SubjectDetails = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $SubjectDetails;
    }
    /**
     * @param bool $removeDuplicate
     * @return bool
     * @throws ProfessionalException
     */
    public function removeOrUpdateDuplicateSubjects($removeDuplicate = true)
    {
        $duplicateSubjects = [];
        /*
         * STEP 1:
         *
         * fetching duplicate subjects code
         */
        $sql = "SELECT DISTINCT subjectName from subjects
                WHERE subjectName IN (
                SELECT subjectName FROM subjects GROUP BY subjectName HAVING count(subjectName)>1)";
        try {
            $duplicateSubjects = $this->executeQueryForList($sql);
            foreach ($duplicateSubjects as $duplicateSubject) {
                $this->beginTransaction();
                /*
                 * STEP 2:
                 *
                 * With duplicate subject code, fetching all subjects with same subject code
                 */
                $repeatingSubjects = $this->getRepeatingSubjectsBySubjectCode($duplicateSubject->subjectName);
                /*
                 * STEP 3:
                 *
                 * Finding valid subject to retain
                 */
                $validSubject = $this->findValidSubjectFromRepeatingSubjects($repeatingSubjects);
                if (empty($validSubject)) {
                    throw new ProfessionalException("VALID_SUBJECT_NOT_FOUND", "Couldn't find a valid subject");
                }
                /*
                 * STEP 4:
                 *
                 * Adding semester subject relation of valid subject
                 */
                $this->insertIfNotExistSemesterSubjectRelation($validSubject);
                /*
                 * STEP 5:
                 *
                 * Adding department subject relation of valid subject
                 */
                $this->insertIfNotExistDepartmentSubjectRelation($validSubject);
                foreach ($repeatingSubjects as $repeatingSubject) {
                    /*
                     * STEP 5:
                     *
                     * Skipping retained subject from duplicate subjects
                     */
                    if ($validSubject->id === $repeatingSubject->id) {
                        continue;
                    }
                    /*
                     *STEP 6.1:
                     * Deleting repeating subjects under same batch and semester as correct subject from
                     * exam_subjectcredit table
                     */
                    $this->checkSubjectAlreadyMappedThenDeleteFromExamSubjectCredit($validSubject, $repeatingSubject);
                    /*
                     * STEP 6.2:
                     * Deleting repeating subjects under same batch and semester as correct subject from
                     * sbs_relation table
                     */
                    $this->checkSubjectAlreadyMappedThenDeleteFromSBSRelation($validSubject, $repeatingSubject);
                    /*
                     * STEP 6.3:
                     * Deleting repeating subjects under same batch and semester as correct subject from
                     * internal_marks table
                     */
                    $this->checkSubjectAlreadyMappedThenDeleteFromInternalMarks($validSubject, $repeatingSubject);
                    /*
                     * STEP 6.3:
                     * Deleting repeating subjects under same batch and semester as correct subject from
                     * internal_marks_settings table
                     */
                    $this->checkSubjectAlreadyMappedThenDeleteFromInternalMarksSettings($validSubject, $repeatingSubject);
                    /*
                    * STEP 6.4:
                    * Deleting repeating subjects under same batch and semester as correct subject from
                    * exam_reg_studentsubject table
                    */
                    $this->checkSubjectAlreadyMappedThenDeleteFromExamSubjectRegistration($validSubject, $repeatingSubject);
                    /*
                     * STEP 7:
                     *
                     * Updating subject id of deleting subjects with retained subject id
                     */
                    $this->updateCorrectSubjectIdToAllRefTables($validSubject, $repeatingSubject);
                    /*
                     * STEP 7:
                     *
                     * Adding semester subject relation of deleting subject
                     */
                    $this->insertIfNotExistSemesterSubjectRelation($repeatingSubject);
                    /*
                     * STEP 8:
                     *
                     * Adding department subject relation of deleting subject
                     */
                    $this->insertIfNotExistDepartmentSubjectRelation($repeatingSubject);
                    /*
                     * STEP 9:
                     *
                     * Deleting duplicate subjects
                     */
                    if ($removeDuplicate) {
                        $this->deleteSubject($repeatingSubject);
                    }
                }
                $this->commit();
            }
        } catch (\Exception $e) {
            $this->rollBack();
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return true;
    }
    /**
     * @param $subjectCode
     * @return Subject[]|Object
     * @throws ProfessionalException
     */
    private function getRepeatingSubjectsBySubjectCode($subjectCode)
    {
        //TODO:  Change subject name to syllabus name
        $sql = "SELECT * FROM subjects WHERE subjectName='$subjectCode'";
        try {
            return $subjects = $this->executeQueryForList($sql, $this->mapper[SubjectServiceMapper::GET_SUBJECTS]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Finding which subject to be keep in the database.
     * Validity of subject determining by calculating how much required subject properties are not empty.
     * @param Subject[] $repeatingSubjects
     * @param bool $retainMostReferredSubject
     * @return Subject
     * @throws ProfessionalException
     */
    private function findValidSubjectFromRepeatingSubjects($repeatingSubjects, $retainMostReferredSubject = true)
    {
        $validSubject = null;
        $validSubjectPercentage = 0;
        $numberOfReferences = 0;
        /**
         * TODO: Assign priorities to the required fields, thereby calculate percentage
         * This array elements $requiredFields should be the Subject class properties.
         */
        $requiredFields = ['courseTypeId', 'secondLanguageId', 'isTheory', 'subjectCategoryId', 'hdlDeptId', 'priority', 'syllabusYear'];
        $percentageIterator = 100 / count($requiredFields);
        foreach ($repeatingSubjects as $subject) {
            if ($subject instanceof Subject) {
                $count = 0;
                $percentageOfValid = 0;
                if (empty($subject->semId)) {
                    continue;
                }
                foreach ($requiredFields as $field) {
                    if (property_exists("com\linways\core\ams\professional\dto\Subject", $field)) {
                        if ($subject->{$field} !== null || $subject->{$field} !== "") {
                            $percentageOfValid += $percentageIterator;
                        }
                    } else {
                        throw new ProfessionalException("OBJECT_PROPERTY_NOT_FOUND", "Each required fields should be the property of com\linways\core\ams\professional\dto\Subject");
                    }
                }
                if ($retainMostReferredSubject) {
                    $count = $this->findCountOfSubjectReferences($subject);
                    if ($count > $numberOfReferences && $percentageOfValid >= $validSubjectPercentage) {
                        $validSubject = $subject;
                        $validSubjectPercentage = $percentageOfValid;
                        $numberOfReferences = $count;
                    }
                } else if ($percentageOfValid > $validSubjectPercentage) {
                    $validSubject = $subject;
                    $validSubjectPercentage = $percentageOfValid;
                }
            } else {
                throw new ProfessionalException("INVALID_ARGUMENT", "Argument must be the instance of  com\linways\core\ams\professional\dto\Subject");
            }
        }
        return $validSubject;
    }
    /**
     * Updating deleting subjects id's with retained subject id
     * @param Subject $correctSubject
     * @param $subjectToDelete
     * @throws \Exception
     */
    private function updateCorrectSubjectIdToAllRefTables($correctSubject, $subjectToDelete)
    {
        try {
            /**
             * update subjectID ref columns
             */
            foreach ($this->refSubjectsTablesWithSubjectIDColumn as $subjectIdRefTable) {
                $sqlToUpdate = "UPDATE $subjectIdRefTable
                                SET subjectID = $correctSubject->id
                                WHERE subjectID=$subjectToDelete->id";
                $this->executeQuery($sqlToUpdate);
            }
            /**
             * Some tables using subject_ID instead of subjectID, Here updating such tables
             * update subject_ID ref columns
             */
            foreach ($this->refSubjectsTablesWithSubject_IDColumn as $subjectIdRefTable) {
                $sqlToUpdate = "UPDATE $subjectIdRefTable
                                SET subject_ID = $correctSubject->id
                                WHERE subject_ID=$subjectToDelete->id";
                $this->executeQuery($sqlToUpdate);
            }
            foreach ($this->refSubjectsTableWithSubjects_IDColumn as $subjectIdRefTable) {
                $sqlToUpdate = "UPDATE $subjectIdRefTable
                                SET subjects_id = $correctSubject->id
                                WHERE subjects_id=$subjectToDelete->id";
                $this->executeQuery($sqlToUpdate);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $correctSubject
     * @param $subjectToDelete
     * @throws ProfessionalException
     */
    private function checkSubjectAlreadyMappedThenDeleteFromExamSubjectCredit($correctSubject, $subjectToDelete)
    {
        $sql = "SELECT DISTINCT batchID as batchId,semID as semId,credit
                FROM exam_subjectcredit WHERE subjectID = $correctSubject->id";
        try {
            $subjectMappings = $this->executeQueryForList($sql);
            foreach ($subjectMappings as $subjectMapping) {
                $sql = "DELETE FROM exam_subjectcredit
                        WHERE subjectID = $subjectToDelete->id AND batchID = $subjectMapping->batchId
                        AND semID = $subjectMapping->semId AND credit=$subjectMapping->credit";
                $this->executeQuery($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $correctSubject
     * @param $subjectToDelete
     * @throws ProfessionalException
     */
    public function checkSubjectAlreadyMappedThenDeleteFromSBSRelation($correctSubject, $subjectToDelete)
    {
        $sql = "SELECT DISTINCT batchID as batchId,semID as semId,staffID as staffId
                FROM sbs_relation WHERE subjectID = $correctSubject->id";
        try {
            $subjectMappings = $this->executeQueryForList($sql);
            foreach ($subjectMappings as $subjectMapping) {
                $sql = "DELETE FROM sbs_relation
                        WHERE subjectID = $subjectToDelete->id AND batchID = $subjectMapping->batchId
                        AND semID = $subjectMapping->semId AND staffID=$subjectMapping->staffId";
                $this->executeQuery($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $correctSubject
     * @param $subjectToDelete
     * @throws ProfessionalException
     */
    public function checkSubjectAlreadyMappedThenDeleteFromInternalMarks($correctSubject, $subjectToDelete)
    {
        $sql = "SELECT DISTINCT batchID as batchId,semID as semId
                FROM internal_marks WHERE subjectID = $correctSubject->id";
        try {
            $subjectMappings = $this->executeQueryForList($sql);
            foreach ($subjectMappings as $subjectMapping) {
                $sql = "DELETE FROM internal_marks
                        WHERE subjectID = $subjectToDelete->id AND batchID = $subjectMapping->batchId
                        AND semID = $subjectMapping->semId";
                $this->executeQuery($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $correctSubject
     * @param $subjectToDelete
     * @throws ProfessionalException
     */
    public function checkSubjectAlreadyMappedThenDeleteFromInternalMarksSettings($correctSubject, $subjectToDelete)
    {
        $sql = "SELECT DISTINCT batchID as batchId,semID as semId
                FROM internal_marks_settings WHERE subjectID = $correctSubject->id";
        try {
            $subjectMappings = $this->executeQueryForList($sql);
            foreach ($subjectMappings as $subjectMapping) {
                $sql = "DELETE FROM internal_marks_settings
                        WHERE subjectID = $subjectToDelete->id AND batchID = $subjectMapping->batchId
                        AND semID = $subjectMapping->semId";
                $this->executeQuery($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $correctSubject
     * @param $subjectToDelete
     * @throws ProfessionalException
     */
    public function checkSubjectAlreadyMappedThenDeleteFromExamSubjectRegistration($correctSubject, $subjectToDelete)
    {
        $sql = "SELECT DISTINCT examregID as examRegId
                FROM exam_reg_studentsubject WHERE subjectID = $correctSubject->id";
        try {
            $subjectMappings = $this->executeQueryForList($sql);
            foreach ($subjectMappings as $subjectMapping) {
                $sql = "DELETE FROM exam_reg_studentsubject
                        WHERE subjectID = $subjectToDelete->id AND examregID = $subjectMapping->examRegId";
                $this->executeQuery($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Adding semester subject relation
     * @param Subject $subject
     * @throws \Exception
     */
    private function insertIfNotExistSemesterSubjectRelation($subject)
    {
        try {
            if (!empty($subject) && !empty($subject->semId)) {
                //Checking semester subject relation already added
                $sqlExist = "SELECT id FROM subject_sem_relation
                            WHERE subjectID = $subject->id AND semID = $subject->semId";
                $existResp = $this->executeQueryForObject($sqlExist)->id;
                if (empty($existResp)) {
                    //If semester subject relation not added, inserting new semester subject relation
                    $sqlInsert = "INSERT INTO `subject_sem_relation`
                                    (`subjectID`, `semID`, `created_by`, `created_date`, `updated_by`, `updated_date`)
                                  VALUES ('$subject->id', $subject->semId, '0', utc_timestamp(), '0', utc_timestamp());";
                    $this->executeQuery($sqlInsert);
                }
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Adding subject department relation
     * @param Subject $subject
     * @return void
     * @throws \Exception
     */
    private function insertIfNotExistDepartmentSubjectRelation($subject)
    {
        try {
            if (!empty($subject)) {
                //Checking department subject relation already added
                $sqlExist = "SELECT id FROM sd_relation
                             WHERE subjectID=$subject->id AND deptID = $subject->deptId";
                $sdRelationId = $this->executeQueryForObject($sqlExist)->id;
                if (empty($sdRelationId)) {
                    //If department subject relation not added, inserting new semester subject relation
                    $sqlInsert = "INSERT INTO `sd_relation` (`subjectID`, `deptID`, `createdBy`, `createdDate`,
                                      `updatedBy`, `updatedDate`)
                                  VALUES ($subject->id,$subject->deptId , '0', utc_timestamp(), '0', utc_timestamp());";
                    $this->executeQuery($sqlInsert);
                }
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param Subject $subject
     * @throws \Exception
     */
    private function deleteSubject($subject)
    {
        $deleteSubSemSql = "DELETE FROM subject_sem_relation WHERE subjectID = '$subject->id'";
        $deleteTeachingDeptSql = "DELETE FROM sd_relation WHERE subjectID = '$subject->id'";
        $deleteSubjectSql = "DELETE FROM subjects WHERE subjectId = '$subject->id'";
        try {
            $this->executeQuery($deleteSubSemSql);
            $this->executeQuery($deleteTeachingDeptSql);
            $this->executeQuery($deleteSubjectSql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Calculating how much subject references occurred in the database
     * @param Subject $subject
     * @return int
     * @throws ProfessionalException
     */
    private function findCountOfSubjectReferences(Subject $subject)
    {
        $count = 0;
        $totalReferences = 0;
        try {
            foreach ($this->refSubjectsTablesWithSubjectIDColumn as $subjectIdRefTable) {
                $sqlToUpdate = "SELECT COUNT(*) as totalReferences FROM $subjectIdRefTable
                                WHERE subjectID=$subject->id";
                $count = (int) $this->executeQueryForObject($sqlToUpdate)->totalReferences;
                if ($count > 0) {
                    ++$totalReferences;
                }
            }
            /**
             * Some tables using subject_ID instead of subjectID, Here updating such tables
             * update subject_ID ref columns
             */
            foreach ($this->refSubjectsTablesWithSubject_IDColumn as $subjectIdRefTable) {
                $sqlToUpdate = "SELECT COUNT(*) as totalReferences FROM $subjectIdRefTable
                                WHERE subject_ID=$subject->id";
                $count = (int) $this->executeQueryForObject($sqlToUpdate)->totalReferences;
                if ($count > 0) {
                    ++$totalReferences;
                }
            }
            foreach ($this->refSubjectsTableWithSubjects_IDColumn as $subjectIdRefTable) {
                $sqlToUpdate = "SELECT COUNT(*) as totalReferences FROM $subjectIdRefTable
                                WHERE subjects_id=$subject->id";
                $count = (int) $this->executeQueryForObject($sqlToUpdate)->totalReferences;
                if ($count > 0) {
                    ++$totalReferences;
                }
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $totalReferences;
    }
    /**
     * Fetch subjects of sub batch from the database
     * @param array $subject //Subject
     * @return array
     * @throws ProfessionalException
     */
    public function getSubjectsBySubBatch($subject)
    {
        $batchID = $subject['batchID'];
        $semID = $subject['semID'];
        $subbatchID = $subject['subbatchID'];
        $tutorSub = $subject['tutorSub'];
        $subjectCatId = $subject['subjectCatId'];
        $sqlTutor = "";
        if (!$tutorSub) {
            $sqlTutor = " and t3.subjectName not in (\"" . Subject::TUTOR_SUBJECT . "\") ";
        }
        $cond = "";
        if ($subjectCatId) {
            $cond = " AND t3.subjectcatID='$subjectCatId";
        }
        if ($subbatchID) {
            $sql = "SELECT DISTINCT t3.subjectID AS subjectId, t3.subjectName AS subjectName , t3.subjectDesc AS subjectDesc, t3.syllabusName AS syllabusName FROM sbs_relation t1, staffaccounts t2, subjects t3, subbatch_sbs ss WHERE t1.staffID=t2.staffID AND t1.subjectID=t3.subjectID AND ss.sbsID=t1.sbsID AND t1.batchID=" . $batchID . " and t1.semID=" . $semID . " and ss.subbatchID=" . $subbatchID . " " . $sqlTutor . " $cond ORDER BY subjectID ASC";
        } else {
            $sql = "SELECT DISTINCT t3.subjectID AS subjectId, t3.subjectName AS subjectName , t3.subjectDesc AS subjectDesc, t3.syllabusName AS syllabusName FROM sbs_relation t1, staffaccounts t2, subjects t3 WHERE t1.staffID=t2.staffID AND t1.subjectID=t3.subjectID AND t1.batchID=\"" . $batchID . "\" and t1.semID=" . $semID . " " . $sqlTutor . " $cond ORDER BY subjectID ASC";
        }
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * @param $courseTypeId
     * @return Object
     * @throws ProfessionalException
     */
    public function getAllSubjectsByCourseTypeId($courseTypeId)
    {
        $courseTypeId = (int) $this->realEscapeString($courseTypeId);
        if (empty($courseTypeId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_COURSE_TYPE_ID, "Invalid course type details given");
        }
        $sql = "SELECT DISTINCT subjectID as id, subjectName as name,subjectDesc description
                FROM subjects s
                INNER JOIN course_type ct on s.courseTypeID = ct.courseTypeID
                WHERE ct.courseTypeID = $courseTypeId";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $name
     * @return Object
     * @throws ProfessionalException
     */
    public function searchSubjectByString($name)
    {
        $name = $this->realEscapeString($name);
        $sql = "SELECT * FROM(SELECT CONCAT(subjectName,' ',subjectDesc) AS name FROM subjects) AS subjectName WHERE name LIKE '%$name%'";
        try {
            $response = $this->executeQueryForList($sql);
            $response = CommonUtil::decodeHtmlSpecialChars($response);
            return $response;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $batchId
     * @param $semId
     * @param $subjectCategory
     * @return array|Object
     * @throws ProfessionalException
     */
    public function getSubjectsByCategoryBatchSem($batchId, $semId, $subjectCategory)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectCategory = $this->realEscapeString($subjectCategory);
        $subjects = [];
        $sql = "SELECT DISTINCT s.subjectName, s.subjectDesc FROM sbs_relation sbs INNER JOIN subjects s ON (s.subjectID = sbs.subjectID) INNER JOIN subject_category sc ON (sc.subjectcatID = s.subjectcatID) WHERE sc.subjectcatName = '$subjectCategory' AND sbs.batchID = $batchId AND sbs.semID = $semId ";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * @param $secondLanguageID
     */
    public function getSecondlanguageDetailsByID($secondLanguageID)
    {
        $secondLanguageID = $this->realEscapeString($secondLanguageID);
        $sql = "select secondlangaugeID, secondLangaugeName, secondLangaugedesc, showforadmission, secondLangaugeCode from secondLangauge where secondlangaugeID='$secondLanguageID'; ";
        try {
            $secondLanguage = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $secondLanguage;
    }
    /**
     * get supplementery exams of a student
     *
     * @param [type] $studentID
     * @param [type] $semID
     * @param [type] $subjectID
     * @param [type] $courseType
     * @return void
     */
    public function getSupplementeryExamSubjectBySubjectIDStudentIDandCourseType($studentID, $semID, $courseType)
    {
        if ($courseType == "UG")
            $markTable = "exammarks_external";
        elseif ($courseType == "PG")
            $markTable = "externalexammarks_finalized";
        $sql = "SELECT
            esss.id,es.supplyDesc,e.examID,e.examName,e.subjectID,e.examTotalMarks,sub.subjectName,em.mark,sub.subjectDesc,intr.internalMarks, ims.maxInternalMarks,em.id
        FROM
            exam_supplementary_student_subjects esss
        INNER JOIN exam e ON esss.examID = e.examID
        inner JOIN exam_supplementary es ON esss.exam_supplementary_id = es.id
        inner JOIN internal_marks intr on esss.studentID = intr.studentID and e.subjectID = intr.subjectID and intr.semID = es.semID
        inner JOIN internal_marks_settings ims on es.semID = ims.semID and e.subjectID = ims.subjectID and intr.batchID = ims.batchID
        left JOIN exammarks_external em ON em.examID = e.examID AND esss.studentID = em.studentID
        left JOIN subjects sub ON sub.subjectID = e.subjectID
        WHERE esss.studentID= '$studentID' AND es.semID='$semID' group by em.id;";
        try {
            $supplementery = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $supplementery;
    }
    /**
     * get subjectId of specific subject group of a student
     *
     * @param [type] $studentID
     * @param [type] $batchId
     * @param [type] $semId
     * @param [type] $subjectgroupId
     * @return [type] $subjectId
     *
     */
    public function getStudentSubjectIDBySubjectGroupID($studentId, $batchId, $semId, $subjectgroupId)
    {
        $studentId = $this->realEscapeString($studentId);
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectgroupId = $this->realEscapeString($subjectgroupId);
        $sql = "";
        $sql = " SELECT  sublist.subjectID from (SELECT DISTINCT sub.subjectID as subjectId,sub.subjectName,sub.subjectDesc, ssbs.subbatchID, sub.subjectcatID FROM
        pseudosubjects_students pss
        INNER JOIN pseudosubjects_sbs psbs ON psbs.pseudosubjectID = pss.pseudosubjectID AND pss.studentID = $studentId
        INNER JOIN sbs_relation sbs ON sbs.sbsID=psbs.sbsID AND sbs.batchID = $batchId AND sbs.semID = $semId
        INNER JOIN subjects sub ON sbs.subjectID = sub.subjectID
        INNER JOIN subbatch_sbs ssbs ON (sbs.sbsID = ssbs.sbsID) WHERE sub.subjectName NOT IN (\"" . Subject::TUTOR_SUBJECT . "\")
        UNION
        SELECT DISTINCT sub.subjectID as subjectId,sub.subjectName,sub.subjectDesc , sbsbs.subbatchID, sub.subjectcatID FROM  subbatch_student sbst
        INNER JOIN subbatch_sbs sbsbs ON sbsbs.subbatchID = sbst.subbatchID AND sbst.studentID = $studentId
        INNER JOIN sbs_relation sbs ON sbsbs.sbsID = sbs.sbsID AND sbs.batchID = $batchId AND sbs.semID = $semId
        INNER JOIN subjects sub ON sub.subjectID = sbs.subjectID WHERE sub.subjectName NOT IN (\"" . Subject::TUTOR_SUBJECT . "\")
        UNION
        SELECT DISTINCT sub.subjectID as subjectId,sub.subjectName,sub.subjectDesc, null, sub.subjectcatID FROM subjects sub
        INNER JOIN sbs_relation sbs ON sbs.subjectID = sub.subjectID
        WHERE sub.subjectName NOT IN (\"" . Subject::TUTOR_SUBJECT . "\") AND sbs.sbsID NOT IN (SELECT sbsID FROM subbatch_sbs) AND sbs.batchID = $batchId AND sbs.semID = $semId AND sbs.isPseudosubject = 0) as sublist
        INNER JOIN  subjectGroups_subjects grpsub on grpsub.subjects_id = sublist.subjectId AND grpsub.batches_id = $batchId and grpsub.semesters_id = $semId and grpsub.subjectGroups_id = $subjectgroupId
 ";
        try {
            $subjectId = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectId;
    }
    /**
     * Get subject by sbsId
     * @param Integer $sbsId
     * @return Object $subjectDetails
     * @author Vishnu M
     */
    public function getSubjectBySbsId($sbsId)
    {
        $subjectDetails = null;
        $sbsId = $this->realEscapeString($sbsId);
        try {
            $sql = "SELECT s.subjectID, s.subjectName,s.subjectDesc, s.subjectcatID, sc.subjectcatName, s.subjectDesc, s.deptID FROM subjects s INNER JOIN sbs_relation sbs ON s.subjectID = sbs.subjectID LEFT JOIN subject_category sc on sc.subjectcatID = s.subjectcatID WHERE sbs.sbsID = '$sbsId";
            $subjectDetails = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * get subjects
     * @param com\linways\core\ams\professional\request\SearchSubjectRequest $request
     * @param boolean $includeFailedBatch
     * @return array
     * @throws ProfessionalException
     */
    public function getSubjectsByRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $semId = $request->semID;
        $batchId = $request->batchId;
        $examTypeId = $request->examTypeId;
        $subjectCatId = $request->subjectCatId;
        $examType = $request->examType;
        $examRegId = $request->examRegId;
        $subjects = [];
        $innerJoinTables = "";
        $whereConditions = "";
        if ($semId || $batchId || $examTypeId || ($examRegId && $examType)) {
            $innerJoinTables .= " INNER JOIN
            sbs_relation sbsr ON sbsr.subjectID = s.subjectID";
            if ($semId) {
                $whereConditions .= " AND sbsr.semID IN ($semId)";
            }
            if ($batchId) {
                $whereConditions .= " AND sbsr.batchID IN ($batchId)";
            }
            if ($examTypeId || ($examRegId && $examType)) {
                $innerJoinTables .= " INNER JOIN
                exam e ON e.subjectID = s.subjectID
                AND e.batchID = sbsr.batchID
                AND e.semID = sbsr.semID";
                if ($examTypeId) {
                    $whereConditions .= " AND e.examTypeID IN ($examTypeId)";
                }
                if ($examRegId && $examType) {
                    if ($examType == ExamType::REGULAR) {
                        $whereConditions .= " AND e.examregID IN ($examRegId)";
                    } else if ($examType == ExamType::SUPPLY) {
                        $whereConditions .= " AND e.supply_examreg_id IN ($examRegId)";
                    }
                }
            }
        }
        if ($subjectCatId) {
            $whereConditions .= " AND s.subjectcatID IN ($subjectCatId)";
        }
        if($request->examDate){
            $whereConditions .= " AND e.examDate IN ('$request->examDate')";
        }
        if($request->examTime){
            $whereConditions .= " AND concat(e.examStartTime ,' - ',e.examEndTime) IN ('$request->examTime')";
        }
        $sql = "SELECT DISTINCT
            s.subjectID AS id,
            s.subjectName AS name,
            s.subjectDesc AS description,
            s.syllabusName
        FROM
            subjects s
            $innerJoinTables
        WHERE 1 = 1 $whereConditions ORDER BY s.subjectName ASC";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * @param GetSubjectCategoriesRequest $request
     * @return Object
     * @throws ProfessionalException
     */
    public function searchSubjectCategories(GetSubjectCategoriesRequest $request)
    {
        $request = $this->realEscapeObject($request);
        $sql = "SELECT DISTINCT sg.id as subjectCategoryId,sg.name as subjectCategoryName,sg.code as categoryCode,sg.priority
                FROM subjectGroups sg
                INNER JOIN subjectGroups_subjects sgs ON sgs.subjectGroups_id = sg.id
                INNER JOIN batches b ON b.batchID = sgs.batches_id
                INNER JOIN semesters s ON s.semID = sgs.semesters_id
                WHERE 1=1 ";
        if (!empty($request->batchId)) {
            $sql .= " AND sgs.batches_id =$request->batchId ";
        }
        if (!empty($request->semesterId)) {
            $sql .= " AND sgs.semesters_id = $request->semesterId ";
        }
        if (!empty($request->subjectCategoryCode)) {
            $sql .= " AND sg.code = '$request->subjectCategoryCode";
        }
        if (!empty($request->subjectCategoryId)) {
            $sql .= " AND sg.id = $request->subjectCategoryId ";
        }
        if (!empty($request->subjectId)) {
            $sql .= " AND sgs.subjects_id IN ( " . implode(",", $request->subjectIds) . ")";
        }
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param SearchSubjectsWithSubjectCategoriesRequest $request
     * @return Object
     * @throws ProfessionalException
     */
    public function searchSubjectsWithSubjectCategories(SearchSubjectsWithSubjectCategoriesRequest $request)
    {
        $request = $this->realEscapeObject($request);
        $joinCondition = "";
        $whereCondition = "";
        $tutorConstant = SubjectConstants::TUTOR_SUBJECT;
        if (!empty($request->batchId)) {
            $joinCondition .= " AND sr.batchID =$request->batchId ";
        }
        if (!empty($request->semesterId)) {
            $joinCondition .= " AND sr.semID=$request->semesterId ";
        }
        if (!empty($request->subjectIds)) {
            $joinCondition .= " AND sr.subjectID IN ( " . implode(",", $request->subjectIds) . ")";
            $whereCondition .= " AND s.subjectID IN ( " . implode(",", $request->subjectIds) . ")";
        }
        $sql = "SELECT DISTINCT s.subjectID,s.subjectName,s.subjectDesc, s.syllabusName, sg.id as subjectGroupId,sg.name as subjectGroupName,
                    sg.code as subjectGroupCode,s.subjectPriority
                FROM subjects s
                INNER JOIN sbs_relation sr ON sr.subjectID = s.subjectID $joinCondition
                LEFT JOIN subjectGroups_subjects sgs ON sgs.subjects_id = s.subjectID AND sgs.batches_id = sr.batchID
                    AND sgs.semesters_id =sr.semID
                LEFT JOIN subjectGroups sg ON sg.id =sgs.subjectGroups_id
                WHERE 1=1 AND s.hide=0 AND s.subjectName !='$tutorConstant$whereCondition";
        try {
            return $this->executeQueryForList($sql, $this->mapper[SubjectServiceMapper::SEARCH_SUBJECTS_WITH_CATEGORIES]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param null $subjectId
     * @return Object
     * @throws ProfessionalException
     * @author Vishnu M
     */
    public function getAllSubjectHandlingDepartments($subjectId = NULL)
    {
        $subjectId = $this->realEscapeString($subjectId);
        $condition = null;
        if ($subjectId) {
            $condition .= " AND s.subjectID = '$subjectId";
        }
        $sql = null;
        try {
            $sql = "SELECT DISTINCT d.deptID AS id, d.deptName AS name, d.departmentDesc AS description
                    FROM subjects s
                    INNER JOIN department d ON s.hdl_deptID = d.deptID $condition ORDER BY d.deptName ASC";
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param HandlingDepartmentSubjectRequest $handlingDepartmentSubjectRequest
     * @return Object
     * @throws ProfessionalException
     * @author anoop
     */
    public function getAllHandlingDepartmentSubjectsOfExamRegistration($handlingDepartmentSubjectRequest)
    {
        $handlingDepartmentSubjectRequest = $this->realEscapeObject($handlingDepartmentSubjectRequest);
        $sql = null;
        $sqlCondition = null;
        if ($handlingDepartmentSubjectRequest->examRegId) {
            $examRegIdString = implode(',', $handlingDepartmentSubjectRequest->examRegId) ? implode(',', $handlingDepartmentSubjectRequest->examRegId) : $handlingDepartmentSubjectRequest->examRegId;
            $sqlCondition = " er.examregID IN ($examRegIdString";
        } else {
            throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, 'Exam id can not be null');
        }
        if ($handlingDepartmentSubjectRequest->semId) {
            $semIdString = implode(',', $handlingDepartmentSubjectRequest->semId) ? implode(',', $handlingDepartmentSubjectRequest->semId) : $handlingDepartmentSubjectRequest->semId;
            $sqlCondition .= " AND erb.semID IN ($semIdString";
        }
        try {
            $sql = "SELECT DISTINCT
            s.subjectID,
            s.subjectName,
            s.subjectDesc,
            d.deptID,
            d.deptName,
            d.departmentDesc,
            er.examregID,
            er.examregName,
            er.examregDesc,
            er.examMonth,
            er.examYear,
            CONCAT(MONTHNAME(CONCAT(er.examYear,'-',er.examMonth,'-','01')),' ',er.examYear) AS examMonthYear,
            sbsr.semID
        FROM
            exam_registration er
                INNER JOIN
            exam_registration_batches erb ON erb.examregID = er.examregID
                INNER JOIN
            batches b ON b.batchID = erb.batchID
                INNER JOIN
            department d ON d.deptID = b.deptID
                INNER JOIN
            sbs_relation sbsr ON sbsr.batchID = b.batchID
                AND sbsr.semID = erb.semID
                INNER JOIN
            subjects s ON s.subjectID = sbsr.subjectID
                AND s.hdl_deptID = d.deptID
        WHERE
            $sqlCondition";
            $subjects = $this->executeQueryForList($sql, $this->mapper[SubjectServiceMapper::GET_REGULAR_EXAM_REGISTRATION_SUBJECTS_OF_HANDLING_DEPARTMENT]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     *
     * Method for getting paper type  by name
     * @param paperTypeName
     * @return Object|null $paperType object
     * @throws ProfessionalException
     * @author Kishan
     */
    public function getPaperTypeByName($paperTypeName)
    {
        $paperType = null;
        $paperTypeName = $this->realEscapeObject($paperTypeName);
        $sql = "select * from subjectPaperType where paperTypeName = '$paperTypeName'";
        try {
            $paperType = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $paperType;
    }
    /**
     *
     * Method for getting second language by name
     * @param secondLanguageName
     * @return Object|null $secondLanguage object
     * @throws ProfessionalException
     * @author Kishan
     */
    public function getSecondLanguageByName($secondLanguageName)
    {
        $secondLanguage = null;
        $secondLanguageName = $this->realEscapeObject($secondLanguageName);
        $sql = "SELECT * FROM secondLangauge WHERE secondLangaugeName = '$secondLanguageName'";
        try {
            $secondLanguage = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $secondLanguage;
    }
    /**
     *
     * Method for inserting subjects from excel
     * @param SubjectExcelImport $excelData
     * @return array
     * @throws ProfessionalException
     *
     * @author Kishan
     */
    public function insertSubjectFromExcel($excelData)
    {
        $excelData = $this->realEscapeObject($excelData);
        $error_arr = array();
        $updateConditions = null;
        $insertFields = null;
        $insertValues = null;
        //$response = null;
        if (!$excelData->subjectCode) {
            array_push($error_arr, 'Subject Code is mandatory!');
        }
        if ($excelData->subjectName) {
            $insertFields .= ',subjectDesc';
            $insertValues .= ",'" . $excelData->subjectName . "'";
            $updateConditions .= ",subjectDesc = '" . $excelData->subjectName . "'";
        }
        if (($excelData->isTheory == 0 || $excelData->isTheory == 1) && $excelData->isTheory != "") {
            $insertFields .= ',isTheory';
            $insertValues .= ',' . $excelData->isTheory;
            $updateConditions .= ',isTheory = ' . $excelData->isTheory;
        }
        if ($excelData->paperType) {
            $paperType = SubjectService::getInstance()->getPaperTypeByName($excelData->paperType);
            if ($paperType) {
                $insertFields .= ',paperTypeId';
                $insertValues .= ',' . $paperType->id;
                $updateConditions .= ',paperTypeId = ' . $paperType->id;
            } else {
                array_push($error_arr, 'Paper Type not found in system');
            }
        }
        if (!$excelData->syllabusYear) {
            array_push($error_arr, 'Syllabus Year is mandatory for ' . $excelData->subjectCode);
        } else {
            $insertFields .= ',syllabusYear';
            $insertValues .= ',' . $excelData->syllabusYear;
            $updateConditions .= ',syllabusYear = ' . $excelData->syllabusYear;
        }
        if ($excelData->subjectPriority) {
            $insertFields .= ',subjectPriority';
            $insertValues .= ',' . $excelData->subjectPriority;
            $updateConditions .= ',subjectPriority = ' . $excelData->subjectPriority;
        }
        if ($excelData->subjectCategory) {
            $subjectCategory = SubjectService::getInstance()->getSubjectCategoryByName($excelData->subjectCategory);
            if ($subjectCategory) {
                $insertFields .= ',subjectcatID';
                $insertValues .= ',' . $subjectCategory->subjectCatId;
                $updateConditions .= ',subjectcatID = ' . $subjectCategory->subjectCatId;
            } else {
                array_push($error_arr, 'Subject Category not found in system');
            }
        }
        if ($excelData->courseType) {
            $courseType = CourseTypeService::getInstance()->getcourseTypeByName($excelData->courseType);
            if ($courseType) {
                $insertFields .= ',courseTypeID';
                $insertValues .= ',' . $courseType->courseTypeID;
                $updateConditions .= ',courseTypeID = ' . $courseType->courseTypeID;
            } else {
                array_push($error_arr, 'Course Type not found in system');
            }
        }
        if ($excelData->noOfModules) {
            $insertFields .= ',no_of_modules';
            $insertValues .= ',' . $excelData->noOfModules;
            $updateConditions .= ',no_of_modules = ' . $excelData->noOfModules;
        }
        if ($excelData->handlingDepartment) {
            $handlingDepartment = DepartmentService::getInstance()->getDepartmentByCode($excelData->handlingDepartment);
            if ($handlingDepartment) {
                $insertFields .= ',hdl_deptID';
                $insertValues .= ',' . $handlingDepartment->id;
                $updateConditions .= ',hdl_deptID = ' . $handlingDepartment->id;
                $insertFields .= ',deptID';
                $insertValues .= ',' . $handlingDepartment->id;
                $updateConditions .= ',deptID = ' . $handlingDepartment->id;
            } else {
                array_push($error_arr, 'Department not found in system');
            }
        }
        if ($excelData->secondLanguage) {
            $secondLanguage = SubjectService::getInstance()->getSecondLanguageByName($excelData->secondLanguage);
            if ($secondLanguage) {
                $insertFields .= ',secondLangaugeId';
                $insertValues .= ',' . $secondLanguage->secondlangaugeID;
                $updateConditions .= ',secondLangaugeId = ' . $secondLanguage->secondlangaugeID;
            } else {
                array_push($error_arr, 'Second language not found in system');
            }
        }
        $existingSubject = SubjectService::getInstance()->getSubjectByCodeAndYear($excelData->subjectCode, $excelData->syllabusYear);
        if ($existingSubject) {
            $sql = "UPDATE subjects SET subjectName = '$excelData->subjectCode" . $updateConditions . " WHERE subjectID = '$existingSubject->subjectID'";
            $subjectID = $existingSubject->subjectID;
        } else {
            $sql = "INSERT INTO subjects (subjectName $insertFields) VALUES ('$excelData->subjectCode$insertValues)";
        }
        //Checking validation.If required fields are missing in the input excel throw the exception
        if (!empty($error_arr)) {
            throw new ProfessionalException(ProfessionalException::IMPORT_SUBJECT_VALIDATION_ERROR, "Import subject failed due to validation.please check the exception data to get more details.", $error_arr);
        }
        //If validation success go ahead with DB updation
        try {
            $subjectID = $this->executeQueryForObject($sql, true);
            if (!$subjectID) {
                $subjectID = $existingSubject->subjectID;
            }
            if (($excelData->semester) && ($subjectID)) {
                $sql = "DELETE FROM subject_sem_relation WHERE subjectID = $subjectID";
                $this->executeQueryForObject($sql);
                $semNameArr = explode(',', $excelData->semester);
                foreach ($semNameArr as $semesterName) {
                    $semester = SemesterService::getInstance()->getSemesterByName($semesterName);
                    if ($semester) {
                        $sql = "INSERT INTO subject_sem_relation (subjectID,semID,created_by,created_date,updated_by,updated_date) values ($subjectID,$semester->id,$excelData->createdBy,utc_timestamp(),$excelData->updatedBy,utc_timestamp())";
                        $this->executeQueryForObject($sql);
                    } else {
                        array_push($error_arr, 'Semester invalid for ' . $excelData->subjectCode);
                    }
                }
            }
            if (($excelData->subjectDepartment) && ($subjectID)) {
                $sql = "DELETE FROM sd_relation WHERE subjectID = $subjectID";
                $this->executeQueryForObject($sql);
                $subjectDepartmentArr = explode(',', $excelData->subjectDepartment);
                foreach ($subjectDepartmentArr as $deptName) {
                    $department = DepartmentService::getInstance()->getDepartmentByCode($deptName);
                    if ($department) {
                        $sql = "INSERT INTO sd_relation (subjectID,deptID,createdBy,createdDate,updatedBy,updatedDate) values ($subjectID,$department->id,$excelData->createdBy,utc_timestamp(),$excelData->updatedBy,utc_timestamp())";
                        $this->executeQueryForObject($sql);
                    } else {
                        array_push($error_arr, 'Department invalid for ' . $excelData->subjectCode);
                    }
                }
            }
            //Checking validation.If required fields are missing in the input excel throw the exception
            if (!empty($error_arr)) {
                throw new ProfessionalException(ProfessionalException::IMPORT_SUBJECT_VALIDATION_ERROR, "Import subject failed due to validation.please check the exception data to get more details.", $error_arr);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage(), $error_arr);
        }
        return $error_arr;
    }
    /**
     *
     * Method for fetching the subject with subject code and syllabus year
     * @param subjectCode, syllabusYear
     * @return Object|null
     * @throws ProfessionalException
     *
     * @author Kishan
     */
    public function getSubjectByCodeAndYear($subjectCode, $syllabusYear = null )
    {
        $subject = null;
        $subjectCode = $this->realEscapeObject($subjectCode);
        $syllabusYear = $this->realEscapeObject($syllabusYear);
        $condition="";
        if($syllabusYear){
            $condition .= " AND syllabusYear = '$syllabusYear'";
        }
        $sql = "select * from subjects where subjectName = '$subjectCode$condition";
        try {
            $subject = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subject;
    }
    /**
     * Get all subjects by department id and semester id
     *
     * @param $departmentId
     * @param $semesterId
     * @return Object
     * @throws ProfessionalException
     * @author jithinvijayan
     */
    public function getAllSubjectsByDepartmentAndSemester($departmentId = null, $semesterId = null)
    {
        $condition = "";
        if (!empty($departmentId)) {
            $condition .= " AND sdr.deptID = $departmentId ";
        }
        if (!empty($semesterId)) {
            $condition .= " AND ssr.semID = $semesterId ";
        }
        $sql = "SELECT DISTINCT s.subjectID as id, s.subjectName as name, s.subjectDesc as description
                FROM subjects s
                INNER JOIN sd_relation sdr ON sdr.subjectID = s.subjectID
                INNER JOIN subject_sem_relation ssr ON ssr.subjectID = s.subjectID
                WHERE s.hide=0  $condition
                ORDER BY s.subjectName ";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * returns subjects syllabus years by department ids.
     *
     * @param $departmentIds
     * @return Object
     * @throws ProfessionalException
     * @author jithinvijayan
     */
    public function getAllSyllabusYearsByDepartmentIds($departmentIds)
    {
        if (count($departmentIds) === 0) {
            throw new ProfessionalException(ProfessionalException::INVALID_DEPARTMENT_IDS, "Select at least one department to continue");
        }
        try {
            $sql = "SELECT DISTINCT syllabusYear
                    FROM subjects WHERE hdl_deptID IN (" . implode(",", $departmentIds) . ")
                    AND hide=0 AND isSubjectHide=0 AND syllabusYear IS NOT NULL";
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @return Object
     * @throws ProfessionalException
     * @author jithinvijayan
     */
    public function getAllSubjectGroups()
    {
        $sql = "SELECT id,name,code FROM subjectGroups ORDER BY name";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $batchId
     * @param $semId
     * @param int $groupId
     * @return Object
     * @throws ProfessionalException
     */
    public function getSubjectGroupSubjectsByBatchSem($batchId, $semId, $groupId = 0)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $groupId = $this->realEscapeString($groupId);
        try {
            $sql = "SELECT
                sgs.id,
                sgs.subjectGroups_id AS subjectGroupId,
                sgs.batches_id AS batchId,
                sgs.semesters_id AS semId,
                sgs.subjects_id AS subjectId,
                ecscg.id AS ec_subCatGroupId,
                ecscg.name AS ec_subCatName,
                ecscg.description AS ec_subCatDesc
            FROM
                subjectGroups_subjects sgs
                LEFT JOIN ec_subject_category_group ecscg ON ecscg.id = sgs.ec_subject_cat_group_id
            WHERE
            sgs.batches_id = " . $batchId . "
                        AND sgs.semesters_id = " . $semId . "
                        AND sgs.subjectGroups_id = " . ($groupId ? $groupId : 0) . "
                ORDER BY sgs.id";
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get subject details in a sem of a batch
     * @param int $semId
     * @param int $batchId
     * @return $objectList[]
     * @throws AMSException
     */
    public function getSubjectsBySem($semId, $batchId,$subCatId = NULL)
    {
        $cond = '';
        if($subCatId)
            $cond .= " AND  t2.subjectcatID = $subCatId ";
        $sql = "SELECT DISTINCT(t1.subjectID) as id,
            t2.subjectName as name,
            t2.subjectDesc as description,
            t2.syllabusName,t2.subjectPriority as priority,
            t2.hdl_deptID as hdlDeptId from sbs_relation t1, subjects t2 where  t2.subjectID=t1.subjectID and t2.subjectName not in (\"" . Subject::TUTOR_SUBJECT . "\")  and t1.batchID=$batchId and t1.semID=$semId $cond ";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
     /**
     * @param $subjectId
     * @return Object
     * @throws ProfessionalException
     */
    public function getBasicSubjectDetailsBySubjectId($subjectId)
    {
        $subjectId = $this->realEscapeString($subjectId);
        if (empty($subjectId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_SUBJECT_ID, "Invalid subject details given");
        }
        $sql = "SELECT subjectID as subjectId,subjectName FROM subjects
                WHERE subjectID = $subjectId";
        try {
            $response = $this->executeQueryForObject($sql);
            $response = CommonUtil::decodeHtmlSpecialChars($response);
            return $response;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $request
     * @return Object
     * @throws ProfessionalException
     * @author jithinvijayan
     * @deprecated
     */
    public function getAllCourseMaterials($request)
    {
        $request = $this->realEscapeObject($request);
        $currentStaff = $request->currentStaffID ? ", IF(sa.staffID=" . $request->currentStaffID . ",'Me', sa.staffName) as staffName " : ", sa.staffName ";
        $condition = $request->currentStaffID ? " and cm.staffID <> " . $request->currentStaffID . " " : "";
        $condition .= $request->subjectID ? " and cm.subjectID=" . $request->subjectID . " " : "";
        $condition .= $request->documentID ? " and cm.materialID=" . $request->documentID . " " : "";
        $sql = "SELECT cm.materialID, cm.materialName, cm.materialUploadtime, cm.materialTopic, cm.materialDocPath,
                cm.materialPdfPath, cm.materialImgPath, cm.materialSwfPath, cm.materialDesc, cm.batchID, cm.subjectID,
                cm.semID $currentStaff
                FROM course_material cm
                INNER JOIN staffaccounts sa ON sa.staffID=cm.staffID
                where cm.sharedoc=1 $condition ;";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $request
     * @param $oldCourseMaterial
     * @return bool
     * @throws ProfessionalException
     */
    public function copyCourseMaterials($request, $oldCourseMaterial)
    {
        $request = $this->realEscapeObject($request);
        $oldCourseMaterial = $this->realEscapeObject($oldCourseMaterial);
        try {
            $sql = "INSERT INTO course_material (materialName,materialDocPath,materialPdfPath,materialImgPath,
                            materialSwfPath,materialDesc,materialTopic,staffID,batchID,subjectID,semID)
                    VALUES('$oldCourseMaterial->materialName','$oldCourseMaterial->materialDocPath',
                    '$oldCourseMaterial->materialPdfPath','$oldCourseMaterial->materialImgPath',
                    '$oldCourseMaterial->materialSwfPath','$oldCourseMaterial->materialDesc',
                    '$oldCourseMaterial->materialTopic','$request->currentStaffID','$request->batchID',
                    '$request->subjectID','$request->semID')";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return true;
    }
    /**
     * Get subjects to assign credits  - subject-wise
     * @param $request
     * @return Object|null
     * @throws ProfessionalException
     * @author Vishnu M
     */
    public function getSubjectToAssignCredits($request)
    {
        $request = $this->realEscapeObject($request);
        $sqlCondition = null;
        if ($request->subjectCategory) {
            $sqlCondition = " AND s.subjectcatID = '$request->subjectCategory";
        }
        $sql = null;
        $subjects = null;
        try {
            $sql = "SELECT
                        s.subjectID AS id,
                        s.subjectName AS name,
                        s.subjectDesc AS description,
                        s.isTheory,
                        esc.excludeSubjectFromTotal,
                        esc.isInternal,
                        esc.isExternal,
                        esc.subjectType,
                        esc.credit
                    FROM
                        subjects s
                            INNER JOIN
                        sbs_relation sbs ON (s.subjectID = sbs.subjectID)
                            INNER JOIN
                        batches b ON (b.batchID = sbs.batchID)
                            LEFT JOIN
                        exam_subjectcredit esc ON (esc.batchID = sbs.batchID
                            AND esc.semID = sbs.semID
                            AND esc.subjectID = sbs.subjectID)
                    WHERE
                        b.batchStartYear = '$request->batchStartYear'
                            AND sbs.semID = '$request->semId'
                            AND b.courseTypeID = '$request->courseTypeId'
                            $sqlCondition
                    GROUP BY s.subjectID
                    ORDER BY s.subjectName ASC, s.subjectDesc ASC";
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * @param $subject
     * @throws ProfessionalException
     * @author Vishnu M
     */
    public function saveSubjectsCredit($subject)
    {
        $subject = $this->realEscapeObject($subject);
        $sql = null;
        $subject->isInternal = $subject->isInternal == 'true' ? 1 : 0;
        $subject->isExternal = $subject->isExternal == 'true' ? 1 : 0;
        $subject->excludeSubjectFromTotal = $subject->excludeSubjectFromTotal == 'true' ? 1 : 0;
        $subject->hideGrade = 0;
        $subject->subjectOrder = 'NULL';
        try {
            $sql = "INSERT INTO exam_subjectcredit (batchID, semID, subjectID, credit, isInternal, isExternal, hideGrade, excludeSubjectFromTotal, subjectType, subjectOrder)
                SELECT
                    sbs.batchID, sbs.semID, sbs.subjectID,
                    '$subject->credit',
                    '$subject->isInternal',
                    '$subject->isExternal',
                    '$subject->hideGrade',
                    '$subject->excludeSubjectFromTotal',
                    '$subject->subjectType',
                    $subject->subjectOrder
                FROM
                    sbs_relation sbs
                        INNER JOIN
                    batches b ON (b.batchID = sbs.batchID)
                WHERE
                    b.batchStartYear = '$subject->batchStartYear'
                        AND sbs.semID = '$subject->semId'
                        AND b.courseTypeID = '$subject->courseTypeId'
                        AND sbs.subjectID = '$subject->id'
                ON DUPLICATE KEY UPDATE
                    credit = VALUES(credit),
                    isInternal = VALUES(isInternal),
                    isExternal = VALUES(isExternal),
                    hideGrade = VALUES(hideGrade),
                    excludeSubjectFromTotal = VALUES(excludeSubjectFromTotal),
                    subjectType = VALUES(subjectType)";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @return List of Object
     * @throws ProfessionalException
     */
    public function getSubjectGroupSubjectType($id = NULL)
    {
        $id = $this->realEscapeObject($id);
        $sqlCondition = "";
        if ($id) {
            $sqlCondition .= " AND sg.id = $id ";
        }
        $sql = "SELECT
            sg.id,
            sg.name,
            GROUP_CONCAT(DISTINCT esc.subjectType) AS subjectTypes
        FROM
            subjectGroups sg
        INNER JOIN subjectGroups_subjects sgs ON
            sgs.subjectGroups_id = sg.id
        INNER JOIN exam_subjectcredit esc ON
            esc.batchID = sgs.batches_id
            AND esc.semID = sgs.semesters_id
            AND esc.subjectID = sgs.subjects_id
        WHERE
            sg.id = sg.id
            $sqlCondition
        GROUP BY
            sg.id";
        try {
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getSubjectNames($subjectIdStr)
    {
        $sql = '';
        $subjectNames = [];
        $subjectIdStr = $this->realEscapeString($subjectIdStr);
        try {
            $sql = "SELECT s.subjectDesc as subjectDesc,s.subjectName as subjectName,s.syllabusName,s.subjectID as subjectId FROM subjects s WHERE s.subjectID IN ($subjectIdStr)";
            $subjectNames = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new AutonomousException($e->getCode(), $e->getMessage());
        }
        return $subjectNames;
    }
    public function getStudentGroupedSubjects($batchId, $semId, $studentId)
    {
        $sql = null;
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $studentId = $this->realEscapeString($studentId);
        $studentGroupedSubjects = null;
        try {
            $sql = "SELECT GROUP_CONCAT(su.subjectName ORDER BY sg.priority ASC SEPARATOR ', ') AS subjectGroups FROM subjects su INNER JOIN exam_reg_studentsubject erss ON erss.subjectID = su.subjectID INNER JOIN subjectGroups_subjects sgs ON erss.subjectID = sgs.subjects_id INNER JOIN subjectGroups sg ON sg.id = sgs.subjectGroups_id WHERE sgs.batches_id = $batchId AND sgs.semesters_id = $semId AND erss.studentID = $studentId AND sgs.subjectGroups_id IS NOT NULL ORDER BY sg.priority ASC";
            $studentGroupedSubjects = $this->executeQueryForObject($sql)->subjectGroups;
        } catch (\Exception $e) {
            throw new AutonomousException($e->getCode(), $e->getMessage());
        }
        return $studentGroupedSubjects;
    }
    public function getStudentGroupedSubjectsSyllabusName($batchId, $semId, $studentId, $syllabusAndSubjectCode = false)
    {
        $sql = null;
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $studentId = $this->realEscapeString($studentId);
        $studentGroupedSubjects = null;
        $concatString = null;
        if ($syllabusAndSubjectCode) {
            $concatString = "GROUP_CONCAT(CONCAT(su.subjectName,'(',su.syllabusName,')') ORDER BY sg.priority ASC SEPARATOR ', ')";
        } else {
            $concatString = "GROUP_CONCAT(su.syllabusName ORDER BY sg.priority ASC SEPARATOR ', ')";
        }
        try {
            $sql = "SELECT $concatString AS subjectGroups FROM subjects su INNER JOIN exam_reg_studentsubject erss ON erss.subjectID = su.subjectID INNER JOIN subjectGroups_subjects sgs ON erss.subjectID = sgs.subjects_id INNER JOIN subjectGroups sg ON sg.id = sgs.subjectGroups_id WHERE sgs.batches_id = $batchId AND sgs.semesters_id = $semId AND erss.studentID = $studentId AND sgs.subjectGroups_id IS NOT NULL ORDER BY sg.priority ASC";
            $studentGroupedSubjects = $this->executeQueryForObject($sql)->subjectGroups;
        } catch (\Exception $e) {
            throw new AutonomousException($e->getCode(), $e->getMessage());
        }
        return $studentGroupedSubjects;
    }
    public function getGroupedSubjectDetails($batchId, $semId, $subjectId)
    {
        $sql = null;
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        $subjectGroupDetails = null;
        try {
            $sql = "SELECT sgs.subjectGroups_id AS subjectGroupId, sg.name AS groupName FROM subjectGroups_subjects sgs INNER JOIN subjectGroups sg ON sgs.subjectGroups_id = sg.id WHERE sgs.batches_id = " . $batchId . " AND sgs.semesters_id = " . $semId . " AND sgs.subjects_id = " . $subjectId . "";
            $subjectGroupDetails = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new AutonomousException($e->getCode(), $e->getMessage());
        }
        return $subjectGroupDetails;
    }
    /**
     * @param $subjectCode
     * @param $courseTypeId
     * @return mixed
     * @throws ProfessionalException
     */
    public function getSubjectByCode($subjectCode, $subjectDesc = null)
    {
        $subjects = [];
        $sql = "SELECT subjectID, subjectName, subjectDesc, semID, courseTypeID FROM subjects WHERE  subjectName  ='$subjectCode'";
        try {
            $subjects = $this->executeQueryForList($sql);
            if (count($subjects) > 1) {
                $sql = "SELECT subjectID, subjectName, subjectDesc, semID FROM subjects WHERE  subjectName  ='$subjectCode' AND subjectDesc = '$subjectDesc'";
                $subjects = $this->executeQueryForList($sql);
                if (count($subjects) > 1) {
                    return null;
                } else {
                    return $subjects[0];
                }
                return null;
            }
            return $subjects[0];
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get subject details in a sem of a batch in order
     * @param int $semId
     * @param int $batchId
     * @throws AMSException
     * @return $objectList[]
     */
    public function getSubjectsBySemInOrder($semId, $batchId)
    {
        $sql = "SELECT DISTINCT(t1.subjectID) as id,
                    t2.subjectName as name,
                    t2.subjectDesc as description,
                    t2.syllabusName,t2.subjectPriority as priority,
                    t2.hdl_deptID as hdlDeptId
                        from sbs_relation t1
                        inner join subjects t2
                            on  t2.subjectID=t1.subjectID
                        left join exam_subjectcredit esc
                            on esc.subjectID=t2.subjectID AND esc.subjectID = t1.subjectID AND esc.batchID = t1.batchID AND esc.semID = t1.semID 
                                where t2.subjectName not in (\"" . Subject::TUTOR_SUBJECT . "\")
                                and t1.batchID='$batchId'
                                and t1.semID='$semId'
                                order by esc.subjectOrder ASC";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
        }
    }
    /**
     * @param GetPseudoSubjectIdRequest $request
     * @return array|object
     * @throws ProfessionalException
     */
    public function getPseudoSubjectIds(GetPseudoSubjectIdRequest $request)
    {
        $request = $this->realEscapeObject($request);
        $sql = "SELECT ps.pseudoSubjectID as id FROM pseudosubjects ps
                INNER JOIN pseudosubjects_sbs p on ps.pseudosubjectID = p.pseudosubjectID
                INNER JOIN sbs_relation sr on p.sbsID = sr.sbsID
                WHERE 1=1  ";
        if (!empty($request->batchId)) {
            $sql .= " AND sr.batchID  =$request->batchId ";
        }
        if (!empty($request->semesterId)) {
            $sql .= " AND sr.semID =$request->semesterId ";
        }
        if (!empty($request->subjectId)) {
            $sql .= " AND sr.subjectID = $request->subjectId";
        }
        if (!empty($request->staffId)) {
            $sql .= " AND sr.staffID = $request->staffId";
        }
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Method for getting supply subjects by supplyexam reg id,batch,sem
     * @param unknown $subjectList
     * @throws ProfessionalException
     * @return unknown
     * @author Sibin
     */
    public function getSupplySubjectsBySupplyExamRegId($examRegId,$batchId,$semId)
    {
        $examRegId = $this->realEscapeString($examRegId);
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        try{
            $sql = "SELECT DISTINCT(e.subjectID) as id,
                            s.subjectName as name,
                            s.subjectDesc as description,
                            s.syllabusName,
                            s.subjectPriority as priority
                            from exam e
                            inner join subjects s
                                on s.subjectID= e.subjectID
                            inner join exam_subjectcredit esc
                                on esc.subjectID=s.subjectID
                            where e.supply_examreg_id='$examRegId'
                            and e.batchID='$batchId'
                            and e.semID='$semId'
                            order by esc.subjectOrder ASC,s.subjectDesc ASC;";
            $subjectList = $this->executeQueryForList($sql);
        }catch (\Exception $e){
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $subjectList;
    }
    /**
     * Method for getting subject categories of subjects given
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     * @author sibin
     */
    public function getSubjectCategoriesBySubject($subjects)
    {
        $subjectIds="";
        $sql = '';
        $subjectCatDetails = [];
        foreach($subjects as $subject){
            if($subjectIds){
                $subjectIds = $subjectIds.",".$subject;
            }
            else{
                $subjectIds =$subject;
            }
        }
        try {
            $sql = "SELECT distinct(s.subjectcatID) as id ,sc.subjectcatName as name
                        from subjects s
                        inner join subject_category sc
                            on sc.subjectcatID = s.subjectcatID
                        where s.subjectID IN($subjectIds)";
            $subjectCatDetails = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectCatDetails;
    }
      /**
     * Get all subjects from assign rules
     * @param mixed $batchId, $semId
     * @throws ProfessionalException
     */
    public function getSubjectListByBatchIdAndSemId($batchId, $semId)
    {
        try {
            $sql = "SELECT distinct(ss.subjectID) as subjectId,
                        ss.subjectName ,
                        ss.syllabusName ,
                        ss.subjectDesc
                        from sbs_relation sr
                        INNER JOIN subjects ss ON (sr.subjectID = ss.subjectID )
                        INNER JOIN exam_subjectcredit esc ON (sr.subjectID = esc.subjectID
                                                          and sr.batchID = esc.batchID
                                                          and sr.semID = esc.semID )
                        WHERE esc.isInternal = 1
                        AND sr.batchID = $batchId
                        AND sr.semID =$semId
                        ORDER BY esc.subjectOrder asc,ss.subjectID asc";
            $subjectDetails = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectDetails;
    }
     /**
     * @return List of Object
     * get internal subjects
     * @throws ProfessionalException
     */
    public function getSubjectInternalExternalStatus($batchId, $semId, $subjectId)
    {
        $subjectId = $this->realEscapeString($subjectId);
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        try{
            $sql = "SELECT isInternal FROM exam_subjectcredit where subjectID =$subjectId and batchID =$batchId and semID =$semId";
            $subject = $this->executeQueryForList($sql);
        }catch (\Exception $e){
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        return $subject[0];
    }
    public function getBatchSubjectCategoryDetails($batchId, $semId)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        try{
            $sql = "SELECT
                bsscr.id,
                bsscr.batchID AS batchId,
                bsscr.semID AS semId,
                bsscr.subjectID AS subjectId,
                bsscr.subjectcatID AS subjectcatId,
                bsscr.subject_cat_group_id AS subjectCatGroupId,
                scg.name AS subCatGroupName,
                sc.code,
                sc.subjectcatName,
                sc.subjectcatCode,
                sc.subjectcatPriority,
                sc.use_bring_value AS useBringValue,
                sc.parentID AS parentId,
                sc.canShow
            FROM
                batch_sem_subjectCategory_relation bsscr
            INNER JOIN subject_category sc ON
                sc.subjectcatID = bsscr.subjectcatID
            LEFT JOIN ec_subject_category_group scg ON
                scg.id = bsscr.subject_cat_group_id
            WHERE
                bsscr.semID = $semId
                AND bsscr.batchID = $batchId";
            $subjectCategory = $this->executeQueryForList($sql);
        }catch (\Exception $e){
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
        $categoryDetails = [];
        foreach ($subjectCategory as $subjectCat) {
            $categoryDetails[$subjectCat->subjectId] = $subjectCat;
        }
        return $categoryDetails;
    }
     /**
     * Get assigned sbs details of  batchId
     * @param int $batchId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getSbsDetailsByBatchId($batchId)
    {
        $batchId = $this->realEscapeString($batchId);
        $sbsDetails = [];
        $sql_sbs = "SELECT ss.subjectName,sr.subjectID,ss.subjectDesc,sr.semID , bss.subjectcatID, sc.subjectcatName from sbs_relation sr
                        inner JOIN subjects ss ON (sr.subjectID = ss.subjectID )
                        INNER JOIN exam_subjectcredit esc ON esc.batchID = sr.batchID and esc.semID = sr.semID and esc.subjectID = sr.subjectID
                        left JOIN batch_sem_subjectCategory_relation bss ON (bss.batchID = sr.batchID and sr .semID = bss .semID  and sr. subjectID = bss.subjectID) LEFT JOIN subject_category sc on (sc.subjectcatID = bss.subjectcatID) WHERE sr.batchID = $batchId order by sr.semID asc";
        try {
            $sbsDetails = $this->executeQueryForList($sql_sbs);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $sbsDetails;
    }
     /**
     * Get assigned sbs details of  batchId
     * @param int $batchId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function addBatchSemSubjectCategoryRelation($batchId, $subjectList)
    {
        $batchId = $this->realEscapeString($batchId);
        $subjectList = $this->realEscapeObject($subjectList);
        foreach ( $subjectList as $subject){
            $semId = $subject['semId'];
            $subjectId = $subject['subjectId'];
            $subjectCatId = $subject['subjectCatId'];
            $subjectCatId = $subjectCatId ? $subjectCatId : "NULL";
            $sql_subcat = "SELECT subjectID from batch_sem_subjectCategory_relation WHERE subjectID = $subjectId and batchID = $batchId and semID =$semId";
            try {
                $subjectCategory = $this->executeQueryForList($sql_subcat);
                if ( $subjectCategory) {
                    $sql = "UPDATE batch_sem_subjectCategory_relation set subjectcatID=$subjectCatId WHERE subjectID = $subjectId and batchID = $batchId and semID =$semId ";
                }
                else{
                    $sql = "INSERT INTO batch_sem_subjectCategory_relation (batchID, semID, subjectID, subjectcatID) VALUES($batchId$semId$subjectId$subjectCatId)";
                }
                 $this->executeQuery($sql);
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
        }
    }
    /**
     * Get subject details by batchId and subjectCode
     * @param int $subjectCode
     * @param int $batchId
     */
    public function getSubjectByBatchIDAndSubjectCode($subjectCode,$batchId)
    {
        $sql = "SELECT DISTINCT ss.subjectID, ss.subjectName, ss.subjectDesc, sr.semID, ss.courseTypeID from subjects ss inner join sbs_relation sr on (ss.subjectID = sr.subjectID ) where ss.subjectName = '$subjectCode' and sr.batchID ='$batchId';
        ";
        try {
            $subjects = $this->executeQueryForObject($sql);
            return $subjects;
        } catch (\Exception $e) {
        }
    }
    /**
     * Get distinct Subject categpry from batch sem category relation;
     * @param int $semID
     * @param int $batchId
     */
    public function getDistinctSubjectCategory($batchID, $semID)
    {
        $sql = "SELECT bsscr.subjectcatID, sc.subjectcatName, bsscr.subjectID from batch_sem_subjectCategory_relation bsscr INNER JOIN subject_category sc on (bsscr.subjectcatID = sc.subjectcatID ) WHERE bsscr.batchID =$batchID and bsscr.semID =$semID;
        ";
        try {
            $subjectCatList = $this->executeQueryForList($sql);
            return $subjectCatList;
        } catch (\Exception $e) {
        }
    }
    /**
     * Get distinct Subject categpry from batch sem category relation;
     * @param int $semID
     * @param int $batchId
     */
    public function getSubjectCategoryBySubject($batchId, $semId, $subjectId)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        $sql = "SELECT bsscr.subjectcatID, sc.subjectcatName, bsscr.subjectID
                    from batch_sem_subjectCategory_relation bsscr INNER JOIN subject_category sc on (bsscr.subjectcatID = sc.subjectcatID )
                        WHERE bsscr.batchID ='$batchId'
                        and bsscr.semID ='$semId'
                        and bsscr.subjectID ='$subjectId'";
        try {
            $subjectCatList = $this->executeQueryForObject($sql);
            return $subjectCatList;
        } catch (\Exception $e) {
        }
    }
    /**
     * @return List of Object
     * @throws ProfessionalException
     */
    public function getMarklistSubjectGroup($batchId, $semId = NULL)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $sqlCondition = "";
        if ($semId) {
            $sqlCondition .= " AND mgs.semID = $semId ";
        }
        $sql = "SELECT
            mgsd.id,
            mgsd.subjectCode,
            mgsd.subjectTitle,
            mgs.subjects_id AS subjectId,
            mgs.semID AS semId,
            mgs.isPractical
        FROM
            marklist_group_subjects mgs
        INNER JOIN marklist_group_subjects_details mgsd ON
            mgsd.id = mgs.marklist_group_subjects_details_id
        WHERE
            mgs.batchID = $batchId
            $sqlCondition";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        $subjectGroups = [];
        foreach ($subjects as $subject) {
            $subjectGroups[$subject->id]->id = $subject->id;
            $subjectGroups[$subject->id]->subjectCode = $subject->subjectCode;
            $subjectGroups[$subject->id]->subjectTitle = $subject->subjectTitle;
            $subjectGroups[$subject->id]->semId = $subject->semId;
            $subjectGroups[$subject->id]->subjects[$subject->subjectId]->subjectId = $subject->subjectId;
            $subjectGroups[$subject->id]->subjects[$subject->subjectId]->isPractical = $subject->isPractical;
            $subjectGroups[$subject->id]->subjectIds[$subject->subjectId] = $subject->subjectId;
        }
        return $subjectGroups;
    }
    public function getBatchSemGroupedSubjectDetails($batchId, $semId)
    {
        $sql = null;
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectGroupDetails = null;
        if(empty($batchId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, 'Batch can not be null');
        }
        if(empty($semId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, 'Semester can not be null');
        }
        try {
            $sql = "SELECT
                sgs.subjects_id AS subjectId,
                sgs.subjectGroups_id AS subjectGroupId,
                sg.priority AS groupPriority,
                sg.code AS groupCode,
                sg.name AS groupName
            FROM
                subjectGroups_subjects sgs
            INNER JOIN subjectGroups sg ON
                sgs.subjectGroups_id = sg.id
            WHERE
                sgs.batches_id = $batchId
                AND sgs.semesters_id = $semId";
            $subjects = $this->executeQueryForList($sql);
            foreach ($subjects as $subject) {
                if (!$subject->subjectGroupId) continue;
                $subjectGroups[$subject->subjectGroupId]->id = $subject->subjectGroupId;
                $subjectGroups[$subject->subjectGroupId]->subjectCode = $subject->groupCode;
                $subjectGroups[$subject->subjectGroupId]->subjectTitle = $subject->groupName;
                $subjectGroups[$subject->subjectGroupId]->semId = $semId;
                $subjectGroups[$subject->subjectGroupId]->subjects[$subject->subjectId]->subjectId = $subject->subjectId;
                $subjectGroups[$subject->subjectGroupId]->subjectIds[$subject->subjectId] = $subject->subjectId;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectGroups;
    }
          /**
     * Get all subjects from assign rules
     * @param mixed $batchId, $semId
     * @throws ProfessionalException
     */
    public function getSubjectListBySbs($batchId, $semId)
    {
        try {
                $sql = "SELECT distinct(ss.subjectID) as subjectId,
                ss.subjectName ,
                ss.syllabusName ,
                ss.subjectDesc
                from sbs_relation sr
                INNER JOIN subjects ss ON (sr.subjectID = ss.subjectID )
                WHERE sr.batchID = $batchId
                AND sr.semID =$semId
                ORDER BY ss.subjectID asc";
            $subjectDetails = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     *
     * Method for getting second language by subjectid
     * @param subjectId
     * @return Object|null $secondLanguage object
     * @throws ProfessionalException
     */
    public function getSecondLanguageBySubjectId($subjectId)
    {
        $secondLanguage = null;
        $subjectId = $this->realEscapeObject($subjectId);
        $sql = "SELECT
            sl.secondlangaugeID AS id,
            sl.secondLangaugeName AS name,
            sl.secondLangaugedesc AS description,
            sl.secondLangaugeCode AS code
        FROM
            subjects s
        INNER JOIN secondLangauge sl ON
            sl.secondLangaugeId = s.secondLangaugeId
        WHERE
            s.subjectID = $subjectId";
        try {
            $secondLanguage = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $secondLanguage;
    }
     /**
     * Get assigned sbs details of  batchId
     * @param int $batchId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function copyBatchSemSubjectCategoryRelation($batchId, $batch)
    {
        $batchId = $this->realEscapeString($batchId);
        $batch = $this->realEscapeObject($batch);
        $subjectData = [];
        $semIds = implode(', ', $batch->selectedSem); ;
        $sql_subcat = "SELECT * from batch_sem_subjectCategory_relation WHERE batchID = $batchId and semID  IN ($semIds)";
        try {
            $subjectCategory = $this->executeQueryForList($sql_subcat);
            if (empty($subjectCategory)){
                return 2;
            }
            foreach ($subjectCategory as $subject){
                $sql_subcat = "SELECT subjectID from batch_sem_subjectCategory_relation WHERE batchID = $batch->toBatchId and subjectID =$subject->subjectID and semID  =$subject->semID";
                $checkingEntry = $this->executeQueryForList($sql_subcat);
                if (!$checkingEntry){
                    $checkingSubject = $this->getSbsDetailsBysubjectBatchAndSem($subject->subjectID , $subject->semID, $batch->toBatchId);
                    if ($checkingSubject){
                        if (empty($subject->subject_cat_group_id)) $subject->subject_cat_group_id = "NULL";
                        $insertQuerry = "INSERT INTO batch_sem_subjectCategory_relation (batchID, semID, subjectID, subjectcatID, subject_cat_group_id) VALUES($batch->toBatchId$subject->semID$subject->subjectID , $subject->subjectcatID$subject->subject_cat_group_id)";
                        $this->executeQuery($insertQuerry);
                    }
                    else{
                        $subjectDetails = $this->getSubject($subject->subjectID);
                        $subjectData[$subject->semID]->subject[$subject->subjectID] = $subjectDetails ;
                    }
                }
            }
            return $subjectData;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get subject details in a sem of a batch
     * @param int $request
     * @return $subjectList[]
     */
    public function getSubjectsByBatchAndSem($request)
    {
        $request = $this->realEscapeObject($request);
        $sql = "SELECT DISTINCT(t1.subjectID) as id,
                    t2.subjectName as name,
                    t2.subjectDesc as description,
                    t2.syllabusName,t2.subjectPriority as priority,
                    e.examID,
                    mss.mappedSemId,
                    mss.mappedSubjectId
                        from sbs_relation t1
                        inner join subjects t2
                            on  t2.subjectID=t1.subjectID
                        inner join exam_subjectcredit esc
                            on esc.subjectID=t2.subjectID and esc.batchID = t1.batchID and esc.semID = t1.semID
                        left join  mapped_semester_subjects mss
                            on mss.batchId = t1.batchID and mss.semId = t1.semID and mss.subjectId = t1.subjectID
                        inner join exam e on e.subjectID = t1.subjectID and e.batchID = t1.batchID and e.semID = t1.semID
                                where t2.subjectName not in (\"" . Subject::TUTOR_SUBJECT . "\")
                                and t1.batchID='$request->batchId'
                                and t1.semID='$request->semId'
                                and esc.isInternal = '$request->isInternal'
                                and esc.isExternal = '$request->isExternal'
                                and e.examregID is NOT NULL
                                order by esc.subjectOrder ASC,t2.subjectDesc ASC";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * map subjects of a sem with previous sem to import marks
     * @param  $request
     */
    public function mapSemesterSubjectsToImportMarks($request)
    {
        $request = $this->realEscapeObject($request);
        $subject = $request->subject;
        $result = false;
        //check if IsExist
        $isExistSql = "SELECT id,mappedSubjectId from mapped_semester_subjects
                        WHERE batchId = '$request->batchId'
                            AND semId = '$request->semId'
                            AND subjectId = '$subject->id'
                            AND mappedSemId = '$subject->mappingSemId'";
        try {
            $isExist = $this->executeQueryForObject($isExistSql);
            } catch (\Exception $e) {
        }
        //if exists the update
        if($isExist){
            $sql = "UPDATE mapped_semester_subjects set mappedSubjectId = $subject->mappedSubjectId ,updated_by = $request->createdBy
                    WHERE batchId = '$request->batchId'
                            AND semId = '$request->semId'
                            AND subjectId = '$subject->id'
                            AND mappedSemId = '$subject->mappingSemId'";
        }
        else{
            $sql = "INSERT into mapped_semester_subjects(batchId,semId,subjectId,mappedSemId,mappedSubjectId,created_by,updated_by)
                    values($request->batchId,$request->semId,$subject->id,$subject->mappingSemId,$subject->mappedSubjectId,$request->createdBy,$request->createdBy)";
        }
        try {
            $this->executeQueryForObject($sql);
            $result = true;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $result;
    }
    /**
     * Get assigned sbs details of a subject
     * @param int $subjectId
     * @param int $semId
     * @param int $batchId
     * @throws ProfessionalException
     */
    public function getSbsDetailsBysubjectBatchAndSem($subjectId, $semId, $batchId)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        $sql = "SELECT sbs.sbsID,sbs.staffID,sbs.batchID,sbs.subjectID,sbs.csID,sbs.semID,sbs.isPseudosubject
                    from sbs_relation sbs where  sbs.batchID='$batchId' AND sbs.semID='$semId' AND sbs.subjectID='$subjectId' order by sbs.sbsID ASC";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Return concatenated subject name separated by commas
     * @param $subjectIds
     * @return mixed
     * @throws ProfessionalException
     */
    public function getConcatenatedSubjectNameBySubjectIds($subjectIds){
        $sql = "SELECT GROUP_CONCAT(subjectName)as name FROM subjects WHERE subjectID IN (" . implode(",", $subjectIds) . ")";
        try {
            return $this->executeQueryForObject($sql)->name;
        } catch (Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Method for getting second language by subjectid
     * @param subjectId
     * @return Object|null $secondLanguage object
     * @throws ProfessionalException
     */
    public function getSecondLanguageDetailsBySubjectId($subjectId)
    {
        $secondLanguage = null;
        $subjectId = $this->realEscapeObject($subjectId);
        $sql = "SELECT
            sl.secondlangaugeID AS id,
            sl.secondLangaugeName AS name,
            sl.secondLangaugedesc AS description,
            sl.secondLangaugeCode AS code,
            s.subjectID as subjectId,
            s.subjectName,
            s.subjectDesc,
            CONCAT(sl.secondLangaugeName,' - ',s.subjectDesc) as secLangName
        FROM
            subjects s
        INNER JOIN secondLangauge sl ON
            sl.secondLangaugeId = s.secondLangaugeId
        WHERE
            s.subjectID = $subjectId";
        try {
            $secondLanguage = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $secondLanguage;
    }
    /**
     *
     * Method for getting second languages by subjectids
     * @param subjectIds
     * @throws ProfessionalException
     */
    public function getSecondLanguagesBySubjectIds($subjectIds)
    {
        $secondLanguages = null;
        $subjectIds = $this->realEscapeString($subjectIds);
        $sql = "SELECT
            sl.secondlangaugeID AS id,
            sl.secondLangaugeName AS name,
            sl.secondLangaugedesc AS description,
            sl.secondLangaugeCode AS code,
            s.subjectID as subjectId,
            s.subjectName,
            s.subjectDesc
        FROM
            subjects s
        INNER JOIN secondLangauge sl ON
            sl.secondLangaugeId = s.secondLangaugeId
        WHERE
            s.subjectID IN($subjectIds)
            order by s.subjectName";
        try {
            $secondLanguages = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $secondLanguages;
    }
    /**
     *
     * Method for getting second languages by subjectids
     * @param subjectIds
     * @throws ProfessionalException
     */
    public function getSubjectDetailsBySubjectIds($subjectIds)
    {
        $subjects = null;
        $subjectIds = $this->realEscapeString($subjectIds);
        $sql = "SELECT
            s.subjectID as subjectId,
            s.subjectName,
            s.subjectDesc
        FROM
            subjects s
        WHERE
            s.subjectID IN($subjectIds)
            order by s.subjectName";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     *
     * Method for getting second language,open course subjects by student
     * @param subjectIds
     * @throws ProfessionalException
     */
    public function getStudentSecLangExamSubjectByRequest($request)
    {
        $subjects = null;
        $request = $this->realEscapeObject($request);
        $condition = "";
        if($request->secondLangFlag){
            $condition = "mcs.secondLangFlag = 1";
        }
        else if($request->openCourseFlag){
            $condition = "mcs.openCourseFlag = 1";
        }
        $sql = "SELECT distinct e.examID,sa.studentID,ersc.examregID,erss.subjectID,bsscr.subjectcatID,mcs.secondLangFlag,mcs.openCourseFlag from exam_reg_studentchallan ersc
                    INNER JOIN exam_reg_studentsubject erss ON ersc.examregID = erss.examregID AND ersc.studentID = erss.studentID
                    INNER JOIN batch_sem_subjectCategory_relation bsscr ON bsscr.subjectID = erss.subjectID
                    INNER JOIN studentaccount sa ON sa.studentID=ersc.studentID AND sa.batchID = bsscr.batchID
                    INNER JOIN marklist_categorize_subjects mcs ON mcs.batches_id = bsscr.batchID AND mcs.subject_category_id = bsscr.subjectcatID
                    INNER JOIN exam e ON e.batchID = bsscr.batchID AND e.semID = bsscr.semID AND e.subjectID = bsscr.subjectID AND e.examregID IS NOT NULL
                    WHERE ersc.examregID= '$request->examRegId' and ersc.studentID= '$request->studentId' and ersc.paid=1
                    and bsscr.batchID= '$request->selectedBatchId' and bsscr.semID= '$request->selectedSemId' and $condition";
        try {
            $subjects = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * Method for getting all subjects by request
     * @throws ProfessionalException
     * @return object|array|\com\linways\base\util\$objectList[]
     * @author Sibin
     */
    public function getAllSubjectsByRequest($request)
    {
        $sql = '';
        $subjectList = [];
        $request = $this->realEscapeObject($request);
        try {
            $sql = "SELECT
                    distinct sbs.subjectID as id,
                    sub.subjectName AS subjectName,
                    sub.subjectDesc AS description,
                    CONCAT(sub.subjectName ,' ',sub.subjectDesc) as name,
                    sub.syllabusYear,
                    sbs.semID
                FROM
                    sbs_relation sbs
                        INNER JOIN
                    subjects sub ON sub.subjectID = sbs.subjectID
                WHERE 1=1 ";
                    if (!empty($request->batchId)) {
                        $sql .= " AND sbs.batchID = '$request->batchId";
                    }
                    if (!empty($request->semId)) {
                        $sql .= " AND sbs.semID = '$request->semId";
                    }
                    if (!empty($request->syllabusYear)) {
                        $sql .= " AND sub.syllabusYear = '$request->syllabusYear";
                    }
                    $sql .= " ORDER BY sub.subjectID";
            $subjectList = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectList;
    }
    /**
     * method to get syllabus year of subjects taught by staff
     *
     * @param $batchID ,$semID
     * @return Object
     * @throws ProfessionalException
     */
    public function getSyllabusYearOfSbsSubjects($batchID,$semID)
    {
        try {
            $sql = "SELECT DISTINCT
                        subj.syllabusYear
                    FROM
                        subjects subj
                            INNER JOIN
                        sbs_relation sbs ON subj.subjectID = sbs.subjectID
                    WHERE
                        sbs.batchID = $batchID AND sbs.semID = $semID
                    ORDER BY subj.syllabusYear DESC  ";
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * method to get Subject details
     * @param $deptID,$semID,$courseTypeID
     * @return Object
     * @throws ProfessionalException
     */
    public function getSubjectDetailsByDeptIdSemIdCourseTypeId($deptID,$semID,$courseTypeID, $syllabusYear = NULL)
    {
        try {
            if($syllabusYear){
                $sql = "SELECT DISTINCT sbs.subjectID, sbs.subjectName, sbs.subjectDesc,sbs.syllabusYear, sbs.syllabusName FROM subjects sbs
                INNER JOIN sd_relation sdr ON sdr.subjectId = sbs.subjectId
                INNER JOIN subject_sem_relation ssr ON ssr.subjectId = sbs.subjectId WHERE sbs.hide=0 AND sdr.deptID = ".$deptID." AND ssr.semID = \"".$semID."\" and (sbs.courseTypeID = ".$courseTypeID." OR sbs.courseTypeID = 0 OR sbs.courseTypeID IS NULL) AND sbs.syllabusYear = $syllabusYear order by sbs.subjectName";
            }
            else{
                $sql = "SELECT DISTINCT sbs.subjectID, sbs.subjectName, sbs.subjectDesc,sbs.syllabusYear, sbs.syllabusName FROM subjects sbs
                INNER JOIN sd_relation sdr ON sdr.subjectId = sbs.subjectId
                INNER JOIN subject_sem_relation ssr ON ssr.subjectId = sbs.subjectId WHERE sbs.hide=0 AND sdr.deptID = ".$deptID." AND ssr.semID = \"".$semID."\" and (sbs.courseTypeID = ".$courseTypeID." OR sbs.courseTypeID = 0 OR sbs.courseTypeID IS NULL) order by sbs.subjectName";
            }
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * method to get sbs Syllabus Year of Subjects
     * @param $deptID,$semID,$courseTypeID
     * @return Object
     * @throws ProfessionalException
     */
    public function getSbsSubjectSyllabusYearByDeptIdSemIdCourseTypeId($deptID,$semID,$courseTypeID)
    {
        try {
            $sql = "SELECT DISTINCT sbs.syllabusYear FROM subjects sbs
            INNER JOIN sd_relation sdr ON sdr.subjectId = sbs.subjectId
            INNER JOIN subject_sem_relation ssr ON ssr.subjectId = sbs.subjectId WHERE sbs.hide=0 AND sdr.deptID = ".$deptID." AND ssr.semID = \"".$semID."\" and (sbs.courseTypeID = ".$courseTypeID." OR sbs.courseTypeID = 0 OR sbs.courseTypeID IS NULL) order by sbs.subjectName";
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get subjects to assign internal mark settings  - subject-category-wise
     * @param $request
     * @return Object|null
     * @throws ProfessionalException
     */
    public function getSubjectToAssignInternalMarkSettings($request)
    {
        $request = $this->realEscapeObject($request);
        $sqlCondition = null;
        if ($request->subjectCategory) {
            $sqlCondition = " AND s.subjectcatID = '$request->subjectCategory";
        }
        $sql = null;
        $subjects = null;
        try {
            $sql = "SELECT
                        s.subjectID AS id,
                        s.subjectName AS name,
                        s.subjectDesc AS description,
                        s.isTheory,
                        ims.maxInternalMarks,
                        b.batchID ,
                        b.batchName
                    FROM
                        subjects s
                            INNER JOIN
                        sbs_relation sbs ON (s.subjectID = sbs.subjectID)
                            INNER JOIN
                        batches b ON (b.batchID = sbs.batchID)
                            LEFT JOIN
                        internal_marks_settings ims ON (ims.batchID = sbs.batchID
                            AND ims.semID = sbs.semID
                            AND ims.subjectID = sbs.subjectID)
                    WHERE
                        b.batchStartYear = '$request->batchStartYear'
                            AND sbs.semID = '$request->semId'
                            AND b.courseTypeID = '$request->courseTypeId'
                            $sqlCondition
                    ORDER BY s.subjectName ASC, s.subjectDesc ASC";
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
     /**
     * @param $batchId, $semId, $subjectId, $maxInternalMark
     * @throws ProfessionalException
     */
    public function saveInternalMarkSettings($batchId, $semId, $subjectId, $maxInternalMark)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $maxInternalMark = $this->realEscapeString($maxInternalMark);
        $sql = null;
        try {
            $sql = "  INSERT INTO
            internal_marks_settings (batchID, semID, subjectID, maxInternalMarks)VALUES ($batchId$semId$subjectId$maxInternalMark) ON DUPLICATE KEY UPDATE maxInternalMarks = VALUES(maxInternalMarks)";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException ($e->getCode(), $e->getMessage());
        }
    }
          /**
     * Get all subjects from assign rules
     * @param mixed $batchId, $semId
     * @throws ProfessionalException
     */
    public function getAllSubjectsByBatchIdAndSemId($batchId, $semId)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        try {
            $sql = "SELECT t2.subjectID as id,
            t2.subjectName as name,
            t2.subjectDesc as description,
            t2.syllabusName,t2.subjectPriority as priority,
            t2.hdl_deptID as hdlDeptId ,
            t1.staffId
                from sbs_relation t1
                inner join subjects t2
                    on  t2.subjectID=t1.subjectID
                        where t1.batchID='$batchId'
                        and t1.semID='$semId'
                        order by t2.subjectDesc ASC";
            $subjectDetails = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * Get opencorse subjects by request
     * @param $request
     * @throws ProfessionalException
     */
    public function getOpenCourseSubjectsByRequest($request)
    {
        $request = $this->realEscapeObject($request);
        try {
            $sql = "SELECT sbs.subjectID as id,s.subjectName as name,s.subjectDesc,concat(s.subjectName,' [ ',s.subjectDesc,' ]') as displayName from batches b
                        INNER JOIN sbs_relation sbs ON sbs.batchID = b.batchID
                        INNER JOIN subjects s ON s.subjectID = sbs.subjectID
                        where b.batchStartYear = '$request->batchStartYear' and b.courseTypeID = '$request->courseTypeId' AND sbs.semID = '$request->semId' AND sbs.isPseudosubject=1
                        group by sbs.subjectID
                        order by sbs.subjectID ASC";
            $subjectList = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectList;
    }
    /**
     * Get opencorse subjects by request
     * @param $request
     * @throws ProfessionalException
     */
    public function getOpenCourseSubjectsBatchesDetailsByRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $result =[];
        try {
            $sql = "SELECT erb.examregID as examRegId,sbs.batchID,b.batchName,sbs.subjectID,s.subjectName,s.subjectDesc,e.examID from batches b
                        INNER JOIN sbs_relation sbs ON sbs.batchID = b.batchID
                        INNER JOIN subjects s ON s.subjectID = sbs.subjectID
                        INNER JOIN exam_registration_batches erb ON erb.batchID = sbs.batchID AND erb.semID = sbs.semID
                        INNER JOIN exam e ON e.batchID = sbs.batchID AND e.semID = sbs.semID AND e.subjectID =sbs.subjectID AND e.examregID IS NOT NULL
                        where b.batchStartYear = '$request->batchStartYear' and b.courseTypeID = '$request->courseTypeId'
                        AND sbs.semID = '$request->semId' AND sbs.isPseudosubject=1 AND sbs.subjectID IN ($request->subjectIds)
                        group by sbs.batchID
                        order by sbs.subjectID,b.batchID ASC";
            $result = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $result;
    }
    /**
     * get OpenCourse Subjects Student Marks Details By Request
     * @param $request
     * @throws ProfessionalException
     */
    public function getOpenCourseSubjectsStudentsMarksDetailsByRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $result = [];
        try {
            $sql = "SELECT ee.studentID,sa.regNo,sa.studentName,sa.batchID,b.batchName,ee.mark as externalMark,e.examTotalMarks as externalMaxMark,im.internalMarks as internalMark ,
                        ims.maxInternalMarks as internalMaxMark,(ee.mark   + im.internalMarks) as totalMark,(e.examTotalMarks   + ims.maxInternalMarks) as totalMaxMark from exammarks_external ee
                        INNER JOIN studentaccount sa ON sa.studentID = ee.studentID
                        INNER JOIN exam e ON e.examID = ee.examID
                        INNER JOIN exam_reg_studentsubject ers ON ers.studentID = ee.studentID AND ers.examregID = e.examregID AND ers.subjectID = e.subjectID
                        INNER JOIN batches b ON b.batchID = e.batchID
                        LEFT JOIN internal_marks_settings ims ON ims.batchID = e.batchID AND ims.semID = e.semID AND ims.subjectID = e.subjectID
                        LEFT JOIN internal_marks im ON im.studentID = ee.studentID AND im.batchID = e.batchID AND im.semID = e.semID AND im.subjectID =e.subjectID
                        WHERE ee.examID IN($request->examIds)
                        order by sa.regNo ASC";
            $result = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $result;
    }
     /** Get assigned sbs details of a subject
     * @param int $subjectId
     * @param int $semId
     * @param int $batchId
     * @throws ProfessionalException
     */
    public function getNormalisedMarks($subjectId, $semId, $batchId)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectId = $this->realEscapeString($subjectId);
        $sql = "SELECT
            sa.studentID, sa.studentName,nm.markID, nm.marksObtained, nm.studentID,nm.normalisedMark,sa.rollNo,sa.regNo,sa.studentAccount,
            (nm.normalisedMark - nm.marksObtained) as addedMarks
        FROM normalise_marks nm
        INNER JOIN studentaccount sa ON nm.studentID=sa.studentID
        WHERE nm.batchID='$batchId' AND nm.subjectID = '$subjectId' AND nm.semID = '$semId'
        ORDER BY sa.rollNo;";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get student normalised marks by pseudo subjectId
     * @param int $pseudoSubjectId
     * @throws ProfessionalException
     */
    public function getNormalisedMarksOfPseudoSubject($pseudoSubjectId)
    {
        $pseudoSubjectId = $this->realEscapeString($pseudoSubjectId);
        $sql = "select std.studentID, std.studentName,nm.markID, nm.marksObtained, nm.studentID,nm.normalisedMark,std.rollNo,std.regNo,std.studentAccount ,(nm.normalisedMark - nm.marksObtained) as addedMarks from sbs_relation sbs
        inner join pseudosubjects_sbs psbs on psbs.sbsID = sbs.sbsID
        inner join pseudosubjects_students pstd on pstd.pseudosubjectID = psbs.pseudosubjectID
        inner join normalise_marks nm on nm.studentID = pstd.studentID and nm.subjectID = sbs.subjectID and nm.batchID = sbs.batchID and nm.semID = sbs.semID
        inner join studentaccount std on std.studentID = pstd.studentID
        where psbs.pseudosubjectID = '$pseudoSubjectId';";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
      /**
     * get subject paper type by subjectId
     * @throws ProfessionalException
     */
    public function getSubjectPaperTypeDetails($subjectId)
    {
        $subjectDetail = [];
        try {
            $sql = "SELECT st.id AS paperTypeId, st.paperTypeName, st.paperTypeCode, s.subjectName ,s.subjectDesc ,s.syllabusYear FROM subjectPaperType st inner join subjects s on (st.id = s.paperTypeId ) where s.subjectID =$subjectId;
            ";
            $subjectDetail = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectDetail;
    }
    /**
     * @author Sibin
     * get Exams Subjects By ExamRegistration
     */
    public function getExamSubjectsByExamRegistrationRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $examRegField = $request->isSupply ? "supply_examreg_id" : "examregID";
        $whereConditions = $groupBy = "";
        if ($request->examRegId) {
            $whereConditions .= " AND e.$examRegField IN ($request->examRegId)";
        }
        if ($request->semId) {
            $whereConditions .= " AND e.semID IN ($request->semId)";
        }
        if ($request->batchId) {
            $whereConditions .= " AND e.batchID IN ($request->batchId)";
        }
        if ($request->examDate) {
            $whereConditions .= " AND e.examDate IN ('$request->examDate')";
        }
        if($request->examDateFrom){
            $whereConditions .= " AND e.examDate >= '$request->examDateFrom";
        }
        if ($request->examDateTo) {
            $whereConditions .= " AND e.examDate <= '$request->examDateTo";
        }
        if($request->groupBySubject){
            $groupBy = " GROUP BY s.subjectID ";
        }
        if($request->groupByExmDate){
            $groupBy = " GROUP BY e.examDate ";
        }
        $invalidDate = "0000-00-00";
        $sql = "SELECT distinct
                    e.subjectID as 'subjectId',
                    s.subjectName,
                    s.subjectDesc,
                    s.subjectPriority,
                    e.semID as 'semId',
                    e.examStartTime as startTime,
                    e.examEndTime as endTime,
                    IF(e.examDate NOT IN ('$invalidDate'), DATE_FORMAT(e.examDate, \"%d-%m-%Y\"), '-') AS examDate
                FROM
                    exam e
                    INNER JOIN subjects s ON s.subjectID = e.subjectID
                WHERE
                    1 = 1
                    $whereConditions $groupBy";
        try {
            $exams = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getMessage(), $e->getCode());
        }
        return $exams;
    }
    /**
     * Get all subject teaching by a staff in a batch in a sem
     * @param Integer $staffId
     * @param Integer $batchId
     * @return Array $subjects
     * @throws ProfessionalException
     */
    public function getSubjectsByStaffBatchSem($staffId = false, $batchId , $semId)
    {
        $staffId = (int) $this->realEscapeString($staffId);
        $batchId = (int) $this->realEscapeString($batchId);
        $semId = (int) $this->realEscapeString($semId);
        $condition = "";
        if ($staffId) {
            $condition .= " sbs.staffID = '$staffId' AND";
        }
        if ($batchId) {
            $condition .= " sbs.batchID = '$batchId' AND";
        }
        if ($semId) {
            $condition .= " sbs.semID = '$semId' AND";
        }
        $subjects = [];
        $sql = "SELECT s.subjectID, s.subjectName, s.subjectDesc, s.isTheory, s.deptID
        FROM subjects s
        INNER JOIN sbs_relation sbs ON (s.subjectID = sbs.subjectID)
        INNER JOIN batches b ON sbs.batchID = b.batchID
        LEFT JOIN department dept ON dept.deptID = b.deptID
        WHERE $condition b.isPassOut = 0 AND dept.deptShow = 1";
        $sql .= " ORDER BY s.subjectPriority ASC, s.subjectName ASC";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * Get all subject teaching by a staff in a batch
     * @param Integer $staffId
     * @param Integer $batchId
     * @return Array $subjects
     * @throws ProfessionalException
     * @author Vishnu M
     */
    public function getSubjectsByStaffIdAndBatchId($staffId = false, $batchId,$deptId = NULL)
    {
        $staffId = (int) $this->realEscapeString($staffId);
        $batchId = (int) $this->realEscapeString($batchId);
        $condition = "";
        if ($staffId) {
            $condition .= " sbs.staffID = '$staffId' AND";
        }
        if ($batchId) {
            $condition .= " sbs.batchID = '$batchId' AND";
        }
        if ($deptId){
            $condition .= " b.deptID = '$deptId' AND";
        }
        $subjects = [];
        $sql = "SELECT s.subjectID, s.subjectName, s.subjectDesc, s.isTheory, s.deptID, sbs.batchID, b.batchName, b.batchID, sbs.semID as currentSemId, sem.semName,  group_concat(distinct(sb.subbatchID)) as subbatches
        FROM subjects s
        INNER JOIN sbs_relation sbs ON (s.subjectID = sbs.subjectID)
        LEFT JOIN subbatch_sbs ssbs ON ssbs.sbsID = sbs.sbsID
        LEFT JOIN subbatches sb ON sb.subbatchID = ssbs.subbatchID
        INNER JOIN batches b ON sbs.batchID = b.batchID AND b.semID = sbs.semID
        LEFT JOIN department dept ON dept.deptID = b.deptID
        INNER JOIN semesters sem ON sem.semID = sbs.semID
        WHERE $condition b.isPassOut = 0 AND dept.deptShow = 1 AND sbs.isPseudoSubject = 0";
        $sql .= " group by s.subjectID ORDER BY s.subjectPriority ASC, s.subjectName ASC";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    public function subjectCreditDetails($batchId,$semId){
        $batchId = (int) $this->realEscapeString($batchId);
        $semId = (int) $this->realEscapeString($semId);
        $subjectCreditDetails = null;
        $sql = "SELECT subjectID FROM exam_subjectcredit WHERE batchID = $batchId AND semID = $semId AND excludeSubjectFromTotal = 1";
        try {
            $subjectCreditDetails = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectCreditDetails;
    }
    /**
     *  Get all subjects by courseType, sem and batchStartYear
     */
    public function getSubjectByCourseTypeSemIdAndBatchStartYear($courseTypeId, $semId, $batchStartYear)
    {
        $courseTypeId = (int) $this->realEscapeString($courseTypeId);
        $semId = (int) $this->realEscapeString($semId);
        $batchStartYear = (int) $this->realEscapeString($batchStartYear);
        $sqlCondition = null;
        $subjects = [];
        $sql = "SELECT s.subjectID, s.syllabusName, s.subjectName, s.subjectDesc, s.isTheory, s.deptID FROM subjects s INNER JOIN sbs_relation sbs ON (s.subjectID = sbs.subjectID) INNER JOIN batches b ON (b.batchID = sbs.batchID) WHERE b.courseTypeID = '$courseTypeId' AND sbs.semID = '$semId' AND b.batchStartYear = '$batchStartYear' GROUP BY sbs.subjectID";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * get registered regular exam subjects by student id and exam reg id
     */
    public function getRegularExamSubjectsByStudentIdAndRegId($studentId, $examRegId , $semId = NULL)
    {
        global $COLLEGE_CODE;
        $sql = null;
        $studentId = $this->realEscapeString($studentId);
        $examRegId = $this->realEscapeString($examRegId);
        $semId = $this->realEscapeString($semId);
        $condition = "";
        if($semId){
            $condition = " AND esc.semID = $semId";
        }
        $regExamSubjects = [];
        $sql = "SELECT
            s.subjectID,
            s.subjectName,
            s.subjectDesc,
            s.syllabusName,
            s.subjectPriority
        FROM
            exam_reg_studentsubject ers
                INNER JOIN
            subjects s ON s.subjectID = ers.subjectID
            INNER JOIN studentaccount sa ON sa.studentID = ers.studentID
            INNER JOIN exam_subjectcredit esc ON sa.batchID = esc.batchID AND ers.subjectID = esc.subjectID
        WHERE
            ers.examregID = $examRegId
                AND
            ers.studentID = $studentId $condition
        ORDER BY esc.subjectOrder ASC";
        try {
            $regExamSubjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $regExamSubjects;
    }
        /**
     * get registered regular exam subjects by student id and exam reg id
     *
     */
    public function getRegularExamSubjectsByStudentIdAndExamRegId($studentId, $examRegId)
    {
        global $COLLEGE_CODE;
        $sql = null;
        $studentId = $this->realEscapeString($studentId);
        $examRegId = $this->realEscapeString($examRegId);
        $regExamSubjects = [];
        $hidePracticalSubject = CommonService::getInstance()->getSettings(SettingsConstents::EXAM_CONTROLLER, SettingsConstents::HIDE_PRACTICAL_SUBJECT_IN_HALL_TICKET);
        $courseType = StudentService::getInstance()->getCourseTypeByStudentId($studentId);
        $batchCourseType = $courseType->courseType;
        if($hidePracticalSubject && $batchCourseType == CourseTypeConstants::UG){
                $sql = "SELECT
                s.subjectID,
                s.subjectName,
                s.subjectDesc,
                s.syllabusName,
                s.subjectPriority
            FROM
                exam_reg_studentsubject ers
                    INNER JOIN
                subjects s ON s.subjectID = ers.subjectID
                INNER JOIN studentaccount sa ON sa.studentID = ers.studentID
                INNER JOIN exam_subjectcredit esc ON sa.batchID = esc.batchID AND ers.subjectID = esc.subjectID
            WHERE
                ers.examregID = $examRegId
                    AND
                ers.studentID = $studentId
                    AND
                s.isTheory = 1
            ORDER BY esc.subjectOrder ASC";
        }
        else{
            $sql = "SELECT
                s.subjectID,
                s.subjectName,
                s.subjectDesc,
                s.syllabusName,
                s.subjectPriority
            FROM
                exam_reg_studentsubject ers
                    INNER JOIN
                subjects s ON s.subjectID = ers.subjectID
                INNER JOIN studentaccount sa ON sa.studentID = ers.studentID
                INNER JOIN exam_subjectcredit esc ON sa.batchID = esc.batchID AND ers.subjectID = esc.subjectID
            WHERE
                ers.examregID = $examRegId
                    AND
                ers.studentID = $studentId
            ORDER BY esc.subjectOrder ASC";
        }
        try {
            $regExamSubjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $regExamSubjects;
    }
    /**
     * get Exams Subjects By ExamRegistration and depatment
     */
    public function getExamSubjectsByExamRegistrationAndDepartment($request)
    {
        $request = $this->realEscapeObject($request);
        $whereConditions = "";
        $examRegIdField = $request->isSupply ? "supply_examreg_id" : "examregID";
        if ($request->examRegId) {
            $whereConditions .= " AND e.$examRegIdField IN ($request->examRegId)";
        }
        if ($request->deptId) {
            $whereConditions .= " AND bt.deptID IN ($request->deptId)";
        }
        if ($request->batchId) {
            $whereConditions .= " AND bt.batchID IN ($request->batchId)";
        }
        $sql = "SELECT distinct
                    e.subjectID as id,
                    s.subjectName as name,
                    s.subjectDesc as description,
                    s.subjectPriority,
                    e.semID as 'semId'
                FROM
                    exam e
                    INNER JOIN subjects s ON s.subjectID = e.subjectID
                    INNER JOIN batches bt ON bt.batchID = e.batchID
                WHERE
                    1 = 1
                    $whereConditions";
        try {
            $exams = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getMessage(), $e->getCode());
        }
        return $exams;
    }
    /**
     *  Get all subjects creit detaiuls by request
     */
    public function getSubjectCreditDetailsByRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $subjects = [];
        $condition = "";
        if($request->subjectId){
            $condition = " AND s.subjectID IN ($request->subjectId)";
        }
        try {
            if($request->batchId && $request->semId){
                $sql = "SELECT distinct sbs.subjectID, s.syllabusName, s.subjectDesc, s.subjectName ,
                        esc.credit, esc.isInternal, esc.isExternal, esc.hideGrade,esc.excludeSubjectFromTotal,esc.subjectOrder,esc.subjectType
                        FROM sbs_relation sbs
                        INNER JOIN subjects s ON s.subjectID= sbs.subjectID
                        LEFT JOIN exam_subjectcredit esc ON esc.batchID= sbs.batchID AND esc.semID = sbs.semID AND esc.subjectID = sbs.subjectID
                        WHERE sbs.batchID IN ($request->batchId) AND sbs.semID IN ($request->semId$condition
                        ORDER BY s.subjectName ASC";
                $subjects = $this->executeQueryForList($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
     /**
     * Get subject details by start year and pattern
     * @param int $patternId
     * @param int $batchStartYear
     */
    public function getSubjectsPatternIdAndYear($patternId, $batchStartYear, $semId)
    {
        $patternId = $this->realEscapeString($patternId);
        $batchStartYear = $this->realEscapeString($batchStartYear);
        $semId = $this->realEscapeString($semId);
        $sql = "SELECT DISTINCT(t1.subjectID) as id,
                    t2.subjectName as name,
                    t2.subjectDesc as description,
                    t2.syllabusName,t2.subjectPriority as priority,
                    t2.hdl_deptID as hdlDeptId
                        from sbs_relation t1
                        inner join subjects t2
                            on  t2.subjectID=t1.subjectID
                        inner join batches bt
                            on  bt.batchID=t1.batchID
                        inner join exam_subjectcredit esc
                            on esc.subjectID=t2.subjectID
                                where t2.subjectName not in (\"" . Subject::TUTOR_SUBJECT . "\")
                                and bt.batchStartYear='$batchStartYear'
                                and bt.patternID='$patternId'
                                and t1.semID='$semId'
                                order by esc.subjectOrder ASC";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get department wise subject details
     */
    public function getDepartmentWiseubjectDetails($batchStartYear, $deptId, $courseTypeId, $semId)
    {
        $sql = null;
        $batchStartYear = $this->realEscapeString($batchStartYear);
        $deptId = $this->realEscapeString($deptId);
        $courseTypeId = $this->realEscapeString($courseTypeId);
        $semId = $this->realEscapeString($semId);
        $regExamSubjects = [];
        $sql = "SELECT sr.subjectID, s.subjectName, s.subjectDesc, bt.batchName, es.credit, ims.maxInternalMarks, ex.examTotalMarks
                    from
                        batches bt
                    INNER JOIN
                        sbs_relation sr ON (sr.batchID = bt.batchID )
                    INNER JOIN
                        subjects s ON (s.subjectID = sr.subjectID)
                    LEFT JOIN
                        exam_subjectcredit es ON (es.batchID = sr.batchID AND es.subjectID = sr.subjectID AND es.semID = sr.semID )
                    LEFT JOIN
                        exam ex ON (ex.batchID = sr.batchID AND ex.subjectID = sr.subjectID AND ex.semID = sr.semID and ex.examregID IS NOT NULL)
                    LEFT JOIN
                        internal_marks_settings ims ON (ims.batchID = sr.batchID AND ims.subjectID = sr.subjectID AND ims.semID = sr.semID )
                    WHERE
                        bt.batchStartYear = $batchStartYear and bt.courseTypeID = $courseTypeId and bt.deptID IN ($deptId) and sr.semID IN ($semId) GROUP BY sr.subjectID ";
        try {
            $regExamSubjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $regExamSubjects;
    }
    /**
     * get student sec lang or elective subject
     */
    public function getStudentSecLangAndElective($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = "";
        if($request->studentId){
            $condition = " AND pss.studentID = $request->studentId";
        }
        $sql = "SELECT
            ps.subjectName AS pseudoSubjectName,
            ps.courseTypeID AS courseTypeId,
            sbsr.subjectID AS subjectId,
            sbsr.semID AS semId,
            s.subjectDesc AS subjectName,
            s.subjectName AS subjectCode,
            s.syllabusName
        FROM
            pseudosubjects ps
        INNER JOIN pseudosubjects_students pss ON
            pss.pseudosubjectID = ps.pseudosubjectID
        INNER JOIN pseudosubjects_sbs pssbs ON
            pssbs.pseudosubjectID = ps.pseudosubjectID
            AND pssbs.pseudosubjectID = pss.pseudosubjectID
        INNER JOIN sbs_relation sbsr ON
            sbsr.sbsID = pssbs.sbsID
        INNER JOIN subjects s ON
            s.subjectID = sbsr.subjectID
        WHERE
            sbsr.batchID = $request->batchId
            AND sbsr.semID = $request->semId
            $condition
            GROUP BY s.subjectID ;";
        try {
            $students = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $students;
    }
    /**
     * This service is used to find the subjects assigned to handling department
     * Get subject details by handling department
     *
     * @param int $hdl_deptId
     * @return object|array|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getAllSubjectsByHandlingDepartmentId($hdl_deptId)
    {
        $hdl_deptId = $this->realEscapeString($hdl_deptId);
        $sql = "SET SESSION group_concat_max_len = 1000000;";
        $this->executeQuery($sql);
        
        $sql = "SELECT s.subjectID, s.subjectName, s.subjectDesc, s.syllabusName, s.hdl_deptID, concat('[',group_concat( distinct sd.deptID),']') as teachingDepartments
        FROM subjects s
        LEFT JOIN sd_relation sd ON sd.subjectID = s.subjectID
        WHERE s.subjectName NOT IN (\"" . Subject::TUTOR_SUBJECT . "\") ";
        if($hdl_deptId){
            $sql = " AND s.hdl_deptID = '$hdl_deptId";
        }
        $sql .= " GROUP BY s.subjectID; ";
        try {
            $subjectDetails = $this->executeQueryForList($sql, $this->mapper[SubjectServiceMapper::GET_SUBJECTS_BY_DEPARTMENT]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * get subject category by subject Id
     * @param Integer
     * @return Object
     * @throws ProfessionalException
     */
    public function getSubjectCategoryBySubjectId($subjectId)
    {
        $subjectId = $this->realEscapeString($subjectId);
        try {
            $sql = "SELECT distinct(s.subjectcatID) as id ,sc.subjectcatName as name
                        from subjects s
                        inner join subject_category sc
                            on sc.subjectcatID = s.subjectcatID
                        where s.subjectID = $subjectId";
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get subject institutional average
     * @param request
     * @return List
     * @throws ProfessionalException
     */
    public function getSubjectInstitutionalAverage($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = '';
        if($request->batchId){
            $condition = " AND batchID = $request->batchId";
        }
        if($request->semId){
            $condition .= " AND semID = $request->semId";
        }
        if($request->subjectId){
            $condition .= " AND subjectID = $request->subjectId";
        }
        try {
            $sql = "SELECT batchId, semId, subjectId, mark FROM ec_subject_institutional_average WHERE 1 = 1 $condition";
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
      /**
     * Save subject institutional  average
     * @param int $batchList
     * @throws ProfessionalException
     */
    public function saveSubjectInstitutionalAverage($batchList)
    {
        $batchList = $this->realEscapeObject($batchList);
        foreach ( $batchList as $batch){
            try {
                $result = $this->getSubjectInstitutionalAverage($batch);
                if ( $result) {
                    $sql = "UPDATE ec_subject_institutional_average set mark = $batch->average WHERE subjectID = $batch->subjectId and batchID = $batch->batchId and semID =$batch->semId ";
                }
                else{
                    $sql = "INSERT INTO ec_subject_institutional_average (batchID, semID, subjectID, mark) VALUES($batch->batchId$batch->semId$batch->subjectId$batch->average)";
                }
                $this->executeQuery($sql);
            } catch (\Exception $e) {
                throw new ProfessionalException($e->getCode(), $e->getMessage());
            }
        }
    }
    /**
     * get subject category of hall ticket
     * @param request
     * @return List
     * @throws ProfessionalException
     */
    public function getHallTicketSubjectCategory($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = '';
        if($request->batchId){
            $condition = " AND batchID = $request->batchId";
        }
        if($request->examregId){
            $condition .= " AND examregID = $request->examregId";
        }
        else if($request->supplyId){
            $condition .= " AND supplyregID = $request->supplyId";
        }
        try {
            $sql = "SELECT subjectCategory FROM ec_hall_ticket_subject_category WHERE 1 = 1 $condition";
            return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Save subject category for hall ticket
     * @param $request
     * @throws ProfessionalException
     */
    public function saveHallTicketSubjectCategory($request)
    {
        $request = $this->realEscapeObject($request);
        $examregId = $request->examregId? $request->examregId : NULL;
        $supplyId = $request->supplyId? $request->supplyId : NULL;
        $batchId = $request->batchId;
        $subjectDetails = $request->subjectDetails;
        if($subjectDetails){
            $subjectDetails = json_encode($subjectDetails);
        }else{
            $subjectDetails = 'null';
        }
        $examTypeVar = "examregID";
        $examRegistrationId = $examregId;
        if ($supplyId) {
            $examRegistrationId = $supplyId;
            $examTypeVar = "supplyregID";
        }
        $result = $this->getHallTicketSubjectCategory($request);
        if ( $result){
            $sql1= " UPDATE ec_hall_ticket_subject_category  SET subjectCategory= '$subjectDetails' WHERE $examTypeVar = '$examRegistrationId' AND batchID= '$batchId'";
        }
        else{
            $sql1= " INSERT into ec_hall_ticket_subject_category (batchID,  $examTypeVar, subjectCategory)
                    VALUES ('$batchId', '$examRegistrationId', '$subjectDetails')";
        }
        try {
            return $this->executeQuery($sql1);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function assignSelectedSubjectGroups($request)
    {
        $sql = null;
        $request = $this->realEscapeObject($request);
        try {
            $deleteAssignSubjectGroups = SubjectService::getInstance()->deleteSelectedAssignSubjectGroups($request);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        try {
            $sql = "INSERT INTO subjectGroups_subjects (subjectGroups_id,batches_id,semesters_id,subjects_id,createdBy,createdDate,updatedBy,updatedDate) VALUES " . $request->insertStr . "";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return true;
    }
    public function deleteSelectedAssignSubjectGroups($request)
    {
        $sql = null;
        $request = $this->realEscapeObject($request);
        $subjectIds = implode(",",$request->selectedSubjects);
        try {
            $sql = "DELETE FROM subjectGroups_subjects WHERE batches_id = $request->batchId AND semesters_id = $request->semId AND subjects_id IN ($subjectIds)";
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return true;
    }
    /**
     * @param $request
     * @return array|Object
     * @throws ProfessionalException
     */
    public function getStudentAppliedSubjectDetails($request)
    {
        $request = $this->realEscapeObject($request);
        $response=[];
        $joinEsc = "";
        $subjectTypeField= "";
        $condition = "";
        if($request->isSupply){
            $sql = "SELECT
            s.subjectID as subjectId,
            s.subjectName,
            s.syllabusName,
            s.subjectDesc,
            erss.studentID as studentId
            FROM
                exam_supplementary_student_details ersc
                INNER JOIN
                exam_supplementary_student_subjects erss ON erss.studentID = ersc.studentID AND erss.exam_supplementary_id = ersc.exam_supplementary_id
                INNER JOIN exam e ON e.examID = erss.examID
                INNER JOIN
                subjects s ON s.subjectID = e.subjectID
            WHERE
                erss.exam_supplementary_id = '$request->examRegId'
                AND erss.studentID = '$request->studentId'
                AND ersc.paid=1 GROUP BY s.subjectID ORDER BY s.subjectName ASC";
        }else{
            if($request->batchId){
                $joinEsc = "INNER JOIN exam_registration_batches erb ON erb.examregID = ersc.examregID AND erb.batchID  = $request->batchId
                            INNER JOIN exam_subjectcredit esc ON esc.subjectID = s.subjectID AND esc.batchID = erb.batchID AND esc.semID = erb.semID";
                $subjectTypeField = " ,esc.subjectType";
                if($request->subjectType){
                    $condition .= " AND esc.subjectType IN ('$request->subjectType')";
                }
            }
            $sql = "SELECT
            s.subjectID as subjectId,
            s.subjectName,
            s.syllabusName,
            s.subjectDesc,
            erss.studentID as studentId
            $subjectTypeField
            FROM
                exam_reg_studentchallan ersc
                INNER JOIN
                exam_reg_studentsubject erss ON erss.studentID = ersc.studentID AND erss.examregID = ersc.examregID
                INNER JOIN subjects s ON s.subjectID = erss.subjectID
                $joinEsc
            WHERE
                erss.examregID = '$request->examRegId'
                AND erss.studentID = '$request->studentId'
                $condition
                AND ersc.paid=1 GROUP BY s.subjectID ORDER BY s.subjectName ASC";
        }
        try {
            $response = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $response;
    }
    /**
     *  Get all exam subjects by request
     */
    public function getAllExamSubjectByRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $subjects = [];
        try {
            if($request->batchId && $request->semId){
                $sql = "SELECT distinct sbs.subjectID, s.syllabusName, s.subjectDesc, s.subjectName ,
                        esc.credit, esc.isInternal, esc.isExternal, esc.hideGrade,esc.excludeSubjectFromTotal,esc.subjectOrder,esc.subjectType
                        FROM sbs_relation sbs
                        INNER JOIN subjects s ON s.subjectID= sbs.subjectID
                        INNER JOIN exam_subjectcredit esc ON esc.batchID= sbs.batchID AND esc.semID = sbs.semID AND esc.subjectID = sbs.subjectID
                        INNER JOIN exam ex ON ex.batchID= sbs.batchID AND ex.semID = sbs.semID AND ex.subjectID = sbs.subjectID
                        WHERE sbs.batchID IN ($request->batchId) AND sbs.semID IN ($request->semId) and ex.examregID IS NOT NULL GROUP BY s.subjectID ORDER BY esc.subjectOrder ASC";
                $subjects = $this->executeQueryForList($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * Get Common Subjects with Batches
     * @param $request
     * @throw Exception
     */
    public function getCommonSubjectsWithBatches($request){
        $request = $this->realEscapeObject($request);
        $sql = "SELECT sub.subjectID as id, sub.subjectName as name, sub.subjectDesc as description FROM subjects sub
        INNER JOIN sbs_relation sbsr ON sbsr.subjectID = sub.subjectID INNER JOIN batches b ON b.batchID = sbsr.batchID
        AND b.semID = sbsr.semID WHERE 1=1 ";
        $sqlCond = "";
        if($request->batchIds){
            $sqlCond = " AND b.batchID IN (".implode(",",$request->batchIds).") ";
        }
        if($request->subjectCatId){
            $sqlCond = " AND sub.subjectCatID ='".$request->subjectCatId."' ";
        }
        $len = count($request->batchIds);
        $grpJoin = " GROUP BY sub.subjectID";
        $sql = $sql.$sqlCond.$grpJoin;
        try{
            $batches = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $batches;
    }
    /**
     * get all subjects by request
     */
    public function getAllSubjectByRequest($request)
    {
        $request = $this->realEscapeObject($request);
        if($request->courseTypeId)
        {
            $cond = "AND  courseTypeID = '$request->courseTypeId";
        }
        $sql = "select subjectID as id,subjectName as code,subjectDesc as name,hdl_deptID as handlingDepartment,syllabusYear from subjects where hdl_deptID AND hide = 0 $cond";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get all subjects_category in a batch by batchId and semId
     */
    public function getAllSubjectCategoryUsedInABatch($batchId,$semId = null)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $sql = "SELECT sc.subjectcatID AS id,sc.subjectcatName AS name FROM sbs_relation sbs
        INNER JOIN subjects s ON s.subjectID = sbs.subjectID
        INNER JOIN subject_category sc ON sc.subjectcatID = s.subjectcatID
        WHERE sbs.batchID = '".$batchId."' ".((int)($semId) ? " AND sbs.semID = '".$semId."' " : '' )."
        GROUP BY sc.subjectcatID
        ORDER BY sc.subjectcatPriority;";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get category subjects by request
     */
    public function getCategorySubjectByRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $subjects=[];
        $sql = "SELECT s.subjectID,s.subjectName,s.subjectDesc,esc.semID,concat(sc.subjectcatName,' ',mcs.displayName) AS subCatName FROM marklist_categorize_subjects mcs
                    INNER JOIN subjects s ON s.subjectcatID = mcs.subject_category_id
                    INNER JOIN subject_category sc ON sc.subjectcatID = mcs.subject_category_id
                    INNER JOIN exam_subjectcredit esc ON esc.batchID = mcs.batches_id AND esc.subjectID = s.subjectID
                    WHERE mcs.id IN ($request->subjectCatId)";
        try {
            $subjects =  $this->executeQueryForList($sql);
            return $subjects;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Get internal subject details in a sem of a batch in order
     * @param int $request
     * @throws AMSException
     * @return $objectList[]
     */
    public function getInternalSubjectsBySemInOrder($request)
    {
        $request = $this->realEscapeObject($request);
        $condition ="";
        if($request->InternalSubjectsOnly){
            $condition = " AND esc.isInternal = 1 ";
        }
        if($request->subjectIds){
            $condition = " AND t1.subjectID IN ($request->subjectIds";
        }
        $subjectCreditJoin = "inner";
        if($request->leftJoinSubjectCreditTable){
            $subjectCreditJoin = "left";
        }
        $sql = "SELECT DISTINCT(t1.subjectID) as id,
                t2.subjectName as name,
                t2.subjectDesc as description,
                t2.syllabusName,t2.subjectPriority as priority,
                t2.hdl_deptID as hdlDeptId
                    from sbs_relation t1
                    inner join subjects t2
                        on  t2.subjectID=t1.subjectID
                    $subjectCreditJoin join exam_subjectcredit esc
                        on esc.subjectID=t2.subjectID AND esc.batchID = t1.batchID AND esc.semID = t1.semID
                            where t2.subjectName not in (\"" . Subject::TUTOR_SUBJECT . "\")
                            and t1.batchID='$request->batchId'
                            and t1.semID='$request->semId'
                            $condition
                            order by esc.subjectOrder ASC";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
        }
    }
    /**
     * get distict student subjects by examRegId and patternId
     */
    public function getDistinctExamRegistrationSubjectsByCourse($examRegId, $patternId)
    {
        $examRegId = $this->realEscapeString($examRegId);
        $patternId = $this->realEscapeString($patternId);
        $sql = "SELECT erss.subjectID as subjectId, s.subjectName, s.subjectDesc,s.isTheory, COUNT( DISTINCT ersc.studentID) AS studentCount FROM exam_reg_studentchallan ersc INNER JOIN exam_reg_studentsubject erss ON (ersc.studentID = erss.studentID AND ersc.examregID = erss.examregID) INNER JOIN subjects s ON (s.subjectID = erss.subjectID ) INNER JOIN studentaccount sa ON(sa.studentID = ersc.studentID) INNER JOIN batches b ON(b.batchID = sa.batchID) WHERE ersc.examregID = '$examRegId' AND b.patternID IN ($patternId) AND ersc.paid =1 GROUP BY erss.subjectID;";
        try {
            $subjectStudents = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectStudents;
    }
    /**
     * get subjects by exam date and batch
     */
    public function getSubjectByExamDateBatchRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = "";
        if($request->batchId){
            $condition .= " AND e.batchID IN ($request->batchId)";
        }
        $sql = "SELECT DISTINCT e.subjectID,s.subjectName,s.subjectDesc,e.examDate FROM exam e
                INNER JOIN subjects s ON s.subjectID = e.subjectID
                WHERE e.examDate ='$request->examDate'";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * get department wise subject details
     * @param $batchStartYear
     * @param $deptId
     * @param $courseTypeId
     */
    public function getDeptWiseSubjectDetails($batchStartYear, $deptId, $courseTypeId, $semId)
    {
        $sql = null;
        $batchStartYear = $this->realEscapeString($batchStartYear);
        $deptId = $this->realEscapeString($deptId);
        $courseTypeId = $this->realEscapeString($courseTypeId);
        $condition = '';
        if($semId){
        $condition = " and sr.semID IN ($semId)";
        }
        $regExamSubjects = [];
        $sql = "SELECT sr.subjectID, s.subjectName, s.subjectDesc, bt.batchName
                    from
                        batches bt
                    INNER JOIN
                        sbs_relation sr ON (sr.batchID = bt.batchID )
                    INNER JOIN
                        subjects s ON (s.subjectID = sr.subjectID)
                    INNER JOIN
                        exam_subjectcredit es ON (es.batchID = sr.batchID AND es.subjectID = sr.subjectID AND es.semID = sr.semID )
                    WHERE
                        bt.batchStartYear = $batchStartYear and bt.courseTypeID = $courseTypeId and bt.deptID IN ($deptId$condition GROUP BY sr.subjectID ";
        try {
            $regExamSubjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $regExamSubjects;
    }
    /**
     * Get subject details by batchId and subjectCode
     * @param request
     */
    public function getSubjectByBatchIDSubjectCodeRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $condition ="";
        $condition .= ($request->showSyllabusName)?  " AND ss.syllabusName = '$request->syllabusName'" : " AND ss.subjectName = '$request->subjectCode'" ;
        $sql = "SELECT DISTINCT ss.subjectID, ss.subjectName, ss.subjectDesc, sr.semID, ss.courseTypeID
                from subjects ss
                inner join sbs_relation sr on (ss.subjectID = sr.subjectID )
                where 1 = 1 and sr.batchID ='$request->batchId'
                $condition";
        try {
            $subjects = $this->executeQueryForObject($sql);
            return $subjects;
        } catch (\Exception $e) {
        }
    }
    /**
     * @param $supplyId
     * @param $studentId
     * @param $semId
     * @param $subjectId
     * @return array|Object
     * @throws ProfessionalException
     */
    public function getSubjectMaxMarkBatchExamMarkDetails($request)
    {
        $request = $this->realEscapeObject($request);
        $markDetails = "";
        $sql = "SELECT DISTINCT
                ims.maxInternalMarks,
                e.examTotalMarks AS maxExternalMarks
            FROM
                exam e
                    LEFT JOIN
                internal_marks_settings ims
                    ON ims.subjectID = e.subjectID
                    AND ims.batchID = e.batchID
                    AND ims.semID = e.semID
            WHERE
                    e.semID = '$request->semId'
                    AND e.subjectID = '$request->subjectId'
                    AND e.batchID = '$request->batchId'
                    AND e.examregID = '$request->examRegId'";
        try {
            $markDetails = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $markDetails;
    }
    /**
     * @param $supplyId
     * @param $studentId
     * @param $semId
     * @param $subjectId
     * @return array|Object
     * @throws ProfessionalException
     */
    public function getSubjectsByExamRegistration($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = $groupBy = "";
        if($request->examRegId){
            $condition .= $request->isSupply ? " AND e.supply_examreg_id IN ($request->examRegId)" : " AND e.examregID IN ($request->examRegId)";
        }
        if($request->staffId){
            $condition .= " AND sbs.staffID IN ($request->staffId)";
        }
        if($request->groupBy == "subjectId"){
            $groupBy = " GROUP BY  e.subjectID";
        }
        $sql = "SELECT s.subjectName,s.subjectDesc,e.examID as examId,e.subjectID as subjectId FROM exam e
                INNER JOIN subjects s ON s.subjectID = e.subjectID
                INNER JOIN sbs_relation sbs ON sbs.batchID = e.batchID AND sbs.subjectID = e.subjectID AND sbs.semID = e.semID
                WHERE 1=1 $condition $groupBy";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * get subjects by staff request
     */
    public function getSubjectByStaffRequest($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = "";
        if ($request->staffId) {
            $condition .= " AND sbs.staffID IN ($request->staffId)";
        }
        if($request->batchStartYear){
            $condition .= " AND b.batchStartYear IN ($request->batchStartYear)";
        }
        if($request->semId){
            $condition .= " AND sbs.semID IN ($request->semId)";
        }
        if($request->subjectId){
            $condition .= " AND sbs.subjectID IN ($request->subjectId)";
        }
        if ($request->batchId) {
            $condition .= " AND b.batchID IN ($request->batchId)";
        }
        if($request->groupBySubject){
            $groupBy = " GROUP BY sbs.subjectID";
        }
        else if ($request->groupByBatch) {
            $groupBy = " GROUP BY sbs.batchID";
        }
        if($request->subBatchId){
            if ($request->subBatchId) {
                $condition .= " AND ssbs.subbatchID IN ($request->subBatchId)";
            }
            $sql = "SELECT s.subjectID as subjectId,s.subjectName,s.subjectDesc,b.batchID as batchId,b.batchName,s.syllabusName,CONCAT(s.syllabusName,' ',s.subjectDesc) as nameFormat1,sbs.staffId,sa.staffName   
            FROM subbatch_sbs ssbs 
            INNER JOIN sbs_relation sbs ON sbs.sbsID = ssbs.sbsID 
            INNER JOIN subjects s ON s.subjectID = sbs.subjectID
            INNER JOIN batches b ON b.batchID = sbs.batchID
            INNER JOIN staffaccounts sa ON sa.staffID = sbs.staffID
            WHERE 1=1 $condition $groupBy";
        }else{
            $sql = "SELECT s.subjectID as subjectId,s.subjectName,s.subjectDesc,b.batchID as batchId,b.batchName,s.syllabusName,CONCAT(s.syllabusName,' ',s.subjectDesc) as nameFormat1,sbs.staffId,sa.staffName 
                FROM sbs_relation sbs
                INNER JOIN subjects s ON s.subjectID = sbs.subjectID
                INNER JOIN batches b ON b.batchID = sbs.batchID
                INNER JOIN staffaccounts sa ON sa.staffID = sbs.staffID
                WHERE 1=1 $condition $groupBy";
        }
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $semId
     * @param $subjectId
     * @return array|Object
     * @throws ProfessionalException
     */
    public function getGroupSubjectsByBatchSubject($request)
    {
        $request = $this->realEscapeObject($request);
        $subjects = [];
        $condition = "";
        if($request->semId){
            if(is_array($request->semId)){
                $request->semId = implode(",",$request->semId);
            }
            $condition .=" AND semesters_id IN ($request->semId)";
        }
        $sql = "SELECT subjectGroups_id from subjectGroups_subjects where subjects_id='$request->subjectId' and batches_id='$request->batchId'";
        try {
            $subjectGroupId = $this->executeQueryForObject($sql)->subjectGroups_id;
            if($subjectGroupId)
            $sql = "SELECT subjectGroups_id as subjectGroupId,subjects_id as subjectId,semesters_id as semId,batches_id as batchId from subjectGroups_subjects where subjectGroups_id='$subjectGroupId' and batches_id='$request->batchId'
                    $condition";
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * @param String
     * @author Ajay C
     * @return Array
     */
    public function getSubjectsOfSemester($studentID,$semester)
    {
        $sql = "SELECT vas.name  FROM student_program_account spa
                INNER JOIN `groups` g ON g.id =spa.current_batch_id 
                INNER JOIN cm_curriculum_syllabus_relation ccsr ON ccsr.cm_curriculum_id =g.cm_curriculum_id 
                INNER JOIN cm_syllabus_academic_term_settings csats ON csats.cm_syllabus_id = ccsr.cm_syllabus_id 
                INNER JOIN semesters sr ON sr.termId = csats.academic_term_id 
                INNER JOIN cm_academic_paper cap ON cap.cm_syllabus_academic_term_settings_id =csats.id 
                INNER JOIN cm_academic_paper_subjects caps ON caps.cm_academic_paper_id = cap.id
                INNER JOIN v4_ams_subject vas ON vas.id = caps.ams_subject_id
             WHERE sr.semID ='$semester' AND spa.student_id ='$studentID'";
        try{
            $subjects = $this->executeQueryForList($sql);
        }catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * Get subjects and uploaded syllabus
     */
    public function getSyllabusUploadedDetailsBySubjectRequest($request)
    {
        $request =  $this->realEscapeObject($request);
        $sqlCondition = "";
        $joiningQuerry = "";
        if ($request->courseTypeId) {
            $sqlCondition .= " AND b.courseTypeID IN ($request->courseTypeId)";
        }
        if($request->batchStartYear){
            $sqlCondition .= " AND b.batchStartYear IN ($request->batchStartYear)";
        }
        if($request->semId){
            $sqlCondition .= " AND sbs.semID IN ($request->semId)";
        }
        if($request->staffId){
            $sqlCondition .= " AND s2.staffID IN ($request->staffId)";
            $joiningQuerry = "INNER JOIN staffaccounts s2 ON 
            s2.deptID = s.hdl_deptID
            INNER JOIN question_bank_syllabus_upload_settings qbsus ON
            qbsus.subject_id = s.subjectID AND
            qbsus.semester_id = sbs.semID AND
            qbsus.course_type_id = b.courseTypeID AND 
            qbsus.batch_start_year = b.batchStartYear";
        }
        else{
            $joiningQuerry = " LEFT JOIN question_bank_syllabus_upload_settings qbsus ON
            qbsus.subject_id = s.subjectID AND
            qbsus.semester_id = sbs.semID AND
            qbsus.course_type_id = b.courseTypeID AND 
            qbsus.batch_start_year = b.batchStartYear";
        }
        
        $subjects = [];
        $sql = "SELECT 
                    s.subjectID, 
                    s.syllabusName, 
                    s.subjectName, 
                    s.subjectDesc, 
                    s.isTheory, 
                    s.deptID,
                    qbsus.startDate,
                    qbsus.endDate,
                    qbsus.resourseId,
                    lr.path, 
                    lr.storage_object,
                    qbsus.id AS syllabusSettingsId  
                FROM 
                    subjects s 
                INNER JOIN sbs_relation sbs ON 
                    (s.subjectID = sbs.subjectID) 
                INNER JOIN batches b ON 
                    (b.batchID = sbs.batchID) 
                    $joiningQuerry
                LEFT JOIN lin_resource lr ON 
                    lr.id = qbsus.resourseId
                WHERE 
                    1 = 1 
                    $sqlCondition 
                GROUP BY 
                    sbs.subjectID";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    /**
     * @param $request
     * save question bank syllabus settings
     */
    public function saveQuestionBackSyllabysSettings($request)
    {
        $request = $this->realEscapeObject($request);
        $createdBy = $_SESSION['adminID'];
        $sql = "SELECT * from question_bank_syllabus_upload_settings WHERE course_type_id ='$request->courseTypeId' AND semester_id='$request->semId' AND subject_id = '$request->subjectId' AND batch_start_year = '$request->batchStartYear'";
        try {
            $result = $this->executeQueryForList($sql);
            if(empty($result)){
                $sql1 = "INSERT INTO question_bank_syllabus_upload_settings(course_type_id,batch_start_year,semester_id, subject_id, startDate,endDate,created_by) VALUES('$request->courseTypeId','$request->batchStartYear','$request->semId','$request->subjectId','$request->startDate','$request->endDate','$createdBy')";
            }
            else{
                $sql1 = "UPDATE question_bank_syllabus_upload_settings set startDate = '$request->startDate' , endDate = '$request->endDate', updated_by = '$createdBy'  WHERE course_type_id ='$request->courseTypeId' AND semester_id='$request->semId' AND subject_id = '$request->subjectId' AND batch_start_year = '$request->batchStartYear'";
            }
            $this->executeQuery($sql1);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $request
     * save question bank syllabus settings
     */
    public function saveQuestionBackSyllabusResourceId($request)
    {
        $request = $this->realEscapeObject($request);
        $createdBy = $_SESSION['staffID'];
        try {
            $sql1 = "UPDATE question_bank_syllabus_upload_settings set resourseId = '$request->resourceId', updated_by = '$createdBy'  WHERE id = '$request->syllabusSettingsId'";
            $this->executeQuery($sql1);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getSubjectsAssignedWithSecondLanguageAndCbeRequestStatus($studentID,$secondLanguageID,$batchID,$semID)
    {
        $batchID = $this->realEscapeObject($batchID);
        $semID = $this->realEscapeObject($semID);
        $secondLanguageID = $this->realEscapeObject($secondLanguageID);
        $studentID = $this->realEscapeObject($studentID);
        $subjectDetails = new stdClass();
        $normalSubjects = [];
        $pseudoSubjects = [];
        $otherSBS = [];
        $finalizedPseudo = [];
        $subjectCodes = [];
        try{
            
            //to check a ps_subject is created for student's secondlanguage 
            // $sql = "SELECT
            //             ps.pseudosubjectID,
            //             p.subjectName,
            //             ss.subjectID,
            //             sr.sbsID
            //         from
            //             sbs_relation sr
            //         inner join subjects ss on
            //             ss.subjectID = sr.subjectID
            //         inner join pseudosubjects_sbs ps
            //             on ps.sbsID = sr.sbsID
            //         inner join pseudosubjects p
             //             on p.pseudosubjectID = ps.pseudosubjectID
            //         inner join pseudosubjects_students ps2 
            //             on ps2.pseudosubjectID  = p.pseudosubjectID 
            //         INNER JOIN studentaccount s 
            //             on s.studentID  = ps2.studentID 
            //         WHERE
            //             sr.batchID = '$batchID'
            //             and sr.semID = '$semID'
            //             and s.secondlangaugeID  = '$secondLanguageID' 
            //             and s.studentID  = '$studentID'
            //         GROUP BY ps.pseudosubjectID";
            
            // $ps_SecondLanguage = $this->executeQueryForList($sql);
            // if(count($ps_SecondLanguage)>0)
            // {
            //     $hasSecondLanguage = true;
            //     //batch has a secondlanguage ps_subject defined from students secondlanguage
            //     foreach($ps_SecondLanguage as $index=>$result)
            //     {
            //         if($result->pseudosubjectID)
            //         {
            //             $sql = "SELECT ps.pseudosubstudentID,
            //                             p.pseudosubjectID ,
            //                             p.subjectName,
            //                             ps2.sbsID,
            //                             UPPER(s.subjectDesc) as parentSubName,
            //                             UPPER(s.subjectName) as parentSubCode,
            //                             UPPER(sc.subjectcatName) as subjectCatName,
            //                             UPPER(sc.subjectcatCode) as subjectCatCode
            //                         from pseudosubjects_students ps
            //                          inner join pseudosubjects p on p.pseudosubjectID = ps.pseudosubjectID
            //                          inner join pseudosubjects_sbs ps2 on p.pseudosubjectID = ps2.pseudosubjectID
            //                          inner join sbs_relation sr on sr.sbsID = ps2.sbsID
            //                          inner join subjects s on s.subjectID = sr.subjectID
            //                          inner join subject_category sc on s.subjectcatID  = sc.subjectcatID
            //                         where ps.pseudosubjectID ='$result->pseudosubjectID' and studentID = '$studentID'";
            //             $secondLangDetails = $this->executeQueryForObject($sql);
            //             if($secondLangDetails)
            //             {
            //                 $ps_SecondLanguage[$index] = $secondLangDetails;
            //                 $subjectCodes[] = trim($secondLangDetails->parentSubCode);
            //             }
            //             else
            //             {
            //                 $emptyStudent = new stdClass();
            //                 $emptyStudent->pseudosubstudentID = "";
            //                 $emptyStudent->pseudosubjectID = "";
            //                 $emptyStudent->subjectName = "";
            //                 $emptyStudent->sbsID = "";
            //                 $emptyStudent->parentSubName = "";
            //                 $emptyStudent->parentSubCode = "";
            //                 $ps_SecondLanguage[$index] = $emptyStudent;
            //             }
            //             $otherSBS [] =  $secondLangDetails->sbsID;
            //         }
            //         else
            //         {
            //             error_log('ps_id_empty');
            //         }
            //     }
            // }
            // else{
            //     //batch has no secondlanguage ps_subject defined from students secondlanguage
            // }
            //check in cbe applications
            // 
            $applications = [];
            $sql = "SELECT
                        ca.id ,
                        ca.name,
                        cabs.id as cabsId
                    from
                        cbe_application_batches_semesters cabs
                    inner join studentaccount s on
                        s.batchID = cabs.batch_id 
                    inner join batches b on b.batchID = s.batchID 
                    inner join semesters s2 on s2.semID = b.semID and cabs.semester_id = b.semID
                    inner join cbe_applications ca on ca.id = cabs.application_id 
                    WHERE s.studentID = $studentID and ca.is_published =1";
            $applicationsOfBatch = $this->executeQueryForList($sql);
            if(count($applicationsOfBatch)>0)
            {
                //has cbe application present for batch
                $hasCbeApplication = true;
                foreach ($applicationsOfBatch as $application)
                {
                    
                    $sql = "SELECT
                                p.pseudosubjectID as psId,
                                UPPER(p.subjectName) as psName,
                                UPPER(s.syllabusName) as parentSubName
                            from
                                cbe_application_batches_semesters cabs
                                inner join cbe_student_registered_application csra on csra.application_id = cabs.application_id  
                                inner join cbe_subject_assigned_batches csab on csab.application_id = cabs.application_id 
                                inner join pseudosubjects p on p.pseudosubjectID = csab.pseudo_subject_id 
                                left join subject_pseudo_subjects sps on sps.pseudo_subject_id = p.pseudosubjectID 
                                inner join subjects s on s.subjectID = sps.subject_id 
                                inner join pseudosubjects_students pss on pss.studentID = csra.student_id and pss.pseudosubjectID = csab.pseudo_subject_id
                            WHERE
                                cabs.id = '$application->cabsId' and csra.student_id = '$studentID";
                    $assignedSubject = $this->executeQueryForObject($sql);
                    if($assignedSubject)
                    {
                        $app = new stdClass();
                        $app->psID = $assignedSubject->psId;
                        $app->psName = $assignedSubject->psName;
                        $app->parentSubName = $assignedSubject->parentSubName;
                        $app->category = $assignedSubject->category;
                        $applications[] = $app;
                        $otherSBS[]=$assignedSubject->sbsID;
                    }
                    else{
                        $app = new stdClass();
                        $app->psID = "";
                        $app->psName = "";
                        $app->parentSubName = "";
                        $app->category = "";
                        $applications[] = $app;
                    }
                }
            }
            else{
                
                //no cbe applications present for this batch
            }
            $subjects = [];
            $sql = "SELECT t2.subjectID,
                             t2.subjectName,
                            UPPER(t2.subjectDesc) as fullName,
                             t3.staffID,
                             t3.staffName,
                             t1.sbsID,
                            t2.syllabusName as syllabusCode
                             FROM sbs_relation t1,subjects t2, staffaccounts t3 
                             WHERE t1.subjectID = t2.subjectID 
                             AND t1.staffID = t3.staffID 
                             AND t1.csID = 0 AND t1.batchID = " . $batchID . 
                             AND t1.semID = " . $semID . " ORDER BY t2.subjectName";
            $result = $this->executeQueryForList($sql);
                if (count($result) > 0) 
                {
                    foreach($result as $row) 
                    {
                        $row = (Array)$row;
                        $sql_subbatch_chk = "SELECT t2.subbatchID,
                                                     t3.studentID,
                                                     t4.subbatchName 
                                                     FROM sbs_relation t1
                                                    INNER JOIN subbatch_sbs t2 ON t1.sbsID = t2.sbsID
                                                    LEFT JOIN subbatch_student t3 ON t2.subbatchID = t3.subbatchID 
                                                    AND t3.studentID = " . $_SESSION ['studentID'] . " LEFT JOIN subbatches t4 ON t3.subbatchID = t4.subbatchID
                                                    WHERE t1.subjectID = " . $row ['subjectID']."  
                                                    AND t1.semID = " . $semID . 
                                                    AND t1.staffID = " . $row ["staffID"] .
                                                    AND t1.batchID = " . $batchID . "";
                        $result_subbatch_chk = $this->executeQueryForList($sql_subbatch_chk);
                        if (count($result_subbatch_chk) > 0) 
                        {
                            foreach($result_subbatch_chk as $row_subbatch_chk ) 
                            {
                                $row_subbatch_chk = (Array)$row_subbatch_chk;
                                if ($row_subbatch_chk["subbatchID"] && $row_subbatch_chk["studentID"]) 
                                {
                                    $subjectDet = new stdClass();
                                    $subjectDet->subjectID = $row["subjectID"];;
                                    $subjectDet->subjectCode = trim($row["subjectName"]);
                                    $subjectDet->subjectName = $row["fullName"];
                                    if(! in_array($subjectDet->subjectCode,$subjectCodes))
                                    {
                                        $subjects [] = $subjectDet;
                                        $subjectCodes[] = $subjectDet->subjectCode;
                                    }
                                }
                            }
        
                        }
                        else
                        {
                            $sql_chk = "SELECT t2.subbatchID
                                             FROM sbs_relation t1
                                            INNER JOIN subbatch_sbs t2 ON t1.sbsID = t2.sbsID 
                                            WHERE t1.subjectID = " . $row ["subjectID"] . "
                                            AND t1.semID = " . $semID . 
                                            AND t1.batchID = " . $batchID . "";
                            $result_chk = $this->executeQueryForList($sql_chk);
                            if (!count($result_chk))
                            {
                                $subjectDet = new stdClass();
                                $subjectDet->subjectID = $row["subjectID"];;
                                $subjectDet->subjectCode = trim($row["subjectName"]);
                                $subjectDet->subjectName = $row["fullName"];
                                $found = false;
                                if(! in_array($subjectDet->subjectCode,$subjectCodes))
                                {
                                    $subjects [] = $subjectDet;
                                    $subjectCodes[] = $subjectDet->subjectCode;
                                }
                            }
                        }
        
        
                    }
                }
        
        
            /*
            $sql = "SELECT
                    DISTINCT (s.subjectID) ,
                    sr.sbsID ,
                    UPPER(s.subjectName) as subjectCode,
                    UPPER(s.subjectDesc) as subjectName,
                    sr.isPseudosubject,
                    sc.subjectcatName,
                    sc.subjectcatCode as subjectCatCode
            from
                sbs_relation sr
            inner join subjects s on
                s.subjectID = sr.subjectID
            inner join subject_category sc on
                s.subjectcatID  = sc.subjectcatID
            where
                sr.batchID = '$batchID'
                and sr.semID = '$semID'
            group by s.subjectID DESC";
            $relations = $this->executeQueryForList($sql);
            foreach($relations as $relation)
            {   
                if($relation->isPseudosubject == '0')
                {
                    //normal papers
                    $normalSubjects[] = $relation;
                }
                else
                {
                    if(!in_array($relation->sbsID,$otherSBS))
                    {
                        //pseudo subjects but not language
                        $normalSubjects[] = $relation;
                    }
                }
            }
            
            */
            //setting the object to send
            $subjectDetails->normalSubjects = $subjects;
            // $subjectDetails->hasSecondLanguage = $hasSecondLanguage?$hasSecondLanguage:false;
            // $subjectDetails->secondlanguage = $ps_SecondLanguage;
            $subjectDetails->hasCbeApplication = $hasCbeApplication?$hasCbeApplication:false;
            $subjectDetails->cbeApplications = $applications;
        }catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectDetails;
    }   
    // public function checkPseudoSubjectsOfSecondLangauge($secondLanguageID,$pseudoSubjects)
    // {
    //     $secondLanguageID = $this->realEscapeObject($secondLanguageID);
    //     $pseudoSubjects = $this->realEscapeArray($pseudoSubjects);
    //     try{
    //         $sql = "SEL";
    //     }catch (\Exception $e) {
    //         throw new ProfessionalException($e->getCode(), $e->getMessage());
    //     }
    // }
    /**
     * @param String $subjectName
     * For Excel purpose
     */
    public function getSubjectByName($subjectName)
    {
        $subjectName = $this->realEscapeString($subjectName);
        try {
            $sql = "select s.subjectID, s.subjectName from subjects s where s.subjectName = '$subjectName';";
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param Object $request
     * For Excel purpose
     */
    public function getSbsRelationBySubjectName($request)
    {
        $request = $this->realEscapeObject($request);
        try {
            $sql = "SELECT sr.sbsID FROM sbs_relation sr 
            INNER JOIN subjects s ON s.subjectID = sr.subjectID 
            WHERE sr.batchID IN (".implode(',',$request->batchIds).") AND sr.semID = '$request->semId' AND s.subjectName = '$request->subjectName';";
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getSubjectCategories(){
        try {
            $sql = "SELECT subjectcatID AS id,subjectcatName AS name,subjectcatCode AS code,subjectcatPriority AS `priority` FROM subject_category WHERE canShow = 0;";
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    } 
    /**
     * @param $departmentId
     * @param $semesterId
     * @return array|Object
     * @throws ProfessionalException
     */
    public function getAllSubjectsWithSyllabusCodeByDepartmentAndSemester($departmentId = null, $semesterId = null)
    {
        $condition = "";
        if (!empty($departmentId)) {
            $condition .= " AND sdr.deptID = $departmentId ";
        }
        if (!empty($semesterId)) {
            $condition .= " AND ssr.semID = $semesterId ";
        }
        $sql = "SELECT DISTINCT s.subjectID as id, s.syllabusName as name, s.subjectDesc as description
                FROM subjects s
                INNER JOIN sd_relation sdr ON sdr.subjectID = s.subjectID
                INNER JOIN subject_sem_relation ssr ON ssr.subjectID = s.subjectID
                WHERE s.hide=0  $condition
                ORDER BY s.subjectName ";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param request
     * @param $semesterId
     * @return array|Object
     * @throws ProfessionalException
     */
    public function getAllSubjectWithSyllabusCodeByRequest($request)
    {
        $request = $this->realEscapeObject($request);
        if($request->courseTypeId)
        {
            $cond = "AND  courseTypeID = '$request->courseTypeId";
        }
        $sql = "SELECT subjectID as id,
                                    syllabusName as code,
                                    subjectDesc as name,
                                    hdl_deptID as handlingDepartment,
                                    syllabusYear 
                        from subjects where hdl_deptID  $cond";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
     /**
     * @param $name
     * @return Object
     * @throws ProfessionalException
     * @author Ajay C
     */
    public function searchSubjectByStringWithSyllabusCode($name)
    {
        $name = $this->realEscapeString($name);
        $sql = "SELECT * FROM(SELECT CONCAT(syllabusName,' ',subjectDesc) AS name FROM subjects) AS subjectName WHERE name LIKE '%$name%'";
        try {
            $response = $this->executeQueryForList($sql);
            $response = CommonUtil::decodeHtmlSpecialChars($response);
            return $response;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
     /**
     * get subject and staff details by sbs id
     * @param int $sbsId,SubjectId
     * @return object|NULL|\com\linways\base\util\$objectList[]
     * @throws ProfessionalException
     */
    public function getSubjectDetailsBySbsIdWithEvaluations($sbsId,$evalID)
    {
        $sbsId = $this->realEscapeString($sbsId);
        $evalID = $this->realEscapeString($evalID);
        $subjectDetails = null;
        $sql = "SELECT sa.staffID,
                     sa.staffCode,
                     sa.staffName,
                     sbs.sbsID,
                     sub.subjectID,
                     sub.subjectName,
                     sub.syllabusName,
                     sub.subjectDesc as description,
                     bth.batchName,
                     sem.semName,
                     dept.deptName,
                     sub.universityAllottedHours,
                     sbs.semID,
                     sbs.batchID FROM staffaccounts sa  
                     INNER JOIN sbs_relation sbs ON sa.staffID=sbs.staffID 
                     INNER JOIN subjects sub ON sbs.subjectID=sub.subjectID 
                     INNER JOIN batches bth ON bth.batchID=sbs.batchID 
                     INNER JOIN semesters sem ON sem.semID=bth.semID 
                     INNER JOIN department dept ON dept.deptID=bth.deptID
                     INNER JOIN staffeval_stafflist slist on sbs.sbsID = slist.sbsID 
                     WHERE sbs.sbsID=$sbsId";
        try {
            $subjectDetails = $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),
                         $e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * Get all subjects that student need to register for exam
     * @param Integer $studentID
     * @param Integer $batchID
     * @param Integer $examregID
     * @return Array Exam subject list
     * @throws ProfessionalException
     * @author Vishnu M
     */
    public function getStudentExamSubjectsForRegistration($request)
    {
        $request = $this->realEscapeObject($request);
        $subjects = [];
        $studentCondition = "";
        if ($request->studentId) {
            $studentCondition .= " AND sa.studentID = '$request->studentId";
        }
        if($request->isTheory){
            $studentCondition .= " AND s.isTheory IN ($request->isTheory)";
        }
        $sql = "SELECT 
                    sa.studentID, s.subjectID, s.subjectName, s.subjectDesc,ersf.examfeesAmount as examFees
                FROM
                    subjects s
                        INNER JOIN
                    sbs_relation sbs ON s.subjectID = sbs.subjectID
                        INNER JOIN
                    exam_registration_subject_fees ersf ON sbs.subjectID = ersf.subjectID
                        AND ersf.batchID = sbs.batchID
                        AND ersf.semID = sbs.semID
                        INNER JOIN
                    exam_registration_batches erb ON ersf.examregID = erb.examregID
                        AND ersf.batchID = erb.batchID
                        AND ersf.semID = erb.semID
                        INNER JOIN
                    studentaccount sa ON sa.batchID = erb.batchID
                WHERE
                    ersf.examregID = '$request->examRegId'
                        AND ersf.batchID = '$request->batchId'
                        AND (
                                sbs.sbsID IN (
                                    SELECT 
                                        psbs.sbsID
                                    FROM
                                        pseudosubjects_sbs psbs
                                            INNER JOIN
                                        pseudosubjects_students ps ON (ps.pseudosubjectID = psbs.pseudosubjectID)
                                    WHERE
                                        psbs.sbsID = sbs.sbsID
                                            AND ps.studentID = sa.studentID UNION SELECT 
                                        ssbs.sbsID
                                    FROM
                                        subbatch_sbs ssbs
                                            INNER JOIN
                                        subbatch_student ss ON ssbs.subbatchID = ss.subbatchID
                                    WHERE
                                        ss.studentID = sa.studentID
                                            AND ssbs.sbsID = sbs.sbsID
                                )
                                OR sbs.sbsID NOT IN (
                                    SELECT 
                                        sbsID
                                    FROM
                                        subbatch_sbs
                                )
                            )
                        $studentCondition
                GROUP BY sa.studentID, sbs.subjectID";
        try {
            $subjects = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjects;
    }
    function getAllSecApplications()
    {
        try {
            $sql = "SELECT
                        sa.id,
                        UPPER(sa.name) as `name`,
                        `from`,
                        `to`,
                        sa.created_by,
                        sa.updated_by,
                        sa.description,
                        count(DISTINCT sb.batch_id) as batchCount
                    FROM
                        sec_application sa
                    left join sec_batches sb
                        on sb.sec_id = sa.id 
                    group by sa.id
                        ORDER BY
                        sa.id DESC;";
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    function createSecApplication($applicatioName, $applicationDesc, $fromDate, $toDate)
    {
        try{
            $applicatioName = $this->realEscapeString($applicatioName);
            $applicationDesc = $this->realEscapeString($applicationDesc);
            $fromDate = $this->realEscapeString($fromDate);
            $toDate = $this->realEscapeString($toDate);
            $startDateTime = new DateTime($fromDate);
            $startDateTime->setTime(0, 0, 0);
            $startDateTime = $startDateTime->format('Y-m-d H:i:s');
            $endDateTime = new DateTime($toDate);
            $endDateTime->setTime(23, 59, 59);
            $endDateTime = $endDateTime->format('Y-m-d H:i:s');
            $staffID =$_SESSION['adminID'];
            $sql = "INSERT INTO `sec_application` (`name`,
                                                     `from`,
                                                     `to`,
                                                     `created_by`,
                                                     `updated_by`,
                                                     `created_date`,
                                                     `updated_date`,
                                                     `description`)VALUES ('$applicatioName', '$startDateTime', '$endDateTime', $staffID$staffID, NOW(), NOW(), '$applicationDesc');";
            return $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        
    }
    public function updateSecApplication($editingAppId,$applicatioName, $applicationDesc, $fromDate, $toDate)
    {
        $editingAppId = $this->realEscapeString($editingAppId);
        $applicatioName = $this->realEscapeString($applicatioName);
        $applicationDesc = $this->realEscapeString($applicationDesc);
        $fromDate =date('Y-m-d', strtotime($this->realEscapeString($fromDate)));
        $toDate = date('Y-m-d', strtotime($this->realEscapeString($toDate)));
        // $startDateTime = new DateTime($fromDate);
        // $startDateTime->format('Y-m-d H:i:s');
        // $endDateTime = new DateTime($toDate);
        // $endDateTime->format('Y-m-d H:i:s');
        // $fromDate= $startDateTime->setTime(0, 0, 0);
        // $toDate = $endDateTime->setTime(23, 59, 59);
        // $fromDate = $fromDate->date;
        // $toDate = $toDate->date;
        $startDateTime = new DateTime($fromDate);
        $startDateTime->setTime(0, 0, 0);
        $startDateTime = $startDateTime->format('Y-m-d H:i:s');
        $endDateTime = new DateTime($toDate);
        $endDateTime->setTime(23, 59, 59);
        $endDateTime = $endDateTime->format('Y-m-d H:i:s');
        try{
            if($startDateTime && $endDateTime)
            {
                $sql = "UPDATE sec_application sec_application SET `from`='$startDateTime', `to`='$endDateTime', `name` = '$applicatioName', `description`='$applicationDesc' WHERE id = $editingAppId";
                return $this->executeQuery($sql);
            }
            else
            {
                return false;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
         /**
     * @param $request
     * @return Object
     * @throws ProfessionalException
     * @author Sibin C
     */
    public function replaceSubjectsByBatchSemSubject($request)
    {
        $request = $this->realEscapeObject($request);
        $sql = "";
        $subjects = $request->subjects;
        $tableNames1 = array(
            'sbs_relation',
            'exam_subjectcredit',
            'internal_marks_submitted',
            'internal_marks_settings',
            'internal_marks',
            'exam_registration_subject_fees',
            'exam',
            'batch_sem_subjectCategory_relation'
        );
        $customIndexes1 = array(
            'SBS RELATION',
            'EXAM SUBJECT CREDIT',
            'INTERNAL MARK SUBMITTED',
            'INTERNAL MARK SETTINGS',
            'INTERNAL MARK',
            'EXAM REG SUBJECT FEE',
            'EXAM',
            'BATCH SUBJECT CATEGORY'
            // Add more custom indexes as needed
        );
        $tableNames1 = array_combine($customIndexes1, $tableNames1);
        $tableNames2 = array('subjectGroups_subjects');
        $customIndexes2 = array(
            'SUBJECT GROUP SUBJECTS',
            // Add more custom indexes as needed
        );
        $tableNames2 = array_combine($customIndexes2, $tableNames2);
        $tableNames3 = array('exam_reg_studentsubject','gracemarks_student_marks');
        $customIndexes3= array(
            'EXAM REG STUDENT SUBJECT',
            'GRACE MARK STUDENT MARKS'
            // Add more custom indexes as needed
        );
        $tableNames3 = array_combine($customIndexes3, $tableNames3);
        $notUpdated =[];
        try {
            foreach($subjects as $subject){
                $subject = (object) $subject;
                //REPLACE PROCESS FOR new subject assigned subject
                if((int)$subject->newSubjectId){
                    // for tables1
                    $commonCondition = " AND batchID IN ($request->batchId) AND semID IN ($request->semId)";
                    $selectCondition = $commonCondition ." AND subjectID in ($subject->newSubjectId)";
                    $updateCondition = $commonCondition ." AND subjectID in ($subject->id)";
                    foreach($tableNames1 as $key => $table){
                        $selectSql = "SELECT * FROM $table WHERE 1=1 $selectCondition";
                        $result = $this->executeQueryForList($selectSql);
                        if(empty($result)){
                            $updateSql = "UPDATE $table set subjectID = $subject->newSubjectId WHERE 1=1 $updateCondition";
                            $response = $this->executeQuery($updateSql);
                        }else{
                            $notUpdated[$key][]=$subject->name;
                        }
                    }
                    // for tables2
                    $commonCondition = " AND batches_id IN ($request->batchId) AND semesters_id IN ($request->semId)";
                    $selectCondition = $commonCondition ." AND subjects_id in ($subject->newSubjectId)";
                    $updateCondition = $commonCondition ." AND subjects_id in ($subject->id)";
                    foreach($tableNames2 as $key => $table){
                        $selectSql = "SELECT * FROM $table WHERE 1=1 $selectCondition";
                        $result = $this->executeQueryForList($selectSql);
                        if(empty($result)){
                            $updateSql = "UPDATE $table set subjects_id = $subject->newSubjectId WHERE 1=1 $updateCondition";
                            $response = $this->executeQuery($updateSql);
                        }else{
                            $notUpdated[$key][]=$subject->name;
                        }
                    }
                    // for tables3
                    $commonCondition = " AND studentID in (select studentID from studentaccount where batchID in ($request->batchId))";
                    $selectCondition = $commonCondition ." AND subjectID in ($subject->newSubjectId)";
                    $updateCondition = $commonCondition ." AND subjectID in ($subject->id)";
                    foreach($tableNames3 as $key => $table){
                        $selectSql = "SELECT * FROM $table WHERE 1=1 $selectCondition";
                        $result = $this->executeQueryForList($selectSql);
                        if(empty($result)){
                            $updateSql = "UPDATE $table set subjectID = $subject->newSubjectId WHERE 1=1 $updateCondition";
                            $response = $this->executeQuery($updateSql);
                        }else{
                            $notUpdated[$key][]=$subject->name;
                        }
                    }
                    
                }
            }
            $response->notUpdated = $notUpdated;
            return $response;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $request
     * get question bank syllabus settings
     */
    public function getQuestionBackSyllabusResourceId($request)
    {
        $request = $this->realEscapeObject($request);
        try {
            $bathDetails = BatchService::getInstance()->getBatchById($request->batchId);
            if($request->subjectId && $request->semId && $bathDetails->startYear && $bathDetails->courseType){
                $sql = "SELECT resourseId FROM question_bank_syllabus_upload_settings  WHERE course_type_id = '$bathDetails->courseType' AND batch_start_year = '$bathDetails->startYear' AND semester_id = '$request->semId'  AND subject_id = '$request->subjectId'";
                return $this->executeQueryForList($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
        /**
     * @param $batchId
     * @param $semId
     * @param int $groupId
     * @return Object
     * @throws ProfessionalException
     */
    public function getSubjectEcGroupSubjectsByBatchSem($batchId,$subjectIds,$semId = 0)
    {
        $batchId = $this->realEscapeString($batchId);
        $semId = $this->realEscapeString($semId);
        $subjectIds = $this->realEscapeArray($subjectIds);
        if(is_array($subjectIds )){
            $subjectIds = implode(",", $subjectIds);
        }
        $condition = "";
        if($semId){
            $condition .=" AND sgs.semesters_id = ($semId)";
        }
        try {
            $sql = "SELECT
                    sgs.id,
                    sgs.subjectGroups_id AS subjectGroupId,
                    sgs.batches_id AS batchId,
                    sgs.semesters_id AS semId,
                    sgs.subjects_id AS subjectId,
                    ecscg.name AS ec_subCatName,
                    ecscg.description AS ec_subCatDesc
                FROM
                    subjectGroups_subjects sgs
                    INNER JOIN ec_subject_category_group ecscg ON ecscg.id = sgs.ec_subject_cat_group_id
                WHERE
                    sgs.batches_id IN ($batchId )
                    AND sgs.subjects_id IN ($subjectIds)
                    $condition
                ORDER BY sgs.id";
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $request
     * @return Object
     * @throws ProfessionalException
     */
    public function getStudentMinorHonoursPseudoSubjectBasketName($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = "";
        if($request->studentId){
            $condition .=" AND pss.studentID IN ($request->studentId)";
        }
        if($request->shortCourseIds){
            $condition .=" AND er.shortCourse IN ($request->shortCourseIds)";
        }
        try {
            $sql = "SELECT DISTINCT psg.id, psg.name
                    FROM pseudo_subject_groups psg
                    INNER JOIN pseudosubjects ps ON psg.id = ps.pseudo_subject_group_id
                    INNER JOIN pseudosubjects_students pss ON ps.pseudosubjectID = pss.pseudosubjectID
                    INNER JOIN subject_pseudo_subjects sps ON ps.pseudosubjectID = sps.pseudo_subject_id
                    INNER JOIN exam e ON sps.subject_id = e.subjectID
                    INNER JOIN exam_registration er ON e.examregID = er.examregID
                    INNER JOIN exam_reg_studentchallan ers ON ers.examregID = er.examregID AND ers.studentID = pss.studentID
                    INNER JOIN exam_reg_studentsubject erss ON erss.examregID = er.examregID AND erss.studentID = pss.studentID AND erss.subjectID = e.subjectID 
                    WHERE 1=1 AND ers.paid=1 $condition";
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getSubjectDetailsByClusterID($clusterID)
    {
        try{
            $clusterID = $this->realEscapeObject($clusterID);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getAllSubjectCategoriesv4()
    {
        $sql = '';
        $subjectCatDetails = [];
        try {
            $sql = "SELECT id as subjectCatId,name as categoryName,'1' as subjectcatPriority,code,NULL as parentId from cm_subject_types;";
            $subjectCatDetails = $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $subjectCatDetails;
    }
}