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 / 215
GradeSchemeService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 9
1332.00
0.00% covered (danger)
0.00%
0 / 215
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 3
 saveGradeScheme
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 28
 validateSaveGradeSchemeRequest
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 4
 insertGradeScheme
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 19
 updateGradeScheme
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 22
 deleteGradeScheme
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 24
 restoreGradeScheme
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 24
 searchGradeScheme
0.00% covered (danger)
0.00%
0 / 1
90.00
0.00% covered (danger)
0.00%
0 / 56
 getGradeSchemeDetails
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 35
<?php
namespace com\linways\core\ams\professional\service\academic;
use com\linways\base\util\SecurityUtils;
use com\linways\base\util\MakeSingletonTrait;
use com\linways\core\ams\professional\service\BaseService;
use com\linways\core\ams\professional\mapper\academic\GradeSchemeServiceMapper;
use com\linways\core\ams\professional\request\academic\SearchGradeSchemeRequest;
use com\linways\core\ams\professional\constant\academic\StatusConstants;
use com\linways\core\ams\professional\exception\ProfessionalException;
use com\linways\core\ams\professional\dto\api\GradeScheme;
use com\linways\core\ams\professional\logging\AMSLogger;
use com\linways\core\ams\professional\logging\entities\GradeSchemeEntity;
class GradeSchemeService extends BaseService
{
    use MakeSingletonTrait;
    private function __construct() {
        $this->mapper = GradeSchemeServiceMapper::getInstance()->getMapper();
        $this->logger = AMSLogger::getLogger();
    }
    /**
     * Save gradeScheme
     * @param GradeScheme $gradeScheme
     * @return GradeScheme $gradeScheme
     */
    public function saveGradeScheme (GradeScheme $gradeScheme)
    {
        $gradeScheme = $this->realEscapeObject($gradeScheme);
        $gradeScheme->createdBy = $GLOBALS['userId'] ?? $gradeScheme->createdBy;
        $gradeScheme->updatedBy = $GLOBALS['userId'] ?? $gradeScheme->updatedBy;
        try{
            $this->validateSaveGradeSchemeRequest($gradeScheme);
            if(!empty($gradeScheme->id))
            {
                $gradeScheme->id = $this->updateGradeScheme($gradeScheme);
            }
            else
            {
                $gradeScheme->id = $this->insertGradeScheme($gradeScheme);
            }
            if(!empty($gradeScheme->grades)){
                GradeService::getInstance()->saveGrades($gradeScheme->grades);
            }
        }catch(\Exception $e) {
            if($e->getCode() !== ProfessionalException::INVALID_PARAMETERS && $e->getCode() !== ProfessionalException::EMPTY_PARAMETERS && $e->getCode() !== ProfessionalException::DUPLICATE_ENTRY) {
                throw new ProfessionalException($e->getCode(), "Failed to save grade scheme! Please try again");
            } else if ($e->getCode() === ProfessionalException::DUPLICATE_ENTRY) {
                throw new ProfessionalException (ProfessionalException::DUPLICATE_ENTRY, "Cannot create grade scheme.".$gradeScheme->name." already exists!");
            } else {
                throw new ProfessionalException ($e->getCode(), $e->getMessage());
            }
        }
        return $gradeScheme;
    }
    /**
     * Validate GradeScheme Request Before Saving
     * @param GradeScheme $gradeScheme
     * @return NULL
     */
    private function validateSaveGradeSchemeRequest($gradeScheme)
    {
        if(empty($gradeScheme->name))
            throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS, "Grade scheme name is empty! Please enter a name for grade scheme");
    }
    /**
     * Insert gradeScheme
     * @param GradeScheme $gradeScheme
     * @return String $id
     */
    private function insertGradeScheme(GradeScheme $gradeScheme)
    {
        $properties = !empty($gradeScheme->properties) ? "'" . json_encode($gradeScheme->properties) . "'" : "JSON_OBJECT";
        $id = SecurityUtils::getRandomString();
        $query = "INSERT INTO `grade_scheme`
            (`id`,`name`,`properties`,`created_by`,`updated_by`)
            VALUES
            ('$id','$gradeScheme->name','$gradeScheme->type',$properties,'$gradeScheme->createdBy','$gradeScheme->updatedBy')";
        try {
            $this->executeQuery($query);
            $this->logger->info(Events::GRADE_SCHEME_CREATION,[
                "grade_scheme" => new GradeSchemeEntity(["id" => $id]),
                "status" => StatusConstants::SUCCESS,
                "updated_by" => $updatedBy,
            ]);
            return $id;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Update GradeScheme
     * @param GradeScheme $gradeScheme
     * @return NULL
     */
    private function updateGradeScheme(GradeScheme $gradeScheme)
    {
        $properties = !empty($gradeScheme->properties) ? "'" . json_encode($gradeScheme->properties) . "'" : "JSON_OBJECT";
        $query = "UPDATE
                    `grade_scheme`
                SET
                    `name` = '$gradeScheme->name',
                    `properties` = $properties,
                    `updated_by` = '$gradeScheme->updatedBy'
                WHERE
                    `id` = '$gradeScheme->id'";
        try {
            $this->executeQuery($query);
            $this->logger->info(Events::GRADE_SCHEME_UPDATING,[
                "grade_scheme" => new GradeSchemeEntity(["id" => $id]),
                "status" => StatusConstants::SUCCESS,
                "updated_by" => $updatedBy,
            ]);
            return $gradeScheme->id;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Delete GradeScheme (Soft Delete)
     * @param String $id
     * @return NULL
     */
    public function deleteGradeScheme($id)
    {
        $id = $this->realEscapeString($id);
        $updatedBy = $GLOBALS['userId'];
        if(empty($id)) {
            throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS, "No grade scheme selected! Please select a gradeScheme to delete");
        }
        //TODO: Do validation before deleting
        $query = "UPDATE
                    `grade_scheme`
                SET
                    `trashed` = UTC_TIMESTAMP(),
                    `updated_by` = '$updatedBy'
                WHERE
                    `id` = '$id'";
        try {
            $this->executeQuery($query);
            $this->logger->info(Events::GRADE_SCHEME_DELETION,[
                "grade_scheme" => new GradeSchemeEntity(["id" => $id]),
                "status" => StatusConstants::SUCCESS,
                "updated_by" => $updatedBy,
            ]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), "Error deleting grade scheme! Please try again");
        }
    }
    /**
     * Restore GradeScheme
     * @param String $id
     * @return NULL
     */
    public function restoreGradeScheme($id)
    {
        $id = $this->realEscapeString($id);
        $updatedBy = $GLOBALS['userId'];
        if(empty($id)) {
            throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"No grade scheme selected! Please select a gradeScheme to restore");
        }
        $query = "UPDATE
                    `grade_scheme`
                SET
                    `trashed` = NULL,
                    `updated_by` = '$updatedBy'
                WHERE
                    `id` = '$id'";
        try {
            $this->executeQuery($query);
            $this->logger->info(Events::GRADE_SCHEME_RESTORED,[
                "grade_scheme" => new GradeSchemeEntity(["id" => $id]),
                "status" => StatusConstants::SUCCESS,
                "updated_by" => $updatedBy,
            ]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),"Error restoring grade scheme! Please try again");
        }
    }
    /**
     * Search GradeScheme Details
     * @param SearchGradeSchemeRequest $request
     * @return GradeScheme
     */
    public function searchGradeScheme(SearchGradeSchemeRequest $request)
    {
        $request = $this->realEscapeObject($request);
        $whereQuery = "";
        $limitQuery = "";
        $columnQuery = "";
        $joinQuery = "";
        $gradeSchemeServiceMapper = GradeSchemeServiceMapper::SEARCH_GRADE_SCHEME;
        if($request->trashed === StatusConstants::ACTIVE) {
            $whereQuery .= " AND gs.trashed IS NULL ";
        }
        if($request->trashed === StatusConstants::TRASHED) {
            $whereQuery .= " AND gs.trashed IS NOT NULL ";
        }
        if(!empty($request->id)) {
            $whereQuery .= " AND gs.id='$request->id";
        }
        if(!empty($request->name)) {
            $whereQuery .= " AND  gs.name LIKE '%$request->name%' ";
        }
        if($request->includeGrade) {
            $gradeSchemeServiceMapper = GradeSchemeServiceMapper::SEARCH_GRADE_SCHEME_WITH_GRADE;
            $joinQuery = " INNER JOIN `grade` g ON g.grade_scheme_id = gs.id ";
            $columnQuery = " , g.id AS `gradeId`,g.range_from ,g.range_to, g.name AS `gradeName`, g.properties AS `gradeProperties`, NULL AS `gradeTrashed` ";
        }
        if($request->startIndex !== "" && $request->endIndex !== "")
        {
            $limitQuery .= " LIMIT $request->startIndex,$request->endIndex";
        }
        $query = "SELECT
            gs.id,
            gs.name,
            gs.properties,
            gs.trashed,
            gs.subject_grade_schema,
            gs.semester_grade_schema,
            gs.cgpa_grade_schema,
            gs.syllabus_grade_schema,
            gs.created_by,
            gs.created_date,
            gs.updated_by,
            gs.updated_date
            $columnQuery
        FROM
            grade_scheme gs
            $joinQuery
        WHERE
            1 = 1
            $whereQuery
            $limitQuery";
        try {
            $gradeSchemes = $this->executeQueryForList($query,$this->mapper[$gradeSchemeServiceMapper]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),"Cannot fetch grade scheme details! Please try again");
        }
        return $gradeSchemes;
    }
    /**
     * get Grade Scheme by id
     * @param String $id
     * @param Boolean $request
     * @return GradeScheme
     */
    public function getGradeSchemeDetails($id, $includeGrade = false)
    {
        $id = $this->realEscapeString($id);
        $request = $this->realEscapeObject($request);
        $columnQuery = "";
        $joinQuery = "";
        $gradeSchemeServiceMapper = GradeSchemeServiceMapper::SEARCH_GRADE_SCHEME;
        if(empty($id))
            throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Grade scheme is invalid! Please enter a valid program");
        if($includeGrade) {
            $gradeSchemeServiceMapper = GradeSchemeServiceMapper::SEARCH_GRADE_SCHEME_WITH_GRADE;
            $joinQuery = " INNER JOIN `grade` g ON g.grade_scheme_id = gs.id ";
            $columnQuery = " , g.id AS `gradeId`,g.range_from ,g.range_to, g.name AS `gradeName`, g.properties AS `gradeProperties`, NULL AS `gradeTrashed` ";
        }
        $query = "SELECT
            gs.id,
            gs.name,
            gs.properties,
            gs.trashed,
            gs.created_by,
            gs.created_date,
            gs.updated_by,
            gs.updated_date
            $columnQuery
        FROM
            `grade_scheme` gs
            $joinQuery
        WHERE
            `id` = $id";
        try {
            $gradeScheme = $this->executeQueryForObject($query, $this->mapper[$gradeSchemeServiceMapper]);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),"Cannot fetch grade scheme details! Please try again");
        }
        return $gradeScheme;
    }
}