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 / 11
CRAP
0.00% covered (danger)
0.00%
0 / 157
GroupMemberService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 11
1482.00
0.00% covered (danger)
0.00%
0 / 157
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 1
 saveMember
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 25
 validateSaveMemberRequest
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 4
 insertMember
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 18
 updateMember
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 18
 deleteMember
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 12
 moveMemberToTrash
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 13
 bulkInsertMember
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 30
 deleteMembersPermanently
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 16
 searchGroupMembers
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 changeAcademicStatus
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 18
<?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\GroupMemberServiceMapper;
use com\linways\core\ams\professional\request\academic\SearchClusterRequest;
use com\linways\core\ams\professional\constant\academic\ClusterTypeConstant;
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\Cluster;
use com\linways\core\ams\professional\dto\api\GroupMember;
class GroupMemberService extends BaseService
{
    use MakeSingletonTrait;
    private function __construct() {
        // $this->mapper = GroupMemberServiceMapper::getInstance()->getMapper();
    }
    /**
     * Save GroupMembers
     * @param GroupMembers $member
     * @return String $id
     */
    public function saveMember (GroupMember $member)
    {
        $member = $this->realEscapeObject($member);
        $member->createdBy = $GLOBALS['userId'] ?? $member->createdBy;
        $member->updatedBy = $GLOBALS['userId'] ?? $member->updatedBy;
        try{
            $this->validateSaveMemberRequest($member);
            if(!empty($member->id))
            {
                $member->id = $this->updateMember($member);
            }
            else
            {
                $member->id = $this->insertMember($member);
            }
        }catch(\Exception $e) {
            if($e->getCode() !== ProfessionalException::INVALID_PARAMETER && $e->getCode() !== ProfessionalException::EMPTY_PARAMETERS && $e->getCode() !== ProfessionalException::DUPLICATE_ENTRY) {
                throw new ProfessionalException($e->getCode(),"Failed to save member! Please try again");
            } else if ($e->getCode() === ProfessionalException::DUPLICATE_ENTRY) {
                throw new ProfessionalException (ProfessionalException::DUPLICATE_ENTRY,"Student already exists!");
            } else {
                throw new ProfessionalException ($e->getCode(),$e->getMessage());
            }
        }
        
        return $member->id;
    }
    
    /**
     * Validate Member Request Before Saving
     * @param GroupMember $member
     * @return NULL
     */
    private function validateSaveMemberRequest(GroupMember $member)
    {
        if(empty($member->groupId))
            throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Groups are null! Please choose a groups for member");
    }
    
    /**
     * Insert GroupMembers
     * @param GroupMembers $member
     * @return String $id
     */
    private function insertMember(GroupMember $member)
    {
        $properties = !empty($member->properties) ? "'" . json_encode($member->properties) . "'" : "NULL";
        $memberQ = !empty($member->member) ? "'" . json_encode($member->member) . "'" : "NULL";
        $id = SecurityUtils::getRandomString();
        $query = "INSERT INTO `group_members`
                  (`id`, `groups_id`, `members`, `properties`,`created_by`,`updated_by`)
                  VALUES
                  ('$id','$member->groupId',$memberQ,$properties,'$member->createdBy','$member->updatedBy')
                  ON DUPLICATE KEY UPDATE 
                  `updated_by` = '$member->updatedBy',
                  `properties` = $properties ";
        
        try {
            $this->executeQuery($query);
            return $id;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
    }
    /**
     * Update GroupMembers
     * @param GroupMembers $member
     * @return NULL
     */
    private function updateMember(GroupMember $member)
    {
        $properties = !empty($member->properties) ? "'" . json_encode($member->properties) . "'" : "NULL";
        $memberQ = !empty($member->member) ? "'" . json_encode($member->member) . "'" : "NULL";
        
        $query = "UPDATE
                    `group_members`
                SET
                    `groups_id` = '$member->groupId',
                    `members` = '$memberQ',
                    `properties` = '$properties',
                WHERE
                    `id` = '$member->id'";
        try {
            $this->executeQuery($query);
            return $member->id;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
    }
    /**
     * Delete Group Member (Hard Delete)
     * @param String $id
     * @return NULL
     */
    public function deleteMember($groupId,$id){
        $groupId = $this->realEscapeString($groupId);
        $id = $this->realEscapeString($id);
        $updatedBy = $GLOBALS['userId'];
        if(empty($id))
            throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Have some problem, please try again");
        $query = "DELETE FROM `group_members` where `groups_id` = '$groupId' and `student_id` = $id;";
        try {
            $this->executeQuery($query);
        } catch (\Exception $e) {
            throw new ProfessionalException(ProfessionalException::ERROR_DELETING,"Error deleting member! Please try again");
        }
    }
    /**
     * Delete Group Member (Soft Delete)
     * @param String $id
     * @return NULL
     */
    public function moveMemberToTrash($groupId,$id)
    {
        $groupId = $this->realEscapeString($groupId);
        $id = $this->realEscapeString($id);
        $updatedBy = $GLOBALS['userId'];
        if(empty($id))
            throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Have some problem, please try again");
        $query = "update group_members set trashed = utc_timestamp() where groups_id = '$groupId' and student_id = $id;";
        try {
            $this->executeQuery($query);
        } catch (\Exception $e) {
            throw new ProfessionalException(ProfessionalException::ERROR_DELETING,"Error deleting member! Please try again");
        }
    }
    /**
     * Insert GroupMembers
     */
    public function bulkInsertMember($members)
    {
        if(empty($members->groupId)){
            throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Have some problem, please try again");
        }
        
        try {
            if(count($members->members)){
                $query = "INSERT INTO `group_members` (`id`, `groups_id`, `members`, `properties`, `trashed`, `created_by`, `created_date`, `updated_by`, `updated_date`)
                    SELECT 
                        LEFT(MD5(RAND()), 17) AS `id`, 
                        '$members->groupId' AS `groups_id`, 
                        JSON_OBJECT('studentId',stdp.id) AS `members`, 
                        JSON_OBJECT('isFailed',false,'academicStatus','ACTIVE') AS `properties`, 
                        null AS `trashed`,
                        '$members->createdBy' AS `created_by`,
                        utc_timestamp() AS `created_date`,
                        '$members->updatedBy' AS `updated_by`,
                        utc_timestamp() AS `updated_date` 
                    FROM `student_program_account` stdp
                    INNER JOIN `studentaccount` st ON stdp.student_id = st.studentID 
                    WHERE stdp.id IN (".(implode(',',$members->members)).")
                    ON DUPLICATE KEY UPDATE
                    `properties` = JSON_OBJECT('isFailed',false,'academicStatus','ACTIVE'),
                    `updated_by` = '$members->updatedBy',
                    `updated_date` = utc_timestamp();";
                $this->executeQuery($query);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(),$e->getMessage());
        }
    }
    /**
     * Delete Group Member (Soft Delete)
     * @param String $id
     * @return NULL
     */
    public function deleteMembersPermanently($groupId,$id = null)
    {
        $groupId = $this->realEscapeString($groupId);
        $id = $this->realEscapeString($id);
        $updatedBy = $GLOBALS['userId'];
        if(empty($groupId))
            throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Have some problem, please try again");
        $query = "DELETE FROM `group_members` where `groups_id` = '$groupId";
        if($id){
            $query .= " and `student_id` = '$id";
        }
        try {
            $this->executeQuery($query);
        } catch (\Exception $e) {
            throw new ProfessionalException(ProfessionalException::ERROR_DELETING,"Error deleting member! Please try again");
        }
    }
    public function searchGroupMembers($request){
        return array();
    } 
    /**
     * Update group member status
     * @param String $id
     * @return NULL
     */
    public function changeAcademicStatus($groupId,$id,$status){
        $groupId = $this->realEscapeString($groupId);
        $id = $this->realEscapeString($id);
        $updatedBy = $GLOBALS['userId'];
        if(empty($id))
            throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Invalid user, please try again");
        if(empty($groupId))
            throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Invalid group, please try again");
        if(empty($status))
            throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Invalid status, please try again");
        $query = "UPDATE `group_members` 
        SET properties = JSON_SET(properties,'$.academicStatus','".$status."')
        WHERE `groups_id` = '$groupId' AND `student_id` = $id;";
        try {
            $this->executeQuery($query);
        } catch (\Exception $e) {
            throw new ProfessionalException(ProfessionalException::ERROR_DELETING,"Error deleting member! Please try again");
        }
    }
}