ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.ilSkillUserLevelDBRepository.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 {
23  protected ilDBInterface $db;
24 
25  public function __construct(?ilDBInterface $db = null)
26  {
27  global $DIC;
28 
29  $this->db = ($db)
30  ?: $DIC->database();
31  }
32 
33  public function deleteUserLevelsOfSkill(int $skill_id, bool $is_referenece = false): void
34  {
35  $ilDB = $this->db;
36 
37  if (!$is_referenece) {
38  $ilDB->manipulate(
39  "DELETE FROM skl_user_has_level WHERE "
40  . " skill_id = " . $ilDB->quote($skill_id, "integer")
41  );
42  $ilDB->manipulate(
43  "DELETE FROM skl_user_skill_level WHERE "
44  . " skill_id = " . $ilDB->quote($skill_id, "integer")
45  );
46  } else {
47  $ilDB->manipulate(
48  "DELETE FROM skl_user_has_level WHERE "
49  . " tref_id = " . $ilDB->quote($skill_id, "integer")
50  );
51  $ilDB->manipulate(
52  "DELETE FROM skl_user_skill_level WHERE "
53  . " tref_id = " . $ilDB->quote($skill_id, "integer")
54  );
55  }
56  }
57 
61  public function resetUserSkillLevelStatus(
62  bool $update,
63  int $trigger_obj_id,
64  string $status_date,
65  int $a_user_id,
66  int $a_skill_id,
67  int $a_tref_id = 0,
68  int $a_trigger_ref_id = 0,
69  bool $a_self_eval = false
70  ): void {
71  $ilDB = $this->db;
72 
73  $now = ilUtil::now();
74  if ($update) {
75  // this will only be set in self eval case, means this will always have a $rec
76  $ilDB->manipulate(
77  "UPDATE skl_user_skill_level SET " .
78  " level_id = " . $ilDB->quote(0, "integer") . "," .
79  " next_level_fulfilment = " . $ilDB->quote(0.0, "float") . "," .
80  " status_date = " . $ilDB->quote($now, "timestamp") .
81  " WHERE user_id = " . $ilDB->quote($a_user_id, "integer") .
82  " AND status_date = " . $ilDB->quote($status_date, "timestamp") .
83  " AND skill_id = " . $ilDB->quote($a_skill_id, "integer") .
84  " AND status = " . $ilDB->quote(ilBasicSkill::ACHIEVED, "integer") .
85  " AND trigger_obj_id = " . $ilDB->quote($trigger_obj_id, "integer") .
86  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
87  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
88  );
89  } else {
90  $ilDB->manipulate("INSERT INTO skl_user_skill_level " .
91  "(level_id, user_id, tref_id, status_date, skill_id, status, valid, trigger_ref_id," .
92  "trigger_obj_id, trigger_obj_type, trigger_title, self_eval, unique_identifier," .
93  "next_level_fulfilment) VALUES (" .
94  $ilDB->quote(0, "integer") . "," .
95  $ilDB->quote($a_user_id, "integer") . "," .
96  $ilDB->quote($a_tref_id, "integer") . "," .
97  $ilDB->quote($now, "timestamp") . "," .
98  $ilDB->quote($a_skill_id, "integer") . "," .
99  $ilDB->quote(ilBasicSkill::ACHIEVED, "integer") . "," .
100  $ilDB->quote(1, "integer") . "," .
101  $ilDB->quote($a_trigger_ref_id, "integer") . "," .
102  $ilDB->quote($trigger_obj_id, "integer") . "," .
103  $ilDB->quote("", "text") . "," .
104  $ilDB->quote("", "text") . "," .
105  $ilDB->quote($a_self_eval, "integer") . "," .
106  $ilDB->quote("", "text") . "," .
107  $ilDB->quote(0.0, "float") .
108  ")");
109  }
110 
111  $ilDB->manipulate(
112  "DELETE FROM skl_user_has_level WHERE "
113  . " user_id = " . $ilDB->quote($a_user_id, "integer")
114  . " AND skill_id = " . $ilDB->quote($a_skill_id, "integer")
115  . " AND tref_id = " . $ilDB->quote($a_tref_id, "integer")
116  . " AND trigger_obj_id = " . $ilDB->quote($trigger_obj_id, "integer")
117  . " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
118  );
119  }
120 
124  public function hasRecentSelfEvaluation(
125  int $trigger_obj_id,
126  int $a_user_id,
127  int $a_skill_id,
128  int $a_tref_id = 0,
129  int $a_trigger_ref_id = 0
130  ): string {
131  $ilDB = $this->db;
132 
133  $recent = "";
134 
135  $ilDB->setLimit(1, 0);
136  $set = $ilDB->query(
137  "SELECT * FROM skl_user_skill_level WHERE " .
138  "skill_id = " . $ilDB->quote($a_skill_id, "integer") . " AND " .
139  "user_id = " . $ilDB->quote($a_user_id, "integer") . " AND " .
140  "tref_id = " . $ilDB->quote($a_tref_id, "integer") . " AND " .
141  "trigger_obj_id = " . $ilDB->quote($trigger_obj_id, "integer") . " AND " .
142  "self_eval = " . $ilDB->quote(1, "integer") .
143  " ORDER BY status_date DESC"
144  );
145  if ($rec = $ilDB->fetchAssoc($set)) {
146  $status_day = substr($rec["status_date"], 0, 10);
147  $today = substr(ilUtil::now(), 0, 10);
148  if ($rec["valid"] && $rec["status"] == ilBasicSkill::ACHIEVED && $status_day == $today) {
149  $recent = $rec["status_date"];
150  }
151  }
152 
153  return $recent;
154  }
155 
159  public function getNewAchievementsPerUser(
160  string $a_timestamp,
161  ?string $a_timestamp_to = null,
162  int $a_user_id = 0,
163  int $a_self_eval = 0
164  ): array {
165  $ilDB = $this->db;
166 
167  $to = (!is_null($a_timestamp_to))
168  ? " AND status_date <= " . $ilDB->quote($a_timestamp_to, "timestamp")
169  : "";
170 
171  $user = ($a_user_id > 0)
172  ? " AND user_id = " . $ilDB->quote($a_user_id, "integer")
173  : "";
174 
175  $set = $ilDB->query("SELECT * FROM skl_user_skill_level " .
176  " WHERE status_date >= " . $ilDB->quote($a_timestamp, "timestamp") .
177  " AND valid = " . $ilDB->quote(1, "integer") .
178  " AND status = " . $ilDB->quote(ilBasicSkill::ACHIEVED, "integer") .
179  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer") .
180  $to .
181  $user .
182  " ORDER BY user_id, status_date ASC ");
183  $achievements = [];
184  while ($rec = $ilDB->fetchAssoc($set)) {
185  $rec['user_id'] = (int) $rec['user_id'];
186  $rec['level_id'] = (int) $rec['level_id'];
187  $rec['skill_id'] = (int) $rec['skill_id'];
188  $rec['status'] = (int) $rec['status'];
189  $rec['valid'] = (int) $rec['valid'];
190  $rec['trigger_ref_id'] = (int) $rec['trigger_ref_id'];
191  $rec['trigger_obj_id'] = (int) $rec['trigger_obj_id'];
192  $rec['tref_id'] = (int) $rec['tref_id'];
193  $rec['self_eval'] = (int) $rec['self_eval'];
194  $rec['next_level_fulfilment'] = (float) $rec['next_level_fulfilment'];
195  $achievements[$rec["user_id"]][] = $rec;
196  }
197 
198  return $achievements;
199  }
200 
204  public function writeUserSkillLevelStatus(
205  int $skill_id,
206  int $trigger_ref_id,
207  int $trigger_obj_id,
208  ?string $trigger_title,
209  ?string $trigger_type,
210  bool $update,
211  string $status_date,
212  int $a_level_id,
213  int $a_user_id,
214  int $a_tref_id = 0,
215  bool $a_self_eval = false,
216  string $a_unique_identifier = "",
217  float $a_next_level_fulfilment = 0.0,
218  string $trigger_user_id = ""
219  ): void {
220  $ilDB = $this->db;
221  $a_status = ilBasicSkill::ACHIEVED;
222 
223  if ($trigger_user_id == "") {
224  $trigger_user_id = "-";
225  }
226 
227  if ($update) {
228  // this will only be set in self eval case, means this will always have a $rec
229  $now = ilUtil::now();
230  $ilDB->manipulate(
231  "UPDATE skl_user_skill_level SET " .
232  " level_id = " . $ilDB->quote($a_level_id, "integer") . "," .
233  " status_date = " . $ilDB->quote($now, "timestamp") . "," .
234  " next_level_fulfilment = " . $ilDB->quote($a_next_level_fulfilment, "float") .
235  " WHERE user_id = " . $ilDB->quote($a_user_id, "integer") .
236  " AND status_date = " . $ilDB->quote($status_date, "timestamp") .
237  " AND skill_id = " . $ilDB->quote($skill_id, "integer") .
238  " AND status = " . $ilDB->quote($a_status, "integer") .
239  " AND trigger_obj_id = " . $ilDB->quote($trigger_obj_id, "integer") .
240  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
241  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer") .
242  " AND trigger_user_id = " . $ilDB->quote($trigger_user_id, "text")
243  );
244  } else {
245  if ($a_unique_identifier != "") {
246  $ilDB->manipulate(
247  "DELETE FROM skl_user_skill_level WHERE " .
248  " user_id = " . $ilDB->quote($a_user_id, "integer") .
249  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
250  " AND skill_id = " . $ilDB->quote($skill_id, "integer") .
251  " AND trigger_ref_id = " . $ilDB->quote($trigger_ref_id, "integer") .
252  " AND trigger_obj_id = " . $ilDB->quote($trigger_obj_id, "integer") .
253  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer") .
254  " AND unique_identifier = " . $ilDB->quote($a_unique_identifier, "text") .
255  " AND trigger_user_id = " . $ilDB->quote($trigger_user_id, "text")
256  );
257  }
258 
259  $now = ilUtil::now();
260  $ilDB->manipulate("INSERT INTO skl_user_skill_level " .
261  "(level_id, user_id, tref_id, status_date, skill_id, status, valid, trigger_ref_id," .
262  "trigger_obj_id, trigger_obj_type, trigger_title, self_eval, unique_identifier," .
263  "next_level_fulfilment, trigger_user_id) VALUES (" .
264  $ilDB->quote($a_level_id, "integer") . "," .
265  $ilDB->quote($a_user_id, "integer") . "," .
266  $ilDB->quote($a_tref_id, "integer") . "," .
267  $ilDB->quote($now, "timestamp") . "," .
268  $ilDB->quote($skill_id, "integer") . "," .
269  $ilDB->quote($a_status, "integer") . "," .
270  $ilDB->quote(1, "integer") . "," .
271  $ilDB->quote($trigger_ref_id, "integer") . "," .
272  $ilDB->quote($trigger_obj_id, "integer") . "," .
273  $ilDB->quote($trigger_type, "text") . "," .
274  $ilDB->quote($trigger_title, "text") . "," .
275  $ilDB->quote($a_self_eval, "integer") . "," .
276  $ilDB->quote($a_unique_identifier, "text") . "," .
277  $ilDB->quote($a_next_level_fulfilment, "float") . "," .
278  $ilDB->quote($trigger_user_id, "text") .
279  ")");
280  }
281 
282  // fix (removed level_id and added skill id, since table should hold only
283  // one entry per skill)
284  $ilDB->manipulate(
285  "DELETE FROM skl_user_has_level WHERE "
286  . " user_id = " . $ilDB->quote($a_user_id, "integer")
287  . " AND skill_id = " . $ilDB->quote($skill_id, "integer")
288  . " AND tref_id = " . $ilDB->quote($a_tref_id, "integer")
289  . " AND trigger_obj_id = " . $ilDB->quote($trigger_obj_id, "integer")
290  . " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
291  );
292 
293  if ($a_status == ilBasicSkill::ACHIEVED) {
294  $ilDB->manipulate("INSERT INTO skl_user_has_level " .
295  "(level_id, user_id, tref_id, status_date, skill_id, trigger_ref_id, trigger_obj_id, trigger_obj_type," .
296  "trigger_title, self_eval, next_level_fulfilment, trigger_user_id) VALUES (" .
297  $ilDB->quote($a_level_id, "integer") . "," .
298  $ilDB->quote($a_user_id, "integer") . "," .
299  $ilDB->quote($a_tref_id, "integer") . "," .
300  $ilDB->quote($now, "timestamp") . "," .
301  $ilDB->quote($skill_id, "integer") . "," .
302  $ilDB->quote($trigger_ref_id, "integer") . "," .
303  $ilDB->quote($trigger_obj_id, "integer") . "," .
304  $ilDB->quote($trigger_type, "text") . "," .
305  $ilDB->quote($trigger_title, "text") . "," .
306  $ilDB->quote($a_self_eval, "integer") . "," .
307  $ilDB->quote($a_next_level_fulfilment, "float") . "," .
308  $ilDB->quote($trigger_user_id, "text") .
309  ")");
310  }
311  }
312 
317  int $a_user_id,
318  int $a_trigger_obj_id,
319  bool $a_self_eval = false,
320  string $a_unique_identifier = ""
321  ): bool {
322  $ilDB = $this->db;
323 
324  $changed = false;
325 
326  $aff_rows = $ilDB->manipulate(
327  "DELETE FROM skl_user_skill_level WHERE "
328  . " user_id = " . $ilDB->quote($a_user_id, "integer")
329  . " AND trigger_obj_id = " . $ilDB->quote($a_trigger_obj_id, "integer")
330  . " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
331  . " AND unique_identifier = " . $ilDB->quote($a_unique_identifier, "text")
332  );
333  if ($aff_rows > 0) {
334  $changed = true;
335  }
336 
337  $aff_rows = $ilDB->manipulate(
338  "DELETE FROM skl_user_has_level WHERE "
339  . " user_id = " . $ilDB->quote($a_user_id, "integer")
340  . " AND trigger_obj_id = " . $ilDB->quote($a_trigger_obj_id, "integer")
341  . " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
342  );
343  if ($aff_rows > 0) {
344  $changed = true;
345  }
346  return $changed;
347  }
348 
349  public function removeAllUserData(int $a_user_id): void
350  {
351  $ilDB = $this->db;
352 
353  $ilDB->manipulate(
354  "DELETE FROM skl_user_skill_level WHERE "
355  . " user_id = " . $ilDB->quote($a_user_id, "integer")
356  );
357  $ilDB->manipulate(
358  "DELETE FROM skl_user_has_level WHERE "
359  . " user_id = " . $ilDB->quote($a_user_id, "integer")
360  );
361  }
362 
363  public function getMaxLevelPerType(
364  int $skill_id,
365  array $levels,
366  int $a_tref_id,
367  string $a_type,
368  int $a_user_id = 0,
369  int $a_self_eval = 0
370  ): int {
371  $ilDB = $this->db;
372 
373  $set = $ilDB->query(
374  $q = "SELECT level_id FROM skl_user_has_level " .
375  " WHERE trigger_obj_type = " . $ilDB->quote($a_type, "text") .
376  " AND skill_id = " . $ilDB->quote($skill_id, "integer") .
377  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
378  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
379  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
380  );
381 
382  $has_level = [];
383  while ($rec = $ilDB->fetchAssoc($set)) {
384  $has_level[$rec["level_id"]] = true;
385  }
386  $max_level = 0;
387  foreach ($levels as $l) {
388  if (isset($has_level[$l["id"]])) {
389  $max_level = (int) $l["id"];
390  }
391  }
392  return $max_level;
393  }
394 
396  int $skill_id,
397  int $a_tref_id,
398  string $a_type,
399  int $a_user_id = 0,
400  int $a_self_eval = 0
401  ): float {
402  $ilDB = $this->db;
403 
404  $set = $ilDB->query(
405  $q = "SELECT next_level_fulfilment FROM skl_user_has_level " .
406  " WHERE trigger_obj_type = " . $ilDB->quote($a_type, "text") .
407  " AND skill_id = " . $ilDB->quote($skill_id, "integer") .
408  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
409  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
410  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
411  );
412 
413  if ($rec = $ilDB->fetchAssoc($set)) {
414  return (float) $rec["next_level_fulfilment"];
415  }
416 
417  return 0;
418  }
419 
420  public function getAllLevelEntriesOfUser(
421  int $skill_id,
422  int $a_tref_id,
423  int $a_user_id = 0,
424  int $a_self_eval = 0
425  ): array {
426  $ilDB = $this->db;
427 
428  $set = $ilDB->query(
429  $q = "SELECT * FROM skl_user_has_level " .
430  " WHERE skill_id = " . $ilDB->quote($skill_id, "integer") .
431  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
432  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
433  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer") .
434  " ORDER BY status_date DESC"
435  );
436 
437  $levels = [];
438  while ($rec = $ilDB->fetchAssoc($set)) {
439  $rec['user_id'] = (int) $rec['user_id'];
440  $rec['level_id'] = (int) $rec['level_id'];
441  $rec['skill_id'] = (int) $rec['skill_id'];
442  $rec['status'] = (int) $rec['status'];
443  $rec['valid'] = (int) $rec['valid'];
444  $rec['trigger_ref_id'] = (int) $rec['trigger_ref_id'];
445  $rec['trigger_obj_id'] = (int) $rec['trigger_obj_id'];
446  $rec['tref_id'] = (int) $rec['tref_id'];
447  $rec['self_eval'] = (int) $rec['self_eval'];
448  $rec['next_level_fulfilment'] = (float) $rec['next_level_fulfilment'];
449  $levels[] = $rec;
450  }
451  return $levels;
452  }
453 
455  int $skill_id,
456  int $a_tref_id,
457  int $a_user_id = 0,
458  int $a_eval_by = 0,
459  int $trigger_object_id = 0,
460  string $trigger_user = ""
461  ): array {
462  $ilDB = $this->db;
463 
464  $by = ($a_eval_by != ilBasicSkill::EVAL_BY_ALL)
465  ? " AND self_eval = " . $ilDB->quote($a_eval_by, "integer")
466  : "";
467  $trigger_obj_str = ($trigger_object_id > 0)
468  ? " AND trigger_obj_id = " . $ilDB->quote($trigger_object_id, "integer")
469  : "";
470  $trigger_user_str = ($trigger_user !== "")
471  ? " AND trigger_user_id = " . $ilDB->quote($trigger_user, "text")
472  : "";
473 
474  $set = $ilDB->query(
475  $q = "SELECT * FROM skl_user_skill_level " .
476  " WHERE skill_id = " . $ilDB->quote($skill_id, "integer") .
477  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
478  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
479  $by .
480  $trigger_obj_str .
481  $trigger_user_str .
482  " ORDER BY status_date DESC"
483  );
484  $levels = [];
485  while ($rec = $ilDB->fetchAssoc($set)) {
486  $rec['user_id'] = (int) $rec['user_id'];
487  $rec['level_id'] = (int) $rec['level_id'];
488  $rec['skill_id'] = (int) $rec['skill_id'];
489  $rec['status'] = (int) $rec['status'];
490  $rec['valid'] = (int) $rec['valid'];
491  $rec['trigger_ref_id'] = (int) $rec['trigger_ref_id'];
492  $rec['trigger_obj_id'] = (int) $rec['trigger_obj_id'];
493  $rec['tref_id'] = (int) $rec['tref_id'];
494  $rec['self_eval'] = (int) $rec['self_eval'];
495  $rec['next_level_fulfilment'] = (float) $rec['next_level_fulfilment'];
496  $levels[] = $rec;
497  }
498  return $levels;
499  }
500 
501  public function getLastLevelEntryOfUser(
502  int $skill_id,
503  int $a_tref_id,
504  int $a_user_id,
505  int $a_object_id = 0,
506  int $a_self_eval = 0,
507  string $trigger_user = ""
508  ): int {
509  foreach ($this->getAllHistoricLevelEntriesOfUser(
510  $skill_id,
511  $a_tref_id,
512  $a_user_id,
513  $a_self_eval,
514  $a_object_id,
515  $trigger_user
516  ) as $level) {
517  return $level["level_id"];
518  }
519  return 0;
520  }
521 
522 
523  public function getMaxLevelPerObject(
524  int $skill_id,
525  array $levels,
526  int $a_tref_id,
527  int $a_object_id,
528  int $a_user_id = 0,
529  int $a_self_eval = 0,
530  string $trigger_user = ""
531  ): int {
532  $ilDB = $this->db;
533 
534  $tr_user = "";
535  if ($trigger_user !== "") {
536  $tr_user = " AND trigger_user_id = " . $ilDB->quote($skill_id, "text");
537  }
538 
539  $set = $ilDB->query(
540  $q = "SELECT level_id FROM skl_user_has_level " .
541  " WHERE trigger_obj_id = " . $ilDB->quote($a_object_id, "integer") .
542  " AND skill_id = " . $ilDB->quote($skill_id, "integer") .
543  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
544  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
545  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer") . $tr_user
546  );
547 
548  $has_level = [];
549  while ($rec = $ilDB->fetchAssoc($set)) {
550  $has_level[$rec["level_id"]] = true;
551  }
552  $max_level = 0;
553  foreach ($levels as $l) {
554  if (isset($has_level[$l["id"]])) {
555  $max_level = (int) $l["id"];
556  }
557  }
558  return $max_level;
559  }
560 
562  int $skill_id,
563  int $a_tref_id,
564  int $a_object_id,
565  int $a_user_id = 0,
566  int $a_self_eval = 0
567  ): float {
568  $ilDB = $this->db;
569 
570  $set = $ilDB->query(
571  $q = "SELECT next_level_fulfilment FROM skl_user_has_level " .
572  " WHERE trigger_obj_id = " . $ilDB->quote($a_object_id, "integer") .
573  " AND skill_id = " . $ilDB->quote($skill_id, "integer") .
574  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
575  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
576  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
577  );
578 
579  if ($rec = $ilDB->fetchAssoc($set)) {
580  return (float) $rec["next_level_fulfilment"];
581  }
582 
583  return 0;
584  }
585 
586  public function getMaxLevel(
587  int $skill_id,
588  array $levels,
589  int $a_tref_id,
590  int $a_user_id = 0,
591  int $a_self_eval = 0
592  ): int {
593  $ilDB = $this->db;
594 
595  $set = $ilDB->query(
596  $q = "SELECT level_id FROM skl_user_has_level " .
597  " WHERE skill_id = " . $ilDB->quote($skill_id, "integer") .
598  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
599  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
600  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
601  );
602 
603  $has_level = [];
604  while ($rec = $ilDB->fetchAssoc($set)) {
605  $has_level[$rec["level_id"]] = true;
606  }
607  $max_level = 0;
608  foreach ($levels as $l) {
609  if (isset($has_level[$l["id"]])) {
610  $max_level = (int) $l["id"];
611  }
612  }
613  return $max_level;
614  }
615 
616  public function getNextLevelFulfilment(
617  int $skill_id,
618  int $a_tref_id,
619  int $a_user_id = 0,
620  int $a_self_eval = 0
621  ): float {
622  $ilDB = $this->db;
623 
624  $set = $ilDB->query(
625  $q = "SELECT next_level_fulfilment FROM skl_user_has_level " .
626  " WHERE skill_id = " . $ilDB->quote($skill_id, "integer") .
627  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
628  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
629  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
630  );
631 
632  if ($rec = $ilDB->fetchAssoc($set)) {
633  return (float) $rec["next_level_fulfilment"];
634  }
635 
636  return 0;
637  }
638 
639  public function hasSelfEvaluated(int $a_user_id, int $a_skill_id, int $a_tref_id): bool
640  {
641  $ilDB = $this->db;
642 
643  $set = $ilDB->query(
644  $q = "SELECT level_id FROM skl_user_has_level " .
645  " WHERE skill_id = " . $ilDB->quote($a_skill_id, "integer") .
646  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
647  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
648  " AND self_eval = " . $ilDB->quote(1, "integer")
649  );
650 
651  return !!$ilDB->fetchAssoc($set);
652  }
653 
654  public function getLastLevelPerObject(
655  int $skill_id,
656  int $a_tref_id,
657  int $a_object_id,
658  int $a_user_id = 0,
659  int $a_self_eval = 0
660  ): int {
661  $ilDB = $this->db;
662 
663  $ilDB->setLimit(1, 0);
664  $set = $ilDB->query(
665  $q = "SELECT level_id FROM skl_user_has_level " .
666  " WHERE trigger_obj_id = " . $ilDB->quote($a_object_id, "integer") .
667  " AND skill_id = " . $ilDB->quote($skill_id, "integer") .
668  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
669  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
670  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer") .
671  " ORDER BY status_date DESC"
672  );
673 
674  if ($rec = $ilDB->fetchAssoc($set)) {
675  return (int) $rec["level_id"];
676  }
677 
678  return 0;
679  }
680 
681  public function getLastUpdatePerObject(
682  int $skill_id,
683  int $a_tref_id,
684  int $a_object_id,
685  int $a_user_id = 0,
686  int $a_self_eval = 0
687  ): string {
688  $ilDB = $this->db;
689 
690  $ilDB->setLimit(1, 0);
691  $set = $ilDB->query(
692  $q = "SELECT status_date FROM skl_user_has_level " .
693  " WHERE trigger_obj_id = " . $ilDB->quote($a_object_id, "integer") .
694  " AND skill_id = " . $ilDB->quote($skill_id, "integer") .
695  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
696  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
697  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer") .
698  " ORDER BY status_date DESC"
699  );
700 
701  if ($rec = $ilDB->fetchAssoc($set)) {
702  return $rec["status_date"];
703  }
704 
705  return "";
706  }
707 }
hasRecentSelfEvaluation(int $trigger_obj_id, int $a_user_id, int $a_skill_id, int $a_tref_id=0, int $a_trigger_ref_id=0)
hasSelfEvaluated(int $a_user_id, int $a_skill_id, int $a_tref_id)
resetUserSkillLevelStatus(bool $update, int $trigger_obj_id, string $status_date, int $a_user_id, int $a_skill_id, int $a_tref_id=0, int $a_trigger_ref_id=0, bool $a_self_eval=false)
getNextLevelFulfilmentPerType(int $skill_id, int $a_tref_id, string $a_type, int $a_user_id=0, int $a_self_eval=0)
getLastUpdatePerObject(int $skill_id, int $a_tref_id, int $a_object_id, int $a_user_id=0, int $a_self_eval=0)
getAllHistoricLevelEntriesOfUser(int $skill_id, int $a_tref_id, int $a_user_id=0, int $a_eval_by=0, int $trigger_object_id=0, string $trigger_user="")
Interface ilSkillUserLevelRepository.
static now()
Return current timestamp in Y-m-d H:i:s format.
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
getNextLevelFulfilmentPerObject(int $skill_id, int $a_tref_id, int $a_object_id, int $a_user_id=0, int $a_self_eval=0)
getLastLevelEntryOfUser(int $skill_id, int $a_tref_id, int $a_user_id, int $a_object_id=0, int $a_self_eval=0, string $trigger_user="")
global $DIC
Definition: shib_login.php:26
deleteUserLevelsOfSkill(int $skill_id, bool $is_referenece=false)
getNewAchievementsPerUser(string $a_timestamp, ?string $a_timestamp_to=null, int $a_user_id=0, int $a_self_eval=0)
writeUserSkillLevelStatus(int $skill_id, int $trigger_ref_id, int $trigger_obj_id, ?string $trigger_title, ?string $trigger_type, bool $update, string $status_date, int $a_level_id, int $a_user_id, int $a_tref_id=0, bool $a_self_eval=false, string $a_unique_identifier="", float $a_next_level_fulfilment=0.0, string $trigger_user_id="")
getMaxLevel(int $skill_id, array $levels, int $a_tref_id, int $a_user_id=0, int $a_self_eval=0)
getAllLevelEntriesOfUser(int $skill_id, int $a_tref_id, int $a_user_id=0, int $a_self_eval=0)
removeAllUserSkillLevelStatusOfObject(int $a_user_id, int $a_trigger_obj_id, bool $a_self_eval=false, string $a_unique_identifier="")
$q
Definition: shib_logout.php:23
getNextLevelFulfilment(int $skill_id, int $a_tref_id, int $a_user_id=0, int $a_self_eval=0)
getLastLevelPerObject(int $skill_id, int $a_tref_id, int $a_object_id, int $a_user_id=0, int $a_self_eval=0)
getMaxLevelPerObject(int $skill_id, array $levels, int $a_tref_id, int $a_object_id, int $a_user_id=0, int $a_self_eval=0, string $trigger_user="")
getMaxLevelPerType(int $skill_id, array $levels, int $a_tref_id, string $a_type, int $a_user_id=0, int $a_self_eval=0)