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 / 61
CRAP
0.00% covered (danger)
0.00%
0 / 3392
ExamRegistrationSubjectService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 61
313040.00
0.00% covered (danger)
0.00%
0 / 3392
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 4
 saveExamRegistrationSubject
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 33
 validateSaveExamRegistrationSubject
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 7
 updateExamRegistrationSubjects
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 28
 insertExamRegistrationSubjects
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 14
 deleteExamRegistrationSubject
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 31
 getExamRegistrationSubjects
0.00% covered (danger)
0.00%
0 / 1
90.00
0.00% covered (danger)
0.00%
0 / 52
 getAssignedubjectByBatch
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 21
 getExamRegistrationSubjectFee
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 17
 getAssessmentExaminer
0.00% covered (danger)
0.00%
0 / 1
4556.00
0.00% covered (danger)
0.00%
0 / 259
 getCountOfAssessmentExaminer
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 38
 updateAssessmentExaminer
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 37
 getAllSubjectsForCreatePacketByExamRegistrationId
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 48
 getAsnwerGroupConfigDetailsByExamRegistrationAndAcademicPaperSubject
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 40
 getCountOfRegisteredStudentsByAssessment
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 29
 getAssignedStaffsForSubjectPacketByAcademicPaperId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 20
 getMaxSubjectMarkByAcademicPaperSubjectId
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 19
 getExamregistrationSubjectDetails
0.00% covered (danger)
0.00%
0 / 1
182.00
0.00% covered (danger)
0.00%
0 / 68
 getAllSubjectsForExamDateDefinition
0.00% covered (danger)
0.00%
0 / 1
132.00
0.00% covered (danger)
0.00%
0 / 101
 getAllSubjectAssessmentDetailsByExamRegistrationId
0.00% covered (danger)
0.00%
0 / 1
210.00
0.00% covered (danger)
0.00%
0 / 86
 printExamDateDetails
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 74
 getSubjectForCurrentStaffs
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 83
 getcurrentExamSubjectForCurrentStaff
0.00% covered (danger)
0.00%
0 / 1
90.00
0.00% covered (danger)
0.00%
0 / 83
 getAllCurretStaffSubjectsValuationDetailsByExamRegistrationId
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 35
 getAllSubjectForCurrentStaff
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 60
 getAllExamSubjectForCurrentStaffDigitalValuation
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 64
 getAllSubjectsDetailsByExamRegistrationId
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 35
 getAllSubjectDetailsByExamRegistrationId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 38
 getAllSubjectDetailsByRevaluation
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 66
 getCurrentSubjectDetailsByExamRegistrationIdAndPaperSubjectId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 46
 searchExamRegistrationSubjects
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 53
 getAllExamRegistrationSubjectDetails
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 41
 getAllRevaluationTypeDetails
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 25
 getAllValuationDateDetails
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 39
 updateValuationDatesToExamRegSubjects
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 31
 updateRevaluationDetailsToExamRegistrationSubjects
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 27
 getAllAssessmentDetails
0.00% covered (danger)
0.00%
0 / 1
210.00
0.00% covered (danger)
0.00%
0 / 84
 getAllDistinctSubjectsByExamRegistration
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 23
 getAssignedDistinctSubjectByBatch
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 28
 getAllCurretStaffSubjectsValuationDetailsByExamRevaluationId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 34
 getSubjectForCurrentStaffsRevaluation
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 84
 getcurrentExamSubjectForCurrentStaffRevaluation
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 70
 checkAssessmentPresent
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 13
 checkIfAssessmentAlreadyAssigned
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 13
 getBatchAssignedSubjectGroupsByRequest
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 33
 updateInstitutionalAverageToExamRegSubjects
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 31
 getAssessmentExaminerWithPacket
0.00% covered (danger)
0.00%
0 / 1
4692.00
0.00% covered (danger)
0.00%
0 / 242
 getAssignedExamRegistrationSubjectsInBatch
0.00% covered (danger)
0.00%
0 / 1
306.00
0.00% covered (danger)
0.00%
0 / 83
 getAllSubjectDetailsByRegistration
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 51
 getSubjectForCurrentVivaValuationStaffs
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 55
 updateExamSubjectResolutionRule
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 27
 getAssignedFacultiesByAcademicPaper
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 24
 getSubjectsDetailsForDigitalValuationProcedure
0.00% covered (danger)
0.00%
0 / 1
756.00
0.00% covered (danger)
0.00%
0 / 153
 getSubjectsDateStudentDetailsForDigitalValuationProcedure
0.00% covered (danger)
0.00%
0 / 1
1260.00
0.00% covered (danger)
0.00%
0 / 164
 getReviewerDetailsForDigitalValuationProcedure
0.00% covered (danger)
0.00%
0 / 1
1406.00
0.00% covered (danger)
0.00%
0 / 155
 getStudentDetailsForPaperSubjectsRevaluation
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 43
 getExamregistrationSubjectListDetails
0.00% covered (danger)
0.00%
0 / 1
240.00
0.00% covered (danger)
0.00%
0 / 72
 getSubjectForValuationReports
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 68
 getSubjectsForRemunerationBill
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 29
 getStaffConfirmedMarksSubjectDetailsForRemunerationBill
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 34
 getSubjectAssignedStudentDetailsForRemunerationBill
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 27
<?php
namespace com\linways\ec\core\service;
use com\linways\base\util\SecurityUtils;
use com\linways\ec\core\dto\ExamRegistration;
use com\linways\base\util\MakeSingletonTrait;
use com\linways\ec\core\constant\StatusConstants;
use com\linways\ec\core\dto\ExamRegistrationSubject;
use com\linways\ec\core\exception\ExamControllerException;
use com\linways\ec\core\mapper\ExamRegistrationSubjectServiceMapper;
use com\linways\ec\core\request\SearchExamRegistrationSubjectRequest;
use com\linways\core\ams\professional\service\StaffService;
use com\linways\core\ams\professional\service\CommonService;
use com\linways\core\ams\professional\constant\SettingsConstants;
use com\linways\ec\core\request\SearchExamRegistrationRequest;
use com\linways\base\util\TwigRenderer;
use com\linways\core\ams\professional\util\PdfUtil;
use com\linways\ec\core\service\CommonExamService;
use com\linways\core\ams\professional\logging\AMSLogger;
use com\linways\ec\core\logging\Events;
use com\linways\ec\core\logging\entities\Staff;
use com\linways\ec\core\service\StudentExamRegistrationService;
use com\linways\ec\core\mapper\ExamRevaluationServiceMapper;
use com\linways\ec\core\constant\ExamRegistrationTypeConstants;
use com\linways\ec\core\service\RuleService;
use com\linways\ec\core\request\SearchRuleRequest;
use com\linways\core\ams\professional\dto\SettingsConstents;
use com\linways\academics\core\request\FilterSubjectClusterRequest;
use com\linways\academics\core\service\SubjectService;
class ExamRegistrationSubjectService extends BaseService
{
    use MakeSingletonTrait;
    private function __construct() {
        $this->logger = AMSLogger::getLogger('exam-controller-log');
        $this->mapper = ExamRegistrationSubjectServiceMapper::getInstance()->getMapper();
        $this->mapper2 = ExamRevaluationServiceMapper::getInstance()->getMapper();
    }
    /**
     * Save Exam Registration Subject
     * @param ExamRegistrationSubject $examRegistrationSubject
     * @return $id
     */
    public function saveExamRegistrationSubject (ExamRegistrationSubject $examRegistrationSubject)
    {
        $examRegistrationSubject = $this->realEscapeObject($examRegistrationSubject);
        $examRegistrationSubject->updatedBy = $GLOBALS['userId'] ?? $examRegistrationSubject->updatedBy;
        $examRegistrationSubject->createdBy = $GLOBALS['userId'] ?? $examRegistrationSubject->createdBy;
        $staffId = $GLOBALS['userId'];
        try{
            $this->validateSaveExamRegistrationSubject($examRegistrationSubject);
            if(!empty($examRegistrationSubject->id)){
                $this->updateExamRegistrationSubjects($examRegistrationSubject);
            }
            else{
                $this->insertExamRegistrationSubjects($examRegistrationSubject);
            }
            AMSLogger::log_info($this->logger,Events::EC_SAVE_EXAM_REGISTRATION_SUBJECT,[
                "staff" => new Staff(["id" => $staffId]),
                "request" => $examRegistrationSubject,
                "status" => StatusConstants::SUCCESS
            ]);
        }catch(\Exception $e) {
            AMSLogger::log_error($this->logger,Events::EC_SAVE_EXAM_REGISTRATION_SUBJECT, [
                "staff" => new Staff(["id" => $staffId]),
                "request" => $examRegistrationSubject,
                "errorCode" => $e->getCode(),
                "errorMessage" => $e->getMessage(),
                "status" => StatusConstants::FAILED
            ]);
            if($e->getCode() !== ExamControllerException::INVALID_PARAMETERS_EXAM_REGISTRATION_FEE || $e->getCode() !== ExamControllerException::EMPTY_PARAMETERS_EXAM_REGISTRATION_FEE) {
                throw new ExamControllerException($e->getCode(),"Failed to assign Fees for Exam Registration! Please try again");
            } else {
                throw new ExamControllerException ($e->getCode(),$e->getMessage());
            }
        }
        
    }
    /**
     * Validate Exam Registration Subject Request Before Saving
     * @param ExamRegistrationSubject $examRegistrationSubject
     * @return NULL
     */
    private function validateSaveExamRegistrationSubject(ExamRegistrationSubject $examRegistrationSubject){
        if(empty($examRegistrationSubject->examRegistrationBatchId))
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS_EXAM_REGISTRATION_FEE," Exam registration subject is  empty! ");
        if(empty($examRegistrationSubject->academicPaperSubjectId))
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS_EXAM_REGISTRATION_FEE," Exam registration subject is  empty!  ");
        if(empty($examRegistrationSubject->assessmentId))
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS_EXAM_REGISTRATION_FEE," Exam registration subject is  empty! ");
    }
    /**
     * Update Exam Registration Subject 
     * @param ExamRegistrationSubject $examRegistrationSubject
     */
    private function updateExamRegistrationSubjects(ExamRegistrationSubject $examRegistrationSubject)
    {
        if(!empty($examRegistrationSubject->valuationDetails)){
            $examRegistrationSubject->valuationDetails->listStaffs = [];
            if(!empty($examRegistrationSubject->valuationDetails->valuationStaffs)){
                foreach($examRegistrationSubject->valuationDetails->valuationStaffs as $valuationStaff){
                    $valuationStaff->listStaffs = [];
                }
            }
        }
        $feesProperties = !empty($examRegistrationSubject->feeProperties) ? "'".json_encode($examRegistrationSubject->feeProperties)."'" : "JSON_OBJECT()";
        $valuationDetails = !empty($examRegistrationSubject->valuationDetails) ? "'".json_encode($examRegistrationSubject->valuationDetails)."'" : "JSON_OBJECT()";
        $query = "UPDATE
                    ec_exam_registration_subject
                SET
                    fees_properties = $feesProperties,
                    ec_exam_registration_batch_id = '$examRegistrationSubject->examRegistrationBatchId',
                    cm_academic_paper_subjects_id = '$examRegistrationSubject->academicPaperSubjectId',
                    am_assessment_id = '$examRegistrationSubject->assessmentId',
                    valuation_details = $valuationDetails,
                    updated_by = '$examRegistrationSubject->updatedBy'
                WHERE
                    id = '$examRegistrationSubject->id'";
        try {
            $this->executeQuery($query);
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
    }
     /**
     * Insert  Exam Registration Subjects
     * @param ExamRegistrationSubject $examRegistration
     * @return  $id
     */
    private function insertExamRegistrationSubjects(ExamRegistrationSubject $examRegistrationSubject)
    {
        $feesProperties = !empty($examRegistrationSubject->feeProperties) ? "'".json_encode($examRegistrationSubject->feeProperties)."'" : "JSON_OBJECT()";
        $valuationDetails = !empty($examRegistrationSubject->valuationDetails) ? "'".json_encode($examRegistrationSubject->valuationDetails)."'" : "JSON_OBJECT()";
        $query = "INSERT INTO ec_exam_registration_subject
                  (ec_exam_registration_batch_id,cm_academic_paper_subjects_id,am_assessment_id,fees_properties,valuation_details,created_by,updated_by)
                  VALUES
                  ('$examRegistrationSubject->examRegistrationBatchId','$examRegistrationSubject->academicPaperSubjectId','$examRegistrationSubject->assessmentId',$feesProperties,$valuationDetails,'$examRegistrationSubject->createdBy','$examRegistrationSubject->updatedBy')";
        try {
            $examRegistrationSubject->id = $this->executeQuery($query,true);
           return $examRegistrationSubject->id;
        } catch (\Exception $e) {
             throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
    }
    /**
     * Delete Exam Registration fees
     * @param String $id
     * @return NULL
     */
    public function deleteExamRegistrationSubject($id)
    {
        $id = $this->realEscapeString($id);
        $staffId = $GLOBALS['userId'];
        $searchRequest = new SearchExamRegistrationSubjectRequest();
        $searchRequest->id = $id;
        $examRegistrationSubject = reset($this->getExamRegistrationSubjects($searchRequest));
        if(empty($id) && empty($examRegistrationSubject))
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS_EXAM_REGISTRATION_FEE,"Exam Registration Subject is invalid! ");
        $query = "DELETE FROM
                    ec_exam_registration_subject
                WHERE
                    id = '$id'";
        try {
            $this->executeQuery($query);
            AMSLogger::log_info($this->logger,Events::EC_DELETE_EXAM_REGISTRATION_SUBJECT,[
                "staff" => new Staff(["id" => $staffId]),
                    "request" => $examRegistrationSubject,
                    "status" => StatusConstants::SUCCESS
            ]);
        } 
        catch (\Exception $e) {
            AMSLogger::log_error($this->logger,Events::EC_DELETE_EXAM_REGISTRATION_SUBJECT,[
                "staff" => new Staff(["id" => $staffId]),
                "request" => $examRegistrationSubject,
                "errorCode" => $e->getCode(),
                "errorMessage" => $e->getMessage(),
                "status" => StatusConstants::FAILED
            ]);
            throw new ExamControllerException(ExamControllerException::ERROR_DELETING_EXAM_REGISTRATION_FEE,"Error deleting Exam Registration Subject! Please try again");
        }
    }
    /**
     * Get Exam Registration Subject 
     * @param SearchExamRegistrationSubjectRequest $request
     * @return examRegistration
     */
    public function getExamRegistrationSubjects(SearchExamRegistrationSubjectRequest $request)
    {
        $request = $this->realEscapeObject($request);
        $whereQuery = "";
        $limitQuery = "";
        if(!empty($request->groupId)) {
            $whereQuery .= " AND eerb.groups_id = '$request->groupId";
        }
        if(!empty($request->id)) {
            $whereQuery .= " AND eers.id = '$request->id";
        }
        if(!empty($request->examRegistrationbatchId)) {
            $whereQuery .= " AND eerb.id = '$request->examRegistrationbatchId";
        }
        if(!empty($request->academicPaperSubjectId)) {
            $whereQuery .= " AND eers.cm_academic_paper_subjects_id = '$request->academicPaperSubjectId";
        }
        if(!empty($request->examRegistrationId)) {
            $whereQuery .= " AND eerb.ec_exam_registration_id='$request->examRegistrationId";
        }
        
        if($request->startIndex !== "" && $request->endIndex !== "")
        {
            $limitQuery .= " LIMIT $request->startIndex,$request->endIndex";
        }
        $query = "SELECT
            eers.id,
            eers.ec_exam_registration_batch_id,
            eers.am_assessment_id,
            eers.cm_academic_paper_subjects_id,
            eerb.ec_exam_registration_id,
            eerb.groups_id,
            oe.id as oeExamId,
            aps.properties ->> '$.externalMaxMark' as externalMaxMark,
            eerb.properties AS examRegistrationBatchProperties
        FROM
            ec_exam_registration_subject eers
        INNER JOIN ec_exam_registration_batch eerb ON
            eerb.id = eers.ec_exam_registration_batch_id
        INNER JOIN cm_academic_paper_subjects aps ON
            aps.id = eers.cm_academic_paper_subjects_id
        INNER JOIN am_assessment aa ON
            aa.id = eers.am_assessment_id
        INNER JOIN oe_exams oe ON
            oe.assessment_id = eers.am_assessment_id AND oe.is_deleted = 0
        WHERE
            1 = 1";
        try {
            $examRegistrationFee = $this->executeQueryForList($query.$whereQuery.$limitQuery, $this->mapper[ExamRegistrationSubjectServiceMapper::SEARCH_EXAM_REGISTRATION_SUBJECT_FEE]);
        } catch (\Exception $e) {
            throw new ExamControllerException(ExamControllerException::ERROR_FETCHING_EXAM_REGISTRATION_FEE,"Cannot fetch Exam Registration Batch details! Please try again.");
        }
        return $examRegistrationFee;
    } 
     /**
     * Get Exam Registration Subject 
     * @param groupId @groupId
     * *@param examRegistrationId @examRegistrationId
     * @return Subjects
     */
    public function getAssignedubjectByBatch($groupId,$examRegistrationId)
    {
        $groupId = $this->realEscapeString($groupId);
        $examRegistrationId = $this->realEscapeString($examRegistrationId);
        $query = "SELECT
                    eers.cm_academic_paper_subjects_id as id,
                    ap.name,
                    eers.fm_head_id,
                    eers. id as ec_exam_registration_subject
                FROM
                    ec_exam_registration_subject eers
                INNER JOIN ec_exam_registration_batch eerb ON
                        eerb.id = eers.ec_exam_registration_batch_id
                INNER JOIN  cm_academic_paper_subjects aps ON 
                        eers.cm_academic_paper_subjects_id = aps.id
                INNER JOIN  cm_academic_paper ap ON 
                        aps.cm_academic_paper_id = ap.id
                WHERE
                    eerb.groups_id = '$groupId' AND eerb.ec_exam_registration_id='$examRegistrationId";
        $assignedSubjects = $this->executeQueryForList($query);
        return $assignedSubjects;
        
    }
    public function getExamRegistrationSubjectFee($examRegistrationSubjectFee)
    {
        $examRegistrationSubjectFee = $this->realEscapeObject($examRegistrationSubjectFee);
        $subjectid = $examRegistrationSubjectFee->subjects['id'];
        $query = "SELECT
                    id 
                FROM
                    ec_exam_registration_subject
                WHERE
                ec_exam_registration_batch_id = '$examRegistrationSubjectFee->examRegistrationBatchRelationId' AND cm_academic_paper_subjects_id ='$subjectid";
        try {
        $assignedSubjectFee = $this->executeQueryForObject($query);
        }
        catch (\Exception $e) {
            throw new ExamControllerException(ExamControllerException::ERROR_FETCHING_EXAM_REGISTRATION_FEE,"Cannot fetch Exam Registration Batch details! Please try again.");
        }
        return $assignedSubjectFee;
    }
    /**
     * Get Exam Registration Assessment Examiner 
     * @param @request
     * @return Subjects
     */
    public function getAssessmentExaminer($request){
        $request = $this->realEscapeObject($request);
        $searchRuleRequest = new SearchRuleRequest;
        $searchRuleRequest->name = "EXAM_VALUATION_PROCEDURE_RULE";
        $examValuationProcedureRule = reset(RuleService::getInstance()->searchRule($searchRuleRequest))->rule;
        $whereQuery = "";
        $limitQuery = "";
        $resultData = [];
        $joinQuery = "";
        if(!empty($request->assessmentId)) {
            $whereQuery .= " AND eers.am_assessment_id = '$request->assessmentId'";
        }
        if(!empty($request->assessmentDate)) {
            $whereQuery .= " AND aa.properties_value ->>'$.assessmentDate' = '$request->assessmentDate'";
        }
        if(!empty($request->groupId)) {
            $whereQuery .= " AND g.id = '$request->groupId'";
        }
        if(!empty($request->courseTypeId)) {
            $whereQuery .= " AND p.course_type_id = '$request->courseTypeId'";
        }
        if(!empty($request->academicTermId)) {
            $whereQuery .= " AND CAST(eerb.properties ->> '$.academicTermId'AS CHAR) = '$request->academicTermId'";
        }
        if(!empty($request->examRegistrationId)) {
            $whereQuery .= " AND eerb.ec_exam_registration_id = '$request->examRegistrationId'";
        }
        if($request->examType == ExamRegistrationTypeConstants::REVALUATION){
            $joinQuery .= " INNER JOIN ec_exam_registration eer ON
                            eer.id = eerb.ec_exam_registration_id AND 
                            eer.trashed IS NULL
                        INNER JOIN ec_exam_registration eerp ON
                            eerp.id = eer.properties->>'$.parentExamRegistrationId' AND 
                            eerp.trashed IS NULL
                        INNER JOIN ec_exam_registration_batch eerbParent ON
                            eerbParent.ec_exam_registration_id = eerp.id  AND 
                            eerbParent.groups_id = eerb.groups_id
                        INNER JOIN ec_exam_registration_subject eers ON     
                            eers.ec_exam_registration_batch_id = eerbParent.id ";
        }
        else{
            $joinQuery .= " INNER JOIN ec_exam_registration eer ON
                            eer.id = eerb.ec_exam_registration_id AND 
                            eer.trashed IS NULL
                        INNER JOIN ec_exam_registration_subject eers ON     
                            eers.ec_exam_registration_batch_id = eerb.id ";
        }
       
        $query = "SELECT
            eers.id,
            eers.am_assessment_id,
            eerb.groups_id,
            eerb.ec_exam_registration_id,
            eers.ec_exam_registration_batch_id,
            eers.cm_academic_paper_subjects_id,
            oe.id AS onlineExamId,
            IF(
                eers.valuation_details IS NULL ,
                JSON_SET(JSON_OBJECT(), '$.staffIds', '', '$.departmentIds', '','$.valuationDates', ''),
                eers.valuation_details
            ) AS valuation_details,
            aa.name AS assessmentName,
            g.name AS groupName,
            s.id AS subjectId,
            s.name AS subjectDesc,
            s.code AS subjectName,
            aa.properties_value ->>'$.assessmentDate' AS assessmentDate,
            caps.properties ->> '$.syllabusName' AS syllabusName,
            caps.properties->>'$.subjectPriority' AS subjectPriority,
            g.properties->>'$.description' AS groupDescription,
            act.id as academicTermId,
            act.name as academicTermName
        FROM
            ec_exam_registration_batch eerb
        $joinQuery
        INNER JOIN  academic_term act ON 
            act.id = CAST(eerb.properties ->> '$.academicTermId'AS CHAR)
        INNER JOIN `groups` g ON
            g.id = eerb.groups_id
        INNER JOIN program p 
            ON p.id  = g.properties->>'$.programId'
        INNER JOIN am_assessment aa ON
            aa.id = eers.am_assessment_id
        INNER JOIN oe_exams oe ON
            oe.assessment_id = aa.id AND oe.is_deleted = 0
        INNER JOIN cm_academic_paper_subjects caps ON
            caps.id = eers.cm_academic_paper_subjects_id
        INNER JOIN v4_ams_subject s ON
            s.id = caps.ams_subject_id 
        WHERE
            g.trashed IS NULL";
        
        $settingsQuery = "SELECT value FROM settings s WHERE name='SUBJECT_SLOT_VALUES' AND `type`='EXAM_CONTROLLER'";
        try {
            $assementExaminers = $this->executeQueryForList($query.$whereQuery.$limitQuery, $this->mapper[ExamRegistrationSubjectServiceMapper::SEARCH_ASSESSMENT_EXAMINER]);
            $slots =  json_decode($this->executeQueryForObject($settingsQuery)->value);
        } catch (\Exception $e) {
            throw new ExamControllerException(ExamControllerException::ERROR_FETCHING_EXAM_REGISTRATION_FEE,"Cannot fetch Exam Registration Batch details! Please try again.");
        }
        $staffSideMarkEntryUItype = CommonService::getInstance()->getSettings(SettingsConstents::EXAM_VALUATION, SettingsConstents::STAFF_SIDE_MARK_ENTRY_UI_FORMAT);
        $mappedAcademicPaperSubjectIdsBySubject=[];
        $mappedGroupIdsBySubject=[];
        if($request->isAssignStaffBySubject){
            foreach ($assementExaminers as $assementExaminer) {
                $mappedAcademicPaperSubjectIdsBySubject[$assementExaminer->subjectId][] = $assementExaminer->paperSubjectId;
                $mappedGroupIdsBySubject[$assementExaminer->subjectId][] = $assementExaminer->groupId;
            }
        }
        foreach ($assementExaminers as $assementExaminer) {
            $assementExaminer->valuationDetails->staffIds = empty($assementExaminer->valuationDetails->staffIds) ? [] : $assementExaminer->valuationDetails->staffIds;
            // the Department Option Hide the case of 
            // $assementExaminer->valuationDetails->departmentIds = empty($assementExaminer->valuationDetails->departmentIds) ? [] : $assementExaminer->valuationDetails->departmentIds;
            $assementExaminer->valuationDetails->valuationDates = empty($assementExaminer->valuationDetails->valuationDates) ? [] : $assementExaminer->valuationDetails->valuationDates;
            $assementExaminer->valuationDetails->valuationStaffs = empty($assementExaminer->valuationDetails->valuationStaffs) ? [] : $assementExaminer->valuationDetails->valuationStaffs;
            $assementExaminer->valuationDetails->reValuationDates = empty($assementExaminer->valuationDetails->reValuationDates) ? [] : $assementExaminer->valuationDetails->reValuationDates;  
            $assementExaminer->valuationDetails->reValuationStaffs = empty($assementExaminer->valuationDetails->reValuationStaffs) ? [] : $assementExaminer->valuationDetails->reValuationStaffs;
            if (!empty($assementExaminer->valuationDetails->valuationStaffs)) {
                foreach ($assementExaminer->valuationDetails->valuationStaffs as $valuationStaff) {
                    $assementExaminer->assignedStaffIds = array_merge($assementExaminer->assignedStaffIds ? $assementExaminer->assignedStaffIds : [] ,$valuationStaff->addiitonalExamniners);
                    // $valuationStaff->allStaffs = empty($valuationStaff->departmentIds) ?  [] :  StaffService::getInstance()->getStaffByDepartments($valuationStaff->departmentIds);
                    $valuationStaff->staffs = [];
                    $valuationStaff->addiitonalExamninersName = empty($valuationStaff->addiitonalExamniners) ?  [] : StaffService::getInstance()->getStaffByIds($valuationStaff->addiitonalExamniners);
                    if(!$request->listAllFaculties){
                        $requestForStaff = new \stdClass();
                        $requestForStaff->academicPaperSubjectId = $mappedAcademicPaperSubjectIdsBySubject[$assementExaminer->subjectId] ? $mappedAcademicPaperSubjectIdsBySubject[$assementExaminer->subjectId] : $assementExaminer->paperSubjectId;
                        $valuationStaff->listStaffs = $this->getAssignedFacultiesByAcademicPaper($requestForStaff,'STAFF');
                    }
                }
                foreach ($assementExaminer->valuationDetails->valuationStaffs as $valuationStaff) {
                    $valuationStaff->removedStaffIds = array_diff($assementExaminer->assignedStaffIds ? $assementExaminer->assignedStaffIds : [] ,$valuationStaff->addiitonalExamniners);
                    foreach($valuationStaff->allStaffs as $staff){
                        if(!in_array($staff->staffId,$valuationStaff->removedStaffIds)){
                            $valuationStaff->staffs[] = $staff;
                        }
                    }
                    $valuationStaff->allStaffs = [];
                    if( !empty($valuationStaff->addiitonalExamniners) ){
                        $existingSavedStaffs = StaffService::getInstance()->getStaffByIds($valuationStaff->addiitonalExamniners);
                        $listStaffIds = array_column($valuationStaff->listStaffs, 'id');
                        if(!empty($existingSavedStaffs)){
                            $newStaffEntries = array_filter($existingSavedStaffs, function ($item) use ($listStaffIds) {
                                return !in_array($item->id, $listStaffIds);
                            });
                        }
                        $valuationStaff->listStaffs = array_values(array_merge( $valuationStaff->listStaffs, $newStaffEntries));
                    }
                }
                foreach ($assementExaminer->valuationDetails->valuationStaffs as $valuationStaff) {
                    if(!empty($valuationStaff->addiitonalExamninersName) && !empty($request->assessmentId)){
                        foreach($valuationStaff->addiitonalExamninersName as $staffName){
                            // if($staffSideMarkEntryUItype != 'DIGITAL_VALUATION'){
                            //     $requestForPapersEvaluated = new \stdClass;
                            //     $requestForPapersEvaluated->onlineExamId = $assementExaminer->onlineExamId;
                            //     $requestForPapersEvaluated->valuationCount = $valuationStaff->count;
                            //     $requestForPapersEvaluated->staffId = $staffName->id;
                            //     $staffName->papersEvaluvated = ExamValuationService::getInstance()->countOfEvaluatedStudentsByOnlineExam($requestForPapersEvaluated);
                            //     $staffName->isStudentAssigned = $staffName->papersEvaluvated > 0 ? true : false;
                            // }
                            // else{
                                $requestForAvailableStudent = new \stdClass;
                                $responseForAvailableStudent = new \stdClass;
                                $requestForAvailableStudent->staffId = $staffName->id;
                                $requestForAvailableStudent->valuationCount = $valuationStaff->count;
                                $requestForAvailableStudent->examRegistrationId = $assementExaminer->examRegistrationId;
                                $requestForAvailableStudent->assessmentId = $assementExaminer->assessmentId;
                                $requestForAvailableStudent->notCheckEmpty = true;
                                $responseForAvailableStudent = ExamValuationService::getInstance()->getAllAvailableStudentDetails($requestForAvailableStudent);
                                $staffName->isStudentAssigned = $responseForAvailableStudent->countOfAssignedStudents > 0 ? true : false; 
                            // }
                        }
                    }
                    $valuationStaff->isMarkConfirmed = false;
                    if(!empty($assementExaminer->valuationDetails->valuatedStaffs)){
                        foreach ($assementExaminer->valuationDetails->valuatedStaffs as $valuatedStaff) {
                            if(!empty($valuatedStaff)){
                                if(($valuationStaff->count == $valuatedStaff->count) && (($valuatedStaff->markEntryStatus == 'CONFIRMED') ||  ($valuatedStaff->markEntryStatus == 'SAVED'))){
                                    $valuationStaff->isMarkConfirmed = true;
                                }
                            }
                        }
                    }
                }
            }
            else {
                $assementExaminer->staffs = [];
            }
            if (!empty($assementExaminer->valuationDetails->reValuationStaffs)) {
                foreach ($assementExaminer->valuationDetails->reValuationStaffs as $valuationStaff) {
                    $assementExaminer->assignedStaffIds = array_merge($assementExaminer->assignedStaffIds ? $assementExaminer->assignedStaffIds : [] ,$valuationStaff->addiitonalExamniners);
                    $valuationStaff->allStaffs = empty($valuationStaff->departmentIds) ?  [] :  StaffService::getInstance()->getStaffByDepartments($valuationStaff->departmentIds);
                    $valuationStaff->staffs = [];
                    $valuationStaff->addiitonalExamninersName = empty($valuationStaff->addiitonalExamniners) ?  [] : StaffService::getInstance()->getStaffByIds($valuationStaff->addiitonalExamniners);
                }
                foreach ($assementExaminer->valuationDetails->reValuationStaffs as $valuationStaff) {
                    $valuationStaff->removedStaffIds = array_diff($assementExaminer->assignedStaffIds ? $assementExaminer->assignedStaffIds : [] ,$valuationStaff->addiitonalExamniners);
                    foreach($valuationStaff->allStaffs as $staff){
                        if(!in_array($staff->staffId,$valuationStaff->removedStaffIds)){
                            $valuationStaff->staffs[] = $staff;
                        }
                    }
                    $valuationStaff->allStaffs = [];
                }
                if($valuationStaff->count == '1' && !$request->listAllFaculties){
                    $requestForStaff = new \stdClass;
                    $requestForStaff->academicPaperSubjectId = $assementExaminer->paperSubjectId;
                    $valuationStaff->listStaffs = $this->getAssignedFacultiesByAcademicPaper($requestForStaff,'STAFF');
                }
                else if(!$request->listAllFaculties){
                    $requestForStaff = new \stdClass;
                    $requestForStaff->academicPaperSubjectId = $assementExaminer->paperSubjectId;
                    $valuationStaff->listStaffs = $this->getAssignedFacultiesByAcademicPaper($requestForStaff,'STAFF');
                    // $valuationStaff->listStaffs = $allStaffs;
                }
            }
            // $assementExaminer->valuationDetails->listStaffs = $allStaffs;
            $requestForStaff = new \stdClass;
            $requestForStaff->academicPaperSubjectId = $mappedAcademicPaperSubjectIdsBySubject[$assementExaminer->subjectId] ? $mappedAcademicPaperSubjectIdsBySubject[$assementExaminer->subjectId] : $assementExaminer->paperSubjectId;
            $subjectAssignedStaff = $this->getAssignedFacultiesByAcademicPaper($requestForStaff,'STAFF');
            $assementExaminer->valuationDetails->firstValuationStaff = $subjectAssignedStaff;
            $chiefExaminerIds = call_user_func_array('array_merge',array_column($assementExaminer->valuationDetails->valuationStaffs,"chiefExaminers"));
            $additionalExaminerIds = call_user_func_array('array_merge',array_column($assementExaminer->valuationDetails->valuationStaffs,"additionalExaminer"));
            $examinerStaffIds = array_unique(array_merge($chiefExaminerIds,$additionalExaminerIds));
            $examinerStaffs = empty($examinerStaffIds) ?  [] : StaffService::getInstance()->getStaffByIds($examinerStaffIds);
            switch ($request->listBasedOn) {
                // case 'BATCH_WISE':
                //     $resultData[$assementExaminer->groupId]->name = $assementExaminer->groupName;
                //     $resultData[$assementExaminer->groupId]->valuationDetails = $assementExaminer->valuationDetails;
                //     $resultData[$assementExaminer->groupId]->exams[] = $assementExaminer;
                //     $resultData[$assementExaminer->groupId]->staffs[] = $examinerStaffs;
                //     break;
                case 'SUBJECT_WISE':
                case 'BATCH_WISE':
                    $resultData[$assementExaminer->groupId]->name = $assementExaminer->groupName;
                    $resultData[$assementExaminer->groupId]->isExpand = false;
                    $resultData[$assementExaminer->groupId]->valuationDetails = $assementExaminer->valuationDetails ?  $assementExaminer->valuationDetails : $resultData[$assementExaminer->groupId]->valuationDetails;
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->subjectId = $assementExaminer->subjectId;
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->name = $assementExaminer->subjectName;
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->code = $assementExaminer->subjectCode;
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->academicTermName = $assementExaminer->academicTermName;
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->assessmentDate = $assementExaminer->assessmentDate ? date("d-m-Y", strtotime($assementExaminer->assessmentDate)) : '';
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->syllabusCode = $assementExaminer->syllabusCode;
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->subjectPriority = $assementExaminer->subjectPriority;
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->slot = "Slot " . $slots->{$assementExaminer->subjectPriority};
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->valuationDetails = $assementExaminer->valuationDetails;
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->exams[] = $assementExaminer;
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->staffs[] = $examinerStaffs;
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->assessmentId = $assementExaminer->assessmentId;
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->examRegistrationId = $assementExaminer->examRegistrationId;
                    $searchReguestForCountOfRegisteredStudent = new \stdClass;
                    $searchReguestForCountOfRegisteredStudent->academicPaperSubjectId = $mappedAcademicPaperSubjectIdsBySubject[$assementExaminer->subjectId] ? $mappedAcademicPaperSubjectIdsBySubject[$assementExaminer->subjectId] :$assementExaminer->paperSubjectId;
                    $searchReguestForCountOfRegisteredStudent->groupId = $mappedGroupIdsBySubject[$assementExaminer->subjectId] ? $mappedGroupIdsBySubject[$assementExaminer->subjectId] :$assementExaminer->groupId;
                    $searchReguestForCountOfRegisteredStudent->examRegistrationId = $request->examRegistrationId;
                    $searchReguestForCountOfRegisteredStudent->falseNoGeneratedStudentsOnly = false;
                    if($examValuationProcedureRule->showOnlyFalseNumberInAssignStudents){
                        $searchReguestForCountOfRegisteredStudent->falseNoGeneratedStudentsOnly = true;
                    }
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->noOfRegisteredStudentsForExam = StudentExamRegistrationService::getInstance()->getCountOfRegisteredStudents($searchReguestForCountOfRegisteredStudent);
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->noOfRegisteredStudents[1] =  $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->noOfRegisteredStudents[2] =  $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->noOfRegisteredStudentsForExam; 
                    $resultData[$assementExaminer->groupId]->subjects[$assementExaminer->paperSubjectId]->noOfRegisteredStudents[3] = ExamValuationService::getInstance()->getTotalCountOfThirdValuationStudentsForExamRegistrationSubject($searchReguestForCountOfRegisteredStudent);
                    break;
                
                default:
                    $resultData[$assementExaminer->assessmentId]->name = $assementExaminer->assessmentName;
                    $resultData[$assementExaminer->assessmentId]->batchName = $assementExaminer->groupName;
                    $resultData[$assementExaminer->assessmentId]->valuationDetails = $assementExaminer->valuationDetails;
                    $resultData[$assementExaminer->assessmentId]->exams[] = $assementExaminer;
                    $resultData[$assementExaminer->assessmentId]->staffs[] = $examinerStaffs;
                    break;
            }
        }
        ksort($resultData);
        if (isset($request->offset) && $request->offset > 0){
            if (isset($request->limitStart) && $request->limitStart>=0) {
                $resultData = array_slice($resultData,(int)$request->limitStart,(int)$request->offset);
            }
            else{
                $resultData = array_slice($resultData,0,(int)$request->offset);
            }
        }
        if($request->listBasedOn == "SUBJECT_WISE" || $request->listBasedOn == "BATCH_WISE"){
            array_walk($resultData,function($group,$key){
                $group->subjects = array_values($group->subjects);
            });
        }
        return array_values($resultData);
    }
     /**
     * Get Count of Exam Registration Assessment Examiner 
     * @param @request
     * @return Subjects
     */
    public function getCountOfAssessmentExaminer($request){
        $request = $this->realEscapeObject($request);
        $whereQuery = "";
        if(!empty($request->assessmentId)) {
            $whereQuery .= " AND eers.am_assessment_id = '$request->assessmentId'";
        }
        if(!empty($request->groupId)) {
            $whereQuery .= " AND g.id = '$request->groupId'";
        }
        if(!empty($request->courseTypeId)) {
            $whereQuery .= " AND g.properties->>'$.courseTypeId' = '$request->courseTypeId'";
        }
        if(!empty($request->academicTermId)) {
            $whereQuery .= " AND CAST(eerb.properties ->> '$.academicTermId'AS CHAR) = '$request->academicTermId'";
        }
        $query = "SELECT
                COUNT(distinct eers.cm_academic_paper_subjects_id) as count 
        FROM
            ec_exam_registration_subject eers
        INNER JOIN ec_exam_registration_batch eerb ON
            eerb.id = eers.ec_exam_registration_batch_id
        INNER JOIN `groups` g ON
            g.id = eerb.groups_id
        INNER JOIN am_assessment aa ON
            aa.id = eers.am_assessment_id
        INNER JOIN cm_academic_paper_subjects caps ON
            caps.id = eers.cm_academic_paper_subjects_id
        INNER JOIN v4_ams_subject s ON
            s.id = caps.ams_subject_id 
        WHERE
            g.trashed IS NULL
        ";
        try {
            $count = $this->executeQueryForObject($query.$whereQuery)->count;
        } catch (\Exception $e) {
            throw new ExamControllerException(ExamControllerException::ERROR_FETCHING_EXAM_REGISTRATION_FEE,"Cannot fetch Exam Registration Batch details! Please try again.");
        }
        
        return (int)$count;
    }
    
    /**
     * Update Exam Registration Valuation details
     * @param ExamRegistration $examRegistrationSubject
     * @return NULL
     */
    public function updateAssessmentExaminer(ExamRegistration $examRegistrationSubject)
    {
        $examRegistrationSubject = $this->realEscapeObject($examRegistrationSubject);
        $updatedBy = $GLOBALS['userId'];
        if(empty($examRegistrationSubject))
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS_EXAM_REGISTRATION_FEE,"Exam Registration is invalid! Please enter a valid Exam Registration");
        $examRegistrationSubject->valuationDetails->listStaffs = [];
        if(!empty($examRegistrationSubject->valuationDetails->valuationStaffs)){
            foreach($examRegistrationSubject->valuationDetails->valuationStaffs as $valuationStaff){
                $valuationStaff->listStaffs = [];
            }
        }
        $valuationDetails = json_encode($examRegistrationSubject->valuationDetails, JSON_HEX_APOS);
        $query = "UPDATE  ec_exam_registration_subject
        SET 
            valuation_details = '$valuationDetails',
            updated_by = '$updatedBy'
        WHERE
            id = '$examRegistrationSubject->id'";
        try {
            $this->executeQuery($query);
            AMSLogger::log_info($this->logger,Events::EC_EXAM_VALUATION_ASSIGN,[
                "staff" => new Staff(["id" => $updatedBy]),
                "request" => $valuationDetails,
                "status" => StatusConstants::SUCCESS
            ]);
        } 
            // $this->updateExamRegistrationFee($examRegistrationSubject);
        catch (\Exception $e) {
            AMSLogger::log_error($this->logger,Events::EC_EXAM_VALUATION_ASSIGN, [
                "staff" => new Staff(["id" => $updatedBy]),
                "request" => $valuationDetails,
                "errorCode" => $e->getCode(),
                "errorMessage" => $e->getMessage(),
                "status" => StatusConstants::FAILED
            ]);
            throw new ExamControllerException(ExamControllerException::ERROR_UPDATING_VALUATION_DATE,"Error while updating valuation dates! Please try again.");
        }
    }
    public function getAllSubjectsForCreatePacketByExamRegistrationId($examRegistrationId)
    {
        try
        {
            $query = "SELECT
                        DISTINCT eers.cm_academic_paper_subjects_id as id,
                        s.code as code,
                        s.name as name,
                        IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                        eers.id as examRegistrationSubjectId
                    FROM
                        ec_exam_registration_subject eers
                    INNER JOIN ec_exam_registration_batch eerb ON
                            eerb.id = eers.ec_exam_registration_batch_id
                    INNER JOIN  cm_academic_paper_subjects aps ON 
                            eers.cm_academic_paper_subjects_id = aps.id
                    INNER JOIN  v4_ams_subject s ON 
                            aps.ams_subject_id = s.id
                    INNER JOIN  cm_academic_paper ap ON 
                            aps.cm_academic_paper_id = ap.id
                    WHERE
                        eerb.ec_exam_registration_id='$examRegistrationId'
                    ORDER BY eers.created_date ASC ";
            $subjects = $this->executeQueryForList($query);
            foreach($subjects as $subject){
                $staffIdsArray = [];
                $deptIdsArray = [];
                $subject->answerGroupDetails = $this->getAsnwerGroupConfigDetailsByExamRegistrationAndAcademicPaperSubject($examRegistrationId,$subject->id);
                $assignedStaffs = $this->getAssignedStaffsForSubjectPacketByAcademicPaperId($examRegistrationId,$subject->id);
                foreach($assignedStaffs as $staffId)
                {
                    $staffIdsArray[] = $staffId->staffId;
                }
                $subject->staffs = $staffIdsArray;
                if(!empty($staffIdsArray)){
                        $departments = CommonExamService::getInstance()->getDepartmentsByAssignedStaffs($subject->staffs);
                    foreach($departments as $department){
                        $deptIdsArray[] = $department->deptId;
                    }
                }
                $subject->departments = $deptIdsArray;
            }
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjects;
    }
   
    public function getAsnwerGroupConfigDetailsByExamRegistrationAndAcademicPaperSubject($examRegistrationId,$academicPaperSubjectsId)
    {
        $academicPaperSubjectsId = $this->realEscapeString($academicPaperSubjectsId);
        $examRegistrationId = $this->realEscapeString($examRegistrationId);
        try 
        {
            $query = "SELECT
                        eesagc.id,
                        eesagc.registeredStudentCount,
                        eesagc.studentsPerAnswerSheetGroup,
                        eesagc.studentsPerAnswerSheetGroupCount,
                        eesagc.cm_academic_paper_subjects_id AS paperSubjectId,
                        eesagc.ec_exam_registration_id AS examRegistrationId,
                        eesag.packet_start_no AS answerSheetRangeFrom,
                        eesag.packet_end_no AS answerSheetRangeTo
                    FROM
                        exam_examReg_subject_answerSheet_group_config eesagc
                    INNER JOIN exam_examReg_subject_answerSheet_group eesag ON
                        eesagc.id = eesag.examReg_subject_answerSheet_group_config_id
                    WHERE
                        eesagc.cm_academic_paper_subjects_id = '$academicPaperSubjectsId' AND 
                        eesagc.ec_exam_registration_id = '$examRegistrationId'";
            $answerGroupDetailsConfig  = $this->executeQueryForObject($query);
            if(empty( $answerGroupDetailsConfig))
            {
                $answerGroupDetailsConfig->id = NULL;
                $answerGroupDetailsConfig->answerSheetRangeFrom = NULL;
                $answerGroupDetailsConfig->answerSheetRangeTo = NULL;
                $answerGroupDetailsConfig->paperSubjectId = $academicPaperSubjectsId;
                $answerGroupDetailsConfig->examRegistrationId = $examRegistrationId;
                $answerGroupDetailsConfig->registeredStudentCount = $this->getCountOfRegisteredStudentsByAssessment($examRegistrationId,$academicPaperSubjectsId);
                $answerGroupDetailsConfig->studentsPerAnswerSheetGroup = CommonService::getInstance()->getSettings("EXAM_VALUATION", "ANSWERSHEETS_PER_PACKET");
                $answerGroupDetailsConfig->studentsPerAnswerSheetGroupCount  = ceil($answerGroupDetailsConfig->registeredStudentCount/$answerGroupDetailsConfig->studentsPerAnswerSheetGroup );
            }
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $answerGroupDetailsConfig;
    }
    public function getCountOfRegisteredStudentsByAssessment($examRegistrationId,$academicPaperSubjectId)
    {
        $academicPaperSubjectId = $this->realEscapeString($academicPaperSubjectId);
        $examRegistrationId = $this->realEscapeString($examRegistrationId);
        try 
        {
            $query = "SELECT
                count(DISTINCT student_id) as registerdStudentCount
            FROM
                ec_student_assessment_registration
            WHERE
                am_assessment_id IN (SELECT 
                                            eers.am_assessment_id 
                                        FROM 
                                            ec_exam_registration_subject eers
                                        INNER JOIN ec_exam_registration_batch eerb ON
                                            eerb.id = eers.ec_exam_registration_batch_id
                                        WHERE  
                                            eerb.ec_exam_registration_id='$examRegistrationId' AND 
                                            eers.cm_academic_paper_subjects_id = '$academicPaperSubjectId')   
                AND properties ->> '$.registrationStatus' = 'REGISTERED' 
                AND properties ->> '$.feeStatus' = 'PAID'";
            $registerdStudentCount = $this->executeQueryForObject($query);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $registerdStudentCount->registerdStudentCount;
    }
    public function getAssignedStaffsForSubjectPacketByAcademicPaperId($examRegistrationId,$academicPaperSubjectId)
    {
        $academicPaperSubjectId = $this->realEscapeString($academicPaperSubjectId);
        $examRegistrationId = $this->realEscapeString($examRegistrationId);
        try 
        {
            $query = "SELECT
                        additionalEvaluator AS staffId
                    FROM
                        examValuationFacultyPackets
                    WHERE
                        cm_academic_paper_subjects_id = '$academicPaperSubjectId' AND 
                        ec_exam_registration_id = '$examRegistrationId'";
            $assignedStaffs  = $this->executeQueryForList($query);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $assignedStaffs;
    }
    
    public function getMaxSubjectMarkByAcademicPaperSubjectId($academicPaperSubjectId)
    {
        $academicPaperSubjectId = is_array($academicPaperSubjectId) ? $this->realEscapeArray($academicPaperSubjectId):stripslashes($this->realEscapeString($academicPaperSubjectId));
        $academicPaperSubjectId = is_array($academicPaperSubjectId) ? "'" . implode("','",$academicPaperSubjectId) . "'" : "'".$academicPaperSubjectId."'";
        try 
        {
            $query = "SELECT
                        aps.properties ->> '$.externalMaxMark' as maximumSubjectMark
                    FROM
                        cm_academic_paper_subjects aps
                    WHERE
                        aps.id IN ($academicPaperSubjectId)";
            $maximumSubjectMark  = $this->executeQueryForObject($query);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $maximumSubjectMark->maximumSubjectMark;
    }
    public function getExamregistrationSubjectDetails($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $searchRequest->academicPaperSubjectId = stripslashes($searchRequest->academicPaperSubjectId);
        $searchRequest->assessmentId = stripslashes($searchRequest->assessmentId); 
        try {
            $whereQuery = "";
            if(!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','",$searchRequest->groupId) . "'" : "'".$searchRequest->groupId."'";
                $whereQuery .= " AND eerb.groups_id IN ( $groupIdString )";
            }
            if(!empty($searchRequest->examRegistrationId)) {
                $examRegistrationIdString = is_array($searchRequest->examRegistrationId) ? "'" . implode("','",$searchRequest->examRegistrationId) . "'" : "'".$searchRequest->examRegistrationId."'";
                $whereQuery .= " AND eerb.ec_exam_registration_id IN ( $examRegistrationIdString )";
            }
            if(!empty($searchRequest->academicPaperSubjectId)) {
                $academicPaperSubjectIdString = is_array($searchRequest->academicPaperSubjectId) ? "'" . implode("','",$searchRequest->academicPaperSubjectId) . "'" : "'".$searchRequest->academicPaperSubjectId."'";
                $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ( $academicPaperSubjectIdString )";
            }
            if(!empty($searchRequest->academicPaperSubjectIds)) {
                $academicPaperSubjectIdsString = is_array($searchRequest->academicPaperSubjectIds) ? "'" . implode("','",$searchRequest->academicPaperSubjectIds) . "'" : "'".$searchRequest->academicPaperSubjectIds."'";
                $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ( $academicPaperSubjectIdsString )";
            }
            if(!empty($searchRequest->assessmentId)) {
                $whereQuery .= " AND eers.am_assessment_id IN ( '$searchRequest->assessmentId' )";
            }
            if(!empty($searchRequest->examRegistrationBatchId)) {
                $examRegistrationBatchIdString = is_array($searchRequest->examRegistrationBatchId) ? "'" . implode("','",$searchRequest->examRegistrationBatchId) . "'" : "'".$searchRequest->examRegistrationBatchId."'";
                $whereQuery .= " AND eerb.id IN ( $examRegistrationBatchIdString )";
            }
            $query = "SELECT
                        eer.id as examRegistrationId,
                        eer.name as examRegistrationName,
                        eer.type as examRegistrationType,
                        eers.am_assessment_id as assessmentId,
                        eer.properties ->> '$.examDate' as examDate,
                        aps.properties ->> '$.externalMaxMark' as maximumSubjectMark,
                        eers.valuation_details as valuationDetails,
                        s.code as subjectCode,
                        s.name as subjectName,
                        IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                        g.name as groupName,
                        g.id as groupId,
                        ct.course_Type as courseType
                    FROM
                        ec_exam_registration_subject eers
                    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
                    INNER JOIN `groups` g ON
                        g.id = eerb.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  cm_academic_paper_subjects aps ON 
                        aps.id = eers.cm_academic_paper_subjects_id
                    INNER JOIN  v4_ams_subject s ON 
                        s.id = aps.ams_subject_id
                    WHERE
                       1 = 1 ";
            $subjectDetails  = $this->executeQueryForObject($query.$whereQuery);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
     /**
     * get All Subjects For Exam Date Definition
     * @param Request $searchRequest
     * @return $response
     */
    public function getAllSubjectsForExamDateDefinition($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try {
            $response = new \stdClass;
            $request = new \stdClass;
            $enableOnlineExam = 0;
            $enableOnlineExam = CommonService::getInstance()->getSettings(SettingsConstants::EXAM_CONTROLLER, SettingsConstants::ONLINE_EXAMINATION_PRIVILEGE);
            $assignedSubjects = [];
            $request->examRegistrationId = $searchRequest->examRegistrationId;
            $request->subjectTypes = $searchRequest->subjectTypeIds;
            $request->groupId = $searchRequest->groupId;
            $request->academicTermId = $searchRequest->currentTermId;
            $request->subjectCategoriesIds = $searchRequest->subjectCategoriesIds;
            $request->subjectSlotIds = $searchRequest->subjectSlotIds;
            $searchRuleRequest = new SearchRuleRequest;
            $searchRuleRequest->name = "EXAM_DEFINITION_RULE";
            $examDefinitionRule = reset(RuleService::getInstance()->searchRule($searchRuleRequest))->rule;
          
            $requestForExamRegistration = new SearchExamRegistrationRequest;
            $requestForExamRegistration->id = $request->examRegistrationId;
            $examRegistration = ExamRegistrationService::getInstance()->searchExamRegistration($requestForExamRegistration);
            $uniqueSubjects = [];
            $assignedSubjects = $this->getAllSubjectAssessmentDetailsByExamRegistrationId($request);
            foreach($assignedSubjects as $subject){
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->id = $subject->subjectId;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->subjectCode = $subject->subjectCode;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->subjectName = $subject->subjectName;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->syllabusName = $subject->syllabusName;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->isTheory = $subject->isTheory;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->onlineExamType = $subject->onlineExamType;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->subjectTypeId = $subject->subjectTypeId;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->externalMaxMark = $subject->externalMaxMark;
                $subject->assessmentProperties = json_decode($subject->assessmentProperties);
                if(! $subject->assessmentProperties->assessmentDate){
                    $subject->assessmentProperties->assessmentDate= "";
                    $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->hasEmptyDate = 1;
                }
                if(! $subject->assessmentProperties->startTime){
                    $subject->assessmentProperties->startTime= "";
                    $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->hasEmptyDate = 1;
                }
                if(! $subject->assessmentProperties->endTime && $examDefinitionRule->isAvoidExamEndTime != '1'){
                    $subject->assessmentProperties->endTime= "";
                    $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->hasEmptyDate = 1;
                }
                if(!empty($subject->assessmentIdentifyingContext)){
                    $subject->assessmentIdentifyingContext = json_decode($subject->assessmentIdentifyingContext);
                }
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentProperties = clone($subject->assessmentProperties);
                if( $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->hasEmptyDate ){
                    $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentProperties->assessmentDate= "";
                    $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentProperties->startTime= "";
                    $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentProperties->endTime= "";
                }
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->batches[$subject->groupId]->groupId = $subject->groupId;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->batches[$subject->groupId]->groupName = $subject->groupName;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->batches[$subject->groupId]->assessmentProperties = $subject->assessmentProperties;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->batches[$subject->groupId]->onlineExamType = $subject->onlineExamType;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->batches[$subject->groupId]->externalMaxMark = $subject->externalMaxMark;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->batches[$subject->groupId]->assessmentId = $subject->assessmentId;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->batches[$subject->groupId]->academicPaperSubjectId = $subject->academicPaperSubjectId;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->batches[$subject->groupId]->assessmentIdentifyingContext = $subject->assessmentIdentifyingContext;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->batches[$subject->groupId]->assessmentInstanceId = $subject->assessmentInstanceId;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->batches[$subject->groupId]->assessmentDescription = $subject->assessmentDescription;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->batches[$subject->groupId]->assessmentName = $subject->assessmentName;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->batches[$subject->groupId]->subjectName = $subject->subjectName;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->batches[$subject->groupId]->syllabusName = $subject->syllabusName;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->batches[$subject->groupId]->onlineExamId = $subject->onlineExamId;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentIds[$subject->assessmentId]->assessmentId = $subject->assessmentId;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentIds[$subject->assessmentId]->academicPaperSubjectId = $subject->academicPaperSubjectId;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentIds[$subject->assessmentId]->assessmentProperties = $subject->assessmentProperties;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentIds[$subject->assessmentId]->assessmentIdentifyingContext = $subject->assessmentIdentifyingContext;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentIds[$subject->assessmentId]->assessmentInstanceId = $subject->assessmentInstanceId;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentIds[$subject->assessmentId]->assessmentDescription = $subject->assessmentDescription;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentIds[$subject->assessmentId]->assessmentName = $subject->assessmentName;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentIds[$subject->assessmentId]->onlineExamType = $subject->onlineExamType;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentIds[$subject->assessmentId]->onlineExamId = $subject->onlineExamId;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentIds[$subject->assessmentId]->subjectName = $subject->subjectName;
                $uniqueSubjects[$subject->subjectCode.'-'.$subject->subjectName]->assessmentIds[$subject->assessmentId]->syllabusName = $subject->syllabusName;
            }
            $totalExamAssessment = count($uniqueSubjects); 
            $uniqueSubjects = array_values($uniqueSubjects); 
            foreach($uniqueSubjects as $subject){
                $subject->batches = array_values($subject->batches); 
                $subject->assessmentIds = array_values($subject->assessmentIds);
                $subject->isExpand = false;
                $subject->isSelected = false; 
            }
            ksort($uniqueSubjects);
            // if (isset($searchRequest->offset) && $searchRequest->offset>=0){
            //     if (isset($searchRequest->limitStart) && $searchRequest->limitStart>=0) {
            //         $uniqueSubjects = array_slice($uniqueSubjects,(int)$searchRequest->limitStart,(int)$searchRequest->offset);
            //     }
            //     else{
            //         $uniqueSubjects = array_slice($uniqueSubjects,0,(int)$searchRequest->offset);
            //     }
            // }
            
            $response->subjects = $uniqueSubjects;
            $response->totalExamAssessment = $totalExamAssessment;
            $response->publishExamTimeTableStudent = reset($examRegistration)->properties->publishExamTimeTableStudent;
            $response->considerPublishTimeTable = $examDefinitionRule->considerPublishTimeTable;  
            $response->isAvoidExamEndTime = $examDefinitionRule->isAvoidExamEndTime == '1' ? true : false;  
            $response->enableOnlineExam = $enableOnlineExam;  
            $response->currentStaffId = (int)$GLOBALS['userId'];
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $response;
    }
    
    /**
     * get All Subject Details By Exam Registration ID
     * @param ExamRegistrationId $examRegistrationId
     * @return $subjectDetails
     */
    public function getAllSubjectAssessmentDetailsByExamRegistrationId($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $whereQuery = null;
        $subjectOrderBy = CommonService::getInstance()->getSettings(SettingsConstants::EXAM_CONTROLLER, SettingsConstants::SUBJECT_ORDER_TAKEN_BY);
        if($subjectOrderBy == "ORDER"){
            $orderBy = " ORDER BY CAST(aps.properties ->> '$.orderNo' AS UNSIGNED) ASC";
        }
        else{
            $orderBy = " ORDER BY CAST(aps.properties ->> '$.priority' AS UNSIGNED) ASC";
        }
        if(!empty($searchRequest->subjectTypes)){
            $whereQuery .= " AND aps.properties ->> '$.subjectTypeId' IN (" ."'" . implode("', '", $searchRequest->subjectTypes) . "'" .")";
        }
        if(!empty($searchRequest->subjectCategoriesIds)){
            $whereQuery .= " AND aps.category_id IN (" ."'" . implode("', '", $searchRequest->subjectCategoriesIds) . "'" .")";
        }
        if(!empty($searchRequest->subjectSlotIds)){
            $whereQuery .= " AND aps.slot_id IN (" ."'" . implode("', '", $searchRequest->subjectSlotIds) . "'" .")";
        }
        if(!empty($searchRequest->examRegistrationId)) {
            $examRegistrationIdString = is_array($searchRequest->examRegistrationId) ? "'" . implode("','",$searchRequest->examRegistrationId) . "'" : "'".$searchRequest->examRegistrationId."'";
            $whereQuery .= " AND eerb.ec_exam_registration_id IN ( $examRegistrationIdString )";
        }
        if(!empty($searchRequest->groupId)) {
            $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','",$searchRequest->groupId) . "'" : "'".$searchRequest->groupId."'";
            $whereQuery .= " AND g.id IN ( $groupIdString )";
        }
        if(!empty($searchRequest->academicTermId)) {
            $academicTermIdString = is_array($searchRequest->academicTermId) ? "'" . implode("','",$searchRequest->academicTermId) . "'" : "'".$searchRequest->academicTermId."'";
            $whereQuery .= " AND eerb.properties ->> '$.academicTermId' IN ( $academicTermIdString )";
        }
        $joinQueries = "";
        if(!empty($searchRequest->courseTypeId)) {
            $whereQuery .= " AND p.course_type_id = $searchRequest->courseTypeId";
            $joinQueries .= " INNER JOIN program p 
                            ON p.id  = g.program_id";
        }
        if(!empty($searchRequest->startYear)) {
            $whereQuery .= " AND g.properties ->> '$.startYear' = '$searchRequest->startYear'";
        }
        try { 
            $query = "SELECT 
                        DISTINCT aps.id as id,
                        aps.id as academicPaperSubjectId,
                        g.id as groupId,
                        g.name as groupName,
                        eers.am_assessment_id as assessmentId,
                        aa.name as assessmentName,
                        aa.description as assessmentDescription,
                        aa.am_instance_id as assessmentInstanceId,
                        aa.identifying_context as assessmentIdentifyingContext,
                        aa.properties_value as assessmentProperties,
                        aa.permissions as assessmentPermissions,
                        s.id as subjectId,
                        s.code as subjectCode,
                        s.name as subjectName,
                        aps.properties ->> '$.syllabusName' AS syllabusName,
                        IF(aps.properties ->> '$.classType' like '%THEORY%',1,0) AS isTheory,
                        oe.id as onlineExamId,
                        oe.identifying_context ->> '$.type' as onlineExamType,
                        aps.properties ->> '$.subjectTypeId' as subjectTypeId,
                        aps.properties ->> '$.externalMaxMark' as externalMaxMark
                    FROM
                        ec_exam_registration_subject eers
                    INNER JOIN ec_exam_registration_batch eerb ON
                        eerb.id = eers.ec_exam_registration_batch_id
                    INNER JOIN `groups` g ON
                        g.id = eerb.groups_id
                    LEFT JOIN oe_exams oe ON
                        oe.assessment_id = eers.am_assessment_id AND oe.is_deleted = 0
                    INNER JOIN am_assessment aa ON
                        aa.id = eers.am_assessment_id
                    INNER JOIN  cm_academic_paper_subjects aps ON 
                        aps.id = eers.cm_academic_paper_subjects_id
                    INNER JOIN  v4_ams_subject s ON 
                        s.id = aps.ams_subject_id
                    $joinQueries
                    WHERE
                        aa.is_active = 1 ";
            $subjectDetails = $this->executeQueryForList($query.$whereQuery.$orderBy);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
     /**
     * print Exam Date Details
     * @param Request $searchRequest
     * @return $response
     */
    public function printExamDateDetails($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try {
            $response = new \stdClass;
            $request = new \stdClass;
            $assignedSubjects = [];
            $request->examRegistrationId = $searchRequest->examRegistrationId;
            $request->subjectTypes = $searchRequest->subjectTypeIds;
            $request->subjectCategoriesIds = $searchRequest->subjectCategoriesIds;
            $request->subjectSlotIds = $searchRequest->subjectSlotIds;
            $assignedSubjects = $this->getAllSubjectAssessmentDetailsByExamRegistrationId($request);
            foreach($assignedSubjects as $subject){
                if(!empty($subject->assessmentIdentifyingContext)){
                    $subject->assessmentIdentifyingContext = json_decode($subject->assessmentIdentifyingContext);
                }
                if(!empty($subject->assessmentProperties)){
                    $subject->assessmentProperties = json_decode($subject->assessmentProperties);
                    if($subject->assessmentProperties->assessmentDate)
                    {
                        $subject->assessmentProperties->assessmentDate = date("d-m-Y" ,strtotime($subject->assessmentProperties->assessmentDate));
                    }
                    if($subject->assessmentProperties->startTime)
                    {
                        $subject->assessmentProperties->startTime = date("h:i A" ,strtotime($subject->assessmentProperties->startTime));
                    }
                    if($subject->assessmentProperties->endTime)
                    {
                        $subject->assessmentProperties->endTime = date("h:i A" ,strtotime($subject->assessmentProperties->endTime));
                    }
                }
            }
            if(empty($assignedSubjects)){
                throw new ExamControllerException(ExamControllerException::NO_STUDENT_IN_THE_BATCH_SUBJECT,"No Students Registerd In this Exam");
            }
            else
            {
                $requestForExamRegistration = new SearchExamRegistrationRequest;
                $requestForExamRegistration->id = $searchRequest->examRegistrationId;
                $examRegistration = ExamRegistrationService::getInstance()->searchExamRegistration($requestForExamRegistration);
                if(!empty($examRegistration)){
                    $currentExamRegistrationDetails = $examRegistration[0];
                }
                $templateName = "PrintExamDateAndTimeDetails";
                $responseHtml = TwigRenderer::renderTemplateFileToHtml(realpath(DOCUMENT_ROOT."../examcontroller-api/src/com/linways/web/templates/printTwigs/$templateName.twig"), [ 'subjects'=>$assignedSubjects ,'examRegistration'=>$currentExamRegistrationDetails]);
                $prtContent = NULL;
                    $prtContent .= '<html><head>';
                    $prtContent .= "<style>
                        
                        </style>";
                    $prtContent .= '</head><title>Exam Date And Time Report</title><body>';
                    $prtContent .= $responseHtml;
                    $prtContent .= '</body></html>';
                    $totalWidth = 210;
                    $totalHeight = 297;
                    $options = array(
                        'page-width'     => $totalWidth."mm",
                        'page-height'    => $totalHeight."mm",
                        'dpi'            => 96,
                        'margin-top' => "9mm",
                        'margin-left' => "1mm",
                        'margin-right' => "1mm",
                        'margin-bottom' => "9mm",
                        // 'binary' => "/usr/local/bin/wkhtmltopdf", // For Mac
                        'user-style-sheet' => realpath(DOCUMENT_ROOT . "/libcommon/bootstrap/css/bootstrap.min.css")
                    );
                $programResult = new \stdClass;
                $programResult->displayData = $responseHtml;
                $programResult->pdf = PdfUtil::renderPdf($prtContent, $options);
                return  $programResult;
            }
             
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $response;
    }
     /**
     * get All Subject Details By Exam Registration ID
     * @param ExamRegistrationId $examRegistrationId
     * @return $subjectDetails
     */
    public function getSubjectForCurrentStaffs($request)
    {
        $request = $this->realEscapeObject($request);
        $query = "";
        $currentUerId = $GLOBALS['userId'];
        $subjectDetails = [];
        try 
        { 
            $query = "SELECT
                    DISTINCT(aps.id) as id,
                    aps.id as academicPaperSubjectId,
                    s.id as subjectId,
                    s.code as subjectCode,
                    s.name as subjectName,
                    oe.id as onlineExamId,
                    eers.am_assessment_id as assessmentId,
                    oe.settings ->> '$.isValidated' AS isValidated,
                    aps.properties ->> '$.syllabusName' AS syllabusName,
                    IF(aps.properties ->> '$.classType' LIKE '%THEORY%',1,0) AS isTheory,
                    aps.properties ->> '$.externalMaxMark' as externalMaxMark,
                    eers.valuation_details as valuationDetails,
                    eerb.ec_exam_registration_id as examRegistrationId,
                    eqc.qpCode,
                    ct.course_Type as courseType
                FROM
                    ec_exam_registration_subject eers
                INNER JOIN ec_exam_registration_batch eerb ON
                    eerb.id = eers.ec_exam_registration_batch_id
                INNER JOIN  cm_academic_paper_subjects aps ON 
                    aps.id = eers.cm_academic_paper_subjects_id
                INNER JOIN am_assessment aa ON
                    aa.id = eers.am_assessment_id
                INNER JOIN oe_exams oe ON
                    oe.assessment_id = eers.am_assessment_id AND oe.is_deleted = 0
                INNER JOIN  v4_ams_subject s ON 
                    s.id = aps.ams_subject_id
                INNER JOIN `groups` g ON
                    g.id = eerb.groups_id
                INNER JOIN program p 
                    ON p.id  = g.properties->>'$.programId'
                INNER JOIN `course_type` ct ON
                    ct.courseTypeID = p.course_type_id
                LEFT JOIN examQpCodes eqc ON
                    eqc.cm_academic_paper_subjects_id =  eers.cm_academic_paper_subjects_id AND eqc.ec_exam_registration_id = eerb.ec_exam_registration_id
                WHERE
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('addiitonalExamniners', '$currentUerId')) AND 
                    eerb.ec_exam_registration_id='$request->examRegistrationId'  AND 
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('count', '$request->currentValuationCount')) OR
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('chiefExaminers', '$currentUerId')) AND
                    eerb.ec_exam_registration_id='$request->examRegistrationId'  AND 
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('count', '$request->currentValuationCount')) ";
            
            $subjects = $this->executeQueryForList($query);
            foreach($subjects as $subject){
                $subject->valuationDetailsCopy = json_decode($subject->valuationDetails);
                $subject->valuationStaffs = $subject->valuationDetailsCopy->valuationStaffs;
                $subject->currentValuationObj = (array_filter($subject->valuationStaffs ,function($value)use($request){
                    return $value->count == $request->currentValuationCount;
                }));
                foreach($subject->currentValuationObj as $currentValuationObj){
                    if((in_array( $currentUerId,$currentValuationObj->addiitonalExamniners))|| (in_array( $currentUerId,$currentValuationObj->chiefExaminers))){
                        $subjectDetails[$subject->id]->id = $subject->id;
                        $subjectDetails[$subject->id]->subjectId = $subject->subjectId;
                        $subjectDetails[$subject->id]->academicPaperSubjectId = $subject->academicPaperSubjectId;
                        $subjectDetails[$subject->id]->subjectCode = $subject->subjectCode;
                        $subjectDetails[$subject->id]->subjectName = $subject->subjectName;
                        $subjectDetails[$subject->id]->assessmentId = $subject->assessmentId;
                        $subjectDetails[$subject->id]->isTheory = $subject->isTheory;
                        $subjectDetails[$subject->id]->externalMaxMark = $subject->externalMaxMark;
                        $subjectDetails[$subject->id]->valuationDetails = $subject->valuationDetails;
                        $subjectDetails[$subject->id]->examRegistrationId = $subject->examRegistrationId;
                        $subjectDetails[$subject->id]->qpCode = $subject->qpCode;
                        $subjectDetails[$subject->id]->courseType = $subject->courseType;
                        $subjectDetails[$subject->id]->onlineExamId[] = $subject->onlineExamId;
                        $subjectDetails[$subject->id]->isValidatedDetails[] = $subject->isValidated;
                    }
                }
                
            }
            $subjectDetails = array_values($subjectDetails);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * get Subject Details By current Staff
     * @param  $request
     * @return $subjectDetails
     */
    public function getcurrentExamSubjectForCurrentStaff($request)
    {
        $request = $this->realEscapeObject($request);
        $query = "";
        $currentUerId = $GLOBALS['userId'];
        $whereQuery = null;
        if(!empty($request->paperSubjectId))
        {
            $academicPaperSubjectIdsString = is_array($request->paperSubjectId) ? "'" . implode("','",$request->paperSubjectId) . "'" : "'".$request->paperSubjectId."'";
            $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ( $academicPaperSubjectIdsString )";
        }
        if(!empty($request->examRegistrationBatchId))
        {
            $whereQuery .= " AND eers.ec_exam_registration_batch_id = '$request->examRegistrationBatchId";
        }
        if(!empty($request->academicPaperSubjectIds)) {
            $academicPaperSubjectIdsString = is_array($request->academicPaperSubjectIds) ? "'" . implode("','",$request->academicPaperSubjectIds) . "'" : "'".$request->academicPaperSubjectIds."'";
            $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ( $academicPaperSubjectIdsString )";
        }
        if(!empty($request->examRegistrationId))
        {
            $whereQuery .= " AND eerb.ec_exam_registration_id = '$request->examRegistrationId";
        }
        if(!empty($request->assessmentId))
        {
            $whereQuery .= " AND eers.am_assessment_id = '$request->assessmentId";
        }
        try 
        { 
            $query = "SELECT DISTINCT
                    eers.am_assessment_id as id,
                    aps.id as academicPaperSubjectId,
                    eers.am_assessment_id as assessmentId,
                    g.id as groupId,
                    g.name as groupName,
                    eer.name as examRegistrationName,
                    eer.type as examRegistrationType,
                    s.code as subjectCode,
                    s.name as subjectName,
                    aps.properties ->> '$.syllabusName' AS syllabusName,
                    IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                    aps.properties ->> '$.subjectTypeId' as subjectTypeId,
                    aps.properties ->> '$.externalMaxMark' as externalMaxMark,
                    aps.properties ->> '$.internalMaxMark' as internalMaxMark,
                    eers.valuation_details as valuationDetails,
                    aa.properties_value as assessmentProperties,
                    oe.id as onlineExamId,
                    eqc.qpCode,
                    ct.course_Type as courseType
                FROM
                    ec_exam_registration_subject eers
                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
                INNER JOIN `groups` g ON
                    g.id = eerb.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  cm_academic_paper_subjects aps ON 
                    aps.id = eers.cm_academic_paper_subjects_id
                INNER JOIN  v4_ams_subject s ON 
                    s.id = aps.ams_subject_id
                INNER JOIN am_assessment aa ON
                    aa.id = eers.am_assessment_id
                INNER JOIN oe_exams oe ON
                    oe.assessment_id = aa.id AND oe.is_deleted = 0
                LEFT JOIN examQpCodes eqc ON
                    eqc.cm_academic_paper_subjects_id =  eers.cm_academic_paper_subjects_id AND eqc.ec_exam_registration_id = eerb.ec_exam_registration_id
                WHERE
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('addiitonalExamniners', '$currentUerId')) AND 
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('count', '$request->currentValuationCount')) $whereQuery OR 
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('chiefExaminers', '$currentUerId')) AND
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('count', '$request->currentValuationCount')) $whereQuery ";
            $subjectDetails = $this->executeQueryForObject($query);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * get All Subject Details By Exam Registration ID
     * @param ExamRegistrationId $examRegistrationId
     * @return $subjectDetails
     */
    public function getAllCurretStaffSubjectsValuationDetailsByExamRegistrationId($request)
    {
        $request = $this->realEscapeObject($request);
        $query = "";
        $currentUerId = $GLOBALS['userId'];
        $whereQuery = null;
        if(!empty($request->examRegistrationId))
        {
            $whereQuery .= " AND eerb.ec_exam_registration_id = '$request->examRegistrationId";
        }
        if(!empty($request->academicPaperSubjectIds)){
            $request->paperSubjectId = is_array($request->academicPaperSubjectIds) ? "'" . implode("','",$request->academicPaperSubjectIds) . "'" : "'".$request->academicPaperSubjectIds."'";
            $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ($request->paperSubjectId";
        }
        try 
        { 
            $query = "SELECT
                    eers.am_assessment_id as id,
                    eers.am_assessment_id as assessmentId,
                    eers.cm_academic_paper_subjects_id as academicPaperSubjectId,
                    eers.valuation_details as valuationDetails
                FROM
                    ec_exam_registration_subject eers
                INNER JOIN ec_exam_registration_batch eerb ON
                    eerb.id = eers.ec_exam_registration_batch_id   
                WHERE
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('addiitonalExamniners', '$currentUerId')) $whereQuery OR
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('chiefExaminers', '$currentUerId')) $whereQuery";
            $subjectDetails = $this->executeQueryForList($query);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
     /**
     * get All Subject Details By current Staff
     * @param  $request
     * @return $subjectDetails
     */
    public function getAllSubjectForCurrentStaff($request)
    {
        $request = $this->realEscapeObject($request);
        $query = "";
        $currentUerId = $GLOBALS['userId'];
        $whereQuery = null;
        if(!empty($request->paperSubjectId))
        {
            $request->paperSubjectId = is_array($request->paperSubjectId) ? "'" . implode("','",$request->paperSubjectId) . "'" : "'".$request->paperSubjectId."'";
            $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ($request->paperSubjectId";
        }
        if(!empty($request->examRegistrationBatchId))
        {
            $whereQuery .= " AND eers.ec_exam_registration_batch_id = '$request->examRegistrationBatchId";
        }
        if(!empty($request->examRegistrationId))
        {
            $whereQuery .= " AND eerb.ec_exam_registration_id = '$request->examRegistrationId";
        }
        try 
        { 
            $query = "SELECT
                    DISTINCT (eers.am_assessment_id) as id,
                    aps.id as academicPaperSubjectId,
                    eers.am_assessment_id as assessmentId,
                    eers.id as ec_exam_registration_subject_id,
                    g.id as groupId,
                    g.name as groupName,
                    s.code as subjectCode,
                    s.name as subjectName,
                    aps.properties ->> '$.syllabusName' AS syllabusName,
                    IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                    aps.properties ->> '$.subjectTypeId' as subjectTypeId,
                    aps.properties ->> '$.externalMaxMark' as externalMaxMark,
                    eers.valuation_details as valuationDetails,
                    aa.properties_value as assessmentProperties
                FROM
                    ec_exam_registration_subject eers
                INNER JOIN ec_exam_registration_batch eerb ON
                    eerb.id = eers.ec_exam_registration_batch_id
                INNER JOIN `groups` g ON
                    g.id = eerb.groups_id
                INNER JOIN  cm_academic_paper_subjects aps ON 
                    aps.id = eers.cm_academic_paper_subjects_id
                INNER JOIN  v4_ams_subject s ON 
                    s.id = aps.ams_subject_id
                INNER JOIN am_assessment aa ON
                    aa.id = eers.am_assessment_id 
                WHERE
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('addiitonalExamniners', '$currentUerId')) AND 
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('count', '$request->currentValuationCount')) $whereQuery OR
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('chiefExaminers', '$currentUerId')) AND
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('count', '$request->currentValuationCount')) $whereQuery";
            $subjectDetails = $this->executeQueryForList($query);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
     /**
     * get Subject Details By current Staff
     * @param  $request
     * @return $subjectDetails
     */
    public function getAllExamSubjectForCurrentStaffDigitalValuation($request)
    {
        $request = $this->realEscapeObject($request);
        $query = "";
        $currentUerId = $GLOBALS['userId'];
        $whereQuery = null;
        if(!empty($request->paperSubjectId))
        {
            $academicPaperSubjectIdsString = is_array($request->paperSubjectId) ? "'" . implode("','",$request->paperSubjectId) . "'" : "'".$request->paperSubjectId."'";
            $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ( $academicPaperSubjectIdsString )";
        }
        if(!empty($request->examRegistrationBatchId))
        {
            $whereQuery .= " AND eers.ec_exam_registration_batch_id = '$request->examRegistrationBatchId";
        }
        if(!empty($request->examRegistrationId))
        {
            $whereQuery .= " AND eerb.ec_exam_registration_id = '$request->examRegistrationId";
        }
        if(!empty($request->assessmentId))
        {
            $whereQuery .= " AND eers.am_assessment_id = '$request->assessmentId";
        }
        try 
        { 
            $query = "SELECT
                    DISTINCT eers.am_assessment_id as id,
                    aps.id as academicPaperSubjectId,
                    eers.am_assessment_id as assessmentId,
                    s.code as subjectCode,
                    s.name as subjectName,
                    aps.properties ->> '$.syllabusName' AS syllabusName,
                    eap.packet_list as packetDetails,
                    IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                    aps.properties ->> '$.subjectTypeId' as subjectTypeId,
                    aps.properties ->> '$.externalMaxMark' as externalMaxMark,
                    eers.valuation_details as valuationDetails,
                    aa.properties_value as assessmentProperties
                FROM
                    ec_exam_registration_subject eers
                INNER JOIN ec_exam_registration_batch eerb ON
                    eerb.id = eers.ec_exam_registration_batch_id
                INNER JOIN  cm_academic_paper_subjects aps ON 
                    aps.id = eers.cm_academic_paper_subjects_id
                INNER JOIN  v4_ams_subject s ON 
                    s.id = aps.ams_subject_id
                INNER JOIN am_assessment aa ON
                    aa.id = eers.am_assessment_id
                LEFT JOIN ec_answersheet_packet eap ON 
                    eap.identifying_context ->> '$.examRegistrationId' = eerb.ec_exam_registration_id AND
                    eap.identifying_context ->> '$.academicPaperSubjectId' = eers.cm_academic_paper_subjects_id AND 
                    eap.identifying_type = 'EXAM_REGISTRATION_SUBJECT'
                WHERE
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('addiitonalExamniners', '$currentUerId')) AND 
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('count', '$request->currentValuationCount')) $whereQuery  OR
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('chiefExaminers', '$currentUerId')) AND
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.valuationStaffs'),JSON_OBJECT('count', '$request->currentValuationCount')) $whereQuery ";
            $subjectDetails = $this->executeQueryForObject($query);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
     /**
     * get All Subjects For Exam Date Definition
     * @param Request $searchRequest
     * @return $response
     */
    public function getAllSubjectsDetailsByExamRegistrationId($searchRequest)
    {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try 
        {
            $response = new \stdClass;
            $subjects = [];
            $assignedSubjects = [];
            $examRegistrationId = $searchRequest->examRegistrationId;
            $examType = $searchRequest->examType;
            if($examType == "REVALUATION"){
                $subjects = $this->getAllSubjectDetailsByRevaluation($searchRequest);
            }
            else{
                $subjects = $this->getAllSubjectDetailsByExamRegistrationId($examRegistrationId);
            }
            foreach($subjects as $subject){
                $assignedSubjects[$subject->subjectCode]->academicPaperSubjectIds[] = $subject->academicPaperSubjectId;
                $assignedSubjects[$subject->subjectCode]->subjectCode = $subject->subjectCode;
                $assignedSubjects[$subject->subjectCode]->subjectName = $subject->subjectName;
                $assignedSubjects[$subject->subjectCode]->examRegistrationId = $subject->examRegistrationId;
                $assignedSubjects[$subject->subjectCode]->subjectTypeId = $subject->subjectTypeId;
                $assignedSubjects[$subject->subjectCode]->externalMaxMark = $subject->externalMaxMark;
                $assignedSubjects[$subject->subjectCode]->subjectCode = $subject->subjectCode;
            }
            $assignedSubjects = array_values($assignedSubjects);
            array_walk($assignedSubjects,function($subject,$key){
                $subject->academicPaperSubjectId = implode ( ",", $subject->academicPaperSubjectIds );
            });
            $response->subjects = $assignedSubjects;
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $response;
    }
     /**
     * get All Subject Details By Exam Registration ID
     * @param ExamRegistrationId $examRegistrationId
     * @return $subjectDetails
     */
    public function getAllSubjectDetailsByExamRegistrationId($examRegistrationId)
    {
        $examRegistrationId = $this->realEscapeString($examRegistrationId);
        $whereQuery = null;
        try 
        { 
            $query = "SELECT 
                        DISTINCT aps.id as id,
                        aps.id as academicPaperSubjectId,
                        s.code as subjectCode,
                        s.name as subjectName,
                        eers.am_assessment_id as assessmentId,
                        aa.properties_value ->>'$.assessmentDate' AS assessmentDate,
                        aa.properties_value ->>'$.startTime' AS assessmentStartTime,
                        aa.properties_value ->>'$.endTime' AS assessmentEndTime,
                        IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                        eerb.ec_exam_registration_id as examRegistrationId,
                        aps.properties ->> '$.subjectTypeId' as subjectTypeId,
                        aps.properties ->> '$.externalMaxMark' as externalMaxMark
                    FROM
                        ec_exam_registration_subject eers
                    INNER JOIN ec_exam_registration_batch eerb ON
                        eerb.id = eers.ec_exam_registration_batch_id
                    INNER JOIN  cm_academic_paper_subjects aps ON 
                        aps.id = eers.cm_academic_paper_subjects_id
                    INNER JOIN am_assessment aa ON
                        aa.id = eers.am_assessment_id
                    INNER JOIN  v4_ams_subject s ON 
                        s.id = aps.ams_subject_id
                    WHERE
                        eerb.ec_exam_registration_id='$examRegistrationId";
            $subjectDetails = $this->executeQueryForList($query.$whereQuery);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * get All Subject Details By Revaluation
     * @param searchRequest 
     * @return $subjectDetails
     */
    public function getAllSubjectDetailsByRevaluation($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try
        {
            $whereQuery = "";
            if(!empty($searchRequest->examRegistrationId)) {
                $whereQuery .= " AND eer.id IN ( '$searchRequest->examRegistrationId' )";
            }
            if(!empty($searchRequest->revaluationType)) {
                $whereQuery .= " AND esar.identifying_context->>'$.revaluationType' IN ( '$searchRequest->revaluationType' )";
            }
            if(!empty($searchRequest->studentId)) {
                $whereQuery .= " AND esar.student_id IN ( '$searchRequest->studentId' )";
            }
            if(!empty($searchRequest->academicPaperSubjectId)) {
                $academicPaperSubjectIdString = is_array($searchRequest->academicPaperSubjectId) ? "'" . implode("','",$searchRequest->academicPaperSubjectId) . "'" : "'".$searchRequest->academicPaperSubjectId."'";
                $whereQuery .= " AND caps.id IN ( $academicPaperSubjectIdString )";
            }
            if(!empty($searchRequest->academicPaperSubjectIds)) {
                $academicPaperSubjectIdsString = is_array($searchRequest->academicPaperSubjectIds) ? "'" . implode("','",$searchRequest->academicPaperSubjectIds) . "'" : "'".$searchRequest->academicPaperSubjectIds."'";
                $whereQuery .= " AND caps.id IN ( $academicPaperSubjectIdsString )";
            }
            if(!empty($searchRequest->assessmentId)) {
                $whereQuery .= " AND esar.am_assessment_id IN ( '$searchRequest->assessmentId' )";
            }
            $query = "SELECT
                DISTINCT caps.id as id,
                    caps.id as academicPaperSubjectId,
                    s.code as subjectCode,
                    s.name as subjectName,
                    IF(caps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                    caps.properties ->> '$.classType' AS classType,
                    eerb.ec_exam_registration_id as examRegistrationId,
                    caps.properties ->> '$.subjectTypeId' as subjectTypeId,
                    caps.properties ->> '$.externalMaxMark' as externalMaxMark,
                    caps.properties ->> '$.externalMaxMark' as maximumSubjectMark,
                    eer.name as examRegistrationName,
                    eer.type as examRegistrationType
            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 
            INNER JOIN cm_academic_paper_subjects caps ON
                caps.id = eers2.cm_academic_paper_subjects_id AND eers2.am_assessment_id = esar.am_assessment_id 
            INNER JOIN v4_ams_subject s ON
                s.id = caps.ams_subject_id
            INNER JOIN `groups` g ON
                g.id = eerb.groups_id
                AND g.`type` = 'BATCH'
            WHERE eer.type = 'REVALUATION' AND esar.properties ->>'$.feeStatus' = 'PAID' AND esar.properties ->>'$.registrationStatus' = 'REGISTERED' AND eer.trashed IS NULL ";
            $subjectDetails = $this->executeQueryForList($query.$whereQuery);
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
     /**
     * get current Subject Details By Exam Registration ID
     * @param ExamRegistrationId $examRegistrationId
     * @return $subjectDetails
     */
    public function getCurrentSubjectDetailsByExamRegistrationIdAndPaperSubjectId($request)
    {
        $request = $this->realEscapeObject($request);
        $request->academicPaperSubjectId = is_array($request->academicPaperSubjectId) ? "'" . implode("','",$request->academicPaperSubjectId) . "'" : "'".$request->academicPaperSubjectId."'";
        $whereQuery = null;
        try 
        { 
            $query = "SELECT 
                        DISTINCT aps.id as id,
                        aps.id as academicPaperSubjectId,
                        s.code as subjectCode,
                        s.name as subjectName,
                        eer.name as examRegistrationName,
                        eer.type as examRegistrationType,
                        IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                        aps.properties ->> '$.classType' AS classType,
                        eerb.ec_exam_registration_id as examRegistrationId,
                        aps.properties ->> '$.subjectTypeId' as subjectTypeId,
                        aps.properties ->> '$.externalMaxMark' as externalMaxMark,
                        ct.course_Type as courseType
                    FROM
                        ec_exam_registration_subject eers
                    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
                    INNER JOIN  cm_academic_paper_subjects aps ON 
                        aps.id = eers.cm_academic_paper_subjects_id
                    INNER JOIN  v4_ams_subject s ON 
                        s.id = aps.ams_subject_id
                    INNER JOIN `groups` g ON
                        g.id = eerb.groups_id
                    INNER JOIN program p 
                        ON p.id  = g.properties->>'$.programId'
                    INNER JOIN `course_type` ct ON
                        ct.courseTypeID = p.course_type_id
                    WHERE
                        eerb.ec_exam_registration_id='$request->examRegistrationId' AND
                        eers.cm_academic_paper_subjects_id IN ( $request->academicPaperSubjectId )";
            $subjectDetails = $this->executeQueryForObject($query.$whereQuery);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
     /**
     * get Subject Details 
     * @param  $request
     * @return $subjectDetails
     */
    public function searchExamRegistrationSubjects($searchRequest)
    {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try
        {
            $whereQuery = null;
            if(!empty($searchRequest->examRegistrationBatchId)) {
                $whereQuery = "AND eers.ec_exam_registration_batch_id = '$searchRequest->examRegistrationBatchId'";
            }
            if(!empty($searchRequest->examRegistrationIds)) {
                $examRegistrationString= "'" . implode("', '", $searchRequest->examRegistrationIds) . "'" ;
                $whereQuery = "AND eers.ec_exam_registration_id  IN ($examRegistrationString)";
            }
            if(!empty($searchRequest->examRegistrationBatchIds)) {
                $examRegistrationBatchString= "'" . implode("', '", $searchRequest->examRegistrationBatchIds) . "'" ;
                $whereQuery = "AND eers.ec_exam_registration_batch_id  IN ($examRegistrationBatchString)";
            }
            if(!empty($searchRequest->academicTermId)) {
                $academicTermIdString = is_array($searchRequest->academicTermId) ? "'" . implode("','",$searchRequest->academicTermId) . "'" : "'".$searchRequest->academicTermId."'";
                $whereQuery .= " AND eerb.academicTermId  IN ($academicTermIdString)";
            }
            if(!empty($searchRequest->examDate)) {
                $whereQuery .= " AND aa.properties_value->>'$.assessmentDate'='$searchRequest->examDate";
            }
            $query = "SELECT
                        DISTINCT (aps.id) as id,
                        s.code as code,
                        s.name as name,
                        CONCAT( s.code,'-',s.name) AS subejctDisplayName,
                        IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                        s.id as subjectId,
                        aa.properties_value->>'$.assessmentDate' as examDate
                    FROM
                        ec_exam_registration_subject eers
                    INNER JOIN ec_exam_registration_batch eerb ON
                            eerb.id = eers.ec_exam_registration_batch_id
                    INNER JOIN  cm_academic_paper_subjects aps ON 
                            eers.cm_academic_paper_subjects_id = aps.id
                    INNER JOIN  v4_ams_subject s ON 
                            aps.ams_subject_id = s.id
                    INNER JOIN  cm_academic_paper ap ON 
                            aps.cm_academic_paper_id = ap.id
                    INNER JOIN am_assessment aa ON
                            aa.id = eers.am_assessment_id
                    WHERE
                        eerb.ec_exam_registration_id='$searchRequest->examRegistrationId'" .$whereQuery. " ORDER BY s.code ASC ";
            $subjects = $this->executeQueryForList($query);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjects;
    }
    /**
     * get All Exam Registration Subject Details
     * @param  $searchRequest
     * @return $subjects
     */
    public function getAllExamRegistrationSubjectDetails($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $whereQuery = null;
            $orderBy = " ORDER BY eers.created_date ASC ";
            if(!empty($searchRequest->examRegistrationId)) {
                $examRegIdStr =  is_array($searchRequest->examRegistrationId) ? "'" . implode("','",$searchRequest->examRegistrationId) . "'" : "'".$searchRequest->examRegistrationId."'";
                $whereQuery .= " AND eerb.ec_exam_registration_id IN ($examRegIdStr)";
            }
            $query = "SELECT
                        DISTINCT eers.id,
                        eers.am_assessment_id,
                        eerb.groups_id,
                        eerb.ec_exam_registration_id,
                        eers.ec_exam_registration_batch_id,
                        eers.cm_academic_paper_subjects_id,
                        s.code as code,
                        s.name as name,
                        IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                        eers.revaluation_properties ,
                        eers.valuation_details ,
                        eers.fees_properties ,
                        eers.properties
                    FROM
                        ec_exam_registration_subject eers
                    INNER JOIN ec_exam_registration_batch eerb ON
                        eerb.id = eers.ec_exam_registration_batch_id
                    INNER JOIN  cm_academic_paper_subjects aps ON 
                        eers.cm_academic_paper_subjects_id = aps.id
                    INNER JOIN  v4_ams_subject s ON 
                            aps.ams_subject_id = s.id
                    INNER JOIN  cm_academic_paper ap ON 
                            aps.cm_academic_paper_id = ap.id
                    WHERE 1=1 ";
            $subjects = $this->executeQueryForList($query.$whereQuery.$orderBy, $this->mapper[ExamRegistrationSubjectServiceMapper::SEARCH_EXAM_REG_SUBJECT_DETAILS] );
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjects;
    }
     /**
     * get All Revaluation Type Details
     * @param  $searchRequest
     * @return $revaluationTypes
     */
    public function getAllRevaluationTypeDetails($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $revaluationTypes = [];
            $request = new \stdClass;
            $request->examRegistrationId = $searchRequest->examRegistrationId;
            $assignedSubjects = $this->getAllExamRegistrationSubjectDetails($request);
            foreach($assignedSubjects as $subjects){
                if(!empty($subjects->revaluationProperties)){
                    foreach($subjects->revaluationProperties as $revaluation){
                        $revaluationTypes[$revaluation->name]->id = $revaluation->name;
                        $revaluationTypes[$revaluation->name]->name = $revaluation->name;
                        $revaluationTypes[$revaluation->name]->order = $revaluation->order;
                        $revaluationTypes[$revaluation->name]->markEntryNeeded = $revaluation->markEntryNeeded;
                        $revaluationTypes[$revaluation->name]->markEntryType = $revaluation->markEntryType;
                    }
                }
            }
            $revaluationTypes = array_values($revaluationTypes); 
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $revaluationTypes;
    }
    /**
     * get All Revaluation Type Details
     * @param  $searchRequest
     * @return $revaluationTypes
     */
    public function getAllValuationDateDetails($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $subjectWithDateDetails = [];
            $request = new \stdClass;
            $request->examRegistrationId = $searchRequest->examRegistrationId;
            $request->revaluationType = $searchRequest->revaluationType;
            $assignedSubjects = $this->getAllExamRegistrationSubjectDetails($request);
            foreach($assignedSubjects as $subjects){
                if(!empty($subjects->revaluationProperties)){
                    foreach($subjects->revaluationProperties as $revaluation){
                        if($revaluation->name == $request->revaluationType){
                            $subjectWithDateDetails[$subjects->paperSubjectId]->id = $subjects->id;
                            $subjectWithDateDetails[$subjects->paperSubjectId]->examRegistrationSubjectId = $subjects->id;
                            $subjectWithDateDetails[$subjects->paperSubjectId]->paperSubjectId = $subjects->paperSubjectId;
                            $subjectWithDateDetails[$subjects->paperSubjectId]->name = $subjects->subjectName;
                            $subjectWithDateDetails[$subjects->paperSubjectId]->code = $subjects->subjectCode;
                            $subjectWithDateDetails[$subjects->paperSubjectId]->valuationDetails = $subjects->valuationDetails;
                            $subjectWithDateDetails[$subjects->paperSubjectId]->isSelected = false;
                            $subjectWithDateDetails[$subjects->paperSubjectId]->startDate = null;
                            $subjectWithDateDetails[$subjects->paperSubjectId]->endDate = null;
                            if(! empty($subjects->valuationDetails)){
                                foreach($subjects->valuationDetails->valuationDates as $valuatonDate){
                                    if($valuatonDate->count == $searchRequest->valuationCount && $valuatonDate->revaluationType == $searchRequest->revaluationType){
                                        $subjectWithDateDetails[$subjects->paperSubjectId]->startDate = $valuatonDate->startDate;
                                        $subjectWithDateDetails[$subjects->paperSubjectId]->endDate = $valuatonDate->endDate;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            $subjectWithDateDetails = array_values($subjectWithDateDetails); 
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectWithDateDetails;
    }
     /**
     * update Valuation Dates To Exam Reg Subjects
     * @param  $searchRequest
     */
    public function updateValuationDatesToExamRegSubjects($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $examRegSubjects = $searchRequest->examRegSubjects;
            foreach( $examRegSubjects as $examRegSub){
                if(empty($examRegSub->examRegistrationSubjectId)){
                    throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS_EXAM_REGISTRATION_FEE,"Exam Registration Subject is invalid!");
                }
                else{
                    $updatedBy = $GLOBALS['userId'];
                    $examRegSub->valuationDetails->listStaffs = [];
                    if(!empty($examRegSub->valuationDetails->valuationStaffs)){
                        foreach($examRegistrationSubject->valuationDetails->valuationStaffs as $valuationStaff){
                            $valuationStaff->listStaffs = [];
                        }
                    }
                    $valuationDetails = json_encode($examRegSub->valuationDetails);
                    $query = "UPDATE  ec_exam_registration_subject
                        SET 
                            valuation_details = '$valuationDetails',
                            updated_by = '$updatedBy'
                        WHERE
                            id = '$examRegSub->examRegistrationSubjectId'";
                    $this->executeQuery($query);
                }
                $this->executeQuery($query);
            }
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
    }
    
      /**
     * update RevaluationDetails To ExamRegistration Subjects
     * @param $examRegistrationSubjects
     * @return Array 
     */
    public function updateRevaluationDetailsToExamRegistrationSubjects(Array $examRegistrationSubjects) {
        $examRegistrationSubjects = $this->realEscapeArray($examRegistrationSubjects);        
        foreach ($examRegistrationSubjects as $examRegistrationSubject) {
            $examRegistrationSubject->createdBy = $GLOBALS['userId'] ?? $examRegistrationSubject->createdBy;
            $examRegistrationSubject->updatedBy = $GLOBALS['userId'] ?? $examRegistrationSubject->updatedBy;
            $revaluationProperties = !empty($examRegistrationSubject->revaluationProperties) ? "'".json_encode($examRegistrationSubject->revaluationProperties)."'" : "NULL";
            if($examRegistrationSubject->id){
                try {
                    $query = "UPDATE  ec_exam_registration_subject
                                SET 
                                    revaluation_properties = $revaluationProperties,
                                    updated_by = '$examRegistrationSubject->updatedBy'
                                WHERE
                                    id = '$examRegistrationSubject->id'";
                
                    $this->executeQuery($query);
                } catch (\Exception $e) {
                    if($e->getCode() !== ExamControllerException::EMPTY_PARAMETERS_EXAM_REGISTRATION_FEE) {
                        throw new ExamControllerException($e->getCode(),"Failed to Assign Exam Registration Subject fee! Please try again");
                    } else if ($e->getCode() === ExamControllerException::DUPLICATE_ENTRY) {
                        throw new ExamControllerException (ExamControllerException::DUPLICATE_ENTRY_EXAM_REGISTRATION,"Cannot Assign Exam Registration Subject fees.This Fees is already assigned!");
                    } else {
                        throw new ExamControllerException ($e->getCode(),$e->getMessage());
                    }
                }
            }
        }
        return $examRegistrationSubjects;
    }
     /**
     * get All Assessment Details
     * @param  $searchRequest
     * @return $assessments
     */
    public function getAllAssessmentDetails($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $whereQuery = null;
            $orderBy = " ORDER BY s.code ASC ";
            $whereQuery = "";
            if(!empty($searchRequest->courseTypeId)) {
                $courseTypeIdString = is_array($searchRequest->courseTypeId) ? "'" . implode("','",$searchRequest->courseTypeId) . "'" : "'".$searchRequest->courseTypeId."'";
                $whereQuery .= " AND p.course_type_id IN ( $courseTypeIdString )";
            }
            if(!empty($searchRequest->examType)) {
                $examTypeString = is_array($searchRequest->examType) ? "'" . implode("','",$searchRequest->examType) . "'" : "'".$searchRequest->examType."'";
                $whereQuery .= " AND eer.type IN ( $examTypeString )";
            }
            if(!empty($searchRequest->examRegistrationId)) {
                $examRegistrationIdString = is_array($searchRequest->examRegistrationId) ? "'" . implode("','",$searchRequest->examRegistrationId) . "'" : "'".$searchRequest->examRegistrationId."'";
                $whereQuery .= " AND eer.id IN ( $examRegistrationIdString )";
            }
            if(!empty($searchRequest->examDate)) {
                $examDateString = is_array($searchRequest->examDate) ? "'" . implode("','",$searchRequest->examDate) . "'" : "'".$searchRequest->examDate."'";
                $whereQuery .= " AND aa.properties_value ->>'$.assessmentDate' IN ( $examDateString )";
            }
            if(!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','",$searchRequest->groupId) . "'" : "'".$searchRequest->groupId."'";
                $whereQuery .= " AND g.id IN ( $groupIdString )";
            }
            if(!empty($searchRequest->academicPaperSubjectId)) {
                $academicPaperSubjectIdString = is_array($searchRequest->academicPaperSubjectId) ? "'" . implode("','",$searchRequest->academicPaperSubjectId) . "'" : "'".$searchRequest->academicPaperSubjectId."'";
                $whereQuery .= " AND aps.id IN ( $academicPaperSubjectIdString )";
            }
            $query = "SELECT
                        DISTINCT eers.am_assessment_id as id,
                        eers.am_assessment_id as assessmentId,
                        aps.id as academicPaperSubjectId,
                        g.id as groupId,
                        g.name as groupName,
                        eer.id as examRegistrationId,
                        eer.name as examRegistrationName,
                        s.code as subjectCode,
                        s.name as subjectName,
                        IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                        aps.properties ->> '$.syllabusName' AS syllabusName,
                        aa.properties_value ->>'$.assessmentDate' AS assessmentDate,
                        aa.properties_value ->>'$.startTime' AS assessmentStartTime,
                        aa.properties_value ->>'$.endTime' AS assessmentEndTime,
                        act.id as academicTermId,
                        act.name as academicTermName,
                        dept.deptID,
                        dept.deptName,
                        deg.id as degreeId,
                        deg.name as degreeName,
                        eqc.qpCode  
                    FROM
                        `groups` g
                    INNER JOIN ec_exam_registration_batch eerb ON
                        eerb.groups_id = g.id
                    INNER JOIN ec_exam_registration eer ON
                        eer.id = eerb.ec_exam_registration_id
                    INNER JOIN ec_exam_registration_subject eers ON
                        eers.ec_exam_registration_batch_id = eerb.id
                    INNER JOIN  cm_academic_paper_subjects aps ON 
                        eers.cm_academic_paper_subjects_id = aps.id
                    INNER JOIN am_assessment aa ON
                        aa.id = eers.am_assessment_id
                    INNER JOIN  v4_ams_subject s ON 
                        aps.ams_subject_id = s.id
                    INNER JOIN department dept ON
                        dept.deptID = g.properties ->> '$.departmentId'
                    INNER JOIN  academic_term act ON 
                        act.id = CAST(eerb.properties ->> '$.academicTermId'AS CHAR)
                    INNER JOIN program p ON
                        p.id = g.properties ->> '$.programId'
                    INNER JOIN degree deg ON
                        deg.id = p.degree_id
                    LEFT JOIN examQpCodes eqc ON
                        eqc.cm_academic_paper_subjects_id = aps.id AND eqc.ec_exam_registration_id = eer.id
                    WHERE 1=1 ";
            $assessments = $this->executeQueryForList($query.$whereQuery.$orderBy, $this->mapper[ExamRegistrationSubjectServiceMapper::SEARCH_ASSESSMENT_DETAILS] );
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $assessments;
    }
    
    /**
     * get All Distinct Subjects From Examregistration
     * @param Request $searchRequest
     * @return $response
     */
    public function getAllDistinctSubjectsByExamRegistration($searchRequest)
    {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try 
        {
            $uniqueSubjects = [];
            $assignedSubjects = $this->searchExamRegistrationSubjects($searchRequest);
            foreach($assignedSubjects as $subject){
                $uniqueSubjects[$subject->code]->id = $subject->id;
                $uniqueSubjects[$subject->code]->code = $subject->code;
                $uniqueSubjects[$subject->code]->subjectName = $subject->subjectName;
                $uniqueSubjects[$subject->code]->subejctDisplayName = $subject->subejctDisplayName;
                $uniqueSubjects[$subject->code]->isTheory = $subject->isTheory;
                $uniqueSubjects[$subject->code]->paperSubjectId[$subject->id] = $subject->id;
                $uniqueSubjects[$subject->code]->subjectId = $subject->subjectId;
                $uniqueSubjects[$subject->code]->examDate = $subject->examDate;
            }
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return array_values($uniqueSubjects);
    }
    /**
     * get All Distinct Subjects From batches
     * @param Request $searchRequest
     * @return $response
     */
    public function getAssignedDistinctSubjectByBatch($searchRequest)
    {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try 
        {
            $uniqueSubjects = [];
            $assignedSubjects = ExamRegistrationBatchService::getInstance()->getAssignedSubjectByBatchOrExamReg($searchRequest);
            foreach($assignedSubjects as $subject){
                $uniqueSubjects[$subject->code]->id = $subject->id;
                $uniqueSubjects[$subject->code]->code = $subject->code;
                $uniqueSubjects[$subject->code]->name = $subject->name;
                $uniqueSubjects[$subject->code]->isTheory = $subject->isTheory;
                $uniqueSubjects[$subject->code]->groupId = $subject->groupId;
                $uniqueSubjects[$subject->code]->groupName = $subject->groupName;
                $uniqueSubjects[$subject->code]->fm_head_id = $subject->fm_head_id;
                $uniqueSubjects[$subject->code]->subjectId = $subject->subjectId;
                $uniqueSubjects[$subject->code]->paperSubjectId[$subject->academicPaperSubjectId] = $subject->academicPaperSubjectId;
                $uniqueSubjects[$subject->code]->assessmentId[$subject->assessmentId] = $subject->assessmentId;
            }
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        foreach($uniqueSubjects as $subject){
            $subject->paperSubjectId = array_values($subject->paperSubjectId);
        }
        return array_values($uniqueSubjects);
    }
     /**
     * get All Subject Details By Exam Revaluation ID
     * @param ExamRegistrationId $examRegistrationId
     * @return $subjectDetails
     */
    public function getAllCurretStaffSubjectsValuationDetailsByExamRevaluationId($request){
        $request = $this->realEscapeObject($request);
        $query = "";
        $currentUerId = $GLOBALS['userId'];
        $whereQuery = null;
        if(!empty($request->examRegistrationId)){
            $whereQuery .= " AND eer.id = '$request->examRegistrationId";
        }
        try { 
            $query = "SELECT
                    eers.am_assessment_id as id,
                    eers.am_assessment_id as assessmentId,
                    eers.valuation_details as valuationDetails
                FROM ec_exam_registration_batch eerb
                INNER JOIN ec_exam_registration eer ON
                    eer.id = eerb.ec_exam_registration_id AND 
                    eer.trashed IS NULL
                INNER JOIN ec_exam_registration eerp ON
                    eerp.id = eer.properties->>'$.parentExamRegistrationId' AND 
                    eerp.trashed IS NULL
                INNER JOIN ec_exam_registration_batch eerbParent ON
                    eerbParent.ec_exam_registration_id = eerp.id  AND 
                    eerbParent.groups_id = eerb.groups_id
                INNER JOIN ec_exam_registration_subject eers ON     
                    eers.ec_exam_registration_batch_id = eerbParent.id 
                WHERE
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.reValuationStaffs'),JSON_OBJECT('addiitonalExamniners', '$currentUerId')) $whereQuery OR
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.reValuationStaffs'),JSON_OBJECT('chiefExaminers', '$currentUerId')) $whereQuery";
            $subjectDetails = $this->executeQueryForList($query);
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * get All Subject Details By Revaluation
     * @param request $request
     * @return $subjectDetails
     */
    public function getSubjectForCurrentStaffsRevaluation($request){
        $request = $this->realEscapeObject($request);
        $whereQuery = null;
        if(!empty($request->academicPaperSubjectIds)) {
            $academicPaperSubjectIdsString = is_array($request->academicPaperSubjectIds) ? "'" . implode("','",$request->academicPaperSubjectIds) . "'" : "'".$request->academicPaperSubjectIds."'";
            $whereQuery .= " AND aps.id IN ( $academicPaperSubjectIdsString )";
        }
        $query = "";
        $currentUerId = $GLOBALS['userId'];
        try 
        { 
            $query = "SELECT
                    DISTINCT(aps.id) as id,
                    aps.id as academicPaperSubjectId,
                    s.id as subjectId,
                    s.code as subjectCode,
                    s.name as subjectName,
                    oe.id as onlineExamId,
                    eers.am_assessment_id as assessmentId,
                    oe.settings ->> '$.isValidated' AS isValidated,
                    aps.properties ->> '$.syllabusName' AS syllabusName,
                    IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                    aps.properties ->> '$.externalMaxMark' as externalMaxMark,
                    eers.valuation_details as valuationDetails,
                    eerb.ec_exam_registration_id as examRegistrationId,
                    eerb.properties ->> '$.valuationRule' as valuationRule,
                    eqc.qpCode
                FROM ec_exam_registration_batch eerb
                INNER JOIN ec_exam_registration eer ON
                    eer.id = eerb.ec_exam_registration_id AND 
                    eer.trashed IS NULL
                INNER JOIN ec_exam_registration eerp ON
                    eerp.id = eer.properties->>'$.parentExamRegistrationId' AND 
                    eerp.trashed IS NULL
                INNER JOIN ec_exam_registration_batch eerbParent ON
                    eerbParent.ec_exam_registration_id = eerp.id  AND 
                    eerbParent.groups_id = eerb.groups_id
                INNER JOIN ec_exam_registration_subject eers ON     
                    eers.ec_exam_registration_batch_id = eerbParent.id 
                INNER JOIN  cm_academic_paper_subjects aps ON 
                    aps.id = eers.cm_academic_paper_subjects_id
                INNER JOIN am_assessment aa ON
                    aa.id = eers.am_assessment_id
                INNER JOIN oe_exams oe ON
                    oe.assessment_id = eers.am_assessment_id AND oe.is_deleted = 0
                INNER JOIN  v4_ams_subject s ON 
                    s.id = aps.ams_subject_id
                LEFT JOIN examQpCodes eqc ON
                    eqc.cm_academic_paper_subjects_id =  eers.cm_academic_paper_subjects_id AND eqc.ec_exam_registration_id = eerb.ec_exam_registration_id
                WHERE
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.reValuationStaffs'),JSON_OBJECT('addiitonalExamniners', '$currentUerId')) AND 
                    eer.id='$request->examRegistrationId'  AND 
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.reValuationStaffs'),JSON_OBJECT('count', '$request->currentValuationCount')) AND
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.reValuationStaffs'),JSON_OBJECT('revaluationType', '$request->currentRevaluationType')) ";
            $subjects = $this->executeQueryForList($query.$whereQuery);
            foreach($subjects as $subject){
                $subject->valuationDetailsCopy = json_decode($subject->valuationDetails);
                $subject->reValuationStaffs = $subject->valuationDetailsCopy->reValuationStaffs;
                $subject->currentValuationObj = reset(array_filter($subject->reValuationStaffs ,function($value)use($request){
                    return $value->count == $request->currentValuationCount;
                }));
                if((in_array( $currentUerId,$subject->currentValuationObj->addiitonalExamniners))|| (in_array( $currentUerId,$subject->currentValuationObj->chiefExaminers))){
                    $subjectDetails[$subject->id]->id = $subject->id;
                    $subjectDetails[$subject->id]->subjectId = $subject->subjectId;
                    $subjectDetails[$subject->id]->academicPaperSubjectId = $subject->academicPaperSubjectId;
                    $subjectDetails[$subject->id]->subjectCode = $subject->subjectCode;
                    $subjectDetails[$subject->id]->subjectName = $subject->subjectName;
                    $subjectDetails[$subject->id]->assessmentId = $subject->assessmentId;
                    $subjectDetails[$subject->id]->isTheory = $subject->isTheory;
                    $subjectDetails[$subject->id]->externalMaxMark = $subject->externalMaxMark;
                    $subjectDetails[$subject->id]->valuationDetails = $subject->valuationDetails;
                    $subjectDetails[$subject->id]->examRegistrationId = $subject->examRegistrationId;
                    $subjectDetails[$subject->id]->qpCode = $subject->qpCode;
                    $subjectDetails[$subject->id]->onlineExamId = $subject->onlineExamId;
                    $subjectDetails[$subject->id]->isValidatedDetails[] = $subject->isValidated;
                    $subjectDetails[$subject->id]->isValidated = $subject->isValidated;
                    $subjectDetails[$subject->id]->valuationRule = $subject->valuationRule;
                }
            }
            $subjectDetails = array_values($subjectDetails);
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * get Subject Details By current Staff Revaluation
     * @param  $request
     * @return $subjectDetails
     */
    public function getcurrentExamSubjectForCurrentStaffRevaluation($request)
    {
        $request = $this->realEscapeObject($request);
        $query = "";
        $currentUserId = $GLOBALS['userId'];
        $whereQuery = null;
        if(!empty($request->paperSubjectId))
        {
            $whereQuery .= " AND eers.cm_academic_paper_subjects_id = '$request->paperSubjectId";
        }
        if(!empty($request->examRegistrationBatchId))
        {
            $whereQuery .= " AND eers.ec_exam_registration_batch_id = '$request->examRegistrationBatchId";
        }
        if(!empty($request->examRegistrationId))
        {
            $whereQuery .= " AND eer.id = '$request->examRegistrationId";
        }
        try 
        { 
            $query = "SELECT DISTINCT
                    eers.am_assessment_id as id,
                    aps.id as academicPaperSubjectId,
                    eers.am_assessment_id as assessmentId,
                    g.id as groupId,
                    g.name as groupName,
                    eer.name as examRegistrationName,
                    eer.type as examRegistrationType,
                    s.code as subjectCode,
                    s.name as subjectName,
                    aps.properties ->> '$.syllabusName' AS syllabusName,
                    IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                    aps.properties ->> '$.subjectTypeId' as subjectTypeId,
                    aps.properties ->> '$.externalMaxMark' as externalMaxMark,
                    eers.valuation_details as valuationDetails,
                    aa.properties_value as assessmentProperties,
                    oe.id as onlineExamId
                FROM ec_exam_registration_batch eerb
                INNER JOIN ec_exam_registration eer ON
                    eer.id = eerb.ec_exam_registration_id AND 
                    eer.trashed IS NULL
                INNER JOIN ec_exam_registration eerp ON
                    eerp.id = eer.properties->>'$.parentExamRegistrationId' AND 
                    eerp.trashed IS NULL
                INNER JOIN ec_exam_registration_batch eerbParent ON
                    eerbParent.ec_exam_registration_id = eerp.id  AND 
                    eerbParent.groups_id = eerb.groups_id
                INNER JOIN ec_exam_registration_subject eers ON     
                    eers.ec_exam_registration_batch_id = eerbParent.id 
                INNER JOIN `groups` g ON
                    g.id = eerbParent.groups_id
                INNER JOIN  cm_academic_paper_subjects aps ON 
                    aps.id = eers.cm_academic_paper_subjects_id
                INNER JOIN  v4_ams_subject s ON 
                    s.id = aps.ams_subject_id
                INNER JOIN am_assessment aa ON
                    aa.id = eers.am_assessment_id
                INNER JOIN oe_exams oe ON
                    oe.assessment_id = aa.id AND oe.is_deleted = 0
                WHERE
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.reValuationStaffs'),JSON_OBJECT('addiitonalExamniners', '$currentUserId')) AND 
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.reValuationStaffs'),JSON_OBJECT('count', '$request->currentValuationCount')) AND
                    JSON_CONTAINS(JSON_EXTRACT(eers.valuation_details ,'$.reValuationStaffs'),JSON_OBJECT('revaluationType', '$request->currentRevaluationType')) ";
            $subjectDetails = $this->executeQueryForObject($query,$whereQuery);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
     /**
     * check Assessment is present 
     * @param  $request
     * @return $assessmentId
     */
    public function checkAssessmentPresent($request){
        $request = $this->realEscapeObject($request);
        try { 
            $query = "SELECT id
                FROM am_assessment 
                WHERE
                    identifying_context->>'$.groupId' = '$request->groupId' AND identifying_context->>'$.academicPaperSubjectId' = '$request->academicPaperSubjectId' AND am_instance_id = '$request->instanceId' AND is_active=1";
            $assessmentId = $this->executeQueryForObject($query)->id;
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $assessmentId;
    }
     /**
     * check assessment Already assigned exam registration subject
     * @param  $assessmentId
     * @return $examRegistrationSubjectId
     */
    public function checkIfAssessmentAlreadyAssigned($assessmentId){
        $assessmentId = $this->realEscapeString($assessmentId);
        try { 
            $query = "SELECT id
                FROM ec_exam_registration_subject 
                WHERE
                    am_assessment_id = '$assessmentId";
            $examRegistrationSubjectId = $this->executeQueryForObject($query)->id;
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $examRegistrationSubjectId ? true : false;
    }
   /**
     * Get batch assigned subject groups
     * @param  $request
     * @return $subjectGroups
     */
    public function getBatchAssignedSubjectGroupsByRequest($request){
        $request = $this->realEscapeObject($request);
        $whereQuery = "";
        if( $request->groupId ){
            $whereQuery .= " AND eerb.groups_id  = '$request->groupId'";
        }
        if( $request->examRegistrationId ){
            $whereQuery .= " AND eer.id  = '$request->examRegistrationId'";
        }
        try { 
            $query = "SELECT 
                        sg.name AS subjectGroupName, 
                        sg.id AS subjectGroupId, 
                        eers.cm_academic_paper_subjects_id  as paperSubjectId
                    FROM 
                        ec_exam_registration_batch eerb 
                    INNER JOIN  ec_exam_registration_subject eers ON 
                        eers.ec_exam_registration_batch_id = eerb.id 
                    INNER JOIN ec_exam_registration eer ON 
                        eer.id = eerb.ec_exam_registration_id  
                    INNER JOIN ec_subject_group_paper_subject_mapping esgpsm ON 
                        esgpsm.cm_academic_paper_subjects_id = eers.cm_academic_paper_subjects_id 
                        AND esgpsm.groups_id = eerb.groups_id  
                    INNER JOIN subjectGroups sg ON 
                        sg.id = esgpsm.subject_groups_id 
                    WHERE 
                        eer.trashed IS NULL";
            $subjectGroups = $this->executeQueryForList($query.$whereQuery, $this->mapper[ExamRegistrationSubjectServiceMapper::SEARCH_BATCH_SUBJECT_GROUPS]);
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectGroups;
    }
     /**
     * update institutional average To Exam Reg Subjects
     * @param  $subjectList
     */
    public function updateInstitutionalAverageToExamRegSubjects($subjectList){
        $subjectList = $this->realEscapeObject($subjectList);
        try{
            $updatedBy = $GLOBALS['userId'];
            foreach( $subjectList as $subject){
                foreach( $subject->assessments as $assessmentId){
                    $query = "UPDATE  ec_exam_registration_subject
                        SET 
                            properties = JSON_SET(COALESCE(`properties`,'{}'), '$.institutionalAverage','$subject->institutionalAvg'),
                            updated_by = '$updatedBy'
                        WHERE
                        am_assessment_id = '$assessmentId'";
                    $this->executeQuery($query);
                }
            }
            $this->logger->info(Events::EC_UPDATE_EXAM_REGISTRATION_SUBJECT_PROPERTIES,[
                "staff" => new Staff(["id" => $updatedBy]),
                "request" => $subjectList,
                "status" => StatusConstants::SUCCESS
            ]);
        }
        catch (\Exception $e){
            $this->logger->error(Events::EC_UPDATE_EXAM_REGISTRATION_SUBJECT_PROPERTIES, [
                "staff" => new Staff(["id" => $updatedBy]),
                "request" => $subjectList,
                "errorCode" => $e->getCode(),
                "errorMessage" => $e->getMessage(),
                "status" => StatusConstants::FAILED
            ]);
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
    }
        /**
     * Get Exam Registration Assessment Examiner 
     * @param @request
     * @return Subjects
     */
    public function getAssessmentExaminerWithPacket($request){
        $request = $this->realEscapeObject($request);
        $whereQuery = "";
        $limitQuery = "";
        $resultData = [];
        $joinQuery = "";
        $request->assessmentId = is_array($request->assessmentId) ? $request->assessmentId : stripslashes($request->assessmentId);
        if(!empty($request->assessmentId)) {
            $assessmentIdString = is_array($request->assessmentId) ? "'" . implode("','",$request->assessmentId) . "'" : "'".$request->assessmentId."'";
            $whereQuery .= " AND eers.am_assessment_id IN ( $assessmentIdString )";
        }
        if(!empty($request->groupId)) {
            $whereQuery .= " AND g.id = '$request->groupId'";
        }
        if(!empty($request->courseTypeId)) {
            $whereQuery .= " AND p.course_type_id = '$request->courseTypeId'";
        }
        if(!empty($request->academicTermId)) {
            $whereQuery .= " AND CAST(eerb.properties ->> '$.academicTermId'AS CHAR) = '$request->academicTermId'";
        }
        if(!empty($request->examRegistrationId)) {
            $whereQuery .= " AND eerb.ec_exam_registration_id = '$request->examRegistrationId'";
        }
        if($request->examType == ExamRegistrationTypeConstants::REVALUATION){
            $joinQuery .= " INNER JOIN ec_exam_registration eer ON
                            eer.id = eerb.ec_exam_registration_id AND 
                            eer.trashed IS NULL
                        INNER JOIN ec_exam_registration eerp ON
                            eerp.id = eer.properties->>'$.parentExamRegistrationId' AND 
                            eerp.trashed IS NULL
                        INNER JOIN ec_exam_registration_batch eerbParent ON
                            eerbParent.ec_exam_registration_id = eerp.id  AND 
                            eerbParent.groups_id = eerb.groups_id
                        INNER JOIN ec_exam_registration_subject eers ON     
                            eers.ec_exam_registration_batch_id = eerbParent.id ";
        }
        else{
            $joinQuery .= " INNER JOIN ec_exam_registration eer ON
                            eer.id = eerb.ec_exam_registration_id AND 
                            eer.trashed IS NULL
                        INNER JOIN ec_exam_registration_subject eers ON     
                            eers.ec_exam_registration_batch_id = eerb.id ";
        }
       
        $query = "SELECT
            eers.id,
            eers.am_assessment_id,
            eerb.groups_id,
            eerb.ec_exam_registration_id,
            eers.ec_exam_registration_batch_id,
            eers.cm_academic_paper_subjects_id,
            oe.id AS onlineExamId,
            IF(
                eers.valuation_details IS NULL ,
                JSON_SET(JSON_OBJECT(), '$.staffIds', '', '$.departmentIds', '','$.valuationDates', ''),
                eers.valuation_details
            ) AS valuation_details,
            aa.name AS assessmentName,
            g.name AS groupName,
            s.name AS subjectName,
            s.code AS subjectCode,
            aa.properties_value ->>'$.assessmentDate' AS assessmentDate,
            caps.properties ->> '$.syllabusName' AS syllabusName,
            caps.properties->>'$.subjectPriority' AS subjectPriority,
            g.properties->>'$.description' AS groupDescription,
            act.id as academicTermId,
            act.name as academicTermName,
            cclo.name as subjectSlot
        FROM
            ec_exam_registration_batch eerb
        $joinQuery
        INNER JOIN  academic_term act ON 
            act.id = CAST(eerb.properties ->> '$.academicTermId'AS CHAR)
        INNER JOIN `groups` g ON
            g.id = eerb.groups_id
        INNER JOIN program p 
            ON p.id  = g.properties->>'$.programId'
        INNER JOIN am_assessment aa ON
            aa.id = eers.am_assessment_id
        INNER JOIN oe_exams oe ON
            oe.assessment_id = aa.id AND oe.is_deleted = 0
        INNER JOIN cm_academic_paper_subjects caps ON
            caps.id = eers.cm_academic_paper_subjects_id
        INNER JOIN cm_academic_paper ap ON 
            ap.id = caps.cm_academic_paper_id
        INNER JOIN v4_ams_subject s ON
            s.id = caps.ams_subject_id 
        LEFT JOIN cm_common_list_object cclo ON
            ap.slot_id = cclo.id AND cclo.type = 'SLOT'
        WHERE
            g.trashed IS NULL";
        
        try {
            $assementExaminers = $this->executeQueryForList($query.$whereQuery.$limitQuery, $this->mapper[ExamRegistrationSubjectServiceMapper::SEARCH_ASSESSMENT_EXAMINER]);
        } catch (\Exception $e) {
            throw new ExamControllerException(ExamControllerException::ERROR_FETCHING_EXAM_REGISTRATION_FEE,"Cannot fetch Exam Registration Batch details! Please try again.");
        }
        $staffSideMarkEntryUItype = CommonService::getInstance()->getSettings(SettingsConstents::EXAM_VALUATION, SettingsConstents::STAFF_SIDE_MARK_ENTRY_UI_FORMAT);
        $searchRuleRequest = new SearchRuleRequest;
        $searchRuleRequest->name = "EXAM_VALUATION_PROCEDURE_RULE";
        $examValuationProcedureRule = reset(RuleService::getInstance()->searchRule($searchRuleRequest))->rule;
        $isSortByListAllFaculties = $examValuationProcedureRule->isSortByListAllFaculties ? true : false;
        $requestForStaff = new \stdClass;
        $requestForStaff->isResigned = 0;
        $allStaffs = StaffService::getInstance()->getStaffListByRequest($isResigned);
        foreach ($assementExaminers as $assementExaminer) {
            $assementExaminer->valuationDetails->staffIds = empty($assementExaminer->valuationDetails->staffIds) ? [] : $assementExaminer->valuationDetails->staffIds;
            $assementExaminer->valuationDetails->valuationStaffs = empty($assementExaminer->valuationDetails->valuationStaffs) ? [] : $assementExaminer->valuationDetails->valuationStaffs;
            $assementExaminer->valuationDetails->valuatedStaffs = empty($assementExaminer->valuationDetails->valuatedStaffs) ? [] : $assementExaminer->valuationDetails->valuatedStaffs;
            $assementExaminer->valuationDetails->reValuationStaffs = empty($assementExaminer->valuationDetails->reValuationStaffs) ? [] : $assementExaminer->valuationDetails->reValuationStaffs;
            if (!empty($assementExaminer->valuationDetails->valuationStaffs)) {
                if(!empty($request->packetNo) && !empty($request->packetNo)){
                    $assementExaminer->valuationDetails->valuationStaffs = array_filter($assementExaminer->valuationDetails->valuationStaffs ,function($valuationStaff)use($request){
                        return $valuationStaff->packetNo == $request->packetNo && $valuationStaff->count == $request->valuationCount;
                    });
                }
                foreach ($assementExaminer->valuationDetails->valuationStaffs as $valuationStaff) {
                    $valuatedStaffs = array_filter($assementExaminer->valuationDetails->valuatedStaffs ,function($valuatedStaffs)use($valuationStaff){
                        return $valuatedStaffs->packetNo == $valuationStaff->packetNo && $valuatedStaffs->count == $valuationStaff->count;
                    });
                    $cheifValuatedStaffs = array_filter($assementExaminer->valuationDetails->valuatedStaffs ,function($valuatedStaffs)use($valuationStaff){
                        return $valuatedStaffs->packetNo == $valuationStaff->packetNo && $valuatedStaffs->count == $valuationStaff->count && in_array( $valuatedStaffs->staffId,$valuationStaff->chiefExaminers);
                    });
                    $addiitonalValuatedStaffs = array_filter($assementExaminer->valuationDetails->valuatedStaffs ,function($valuatedStaffs)use($valuationStaff){
                        return $valuatedStaffs->packetNo == $valuationStaff->packetNo && $valuatedStaffs->count == $valuationStaff->count && in_array( $valuatedStaffs->staffId,$valuationStaff->addiitonalExamniners);
                    });
                    $valuationStaff->isDisableEditAdditionalStaff = empty($addiitonalValuatedStaffs) ? 0 : 1;
                    $valuationStaff->isDisableEditCheifValuatedStaffs = empty($cheifValuatedStaffs) ? 0 : 1;
                    $valuationStaff->isDisableEdit = empty($valuatedStaffs) ? 0 : 1;
                    $assementExaminer->assignedStaffIds = array_merge($assementExaminer->assignedStaffIds ? $assementExaminer->assignedStaffIds : [] ,$valuationStaff->addiitonalExamniners);
                    $assementExaminer->assignedStaffIds = array_merge($assementExaminer->assignedStaffIds ? $assementExaminer->assignedStaffIds : [] ,$valuationStaff->chiefExaminers);
                    $valuationStaff->staffs = [];
                    $valuationStaff->addiitonalExamninersNames = empty($valuationStaff->addiitonalExamniners) ?  [] : StaffService::getInstance()->getStaffByIds($valuationStaff->addiitonalExamniners);
                    $valuationStaff->chiefExamninersNames = empty($valuationStaff->chiefExaminers) ?  [] : StaffService::getInstance()->getStaffByIds($valuationStaff->chiefExaminers);
                    $valuationStaff->addiitonalExamninersName = implode(', ', array_column($valuationStaff->addiitonalExamninersNames, 'name'));
                    $valuationStaff->chiefExaminersName = implode(', ', array_column($valuationStaff->chiefExamninersNames, 'name'));
                    if($valuationStaff->count == '1' && !$request->listAllFaculties){
                        $requestForStaff = new \stdClass;
                        $requestForStaff->academicPaperSubjectId = $assementExaminer->paperSubjectId;
                        $valuationStaff->listStaffs = $this->getAssignedFacultiesByAcademicPaper($requestForStaff,'STAFF');
                    }
                    else{
                        $valuationStaff->listStaffs = $allStaffs;
                    }
                }
                foreach ($assementExaminer->valuationDetails->valuationStaffs as $valuationStaff) {
                    $valuationStaff->removedAdditioanlStaffIds = array_diff($assementExaminer->assignedStaffIds ? $assementExaminer->assignedStaffIds : [] ,$valuationStaff->addiitonalExamniners);
                    $valuationStaff->removedCheifStaffIds = array_diff($assementExaminer->assignedStaffIds ? $assementExaminer->assignedStaffIds : [] ,$valuationStaff->chiefExaminers);
                    $valuationStaff->removedStaffIds = array_merge($valuationStaff->removedCheifStaffIds,$valuationStaff->removedAdditioanlStaffIds);
                    foreach($valuationStaff->allStaffs as $staff){
                        if(!in_array($staff->staffId,$valuationStaff->removedStaffIds)){
                            $valuationStaff->staffs[] = $staff;
                        }
                    }
                    $valuationStaff->allStaffs = [];
                }
            }
            else {
                $assementExaminer->staffs = [];
            }
            if (!empty($assementExaminer->valuationDetails->reValuationStaffs)) {
                if(!empty($request->packetNo) && !empty($request->packetNo)){
                    $assementExaminer->valuationDetails->reValuationStaffs = array_filter($assementExaminer->valuationDetails->reValuationStaffs ,function($valuationStaff)use($request){
                        return $valuationStaff->packetNo == $request->packetNo && $valuationStaff->count == $request->valuationCount;
                    });
                }
                foreach ($assementExaminer->valuationDetails->reValuationStaffs as $valuationStaff) {
                    $valuatedStaffs = array_filter($assementExaminer->valuationDetails->reValuationStaffs ,function($valuatedStaffs)use($valuationStaff){
                        return $valuatedStaffs->packetNo == $valuationStaff->packetNo && $valuatedStaffs->count == $valuationStaff->count;
                    });
                    $confirmedCheifValuatedStaffs = array_filter($assementExaminer->valuationDetails->reValuationStaffs ,function($valuatedStaffs)use($valuationStaff){
                        return $valuatedStaffs->packetNo == $valuationStaff->packetNo && $valuatedStaffs->count == $valuationStaff->count && in_array( $valuatedStaffs->staffId,$valuationStaff->chiefExaminers);
                    });
                    $confirmedAddiitonalValuatedStaffs = array_filter($assementExaminer->valuationDetails->reValuationStaffs ,function($valuatedStaffs)use($valuationStaff){
                        return $valuatedStaffs->packetNo == $valuationStaff->packetNo && $valuatedStaffs->count == $valuationStaff->count && in_array( $valuatedStaffs->staffId,$valuationStaff->addiitonalExamniners);
                    });
                    $valuationStaff->isDisableEditAdditionalStaffRev = empty($confirmedAddiitonalValuatedStaffs) ? 0 : 1;
                    $valuationStaff->isDisableEditCheifValuatedStaffRev = empty($confirmedCheifValuatedStaffs) ? 0 : 1;
                    $valuationStaff->isDisableEditRev = empty($valuatedStaffs) ? 0 : 1;
                    $assementExaminer->assignedStaffIds = array_merge($assementExaminer->assignedStaffIds ? $assementExaminer->assignedStaffIds : [] ,$valuationStaff->addiitonalExamniners);
                    $assementExaminer->assignedStaffIds = array_merge($assementExaminer->assignedStaffIds ? $assementExaminer->assignedStaffIds : [] ,$valuationStaff->chiefExaminers);
                    $valuationStaff->staffs = [];
                    $valuationStaff->addiitonalExamninersNames = empty($valuationStaff->addiitonalExamniners) ?  [] : StaffService::getInstance()->getStaffByIds($valuationStaff->addiitonalExamniners);
                    $valuationStaff->chiefExamninersNames = empty($valuationStaff->chiefExaminers) ?  [] : StaffService::getInstance()->getStaffByIds($valuationStaff->chiefExaminers);
                    $valuationStaff->addiitonalExamninersName = implode(', ', array_column($valuationStaff->addiitonalExamninersNames, 'name'));
                    $valuationStaff->chiefExaminersName = implode(', ', array_column($valuationStaff->chiefExamninersNames, 'name'));
                    if($valuationStaff->count == '1' && !$request->listAllFaculties){
                        $requestForStaff = new FilterSubjectClusterRequest();
                        $requestForStaff->academicPaperSubjectId = $assementExaminer->paperSubjectId;
                        $valuationStaff->listStaffs = SubjectService::getInstance()->getAssignedSubjectsForFilter($requestForStaff,'STAFF');
                    }
                    else{
                        $valuationStaff->listStaffs = $allStaffs;
                    }
                }
                foreach ($assementExaminer->valuationDetails->reValuationStaffs as $valuationStaff) {
                    $valuationStaff->removedAdditioanlStaffIds = array_diff($assementExaminer->assignedStaffIds ? $assementExaminer->assignedStaffIds : [] ,$valuationStaff->addiitonalExamniners);
                    $valuationStaff->removedCheifStaffIds = array_diff($assementExaminer->assignedStaffIds ? $assementExaminer->assignedStaffIds : [] ,$valuationStaff->chiefExaminers);
                    $valuationStaff->removedStaffIds = array_merge($valuationStaff->removedCheifStaffIds,$valuationStaff->removedAdditioanlStaffIds);
                    foreach($valuationStaff->allStaffs as $staff){
                        if(!in_array($staff->staffId,$valuationStaff->removedStaffIds)){
                            $valuationStaff->staffs[] = $staff;
                        }
                    }
                    $valuationStaff->allStaffs = [];
                }
            }
            else {
                $assementExaminer->staffs = [];
            }
            
            $assementExaminer->valuationDetails->listStaffs = $allStaffs;
           
            $chiefExaminerIds = call_user_func_array('array_merge',array_column($assementExaminer->valuationDetails->valuationStaffs,"chiefExaminers"));
            $additionalExaminerIds = call_user_func_array('array_merge',array_column($assementExaminer->valuationDetails->valuationStaffs,"additionalExaminer"));
            $examinerStaffIds = array_unique(array_merge($chiefExaminerIds,$additionalExaminerIds));
            $examinerStaffs = empty($examinerStaffIds) ?  [] : StaffService::getInstance()->getStaffByIds($examinerStaffIds);
            switch ($request->listBasedOn) {
                case 'SUBJECT_WISE':
                    $resultData[$assementExaminer->subjectCode]->code = $assementExaminer->subjectCode;
                    $resultData[$assementExaminer->subjectCode]->ids[] = $assementExaminer->id;
                    $resultData[$assementExaminer->subjectCode]->name = $assementExaminer->subjectName;
                    $resultData[$assementExaminer->subjectCode]->valuationDetails = $assementExaminer->valuationDetails ;
                    $resultData[$assementExaminer->subjectCode]->academicTermName = $assementExaminer->academicTermName;
                    $resultData[$assementExaminer->subjectCode]->assessmentDate = $assementExaminer->assessmentDate ? date("d-m-Y", strtotime($assementExaminer->assessmentDate)) : '';
                    $resultData[$assementExaminer->subjectCode]->syllabusCode = $assementExaminer->syllabusCode;
                    $resultData[$assementExaminer->subjectCode]->subjectPriority = $assementExaminer->subjectPriority;
                    $resultData[$assementExaminer->subjectCode]->slot = "Slot " .$assementExaminer->subjectSlot;
                    $resultData[$assementExaminer->subjectCode]->valuationDetails = $assementExaminer->valuationDetails;
                    $resultData[$assementExaminer->subjectCode]->exams[] = $assementExaminer;
                    $resultData[$assementExaminer->subjectCode]->staffs[] = $examinerStaffs;
                    $resultData[$assementExaminer->subjectCode]->assessmentId = $assementExaminer->assessmentId;
                    $resultData[$assementExaminer->subjectCode]->examRegistrationId = $assementExaminer->examRegistrationId;
                    break;
                
                default:
                    $resultData[$assementExaminer->subjectCode]->code = $assementExaminer->subjectCode;
                    $resultData[$assementExaminer->subjectCode]->name = $assementExaminer->subjectName;
                    $resultData[$assementExaminer->subjectCode]->ids[] = $assementExaminer->id;
                    $resultData[$assementExaminer->subjectCode]->valuationDetails = $assementExaminer->valuationDetails ;
                    $resultData[$assementExaminer->subjectCode]->academicTermName = $assementExaminer->academicTermName;
                    $resultData[$assementExaminer->subjectCode]->assessmentDate = $assementExaminer->assessmentDate ? date("d-m-Y", strtotime($assementExaminer->assessmentDate)) : '';
                    $resultData[$assementExaminer->subjectCode]->syllabusCode = $assementExaminer->syllabusCode;
                    $resultData[$assementExaminer->subjectCode]->subjectPriority = $assementExaminer->subjectPriority;
                    $resultData[$assementExaminer->subjectCode]->slot = "Slot " .$assementExaminer->subjectSlot;
                    $resultData[$assementExaminer->subjectCode]->valuationDetails = $assementExaminer->valuationDetails;
                    $resultData[$assementExaminer->subjectCode]->exams[] = $assementExaminer;
                    $resultData[$assementExaminer->subjectCode]->staffs[] = $examinerStaffs;
                    $resultData[$assementExaminer->subjectCode]->assessmentId = $assementExaminer->assessmentId;
                    $resultData[$assementExaminer->subjectCode]->examRegistrationId = $assementExaminer->examRegistrationId;
                    break;
            }
        }
        ksort($resultData);
        return array_values($resultData);
    }
       
    /**
     * get Assigned Subjects In Batch
     * @param $searchRequest 
     * @return $subjectDetails 
     */
    public function getAssignedExamRegistrationSubjectsInBatch($searchRequest) {
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $subjectOrderBy = CommonService::getInstance()->getSettings(SettingsConstants::EXAM_CONTROLLER, SettingsConstants::SUBJECT_ORDER_TAKEN_BY);
            if($subjectOrderBy == "ORDER"){
                $orderBy = " ORDER BY CAST(aps.properties ->> '$.orderNo' AS UNSIGNED) ASC";
            }
            else{
                $orderBy = " ORDER BY CAST(aps.properties ->> '$.priority' AS UNSIGNED) DESC";
            }
            
            $whereQuery = "";
            if(!empty($searchRequest->courseTypeId)) {
                $courseTypeIdString = is_array($searchRequest->courseTypeId) ? "'" . implode("','",$searchRequest->courseTypeId) . "'" : "'".$searchRequest->courseTypeId."'";
                $whereQuery .= " AND g.properties ->> '$.courseTypeId' IN ( $courseTypeIdString )";
            }
            if(!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','",$searchRequest->groupId) . "'" : "'".$searchRequest->groupId."'";
                $whereQuery .= " AND g.id IN ( $groupIdString )";
            }
            if(!empty($searchRequest->startYear)) {
                $startYearStrng = is_array($searchRequest->startYear) ? "'" . implode("','",$searchRequest->startYear) . "'" : "'".$searchRequest->startYear."'";
                $whereQuery .= " AND g.properties ->> '$.startYear' IN ( $startYearStrng )";
            }
            if(!empty($searchRequest->academicTermId)) {
                $academicTermIdString = is_array($searchRequest->academicTermId) ? "'" . implode("','",$searchRequest->academicTermId) . "'" : "'".$searchRequest->academicTermId."'";
                $whereQuery .= " AND CAST(eerb.properties ->> '$.academicTermId'AS CHAR) IN ( $academicTermIdString )";
            }
            if(!empty($searchRequest->examRegistrationId)) {
                $examRegistrationIdString = is_array($searchRequest->examRegistrationId) ? "'" . implode("','",$searchRequest->examRegistrationId) . "'" : "'".$searchRequest->examRegistrationId."'";
                $whereQuery .= " AND eer.id IN ( $examRegistrationIdString )";
            }
            if(!empty($searchRequest->slotId)) {
                $slotIdString = is_array($searchRequest->slotId) ? "'" . implode("','",$searchRequest->slotId) . "'" : "'".$searchRequest->slotId."'";
                $whereQuery .= " AND aps.slot_id IN ( $slotIdString )";
            }
            if(!empty($searchRequest->courseDepartmentId)) {
                $courseDepartmentIdString = is_array($searchRequest->courseDepartmentId) ? "'" . implode("','",$searchRequest->courseDepartmentId) . "'" : "'".$searchRequest->courseDepartmentId."'";
                $whereQuery .= " AND d.deptID IN ( $courseDepartmentIdString )";
            }
            $query = "SELECT DISTINCT
                aps.id AS id,
                aps.id AS academicPaperSubjectId,
                ap.name as academicPaperName,
                sub.id AS subjectId,
                sub.code AS subjectCode,
                sub.name AS subjectName,
                sub.name AS name,
                eerb.properties ->> '$.academicTermId' AS academicTermId,
                g.id AS groupId,
                g.name AS groupName,
                aps.properties->>'$.externalMaxMark' as externalMaxMark,
                aps.properties ->> '$.isInternal' as isInternal,
                aps.properties ->> '$.isExternal' as isExternal,
                aps.properties ->> '$.internalMaxMark' as internalMaxMark,
                aps.properties->>'$.classType' as subjectClassType,
                aps.properties->>'$.credit' as subjectCredit,
                aps.properties->>'$.classType' as subjectPropertyType,
                cst.name as courseType,
                d.deptName 
            FROM
                ec_exam_registration_subject eers 
            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
            INNER JOIN `groups` g ON
                g.id = eerb.groups_id
            INNER JOIN cm_academic_paper_subjects aps ON 
                aps.id = eers.cm_academic_paper_subjects_id
            INNER JOIN cm_academic_paper ap ON 
                aps.cm_academic_paper_id = ap.id
            INNER JOIN v4_ams_subject sub ON 
                sub.id = aps.ams_subject_id
            INNER JOIN department d ON d.deptID = sub.department_id 
            LEFT JOIN cm_subject_types cst ON cst.id = aps.subject_type_id
            WHERE
                1 = 1";
            $subjectDetails = $this->executeQueryForList($query.$whereQuery.$orderBy);
            
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
         /**
     * get All Subject Details By Exam Registration ID
     * @param ExamRegistrationId $examRegistrationId
     * @return $subjectDetails
     */
    public function getAllSubjectDetailsByRegistration($examRegistrationId)
    {
        if(is_array($examRegistrationId) ){
            $examRegistrationId = $this->realEscapeArray($examRegistrationId);
        }
        else{
            $examRegistrationId = $this->realEscapeString($examRegistrationId);
        }
        $examRegistrationIdString = is_array($examRegistrationId) ? "'" . implode("','",$examRegistrationId) . "'" : "'".$examRegistrationId."'";
        $whereQuery = null;
        try 
        { 
            $query = "SELECT 
                        aps.id as id,
                        aps.id as academicPaperSubjectId,
                        s.code as subjectCode,
                        s.name as subjectName,
                        s.id as amsSubjectId,
                        eers.am_assessment_id as assessmentId,
                        GROUP_CONCAT(eers.am_assessment_id) as assessmentIds,
                        aa.properties_value ->>'$.assessmentDate' AS assessmentDate,
                        aa.properties_value ->>'$.startTime' AS assessmentStartTime,
                        aa.properties_value ->>'$.endTime' AS assessmentEndTime,
                        IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                        eerb.ec_exam_registration_id as examRegistrationId,
                        aps.properties ->> '$.subjectTypeId' as subjectTypeId,
                        aps.properties ->> '$.externalMaxMark' as externalMaxMark,
                        g.id AS groupId,
                        g.name AS groupName
                    FROM
                        ec_exam_registration_subject eers
                    INNER JOIN ec_exam_registration_batch eerb ON
                        eerb.id = eers.ec_exam_registration_batch_id
                    INNER JOIN  cm_academic_paper_subjects aps ON 
                        aps.id = eers.cm_academic_paper_subjects_id
                    INNER JOIN am_assessment aa ON
                        aa.id = eers.am_assessment_id
                    INNER JOIN `groups` g ON
                        g.id = eerb.groups_id
                    INNER JOIN  v4_ams_subject s ON 
                        s.id = aps.ams_subject_id
                    WHERE
                        eerb.ec_exam_registration_id IN ( $examRegistrationIdString ) 
                    GROUP BY eerb.groups_id, aps.id ORDER BY aa.properties_value ->>'$.assessmentDate' ASC";
            $subjectDetails = $this->executeQueryForList($query.$whereQuery);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
     /**
     * Search examRegistration
     * @param  $request
     * @return examRegistrations
     */
    public function getSubjectForCurrentVivaValuationStaffs( $request){
        $request = $this->realEscapeObject($request);
        $query = "";
        $currentUerId = $GLOBALS['userId'];
        $subjectDetails = [];
        try { 
            if(!empty($request->academicPaperSubjectId)) {
                $academicPaperSubjectIdsString = is_array($request->academicPaperSubjectId) ? "'" . implode("','",$request->academicPaperSubjectId) . "'" : "'".$request->academicPaperSubjectId."'";
                $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ( $academicPaperSubjectIdsString )";
            }
            $query = "SELECT
                    DISTINCT(aps.id) as id,
                    aps.id as academicPaperSubjectId,
                    s.id as subjectId,
                    s.code as subjectCode,
                    s.name as subjectName,
                    oe.id as onlineExamId,
                    eers.am_assessment_id as assessmentId,
                    eers.id as examRegistrationSubjectId,
                    aps.properties ->> '$.syllabusName' AS syllabusName,
                    IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                    aps.properties ->> '$.externalMaxMark' as externalMaxMark,
                    eers.valuation_details as valuationDetails,
                    eerb.ec_exam_registration_id as examRegistrationId
                FROM
                    cluster_groups_relations cgr 
                INNER JOIN cluster_members cm ON 
                    cm.cluster_id = cgr.cluster_id 
                INNER JOIN `groups` sg ON 
                    sg.id = cgr.groups_id 
                INNER JOIN groups_relations gr ON 
                    gr.child_groups_id = sg.id
                INNER JOIN `groups` g ON 
                    g.id = gr.parent_groups_id AND g.type = 'BATCH'
                INNER JOIN    ec_exam_registration_subject eers ON
                    eers.cm_academic_paper_subjects_id = sg.paperSubjectId
                INNER JOIN ec_exam_registration_batch eerb ON
                    eerb.id = eers.ec_exam_registration_batch_id AND eerb.groups_id = g.id 
                INNER JOIN  cm_academic_paper_subjects aps ON 
                    aps.id = eers.cm_academic_paper_subjects_id
                INNER JOIN am_assessment aa ON
                    aa.id = eers.am_assessment_id
                INNER JOIN oe_exams oe ON
                    oe.assessment_id = eers.am_assessment_id AND oe.is_deleted = 0
                INNER JOIN  v4_ams_subject s ON 
                    s.id = aps.ams_subject_id
                WHERE
                    cm.staff_id = '$currentUerId' AND 
                    eerb.ec_exam_registration_id='$request->examRegistrationId";
            $subjects = $this->executeQueryForList($query.$whereQuery);
            // foreach($subjects as $subject){
            //     $subject->valuationDetailsCopy = json_decode($subject->valuationDetails);
            //     $subjectDetails[$subject->id]->id = $subject->id;
            //     $subjectDetails[$subject->id]->subjectId = $subject->subjectId;
            //     $subjectDetails[$subject->id]->academicPaperSubjectId = $subject->academicPaperSubjectId;
            //     $subjectDetails[$subject->id]->subjectCode = $subject->subjectCode;
            //     $subjectDetails[$subject->id]->subjectName = $subject->subjectName;
            //     $subjectDetails[$subject->id]->assessmentId = $subject->assessmentId;
            //     $subjectDetails[$subject->id]->isTheory = $subject->isTheory;
            //     $subjectDetails[$subject->id]->externalMaxMark = $subject->externalMaxMark;
            //     $subjectDetails[$subject->id]->valuationDetails = $subject->valuationDetails;
            //     $subjectDetails[$subject->id]->examRegistrationId = $subject->examRegistrationId;
            //     $subjectDetails[$subject->id]->qpCode = $subject->qpCode;
            //     $subjectDetails[$subject->id]->onlineExamId[] = $subject->onlineExamId;
            //     $subjectDetails[$subject->id]->isValidatedDetails[] = $subject->isValidated;
            // }
            // $subjectDetails = array_values($subjectDetails);
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjects;
    }
    /**
     * update exam subject resolution rule
     * @param  $subjectList
     */
    public function updateExamSubjectResolutionRule($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $updatedBy = $GLOBALS['userId'];
            $query = "UPDATE  ec_exam_registration_subject
                SET 
                    properties = JSON_SET(COALESCE(`properties`,'{}'), '$.resolutionSubjectLimit','$searchRequest->resolutionSubjectLimit'),
                    updated_by = '$updatedBy'
                WHERE
                id = '$searchRequest->id'";
            $this->executeQuery($query);
            $this->logger->info(Events::EC_UPDATE_EXAM_REGISTRATION_SUBJECT_PROPERTIES,[
                "staff" => new Staff(["id" => $updatedBy]),
                "request" => $searchRequest,
                "status" => StatusConstants::SUCCESS
            ]);
        }
        catch (\Exception $e){
            $this->logger->error(Events::EC_UPDATE_EXAM_REGISTRATION_SUBJECT_PROPERTIES, [
                "staff" => new Staff(["id" => $updatedBy]),
                "request" => $searchRequest,
                "errorCode" => $e->getCode(),
                "errorMessage" => $e->getMessage(),
                "status" => StatusConstants::FAILED
            ]);
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
    }
      /**
     * Get Assigned Staff details perticular Subject
     * @param  $request
     * @return examRegistrations
     */
    public function getAssignedFacultiesByAcademicPaper( $request){
        $request = $this->realEscapeObject($request);
        $query = "";
        $staffs = [];
        try { 
            if(!empty($request->academicPaperSubjectId)) {
                $academicPaperSubjectIdsString = is_array($request->academicPaperSubjectId) ? "'" . implode("','",$request->academicPaperSubjectId) . "'" : "'".$request->academicPaperSubjectId."'";
                $whereQuery .= " AND caps.id IN ( $academicPaperSubjectIdsString )";
            }
            $query = "SELECT DISTINCT 
                        stf.staffID as id, 
                        stf.staffName as name 
                    FROM cm_academic_paper_subjects caps
                    INNER JOIN `groups` sg ON sg.paperSubjectId = caps.id 
                    INNER JOIN `cluster_groups_relations` cg ON cg.groups_id = sg.id
                    INNER JOIN `cluster_members` cm ON cm.cluster_id = cg.cluster_id
                    INNER JOIN `staffaccounts` stf on stf.staffID = cm.staff_id 
                    WHERE 1 = 1 AND isResigned='0'";
            $staffs = $this->executeQueryForList($query.$whereQuery);
           
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $staffs;
    }
     /**
     * Get Exam Registration Assessment Examiner 
     * @param @request
     * @return Subjects
     */
    public function getSubjectsDetailsForDigitalValuationProcedure($request){
        $request = $this->realEscapeObject($request);
        $assignedSubjects = [];
        $whereQuery = "";
        $limitQuery = "";
        $joinQuery = "";
        $orderBy = " ORDER BY s.code ASC";
        if(!empty($request->assessmentId)) {
            $whereQuery .= " AND eers.am_assessment_id = '$request->assessmentId'";
        }
        if(!empty($request->academicPaperSubjectId)) {
            $academicPaperSubjectIdString = is_array($request->academicPaperSubjectId) ? "'" . implode("','",$request->academicPaperSubjectId) . "'" : "'".$request->academicPaperSubjectId."'";
            $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ( $academicPaperSubjectIdString )";
        }
        if(!empty($request->assessmentDate)) {
            $whereQuery .= " AND aa.properties_value ->>'$.assessmentDate' = '$request->assessmentDate'";
        }
        if(!empty($request->examTime)) {
            $whereQuery .= " AND CONCAT(TIME_FORMAT(aa.properties_value->>'$.startTime', '%l:%i %p'),' - ',TIME_FORMAT(aa.properties_value->>'$.endTime', '%l:%i %p')) = '$request->examTime'";
        }
        if(!empty($request->groupId)) {
            $whereQuery .= " AND g.id = '$request->groupId'";
        }
        if(!empty($request->courseTypeId)) {
            $whereQuery .= " AND p.course_type_id = '$request->courseTypeId'";
        }
        if(!empty($request->academicTermId)) {
            $whereQuery .= " AND CAST(eerb.properties ->> '$.academicTermId'AS CHAR) = '$request->academicTermId'";
        }
        if(!empty($request->examRegistrationId)) {
            $whereQuery .= " AND eerb.ec_exam_registration_id = '$request->examRegistrationId'";
        }
        if($request->examType == ExamRegistrationTypeConstants::REVALUATION){
            $joinQuery .= " INNER JOIN ec_exam_registration eer ON
                            eer.id = eerb.ec_exam_registration_id AND 
                            eer.trashed IS NULL
                        INNER JOIN ec_exam_registration eerp ON
                            eerp.id = eer.properties->>'$.parentExamRegistrationId' AND 
                            eerp.trashed IS NULL
                        INNER JOIN ec_exam_registration_batch eerbParent ON
                            eerbParent.ec_exam_registration_id = eerp.id  AND 
                            eerbParent.groups_id = eerb.groups_id
                        INNER JOIN ec_exam_registration_subject eers ON     
                            eers.ec_exam_registration_batch_id = eerbParent.id ";
        }
        else{
            $joinQuery .= " INNER JOIN ec_exam_registration eer ON
                            eer.id = eerb.ec_exam_registration_id AND 
                            eer.trashed IS NULL
                        INNER JOIN ec_exam_registration_subject eers ON     
                            eers.ec_exam_registration_batch_id = eerb.id ";
        }
       
        $query = "SELECT
            eers.id,
            eers.am_assessment_id,
            eerb.groups_id,
            eerb.ec_exam_registration_id,
            eers.ec_exam_registration_batch_id,
            eers.cm_academic_paper_subjects_id,
            eer.name as examRegistrationName,
            oe.id AS onlineExamId,
            IF(
                eers.valuation_details IS NULL ,
                JSON_SET(JSON_OBJECT(), '$.staffIds', '', '$.departmentIds', '','$.valuationDates', ''),
                eers.valuation_details
            ) AS valuation_details,
            aa.name AS assessmentName,
            g.name AS groupName,
            s.name AS subjectDesc,
            s.code AS subjectName,
            aa.properties_value ->>'$.assessmentDate' AS assessmentDate,
            caps.properties ->> '$.syllabusName' AS syllabusName,
            caps.properties->>'$.subjectPriority' AS subjectPriority,
            g.properties->>'$.description' AS groupDescription,
            act.id as academicTermId,
            act.name as academicTermName,
            ct.course_Type as courseType
        FROM
            ec_exam_registration_batch eerb
        $joinQuery
        INNER JOIN  academic_term act ON 
            act.id = CAST(eerb.properties ->> '$.academicTermId'AS CHAR) AND act.type = 'SEMESTER'
        INNER JOIN `groups` g ON
            g.id = eerb.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 am_assessment aa ON
            aa.id = eers.am_assessment_id
        INNER JOIN oe_exams oe ON
            oe.identifying_context ->> '$.assessmentId' = aa.id AND oe.is_deleted = 0
        INNER JOIN cm_academic_paper_subjects caps ON
            caps.id = eers.cm_academic_paper_subjects_id
        INNER JOIN v4_ams_subject s ON
            s.id = caps.ams_subject_id 
        WHERE
            g.trashed IS NULL";
        try {
            $assementExaminers = $this->executeQueryForList($query.$whereQuery.$limitQuery.$orderBy, $this->mapper[ExamRegistrationSubjectServiceMapper::SEARCH_ASSESSMENT_EXAMINER]);
        } catch (\Exception $e) {
            throw new ExamControllerException(ExamControllerException::ERROR_FETCHING_EXAM_REGISTRATION_FEE,"Cannot fetch Exam Registration Batch details! Please try again.");
        }
        $assignedSubjects = [];
        foreach ($assementExaminers as $assementExaminer) {
            $assementExaminer->valuers = [];
            $assementExaminer->reviewers = [];
            $assementExaminer->valuerIds = [];
            $assementExaminer->reviewerIds = [];
            $assementExaminer->valuationDetails->staffIds = empty($assementExaminer->valuationDetails->staffIds) ? [] : $assementExaminer->valuationDetails->staffIds;
            $assementExaminer->valuationDetails->valuationDates = empty($assementExaminer->valuationDetails->valuationDates) ? [] : $assementExaminer->valuationDetails->valuationDates;
            $assementExaminer->valuationDetails->valuationStaffs = empty($assementExaminer->valuationDetails->valuationStaffs) ? [] : $assementExaminer->valuationDetails->valuationStaffs;
            $assementExaminer->valuationDetails->reValuationDates = empty($assementExaminer->valuationDetails->reValuationDates) ? [] : $assementExaminer->valuationDetails->reValuationDates;  
            $assementExaminer->valuationDetails->reValuationStaffs = empty($assementExaminer->valuationDetails->reValuationStaffs) ? [] : $assementExaminer->valuationDetails->reValuationStaffs;
            if (!empty($assementExaminer->valuationDetails->valuationStaffs)) {
                foreach ($assementExaminer->valuationDetails->valuationStaffs as $valuationStaff) {
                    $assementExaminer->staffIds = [];
                    $valuationStaff->addiitonalExamninersName = empty($valuationStaff->addiitonalExamniners) ?  [] : StaffService::getInstance()->getStaffByIds($valuationStaff->addiitonalExamniners);
                    if($valuationStaff->count == '1'){
                        $assementExaminer->valuers = $valuationStaff->addiitonalExamninersName;
                        $assementExaminer->valuerIds = $valuationStaff->addiitonalExamniners;
                    }
                    else if($valuationStaff->count == '2'){
                        $assementExaminer->reviewers = $valuationStaff->addiitonalExamninersName;
                        $assementExaminer->reviewerIds = $valuationStaff->addiitonalExamniners;
                    }
                    foreach($valuationStaff->addiitonalExamninersName as $staffName){
                        $requestForAvailableStudent = new \stdClass;
                        $responseForAvailableStudent = new \stdClass;
                        $requestForAvailableStudent->staffId = $staffName->id;
                        $requestForAvailableStudent->valuationCount = $valuationStaff->count;
                        $requestForAvailableStudent->examRegistrationId = $assementExaminer->examRegistrationId;
                        $requestForAvailableStudent->assessmentId = $assementExaminer->assessmentId;
                        $requestForAvailableStudent->notCheckEmpty = true;
                        $responseForAvailableStudent = ExamValuationService::getInstance()->getAllAvailableStudentDetails($requestForAvailableStudent);
                        $staffName->isStudentAssigned = $responseForAvailableStudent->countOfAssignedStudents > 0 ? true : false; 
                    }
                }  
            }
            $assignedSubjects[$assementExaminer->subjectCode] = empty($assignedSubjects[$assementExaminer->subjectCode]) ? $assementExaminer : $assignedSubjects[$assementExaminer->subjectCode];
            $assignedSubjects[$assementExaminer->subjectCode]->examRegSubIds[] = $assementExaminer->id;
            $assignedSubjects[$assementExaminer->subjectCode]->paperSubjectIds[$assementExaminer->paperSubjectId] = $assementExaminer->paperSubjectId;
        }
        foreach($assignedSubjects as $subject){
            $subject->code = $subject->subjectCode ;
            $subject->name = $subject->subjectName ;
            $studentCountRequest = new \stdClass;
            $studentCountRequest->examRegistrationId = $subject->examRegistrationId;
            $studentCountRequest->paperIdArray = $subject->paperSubjectIds;
            $subject->paperSubjectIds = array_values($subject->paperSubjectIds);
            $subject->studentCount = CommonExamService::getInstance()->getStudentCountForPaperSubjects($studentCountRequest);
        }
        return array_values($assignedSubjects);
    }
     /**
     * Get Exam Registration Assessment Date And students for Examiner 
     * @param @request
     * @return Subjects
     */
    public function getSubjectsDateStudentDetailsForDigitalValuationProcedure($request){
        $request = $this->realEscapeObject($request);
        $assignedSubjects = [];
        $whereQuery = "";
        $limitQuery = "";
        $joinQuery = "";
        $orderBy = " ORDER BY s.code ASC";
        if(!empty($request->assessmentId)) {
            $whereQuery .= " AND eers.am_assessment_id = '$request->assessmentId'";
        }
        if(!empty($request->assessmentDate)) {
            $whereQuery .= " AND aa.properties_value ->>'$.assessmentDate' = '$request->assessmentDate'";
        }
        if(!empty($request->examTime)) {
            $whereQuery .= " AND CONCAT(TIME_FORMAT(aa.properties_value->>'$.startTime', '%l:%i %p'),' - ',TIME_FORMAT(aa.properties_value->>'$.endTime', '%l:%i %p')) = '$request->examTime'";
        }
        if(!empty($request->academicPaperSubjectId)) {
            $academicPaperSubjectIdString = is_array($request->academicPaperSubjectId) ? "'" . implode("','",$request->academicPaperSubjectId) . "'" : "'".$request->academicPaperSubjectId."'";
            $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ( $academicPaperSubjectIdString )";
        }
        if(!empty($request->groupId)) {
            $whereQuery .= " AND g.id = '$request->groupId'";
        }
        if(!empty($request->courseTypeId)) {
            $whereQuery .= " AND p.course_type_id = '$request->courseTypeId'";
        }
        if(!empty($request->academicTermId)) {
            $whereQuery .= " AND CAST(eerb.properties ->> '$.academicTermId'AS CHAR) = '$request->academicTermId'";
        }
        if(!empty($request->examRegistrationId)) {
            $whereQuery .= " AND eerb.ec_exam_registration_id = '$request->examRegistrationId'";
        }
        if($request->examType == ExamRegistrationTypeConstants::REVALUATION){
            $joinQuery .= " INNER JOIN ec_exam_registration eer ON
                            eer.id = eerb.ec_exam_registration_id AND 
                            eer.trashed IS NULL
                        INNER JOIN ec_exam_registration eerp ON
                            eerp.id = eer.properties->>'$.parentExamRegistrationId' AND 
                            eerp.trashed IS NULL
                        INNER JOIN ec_exam_registration_batch eerbParent ON
                            eerbParent.ec_exam_registration_id = eerp.id  AND 
                            eerbParent.groups_id = eerb.groups_id
                        INNER JOIN ec_exam_registration_subject eers ON     
                            eers.ec_exam_registration_batch_id = eerbParent.id ";
        }
        else{
            $joinQuery .= " INNER JOIN ec_exam_registration eer ON
                            eer.id = eerb.ec_exam_registration_id AND 
                            eer.trashed IS NULL
                        INNER JOIN ec_exam_registration_subject eers ON     
                            eers.ec_exam_registration_batch_id = eerb.id ";
        }
        $query = "SELECT
            eers.id,
            eers.am_assessment_id,
            eerb.groups_id,
            eerb.ec_exam_registration_id,
            eers.ec_exam_registration_batch_id,
            eers.cm_academic_paper_subjects_id,
            eer.name as examRegistrationName,
            oe.id AS onlineExamId,
            IF(
                eers.valuation_details IS NULL ,
                JSON_SET(JSON_OBJECT(), '$.staffIds', '', '$.departmentIds', '','$.valuationDates', ''),
                eers.valuation_details
            ) AS valuation_details,
            aa.name AS assessmentName,
            g.name AS groupName,
            s.name AS subjectDesc,
            s.code AS subjectName,
            aa.properties_value ->>'$.assessmentDate' AS assessmentDate,
            caps.properties ->> '$.syllabusName' AS syllabusName,
            caps.properties->>'$.subjectPriority' AS subjectPriority,
            g.properties->>'$.description' AS groupDescription,
            act.id as academicTermId,
            act.name as academicTermName,
            ct.course_Type as courseType
        FROM
            ec_exam_registration_batch eerb
        $joinQuery
        INNER JOIN  academic_term act ON 
            act.id = CAST(eerb.properties ->> '$.academicTermId'AS CHAR) AND act.type = 'SEMESTER'
        INNER JOIN `groups` g ON
            g.id = eerb.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 am_assessment aa ON
            aa.id = eers.am_assessment_id
        INNER JOIN oe_exams oe ON
            oe.identifying_context ->> '$.assessmentId' = aa.id AND oe.is_deleted = 0
        INNER JOIN cm_academic_paper_subjects caps ON
            caps.id = eers.cm_academic_paper_subjects_id
        INNER JOIN v4_ams_subject s ON
            s.id = caps.ams_subject_id 
        WHERE
            g.trashed IS NULL";
        try {
            $assementExaminers = $this->executeQueryForList($query.$whereQuery.$limitQuery.$orderBy, $this->mapper[ExamRegistrationSubjectServiceMapper::SEARCH_ASSESSMENT_EXAMINER]);
        } catch (\Exception $e) {
            throw new ExamControllerException(ExamControllerException::ERROR_FETCHING_EXAM_REGISTRATION_FEE,"Cannot fetch Exam Registration Batch details! Please try again.");
        }
        $assignedSubjects = [];
        $digitalValuationProperties = CommonService::getInstance()->getSettings(SettingsConstents::EXAM_CONTROLLER, SettingsConstents::DIGITAL_VALUATION_PROPERTIES);
        $digitalValuationProperties = $digitalValuationProperties ? json_decode($digitalValuationProperties) : "";
        foreach ($assementExaminers as $assementExaminer) {
            $assementExaminer->valuers = [];
            $assementExaminer->reviewers = [];
            $assementExaminer->valuerIds = [];
            $assementExaminer->reviewerIds = [];
            $assementExaminer->valuationDetails->staffIds = empty($assementExaminer->valuationDetails->staffIds) ? [] : $assementExaminer->valuationDetails->staffIds;
            $assementExaminer->valuationDetails->valuationDates = empty($assementExaminer->valuationDetails->valuationDates) ? [] : $assementExaminer->valuationDetails->valuationDates;
            $assementExaminer->valuationDetails->valuationStaffs = empty($assementExaminer->valuationDetails->valuationStaffs) ? [] : $assementExaminer->valuationDetails->valuationStaffs;
            $assementExaminer->valuationDetails->reValuationDates = empty($assementExaminer->valuationDetails->reValuationDates) ? [] : $assementExaminer->valuationDetails->reValuationDates;  
            $assementExaminer->valuationDetails->reValuationStaffs = empty($assementExaminer->valuationDetails->reValuationStaffs) ? [] : $assementExaminer->valuationDetails->reValuationStaffs;
            if (!empty($assementExaminer->valuationDetails->valuationStaffs)) {
                foreach ($assementExaminer->valuationDetails->valuationStaffs as $valuationStaff) {
                    if($valuationStaff->count == '1'){
                        $assementExaminer->addiitonalExamninersNames = empty($valuationStaff->addiitonalExamniners) ?  [] : StaffService::getInstance()->getStaffByIds($valuationStaff->addiitonalExamniners);
                        foreach($assementExaminer->addiitonalExamninersNames as $staffName){
                            $valuationDate = reset(array_filter($assementExaminer->valuationDetails->valuationDates ,function($value)use($valuationStaff,$staffName){
                                return $value->count == $valuationStaff->count && $value->staffId == $staffName->id;
                            }));
                            if(!empty($valuationDate)){
                                $staffName->startDate = $valuationDate->startDate;
                                $staffName->endDate = $valuationDate->endDate;
                                $staffName->alreadyUpdated = $valuationDate->startDate ? 1 : 0;
                                $staffName->noOfStudentsAssigned = $valuationDate->noOfStudentsAssigned ? $valuationDate->noOfStudentsAssigned : 0;
                            }
                            else{
                                $staffName->startDate = "";
                                $staffName->endDate = "";
                                $staffName->alreadyUpdated = 0;
                                $staffName->noOfStudentsAssigned = 0;
                            }
                        }
                    }
                }  
            }
            if(!empty($assementExaminer->addiitonalExamninersNames)){
                $assignedSubjects[$assementExaminer->subjectCode] = empty($assignedSubjects[$assementExaminer->subjectCode]) ? $assementExaminer : $assignedSubjects[$assementExaminer->subjectCode];
                $assignedSubjects[$assementExaminer->subjectCode]->examRegSubIds[] = $assementExaminer->id;
                $assignedSubjects[$assementExaminer->subjectCode]->paperSubjectIds[$assementExaminer->paperSubjectId] = $assementExaminer->paperSubjectId;
            }
        }
        foreach($assignedSubjects as $subject){
            $subject->code = $subject->subjectCode ;
            $subject->name = $subject->subjectName ;
            $subject->paperSubjectIds = array_values($subject->paperSubjectIds);
            $studentCountRequest = new \stdClass;
            $studentCountRequest->examRegistrationId = $subject->examRegistrationId;
            $studentCountRequest->paperIdArray = $subject->paperSubjectIds;
            $subject->studentCount = CommonExamService::getInstance()->getStudentCountForPaperSubjects($studentCountRequest);
            $studentCount = floor($subject->studentCount / count($subject->addiitonalExamninersNames));
            $remainingStudentCount = $subject->studentCount  - ($studentCount * count($subject->addiitonalExamninersNames));
            foreach($subject->addiitonalExamninersNames as $staffName){
                if(empty($staffName->noOfStudentsAssigned)){
                    $staffName->noOfStudentsAssigned =  $studentCount + ($remainingStudentCount ? 1:0);
                    $remainingStudentCount = $remainingStudentCount ? $remainingStudentCount - 1 : 0;
                }
                $staffName->noOfDays = ceil($staffName->noOfStudentsAssigned / $digitalValuationProperties->noOfValScriptsPerDay) + ($digitalValuationProperties->noOfDaysInBufferForValuer);
            }
        }
        return array_values($assignedSubjects);
    }
     /**
     * Get Exam Registration Assessment  reviewer 
     * @param @request
     * @return Subjects
     */
    public function getReviewerDetailsForDigitalValuationProcedure($request){
        $request = $this->realEscapeObject($request);
        $assignedSubjects = [];
        $whereQuery = "";
        $limitQuery = "";
        $joinQuery = "";
        $orderBy = " ORDER BY s.code ASC";
        if(!empty($request->assessmentId)) {
            $whereQuery .= " AND eers.am_assessment_id = '$request->assessmentId'";
        }
        if(!empty($request->assessmentDate)) {
            $whereQuery .= " AND aa.properties_value ->>'$.assessmentDate' = '$request->assessmentDate'";
        }
        if(!empty($request->academicPaperSubjectId)) {
            $academicPaperSubjectIdString = is_array($request->academicPaperSubjectId) ? "'" . implode("','",$request->academicPaperSubjectId) . "'" : "'".$request->academicPaperSubjectId."'";
            $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ( $academicPaperSubjectIdString )";
        }
        if(!empty($request->examTime)) {
            $whereQuery .= " AND CONCAT(TIME_FORMAT(aa.properties_value->>'$.startTime', '%l:%i %p'),' - ',TIME_FORMAT(aa.properties_value->>'$.endTime', '%l:%i %p')) = '$request->examTime'";
        }
        if(!empty($request->groupId)) {
            $whereQuery .= " AND g.id = '$request->groupId'";
        }
        if(!empty($request->courseTypeId)) {
            $whereQuery .= " AND p.course_type_id = '$request->courseTypeId'";
        }
        if(!empty($request->academicTermId)) {
            $whereQuery .= " AND CAST(eerb.properties ->> '$.academicTermId'AS CHAR) = '$request->academicTermId'";
        }
        if(!empty($request->examRegistrationId)) {
            $whereQuery .= " AND eerb.ec_exam_registration_id = '$request->examRegistrationId'";
        }
        if($request->examType == ExamRegistrationTypeConstants::REVALUATION){
            $joinQuery .= " INNER JOIN ec_exam_registration eer ON
                            eer.id = eerb.ec_exam_registration_id AND 
                            eer.trashed IS NULL
                        INNER JOIN ec_exam_registration eerp ON
                            eerp.id = eer.properties->>'$.parentExamRegistrationId' AND 
                            eerp.trashed IS NULL
                        INNER JOIN ec_exam_registration_batch eerbParent ON
                            eerbParent.ec_exam_registration_id = eerp.id  AND 
                            eerbParent.groups_id = eerb.groups_id
                        INNER JOIN ec_exam_registration_subject eers ON     
                            eers.ec_exam_registration_batch_id = eerbParent.id ";
        }
        else{
            $joinQuery .= " INNER JOIN ec_exam_registration eer ON
                            eer.id = eerb.ec_exam_registration_id AND 
                            eer.trashed IS NULL
                        INNER JOIN ec_exam_registration_subject eers ON     
                            eers.ec_exam_registration_batch_id = eerb.id ";
        }
        $query = "SELECT
            eers.id,
            eers.am_assessment_id,
            eerb.groups_id,
            eerb.ec_exam_registration_id,
            eers.ec_exam_registration_batch_id,
            eers.cm_academic_paper_subjects_id,
            eer.name as examRegistrationName,
            oe.id AS onlineExamId,
            IF(
                eers.valuation_details IS NULL ,
                JSON_SET(JSON_OBJECT(), '$.staffIds', '', '$.departmentIds', '','$.valuationDates', ''),
                eers.valuation_details
            ) AS valuation_details,
            aa.name AS assessmentName,
            g.name AS groupName,
            s.name AS subjectDesc,
            s.code AS subjectName,
            aa.properties_value ->>'$.assessmentDate' AS assessmentDate,
            caps.properties ->> '$.syllabusName' AS syllabusName,
            caps.properties->>'$.subjectPriority' AS subjectPriority,
            g.properties->>'$.description' AS groupDescription,
            act.id as academicTermId,
            act.name as academicTermName
        FROM
            ec_exam_registration_batch eerb
        $joinQuery
        INNER JOIN  academic_term act ON 
            act.id = CAST(eerb.properties ->> '$.academicTermId'AS CHAR) AND act.type = 'SEMESTER'
        INNER JOIN `groups` g ON
            g.id = eerb.groups_id
        INNER JOIN program p 
            ON p.id  = g.properties->>'$.programId'
        INNER JOIN am_assessment aa ON
            aa.id = eers.am_assessment_id
        INNER JOIN oe_exams oe ON
            oe.identifying_context ->> '$.assessmentId' = aa.id AND oe.is_deleted = 0
        INNER JOIN cm_academic_paper_subjects caps ON
            caps.id = eers.cm_academic_paper_subjects_id
        INNER JOIN v4_ams_subject s ON
            s.id = caps.ams_subject_id 
        WHERE
            g.trashed IS NULL";
        try {
            $assementExaminers = $this->executeQueryForList($query.$whereQuery.$limitQuery.$orderBy, $this->mapper[ExamRegistrationSubjectServiceMapper::SEARCH_ASSESSMENT_EXAMINER]);
        } catch (\Exception $e) {
            throw new ExamControllerException(ExamControllerException::ERROR_FETCHING_EXAM_REGISTRATION_FEE,"Cannot fetch Exam Registration Batch details! Please try again.");
        }
        $assignedSubjects = [];
        foreach ($assementExaminers as $assementExaminer) {
            $assementExaminer->valuers = [];
            $assementExaminer->reviewers = [];
            $assementExaminer->valuerIds = [];
            $assementExaminer->reviewerIds = [];
            $assementExaminer->valuationDetails->staffIds = empty($assementExaminer->valuationDetails->staffIds) ? [] : $assementExaminer->valuationDetails->staffIds;
            $assementExaminer->valuationDetails->valuationDates = empty($assementExaminer->valuationDetails->valuationDates) ? [] : $assementExaminer->valuationDetails->valuationDates;
            $assementExaminer->valuationDetails->valuationStaffs = empty($assementExaminer->valuationDetails->valuationStaffs) ? [] : $assementExaminer->valuationDetails->valuationStaffs;
            $assementExaminer->valuationDetails->reValuationDates = empty($assementExaminer->valuationDetails->reValuationDates) ? [] : $assementExaminer->valuationDetails->reValuationDates;  
            $assementExaminer->valuationDetails->reValuationStaffs = empty($assementExaminer->valuationDetails->reValuationStaffs) ? [] : $assementExaminer->valuationDetails->reValuationStaffs;
            if (!empty($assementExaminer->valuationDetails->valuationStaffs)) {
                foreach ($assementExaminer->valuationDetails->valuationStaffs as $valuationStaff) {
                    $assementExaminer->staffIds = [];
                    $addiitonalExamninersNames = empty($valuationStaff->addiitonalExamniners) ?  [] : StaffService::getInstance()->getStaffByIds($valuationStaff->addiitonalExamniners);
                    if($valuationStaff->count == '1'){
                        $assementExaminer->valuers = $addiitonalExamninersNames;
                        $assementExaminer->valuerIds = $valuationStaff->addiitonalExamniners;
                    }
                    if($valuationStaff->count == '2'){
                        $assementExaminer->addiitonalExamninersNames = empty($valuationStaff->addiitonalExamniners) ?  [] : StaffService::getInstance()->getStaffByIds($valuationStaff->addiitonalExamniners);
                        foreach($assementExaminer->addiitonalExamninersNames as $staffName){
                            $valuationDate = reset(array_filter($assementExaminer->valuationDetails->valuationDates ,function($value)use($valuationStaff,$staffName){
                                return $value->count == $valuationStaff->count && $value->staffId == $staffName->id;
                            }));
                            $otherValuationDates = array_filter($assementExaminer->valuationDetails->valuationDates ,function($value)use($valuationStaff,$staffName){
                                return $value->count == $valuationStaff->count && $value->staffId != $staffName->id;
                            });
                            $staffName->viewerIds = $valuationDate->viewerIds ? $valuationDate->viewerIds : []; 
                            $staffName->viewerNames = empty($staffName->viewerIds) ?  [] : StaffService::getInstance()->getStaffByIds($staffName->viewerIds);
                            $removedViewerIds = [];
                            foreach($otherValuationDates as $valuationDate){
                                foreach($valuationDate->viewerIds as $viewerId){
                                    $removedViewerIds[] = $viewerId;
                                }
                            }
                            $staffName->availableViewerIds = array_diff ($assementExaminer->valuerIds,$removedViewerIds);
                            $staffName->availableViewers = empty($staffName->availableViewerIds) ?  [] : StaffService::getInstance()->getStaffByIds($staffName->availableViewerIds);
                            foreach($staffName->availableViewers as $availableViewer){
                                $availableViewer->isMapped = (in_array($availableViewer->id,$staffName->viewerIds)) ? 1 : 0;
                            }
                        }
                    }
                }  
            }
            if(!empty($assementExaminer->addiitonalExamninersNames)){
                $assignedSubjects[$assementExaminer->subjectCode] = empty($assignedSubjects[$assementExaminer->subjectCode]) ? $assementExaminer : $assignedSubjects[$assementExaminer->subjectCode];
                $assignedSubjects[$assementExaminer->subjectCode]->examRegSubIds[] = $assementExaminer->id;
                $assignedSubjects[$assementExaminer->subjectCode]->paperSubjectIds[$assementExaminer->paperSubjectId] = $assementExaminer->paperSubjectId;
            }
        }
        foreach($assignedSubjects as $subject){
            $subject->code = $subject->subjectCode ;
            $subject->name = $subject->subjectName ;
            $subject->paperSubjectIds = array_values($subject->paperSubjectIds);
        }
        return array_values($assignedSubjects);
    }
    /**
     * get Student Details For Paper Subject Revaluation
     * @param request $request
     */
    public function getStudentDetailsForPaperSubjectsRevaluation($request){
        try {
            $paperId = is_array($request->paperIdArray) ? "'" . implode("','",$request->paperIdArray) . "'" : "'".$request->academicPaperSubjectId."'";
            $query = "SELECT DISTINCT
                    esar.id as id,
                     esar.student_id as studentId,
                     esar.am_assessment_id as assessmentId,
                     esar.identifying_context ->> '$.revaluationType' revaluationType,
                     esar.valuation_details as valuationDetails,
                     esarp.valuation_details as parentValuationDetails
                    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 
                    INNER JOIN ec_student_assessment_registration esarp ON
                        esarp.student_id = esar.student_id AND
                        esarp.am_assessment_id = esar.am_assessment_id AND
                        esarp.ec_exam_registration_type = eer2.type AND
                        CAST(esarp.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED'
                WHERE
                    esar.ec_exam_registration_type = eer.type AND
                    eers2.am_assessment_id = esar.am_assessment_id AND 
                    CAST(esar.properties ->> '$.registrationStatus' AS CHAR) = 'REGISTERED' AND 
                    CAST(esar.properties ->> '$.feeStatus' AS CHAR) = 'PAID' AND
                    CAST(esar.identifying_context ->> '$.revaluationType' AS CHAR) ='$request->revaluationType' AND
                    eerb.ec_exam_registration_id='$request->examRegistrationId' AND 
                    eers2.cm_academic_paper_subjects_id IN ($paperId)";
            $students = $this->executeQueryForList($query);
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $students;
    }
    public function getExamregistrationSubjectListDetails($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $searchRequest->academicPaperSubjectId = stripslashes($searchRequest->academicPaperSubjectId);
        $searchRequest->assessmentId = stripslashes($searchRequest->assessmentId); 
        try {
            $whereQuery = "";
            if(!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','",$searchRequest->groupId) . "'" : "'".$searchRequest->groupId."'";
                $whereQuery .= " AND eerb.groups_id IN ( $groupIdString )";
            }
            if(!empty($searchRequest->examRegistrationId)) {
                $examRegistrationIdString = is_array($searchRequest->examRegistrationId) ? "'" . implode("','",$searchRequest->examRegistrationId) . "'" : "'".$searchRequest->examRegistrationId."'";
                $whereQuery .= " AND eerb.ec_exam_registration_id IN ( $examRegistrationIdString )";
            }
            if(!empty($searchRequest->academicPaperSubjectId)) {
                $academicPaperSubjectIdString = is_array($searchRequest->academicPaperSubjectId) ? "'" . implode("','",$searchRequest->academicPaperSubjectId) . "'" : "'".$searchRequest->academicPaperSubjectId."'";
                $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ( $academicPaperSubjectIdString )";
            }
            if(!empty($searchRequest->academicPaperSubjectIds)) {
                $academicPaperSubjectIdsString = is_array($searchRequest->academicPaperSubjectIds) ? "'" . implode("','",$searchRequest->academicPaperSubjectIds) . "'" : "'".$searchRequest->academicPaperSubjectIds."'";
                $whereQuery .= " AND eers.cm_academic_paper_subjects_id IN ( $academicPaperSubjectIdsString )";
            }
            if(!empty($searchRequest->assessmentId)) {
                $whereQuery .= " AND eers.am_assessment_id IN ( '$searchRequest->assessmentId' )";
            }
            if(!empty($searchRequest->assessmentIds)) {
                $assessmentIdsString = is_array($searchRequest->assessmentIds) ? "'" . implode("','",$searchRequest->assessmentIds) . "'" : "'".$searchRequest->assessmentIds."'";
                $whereQuery .= " AND eers.am_assessment_id IN ( $assessmentIdsString )";
            }
            if(!empty($searchRequest->examRegistrationBatchId)) {
                $examRegistrationBatchIdString = is_array($searchRequest->examRegistrationBatchId) ? "'" . implode("','",$searchRequest->examRegistrationBatchId) . "'" : "'".$searchRequest->examRegistrationBatchId."'";
                $whereQuery .= " AND eerb.id IN ( $examRegistrationBatchIdString )";
            }
            $query = "SELECT DISTINCT
                        eer.id as examRegistrationId,
                        eer.name as examRegistrationName,
                        eer.type as examRegistrationType,
                        eers.am_assessment_id as assessmentId,
                        eer.properties ->> '$.examDate' as examDate,
                        aps.properties ->> '$.externalMaxMark' as maximumSubjectMark,
                        eers.valuation_details as valuationDetails,
                        s.code as subjectCode,
                        s.name as subjectName,
                        IF(aps.properties ->> '$.classType' = 'THEORY',1,0) AS isTheory,
                        g.name as groupName,
                        g.id as groupId,
                        ct.course_Type as courseType
                    FROM
                        ec_exam_registration_subject eers
                    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
                    INNER JOIN `groups` g ON
                        g.id = eerb.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  cm_academic_paper_subjects aps ON 
                        aps.id = eers.cm_academic_paper_subjects_id
                    INNER JOIN  v4_ams_subject s ON 
                        s.id = aps.ams_subject_id
                    WHERE
                       1 = 1 ";
            $subjectDetails  = $this->executeQueryForList($query.$whereQuery);
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * get All Subject Details By Exam Registration ID
     * @param ExamRegistrationId $examRegistrationId
     * @return $subjectDetails
     */
    public function getSubjectForValuationReports($request)
    {
        $request = $this->realEscapeObject($request);
        $query = "";
        $subjectDetails = [];
        $whereQuery = "";
        try 
        { 
            if(!empty($request->departmentIds)) {
                $departmentIds = is_array($request->departmentIds) ? "'" . implode("','",$request->departmentIds) . "'" : "'".$request->departmentIds."'";
                $whereQuery .= " AND s.department_id IN ( $departmentIds )";
            }
            $query = "SELECT
                    DISTINCT(aps.id) as id,
                    aps.id as academicPaperSubjectId,
                    s.id as subjectId,
                    s.code as subjectCode,
                    s.name as subjectName,
                    oe.id as onlineExamId,
                    eers.am_assessment_id as assessmentId,
                    oe.settings ->> '$.isValidated' AS isValidated,
                    aps.properties ->> '$.syllabusName' AS syllabusName,
                    IF(aps.properties ->> '$.classType' LIKE '%THEORY%',1,0) AS isTheory,
                    aps.properties ->> '$.externalMaxMark' as externalMaxMark,
                    eers.valuation_details as valuationDetails,
                    eerb.ec_exam_registration_id as examRegistrationId,
                    eqc.qpCode,
                    ct.course_Type as courseType
                FROM
                    ec_exam_registration_subject eers
                INNER JOIN ec_exam_registration_batch eerb ON
                    eerb.id = eers.ec_exam_registration_batch_id
                INNER JOIN  cm_academic_paper_subjects aps ON 
                    aps.id = eers.cm_academic_paper_subjects_id
                INNER JOIN am_assessment aa ON
                    aa.id = eers.am_assessment_id
                INNER JOIN oe_exams oe ON
                    oe.assessment_id = eers.am_assessment_id AND oe.is_deleted = 0
                INNER JOIN  v4_ams_subject s ON 
                    s.id = aps.ams_subject_id
                INNER JOIN `groups` g ON
                    g.id = eerb.groups_id
                INNER JOIN program p 
                    ON p.id  = g.properties->>'$.programId'
                INNER JOIN `course_type` ct ON
                    ct.courseTypeID = p.course_type_id
                LEFT JOIN examQpCodes eqc ON
                    eqc.cm_academic_paper_subjects_id =  eers.cm_academic_paper_subjects_id AND eqc.ec_exam_registration_id = eerb.ec_exam_registration_id
                WHERE
                    eerb.ec_exam_registration_id='$request->examRegistrationId";
            $subjects = $this->executeQueryForList($query.$whereQuery);
            $subjectArray = [];
            foreach($subjects as $subject){
                if( $subjectArray[$subject->subjectId]){
                    $subjectArray[$subject->subjectId]->subjectIdArr[] = $subject->academicPaperSubjectId;
                }
                else{
                    $subject->subjectIdArr[] = $subject->academicPaperSubjectId;
                    $subjectArray[$subject->subjectId] = $subject;
                }
            }
            $subjectDetails = array_values($subjectArray);;
        }
        catch (\Exception $e)
        {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
    /**
     * get subjects for Remuneration Bill
     * @param  $searchRequest
     * @return $subjects
     */
    public function getSubjectsForRemunerationBill($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $whereQuery = "";
        if(!$searchRequest->staffId){
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Faculty ID is required");
        }
        if(!$searchRequest->examYear || !$searchRequest->examMonth){
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Exam month & year is required");
        }
        $orderBy = " ORDER BY vas.code";
        $whereQuery .= " AND oe.`type` ='EXAM_CONTROLLER' AND oec.revaluation_id IS NULL AND oe.assessment_id IS NOT NULL AND oec.is_confirmed =1 AND (oe.properties ->> '$.isMockExam' != 'true' OR oe.properties ->> '$.isMockExam' is null)";
        $whereQuery .= " AND oec.created_by IN ($searchRequest->staffId";    
        $whereQuery .= " AND eer.properties->>'$.examMonth' IN ($searchRequest->examMonth) AND eer.properties->>'$.examYear' IN ($searchRequest->examYear)";
        $sql = "SELECT DISTINCT vas.id AS id,vas.code AS subjectCode,vas.name AS subjectName  FROM oe_exam_marks_confirm oec
                INNER JOIN oe_exams oe ON oe.id = oec.oe_exams_id  
                INNER JOIN am_assessment aa ON aa.id = oe.assessment_id
                INNER JOIN ec_exam_registration_subject eers ON eers.am_assessment_id = aa.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 
                INNER JOIN cm_academic_paper_subjects caps ON caps.id = eers.cm_academic_paper_subjects_id 
                INNER JOIN v4_ams_subject vas ON vas.id = caps.ams_subject_id 
                WHERE 1=1";
        try {
            $subjects = $this->executeQueryForList($sql.$whereQuery.$orderBy);
            return $subjects;
        } 
        catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
    }
    /**
     * get staff subject mark confirmed details for Remuneration Bill
     * @param  $searchRequest
     * @return $subjectDetails
     */
    public function getStaffConfirmedMarksSubjectDetailsForRemunerationBill($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $whereQuery = "";
        if(!$searchRequest->staffId){
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Faculty ID is required");
        }
        if(!$searchRequest->examYear || !$searchRequest->examMonth){
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Exam month & year is required");
        }
        if(!$searchRequest->subjectId){
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Subject ID is required");
        }
        $orderBy = " ORDER BY eer.id";
        $whereQuery .= " AND oe.`type` ='EXAM_CONTROLLER' AND oec.revaluation_id IS NULL AND oe.assessment_id IS NOT NULL AND oec.is_confirmed =1 AND (oe.properties ->> '$.isMockExam' != 'true' OR oe.properties ->> '$.isMockExam' is null)";
        $whereQuery .= " AND oec.created_by IN ($searchRequest->staffId";    
        $whereQuery .= " AND eer.properties->>'$.examMonth' IN ($searchRequest->examMonth) AND eer.properties->>'$.examYear' IN ($searchRequest->examYear)";
        $whereQuery .= " AND vas.id IN ($searchRequest->subjectId)";
        
        $sql = "SELECT DISTINCT eer.id AS examRegistrationId,eer.name AS examRegName,eqc.qpCode,vas.id AS subjectId,vas.code AS subjectCode,vas.name AS subjectName,oec.oe_users_id AS studentId  FROM oe_exam_marks_confirm oec
                INNER JOIN oe_exams oe ON oe.id = oec.oe_exams_id  
                INNER JOIN am_assessment aa ON aa.id = oe.assessment_id
                INNER JOIN ec_exam_registration_subject eers ON eers.am_assessment_id = aa.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 
                INNER JOIN cm_academic_paper_subjects caps ON caps.id = eers.cm_academic_paper_subjects_id 
                INNER JOIN v4_ams_subject vas ON vas.id = caps.ams_subject_id 
                LEFT JOIN examQpCodes eqc ON eqc.cm_academic_paper_subjects_id = caps.id AND eqc.ec_exam_registration_id = eer.id
                WHERE 1=1";
        try {
            $subjectDetails = $this->executeQueryForList($sql.$whereQuery.$orderBy);
            return $subjectDetails;
        } 
        catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
    }
        /**
     * get subject assigned details for Remuneration Bill
     * @param  $searchRequest
     * @return $studentDetails
     */
    public function getSubjectAssignedStudentDetailsForRemunerationBill($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        $whereQuery = "";
        if(!$searchRequest->examYear || !$searchRequest->examMonth){
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Exam month & year is required");
        }
        if(!$searchRequest->subjectId){
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Subject ID is required");
        }
        $orderBy = " ORDER BY eer.id,esar.student_id";
        $whereQuery .= " AND eer.`type`IN ('REGULAR','SUPPLEMENTARY')"; 
        $whereQuery .= " AND eer.properties->>'$.examMonth' IN ($searchRequest->examMonth) AND eer.properties->>'$.examYear' IN ($searchRequest->examYear)";
        $whereQuery .= " AND vas.id IN ($searchRequest->subjectId)";
        
        $sql = "SELECT DISTINCT eer.id AS examRegistrationId,vas.id AS subjectId,esar.student_id,esar.valuation_details 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 
                INNER JOIN cm_academic_paper_subjects caps ON caps.id = eers.cm_academic_paper_subjects_id 
                INNER JOIN v4_ams_subject vas ON vas.id = caps.ams_subject_id 
                WHERE 1=1";
        try {
            $studentDetails = $this->executeQueryForList($sql.$whereQuery.$orderBy);
            return $studentDetails;
        } 
        catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
    }
}