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 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 140
CurriculumManageService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 5
1190.00
0.00% covered (danger)
0.00%
0 / 140
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 3
 __clone
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 getInstance
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 5
 getPossibleSchemaDetails
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 getSchemaDetails
0.00% covered (danger)
0.00%
0 / 1
812.00
0.00% covered (danger)
0.00%
0 / 122
<?php
namespace com\linways\core\ams\professional\service;
use com\linways\core\ams\professional\constant\GradeSchemaTypes;
use com\linways\core\ams\professional\dto\GradeSchemaBasedOnType;
use com\linways\core\ams\professional\exception\ProfessionalException;
use com\linways\core\ams\professional\mapper\CurriculumManageServiceMapper;
/**
 *
 * @Date 25/02/21
 */
class CurriculumManageService extends BaseService
{
    private $mapper = [];
    private $logger = null;
    /**
     * Presence of a static member variable
     *
     * @var null
     */
    private static $_instance = null;
    /**
     * Locked down the constructor or Prevent any outside instantiation of this class
     *
     * PermissionService constructor.
     */
    private function __construct()
    {
        $this->mapper = CurriculumManageServiceMapper::getInstance()->getMapper();
    }
    /**
     * Prevent any object or instance of that class to be cloned
     */
    private function __clone()
    {
    }
    /**
     * Have a single globally accessible static method
     *
     * @return CurriculumManageService|null
     */
    public static function getInstance()
    {
        if (!is_object(self::$_instance))
            self::$_instance = new self();
        return self::$_instance;
    }
    /**
     * returns theme configurations
     *
     * @throws ProfessionalException
     */
    public function getPossibleSchemaDetails(GradeSchemaBasedOnType $request)
    {
        try {
            $gradSchema = $this->getSchemaDetails($request);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $gradSchema;
    }
    public function getSchemaDetails(GradeSchemaBasedOnType $request)
    {
        $request = $this->realEscapeObject($request);
        $requestedGradeSchema = $request->type;
        switch ($request->type) {
            case GradeSchemaTypes::ACADEMIC_PAPER_SUBJECT:
                $joinGradeSchemeColumn = " caps.properties->>'$.gradeSchemeId' ";
                $columnNames = " caps.id";
                break;
            case GradeSchemaTypes::SYLLABUS_ACADEMIC_TERM:
                $joinGradeSchemeColumn = " vm.properties->>'$.semesterGradeSchema' ";
                $columnNames = " csats.academic_term_id";
                break;
            case GradeSchemaTypes::SYLLABUS:
                $joinGradeSchemeColumn = " vm.properties->>'$.syllabusGradeSchema' ";
                $columnNames = " cs.id";
                break;
            case GradeSchemaTypes::CURRICULUM:
                $joinGradeSchemeColumn = " vm.properties->>'$.cgpaGradeSchema' ";
                $columnNames = " cc.id";
                break;
        }
        $type = $request->type;
        $gradeSchemes = null;
        $gradeSchemesList =[];
        $requestIdList = $request->ids;
        try {
            do {
                if(count(array_filter($requestIdList))>0&&count(array_filter($request->ids))==0){
                    return $gradeSchemesList;
                }
                if(count(array_filter($request->termIds)) ==0 && count(array_filter($request->groupIds)) ==0 &&count(array_filter($request->ids)) ==0){
                    return $gradeSchemesList;
                }
                switch ($type) {
                    case GradeSchemaTypes::ACADEMIC_PAPER_SUBJECT:
                        break;
                    case GradeSchemaTypes::SYLLABUS_ACADEMIC_TERM:
                        $joinGradeSchema = "INNER JOIN valuation_method vm ON vm.identifying_context->>'$.syllabusAcademicTermSettingsId' = csats.id AND vm.type = '$type'";
                        break;
                    case GradeSchemaTypes::SYLLABUS:
                        $joinGradeSchema = "INNER JOIN valuation_method vm ON vm.identifying_context->>'$.syllabusId' = ccsr.cm_syllabus_id AND vm.type = '$type'";
                        break;
                    case GradeSchemaTypes::CURRICULUM:
                        $joinGradeSchema = "INNER JOIN valuation_method vm ON vm.identifying_context->>'$.curriculumId' = cc.id AND vm.type = '$type'";
                        $type = NULL;
                        break;
                    default:
                        return $gradeSchemesList;
                    break;
                }
                if($requestedGradeSchema==GradeSchemaTypes::ACADEMIC_PAPER_SUBJECT&&$type!=GradeSchemaTypes::ACADEMIC_PAPER_SUBJECT){
                    $joinGradeSchemeColumn = " vm.properties->>'$.subjectGradeSchemaId' ";
                }
                $sql = "SELECT DISTINCT
                gr.id  AS gradeId,
                gr.name AS gradeName,
                gr.range_from,
                gr.range_to,
                gr.properties->>'$.class' AS class,
                gr.properties->>'$.failStatus' AS failStatus,
                gr.properties->>'$.gradePoint' AS gradePoint,
                gr.properties->>'$.relativeScoreEquation' AS equation,
                gr.properties->>'$.relativeMark' AS relativeMarkPercentage,
                gr.properties,
                gs.type,
                gs.type as schemeType,
                gs.id as schemeId,
                gs.name as schemeName,
                $columnNames  AS requestId  from cm_curriculum cc
                INNER JOIN cm_curriculum_syllabus_relation ccsr ON ccsr.cm_curriculum_id = cc.id
                INNER JOIN cm_syllabus cs ON cs.id = ccsr.cm_syllabus_id
                INNER JOIN cm_syllabus_academic_term_settings csats ON csats.cm_syllabus_id = cs.id
                INNER JOIN cm_academic_paper cap ON cap.cm_syllabus_academic_term_settings_id = csats.id
                INNER JOIN cm_academic_paper_subjects caps ON caps.cm_academic_paper_id = cap.id
                LEFT JOIN `groups` bg ON cc.id = CAST(bg.properties->>'$.curriculumId' AS CHAR) AND bg.`type`='BATCH'
                $joinGradeSchema
                INNER JOIN grade_scheme gs ON gs.id = $joinGradeSchemeColumn
                INNER JOIN grade gr ON
                gr.grade_scheme_id = gs.id
                WHERE 1=1
                ";
                if (count(array_filter($request->termIds)) > 0) {
                    $sql .= " AND csats.academic_term_id in  ('" . implode("','", $request->termIds) . "')";
                }
                if (count(array_filter($request->groupIds)) > 0) {
                    $sql .= " AND bg.id in  ('" . implode("','", $request->groupIds) . "')";
                }
                if (count(array_filter($request->ids)) > 0) {
                    $sql .= " AND $columnNames in  ('" . implode("','", $request->ids) . "')";
                }
                if ($request->orderBy == "ASC") {
                    $sql .= " ORDER BY gr.range_to ASC";
                } else {
                    $sql .= " ORDER BY gr.range_to DESC";
                }
                $gradeSchemes = (array) $this->executeQueryForList($sql, $this->mapper[CurriculumManageServiceMapper::GET_GRADE_BY_GROUP]);
                if (count(array_filter($request->ids)) > 0&&count($gradeSchemes)>0) {
                    // need to remove those ids from list since no need for fetch from higher tree
                    $idList = array_column((array)$gradeSchemes,'id');
                    $request->ids = array_diff($request->ids,$idList);
                }
                $idList = array_flip(array_column((array) $gradeSchemesList, 'id'));
                $diff = array_filter($gradeSchemes, function ($scheme) use ($idList) {
                    return !isset($idList[$scheme->id]);
                });
                $gradeSchemesList = array_merge($gradeSchemesList,$diff);
                switch ($type) {
                    case GradeSchemaTypes::ACADEMIC_PAPER_SUBJECT:
                        $type = GradeSchemaTypes::SYLLABUS_ACADEMIC_TERM;
                        break;
                    case GradeSchemaTypes::SYLLABUS_ACADEMIC_TERM:
                        $type = GradeSchemaTypes::SYLLABUS;
                        break;
                    case GradeSchemaTypes::SYLLABUS:
                        $type = GradeSchemaTypes::CURRICULUM;
                    case GradeSchemaTypes::CURRICULUM:
                        break;
                }
            } while (!empty($type));
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $gradeSchemesList;
    }
}