Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 22 |
CRAP | |
0.00% |
0 / 520 |
GroupService | |
0.00% |
0 / 1 |
|
0.00% |
0 / 22 |
17822.00 | |
0.00% |
0 / 520 |
__construct | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 2 |
|||
saveGroup | |
0.00% |
0 / 1 |
72.00 | |
0.00% |
0 / 32 |
|||
validateSaveGroupRequest | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 6 |
|||
insertGroup | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 15 |
|||
updateGroup | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 20 |
|||
deleteGroup | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 18 |
|||
restoreGroup | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 18 |
|||
searchGroup | |
0.00% |
0 / 1 |
380.00 | |
0.00% |
0 / 52 |
|||
getGroupDetails | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 25 |
|||
getBatchDetailsByClusterAndBatchGroupId | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 26 |
|||
saveBatchGroup | |
0.00% |
0 / 1 |
56.00 | |
0.00% |
0 / 26 |
|||
saveSubjectStudentGroup | |
0.00% |
0 / 1 |
56.00 | |
0.00% |
0 / 26 |
|||
addStudentsGroup | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 7 |
|||
getAssignedSyllabusesFromGroupId | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 15 |
|||
getStudentsBatchGroupFromBatchId | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 5 |
|||
getAllGroups | |
0.00% |
0 / 1 |
240.00 | |
0.00% |
0 / 40 |
|||
getAllBatchAcademicYears | |
0.00% |
0 / 1 |
42.00 | |
0.00% |
0 / 31 |
|||
findGroupByProperties | |
0.00% |
0 / 1 |
30.00 | |
0.00% |
0 / 16 |
|||
deleteGroupPermanently | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 18 |
|||
updateGroupProperties | |
0.00% |
0 / 1 |
702.00 | |
0.00% |
0 / 91 |
|||
setGroupToGroupRelations | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 17 |
|||
haveId | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 14 |
<?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\request\academic\MapStudentGroupRequest; | |
use com\linways\core\ams\professional\mapper\academic\GroupServiceMapper; | |
use com\linways\core\ams\professional\request\academic\SearchGroupRequest; | |
use com\linways\core\ams\professional\constant\academic\GroupTypeConstant; | |
use com\linways\core\ams\professional\constant\academic\StatusConstants; | |
use com\linways\core\ams\professional\dto\academics\BatchProperties as AcademicsBatchProperties; | |
use com\linways\core\ams\professional\dto\academics\SubjectProperties as AcademicsSubjectProperties; | |
use com\linways\core\ams\professional\exception\ProfessionalException; | |
use com\linways\core\ams\professional\dto\api\Group; | |
use com\linways\core\dto\BatchProperties; | |
class GroupService extends BaseService | |
{ | |
use MakeSingletonTrait; | |
private function __construct() { | |
$this->mapper = GroupServiceMapper::getInstance()->getMapper(); | |
} | |
/** | |
* Save group | |
* @param Group $group | |
* @return String $id | |
*/ | |
public function saveGroup (Group $group) | |
{ | |
$group = $this->realEscapeObject($group); | |
$group->createdBy = $GLOBALS['userId'] ?? $group->createdBy; | |
$group->updatedBy = $GLOBALS['userId'] ?? $group->updatedBy; | |
try{ | |
$this->validateSaveGroupRequest($group); | |
if(!empty($group->id)) | |
{ | |
$group->id = $this->updateGroup($group); | |
} | |
else | |
{ | |
$group->id = $this->insertGroup($group); | |
} | |
}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 Group! Please try again"); | |
} else if ($e->getCode() === ProfessionalException::DUPLICATE_ENTRY) { | |
throw new ProfessionalException (ProfessionalException::DUPLICATE_ENTRY,"Cannot create group.$group->name already exists!"); | |
} else { | |
throw new ProfessionalException ($e->getCode(),$e->getMessage()); | |
} | |
} | |
switch ($group->type) { | |
case GroupTypeConstant::SUBJECT: | |
$this->setGroupToGroupRelations($group,'batchGroupIds'); | |
break; | |
default: | |
break; | |
} | |
return $group->id; | |
} | |
/** | |
* Validate Group Request Before Saving | |
* @param Group $group | |
* @return NULL | |
*/ | |
private function validateSaveGroupRequest(Group $group) | |
{ | |
if(empty($group->name)) | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Group name is empty! Please enter a name for group"); | |
if(empty($group->type)) | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Group type is empty! Please choose a type for group"); | |
} | |
/** | |
* Insert Group | |
* @param Group $group | |
* @return String $id | |
*/ | |
private function insertGroup(Group $group) | |
{ | |
$properties = !empty($group->properties) ? "'" . json_encode($group->properties) . "'" : "NULL"; | |
$identifyingContext = !empty($group->identifyingContext) ? "'" . json_encode($group->identifyingContext) . "'" : "NULL"; | |
$id = SecurityUtils::getRandomString(); | |
$query = "INSERT INTO `groups` | |
(`id`,`identifying_context`,`name`,`type`,`properties`,`created_by`,`updated_by`) | |
VALUES | |
('$id',$identifyingContext,'$group->name','$group->type',$properties,'$group->createdBy','$group->updatedBy')"; | |
try { | |
$this->executeQuery($query); | |
return $id; | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(),$e->getMessage()); | |
} | |
} | |
/** | |
* Update Group | |
* @param Group $group | |
* @return NULL | |
*/ | |
private function updateGroup(Group $group) | |
{ | |
$properties = !empty($group->properties) ? "'".json_encode($group->properties)."'" : "NULL"; | |
$identifyingContext = !empty($group->identifying_context) ? "'" . json_encode($group->identifyingContext) . "'" : "NULL"; | |
$query = "UPDATE | |
`groups` | |
SET | |
`identifying_context` = $identifyingContext, | |
`name` = '$group->name', | |
`type` = '$group->type', | |
`properties` = $properties, | |
`updated_by` = '$group->updatedBy' | |
WHERE | |
`id` = '$group->id'"; | |
try { | |
$this->executeQuery($query); | |
return $group->id; | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(),$e->getMessage()); | |
} | |
} | |
/** | |
* Delete Group (Soft Delete) | |
* @param String $id | |
* @return NULL | |
*/ | |
public function deleteGroup($id) | |
{ | |
$id = $this->realEscapeString($id); | |
$updatedBy = $GLOBALS['userId']; | |
if(empty($id)) | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Group is invalid! Please enter a valid group"); | |
$query = "UPDATE | |
`groups` | |
SET | |
`trashed` = UTC_TIMESTAMP(), | |
`updated_by` = '$updatedBy' | |
WHERE | |
`id` = '$id'"; | |
try { | |
$this->executeQuery($query); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_DELETING,"Error deleting group! Please try again"); | |
} | |
} | |
/** | |
* Restore Group | |
* @param String $id | |
* @return NULL | |
*/ | |
public function restoreGroup($id) | |
{ | |
$id = $this->realEscapeString($id); | |
$updatedBy = $GLOBALS['userId']; | |
if(empty($id)) | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Group is invalid! Please enter a valid group"); | |
$query = "UPDATE | |
`groups` | |
SET | |
`trashed` = NULL, | |
`updated_by` = '$updatedBy' | |
WHERE | |
`id` = '$id'"; | |
try { | |
$this->executeQuery($query); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_RESTORING,"Error restoring academic term! Please try again"); | |
} | |
} | |
/** | |
* Search Academic term Details | |
* @param SearchGroupRequest $request | |
* @return Group | |
*/ | |
public function searchGroup(SearchGroupRequest $request) | |
{ | |
$request = $this->realEscapeObject($request); | |
$whereQuery = ""; | |
$limitQuery = ""; | |
$where = []; | |
!empty($request->startYear)?$where [] = " JSON_CONTAINS(g.properties, '{\"startYear\":\"$request->startYear\"}') ":null; | |
!empty($request->endYear)?$where [] = " JSON_CONTAINS(g.properties, '{\"endYear\":\"$request->endYear\"}') ":null; | |
!empty($request->programId)?$where [] = " JSON_CONTAINS(g.properties, '{\"programId\":\"$request->programId\"}') ":null; | |
!empty($request->departmentId)?$where [] = " JSON_CONTAINS(g.properties, '{\"departmentId\":\"$request->departmentId\"}') ":null; | |
!empty($request->currentTermId)?$where [] = " JSON_CONTAINS(g.properties, '{\"currentTermId\":\"$request->currentTermId\"}') ":null; | |
!empty($request->curriculumId)?$where [] = " JSON_CONTAINS(g.properties, '{\"curriculumId\":\"$request->curriculumId\"}') ":null; | |
if(count($request->syllabusIds)){ | |
$or = []; | |
foreach ($request->syllabusIds as $key => $syllabusId) { | |
$or [] = " JSON_CONTAINS(g.properties->'$.extraSyllabusId', '\"$syllabusId\"' ,'$') "; | |
} | |
$where [] = " (".implode(" OR ",$or).") "; | |
} | |
!empty($request->id)?$where [] = " g.id = '$request->id' ":null; | |
$request->trashed === StatusConstants::ACTIVE ? $where [] = " g.trashed IS NULL ":null; | |
$request->trashed === StatusConstants::TRASHED ? $where [] = " g.trashed IS NOT NULL ":null; | |
!empty($request->name) ? $where [] = " g.name LIKE '%$request->name%' ":null; | |
!empty($request->type) ? $where [] = " g.type LIKE '%$request->type%' ":null; | |
if($request->startIndex !== "" && $request->endIndex !== "") | |
{ | |
$limitQuery .= " LIMIT $request->startIndex,$request->endIndex"; | |
} | |
$query = "SELECT | |
g.id, | |
g.identifying_context, | |
g.name, | |
g.type, | |
g.properties, | |
g.trashed, | |
g.created_by, | |
g.created_date, | |
g.updated_by, | |
g.updated_date | |
FROM | |
`groups` g | |
".(count($where)? " WHERE ".implode(' AND ',$where):""); | |
try { | |
$groups = $this->executeQueryForList($query." ".$limitQuery, $this->mapper[GroupServiceMapper::SEARCH_GROUPS]); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_FETCHING,"Cannot fetch group details! Please try again."); | |
} | |
if(empty($groups)) | |
{ | |
$groups = []; | |
} | |
return $groups; | |
} | |
/** | |
* get Academic term by id | |
* @param String $id | |
* @return Group | |
*/ | |
public function getGroupDetails($id) | |
{ | |
$id = $this->realEscapeObject($id); | |
if(empty($id)) | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Group is invalid! Please enter a valid group"); | |
$query = "SELECT | |
g.id, | |
g.identifying_context, | |
g.name, | |
g.type, | |
g.trashed, | |
g.created_by, | |
g.created_date, | |
g.updated_by, | |
g.updated_date | |
FROM | |
`groups` g | |
WHERE | |
`id` = $id"; | |
try { | |
$group = $this->executeQueryForObject($query, $this->mapper[GroupServiceMapper::SEARCH_GROUPS]); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_FETCHING,"Cannot fetch group details! Please try again"); | |
} | |
return $group; | |
} | |
/** | |
* get Academic term by id | |
* @param String $id | |
* @return Group | |
*/ | |
public function getBatchDetailsByClusterAndBatchGroupId($request) | |
{ | |
$request = $this->realEscapeObject($request); | |
if(empty($request->batchId)||empty($request->clusterId)) | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Invalid request"); | |
$query = "SELECT | |
g.id, | |
g.identifying_context, | |
g.name, | |
g.type, | |
g.trashed, | |
g.created_by, | |
g.created_date, | |
g.updated_by, | |
g.updated_date | |
FROM | |
cluster_groups_relations cgr | |
inner join groups_relations gr ON gr.child_groups_id = cgr.groups_id | |
inner join `groups` g ON g.id = gr.child_groups_id | |
where gr.parent_groups_id = '$request->batchId' and cgr.cluster_id = '$request->clusterId'"; | |
try { | |
$group = $this->executeQueryForObject($query, $this->mapper[GroupServiceMapper::SEARCH_GROUPS]); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_FETCHING,"Cannot fetch group details! Please try again"); | |
} | |
return $group; | |
} | |
/** | |
* Save a batch | |
* @param Group $group | |
* @return String $id | |
*/ | |
public function saveBatchGroup (Group $group) | |
{ | |
$group = $this->realEscapeObject($group); | |
$group->createdBy = $GLOBALS['userId'] ?? $group->createdBy; | |
$group->updatedBy = $GLOBALS['userId'] ?? $group->updatedBy; | |
$group->type = GroupTypeConstant::BATCH; | |
try{ | |
$this->validateSaveGroupRequest($group); | |
if(!empty($group->id)) | |
{ | |
$group->id = $this->updateGroup($group); | |
} | |
else | |
{ | |
$group->id = $this->insertGroup($group); | |
} | |
}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 Batch! Please try again"); | |
} else if ($e->getCode() === ProfessionalException::DUPLICATE_ENTRY) { | |
throw new ProfessionalException (ProfessionalException::DUPLICATE_ENTRY,"Cannot create batch.$group->name already exists!"); | |
} else { | |
throw new ProfessionalException ($e->getCode(),$e->getMessage()); | |
} | |
} | |
return $group->id; | |
} | |
/** | |
* Save a subject student group | |
* @param Group $group | |
* @return String $id | |
*/ | |
public function saveSubjectStudentGroup (Group $group) | |
{ | |
$group = $this->realEscapeObject($group); | |
$group->createdBy = $GLOBALS['userId'] ?? $group->createdBy; | |
$group->updatedBy = $GLOBALS['userId'] ?? $group->updatedBy; | |
$group->type = GroupTypeConstant::SUBJECT; | |
try{ | |
$this->validateSaveGroupRequest($group); | |
if(!empty($group->id)) | |
{ | |
$group->id = $this->updateGroup($group); | |
} | |
else | |
{ | |
$group->id = $this->insertGroup($group); | |
} | |
}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 Subject Student Group! Please try again"); | |
} else if ($e->getCode() === ProfessionalException::DUPLICATE_ENTRY) { | |
throw new ProfessionalException (ProfessionalException::DUPLICATE_ENTRY,"Cannot create subject student group.$group->name already exists!"); | |
} else { | |
throw new ProfessionalException ($e->getCode(),$e->getMessage()); | |
} | |
} | |
return $group->id; | |
} | |
/** | |
* Save a subject student group | |
* @param MapStudentGroupRequest $mapStudentGroupRequest | |
* @return String $id | |
*/ | |
public function addStudentsGroup ($mapStudentGroupRequest) | |
{ | |
$mapStudentGroupRequest = $this->realEscapeObject($mapStudentGroupRequest); | |
$mapStudentGroupRequest->createdBy = $GLOBALS['userId'] ?? $mapStudentGroupRequest->createdBy; | |
$mapStudentGroupRequest->updatedBy = $GLOBALS['userId'] ?? $mapStudentGroupRequest->updatedBy; | |
// try{ | |
// $this->validateSaveGroupRequest($group); | |
// if(!empty($group->id)) | |
// { | |
// $group->id = $this->updateGroup($group); | |
// } | |
// else | |
// { | |
// $group->id = $this->insertGroup($group); | |
// } | |
// }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 Subject Student Group! Please try again"); | |
// } else if ($e->getCode() === ProfessionalException::DUPLICATE_ENTRY) { | |
// throw new ProfessionalException (ProfessionalException::DUPLICATE_ENTRY,"Cannot create subject student group.$group->name already exists!"); | |
// } else { | |
// throw new ProfessionalException ($e->getCode(),$e->getMessage()); | |
// } | |
// } | |
$group = new Group(); | |
return $group->id; | |
} | |
public function getAssignedSyllabusesFromGroupId ($groupId) | |
{ | |
$groupId = $this->realEscapeObject($groupId); | |
$this->haveId($groupId,GroupTypeConstant::BATCH); | |
$query = "SELECT distinct s.id as `SyllabusId`, s.name AS `SyllabusName` | |
FROM `groups` bg | |
INNER JOIN `cm_curriculum_syllabus_relation` csr ON csr.cm_curriculum_id = bg.properties->'$.curriculumId' | |
INNER JOIN `cm_syllabus` s ON s.id = csr.cm_syllabus_id OR JSON_CONTAINS(bg.properties->'$.extraSyllabusId',concat('\"',s.id,'\"'),'$') | |
WHERE bg.type = '".GroupTypeConstant::BATCH."' AND bg.id = '$groupId';"; | |
try { | |
$AssignedSyllabus = $this->executeQueryForList($query); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_FETCHING,"Cannot fetch group details! Please try again"); | |
} | |
return $AssignedSyllabus; | |
} | |
/** | |
* Get a group id of batch | |
* @param Integer $batchId | |
* @return String $groupId | |
*/ | |
public function getStudentsBatchGroupFromBatchId ($batchId) | |
{ | |
$batchId = $this->realEscapeString($batchId); | |
// try{ | |
// TODO: fetch group id of a batch | |
$groupId = "q85pNu5563WjsfMBd"; | |
// }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 Subject Student Group! Please try again"); | |
// } else if ($e->getCode() === ProfessionalException::DUPLICATE_ENTRY) { | |
// throw new ProfessionalException (ProfessionalException::DUPLICATE_ENTRY,"Cannot create subject student group.$group->name already exists!"); | |
// } else { | |
// throw new ProfessionalException ($e->getCode(),$e->getMessage()); | |
// } | |
// } | |
return $groupId; | |
} | |
/** | |
* Search Academic term Details | |
* @return Group | |
*/ | |
public function getAllGroups(SearchGroupRequest $request) | |
{ | |
$request = $this->realEscapeObject($request); | |
$where = []; | |
$limitQuery = ""; | |
!empty($request->batchStartYear)?$where [] = "JSON_CONTAINS(g.properties, '{\"batchStartYear\":\"$request->batchStartYear\"}')":null; | |
!empty($request->programId)?$where [] = "JSON_CONTAINS(g.properties, '{\"programId\":\"$request->programId\"}')":null; | |
!empty($request->courseTypeId)?$where [] = "JSON_CONTAINS(g.properties, '{\"courseTypeId\":\"$request->courseTypeId\"}')":null; | |
!empty($request->id)?$where[] = "g.id='$request->id'":null; | |
($request->trashed === StatusConstants::ACTIVE)?$where []= "g.trashed IS NULL":null; | |
($request->trashed === StatusConstants::TRASHED)?$where[]= "g.trashed IS NOT NULL ":null; | |
!empty($request->name)?$where []= "g.name LIKE '%$request->name%'":null; | |
!empty($request->type)?$where []= "g.type = '$request->type'":null; | |
$select = ["g.id","g.identifying_context","g.name","g.type","g.properties","g.trashed","g.created_by","g.created_date","g.updated_by","g.updated_date"]; | |
if($request->getGroupMembers){ | |
$where []= " gm.academic_status = '".$request->memberStatus."'"; | |
$select = array_merge($select,["stdp.id as studentId","std.studentName","stdp.properties->>'$.rollNumber' as rollNo","stdp.properties->>'$.registerNumber' as regNo","gm.properties","gm.groups_id","gm.trashed","gm.id as member_id"]); | |
$innerJoin[] = "INNER JOIN `group_members` gm ON gm.groups_id = g.id AND gm.trashed is null"; | |
$innerJoin[] = "INNER JOIN `student_program_account` stdp ON stdp.id = gm.student_id"; | |
$innerJoin[] = "INNER JOIN `studentaccount` std ON std.studentID = stdp.student_id"; | |
} | |
if($request->startIndex !== "" && $request->endIndex !== "") | |
{ | |
$limitQuery .= " LIMIT $request->startIndex,$request->endIndex"; | |
} | |
$query = " | |
SELECT ".implode(',',$select)." FROM | |
`groups` g | |
".implode(' ',$innerJoin)." | |
".(!empty($where)?"WHERE ".implode(' AND ',$where):"").$limitQuery; | |
try { | |
if($request->getGroupMembers){ | |
$groups = $this->executeQueryForList($query, $this->mapper[GroupServiceMapper::SEARCH_GROUPS_WITH_GROUP_MEMBERS]); | |
}else{ | |
$groups = $this->executeQueryForList($query, $this->mapper[GroupServiceMapper::SEARCH_GROUPS]); | |
} | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_FETCHING,"Cannot fetch group details! Please try again."); | |
} | |
return $groups; | |
} | |
/** | |
* get all batch academic years | |
* @param $year START_YEAR, END_YEAR, ACADEMIC_YEAR | |
* @return Group | |
*/ | |
public function getAllBatchAcademicYears($year="START_YEAR") | |
{ | |
$year = $this->realEscapeString($year); | |
$columns = ""; | |
if ($year === "START_YEAR") { | |
$columns = "g.properties->>'$.startYear' AS year"; | |
} | |
if ($year === "END_YEAR") { | |
$columns = "g.properties->>'$.batchEndYear' AS year"; | |
} | |
if ($year === "ACADEMIC_YEAR") { | |
$columns = "CONCAT(g.properties->>'$.startYear', '-', g.properties->>'\$batchEndYear') AS year"; | |
} | |
$query = "SELECT DISTINCT | |
$columns | |
FROM | |
`groups` g | |
WHERE | |
g.trashed IS NULL AND g.properties->>'$.startYear' IS NOT NULL"; | |
try { | |
$groups = $this->executeQueryForList($query); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_FETCHING,"Cannot fetch group details! Please try again."); | |
} | |
usort($groups,function($groupA, $groupB){ | |
return $groupA->year > $groupB->year; | |
}); | |
$groups = array_values(array_filter($groups, function($g) { return $g->year; })); | |
if(empty($groups)) | |
{ | |
throw new ProfessionalException(ProfessionalException::EMPTY_SEARCH_ITEMS,"No Batch Groups Found"); | |
} | |
return $groups; | |
} | |
/** | |
* Search group by properties | |
* //$request->properties { property : value, property : value } | |
* @return Group | |
*/ | |
public function findGroupByProperties($request) | |
{ | |
$where = []; | |
if(empty($request->properties)){ | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Invalid group properties! Please enter a valid properties"); | |
} | |
try { | |
$request->type ? $where [] = " type = '$request->type' ": []; | |
foreach ($request->properties as $property => $value) { | |
$where [] = " properties->'$.$property' = '$value' "; | |
} | |
$query = "SELECT `id`,`identifying_context`,`name`,`type`,`properties`,`trashed`,`created_by`,`created_date`,`updated_by`,`updated_date` FROM `groups` WHERE ".implode(' AND ',$where); | |
return $this->executeQueryForList($query, $this->mapper[GroupServiceMapper::SEARCH_GROUPS]); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_FETCHING,"Cannot fetch group details! Please try again."); | |
} | |
} | |
/** | |
* Delete Group (Permanent Delete) | |
* @param String $id | |
* @return NULL | |
*/ | |
public function deleteGroupPermanently($id){ | |
$id = $this->realEscapeString($id); | |
if(empty($id)) | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Group is invalid! Please enter a valid group"); | |
GroupMemberService::getInstance()->deleteMembersPermanently($id); | |
$query [] = "DELETE FROM `cluster_groups_relations` WHERE `groups_id` = '$id'"; | |
$query [] = "DELETE FROM `groups_relations` WHERE `parent_groups_id` = '$id'"; | |
$query [] = "DELETE FROM `groups_relations` WHERE `child_groups_id` = '$id'"; | |
$query [] = "DELETE FROM `group_members` WHERE `groups_id` = '$id'"; | |
$query [] = "UPDATE `batches` set `groups_id` = null WHERE `groups_id` = '$id'"; | |
$query [] = "DELETE FROM `groups` WHERE `id` = '$id'"; | |
try { | |
foreach ($query as $value) { | |
$this->executeQuery($value); | |
} | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_DELETING,"Error deleting group! Please try again"); | |
} | |
} | |
/** | |
* Restore Group | |
* @param Object $batch | |
* @param Array $properties | |
* @param Object $groupProperties | |
* @return NULL | |
*/ | |
public function updateGroupProperties($group,$properties,$type,$column = 'properties',$appendProperties = false,$removeProperties = false) | |
{ | |
$group = (object)$this->realEscapeObject($group); | |
$group->properties = (object)$group->properties; | |
switch ($type) { | |
case GroupTypeConstant::BATCH: | |
$groupProperties = new AcademicsBatchProperties(); | |
break; | |
case GroupTypeConstant::SUBJECT: | |
$groupProperties = new AcademicsSubjectProperties(); | |
break; | |
default: | |
# code... | |
break; | |
} | |
if(empty($groupProperties)) | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Invalid properties! Please enter a valid group"); | |
$updatedBy = $GLOBALS['userId']; | |
$id = $group->id; | |
if(empty($id)) | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Group is invalid! Please enter a valid group"); | |
$set = []; | |
if($appendProperties==true || $removeProperties == true ){ | |
if($appendProperties==true){ | |
$externalSyllabusIds =[]; | |
foreach ($properties as $key => $property) { | |
foreach ($property->value as $ele) { | |
$externalSyllabusIds [] = $ele; | |
} | |
} | |
$selectQuery = "SELECT g.properties->>'$.extraSyllabusId' as extraSyllabusId FROM `groups` g WHERE g.id= '$id';"; | |
$existingSyllabus = $this->executeQueryForObject($selectQuery); | |
$newArray = []; | |
if ($existingSyllabus->extraSyllabusId === null || $existingSyllabus->extraSyllabusId === "" || $existingSyllabus->extraSyllabusId === [""] || $existingSyllabus->extraSyllabusId === `"[""]"` ) { | |
$newArray = $externalSyllabusIds; | |
}else{ | |
$existingSyllabusArray = []; | |
$existingSyllabusArray = json_decode($existingSyllabus->extraSyllabusId); | |
$newArray = array_merge($existingSyllabusArray,$externalSyllabusIds); | |
} | |
}if($removeProperties == true){ | |
$externalSyllabusIds =[]; | |
foreach ($properties as $key => $property) { | |
foreach ($property->value as $ele) { | |
$externalSyllabusIds [] = $ele; | |
} | |
} | |
$selectQuery = "SELECT g.properties->>'$.extraSyllabusId' as extraSyllabusId FROM `groups` g WHERE g.id= '$id';"; | |
$existingSyllabus = $this->executeQueryForObject($selectQuery); | |
$existingSyllabusArray = []; | |
$existingSyllabusArray = json_decode($existingSyllabus->extraSyllabusId); | |
$newArray = array_diff($existingSyllabusArray, $externalSyllabusIds); | |
} | |
$value = json_encode($newArray); | |
try { | |
$query = "UPDATE `groups` | |
SET `".$column."` = JSON_SET(`".$column."`, '$.".$property->name."', CAST('$value' AS JSON)), | |
updated_by = '$updatedBy', | |
updated_date = utc_timestamp() | |
WHERE id = '$id';"; | |
$this->executeQuery($query); | |
}catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_RESTORING,"Error restoring academic term! Please try again"); | |
} | |
}else{ | |
try { | |
foreach ($properties as $key => $property) { | |
if(property_exists($groupProperties, $property->name)){ | |
if(is_object($property->value)){ | |
}else if(is_array($property->value)){ | |
$value = "JSON_ARRAY(\"".implode('","',$property->value)."\")"; | |
}else if(is_string($property->value)){ | |
$value = "'".$property->value."'"; | |
}else if(is_bool($property->value)){ | |
$value = $property->value ? "true":"false"; | |
} | |
$query = "UPDATE | |
`groups` | |
SET | |
`".$column."` = JSON_SET(`".$column."`, '$.".$property->name."', $value), | |
updated_by = '$updatedBy', | |
updated_date = utc_timestamp() | |
WHERE | |
id = '$id'"; | |
$this->executeQuery($query); | |
} | |
} | |
} | |
catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_RESTORING,"Error restoring academic term! Please try again"); | |
} | |
} | |
} | |
public function setGroupToGroupRelations($groups,$propertyName){ | |
$propertyName = $this->realEscapeString($propertyName); | |
$groups = $this->realEscapeObject($groups); | |
$parentGroupIds = (array)$groups->properties->{$propertyName}; | |
$createdBy = $GLOBALS['userId']; | |
if(empty($groups->id)){ | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Invalid group! Please try again"); | |
} | |
try{ | |
$deleteGroupRelations = "DELETE FROM `groups_relations` WHERE `child_groups_id` = '$groups->id' AND properties->'$.".$propertyName."' NOT IN (\"".implode('","',$parentGroupIds)."\");"; | |
$this->executeQuery($deleteGroupRelations); | |
$createGroupRelations = "INSERT IGNORE INTO `groups_relations` (`id`,`parent_groups_id`,`child_groups_id`,`properties`,`created_by`) | |
SELECT LEFT(REPLACE(UUID(),'-',''), 17),`id`,'$groups->id',json_object(),'".$createdBy."' FROM `groups` WHERE id IN (\"".implode('","',$parentGroupIds)."\");"; | |
$this->executeQuery($createGroupRelations); | |
}catch(\Exception $e) { | |
throw new ProfessionalException ($e->getCode(),$e->getMessage()); | |
} | |
} | |
public function haveId($id,$type = ''){ | |
if(empty($id)){ | |
switch ($type) { | |
case GroupTypeConstant::BATCH: | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Batch is invalid! Please try again"); | |
break; | |
case GroupTypeConstant::SUBJECT: | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Subject is invalid! Please try again"); | |
break; | |
default: | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"invalid parameters! Please try again"); | |
break; | |
} | |
} | |
} | |
} |