ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.SkillProfileCompletionManager.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
21namespace ILIAS\Skill\Profile;
22
25
34{
37 protected \ilTree $tree_service;
38 protected \ilObjectDefinition $obj_definition;
39
40 public function __construct(
43 ) {
44 global $DIC;
45
46 $this->profile_manager = $profile_manager;
47 $this->profile_completion_repo = ($profile_completion_repo)
48 ?: $DIC->skills()->internal()->repo()->getProfileCompletionRepo();
49 $this->tree_service = $DIC->repositoryTree();
50 $this->obj_definition = $DIC["objDefinition"];
51 }
52
57 public function getActualMaxLevels(
58 int $user_id,
59 array $skills,
60 string $gap_mode = "",
61 string $gap_mode_type = "",
62 int $gap_mode_obj_id = 0,
63 string $trigger_user = ""
64 ): array {
65 // get actual levels for gap analysis
66 $actual_levels = [];
67 foreach ($skills as $sk) {
68 $bs = new \ilBasicSkill($sk->getBaseSkillId());
69 if ($gap_mode == "max_per_type") {
70 $max = $bs->getMaxLevelPerType($sk->getTrefId(), $gap_mode_type, $user_id);
71 } elseif ($gap_mode == "max_per_object") {
72 if ($this->obj_definition->isContainer(\ilObject::_lookupType($gap_mode_obj_id))) {
73 $sub_objects = $this->tree_service->getSubTree(
74 $this->tree_service->getNodeData((int) current(\ilObject::_getAllReferences($gap_mode_obj_id))),
75 false,
77 );
78 $max = 0;
79 foreach ($sub_objects as $ref_id) {
81 $max_tmp = $bs->getMaxLevelPerObject($sk->getTrefId(), $obj_id, $user_id, 0, $trigger_user);
82 if ($max_tmp > $max) {
83 $max = $max_tmp;
84 }
85 }
86 } else {
87 $max = $bs->getMaxLevelPerObject($sk->getTrefId(), $gap_mode_obj_id, $user_id, 0, $trigger_user);
88 }
89 } else {
90 $max = $bs->getMaxLevel($sk->getTrefId(), $user_id);
91 }
92 $actual_levels[$sk->getBaseSkillId()][$sk->getTrefId()] = $max;
93 }
94
95 return $actual_levels;
96 }
97
103 int $user_id,
104 array $skills,
105 int $obj_id,
106 string $trigger_user
107 ): array {
108 // get actual levels for gap analysis
109 $last_levels = [];
110 foreach ($skills as $sk) {
111 $bs = new \ilBasicSkill($sk->getBaseSkillId());
112 $last = $bs->getLastLevelEntryOfUser(
113 $sk->getTrefId(),
114 $user_id,
115 $obj_id,
116 0,
117 $trigger_user
118 );
119 $last_levels[$sk->getBaseSkillId()][$sk->getTrefId()] = $last;
120 }
121 return $last_levels;
122 }
123
124 public function getActualLastLevels(
125 int $user_id,
126 array $skills,
127 string $gap_mode = "",
128 string $gap_mode_type = "",
129 int $gap_mode_obj_id = 0
130 ): array {
131 // todo for coming feature
132 return [];
133 }
134
140 int $user_id,
141 array $skills,
142 string $gap_mode = "",
143 string $gap_mode_type = "",
144 int $gap_mode_obj_id = 0
145 ): array {
146 // get actual next level fulfilments for gap analysis
147 $fuls = [];
148 foreach ($skills as $sk) {
149 $bs = new \ilBasicSkill($sk->getBaseSkillId());
150 if ($gap_mode == "max_per_type") {
151 $perc = $bs->getNextLevelFulfilmentPerType($sk->getTrefId(), $gap_mode_type, $user_id);
152 } elseif ($gap_mode == "max_per_object") {
153 $perc = $bs->getNextLevelFulfilmentPerObject($sk->getTrefId(), $gap_mode_obj_id, $user_id);
154 } else {
155 $perc = $bs->getNextLevelFulfilment($sk->getTrefId(), $user_id);
156 }
157 $fuls[$sk->getBaseSkillId()][$sk->getTrefId()] = $perc;
158 }
159
160 return $fuls;
161 }
162
166 public function getProfileProgress(int $user_id, int $profile_id): int
167 {
168 $profile_levels = $this->profile_manager->getSkillLevels($profile_id);
169 $actual_levels = $this->getActualMaxLevels($user_id, $profile_levels);
170
171 $profile_count = 0;
172 $achieved_count = 0;
173 foreach ($profile_levels as $level) {
174 if (isset($actual_levels[$level->getBaseSkillId()][$level->getTrefId()]) &&
175 $actual_levels[$level->getBaseSkillId()][$level->getTrefId()] >= $level->getLevelId()) {
176 $achieved_count++;
177 }
178 $profile_count++;
179 }
180 if ($profile_count == 0) {
181 return 0;
182 }
183 $progress = $achieved_count / $profile_count * 100;
184
185 return (int) $progress;
186 }
187
191 public function isProfileFulfilled(int $user_id, int $profile_id): bool
192 {
193 if ($this->getProfileProgress($user_id, $profile_id) == 100) {
194 return true;
195 }
196 return false;
197 }
198
203 public function getAllProfileCompletionsForUser(int $user_id): array
204 {
205 $user_profiles = $this->profile_manager->getProfilesOfUser($user_id);
206 $profile_comps = [];
207 foreach ($user_profiles as $p) {
208 if ($this->isProfileFulfilled($user_id, $p->getId())) {
209 $profile_comps[$p->getId()] = true;
210 } else {
211 $profile_comps[$p->getId()] = false;
212 }
213 }
214
215 return $profile_comps;
216 }
217
222 public function getEntries(int $user_id, int $profile_id): array
223 {
224 return $this->profile_completion_repo->getEntries($user_id, $profile_id);
225 }
226
231 public function getFulfilledEntriesForUser(int $user_id): array
232 {
233 return $this->profile_completion_repo->getFulfilledEntriesForUser($user_id);
234 }
235
240 public function getAllEntriesForUser(int $user_id): array
241 {
242 return $this->profile_completion_repo->getAllEntriesForUser($user_id);
243 }
244
249 public function getAllEntriesForProfile(int $profile_id): array
250 {
251 return $this->profile_completion_repo->getAllEntriesForProfile($profile_id);
252 }
253
258 {
259 $completions = $this->getAllProfileCompletionsForUser($user_id);
260 foreach ($completions as $profile_id => $fulfilled) {
261 if ($fulfilled) {
262 $this->profile_completion_repo->addFulfilmentEntry($user_id, $profile_id);
263 } else {
264 $this->profile_completion_repo->addNonFulfilmentEntry($user_id, $profile_id);
265 }
266 }
267 }
268
272 public function writeCompletionEntryForSingleProfileOfUser(int $user_id, int $profile_id): void
273 {
274 if ($this->isProfileFulfilled($user_id, $profile_id)) {
275 $this->profile_completion_repo->addFulfilmentEntry($user_id, $profile_id);
276 } else {
277 $this->profile_completion_repo->addNonFulfilmentEntry($user_id, $profile_id);
278 }
279 }
280
284 public function writeCompletionEntryForAllAssignedUsersOfProfile(int $profile_id): void
285 {
286 $users = $this->profile_manager->getAssignedUserIdsIncludingRoleAssignments($profile_id);
287 foreach ($users as $user_id) {
288 $this->writeCompletionEntryForSingleProfileOfUser($user_id, $profile_id);
289 }
290 }
291
295 public function writeCompletionEntryForRole(int $role_id, int $profile_id): void
296 {
297 $r_users = $this->profile_manager->getAssignedUsersForRole($role_id);
298 foreach ($r_users as $user_id) {
299 $this->writeCompletionEntryForSingleProfileOfUser($user_id, $profile_id);
300 }
301 }
302
306 public function deleteEntriesForProfile(int $profile_id): void
307 {
308 $this->profile_completion_repo->deleteEntriesForProfile($profile_id);
309 }
310
314 public function deleteEntriesForUser(int $user_id): void
315 {
316 $this->profile_completion_repo->deleteEntriesForUser($user_id);
317 }
318}
writeCompletionEntryForAllProfilesOfUser(int $user_id)
Write profile completion entries (fulfilled or non-fulfilled) of user for all profiles.
getEntries(int $user_id, int $profile_id)
Get profile completion entries for given user-profile-combination.
getActualMaxLevels(int $user_id, array $skills, string $gap_mode="", string $gap_mode_type="", int $gap_mode_obj_id=0, string $trigger_user="")
getActualLastLevels(int $user_id, array $skills, string $gap_mode="", string $gap_mode_type="", int $gap_mode_obj_id=0)
getAllProfileCompletionsForUser(int $user_id)
Get all profiles of user which are fulfilled or non-fulfilled.
__construct(SkillProfileManager $profile_manager, ?SkillProfileCompletionDBRepository $profile_completion_repo=null)
writeCompletionEntryForRole(int $role_id, int $profile_id)
Write completion entries for a profile for assigned users of a role.
getAllEntriesForProfile(int $profile_id)
Get all completion entries for a single profile.
getLastLevelPerObjectAndTriggerUser(int $user_id, array $skills, int $obj_id, string $trigger_user)
This does not include any container logic currently only used for survey, individual assessment.
writeCompletionEntryForAllAssignedUsersOfProfile(int $profile_id)
Write completion entries for a profile for all assigned users of the given profile.
isProfileFulfilled(int $user_id, int $profile_id)
Check if a profile is fulfilled (progress = 100%)
deleteEntriesForProfile(int $profile_id)
Delete all profile completion entries for a profile.
getProfileProgress(int $user_id, int $profile_id)
Get progress in percent for a profile.
getActualNextLevelFulfilments(int $user_id, array $skills, string $gap_mode="", string $gap_mode_type="", int $gap_mode_obj_id=0)
deleteEntriesForUser(int $user_id)
Delete all profile completion entries for a user.
getFulfilledEntriesForUser(int $user_id)
Get all fulfilled profile completion entries for a user.
getAllEntriesForUser(int $user_id)
Get all profile completion entries for a user.
writeCompletionEntryForSingleProfileOfUser(int $user_id, int $profile_id)
Write profile completion entry (fulfilled or non-fulfilled) of user for given profile.
static getSupportedObjectTypes()
static _lookupObjectId(int $ref_id)
static _lookupType(int $id, bool $reference=false)
static _getAllReferences(int $id)
get all reference ids for object ID
return['delivery_method'=> 'php',]
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$ref_id
Definition: ltiauth.php:66
global $DIC
Definition: shib_login.php:26