ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilBasicSkill.php
Go to the documentation of this file.
1 <?php
2 
3 /* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
4 
5 include_once("./Services/Skill/classes/class.ilSkillTreeNode.php");
6 include_once("./Services/Skill/interfaces/interface.ilSkillUsageInfo.php");
7 
17 {
21  protected $db;
22 
26  protected $user;
27 
28  const ACHIEVED = 1;
29  const NOT_ACHIEVED = 0;
30 
31  const EVAL_BY_OTHERS_ = 0;
32  const EVAL_BY_SELF = 1;
33  const EVAL_BY_ALL = 2;
34 
35  public $id;
36 
41  public function __construct($a_id = 0)
42  {
43  global $DIC;
44 
45  $this->db = $DIC->database();
46  $this->user = $DIC->user();
47  parent::__construct($a_id);
48  $this->setType("skll");
49  }
50 
54  public function read()
55  {
56  parent::read();
57  }
58 
63  public function create()
64  {
65  parent::create();
66  }
67 
71  public function delete()
72  {
73  $ilDB = $this->db;
74 
75  $ilDB->manipulate(
76  "DELETE FROM skl_level WHERE "
77  . " skill_id = " . $ilDB->quote($this->getId(), "integer")
78  );
79 
80  $ilDB->manipulate(
81  "DELETE FROM skl_user_has_level WHERE "
82  . " skill_id = " . $ilDB->quote($this->getId(), "integer")
83  );
84 
85  parent::delete();
86  }
87 
91  public function copy()
92  {
93  $skill = new ilBasicSkill();
94  $skill->setTitle($this->getTitle());
95  $skill->setType($this->getType());
96  $skill->setSelfEvaluation($this->getSelfEvaluation());
97  $skill->setOrderNr($this->getOrderNr());
98  $skill->create();
99 
100  $levels = $this->getLevelData();
101  if (sizeof($levels)) {
102  foreach ($levels as $item) {
103  $skill->addLevel($item["title"], $item["description"]);
104  }
105  }
106  $skill->update();
107 
108  return $skill;
109  }
110 
111  //
112  //
113  // Skill level related methods
114  //
115  //
116 
123  public function addLevel($a_title, $a_description, $a_import_id = "")
124  {
125  $ilDB = $this->db;
126 
127  $nr = $this->getMaxLevelNr();
128  $nid = $ilDB->nextId("skl_level");
129  $ilDB->insert("skl_level", array(
130  "id" => array("integer", $nid),
131  "skill_id" => array("integer", $this->getId()),
132  "nr" => array("integer", $nr + 1),
133  "title" => array("text", $a_title),
134  "description" => array("clob", $a_description),
135  "import_id" => array("text", $a_import_id),
136  "creation_date" => array("timestamp", ilUtil::now())
137  ));
138  }
139 
145  public function getMaxLevelNr()
146  {
147  $ilDB = $this->db;
148 
149  $set = $ilDB->query(
150  "SELECT MAX(nr) mnr FROM skl_level WHERE " .
151  " skill_id = " . $ilDB->quote($this->getId(), "integer")
152  );
153  $rec = $ilDB->fetchAssoc($set);
154  return (int) $rec["mnr"];
155  }
156 
162  public function getLevelData($a_id = 0)
163  {
164  $ilDB = $this->db;
165 
166  if ($a_id > 0) {
167  $and = " AND id = " . $ilDB->quote($a_id, "integer");
168  }
169 
170  $set = $ilDB->query(
171  "SELECT * FROM skl_level WHERE " .
172  " skill_id = " . $ilDB->quote($this->getId(), "integer") .
173  $and .
174  " ORDER BY nr"
175  );
176  $levels = array();
177  while ($rec = $ilDB->fetchAssoc($set)) {
178  if ($a_id > 0) {
179  return $rec;
180  }
181  $levels[] = $rec;
182  }
183  return $levels;
184  }
185 
192  protected static function lookupLevelProperty($a_id, $a_prop)
193  {
194  global $DIC;
195 
196  $ilDB = $DIC->database();
197 
198  $set = $ilDB->query(
199  "SELECT $a_prop FROM skl_level WHERE " .
200  " id = " . $ilDB->quote($a_id, "integer")
201  );
202  $rec = $ilDB->fetchAssoc($set);
203  return $rec[$a_prop];
204  }
205 
212  public static function lookupLevelTitle($a_id)
213  {
214  return ilBasicSkill::lookupLevelProperty($a_id, "title");
215  }
216 
223  public static function lookupLevelDescription($a_id)
224  {
225  return ilBasicSkill::lookupLevelProperty($a_id, "description");
226  }
227 
234  public static function lookupLevelSkillId($a_id)
235  {
236  return ilBasicSkill::lookupLevelProperty($a_id, "skill_id");
237  }
238 
245  protected static function writeLevelProperty($a_id, $a_prop, $a_value, $a_type)
246  {
247  global $DIC;
248 
249  $ilDB = $DIC->database();
250 
251  $ilDB->update("skl_level", array(
252  $a_prop => array($a_type, $a_value),
253  ), array(
254  "id" => array("integer", $a_id),
255  ));
256  }
257 
264  public static function writeLevelTitle($a_id, $a_title)
265  {
266  ilBasicSkill::writeLevelProperty($a_id, "title", $a_title, "text");
267  }
268 
275  public static function writeLevelDescription($a_id, $a_description)
276  {
277  ilBasicSkill::writeLevelProperty($a_id, "description", $a_description, "clob");
278  }
279 
286  public function updateLevelOrder($order)
287  {
288  $ilDB = $this->db;
289 
290  asort($order);
291 
292  $cnt = 1;
293  foreach ($order as $id => $o) {
294  $ilDB->manipulate(
295  "UPDATE skl_level SET " .
296  " nr = " . $ilDB->quote($cnt, "integer") .
297  " WHERE id = " . $ilDB->quote($id, "integer")
298  );
299  $cnt++;
300  }
301  }
302 
309  public function deleteLevel($a_id)
310  {
311  $ilDB = $this->db;
312 
313  $ilDB->manipulate(
314  "DELETE FROM skl_level WHERE "
315  . " id = " . $ilDB->quote($a_id, "integer")
316  );
317  }
318 
325  public function fixLevelNumbering()
326  {
327  $ilDB = $this->db;
328 
329  $set = $ilDB->query(
330  "SELECT id, nr FROM skl_level WHERE " .
331  " skill_id = " . $ilDB->quote($this->getId(), "integer") .
332  " ORDER BY nr ASC"
333  );
334  $cnt = 1;
335  while ($rec = $ilDB->fetchAssoc($set)) {
336  $ilDB->manipulate(
337  "UPDATE skl_level SET " .
338  " nr = " . $ilDB->quote($cnt, "integer") .
339  " WHERE id = " . $ilDB->quote($rec["id"], "integer")
340  );
341  $cnt++;
342  }
343  }
344 
351  public function getSkillForLevelId($a_level_id)
352  {
353  $ilDB = $this->db;
354 
355  $set = $ilDB->query(
356  "SELECT * FROM skl_level WHERE " .
357  " id = " . $ilDB->quote($a_level_id, "integer")
358  );
359  $skill = null;
360  if ($rec = $ilDB->fetchAssoc($set)) {
361  if (ilSkillTreeNode::isInTree($rec["skill_id"])) {
362  $skill = new ilBasicSkill($rec["skill_id"]);
363  }
364  }
365  return $skill;
366  }
367 
368  //
369  //
370  // User skill (level) related methods
371  //
372  //
373 
374 
387  public static function resetUserSkillLevelStatus($a_user_id, $a_skill_id, $a_tref_id = 0, $a_trigger_ref_id = 0, $a_self_eval = false)
388  {
389  global $DIC;
390 
391  $db = $DIC->database();
392 
393  if (!$a_self_eval) {
394  include_once("./Services/Skill/exceptions/class.ilSkillException.php");
395  throw new ilSkillException("resetUserSkillLevelStatus currently only provided for self evaluations.");
396  }
397 
398  $trigger_obj_id = ($a_trigger_ref_id > 0)
399  ? ilObject::_lookupObjId($a_trigger_ref_id)
400  : 0;
401 
402  $update = false;
403  $status_date = self::hasRecentSelfEvaluation($a_user_id, $a_skill_id, $a_tref_id, $a_trigger_ref_id);
404  if ($status_date != "") {
405  $update = true;
406  }
407 
408  if ($update) {
409  // this will only be set in self eval case, means this will always have a $rec
410  $now = ilUtil::now();
411  $db->manipulate(
412  "UPDATE skl_user_skill_level SET " .
413  " level_id = " . $db->quote(0, "integer") . "," .
414  " status_date = " . $db->quote($now, "timestamp") .
415  " WHERE user_id = " . $db->quote($a_user_id, "integer") .
416  " AND status_date = " . $db->quote($status_date, "timestamp") .
417  " AND skill_id = " . $db->quote($a_skill_id, "integer") .
418  " AND status = " . $db->quote(self::ACHIEVED, "integer") .
419  " AND trigger_obj_id = " . $db->quote($trigger_obj_id, "integer") .
420  " AND tref_id = " . $db->quote((int) $a_tref_id, "integer") .
421  " AND self_eval = " . $db->quote($a_self_eval, "integer")
422  );
423  } else {
424  $now = ilUtil::now();
425  $db->manipulate("INSERT INTO skl_user_skill_level " .
426  "(level_id, user_id, tref_id, status_date, skill_id, status, valid, trigger_ref_id," .
427  "trigger_obj_id, trigger_obj_type, trigger_title, self_eval, unique_identifier) VALUES (" .
428  $db->quote(0, "integer") . "," .
429  $db->quote($a_user_id, "integer") . "," .
430  $db->quote((int) $a_tref_id, "integer") . "," .
431  $db->quote($now, "timestamp") . "," .
432  $db->quote($a_skill_id, "integer") . "," .
433  $db->quote(self::ACHIEVED, "integer") . "," .
434  $db->quote(1, "integer") . "," .
435  $db->quote($a_trigger_ref_id, "integer") . "," .
436  $db->quote($trigger_obj_id, "integer") . "," .
437  $db->quote("", "text") . "," .
438  $db->quote("", "text") . "," .
439  $db->quote($a_self_eval, "integer") . "," .
440  $db->quote("", "text") .
441  ")");
442  }
443 
444  $db->manipulate(
445  "DELETE FROM skl_user_has_level WHERE "
446  . " user_id = " . $db->quote($a_user_id, "integer")
447  . " AND skill_id = " . $db->quote($a_skill_id, "integer")
448  . " AND tref_id = " . $db->quote((int) $a_tref_id, "integer")
449  . " AND trigger_obj_id = " . $db->quote($trigger_obj_id, "integer")
450  . " AND self_eval = " . $db->quote($a_self_eval, "integer")
451  );
452  }
453 
461  protected static function hasRecentSelfEvaluation($a_user_id, $a_skill_id, $a_tref_id = 0, $a_trigger_ref_id = 0)
462  {
463  global $DIC;
464 
465  $db = $DIC->database();
466 
467  $trigger_obj_id = ($a_trigger_ref_id > 0)
468  ? ilObject::_lookupObjId($a_trigger_ref_id)
469  : 0;
470 
471  $recent = "";
472 
473  $db->setLimit(1);
474  $set = $db->query(
475  "SELECT * FROM skl_user_skill_level WHERE " .
476  "skill_id = " . $db->quote($a_skill_id, "integer") . " AND " .
477  "user_id = " . $db->quote($a_user_id, "integer") . " AND " .
478  "tref_id = " . $db->quote((int) $a_tref_id, "integer") . " AND " .
479  "trigger_obj_id = " . $db->quote($trigger_obj_id, "integer") . " AND " .
480  "self_eval = " . $db->quote(1, "integer") .
481  " ORDER BY status_date DESC"
482  );
483  $rec = $db->fetchAssoc($set);
484  $status_day = substr($rec["status_date"], 0, 10);
485  $today = substr(ilUtil::now(), 0, 10);
486  if ($rec["valid"] && $rec["status"] == ilBasicSkill::ACHIEVED && $status_day == $today) {
487  $recent = $rec["status_date"];
488  }
489 
490  return $recent;
491  }
492 
499  public static function getNewAchievementsPerUser($a_timestamp, $a_timestamp_to = null, $a_user_id = 0, $a_self_eval = 0)
500  {
501  global $DIC;
502 
503  $db = $DIC->database();
504 
505  $to = (!is_null($a_timestamp_to))
506  ? " AND status_date <= " . $db->quote($a_timestamp_to, "timestamp")
507  : "";
508 
509  $user = ($a_user_id > 0)
510  ? " AND user_id = " . $db->quote($a_user_id, "integer")
511  : "";
512 
513  $set = $db->query("SELECT * FROM skl_user_skill_level " .
514  " WHERE status_date >= " . $db->quote($a_timestamp, "timestamp") .
515  " AND valid = " . $db->quote(1, "integer") .
516  " AND status = " . $db->quote(ilBasicSkill::ACHIEVED, "integer") .
517  " AND self_eval = " . $db->quote($a_self_eval, "integer") .
518  $to .
519  $user .
520  " ORDER BY user_id, status_date ASC ");
521  $achievments = array();
522  while ($rec = $db->fetchAssoc($set)) {
523  $achievments[$rec["user_id"]][] = $rec;
524  }
525 
526  return $achievments;
527  }
528 
529 
542  public static function writeUserSkillLevelStatus(
543  $a_level_id,
544  $a_user_id,
545  $a_trigger_ref_id,
546  $a_tref_id = 0,
547  $a_status = ilBasicSkill::ACHIEVED,
548  $a_force = false,
549  $a_self_eval = false,
550  $a_unique_identifier = ""
551  ) {
552  global $DIC;
553 
554  $ilDB = $DIC->database();
555 
556  $skill_id = ilBasicSkill::lookupLevelSkillId($a_level_id);
557  $trigger_ref_id = $a_trigger_ref_id;
558  $trigger_obj_id = ilObject::_lookupObjId($trigger_ref_id);
559  $trigger_title = ilObject::_lookupTitle($trigger_obj_id);
560  $trigger_type = ilObject::_lookupType($trigger_obj_id);
561 
562  $update = false;
563 
564  // self evaluations will update, if the last self evaluation is on the same day
565  if ($a_self_eval && self::hasRecentSelfEvaluation($a_user_id, $skill_id, $a_tref_id, $trigger_ref_id)) {
566  $status_date = self::hasRecentSelfEvaluation($a_user_id, $skill_id, $a_tref_id, $trigger_ref_id);
567  if ($status_date != "") {
568  $update = true;
569  }
570  }
571 
572  if ($update) {
573  // this will only be set in self eval case, means this will always have a $rec
574  $now = ilUtil::now();
575  $ilDB->manipulate(
576  "UPDATE skl_user_skill_level SET " .
577  " level_id = " . $ilDB->quote($a_level_id, "integer") . "," .
578  " status_date = " . $ilDB->quote($now, "timestamp") .
579  " WHERE user_id = " . $ilDB->quote($a_user_id, "integer") .
580  " AND status_date = " . $ilDB->quote($status_date, "timestamp") .
581  " AND skill_id = " . $ilDB->quote($skill_id, "integer") .
582  " AND status = " . $ilDB->quote($a_status, "integer") .
583  " AND trigger_obj_id = " . $ilDB->quote($trigger_obj_id, "integer") .
584  " AND tref_id = " . $ilDB->quote((int) $a_tref_id, "integer") .
585  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
586  );
587  } else {
588  if ($a_unique_identifier != "") {
589  $ilDB->manipulate(
590  "DELETE FROM skl_user_skill_level WHERE " .
591  " user_id = " . $ilDB->quote($a_user_id, "integer") .
592  " AND tref_id = " . $ilDB->quote($a_tref_id, "integer") .
593  " AND skill_id = " . $ilDB->quote($skill_id, "integer") .
594  " AND trigger_ref_id = " . $ilDB->quote($trigger_ref_id, "integer") .
595  " AND trigger_obj_id = " . $ilDB->quote($trigger_obj_id, "integer") .
596  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer") .
597  " AND unique_identifier = " . $ilDB->quote($a_unique_identifier, "text")
598  );
599  }
600 
601  $now = ilUtil::now();
602  $ilDB->manipulate("INSERT INTO skl_user_skill_level " .
603  "(level_id, user_id, tref_id, status_date, skill_id, status, valid, trigger_ref_id," .
604  "trigger_obj_id, trigger_obj_type, trigger_title, self_eval, unique_identifier) VALUES (" .
605  $ilDB->quote($a_level_id, "integer") . "," .
606  $ilDB->quote($a_user_id, "integer") . "," .
607  $ilDB->quote((int) $a_tref_id, "integer") . "," .
608  $ilDB->quote($now, "timestamp") . "," .
609  $ilDB->quote($skill_id, "integer") . "," .
610  $ilDB->quote($a_status, "integer") . "," .
611  $ilDB->quote(1, "integer") . "," .
612  $ilDB->quote($trigger_ref_id, "integer") . "," .
613  $ilDB->quote($trigger_obj_id, "integer") . "," .
614  $ilDB->quote($trigger_type, "text") . "," .
615  $ilDB->quote($trigger_title, "text") . "," .
616  $ilDB->quote($a_self_eval, "integer") . "," .
617  $ilDB->quote($a_unique_identifier, "text") .
618  ")");
619  }
620 
621  // fix (removed level_id and added skill id, since table should hold only
622  // one entry per skill)
623  $ilDB->manipulate(
624  "DELETE FROM skl_user_has_level WHERE "
625  . " user_id = " . $ilDB->quote($a_user_id, "integer")
626  . " AND skill_id = " . $ilDB->quote($skill_id, "integer")
627  . " AND tref_id = " . $ilDB->quote((int) $a_tref_id, "integer")
628  . " AND trigger_obj_id = " . $ilDB->quote($trigger_obj_id, "integer")
629  . " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
630  );
631 
632  if ($a_status == ilBasicSkill::ACHIEVED) {
633  $ilDB->manipulate("INSERT INTO skl_user_has_level " .
634  "(level_id, user_id, tref_id, status_date, skill_id, trigger_ref_id, trigger_obj_id, trigger_obj_type, trigger_title, self_eval) VALUES (" .
635  $ilDB->quote($a_level_id, "integer") . "," .
636  $ilDB->quote($a_user_id, "integer") . "," .
637  $ilDB->quote($a_tref_id, "integer") . "," .
638  $ilDB->quote($now, "timestamp") . "," .
639  $ilDB->quote($skill_id, "integer") . "," .
640  $ilDB->quote($trigger_ref_id, "integer") . "," .
641  $ilDB->quote($trigger_obj_id, "integer") . "," .
642  $ilDB->quote($trigger_type, "text") . "," .
643  $ilDB->quote($trigger_title, "text") . "," .
644  $ilDB->quote($a_self_eval, "integer") .
645  ")");
646  }
647  }
648 
658  public static function removeAllUserSkillLevelStatusOfObject($a_user_id, $a_trigger_obj_id, $a_self_eval = false, $a_unique_identifier = "")
659  {
660  global $DIC;
661 
662  $db = $DIC->database();
663 
664  if ($a_trigger_obj_id == 0) {
665  return false;
666  }
667 
668  $changed = false;
669 
670  $aff_rows = $db->manipulate(
671  "DELETE FROM skl_user_skill_level WHERE "
672  . " user_id = " . $db->quote($a_user_id, "integer")
673  . " AND trigger_obj_id = " . $db->quote($a_trigger_obj_id, "integer")
674  . " AND self_eval = " . $db->quote($a_self_eval, "integer")
675  . " AND unique_identifier = " . $db->quote($a_unique_identifier, "text")
676  );
677  if ($aff_rows > 0) {
678  $changed = true;
679  }
680 
681  $aff_rows = $db->manipulate(
682  "DELETE FROM skl_user_has_level WHERE "
683  . " user_id = " . $db->quote($a_user_id, "integer")
684  . " AND trigger_obj_id = " . $db->quote($a_trigger_obj_id, "integer")
685  . " AND self_eval = " . $db->quote($a_self_eval, "integer")
686  );
687  if ($aff_rows > 0) {
688  $changed = true;
689  }
690  return $changed;
691  }
692 
698  public static function removeAllUserData($a_user_id)
699  {
700  global $DIC;
701 
702  $db = $DIC->database();
703 
704  $db->manipulate(
705  "DELETE FROM skl_user_skill_level WHERE "
706  . " user_id = " . $db->quote($a_user_id, "integer")
707  );
708  $db->manipulate(
709  "DELETE FROM skl_user_has_level WHERE "
710  . " user_id = " . $db->quote($a_user_id, "integer")
711  );
712  }
713 
714 
721  public function getMaxLevelPerType($a_tref_id, $a_type, $a_user_id = 0, $a_self_eval = 0)
722  {
723  $ilDB = $this->db;
725 
726  if ($a_user_id == 0) {
727  $a_user_id = $ilUser->getId();
728  }
729 
730  $set = $ilDB->query(
731  $q = "SELECT level_id FROM skl_user_has_level " .
732  " WHERE trigger_obj_type = " . $ilDB->quote($a_type, "text") .
733  " AND skill_id = " . $ilDB->quote($this->getId(), "integer") .
734  " AND tref_id = " . $ilDB->quote((int) $a_tref_id, "integer") .
735  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
736  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
737  );
738 
739  $has_level = array();
740  while ($rec = $ilDB->fetchAssoc($set)) {
741  $has_level[$rec["level_id"]] = true;
742  }
743  $max_level = 0;
744  foreach ($this->getLevelData() as $l) {
745  if (isset($has_level[$l["id"]])) {
746  $max_level = $l["id"];
747  }
748  }
749  return $max_level;
750  }
751 
758  public function getAllLevelEntriesOfUser($a_tref_id, $a_user_id = 0, $a_self_eval = 0)
759  {
760  $ilDB = $this->db;
762 
763  if ($a_user_id == 0) {
764  $a_user_id = $ilUser->getId();
765  }
766 
767  $set = $ilDB->query(
768  $q = "SELECT * FROM skl_user_has_level " .
769  " WHERE skill_id = " . $ilDB->quote($this->getId(), "integer") .
770  " AND tref_id = " . $ilDB->quote((int) $a_tref_id, "integer") .
771  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
772  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer") .
773  " ORDER BY status_date DESC"
774  );
775 
776  $levels = array();
777  while ($rec = $ilDB->fetchAssoc($set)) {
778  $levels[] = $rec;
779  }
780  return $levels;
781  }
782 
789  public function getAllHistoricLevelEntriesOfUser($a_tref_id, $a_user_id = 0, $a_eval_by = 0)
790  {
791  $ilDB = $this->db;
793 
794  if ($a_user_id == 0) {
795  $a_user_id = $ilUser->getId();
796  }
797 
798  $by = ($a_eval_by != self::EVAL_BY_ALL)
799  ? " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
800  : "";
801 
802  $set = $ilDB->query(
803  $q = "SELECT * FROM skl_user_skill_level " .
804  " WHERE skill_id = " . $ilDB->quote($this->getId(), "integer") .
805  " AND tref_id = " . $ilDB->quote((int) $a_tref_id, "integer") .
806  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
807  $by .
808  " ORDER BY status_date DESC"
809  );
810  $levels = array();
811  while ($rec = $ilDB->fetchAssoc($set)) {
812  $levels[] = $rec;
813  }
814  return $levels;
815  }
816 
817 
824  public function getMaxLevelPerObject($a_tref_id, $a_object_id, $a_user_id = 0, $a_self_eval = 0)
825  {
826  $ilDB = $this->db;
828 
829  if ($a_user_id == 0) {
830  $a_user_id = $ilUser->getId();
831  }
832 
833  $set = $ilDB->query(
834  $q = "SELECT level_id FROM skl_user_has_level " .
835  " WHERE trigger_obj_id = " . $ilDB->quote($a_object_id, "integer") .
836  " AND skill_id = " . $ilDB->quote($this->getId(), "integer") .
837  " AND tref_id = " . $ilDB->quote((int) $a_tref_id, "integer") .
838  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
839  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
840  );
841 
842  $has_level = array();
843  while ($rec = $ilDB->fetchAssoc($set)) {
844  $has_level[$rec["level_id"]] = true;
845  }
846  $max_level = 0;
847  foreach ($this->getLevelData() as $l) {
848  if (isset($has_level[$l["id"]])) {
849  $max_level = $l["id"];
850  }
851  }
852  return $max_level;
853  }
854 
861  public function getMaxLevel($a_tref_id, $a_user_id = 0, $a_self_eval = 0)
862  {
863  $ilDB = $this->db;
865 
866  if ($a_user_id == 0) {
867  $a_user_id = $ilUser->getId();
868  }
869 
870  $set = $ilDB->query(
871  $q = "SELECT level_id FROM skl_user_has_level " .
872  " WHERE skill_id = " . $ilDB->quote($this->getId(), "integer") .
873  " AND tref_id = " . $ilDB->quote((int) $a_tref_id, "integer") .
874  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
875  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer")
876  );
877 
878  $has_level = array();
879  while ($rec = $ilDB->fetchAssoc($set)) {
880  $has_level[$rec["level_id"]] = true;
881  }
882  $max_level = 0;
883  foreach ($this->getLevelData() as $l) {
884  if (isset($has_level[$l["id"]])) {
885  $max_level = $l["id"];
886  }
887  }
888  return $max_level;
889  }
890 
891 
900  public static function hasSelfEvaluated($a_user_id, $a_skill_id, $a_tref_id)
901  {
902  global $DIC;
903 
904  $db = $DIC->database();
905 
906  $set = $db->query(
907  $q = "SELECT level_id FROM skl_user_has_level " .
908  " WHERE skill_id = " . $db->quote((int) $a_skill_id, "integer") .
909  " AND tref_id = " . $db->quote((int) $a_tref_id, "integer") .
910  " AND user_id = " . $db->quote($a_user_id, "integer") .
911  " AND self_eval = " . $db->quote(1, "integer")
912  );
913 
914  if ($rec = $db->fetchAssoc($set)) {
915  return true;
916  }
917  return false;
918  }
919 
926  public function getLastLevelPerObject($a_tref_id, $a_object_id, $a_user_id = 0, $a_self_eval = 0)
927  {
928  $ilDB = $this->db;
930 
931  if ($a_user_id == 0) {
932  $a_user_id = $ilUser->getId();
933  }
934 
935  $ilDB->setLimit(1);
936  $set = $ilDB->query(
937  $q = "SELECT level_id FROM skl_user_has_level " .
938  " WHERE trigger_obj_id = " . $ilDB->quote($a_object_id, "integer") .
939  " AND skill_id = " . $ilDB->quote($this->getId(), "integer") .
940  " AND tref_id = " . $ilDB->quote((int) $a_tref_id, "integer") .
941  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
942  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer") .
943  " ORDER BY status_date DESC"
944  );
945 
946  $rec = $ilDB->fetchAssoc($set);
947 
948  return $rec["level_id"];
949  }
950 
957  public function getLastUpdatePerObject($a_tref_id, $a_object_id, $a_user_id = 0, $a_self_eval = 0)
958  {
959  $ilDB = $this->db;
961 
962  if ($a_user_id == 0) {
963  $a_user_id = $ilUser->getId();
964  }
965 
966  $ilDB->setLimit(1);
967  $set = $ilDB->query(
968  $q = "SELECT status_date FROM skl_user_has_level " .
969  " WHERE trigger_obj_id = " . $ilDB->quote($a_object_id, "integer") .
970  " AND skill_id = " . $ilDB->quote($this->getId(), "integer") .
971  " AND tref_id = " . $ilDB->quote((int) $a_tref_id, "integer") .
972  " AND user_id = " . $ilDB->quote($a_user_id, "integer") .
973  " AND self_eval = " . $ilDB->quote($a_self_eval, "integer") .
974  " ORDER BY status_date DESC"
975  );
976 
977  $rec = $ilDB->fetchAssoc($set);
978 
979  return $rec["status_date"];
980  }
981 
982  //
983  //
984  // Certificate related methods
985  //
986  //
987 
994  public function getTitleForCertificate()
995  {
996  return $this->getTitle();
997  }
998 
1006  {
1007  return "Skill";
1008  }
1009 
1016  public static function _lookupCertificate($a_skill_id, $a_skill_level_id)
1017  {
1018  $certificatefile = CLIENT_WEB_DIR . "/certificates/skill/" .
1019  ((int) $a_skill_id) . "/" . ((int) $a_skill_level_id) . "/certificate.xml";
1020  if (@file_exists($certificatefile)) {
1021  return true;
1022  } else {
1023  return false;
1024  }
1025  }
1026 
1033  public static function getUsageInfo($a_cskill_ids, &$a_usages)
1034  {
1035  global $DIC;
1036 
1037  $ilDB = $DIC->database();
1038 
1039  include_once("./Services/Skill/classes/class.ilSkillUsage.php");
1041  $a_cskill_ids,
1042  $a_usages,
1044  "skl_user_skill_level",
1045  "user_id"
1046  );
1047  }
1048 
1057  public static function getCommonSkillIdForImportId($a_source_inst_id, $a_skill_import_id, $a_tref_import_id = 0)
1058  {
1059  global $DIC;
1060 
1061  $ilDB = $DIC->database();
1062 
1063  include_once("./Services/Skill/classes/class.ilSkillTree.php");
1064  include_once("./Services/Skill/classes/class.ilSkillTemplateReference.php");
1065  $tree = new ilSkillTree();
1066 
1067  if ($a_source_inst_id == 0) {
1068  return array();
1069  }
1070 
1071  $template_ids = array();
1072  if ($a_tref_import_id > 0) {
1073  $skill_node_type = "sktp";
1074 
1075  // get all matching tref nodes
1076  $set = $ilDB->query("SELECT * FROM skl_tree_node n JOIN skl_tree t ON (n.obj_id = t.child) " .
1077  " WHERE n.import_id = " . $ilDB->quote("il_" . ((int) $a_source_inst_id) . "_sktr_" . $a_tref_import_id, "text") .
1078  " ORDER BY n.creation_date DESC ");
1079  while ($rec = $ilDB->fetchAssoc($set)) {
1080  if (($t = ilSkillTemplateReference::_lookupTemplateId($rec["obj_id"])) > 0) {
1081  $template_ids[$t] = $rec["obj_id"];
1082  }
1083  }
1084  } else {
1085  $skill_node_type = "skll";
1086  }
1087  $set = $ilDB->query("SELECT * FROM skl_tree_node n JOIN skl_tree t ON (n.obj_id = t.child) " .
1088  " WHERE n.import_id = " . $ilDB->quote("il_" . ((int) $a_source_inst_id) . "_" . $skill_node_type . "_" . $a_skill_import_id, "text") .
1089  " ORDER BY n.creation_date DESC ");
1090  $results = array();
1091  while ($rec = $ilDB->fetchAssoc($set)) {
1092  $matching_trefs = array();
1093  if ($a_tref_import_id > 0) {
1094  $skill_template_id = $tree->getTopParentNodeId($rec["obj_id"]);
1095 
1096  // check of skill is in template
1097  foreach ($template_ids as $templ => $tref) {
1098  if ($skill_template_id == $templ) {
1099  $matching_trefs[] = $tref;
1100  }
1101  }
1102  } else {
1103  $matching_trefs = array(0);
1104  }
1105 
1106  foreach ($matching_trefs as $t) {
1107  $results[] = array("skill_id" => $rec["obj_id"], "tref_id" => $t, "creation_date" => $rec["creation_date"]);
1108  }
1109  }
1110  return $results;
1111  }
1112 
1120  public static function getLevelIdForImportId($a_source_inst_id, $a_level_import_id)
1121  {
1122  global $DIC;
1123 
1124  $ilDB = $DIC->database();
1125 
1126  $set = $ilDB->query("SELECT * FROM skl_level l JOIN skl_tree t ON (l.skill_id = t.child) " .
1127  " WHERE l.import_id = " . $ilDB->quote("il_" . ((int) $a_source_inst_id) . "_sklv_" . $a_level_import_id, "text") .
1128  " ORDER BY l.creation_date DESC ");
1129  $results = array();
1130  while ($rec = $ilDB->fetchAssoc($set)) {
1131  $results[] = array("level_id" => $rec["id"], "creation_date" => $rec["creation_date"]);
1132  }
1133  return $results;
1134  }
1135 
1142  public static function getLevelIdForImportIdMatchSkill($a_source_inst_id, $a_level_import_id, $a_skill_import_id, $a_tref_import_id = 0)
1143  {
1144  $level_id_data = self::getLevelIdForImportId($a_source_inst_id, $a_level_import_id);
1145  $skill_data = self::getCommonSkillIdForImportId($a_source_inst_id, $a_skill_import_id, $a_tref_import_id);
1146  $matches = array();
1147  foreach ($level_id_data as $l) {
1148  reset($skill_data);
1149  foreach ($skill_data as $s) {
1150  if (ilBasicSkill::lookupLevelSkillId($l["level_id"]) == $s["skill_id"]) {
1151  $matches[] = array(
1152  "level_id" => $l["level_id"],
1153  "creation_date" => $l["creation_date"],
1154  "skill_id" => $s["skill_id"],
1155  "tref_id" => $s["tref_id"]
1156  );
1157  }
1158  }
1159  }
1160  return $matches;
1161  }
1162 }
Get info on usages of skills.
getShortTitleForCertificate()
Get short title for certificate.
setType($a_type)
Set type.
copy()
Copy basic skill.
create()
Create skill.
addLevel($a_title, $a_description, $a_import_id="")
Add new level.
global $DIC
Definition: saml.php:7
getLevelData($a_id=0)
Get level data.
static lookupLevelTitle($a_id)
Lookup level title.
getLastLevelPerObject($a_tref_id, $a_object_id, $a_user_id=0, $a_self_eval=0)
Get last level set per object.
Skill tree.
static getLevelIdForImportId($a_source_inst_id, $a_level_import_id)
Get level ids for import IDs (newest first)
getMaxLevel($a_tref_id, $a_user_id=0, $a_self_eval=0)
Get max levels per object.
getSkillForLevelId($a_level_id)
Get skill for level id.
static getNewAchievementsPerUser($a_timestamp, $a_timestamp_to=null, $a_user_id=0, $a_self_eval=0)
Get new achievements.
getMaxLevelNr()
Get maximum level nr.
static _lookupTitle($a_id)
lookup object title
$s
Definition: pwgen.php:45
getSelfEvaluation()
Get self evaluation.
static getUsageInfoGeneric( $a_cskill_ids, &$a_usages, $a_usage_type, $a_table, $a_key_field, $a_skill_field="skill_id", $a_tref_field="tref_id")
Get standard usage query.
static now()
Return current timestamp in Y-m-d H:i:s format.
user()
Definition: user.php:4
deleteLevel($a_id)
Delete level.
$a_type
Definition: workflow.php:92
getOrderNr()
Get order nr.
static getLevelIdForImportIdMatchSkill($a_source_inst_id, $a_level_import_id, $a_skill_import_id, $a_tref_import_id=0)
Get level ids for import Ids matching common skills.
static getUsageInfo($a_cskill_ids, &$a_usages)
Get usage info.
static writeLevelProperty($a_id, $a_prop, $a_value, $a_type)
Write level property.
static writeLevelDescription($a_id, $a_description)
Write level description.
fixLevelNumbering()
Fix level numbering.
static isInTree($a_id)
Is id in tree?
read()
Read data from database.
static _lookupObjId($a_id)
static writeLevelTitle($a_id, $a_title)
Write level title.
getMaxLevelPerType($a_tref_id, $a_type, $a_user_id=0, $a_self_eval=0)
Get max levels per type.
$ilUser
Definition: imgupload.php:18
static lookupLevelProperty($a_id, $a_prop)
Lookup level property.
static _lookupTemplateId($a_obj_id)
Lookup template ID.
static _lookupType($a_id, $a_reference=false)
lookup object type
static lookupLevelDescription($a_id)
Lookup level description.
static removeAllUserSkillLevelStatusOfObject($a_user_id, $a_trigger_obj_id, $a_self_eval=false, $a_unique_identifier="")
Remove a user skill completely.
Skill exception class.
static _lookupCertificate($a_skill_id, $a_skill_level_id)
Checks whether a skill level has a certificate or not.
getTitleForCertificate()
Get title for certificate.
getMaxLevelPerObject($a_tref_id, $a_object_id, $a_user_id=0, $a_self_eval=0)
Get max levels per object.
updateLevelOrder($order)
Update level order.
global $l
Definition: afr.php:30
static removeAllUserData($a_user_id)
Remove all data of a user.
$results
Definition: svg-scanner.php:47
A node in the skill tree.
global $ilDB
static writeUserSkillLevelStatus( $a_level_id, $a_user_id, $a_trigger_ref_id, $a_tref_id=0, $a_status=ilBasicSkill::ACHIEVED, $a_force=false, $a_self_eval=false, $a_unique_identifier="")
Write skill level status.
static hasRecentSelfEvaluation($a_user_id, $a_skill_id, $a_tref_id=0, $a_trigger_ref_id=0)
Has recent self evaluation.
getAllHistoricLevelEntriesOfUser($a_tref_id, $a_user_id=0, $a_eval_by=0)
Get all historic level entries.
static lookupLevelSkillId($a_id)
Lookup level skill id.
__construct($a_id=0)
Constructor public.
Basic Skill.
static hasSelfEvaluated($a_user_id, $a_skill_id, $a_tref_id)
Has use self evaluated a skill?
getLastUpdatePerObject($a_tref_id, $a_object_id, $a_user_id=0, $a_self_eval=0)
Get last update per object.
getAllLevelEntriesOfUser($a_tref_id, $a_user_id=0, $a_self_eval=0)
Get all level entries.
static getCommonSkillIdForImportId($a_source_inst_id, $a_skill_import_id, $a_tref_import_id=0)
Get common skill ids for import IDs (newest first)
static resetUserSkillLevelStatus($a_user_id, $a_skill_id, $a_tref_id=0, $a_trigger_ref_id=0, $a_self_eval=false)
Reset skill level status.