ILIAS  Release_4_4_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilSurveySkill.php
Go to the documentation of this file.
1 <?php
2 
3 /* Copyright (c) 1998-2012 ILIAS open source, Extended GPL, see docs/LICENSE */
4 
13 {
14  protected $q_skill = array(); // key: question id, value:
15  // array("base_skill_id" =>..., "tref_id" =>... )
16 
23  function __construct(ilObjSurvey $a_survey)
24  {
25  $this->survey = $a_survey;
26  $this->read();
27  }
28 
35  function read()
36  {
37  global $ilDB;
38 
39  $set = $ilDB->query("SELECT * FROM svy_quest_skill ".
40  " WHERE survey_id = ".$ilDB->quote($this->survey->getId(), "integer")
41  );
42 
43  include_once("./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php");
44 
45  while ($rec = $ilDB->fetchAssoc($set))
46  {
47  if (SurveyQuestion::_questionExists($rec["q_id"]))
48  {
49  $this->q_skill[$rec["q_id"]] = array("q_id" => $rec["q_id"],
50  "base_skill_id" => $rec["base_skill_id"],
51  "tref_id" => $rec["tref_id"]);
52  }
53  }
54  }
55 
62  function getSkillForQuestion($a_question_id)
63  {
64  if (isset($this->q_skill[$a_question_id]))
65  {
66  return $this->q_skill[$a_question_id];
67  }
68  return false;
69  }
70 
77  function getQuestionsForSkill($a_base_skill_id, $a_tref_id)
78  {
79  $q_ids = array();
80  foreach ($this->q_skill as $q_id => $s)
81  {
82  if ($s["base_skill_id"] == $a_base_skill_id &&
83  $s["tref_id"] == $a_tref_id)
84  {
85  $q_ids[] = $q_id;
86  }
87  }
88  return $q_ids;
89  }
90 
91 
99  function addQuestionSkillAssignment($a_question_id, $a_base_skill_id, $a_tref_id)
100  {
101  global $ilDB;
102 
103  $ilDB->replace("svy_quest_skill",
104  array("q_id" => array("integer", $a_question_id)),
105  array(
106  "survey_id" => array("integer", $this->survey->getId()),
107  "base_skill_id" => array("integer", $a_base_skill_id),
108  "tref_id" => array("integer", $a_tref_id)
109  )
110  );
111  $this->q_skill[$a_question_id] = array("q_id" => $a_question_id,
112  "base_skill_id" => $a_base_skill_id,
113  "tref_id" => $a_tref_id);
114 
115  // add usage
116  include_once("./Services/Skill/classes/class.ilSkillUsage.php");
117  ilSkillUsage::setUsage($this->survey->getId(), $a_base_skill_id, $a_tref_id);
118 
119  }
120 
126  function removeQuestionSkillAssignment($a_question_id)
127  {
128  global $ilDB;
129 
130  // read skills that are assigned to the quesiton
131  $set = $ilDB->query("SELECT * FROM svy_quest_skill ".
132  " WHERE q_id = ".$ilDB->quote($a_question_id, "integer")
133  );
134  $skills = array();
135  while ($rec = $ilDB->fetchAssoc($set))
136  {
137  $skills[] = array("skill_id" => $rec["base_skill_id"],
138  "tref_id" => $rec["tref_id"]);
139  }
140 
141  // remove assignment of question
142  $ilDB->manipulate("DELETE FROM svy_quest_skill WHERE ".
143  " q_id = ".$ilDB->quote($a_question_id, "integer")
144  );
145  unset($this->q_skill[$a_question_id]);
146 
147  $this->removeUsagesOfSkills($skills);
148  }
149 
155  static function handleQuestionDeletion($a_question_id, $a_obj_id)
156  {
157  global $ilDB;
158  if (ilObject::_lookupType($a_obj_id) == "svy")
159  {
160  // mantis 11691
161  include_once './Modules/Survey/classes/class.ilObjSurvey.php';
162  $svy = new ilObjSurvey($a_obj_id, false);
163  $svy_skill = new ilSurveySkill($svy);
164  $svy_skill->removeQuestionSkillAssignment($a_question_id);
165  }
166  }
167 
174  function removeUsagesOfSkills($a_skills)
175  {
176  $used_skills = array();
177  foreach ($a_skills as $skill)
178  {
179  if ($this->isSkillAssignedToQuestion($skill["skill_id"], $skill["tref_id"]))
180  {
181  $used_skills[] = $skill["skill_id"].":".$skill["tref_id"];
182  }
183  }
184  reset($a_skills);
185 
186  // now remove all usages that have been confirmed
187  include_once("./Services/Skill/classes/class.ilSkillUsage.php");
188 //var_dump($a_skills);
189 //var_dump($used_skills); exit;
190  foreach ($a_skills as $skill)
191  {
192  if (!in_array($skill["skill_id"].":".$skill["tref_id"], $used_skills))
193  {
194  ilSkillUsage::setUsage($this->survey->getId(), $skill["skill_id"], $skill["tref_id"], false);
195  }
196  }
197  }
198 
205  function isSkillAssignedToQuestion($a_skill_id, $a_tref_id)
206  {
207  global $ilDB;
208 
209  $set = $ilDB->query("SELECT * FROM svy_quest_skill ".
210  " WHERE base_skill_id = ".$ilDB->quote($a_skill_id, "integer").
211  " AND tref_id = ".$ilDB->quote($a_tref_id, "integer").
212  " AND survey_id = ".$ilDB->quote($this->survey->getId(), "integer")
213  );
214  if ($rec = $ilDB->fetchAssoc($set))
215  {
216  return true;
217  }
218  return false;
219  }
220 
221 
229  {
230  $skills = array();
231  include_once("./Services/Skill/classes/class.ilBasicSkill.php");
232  foreach ($this->q_skill as $sk)
233  {
234  $skills[$sk["base_skill_id"].":".$sk["tref_id"]] =
235  ilBasicSkill::_lookupTitle($sk["base_skill_id"]);
236  }
237  return $skills;
238  }
239 
246  function determineSkillLevelsForAppraisee($a_appraisee_id, $a_self_eval = false)
247  {
248  $skills = array();
249 
250  // get all skills
251  $opts = $this->getAllAssignedSkillsAsOptions();
252  foreach ($opts as $k => $title)
253  {
254  $k = explode(":", $k);
255 
256  $bs = new ilBasicSkill((int) $k[0]);
257  $ld = $bs->getLevelData();
258 
259  $skills[] = array(
260  "base_skill_id" => (int) $k[0],
261  "tref_id" => (int) $k[1],
262  "skill_title" => $title,
263  "level_data" => $ld
264  );
265  }
266 
267  if (!$a_self_eval)
268  {
269  $finished_ids = $this->survey->getFinishedIdsForAppraiseeId($a_appraisee_id, true);
270  }
271  else
272  {
273  $finished_id = $this->survey->getFinishedIdForAppraiseeIdAndRaterId($a_appraisee_id, $a_appraisee_id);
274  if ($finished_id > 0)
275  {
276  $finished_ids = array($finished_id);
277  }
278  }
279 
280  if(!sizeof($finished_ids))
281  {
282  $finished_ids = array(-1);
283  }
284 
285  $results = $this->survey->getUserSpecificResults($finished_ids);
286  foreach ($skills as $k => $s)
287  {
288  $q_ids = $this->getQuestionsForSkill($s["base_skill_id"], $s["tref_id"]);
289  $mean_sum = 0;
290  foreach ($q_ids as $q_id)
291  {
292  $qmean = 0;
293  if (is_array($results[$q_id]))
294  {
295  $cnt = 0;
296  $sum = 0;
297  foreach ($results[$q_id] as $r)
298  {
299  // this is a workaround, since we only get arrays from
300  // getUserSpecificResults()
301  $r = explode(" - ", $r);
302  $sum+= (int) $r[0];
303  $cnt++;
304  }
305  if ($cnt > 0)
306  {
307  $qmean = $sum/$cnt;
308  }
309  }
310  $mean_sum+= $qmean;
311  }
312  $skills[$k]["mean_sum"] = $mean_sum;
313 
314  include_once("./Modules/Survey/classes/class.ilSurveySkillThresholds.php");
315  $skthr = new ilSurveySkillThresholds($this->survey);
316  $thresholds = $skthr->getThresholds();
317  foreach ($skills[$k]["level_data"] as $l)
318  {
319  $t = $thresholds[$l["id"]][$s["tref_id"]];
320  if ($t > 0 && $mean_sum >= $t)
321  {
322  $skills[$k]["new_level"] = $l["title"];
323  $skills[$k]["new_level_id"] = $l["id"];
324  }
325  }
326  }
327 
328  return $skills;
329  }
330 
331 
338  function determineMaxScale($a_base_skill, $a_tref_id = 0)
339  {
340  include_once("./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php");
341  include_once("./Modules/Survey/classes/class.ilSurveySkill.php");
342  $ssk = new ilSurveySkill($this->survey);
343  $question_ids = $ssk->getQuestionsForSkill($a_base_skill, $a_tref_id);
344  $scale_sum = 0;
345  foreach ($question_ids as $q_id)
346  {
348  if(!is_object($q))
349  {
350  continue;
351  }
352  $cats = $q->getCategories();
353  $max_scale = 0;
354  for($i = 0; $i<= $cats->getCategoryCount(); $i++)
355  {
356  $c = $cats->getCategory($i);
357  $n = $c->neutral;
358  $s = $c->scale;
359  if (!$c->neutral)
360  {
361  if ($c->scale > $max_scale)
362  {
363  $max_scale = $c->scale;
364  }
365  }
366  }
367  $scale_sum+= $max_scale;
368  }
369 
370  return $scale_sum;
371  }
372 
379  function writeAppraiseeSkills($a_app_id)
380  {
381  $new_levels = $this->determineSkillLevelsForAppraisee($a_app_id);
382  foreach ($new_levels as $nl)
383  {
384  if ($nl["new_level_id"] > 0)
385  {
386  ilBasicSkill::writeUserSkillLevelStatus($nl["new_level_id"],
387  $a_app_id, $this->survey->getRefId(), $nl["tref_id"], ilBasicSkill::ACHIEVED, true);
388  }
389  }
390  }
391 
392 }
393 
394 ?>