ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.SkillProfileCompletionManager.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
21 namespace ILIAS\Skill\Profile;
22 
25 
34 {
37  protected \ilTree $tree_service;
38  protected \ilObjectDefinition $obj_definition;
39 
40  public function __construct(
41  SkillProfileManager $profile_manager,
42  ?SkillProfileCompletionDBRepository $profile_completion_repo = null
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) {
80  $obj_id = \ilContainerReference::_lookupObjectId($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 }
writeCompletionEntryForAllAssignedUsersOfProfile(int $profile_id)
Write completion entries for a profile for all assigned users of the given 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)
getActualLastLevels(int $user_id, array $skills, string $gap_mode="", string $gap_mode_type="", int $gap_mode_obj_id=0)
deleteEntriesForProfile(int $profile_id)
Delete all profile completion entries for a profile.
static getSupportedObjectTypes()
static _getAllReferences(int $id)
get all reference ids for object ID
getEntries(int $user_id, int $profile_id)
Get profile completion entries for given user-profile-combination.
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
$ref_id
Definition: ltiauth.php:65
deleteEntriesForUser(int $user_id)
Delete all profile completion entries for a user.
getAllEntriesForUser(int $user_id)
Get all profile completion entries for a user.
global $DIC
Definition: shib_login.php:26
getAllEntriesForProfile(int $profile_id)
Get all completion entries for a single profile.
getActualMaxLevels(int $user_id, array $skills, string $gap_mode="", string $gap_mode_type="", int $gap_mode_obj_id=0, string $trigger_user="")
static _lookupObjectId(int $ref_id)
getFulfilledEntriesForUser(int $user_id)
Get all fulfilled profile completion entries for a user.
writeCompletionEntryForAllProfilesOfUser(int $user_id)
Write profile completion entries (fulfilled or non-fulfilled) of user for all profiles.
__construct(SkillProfileManager $profile_manager, ?SkillProfileCompletionDBRepository $profile_completion_repo=null)
getAllProfileCompletionsForUser(int $user_id)
Get all profiles of user which are fulfilled or non-fulfilled.
isProfileFulfilled(int $user_id, int $profile_id)
Check if a profile is fulfilled (progress = 100%)
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...
writeCompletionEntryForRole(int $role_id, int $profile_id)
Write completion entries for a profile for assigned users of a role.
writeCompletionEntryForSingleProfileOfUser(int $user_id, int $profile_id)
Write profile completion entry (fulfilled or non-fulfilled) of user for given profile.
static _lookupType(int $id, bool $reference=false)