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 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 866
MarkReportService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 10
14280.00
0.00% covered (danger)
0.00%
0 / 866
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 getStudentRegularExamMarkDetails
0.00% covered (danger)
0.00%
0 / 1
420.00
0.00% covered (danger)
0.00%
0 / 177
 getOverallMarkDetails
0.00% covered (danger)
0.00%
0 / 1
552.00
0.00% covered (danger)
0.00%
0 / 166
 getStudentMarkHistory
0.00% covered (danger)
0.00%
0 / 1
812.00
0.00% covered (danger)
0.00%
0 / 236
 getAllStudentPassStatus
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 41
 getGraduationRateDetails
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 57
 getCourseWiseSuccessRateForDashBoard
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 46
 getRegisteredStudentDetailsByExamRegistrationId
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 42
 getRevaluationAppliedDetailsByExamRegistrationId
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 48
 getRevaluationMarkEnteredDetailsByExamRegistrationId
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 51
<?php
namespace com\linways\ec\core\service;
use com\linways\base\util\SecurityUtils;
use com\linways\base\util\MakeSingletonTrait;
use com\linways\ec\core\exception\ECCoreException;
use com\linways\ec\core\request\MarkReportRequest;
use com\linways\ec\core\dto\exam\AcademicTermMark;
use com\linways\ec\core\constant\StatusConstants;
use com\linways\ec\core\dto\exam\StudentDetails;
use com\linways\ec\core\dto\StudentMarkDetails;
use com\linways\ec\core\dto\exam\RegularExam;
use com\linways\ec\core\dto\exam\ExamSubject;
use com\linways\ec\core\dto\exam\MarkHistory;
use com\linways\core\ams\professional\request\examcontroller\ConsolidatedMarkReportRequest;
use com\linways\core\ams\professional\service\SubjectService as ProfessionalSubjectService;
use com\linways\core\ams\professional\service\examcontroller\migration\finalMarkList\ScekConsolidatedMarkService;
use com\linways\core\ams\professional\service\examcontroller\migration\finalMarkList\ConsolidatedMarkReportService;
use com\linways\core\ams\professional\util\CommonUtil;
use com\linways\ec\core\mapper\DashBoardServiceMapper;
class MarkReportService extends BaseService
{
    use MakeSingletonTrait;
    private function __construct() {
        $this->mapper = DashBoardServiceMapper::getInstance()->getMapper();
    }
     /**
     * Get regular exam mark details of a student by register number
     */
    public function getStudentRegularExamMarkDetails( ConsolidatedMarkReportRequest $request )
    {
        $request = $this->realEscapeObject($request);
        $regularExamMarkDetails = [];
        $condition = null;
        $failedBatchId = BatchService::getInstance()->getFailedBatchId();
        try {
            if ($request->regNo) {
                $condition .= " AND sa.regNo = '" . $request->regNo . "' ";
            }
            if ($request->studentId) {
                $condition .= " AND sa.studentID IN (" . $request->studentId . ") ";
            }
            if ($request->batchId) {
                if($request->serviceAction == 'REGULAR_MARKLIST'){
                    $condition .= " AND e.batchID IN (" . $request->batchId . ") ";
                }else if($request->serviceAction == 'CONSOLIDATED_MARKLIST'){
                    $condition .= " AND e.batchID IN (" . $request->batchId . ") ";
                    $condition .= " AND sa.batchID IN (" . $request->batchId . "$failedBatchId";
                }else{
                    $condition .= " AND sa.batchID IN (" . $request->batchId . ") ";
                }
            }
            if ($request->semId) {
                $semIdString = is_array($request->semId) ? implode(',',$request->semId) : $request->semId;
                $condition .= " AND sem.semID IN (" . $semIdString . ") ";
            }
            if ($request->examRegId) {
                $condition .= " AND er.examregID IN (" . $request->examRegId . ") ";
            }
            if ($request->coursePatternId) {
                $condition .= " AND b.patternID IN (" . $request->coursePatternId . ") ";
            }
            if ($request->subjectIds) {
                $subjectIdString = is_array($request->subjectIds) ? implode(',',$request->subjectIds) : $request->subjectIds;
                $condition .= " AND erss.subjectID IN ($subjectIdString";
            }
            if ($request->gender) {
                $condition .= " AND sa.studentGender LIKE '$request->gender";
            }
            if ($request->seatReservationId) {
                // reservID in studentaccount Table
                $seatReservationIdString = is_array($request->seatReservationId) ? implode(',',$request->seatReservationId) : $request->seatReservationId;
                $condition .= " AND sa.reservID IN ($seatReservationIdString";
            }
            if ($request->religionId) {
                $religionIdString = is_array($request->religionId) ? implode(',',$request->religionId) : $request->religionId;
                $condition .= " AND sa.religion IN ($religionIdString";
            }
            if ($request->campusTypeId) {
                $campusTypeIdString = is_array($request->campusTypeId) ? implode(',',$request->campusTypeId) : $request->campusTypeId;
                $condition .= " AND sa.campus_type_id IN ($campusTypeIdString";
            }
            $courseTypeUG = CourseTypeConstants::UG;
            $courseTypeUGPRO = CourseTypeConstants::UG_PRO;
            $courseTypeBPED = CourseTypeConstants::BPED;
            $sql = "SELECT DISTINCT
                        sa.studentID,
                        sa.studentName,
                        sa.regNo,
                        sa.rollNo,
                        sa.myImage,
                        sa.admissionNo,
                        sa.studentGender,
                        sa.batchID AS currentBatchId,
                        ea.isAbsent,
                        im.internalMarkID,
                        im.internalMarks AS internalMark,
                        ims.maxInternalMarks AS internalMax,
                        ims.markType AS internalMarkType,
                        e.examTotalMarks AS externalMax,
                        e.examName,
                        e.examID,
                        b.batchID,
                        b.batchName,
                        b.deptID,
                        b.totalSemester,
                        b.final_semester,
                        b.batchStartYear,
                        b.batchEndYear,
                        b.courseTypeID,
                        b.patternID,
                        sem.semID,
                        sem.semName,
                        sem.orderNo,
                        s.subjectID,
                        s.subjectName,
                        s.subjectDesc,
                        s.syllabusName, 
                        s.isTheory,
                        esc.subjectOrder,
                        s.subjectPriority,
                        IF(ct.course_Type IN ('$courseTypeUG','$courseTypeUGPRO','$courseTypeBPED'), ee.id, eef.examfinalizeID) AS markId,
                        IF(ct.course_Type IN ('$courseTypeUG','$courseTypeUGPRO','$courseTypeBPED'), ee.mark, eef.mark) AS externalMark,
                        esc.credit,
                        esc.isInternal,
                        esc.isExternal,
                        esc.excludeSubjectFromTotal,
                        esc.subjectType,
                        sc.subjectcatName,
                        sc.subjectcatCode,
                        sc.subjectcatID,
                        sc.code AS subjectCategoryCode,
                        et.typeID,
                        et.typeName,
                        et.isInternal AS isInternalExam,
                        et.isSupply,
                        er.examregID,
                        er.examregName,
                        er.examMonth,
                        er.examYear,
                        IF (ees.id, 1, 0) AS isExempted,
                        im.isAbsent AS isInternalAbsent
                    FROM
                        exam_subjectcredit esc
                            INNER JOIN
                        subjects s ON esc.subjectID = s.subjectID
                            INNER JOIN
                        semesters sem ON sem.semID = esc.semID
                            INNER JOIN
                        exam e ON e.subjectID = s.subjectID
                            AND e.batchID = esc.batchID
                            AND e.semID = esc.semID
                            INNER JOIN
                        exam_type et ON et.typeID = e.examTypeID
                            INNER JOIN
                        batches b ON b.batchID = e.batchID
                            INNER JOIN
                        exam_registration er ON er.examregID = e.examregID
                            INNER JOIN
                        exam_reg_studentsubject erss ON erss.subjectID = e.subjectID
                            AND erss.examregID = e.examregID
                            INNER JOIN
                        exam_reg_studentchallan ersc ON erss.examregID = ersc.examregID
                            AND erss.studentID = ersc.studentID
                            INNER JOIN
                        studentaccount sa ON sa.studentID = erss.studentID
                            AND sa.studentID = ersc.studentID
                            INNER JOIN 
                        course_type ct ON ct.courseTypeID = b.courseTypeID
                            LEFT JOIN
                        subject_category sc ON sc.subjectcatID = s.subjectcatID
                            LEFT JOIN
                        exammarks_external ee ON ee.examID = e.examID
                            AND sa.studentID = ee.studentID
                            LEFT JOIN
                        externalexammarks_finalized eef ON eef.examID = e.examID
                            AND sa.studentID = eef.studentID
                            LEFT JOIN
                        exam_attendance ea ON ea.examID = e.examID
                            AND ea.studentID = sa.studentID
                            LEFT JOIN
                        internal_marks im ON im.subjectID = e.subjectID
                            AND im.batchID = e.batchID
                            AND im.semID = e.semID
                            AND im.studentID = sa.studentID
                            LEFT JOIN
                        internal_marks_settings ims ON ims.subjectID = e.subjectID
                            AND ims.batchID = e.batchID
                            AND ims.semID = e.semID
                            LEFT JOIN 
                        exam_exempted_students ees ON ees.exam_id = e.examID
                            AND ees.studentaccount_id = sa.studentID
                            LEFT JOIN 
                        failed_students fs ON fs.studentID = sa.studentID
                            AND FIND_IN_SET(e.semID, fs.hisSemestersInThisbatch)
                    WHERE
                        e.examregID IS NOT NULL
                            AND ersc.paid = 1
                            AND e.batchID = IF (fs.previousBatch, fs.previousBatch, sa.batchID)
                            -- AND e.batchID IN (fs.previousBatch, sa.batchID)
                            $condition
                    ORDER BY esc.subjectOrder ASC, sa.regNo ASC, sem.semID ASC,s.subjectPriority ASC, fs.failedInSemester ASC";
            $regularExamMarkDetails = $this->executeQueryForList($sql, $this->mapper [ConsolidatedMarkReportServiceMapper::GET_REGULAR_EXAM_MARK_DETAILS]);
        } catch (\Exception $e) {
            throw new ECCoreException($e->getCode(), $e->getMessage());
        }
        return $regularExamMarkDetails;
    }
    /**
     * Consolidated Mark details
     * @param $request
     * @return Array $students
     */
    public function getOverallMarkDetails(ConsolidatedMarkReportRequest $request)
    {
        
        $request = $this->realEscapeObject($request);
        $collegeCodes = ["STTHOMAS","VIMALA"];
        $COLLEGE_CODE = $request->COLLEGE_CODE;
        $COLLEGE_CODE = "STTHOMAS";
        $students = [];
        if (!empty($request->examRegistrationId)) {
            $examRegObj = ConsolidatedMarkReportService::getInstance()->getExamRegistrationFromExamReg($request->examRegistrationId);
            if ($examRegObj->type == "REGULAR") {
                $request->examRegId = $examRegObj->examRegId;
            }
            else {
                $request->supplyRegId = $examRegObj->examRegId;
            }
            $request->considerSupplementary = false;
        }
        if (!empty($request->academicTermId)) {
            $request->semId = $request->academicTermId;
        }
        if (!empty($request->groupId)) {
            $request->batchId = implode(",",ConsolidatedMarkReportService::getInstance()->getBatchIdFromGroupId($request->groupId));
        }
        if (!empty($request->academicPaperSubjectId)) {
            $request->subjectIds = ConsolidatedMarkReportService::getInstance()->getSubjectIdFromPaperSubject($request->academicPaperSubjectId);
        }
        if (!empty($request->degreeId)) {
            $request->batchId = implode(",",ConsolidatedMarkReportService::getInstance()->getBatchIdFromDegreeId($request->degreeId));
        }
        // if (!empty($request->academicPaperSubjectId)) {
        //     $request->examId = ConsolidatedMarkReportService::getInstance()->getExamDetails($request->assessmentId);
        // }
        try {
            $examDetails = ConsolidatedMarkReportService::getInstance()->getStudentRegularExamMarkDetails($request);
            if ( !empty ( $examDetails ) ) {
                if ( $COLLEGE_CODE == "SCEK" ){
                    $studentDetails = ScekConsolidatedMarkService::getInstance()->getStudentsOverallMarkReport($request, $examDetails);
                }
                else{
                    $studentDetails = ConsolidatedMarkReportService::getInstance()->getStudentsOverallMarkReport($request, $examDetails);
                }
                foreach ($studentDetails as $studentId => $student) {
                    $studentMarkDetails = new StudentMarkDetails();
                    $studentMarkDetails->id = $student->studentId;
                    $studentMarkDetails->latestExamYear = $student->lastExamYear;
                    $studentMarkDetails->latestExamMonth = $student->lastExamMonth;
                    $studentMarkDetails->latestExamType = $student->lastExamReg;
                    $studentMarkDetails->arrearCount = $student->totalArrears;
                    $studentMarkDetails->supplyAttemptCount = $student->supplyAttemptCount;
                    $studentMarkDetails->credit = $student->credit;
                    $studentMarkDetails->creditGradePoint = $student->creditGradePoint;
                    $studentMarkDetails->markObtained = $student->totalMarkObtained;
                    $studentMarkDetails->totalMarks = $student->totalMark;
                    $studentMarkDetails->isFailed = $student->isFailed;
                    $studentMarkDetails->cgpa = $student->cgpa;
                    $studentMarkDetails->gradePoint = $student->gradePoint;
                    $studentMarkDetails->grade = $student->grade;
                    $studentMarkDetails->class = $student->class;
                    $studentMarkDetails->studentDetails = null;
                    $studentMarkDetails->academicTerms = [];
                    $studentDetails = new StudentDetails();
                    $studentDetails->id = $student->studentId;
                    $studentDetails->name = $student->name;
                    $studentDetails->academicYear = $student->batchStartYear;
                    $studentDetails->registerNo = $student->regNo;
                    $studentDetails->admissionNo = $student->admissionNo;
                    $studentDetails->gender = $student->gender;
                    $studentDetails->batchId = ConsolidatedMarkReportService::getInstance()->getGroupDetailsByBatch($student->batchId)->id;
                    $studentDetails->batchName = $student->batchName;
                    $studentDetails->courseTypeId = $student->courseTypeId;
                    $studentDetails->courseType = $student->isPG ? "PG" : "UG";
                    $studentMarkDetails->studentDetails = $studentDetails;
                    
                    foreach ($student->semMarks as $semId => $semMarks) {
                        $academicTermMark = new AcademicTermMark();
                        $academicTermMark->id = ConsolidatedMarkReportService::getInstance()->getAcademicTermDetails($semId)->id;;
                        $academicTermMark->name = $semMarks->semName;
                        $academicTermMark->order = ConsolidatedMarkReportService::getInstance()->getAcademicTermDetails($semId)->properties->order;
                        $academicTermMark->latestExamYear = $semMarks->lastExamYear;
                        $academicTermMark->latestExamMonth = $semMarks->lastExamMonth;
                        $academicTermMark->latestExamType = $semMarks->lastExamReg;
                        $academicTermMark->arrearCount = $semMarks->arrears;
                        $academicTermMark->supplyAttemptCount = $semMarks->supplyAttemptCount;
                        $academicTermMark->credit = $semMarks->credit;
                        $academicTermMark->creditGradePoint = $semMarks->creditGradePoint;
                        $academicTermMark->markObtained = $semMarks->totalMarks;
                        $academicTermMark->totalMarks = $semMarks->examTotalMarks;
                        $academicTermMark->isFailed = $semMarks->isFailed;
                        $academicTermMark->sgpa = $semMarks->sgpa;
                        $academicTermMark->gradePoint = $semMarks->gradePoint;
                        $academicTermMark->grade = $semMarks->grade;
                        $academicTermMark->class = $semMarks->class;
                        $academicTermMark->registrationId = ConsolidatedMarkReportService::getInstance()->getExamRegistrationDetails($semMarks->regularExamRegId,"REGULAR")->id;
                        $academicTermMark->subjects = [];
                        foreach ($semMarks->subject as $subjectId => $subject) {
                            $examSubject = new ExamSubject();
                            $examSubject->id = ConsolidatedMarkReportService::getInstance()->getExamPaperSubjectubjectDetails($subject->examAttendedBatchId,$semId,$subjectId)->id;
                            $examSubject->name = $subject->subjectDesc;
                            $examSubject->code = $subject->subjectName;
                            $examSubject->syllabusCode = $subject->syllabusCode;
                            $examSubject->isInternal = $subject->isInternal;
                            $examSubject->internalMark = $subject->internalMark;
                            $examSubject->internalMaxMark = $subject->internalMaxMark;
                            $examSubject->isInternalFailed = $subject->isInternalFailed;
                            $examSubject->isInternalAbsent = $subject->isInternalAbsent;
                            $examSubject->attendance = $subject->isAbsent ? "ABSENT" : $subject->isMal ? "MAL" : "PRESENT";
                            $examSubject->isExternal = $subject->isInternalFailed;
                            $examSubject->externalMark = $subject->isInternalAbsent;
                            $examSubject->externalMaxMark = $subject->externalMaxMark;
                            $examSubject->isExternalFailed = $subject->isExternalFailed;
                            $examSubject->markObtained = $subject->totalMarkObtained;
                            $examSubject->totalMarks = $subject->totalMark;
                            $examSubject->markNeededToPass = $subject->markNeededToPass;
                            $examSubject->isFailed = $subject->isFailed;
                            $examSubject->registrationId = $academicTermMark->registrationId;
                            $examSubject->isTheory = $subject->isTheory;
                            $examSubject->examYear = $subject->examYear;
                            $examSubject->examMonth = $subject->examMonth;
                            $examSubject->grade = $subject->grade;
                            $examSubject->class = $subject->className;
                            $examSubject->creditxMark = $subject->creditxMark;
                            $examSubject->markHistory = [];
                            foreach ($subject->markHistory as $markHistoryType => $markHistory) {
                                if($markHistoryType == "SUPPLY") {
                                    foreach ($markHistory->supplyMarks as $supplyMarksHistory){
                                        $markHistoryObj = new MarkHistory();
                                        $markHistoryObj->examMarkType = $markHistoryType;
                                        $markHistoryObj->examRegId = $supplyMarksHistory->id;
                                        $markHistoryObj->examRegistrationId = ConsolidatedMarkReportService::getInstance()->getExamRegistrationDetails($supplyMarksHistory->id,"SUPPLEMENTARY")->id;
                                        $markHistoryObj->examId = $supplyMarksHistory->examId;
                                        $markHistoryObj->assessmentId = ConsolidatedMarkReportService::getInstance()->getExamAssessmentDetails($supplyMarksHistory->examId)->id;
                                        $markHistoryObj->mark = $supplyMarksHistory->mark;
                                        $markHistoryObj->examMonth = $supplyMarksHistory->examMonth;
                                        $markHistoryObj->examYear = $supplyMarksHistory->examYear;
                                        $markHistoryObj->attendanceStatus = $supplyMarksHistory->isAbsent ? "ABSENT" : "PRESENT";
                                        $markHistoryObj->resultStatus = $supplyMarksHistory->isFailed ? "FAILED" : "PASSED";
                                        $markHistoryObj->examName = $supplyMarksHistory->supplyName;
                                        $examSubject->markHistory[] = $markHistoryObj;
                                    }
                                }
                                else{
                                    $markHistoryObj = new MarkHistory();
                                    $markHistoryObj->examMarkType = $markHistoryType;
                                    $markHistoryObj->examRegId = $markHistory->examRegId;
                                    $markHistoryObj->examRegistrationId = ConsolidatedMarkReportService::getInstance()->getExamRegistrationDetails($markHistory->examRegId,$markHistoryType)->id;
                                    $markHistoryObj->examId = $markHistory->examId;
                                    $markHistoryObj->assessmentId = ConsolidatedMarkReportService::getInstance()->getExamAssessmentDetails($markHistory->examId)->id;
                                    $markHistoryObj->mark = $markHistory->mark;
                                    $markHistoryObj->examMonth = $markHistory->month;
                                    $markHistoryObj->examYear = $markHistory->year;
                                    $markHistoryObj->attendanceStatus = $markHistory->isAbsent ? "ABSENT" : "PRESENT";
                                    $markHistoryObj->resultStatus = $markHistory->isFailed ? "FAILED" : "PASSED";
                                    $markHistoryObj->examName = $markHistory->name;
                                    $examSubject->markHistory[] = $markHistoryObj;
                                }
                            }
                            $academicTermMark->subjects[$examSubject->id] = $examSubject;
                        }
                        
                        $studentMarkDetails->academicTerms[$academicTermMark->id] = $academicTermMark;
                    }
                    $students[$studentMarkDetails->id] = $studentMarkDetails;
                }
            }
            else {
                throw new ECCoreException (ECCoreException::DATA_NOT_FOUND, "Exam data not for the request");
            }
        } catch (\Exception $e) {
            throw new ECCoreException ($e->getCode(), $e->getMessage());
        }
        return $students;
    }
    /**
     * @param $request
     */
    public function getStudentMarkHistory($request)
    {
        $request = $this->realEscapeObject($request);
        $consolidatedRequest = new \stdClass();
        $consolidatedRequest->studentId = $request->studentId;
        $consolidatedRequest->groupId = $request->groupId;
        
        try {
            $whereQuery = "";
            // if(!empty($request->groupId)) {
            //     $groupIdString = is_array($request->groupId) ? implode("','",$request->groupId) : $request->groupId;
            //     $whereQuery .= " AND g.id IN ('$groupIdString') ";
            // }
            if(!empty($request->studentId)) {
                $studentIdString = is_array($request->studentId) ? implode(",",$request->studentId) : $request->studentId;
                $whereQuery .= " AND ecsmd.student_id IN ($studentIdString";
            }
            $query = "SELECT
                ecsmd.student_id AS studentId,
                ecsmd.groups_id AS groupsId,
                atm.id AS termId,
                ecsmd.cm_academic_paper_subjects_id AS paperSubjetId,
                ecsmd.mark_details AS markDetails,
                ecsmd.no_of_chances_taken AS noOfChancesTaken,
                ecsmd.total_mark AS totalMarkObtained,
                ecsmd.class,
                ecsmd.grade,
                ecsmd.failed_status AS failedStatus,
                s.code AS code,
                s.name AS name,
                caps.properties ->> '$.syllabusName' AS syllabusName,
                IF(caps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                sc.subjectcatID AS categoryId,
                sc.subjectcatName AS categoryName,
                sc.subjectcatPriority AS categoryPriority,
                sc.subjectcatCode AS subjectCategoryCode,
                sc.parentID AS categoryParentId,
                sc.use_bring_value AS useBringValue,
                cc.categoryCode,
                eer.name as examRegName
            FROM
            ec_subject_mark_details ecsmd
            INNER JOIN student_program_account spa
                ON spa.student_id =  ecsmd.student_id
               INNER JOIN `groups` g ON
                g.id = ecsmd.groups_id 
            INNER JOIN cm_academic_paper_subjects caps ON
                caps.id = ecsmd.cm_academic_paper_subjects_id
            INNER JOIN cm_academic_paper cap ON
                cap.id = caps.cm_academic_paper_id
            INNER JOIN cm_syllabus_academic_term_settings csats ON
                csats.id = cap.cm_syllabus_academic_term_settings_id
            INNER JOIN academic_term atm ON
                atm.id = csats.academic_term_id
            INNER JOIN v4_ams_subject s ON
                s.id = caps.ams_subject_id
            INNER JOIN ec_exam_registration eer 
                ON eer.id = ecsmd.ec_exam_registration_id
            LEFT JOIN subject_category sc ON
                sc.subjectcatID = caps.properties->>'$.subjectTypeId'
            LEFT JOIN categoryCode cc ON
                cc.subject_category_id = caps.properties->>'$.subjectTypeId'
                AND cc.subject_category_id = sc.subjectcatID
                AND cc.course_type_id = CAST(g.properties->>'$.courseTypeId' AS CHAR)
            WHERE
                1 = 1 AND ecsmd.is_active = 1 AND eer.trashed IS NULL 
            $whereQuery";
            $subjectDetails = $this->executeQueryForList($query);
            $subjectsMarkDetails = [];
            $subjectMarkType = ['revaluation','moderation','grace'];
            foreach($subjectDetails as $subject){
                $subject->markDetails = json_decode($subject->markDetails);
                $subject->examMonthYear = $subject->markDetails->latestExamMonth."/".$subject->markDetails->latestExamYear;
                $subject->creditPoint = round($subject->markDetails->credit * $subject->markDetails->gradePoint, 2);
                $subject->RSI = substr($subject->markDetails->latestExamType,0,1);
                $subject->priority = $subject->markDetails->priority;
                if(empty($subjectsMarkDetails[$subject->paperSubjetId])){
                    $subjectsMarkDetails[$subject->paperSubjetId] = $subject;
                }
                $examMarkType = $subject->markDetails->examMarkType;
                $subject->markDetails->externalMark = $subject->markDetails->externalMarkObtainedInExam;
                $subject->grade = $subject->markDetails->externalMarkObtainedInExamGrade;
                $subject->markDetails->gradePoint = $subject->markDetails->externalMarkObtainedInExamGradePoint;
                $subject->failedStatus = $subject->markDetails->externalMarkObtainedInExamIsFailed ? "FAILED" : "PASSED";
                
                if($examMarkType == "SUPPLY"){
                    $examMarkType = $subject->examRegName;
                }
                $subject->markDetails->markObtained = $subject->markDetails->externalMark + $subject->markDetails->internalMark;
                $subjectsMarkDetails[$subject->paperSubjetId]->markHistory[ $examMarkType] = $subject;
                $subjectsMarkDetails[$subject->paperSubjetId]->markCount++;
                $subjectMark = unserialize(serialize($subject));
                foreach($subjectMarkType as $markType){
                    $markObtained = $markType."Mark";
                    if($subjectMark->markDetails->$markObtained){
                        if($markType == "revaluation"){
                            $examMarkType = "REVALUATION";
                        }
                        else if($markType == "grace"){
                            $examMarkType = "GRACEMARK";
                        }
                        else if($markType == "moderation"){
                            $examMarkType = "MODERATION";
                        }
                        $subjectMark->markDetails->externalMark = round($subjectMark->markDetails->$markObtained);
                        if($markType == "grace"){
                            $markType = "graceMark";
                        }
                        $gradeObtained = $markType."Grade";
                        $gradePointObtained = $markType."GradePoint";
                        $creditPointObtained = $markType."CreditGradePoint";
                        $isFailedForSubject = $markType."IsFailed";
                        $subjectMark->grade = $subjectMark->markDetails->$gradeObtained;
                        $subjectMark->markDetails->gradePoint = $subjectMark->markDetails->$gradePointObtained;
                        $subjectMark->failedStatus = $subjectMark->markDetails->$isFailedForSubject ? "FAILED" : "PASSED";
                        $subjectMark->markDetails->markObtained = $subjectMark->markDetails->$markObtained + $subjectMark->markDetails->internalMark;
                        if($markType == "graceMark" || $markType == "moderation"){
                            $subjectMark->markDetails->markObtained += $subject->markDetails->externalMarkObtainedInExam;
                            $subjectMark->markDetails->externalMark += $subject->markDetails->externalMarkObtainedInExam;
                            $subjectMark->markDetails->externalMark .= "(".round($subjectMark->markDetails->$markObtained).")";
                        }
                        if($subject->markDetails->examMarkType == "SUPPLY"){
                            $examMarkType .= " - ".$subject->examRegName;
                        }
                        $subjectsMarkDetails[$subjectMark->paperSubjetId]->markHistory[ $examMarkType] = $subjectMark;
                        $subjectsMarkDetails[$subjectMark->paperSubjetId]->markCount++;
                    }
                }
                
            }
            
            
            $whereQuery = "";
            // if(!empty($request->groupId)) {
            //     $groupIdString = is_array($request->groupId) ? implode("','",$request->groupId) : $request->groupId;
            //     $whereQuery .= " AND esmd.groups_id IN ('$groupIdString') ";
            // }
            if(!empty($request->studentId)) {
                $studentIdString = is_array($request->studentId) ? implode(",",$request->studentId) : $request->studentId;
                $whereQuery .= " AND esmd.student_id IN ($studentIdString";
            }
            $query = "SELECT
                esmd.groups_id AS groupsId,
                esmd.student_id AS studentId,
                esmd.academic_term_id AS termId,
                esmd.mark_details AS markDetails,
                esmd.total_supply_attempt_count AS supplyAttemptCount,
                esmd.total_mark AS totalMarkObtained,
                esmd.sgpa,
                esmd.grade,
                esmd.failed_status AS failedStatus,
                atm.properties->>'$.orderNo' AS termOrder,
                atm.name AS termName
            FROM
                ec_semester_mark_details esmd
            INNER JOIN academic_term atm ON
                atm.id = esmd.academic_term_id
            WHERE
                1 = 1
            $whereQuery";
            $termMarkDetails = $this->executeQueryForList($query);
            array_walk($termMarkDetails,function($term,$key)use($subjectsMarkDetails){
                $term->markDetails = json_decode($term->markDetails);
                $term->subjects = array_filter( $subjectsMarkDetails, function($subject)use($term){ 
                    return ($term->groupsId == $subject->groupsId && $term->termId == $subject->termId && $term->studentId == $subject->studentId) ? true : false;
                });
                uasort($term->subjects, function($a, $b) {
                    return ($a->priority > $b->priority);
                });
                $term->romanNumber = CommonUtil::convertNumberToRoman($term->termOrder);
                $term->creditPoint = array_sum(array_column($term->subjects,'creditPoint'));
            });
            $whereQuery = "";
            if(!empty($request->groupId)) {
                $groupIdString = is_array($request->groupId) ? implode("','",$request->groupId) : $request->groupId;
                $whereQuery .= " AND ecmd.groups_id IN ('$groupIdString') ";
            }
            if(!empty($request->studentId)) {
                $studentIdString = is_array($request->studentId) ? implode(",",$request->studentId) : $request->studentId;
                $whereQuery .= " AND ecmd.student_id IN ($studentIdString";
            }
            $query = "SELECT
                ecmd.groups_id AS groupsId,
                g.properties->>'$.programId' AS programId,
                ecmd.student_id AS studentId,
                ecmd.mark_details AS markDetails,
                ecmd.class AS class,
                ecmd.no_of_arrears AS arrears,
                ecmd.total_supply_attempt_count AS supplyAttemptCount,
                ecmd.percentage AS cgpaPercentage,
                ecmd.cgpa,
                ecmd.grade,
                ecmd.failed_status AS failedStatus,
                sa.studentName AS name,
                sa.myImage,
                sa.studentGender AS gender,
                sa.studentBirthday AS dob,
                g.name AS batchName,
                g.properties ->> '$.startYear' as admissionYear,
                spa.properties->>'$.registerNumber' AS regNo,
                spa.properties->>'$.rollNumber' AS rollNo, 
                gm.properties,
                g.properties,
                p.name AS programName,
                d.name AS degreeName,
                GROUP_CONCAT(str.name) AS streamName,
                ct.course_type AS courseType,
                ct.courseTypeID AS courseTypeId
            FROM
                ec_course_mark_details ecmd
            INNER JOIN `groups` g ON
                g.id = ecmd.groups_id
            INNER JOIN studentaccount sa ON
                sa.studentID = ecmd.student_id
            INNER JOIN student_program_account spa ON 
                    spa.student_id = sa.studentID 
            INNER JOIN group_members gm ON
                gm.groups_id = g.id
                AND CAST(gm.members->>'$.studentId' AS CHAR) = spa.id
            INNER JOIN program p ON
                p.id = CAST(g.properties->>'$.programId' AS CHAR)
            INNER JOIN `degree` d ON
                d.id = p.degree_id
            INNER JOIN course_type ct ON 
                ct.courseTypeID = p.course_type_id
            LEFT JOIN stream str ON
                 JSON_SEARCH( p.stream_id, 'one', str.id) IS NOT NULL
            WHERE
                1 = 1
            $whereQuery
            GROUP BY p.id, sa.studentID";
            $courseMarkDetails = $this->executeQueryForList($query);
            $programs = [];
            array_walk($courseMarkDetails,function($course,$key)use(&$programs,$termMarkDetails){
                $course->markDetails = json_decode($course->markDetails);
                $course->cgpaInWords = CommonUtil::convertNumberToWords($course->cgpa);
                $course->academicTerms = array_filter( $termMarkDetails, function($term)use($course){ 
                    return ($term->studentId == $course->studentId) ? true : false;
                });
                $course->academicTerms = call_user_func_array('array_merge', array_map( 
                    function ($key, $value) {return array($key => $value);}, 
                    array_column($course->academicTerms, "termId"), 
                    $course->academicTerms)
                );
                uasort($course->academicTerms, function($a, $b) {
                    return ($a->termOrder > $b->termOrder);
                });
                $course->examMonthYear = date('F Y',strtotime($course->markDetails->latestExamYear."-".$course->markDetails->latestExamMonth."-01"));
                $course->creditPoint = array_sum(array_column($course->academicTerms,'creditPoint'));
                $programs[$course->programId]->students[$course->studentId] = $course;
                $programs[$course->programId]->students[$course->studentId]->roundOff = '2';
            });
        } catch (\Exception $e) {
            throw new ECCoreException(ECCoreException::ERROR_FETCHING,"Cannot fetch details! Please try again.");
        }
        return $programs;
    } 
      /**
     * Get all students pass status
     * Features : Dashboard
     */
    public function getAllStudentPassStatus($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = "";
        foreach($request->filters as $filters){
            $filters = (object) $filters;
            if($filters->key == "years"){
                $condition .= " AND  g.properties->>'$.startYear' $filters->operation (".implode(',',$filters->value).")";
            }
            if($filters->key == "courseTypeId"){
                $condition .= " AND  p.course_type_id $filters->operation (".implode(',',$filters->value).")";
            }
        }
        try {
            $sql = "SELECT 
                        ecmd.student_id, 
                        ecmd.failed_status, 
                        g.properties as groupProperties,             
                        g.id as groupId,             
                        g.name as groupName,             
                        ct.courseTypeID,
                        ct.typeName as courseTypeName,
                        dept.deptID,
                        dept.deptName 
                    FROM
                        ec_course_mark_details ecmd 
                    INNER JOIN `groups` g ON 
                        g.id = ecmd.groups_id   
                    INNER JOIN program p ON 
                        p.id = g.properties->>'$.programId' 
                    INNER JOIN `course_type` ct ON
                        ct.courseTypeID = p.course_type_id
                    INNER JOIN `department` dept ON
                        dept.deptID = CAST(g.properties ->> '$.departmentId' AS CHAR)
                    WHERE
                        1 = 1";
            $studentList =  $this->executeQueryForList($sql. $condition);
        } catch (\Exception $e) {
            throw new ECCoreException($e->getCode(),$e->getMessage());
        }
        return $studentList;
    }
      /**
     * Get all students pass status
     * Features : Dashboard
     */
    public function getGraduationRateDetails($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = "";
        foreach($request->filters as $filters){
            $filters = (object) $filters;
            if($filters->key == "admissionYears"){
                $condition .= " AND  g.properties->>'$.startYear' $filters->operation (".implode(',',$filters->value).")";
            }
            if($filters->key == "courseTypeId"){
                $condition .= " AND  p.course_type_id $filters->operation (".implode(',',$filters->value).")";
            }
            if($filters->key == "deptId"){
                $condition .= " AND  dept.deptID $filters->operation (".implode(',',$filters->value).")";
            }
            if($filters->key == "passingYears"){
                $condition .= " AND  ecmd.mark_details->>'$.passingYear' $filters->operation (".implode(',',$filters->value).")";
            }
        }
        if( $request->considerPassedStudents ){
            $condition .= " AND  ecmd.failed_status = 'PASSED' ";
        }
        if( $request->requiredPassingYear ){
            $condition .= " AND  ecmd.mark_details->>'$.passingYear' IS NOT NULL";
        }
        if( $request->graduationBatchStartYear ){
            $condition .= " AND  g.properties->>'$.startYear' >= $request->graduationBatchStartYear ";
        }
        try {
            $sql = "SELECT 
                        ecmd.student_id, 
                        ecmd.failed_status, 
                        g.properties as groupProperties,             
                        ct.courseTypeID,
                        ct.typeName as courseTypeName,
                        dept.deptID,
                        ecmd.mark_details->>'$.passingYear' AS passingYear,
                        ecmd.mark_details->>'$.passingMonth' AS passingMonth,
                        dept.deptName 
                    FROM
                        ec_course_mark_details ecmd 
                    INNER JOIN `groups` g ON 
                        g.id = ecmd.groups_id   
                    INNER JOIN program p ON 
                        p.id = g.properties->>'$.programId' 
                    INNER JOIN `course_type` ct ON
                        ct.courseTypeID = p.course_type_id
                    INNER JOIN `department` dept ON
                        dept.deptID = CAST(g.properties ->> '$.departmentId' AS CHAR)
                    WHERE
                        1 = 1 AND 
                        ecmd.mark_details->>'$.hasCompletedAcademicYear' = 1 ";
            $studentList =  $this->executeQueryForList($sql. $condition);
        } catch (\Exception $e) {
            throw new ECCoreException($e->getCode(),$e->getMessage());
        }
        return $studentList;
    }
    /**
     * Get all students pass status
     * Features : Dashboard
     */
    public function getCourseWiseSuccessRateForDashBoard($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = "";
        foreach($request->filters as $filters){
            $filters = (object) $filters;
            if($filters->key == "groupId"){
                $groupIdString = is_array($filters->value) ? implode("','",$filters->value) : $filters->value;
                $condition .= " AND  g.id $filters->operation  ('$groupIdString')";
            }
        }
        if( $request->examRegistrationId ){
            $examRegistrationIdString = is_array($request->examRegistrationId) ? implode("','",$request->examRegistrationId) : $request->examRegistrationId;
            $condition .= " AND  eer.id IN ('$examRegistrationIdString') ";
        }
        if( $request->resultPublishedRegistrationOnly ){
            $condition .= " AND  eerb.properties ->>'$.isResultPublished' = 1 ";
        }
        try {
            $sql = "SELECT 
                esmd.student_id AS studentId, 
                esmd.mark_history AS markHistory,           
                g.id as groupId,             
                g.name as groupName,
                esmd2.cm_academic_paper_subjects_id AS academicPaperSubjectId,
                esmd2.attendance_status AS attendanceStatus
            FROM
                ec_exam_registration eer 
            INNER JOIN ec_exam_registration_batch eerb ON
                eerb.ec_exam_registration_id = eer.id 
            INNER JOIN ec_semester_mark_details esmd ON
                esmd.groups_id = eerb.groups_id
                AND esmd.academic_term_id = eerb.properties->>'$.academicTermId'
            INNER JOIN ec_subject_mark_details esmd2 ON
                esmd2.ec_exam_registration_id = eer.id 
                AND esmd2.student_id = esmd.student_id 
                AND esmd2.groups_id = eerb.groups_id
            INNER JOIN `groups` g ON 
                g.id = eerb.groups_id
            WHERE
                1 = 1 ";
            $studentList =  $this->executeQueryForList($sql. $condition, $this->mapper[DashBoardServiceMapper::GET_COURSE_WISE_STUDENT_LIST]);
        } catch (\Exception $e) {
            throw new ECCoreException($e->getCode(),$e->getMessage());
        }
        return $studentList;
    }
    /**
     * Get all exam registered student
     * Features : Dashboard
     */
    public function getRegisteredStudentDetailsByExamRegistrationId($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = "";
        foreach($request->filters as $filters){
            $filters = (object) $filters;
            if($filters->key == "groupId"){
                $groupIdString = is_array($filters->value) ? implode("','",$filters->value) : $filters->value;
                $condition .= " AND  g.id $filters->operation  ('$groupIdString')";
            }
        }
        if( $request->examRegistrationId ){
            $examRegistrationIdString = is_array($request->examRegistrationId) ? implode("','",$request->examRegistrationId) : $request->examRegistrationId;
            $condition .= " AND  eer.id IN ('$examRegistrationIdString') ";
        }
        if( $request->resultPublishedRegistrationOnly ){
            $condition .= " AND  eerb.properties ->>'$.isResultPublished' = 1 ";
        }
        $groupBy = " Group By esar.student_id ";
        try {
            $sql = "SELECT 
                esar.student_id, 
                eerb.groups_id AS groupId,
                g.name as groupName           
            FROM 
                ec_student_assessment_registration esar
            INNER JOIN ec_exam_registration_subject eers ON
                eers.am_assessment_id = esar.am_assessment_id 
            INNER JOIN ec_exam_registration_batch eerb ON
                eerb.id = eers.ec_exam_registration_batch_id
            INNER JOIN ec_exam_registration eer ON
                eer.id = eerb.ec_exam_registration_id AND
                eer.type = esar.ec_exam_registration_type 
            INNER JOIN `groups` g ON 
                g.id = eerb.groups_id
            WHERE CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND 
                CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID' ";
            $studentList =  $this->executeQueryForList($sql. $condition. $groupBy );
        } catch (\Exception $e) {
            throw new ECCoreException($e->getCode(),$e->getMessage());
        }
        return $studentList;
    }
    /**
     * Get all revaluation applied student
     * Features : Dashboard
     */
    public function getRevaluationAppliedDetailsByExamRegistrationId($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = "";
        foreach($request->filters as $filters){
            $filters = (object) $filters;
            if($filters->key == "groupId"){
                $groupIdString = is_array($filters->value) ? implode("','",$filters->value) : $filters->value;
                $condition .= " AND  g.id $filters->operation  ('$groupIdString')";
            }
        }
        if( $request->examRegistrationId ){
            $examRegistrationIdString = is_array($request->examRegistrationId) ? implode("','",$request->examRegistrationId) : $request->examRegistrationId;
            $condition .= " AND  eer2.id IN ('$examRegistrationIdString') ";
        }
        if( $request->resultPublishedRegistrationOnly ){
            $condition .= " AND  eerbParent.properties ->>'$.isResultPublished' = 1 ";
        }
        $groupBy = " Group By esar.student_id ";
        try {
            $sql = "SELECT 
            esar.student_id,
            eerb.groups_id AS groupId,
            g.name as groupName
        FROM
            ec_student_assessment_registration esar
        INNER JOIN ec_exam_registration eer ON
            eer.`type` = esar.ec_exam_registration_type AND eer.id = CAST(esar.identifying_context->>'$.examRegistrationId' AS CHAR)
        INNER JOIN ec_exam_registration_batch eerb ON
            eerb.ec_exam_registration_id = eer.id 
        INNER JOIN ec_exam_registration eer2 ON
            eer2.id = eer.properties->>'$.parentExamRegistrationId' AND 
            eer2.trashed IS NULL
        INNER JOIN ec_exam_registration_batch eerbParent ON
            eerbParent.ec_exam_registration_id = eer2.id  AND 
            eerb.groups_id = eerbParent.groups_id
        INNER JOIN ec_exam_registration_subject eers2 ON     
            eers2.ec_exam_registration_batch_id = eerbParent.id AND 
            eers2.am_assessment_id = esar.am_assessment_id 
        INNER JOIN `groups` g ON 
            g.id = eerb.groups_id
        WHERE CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND 
              CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID' ";
            $studentList =  $this->executeQueryForList($sql. $condition. $groupBy );
        } catch (\Exception $e) {
            throw new ECCoreException($e->getCode(),$e->getMessage());
        }
        return $studentList;
    }
    /**
     * Get Revaluation Mark Entered Students
     * Features : Dashboard
     */
    public function getRevaluationMarkEnteredDetailsByExamRegistrationId($request)
    {
        $request = $this->realEscapeObject($request);
        $condition = "";
        foreach($request->filters as $filters){
            $filters = (object) $filters;
            if($filters->key == "groupId"){
                $groupIdString = is_array($filters->value) ? implode("','",$filters->value) : $filters->value;
                $condition .= " AND  g.id $filters->operation  ('$groupIdString')";
            }
        }
        if( $request->examRegistrationId ){
            $examRegistrationIdString = is_array($request->examRegistrationId) ? implode("','",$request->examRegistrationId) : $request->examRegistrationId;
            $condition .= " AND  eer2.id IN ('$examRegistrationIdString') ";
        }
        if( $request->resultPublishedRegistrationOnly ){
            $condition .= " AND  eerbParent.properties ->>'$.isResultPublished' = 1 ";
        }
        $groupBy = " Group By esar.student_id ";
        try {
            $sql = "SELECT 
            esar.student_id,
            eerb.groups_id AS groupId,
            g.name as groupName,             
            ostm.id AS markEntryId
        FROM
            ec_student_assessment_registration esar
        INNER JOIN ec_exam_registration eer ON
            eer.`type` = esar.ec_exam_registration_type AND eer.id = CAST(esar.identifying_context->>'$.examRegistrationId' AS CHAR)
        INNER JOIN ec_exam_registration_batch eerb ON
            eerb.ec_exam_registration_id = eer.id 
        INNER JOIN ec_exam_registration eer2 ON
            eer2.id = eer.properties->>'$.parentExamRegistrationId' AND 
            eer2.trashed IS NULL
        INNER JOIN ec_exam_registration_batch eerbParent ON
            eerbParent.ec_exam_registration_id = eer2.id  AND 
            eerb.groups_id = eerbParent.groups_id
        INNER JOIN ec_exam_registration_subject eers2 ON     
            eers2.ec_exam_registration_batch_id = eerbParent.id AND 
            eers2.am_assessment_id = esar.am_assessment_id 
        INNER JOIN `groups` g ON 
            g.id = eerb.groups_id
        INNER JOIN oe_student_total_mark ostm ON 
            ostm.student_id =  esar.student_id AND ostm.am_assessment_id = esar.am_assessment_id AND ostm.valuation_type = 'REVALUATION' AND ostm.valuation_count = 'FINALIZED'
        WHERE CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND 
              CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID' ";
            $studentList =  $this->executeQueryForList($sql. $condition. $groupBy );
        } catch (\Exception $e) {
            throw new ECCoreException($e->getCode(),$e->getMessage());
        }
        return $studentList;
    }
}