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 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 223
SubjectGroupMappingService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 9
1892.00
0.00% covered (danger)
0.00%
0 / 223
 saveSubjectGroupMapping
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 23
 validateSaveSubjectGroupMapping
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 3
 insertSubjectGroupMapping
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 17
 updateSubjectGroupMapping
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 18
 deleteSubjectGroupMapping
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 18
 getAllSubjectDetails
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 68
 getSubjectGroupMapping
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 19
 getAllSubjectGroups
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 15
 getSubjectGroupSubjectsByRequest
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 42
<?php
namespace com\linways\ec\core\service;
use com\linways\base\util\MakeSingletonTrait;
use com\linways\base\util\SecurityUtils;
use com\linways\ec\core\constant\StatusConstants;
use com\linways\ec\core\exception\ExamControllerException;
class SubjectGroupMappingService extends BaseService{
    use MakeSingletonTrait;
    
    /**
     * Save Subject group Mapping
     * @param $saveSubjectGroupArray
     * @return $id
     */
    public function saveSubjectGroupMapping($saveSubjectGroupArray){
        $saveSubjectGroupArray = $this->realEscapeArray($saveSubjectGroupArray);
        foreach($saveSubjectGroupArray as $saveSubjectGroup){
            $saveSubjectGroup->createdBy = $GLOBALS['userId'] ?? $saveSubjectGroup->createdBy;
            $saveSubjectGroup->updatedBy = $GLOBALS['userId'] ?? $saveSubjectGroup->updatedBy;
            try {
                $this->validateSaveSubjectGroupMapping($saveSubjectGroup);
                if (!empty($saveSubjectGroup->id)) {
                    $saveSubjectGroup->id = $this->updateSubjectGroupMapping($saveSubjectGroup);
                } else {
                    $saveSubjectGroup->id = $this->insertSubjectGroupMapping($saveSubjectGroup);
                }
                
            } catch (\Exception $e) {
                
                if ($e->getCode() !== ExamControllerException::INVALID_PARAMETERS && $e->getCode() !== ExamControllerException::EMPTY_PARAMETERS && $e->getCode() !== "DUPLICATE_ENTRY") {
                    throw new ExamControllerException($e->getCode(), "Failed to save subject group! Please try again");
                } else if ($e->getCode() === ExamControllerException::DUPLICATE_ENTRY) {
                    throw new ExamControllerException(ExamControllerException::DUPLICATE_ENTRY, "Cannot assign subject group.This subject group  already assign in this batch");
                } else {
                    throw new ExamControllerException($e->getCode(), $e->getMessage());
                }
            }
        }
        return true;
    }
    /**
     * validate Save Subject Group Mapping
     * @param $saveSubjectGroup
     * @return NULL
     */
    private function validateSaveSubjectGroupMapping($saveSubjectGroup){
        if (empty($saveSubjectGroup->groupId) || empty($saveSubjectGroup->academicPaperSubjectId) || empty($saveSubjectGroup->subjectGroupId))
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS, " empty parameter. can't save subject group! ");
    }
    /**
     * insert Subject Group Mapping
     * @param $saveSubjectGroup
     * @return  $id
     */
    private function insertSubjectGroupMapping($saveSubjectGroup){
        $properties = !empty($saveSubjectGroup->properties) ? "'" . json_encode($saveSubjectGroup->properties) . "'" : "NULL";
        $query = "INSERT INTO ec_subject_group_paper_subject_mapping
                  (groups_id,cm_academic_paper_subjects_id,subject_groups_id,properties,created_by,updated_by)
                  VALUES
                  ('$saveSubjectGroup->groupId','$saveSubjectGroup->academicPaperSubjectId','$saveSubjectGroup->subjectGroupId',$properties,'$saveSubjectGroup->createdBy','$saveSubjectGroup->updatedBy')
                  ON DUPLICATE KEY
                    UPDATE
                  updated_by = VALUES(created_by),
                  subject_groups_id = VALUES(subject_groups_id),
                  properties = VALUES(properties)";
        try {
            $saveSubjectGroup->id = $this->executeQuery($query,true)->id;
            return $saveSubjectGroup->id;
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * update Subject Group Mapping
     * @param  $saveSubjectGroup
     * @return $saveSubjectGroup->id
     */
    private function updateSubjectGroupMapping($saveSubjectGroup){
        $properties = !empty($saveSubjectGroup->properties) ? "'".json_encode($saveSubjectGroup->properties)."'" : "NULL";
        $query = "UPDATE
                    ec_subject_group_paper_subject_mapping
                SET
                    groups_id = '$saveSubjectGroup->groupId',
                    cm_academic_paper_subjects_id = '$saveSubjectGroup->academicPaperSubjectId',
                    subject_groups_id = '$saveSubjectGroup->subjectGroupId',
                    properties = $properties,
                    updated_by = '$saveSubjectGroup->updatedBy'
                WHERE
                    id = '$saveSubjectGroup->id'";
        try {
            $this->executeQuery($query);
            return $saveSubjectGroup->id;
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(), $e->getMessage());
        }
    }
     /**
     * Delete Subject Group Mapping
     * @param String $id
     * @return NULL
     */
    public function deleteSubjectGroupMapping($id){
        $id = $this->realEscapeString($id);
        $staffId = $GLOBALS['userId'];
        $subjectGroupMapping = new \stdClass();
        $subjectGroupMapping->id = $id;
        $currentSubjectGroupMapping = reset($this->getSubjectGroupMapping($subjectGroupMapping));
        if(empty($currentSubjectGroupMapping)){
            throw new ExamControllerException(ExamControllerException::EMPTY_PARAMETERS,"Can't delete ! subject group missing.");
        }
        $query = "DELETE FROM
                    ec_subject_group_paper_subject_mapping
                WHERE
                    id = '$id'";
        try {
            $this->executeQuery($query);           
        }catch (\Exception $e) {
            throw new ExamControllerException(ExamControllerException::HAVE_RELATION,"Error deleting subject groups! Please try again");
        }
    }
    /**
     * get All Subject Details
     * @param $searchRequest 
     * @return $academicPapers 
     * @author Krishnajith
     */
    public function getAllSubjectDetails($searchRequest) {
        $academicPapers = [];
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $orderBy = " ORDER BY sub.name ASC";
            $whereQuery = "";
            if(!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','",$searchRequest->groupId) . "'" : "'".$searchRequest->groupId."'";
                $whereQuery .= " AND g.id IN ( $groupIdString )";
            }
            if(!empty($searchRequest->programId)) {
                $programIdString = is_array($searchRequest->programId) ? "'" . implode("','",$searchRequest->programId) . "'" : "'".$searchRequest->programId."'";
                $whereQuery .= " AND p.id IN ( $programIdString )";
            }
            if(!empty($searchRequest->academicTermId)) {
                $academicTermIdString = is_array($searchRequest->academicTermId) ? "'" . implode("','",$searchRequest->academicTermId) . "'" : "'".$searchRequest->academicTermId."'";
                $whereQuery .= " AND act.id IN ( $academicTermIdString )";
            }
            
            $query = "SELECT DISTINCT
                            g.id AS groupId,
                            g.name AS groupName,
                            g.properties ->>'$.programId'  AS programId,
                            aps.id AS academicPaperSubjectId,
                            aps.cm_academic_paper_id as academicPaperId,
                            ap.name as academicPaperName,
                            sub.id AS subjectId,
                            sub.name AS subjectName,
                            sub.code AS subjectCode,
                            act.name as academicTermName,
                            act.id as academicTermId,
                            esgpsm.id as subjectGroupMappingId,
                            esgpsm.subject_groups_id as subjectGroupId
                        FROM 
                            `groups` g
                        INNER JOIN `program` p 
                            ON p.id =  g.properties->>'$.programId'
                        INNER JOIN groups_relations gr ON 
                            gr.parent_groups_id = g.id
                        INNER JOIN `groups` sg ON 
                            sg.id = gr.child_groups_id AND sg.type = 'SUBJECT'
                        INNER JOIN cm_academic_paper_subjects aps ON 
                            aps.id = sg.paperSubjectId
                        INNER JOIN cm_academic_paper ap ON 
                            aps.cm_academic_paper_id = ap.id
                        INNER JOIN academic_term act ON
                            act.id = sg.academic_term_id 
                        INNER JOIN v4_ams_subject sub ON 
                            sub.id = aps.ams_subject_id
                        LEFT JOIN ec_subject_group_paper_subject_mapping esgpsm ON 
                            esgpsm.groups_id = g.id AND esgpsm.cm_academic_paper_subjects_id = aps.id
                        WHERE 1=1 ";
            $subjectDetails = $this->executeQueryForList($query.$whereQuery.$orderBy);
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        foreach($subjectDetails as $academicPaper){
            $academicPapers[$academicPaper->academicPaperId]->id = $academicPaper->academicPaperId;
            $academicPapers[$academicPaper->academicPaperId]->name = $academicPaper->academicPaperName;
            $academicPapers[$academicPaper->academicPaperId]->subjectGroupId = $academicPaper->subjectGroupId;
            $academicPapers[$academicPaper->academicPaperId]->subjects[$academicPaper->academicPaperSubjectId]= $academicPaper;
        }
        foreach($academicPapers as $academicPaper){
            $academicPaper->isExpand = false;
            $academicPaper->subjects = array_values($academicPaper->subjects);
        }
        $academicPapers = array_values($academicPapers);
        return $academicPapers;
    }
     /**
     * get all subject groups
     * @return $subjectGroups
     */
    public function getSubjectGroupMapping($searchRequest){
        $searchRequest = $this->realEscapeObject($searchRequest);
        if(!empty($searchRequest->id)) {
            $whereQuery .= " AND id = '$searchRequest->id";
        }
        try {
            $query = "SELECT
                            DISTINCT 
                            id,
                            groups_id,
                            cm_academic_paper_subjects_id,
                            subject_groups_id
                        FROM
                            ec_subject_group_paper_subject_mapping ";
            $subjectGroups =  $this->executeQueryForList($query);
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(), $e->getMessage());
        }
        return $subjectGroups;
    }
    /**
     * get all subject groups
     * @return $subjectGroups
     */
    public function getAllSubjectGroups(){
        try {
            $query = "SELECT
                            DISTINCT 
                            sg.id ,
                            sg.name,
                            sg.code,
                            sg.properties
                        FROM
                            subjectGroups sg ";
            $subjectGroups =  $this->executeQueryForList($query);
        } catch (\Exception $e) {
            throw new ExamControllerException($e->getCode(), $e->getMessage());
        }
        return $subjectGroups;
    }
    /**
     * get All Subject Details
     * @param $searchRequest 
     * @return $academicPapers 
     * @author Krishnajith
     */
    public function getSubjectGroupSubjectsByRequest($searchRequest) {
        $academicPapers = [];
        $searchRequest = $this->realEscapeObject($searchRequest);
        try{
            $whereQuery = "";
            if(!empty($searchRequest->groupId)) {
                $groupIdString = is_array($searchRequest->groupId) ? "'" . implode("','",$searchRequest->groupId) . "'" : "'".$searchRequest->groupId."'";
                $whereQuery .= " AND  esgpsm.groups_id IN ( $groupIdString )";
            }
            if(!empty($searchRequest->subjectCategoryCode)) {
                $whereQuery .= " AND sg.code = '$searchRequest->subjectCategoryCode'";
            }
            if(!empty($searchRequest->academicTermId)) {
                $academicTermIdString = is_array($searchRequest->academicTermId) ? "'" . implode("','",$searchRequest->academicTermId) . "'" : "'".$searchRequest->academicTermId."'";
                $whereQuery .= " AND eerb.academicTermId IN ( $academicTermIdString )";
            }
            
            $query = "SELECT 
                    esgpsm.id,
                    esgpsm.groups_id AS groupId,
                    esgpsm.cm_academic_paper_subjects_id AS paperSubjectId,
                    eerb.academicTermId,
                    esgpsm.subject_groups_id AS subjectGroupId
                FROM
                    ec_subject_group_paper_subject_mapping esgpsm  
                INNER JOIN subjectGroups sg ON
                    sg.id = esgpsm.subject_groups_id
                INNER JOIN ec_exam_registration_batch eerb ON 
                    eerb.groups_id = esgpsm.groups_id 
                INNER JOIN ec_exam_registration eer ON 
                    eer.id =eerb.ec_exam_registration_id 
                INNER JOIN ec_exam_registration_subject eers ON 
                    eers.cm_academic_paper_subjects_id = esgpsm .cm_academic_paper_subjects_id AND 
                    eers.ec_exam_registration_batch_id = eerb.id
                WHERE 
                    eer.`type` = 'REGULAR' AND
                    eer.trashed IS NULL";
            $subjectDetails = $this->executeQueryForList($query.$whereQuery);
        }
        catch (\Exception $e){
            throw new ExamControllerException($e->getCode(),$e->getMessage());
        }
        return $subjectDetails;
    }
}