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