147 bool $a_call_by_reference =
true 151 $this->survey_service = $DIC->survey()->internal();
153 $this->
user = $DIC->user();
154 $this->
lng = $DIC->language();
155 $this->db = $DIC->database();
156 $this->
access = $DIC->access();
157 $this->plugin_admin = $DIC[
"ilPluginAdmin"];
158 $this->tree = $DIC->repositoryTree();
159 $ilUser = $DIC->user();
160 $lng = $DIC->language();
163 $this->survey_id = -1;
164 $this->introduction =
"";
165 $this->outro =
$lng->
txt(
"survey_finished");
166 $this->author = $ilUser->getFullname();
167 $this->evaluation_access = self::EVALUATION_ACCESS_OFF;
168 $this->questions = array();
169 $this->anonymize = self::ANONYMIZE_OFF;
170 $this->display_question_titles = self::QUESTIONTITLES_VISIBLE;
171 $this->surveyCodeSecurity =
true;
172 $this->pool_usage =
true;
173 $this->mode = self::MODE_STANDARD;
174 $this->mode_self_eval_results = self::RESULTS_SELF_EVAL_OWN;
176 $this->invitation_manager = $this
182 $this->import_manager = $DIC->surveyQuestionPool()
186 $this->placeholder_resolver = $DIC->mail()->placeholderResolver();
191 $this->domain = $DIC->survey()->internal()->domain();
197 $this->code_manager = $this
200 ->code($this, $this->
user->getId());
202 $this->feature_config = $this
205 ->modeFeatureConfig($this->
getMode());
207 $this->data_manager = $this
214 $id = parent::create();
228 public function update($a_upload =
false): bool
234 if (!parent::update()) {
245 $result = parent::createReference();
262 $this->questions[] = $question_id;
265 public function delete():
bool 267 $this->svy_log->debug(
"Deleting Survey, ref id: " . $this->
getRefId() .
", obj id: " .
274 foreach ($this->questions as $question_id) {
275 $this->svy_log->debug(
"Remove question " . $question_id);
283 $this->svy_log->debug(
"Call parent delete.");
284 $remove = parent::delete();
302 "DELETE FROM svy_svy WHERE survey_id = %s",
307 $result =
$ilDB->queryF(
308 "SELECT questionblock_fi FROM svy_qblk_qst WHERE survey_fi = %s",
312 $questionblocks = array();
313 while ($row =
$ilDB->fetchAssoc($result)) {
314 $questionblocks[] = $row[
"questionblock_fi"];
316 if (count($questionblocks)) {
317 $affectedRows =
$ilDB->manipulate(
"DELETE FROM svy_qblk WHERE " .
$ilDB->in(
'questionblock_id', $questionblocks,
false,
'integer'));
320 "DELETE FROM svy_qblk_qst WHERE survey_fi = %s",
326 if (isset($this->code_manager)) {
327 $this->code_manager->deleteAll(
true);
332 $directory = $svy_data_dir .
"/svy_" . $this->
getId();
333 if (is_dir($directory)) {
342 foreach ($mobs as $mob) {
355 bool $reset_LP =
true 359 $result =
$ilDB->queryF(
360 "SELECT finished_id FROM svy_finished WHERE survey_fi = %s",
364 $active_array = array();
365 while ($row =
$ilDB->fetchAssoc($result)) {
366 $active_array[] = $row[
"finished_id"];
369 $affectedRows =
$ilDB->manipulateF(
370 "DELETE FROM svy_finished WHERE survey_fi = %s",
375 foreach ($active_array as $active_fi) {
376 $affectedRows =
$ilDB->manipulateF(
377 "DELETE FROM svy_answer WHERE active_fi = %s",
381 $affectedRows =
$ilDB->manipulateF(
382 "DELETE FROM svy_times WHERE finished_fi = %s",
390 $lp_obj->resetLPDataForCompleteObject();
393 $this->invitation_manager->removeAll($this->
getSurveyId());
407 foreach ($finished_ids as $finished_id) {
408 $result =
$ilDB->queryF(
409 "SELECT finished_id, user_fi FROM svy_finished WHERE finished_id = %s",
413 $row =
$ilDB->fetchAssoc($result);
414 if ($row[
"user_fi"]) {
415 $user_ids[] = (
int) $row[
"user_fi"];
418 $affectedRows =
$ilDB->manipulateF(
419 "DELETE FROM svy_answer WHERE active_fi = %s",
421 array($row[
"finished_id"])
424 $affectedRows =
$ilDB->manipulateF(
425 "DELETE FROM svy_finished WHERE finished_id = %s",
430 $affectedRows =
$ilDB->manipulateF(
431 "DELETE FROM svy_times WHERE finished_fi = %s",
433 array($row[
"finished_id"])
437 if (count($user_ids)) {
439 $lp_obj->resetLPDataForUserIds($user_ids);
443 $this->invitation_manager->remove($this->
getSurveyId(), $user_id);
452 ?array $finished_ids =
null,
453 bool $force_non_anonymous =
false,
454 bool $include_invites =
false 457 $sql =
"SELECT * FROM svy_finished" .
460 $sql .=
" AND " .
$ilDB->in(
"finished_id", $finished_ids,
"",
"integer");
463 $result =
$ilDB->query($sql);
464 $participants = array();
465 if ($result->numRows() > 0) {
466 while ($row =
$ilDB->fetchAssoc($result)) {
468 $userdata[
"finished"] = (bool) $row[
"state"];
469 $userdata[
"finished_tstamp"] = $row[
"tstamp"];
470 $participants[$userdata[
"sortname"] . $userdata[
"active_id"]] = $userdata;
473 $participant_ids = array_column($participants,
"usr_id");
474 if ($include_invites) {
475 foreach ($this->invitation_manager->getAllForSurvey($this->getSurveyId()) as $usr_id) {
476 if (!in_array($usr_id, $participant_ids)) {
478 $participants[$name[
"lastname"] .
"," . $name[
"firstname"] . $usr_id] = [
480 "sortname" => $name[
"lastname"] .
"," . $name[
"firstname"],
481 "fistname" => $name[
"firstname"],
482 "lastname" => $name[
"lastname"],
483 "login" => $name[
"login"],
487 "finished_tstamp" => 0,
493 return $participants;
502 return ($this->
getTitle() && count($this->questions));
507 return count($this->questions);
519 "UPDATE svy_svy SET complete = %s, tstamp = %s WHERE survey_id = %s",
520 array(
'text',
'integer',
'integer'),
532 bool $a_force =
false 535 $question_gui = $this->
getQuestionGUI($questiontype, $question_id);
538 if ($this->
getId() === $question_gui->object->getObjId() && !$a_force) {
542 $duplicate_id = $question_gui->object->duplicate(
true,
"",
"", 0, $this->
getId());
543 return $duplicate_id;
555 $this->svy_log->debug(
"insert question, id:" . $question_id);
558 $this->svy_log->debug(
"question is not complete");
562 $result =
$ilDB->queryF(
563 "SELECT survey_question_id FROM svy_svy_qst WHERE survey_fi = %s",
567 $sequence = $result->numRows();
569 $this->svy_log->debug(
"duplicate, id: " . $question_id .
", duplicate id: " . $duplicate_id);
576 $next_id =
$ilDB->nextId(
'svy_svy_qst');
577 $affectedRows =
$ilDB->manipulateF(
578 "INSERT INTO svy_svy_qst (survey_question_id, survey_fi, question_fi, sequence, tstamp) VALUES (%s, %s, %s, %s, %s)",
579 array(
'integer',
'integer',
'integer',
'integer',
'integer'),
580 array($next_id, $this->
getSurveyId(), $duplicate_id, $sequence, time())
583 $this->svy_log->debug(
"added entry to svy_svy_qst, id: " . $next_id .
", question id: " . $duplicate_id .
", sequence: " . $sequence);
597 $ilDB = $DIC->database();
599 $set =
$ilDB->query(
"SELECT * FROM svy_svy_qst " .
600 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
601 " AND question_fi = " .
$ilDB->quote($a_question_fi,
"integer"));
602 if ($rec =
$ilDB->fetchAssoc($set)) {
610 int $questionblock_id
613 $sequence_manager = $this->survey_service->domain()->sequence(
619 $result =
$ilDB->queryF(
620 "SELECT svy_qblk.title, svy_qblk.show_questiontext, svy_qblk.show_blocktitle," .
621 " svy_qblk_qst.question_fi FROM svy_qblk, svy_qblk_qst, svy_svy_qst" .
622 " WHERE svy_qblk.questionblock_id = svy_qblk_qst.questionblock_fi" .
623 " AND svy_svy_qst.question_fi = svy_qblk_qst.question_fi" .
624 " AND svy_qblk.questionblock_id = %s" .
625 " ORDER BY svy_svy_qst.sequence",
627 array($questionblock_id)
629 $questions = array();
630 $show_questiontext =
false;
631 $show_blocktitle =
false;
633 while ($row =
$ilDB->fetchAssoc($result)) {
635 $duplicate_id = $sequence_manager->appendQuestion($row[
"question_fi"],
true);
636 $questions[] = $duplicate_id;
637 $title = (string) $row[
"title"];
638 $show_questiontext = (bool) $row[
"show_questiontext"];
639 $show_blocktitle = (bool) $row[
"show_blocktitle"];
653 $next_id =
$ilDB->nextId(
'svy_settings');
654 $affectedRows =
$ilDB->insert(
"svy_settings", array(
655 "settings_id" => array(
"integer", $next_id),
656 "usr_id" => array(
"integer", $usr_id),
657 "keyword" => array(
"text", $key),
658 "title" => array(
"text", $title),
659 "value" => array(
"clob", $value)
669 "DELETE FROM svy_settings WHERE settings_id = %s",
681 $result =
$ilDB->queryF(
682 "SELECT * FROM svy_settings WHERE usr_id = %s AND keyword = %s",
683 array(
'integer',
'text'),
687 if ($result->numRows()) {
688 while ($row =
$ilDB->fetchAssoc($result)) {
689 $found[$row[
'settings_id']] = $row;
702 if (is_object($rmd_start)) {
706 if (is_object($rmd_end)) {
710 $next_id =
$ilDB->nextId(
'svy_svy');
711 $affectedRows =
$ilDB->insert(
"svy_svy", array(
712 "survey_id" => array(
"integer", $next_id),
713 "obj_fi" => array(
"integer", $this->
getId()),
714 "author" => array(
"text", $this->
getAuthor()),
718 "enddate" => array(
"text", $this->
getEndDate()),
720 "complete" => array(
"text", $this->
isComplete()),
721 "created" => array(
"integer", time()),
727 "tstamp" => array(
"integer", time()),
729 "mode" => array(
"integer", $this->
getMode()),
734 "mode_360_results" => array(
"integer", $this->
get360Results()),
736 "mode_skill_service" => array(
"integer", (
int) $this->
getSkillService()),
738 "mode_self_eval_results" => array(
"integer", self::RESULTS_SELF_EVAL_OWN),
741 "reminder_start" => array(
"datetime", $rmd_start),
742 "reminder_end" => array(
"datetime", $rmd_end),
760 $affectedRows =
$ilDB->update(
"svy_svy", array(
761 "author" => array(
"text", $this->
getAuthor()),
765 "enddate" => array(
"text", $this->
getEndDate()),
767 "complete" => array(
"text", $this->
isComplete()),
773 "tstamp" => array(
"integer", time()),
775 "mode" => array(
"integer", $this->
getMode()),
780 "mode_360_results" => array(
"integer", $this->
get360Results()),
782 "mode_skill_service" => array(
"integer", (
int) $this->
getSkillService()),
787 "reminder_start" => array(
"datetime", $rmd_start),
788 "reminder_end" => array(
"datetime", $rmd_end),
804 "survey_id" => array(
"integer", $this->
getSurveyId())
826 $item->update($this->ref_id);
835 $this->svy_log->debug(
"save questions");
838 $old_questions = array();
839 $result =
$ilDB->queryF(
840 "SELECT survey_question_id,question_fi,sequence" .
841 " FROM svy_svy_qst WHERE survey_fi = %s",
845 while ($row =
$ilDB->fetchAssoc($result)) {
846 $old_questions[$row[
"question_fi"]] = $row;
850 $insert = $update = $delete = array();
851 foreach ($this->questions as $seq => $fi) {
852 if (!array_key_exists($fi, $old_questions)) {
854 } elseif ($old_questions[$fi][
"sequence"] != $seq) {
855 $update[$fi] = $old_questions[$fi][
"survey_question_id"];
858 unset($old_questions[$fi]);
862 if (count($old_questions)) {
864 foreach ($old_questions as $fi => $old) {
865 $del_ids[] = $old[
"survey_question_id"];
867 $ilDB->manipulate(
$q =
"DELETE FROM svy_svy_qst" .
868 " WHERE " .
$ilDB->in(
"survey_question_id", $del_ids,
"",
"integer"));
869 $this->svy_log->debug(
"delete: " .
$q);
871 unset($old_questions);
874 foreach ($this->questions as $seq => $fi) {
875 if (in_array($fi, $insert)) {
878 $next_id =
$ilDB->nextId(
'svy_svy_qst');
880 "INSERT INTO svy_svy_qst" .
881 " (survey_question_id, survey_fi, question_fi, heading, sequence, tstamp)" .
882 " VALUES (%s, %s, %s, %s, %s, %s)",
883 array(
'integer',
'integer',
'integer',
'text',
'integer',
'integer'),
886 $this->svy_log->debug(
"insert svy_svy_qst, id:" . $next_id .
", fi: " . $fi .
", seq:" . $seq);
888 } elseif (array_key_exists($fi, $update)) {
889 $ilDB->manipulate(
"UPDATE svy_svy_qst" .
890 " SET sequence = " .
$ilDB->quote($seq,
"integer") .
891 ", tstamp = " .
$ilDB->quote(time(),
"integer") .
892 " WHERE survey_question_id = " .
$ilDB->quote($update[$fi],
"integer"));
893 $this->svy_log->debug(
"update svy_svy_qst, id:" . $update[$fi] .
", fi: " . $fi .
", seq:" . $seq);
900 string $questiontype,
911 if ($question_id < 1) {
914 $result =
$ilDB->queryF(
915 "SELECT type_tag FROM svy_question, svy_qtype WHERE svy_question.question_id = %s AND " .
916 "svy_question.questiontype_fi = svy_qtype.questiontype_id",
920 if ($result->numRows() === 1) {
922 return $data[
"type_tag"];
938 switch ($a_anonymize) {
939 case self::ANONYMIZE_OFF:
940 case self::ANONYMIZE_ON:
941 case self::ANONYMIZE_FREEACCESS:
942 case self::ANONYMIZE_CODE_ALL:
943 $this->anonymize = $a_anonymize;
946 $this->anonymize = self::ANONYMIZE_OFF;
959 $this->calculate_sum_score = $a_val;
970 return ($this->
getAnonymize() === self::ANONYMIZE_OFF ||
984 $result =
$ilDB->queryF(
985 "SELECT * FROM svy_svy WHERE obj_fi = %s",
987 array($this->
getId())
989 if ($result->numRows() === 1) {
994 if (strcmp($data[
"outro"],
"survey_finished") === 0) {
995 $this->
setOutro($this->
lng->txt(
"survey_finished"));
1000 $this->
setStartDate((
string) ($data[
"startdate"] ??
""));
1001 $this->
setEndDate((
string) ($data[
"enddate"] ??
""));
1010 $this->
setMode($data[
'mode']);
1042 if (isset($this->ref_id) && $this->ref_id !== 0) {
1044 switch ($activation[
"timing_type"]) {
1062 $this->questions = array();
1063 $result =
$ilDB->queryF(
1064 "SELECT * FROM svy_svy_qst WHERE survey_fi = %s ORDER BY sequence",
1069 $this->questions[
$data[
"sequence"]] = $data[
"question_fi"];
1078 $ilDB = $DIC->database();
1081 $result =
$ilDB->queryF(
1082 "SELECT * FROM svy_svy_qst WHERE survey_fi = %s ORDER BY sequence",
1089 $to_delete_ids = array();
1091 if (in_array(
$data[
"question_fi"], $fis)) {
1092 $to_delete_ids[] =
$data[
"survey_question_id"];
1094 $fis[] =
$data[
"question_fi"];
1099 if (count($to_delete_ids) > 0) {
1100 $ilDB->manipulate(
$q =
"DELETE FROM svy_svy_qst" .
1101 " WHERE " .
$ilDB->in(
"survey_question_id", $to_delete_ids,
false,
"integer") .
1103 $this->svy_log->debug(
"delete: " .
$q);
1105 $ilDB->manipulate(
$q =
"DELETE FROM svy_qblk_qst " .
1106 " WHERE " .
$ilDB->in(
"question_fi", $fis,
true,
"integer") .
1108 $this->svy_log->debug(
"delete: " .
$q);
1112 $set =
$ilDB->query(
"SELECT * FROM svy_svy_qst " .
1113 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
" ORDER BY sequence");
1115 while ($rec =
$ilDB->fetchAssoc($set)) {
1117 $q =
"UPDATE svy_svy_qst SET " .
1118 " sequence = " .
$ilDB->quote($seq++,
"integer") .
1119 " WHERE survey_question_id = " .
$ilDB->quote($rec[
"survey_question_id"],
"integer")
1121 $this->svy_log->debug(
"update: " .
$q);
1137 string $a_author =
"" 1139 if ($a_author ===
'') {
1143 $this->domain->metadata()->saveAuthorsInLOMIfNoLifecycleSet(
1154 return $this->domain->metadata()->getAuthorsFromLOM(
1168 $this->display_question_titles = $a_show;
1172 string $introduction =
"" 1192 string $start_date =
"" 1211 if (preg_match(
"/(\d{4})-(\d{2})-(\d{2})/", $start_date, $matches)) {
1216 if (preg_match(
"/(\d{2}):(\d{2}):(\d{2})/", $start_time, $matches)) {
1221 $this->start_date = sprintf(
'%04d%02d%02d%02d%02d%02d', $y, $m,
$d, $h, $i, $s);
1233 string $end_date =
"" 1272 if (preg_match(
"/(\d{4})-(\d{2})-(\d{2})/", $end_date, $matches)) {
1277 if (preg_match(
"/(\d{2}):(\d{2}):(\d{2})/", $end_time, $matches)) {
1282 $this->end_date = sprintf(
'%04d%02d%02d%02d%02d%02d', $y, $m,
$d, $h, $i, $s);
1292 string $evaluation_access = self::EVALUATION_ACCESS_OFF
1300 $this->activation_visibility = $a_value;
1315 $this->activation_limited = $a_value;
1335 $existing_questions = array();
1336 $result =
$ilDB->queryF(
1337 "SELECT svy_question.original_id FROM svy_question, svy_svy_qst WHERE " .
1338 "svy_svy_qst.survey_fi = %s AND svy_svy_qst.question_fi = svy_question.question_id",
1343 if (
$data[
"original_id"]) {
1344 $existing_questions[] = (
int)
$data[
"original_id"];
1347 return $existing_questions;
1355 bool $could_be_offline =
false,
1356 bool $showPath =
false 1369 array $move_questions,
1373 $array_pos = array_search($target_index, $this->questions);
1374 $part1 = $part2 = [];
1375 if ($insert_mode === 0) {
1376 $part1 = array_slice($this->questions, 0, $array_pos);
1377 $part2 = array_slice($this->questions, $array_pos);
1378 } elseif ($insert_mode === 1) {
1379 $part1 = array_slice($this->questions, 0, $array_pos + 1);
1380 $part2 = array_slice($this->questions, $array_pos + 1);
1383 foreach ($move_questions as $question_id) {
1384 if (!(!in_array($question_id, $part1))) {
1385 unset($part1[array_search($question_id, $part1)]);
1388 if (!(!in_array($question_id, $part2))) {
1389 unset($part2[array_search($question_id, $part2)]);
1394 if ($found !== count($move_questions)) {
1397 $part1 = array_values($part1);
1398 $part2 = array_values($part2);
1399 $this->questions = array_values(array_merge($part1, $move_questions, $part2));
1400 foreach ($move_questions as $question_id) {
1402 foreach ($constraints as $idx => $constraint) {
1403 foreach ($part2 as $next_question_id) {
1404 if ($constraint[
"question"] == $next_question_id) {
1420 $question = self::_instanciateQuestion($question_id);
1421 #20610 if no question found, do nothing. 1423 $question->delete($question_id);
1436 $result =
$ilDB->queryF(
1437 "SELECT constraint_fi FROM svy_qst_constraint WHERE question_fi = %s AND survey_fi = %s",
1438 array(
'integer',
'integer'),
1441 if ($result->numRows() > 0) {
1442 $remove_constraints = array();
1443 while ($row =
$ilDB->fetchAssoc($result)) {
1444 $remove_constraints[] = $row[
"constraint_fi"];
1446 $affectedRows =
$ilDB->manipulateF(
1447 "DELETE FROM svy_qst_constraint WHERE question_fi = %s AND survey_fi = %s",
1448 array(
'integer',
'integer'),
1451 foreach ($remove_constraints as $key => $constraint_id) {
1452 $affectedRows =
$ilDB->manipulateF(
1453 "DELETE FROM svy_constraint WHERE constraint_id = %s",
1455 array($constraint_id)
1467 array $remove_questions,
1468 array $remove_questionblocks
1472 $block_sizes = array();
1474 if (in_array($question_id, $remove_questions) or in_array(
$data[
"questionblock_id"], $remove_questionblocks)) {
1475 unset($this->questions[array_search($question_id, $this->questions)]);
1477 } elseif (
$data[
"questionblock_id"]) {
1478 $block_sizes[
$data[
"questionblock_id"]] = ($block_sizes[$data[
"questionblock_id"]] ?? 0) + 1;
1483 foreach ($block_sizes as $block_id => $size) {
1485 $remove_questionblocks[] = $block_id;
1489 foreach (array_unique($remove_questionblocks) as $questionblock_id) {
1490 $affectedRows =
$ilDB->manipulateF(
1491 "DELETE FROM svy_qblk WHERE questionblock_id = %s",
1493 array($questionblock_id)
1495 $affectedRows =
$ilDB->manipulateF(
1496 "DELETE FROM svy_qblk_qst WHERE questionblock_fi = %s AND survey_fi = %s",
1497 array(
'integer',
'integer'),
1502 $this->questions = array_values($this->questions);
1511 array $questionblocks
1514 foreach ($questionblocks as $index) {
1515 $affectedRows =
$ilDB->manipulateF(
1516 "DELETE FROM svy_qblk WHERE questionblock_id = %s",
1520 $affectedRows =
$ilDB->manipulateF(
1521 "DELETE FROM svy_qblk_qst WHERE questionblock_fi = %s AND survey_fi = %s",
1522 array(
'integer',
'integer'),
1533 int $questionblock_id
1538 "DELETE FROM svy_qblk_qst WHERE questionblock_fi = %s AND survey_fi = %s AND question_fi = %s",
1539 array(
'integer',
'integer',
'integer'),
1540 array($questionblock_id, $this->
getSurveyId(), $question_id)
1549 int $questionblock_id
1555 $next_id =
$ilDB->nextId(
'svy_qblk_qst');
1556 $affectedRows =
$ilDB->manipulateF(
1557 "INSERT INTO svy_qblk_qst (qblk_qst_id, survey_fi, questionblock_fi, " .
1558 "question_fi) VALUES (%s, %s, %s, %s)",
1559 array(
'integer',
'integer',
'integer',
'integer'),
1560 array($next_id, $this->
getSurveyId(), $questionblock_id, $question_id)
1575 $ilDB = $DIC->database();
1577 $set =
$ilDB->query(
"SELECT * FROM svy_qblk_qst " .
1578 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
1579 " AND question_fi = " .
$ilDB->quote($a_question_fi,
"integer"));
1580 if ($rec =
$ilDB->fetchAssoc($set)) {
1593 int $questionblock_id
1597 $result =
$ilDB->queryF(
1598 "SELECT svy_question.title, svy_qblk_qst.question_fi, svy_qblk_qst.survey_fi FROM " .
1599 "svy_qblk, svy_qblk_qst, svy_question WHERE svy_qblk.questionblock_id = svy_qblk_qst.questionblock_fi AND " .
1600 "svy_question.question_id = svy_qblk_qst.question_fi AND svy_qblk.questionblock_id = %s",
1602 array($questionblock_id)
1605 while ($row =
$ilDB->fetchAssoc($result)) {
1606 $titles[$row[
"question_fi"]] = $row[
"title"];
1607 $survey_id = $row[
"survey_fi"];
1609 $result =
$ilDB->queryF(
1610 "SELECT question_fi, sequence FROM svy_svy_qst WHERE survey_fi = %s ORDER BY sequence",
1614 $resultarray = array();
1616 while ($row =
$ilDB->fetchAssoc($result)) {
1617 if (array_key_exists($row[
"question_fi"], $titles)) {
1618 $resultarray[$counter++] = $titles[$row[
"question_fi"]];
1621 return $resultarray;
1630 int $questionblock_id
1635 $result =
$ilDB->queryF(
1636 "SELECT a.question_fi FROM svy_qblk_qst a JOIN svy_svy_qst b ON (a.question_fi = b.question_fi) " .
1637 " WHERE a.questionblock_fi = %s ORDER BY b.sequence",
1639 array($questionblock_id)
1642 if ($result->numRows()) {
1644 if (!in_array(
$data[
'question_fi'], $ids)) {
1645 $ids[] = (
int)
$data[
'question_fi'];
1657 int $questionblock_id
1661 $ilDB = $DIC->database();
1662 $result =
$ilDB->queryF(
1663 "SELECT * FROM svy_qblk WHERE questionblock_id = %s",
1665 array($questionblock_id)
1667 $row =
$ilDB->fetchAssoc($result);
1677 bool $show_questiontext =
true,
1678 bool $show_blocktitle =
false,
1679 bool $compress_view =
false 1683 $ilDB = $DIC->database();
1684 $next_id =
$ilDB->nextId(
'svy_qblk');
1686 "INSERT INTO svy_qblk (questionblock_id, title, show_questiontext," .
1687 " show_blocktitle, owner_fi, tstamp, compress_view) " .
1688 "VALUES (%s, %s, %s, %s, %s, %s, %s)",
1689 array(
'integer',
'text',
'integer',
'integer',
'integer',
'integer',
'integer'),
1690 array($next_id,
$title, $show_questiontext, $show_blocktitle,
$owner, time(),$compress_view)
1700 bool $show_questiontext,
1701 bool $show_blocktitle,
1703 bool $compress_view =
false 1713 $next_id =
$ilDB->nextId(
'svy_qblk');
1714 $affectedRows =
$ilDB->manipulateF(
1715 "INSERT INTO svy_qblk (questionblock_id, title, show_questiontext," .
1716 " show_blocktitle, owner_fi, tstamp, compress_view) VALUES (%s, %s, %s, %s, %s, %s, %s)",
1717 array(
'integer',
'text',
'text',
'text',
'integer',
'integer',
'integer'),
1718 array($next_id, $title, $show_questiontext, $show_blocktitle, $ilUser->getId(), time(), $compress_view)
1720 if ($affectedRows) {
1721 $questionblock_id = $next_id;
1722 foreach ($questions as $index) {
1724 $next_id =
$ilDB->nextId(
'svy_qblk_qst');
1725 $affectedRows =
$ilDB->manipulateF(
1726 "INSERT INTO svy_qblk_qst (qblk_qst_id, survey_fi, questionblock_fi, " .
1727 "question_fi) VALUES (%s, %s, %s, %s)",
1728 array(
'integer',
'integer',
'integer',
'integer'),
1729 array($next_id, $this->
getSurveyId(), $questionblock_id, $index)
1741 int $questionblock_id,
1743 bool $show_questiontext,
1744 bool $show_blocktitle,
1745 bool $compress_view =
false 1749 "UPDATE svy_qblk SET title = %s, show_questiontext = %s," .
1750 " show_blocktitle = %s, compress_view = %s WHERE questionblock_id = %s",
1751 array(
'text',
'text',
'text',
'integer',
'integer'),
1752 array($title, $show_questiontext, $show_blocktitle, $compress_view, $questionblock_id)
1764 $result =
$ilDB->queryF(
1765 "SELECT constraint_fi FROM svy_qst_constraint WHERE question_fi = %s AND survey_fi = %s",
1766 array(
'integer',
'integer'),
1769 $constraints = array();
1770 while ($row =
$ilDB->fetchAssoc($result)) {
1771 $constraints[] = $row[
"constraint_fi"];
1773 foreach ($constraints as $constraint_id) {
1786 $affectedRows =
$ilDB->manipulateF(
1787 "DELETE FROM svy_constraint WHERE constraint_id = %s",
1789 array($constraint_id)
1791 $affectedRows =
$ilDB->manipulateF(
1792 "DELETE FROM svy_qst_constraint WHERE constraint_fi = %s",
1794 array($constraint_id)
1803 bool $with_answers =
false 1807 $all_questions = array();
1808 $result =
$ilDB->queryF(
1809 "SELECT svy_qtype.type_tag, svy_qtype.plugin, svy_question.question_id, " .
1810 "svy_svy_qst.heading FROM svy_qtype, svy_question, svy_svy_qst WHERE svy_svy_qst.survey_fi = %s AND " .
1811 "svy_svy_qst.question_fi = svy_question.question_id AND svy_question.questiontype_fi = svy_qtype.questiontype_id " .
1812 "ORDER BY svy_svy_qst.sequence",
1816 while ($row =
$ilDB->fetchAssoc($result)) {
1818 if ($row[
"plugin"]) {
1822 $question = self::_instanciateQuestion($row[
"question_id"]);
1823 $questionrow = $question->getQuestionDataArray($row[
"question_id"]);
1824 foreach ($row as $key => $value) {
1825 $questionrow[$key] = $value;
1827 $all_questions[$row[
"question_id"]] = $questionrow;
1828 $all_questions[$row[
"question_id"]][
"usableForPrecondition"] = $question->usableForPrecondition();
1829 $all_questions[$row[
"question_id"]][
"availableRelations"] = $question->getAvailableRelations();
1833 $questionblocks = array();
1834 if (count($all_questions)) {
1835 $result =
$ilDB->queryF(
1836 "SELECT svy_qblk.*, svy_qblk_qst.question_fi FROM svy_qblk, svy_qblk_qst WHERE " .
1837 "svy_qblk.questionblock_id = svy_qblk_qst.questionblock_fi AND svy_qblk_qst.survey_fi = %s " .
1838 "AND " .
$ilDB->in(
'svy_qblk_qst.question_fi', array_keys($all_questions),
false,
'integer'),
1842 while ($row =
$ilDB->fetchAssoc($result)) {
1843 $questionblocks[$row[
'question_fi']] = $row;
1847 foreach ($all_questions as $question_id => $row) {
1849 if (isset($questionblocks[$question_id])) {
1850 $all_questions[$question_id][
"questionblock_title"] = $questionblocks[$question_id][
'title'];
1851 $all_questions[$question_id][
"questionblock_id"] = $questionblocks[$question_id][
'questionblock_id'];
1853 $all_questions[$question_id][
"questionblock_title"] =
"";
1854 $all_questions[$question_id][
"questionblock_id"] =
"";
1856 $all_questions[$question_id][
"constraints"] = $constraints;
1857 if ($with_answers) {
1859 $result =
$ilDB->queryF(
1860 "SELECT svy_variable.*, svy_category.title FROM svy_variable, svy_category " .
1861 "WHERE svy_variable.question_fi = %s AND svy_variable.category_fi = svy_category.category_id " .
1862 "ORDER BY sequence ASC",
1866 if ($result->numRows() > 0) {
1868 $answers[] =
$data[
"title"];
1871 $all_questions[$question_id][
"answers"] = $answers;
1874 return $all_questions;
1883 array $obligatory_questions
1886 $result =
$ilDB->queryF(
1887 "SELECT * FROM svy_svy_qst WHERE survey_fi = %s",
1891 if ($result->numRows()) {
1892 while ($row =
$ilDB->fetchAssoc($result)) {
1893 if (!array_key_exists($row[
"question_fi"], $obligatory_questions)) {
1894 $obligatory_questions[$row[
"question_fi"]] = 0;
1899 foreach ($obligatory_questions as $question_fi => $obligatory) {
1901 $ilDB->manipulate(
"UPDATE svy_question" .
1902 " SET obligatory = " .
$ilDB->quote($obligatory,
"integer") .
1903 " WHERE question_id = " .
$ilDB->quote($question_fi,
"integer"));
1915 $all_questions = array();
1916 $result =
$ilDB->queryF(
1917 "SELECT svy_question.*, svy_qtype.type_tag, svy_svy_qst.heading FROM " .
1918 "svy_question, svy_qtype, svy_svy_qst WHERE svy_svy_qst.survey_fi = %s AND " .
1919 "svy_svy_qst.question_fi = svy_question.question_id AND svy_question.questiontype_fi = svy_qtype.questiontype_id " .
1920 "ORDER BY svy_svy_qst.sequence",
1924 while ($row =
$ilDB->fetchAssoc($result)) {
1925 $all_questions[$row[
"question_id"]] = $row;
1928 $questionblocks = array();
1929 if (count($all_questions)) {
1930 $result =
$ilDB->queryF(
1931 "SELECT svy_qblk.*, svy_qblk_qst.question_fi FROM svy_qblk, svy_qblk_qst " .
1932 "WHERE svy_qblk.questionblock_id = svy_qblk_qst.questionblock_fi AND svy_qblk_qst.survey_fi = %s " .
1933 "AND " .
$ilDB->in(
'svy_qblk_qst.question_fi', array_keys($all_questions),
false,
'integer'),
1937 while ($row =
$ilDB->fetchAssoc($result)) {
1938 $questionblocks[$row[
'question_fi']] = $row;
1942 $all_pages = array();
1945 foreach ($all_questions as $question_id => $row) {
1946 $constraints = array();
1947 if (isset($questionblocks[$question_id])) {
1948 if (!$currentblock or ($currentblock != $questionblocks[$question_id][
'questionblock_id'])) {
1951 $all_questions[$question_id][
'page'] = $pageindex;
1952 $all_questions[$question_id][
"questionblock_title"] = $questionblocks[$question_id][
'title'];
1953 $all_questions[$question_id][
"questionblock_id"] = $questionblocks[$question_id][
'questionblock_id'];
1954 $all_questions[$question_id][
"questionblock_show_questiontext"] = $questionblocks[$question_id][
'show_questiontext'];
1955 $all_questions[$question_id][
"questionblock_show_blocktitle"] = $questionblocks[$question_id][
'show_blocktitle'];
1956 $all_questions[$question_id][
"questionblock_compress_view"] = $questionblocks[$question_id][
'compress_view'];
1957 $currentblock = $questionblocks[$question_id][
'questionblock_id'];
1960 $all_questions[$question_id][
'page'] = $pageindex;
1961 $all_questions[$question_id][
"questionblock_title"] =
"";
1962 $all_questions[$question_id][
"questionblock_id"] =
"";
1963 $all_questions[$question_id][
"questionblock_show_questiontext"] = 1;
1964 $all_questions[$question_id][
"questionblock_show_blocktitle"] = 1;
1965 $all_questions[$question_id][
"questionblock_compress_view"] =
false;
1969 $all_questions[$question_id][
"constraints"] = $constraints;
1970 if (!isset($all_pages[$pageindex])) {
1971 $all_pages[$pageindex] = array();
1973 $all_pages[$pageindex][] = $all_questions[$question_id];
1976 $max = count($all_pages);
1978 foreach ($all_pages as $index => $block) {
1979 foreach ($block as $blockindex => $question) {
1980 $all_pages[$index][$blockindex][
"position"] = $counter / $max;
1997 int $active_page_question_id,
2002 if ($active_page_question_id === 0) {
2005 foreach ($pages as $key => $question_array) {
2006 foreach ($question_array as $question) {
2007 if ($active_page_question_id == $question[
"question_id"]) {
2012 if ($foundpage === -1) {
2015 $foundpage += $direction;
2016 if ($foundpage < 0) {
2019 if ($foundpage >= count($pages)) {
2022 return $pages[$foundpage];
2030 bool $use_obj_id =
false,
2031 bool $could_be_offline =
false,
2032 bool $showPath =
false,
2033 string $permission =
"read" 2047 $result =
$ilDB->queryF(
2048 "SELECT svy_constraint.*, svy_relation.*, svy_qst_constraint.question_fi ref_question_fi FROM svy_qst_constraint, svy_constraint, " .
2049 "svy_relation WHERE svy_constraint.relation_fi = svy_relation.relation_id AND " .
2050 "svy_qst_constraint.constraint_fi = svy_constraint.constraint_id AND svy_constraint.constraint_id = %s",
2052 array($constraint_id)
2055 if ($result->numRows()) {
2056 $pc =
$ilDB->fetchAssoc($result);
2070 $result_array = array();
2071 $result =
$ilDB->queryF(
2072 "SELECT svy_constraint.*, svy_relation.* FROM svy_qst_constraint, svy_constraint, svy_relation " .
2073 "WHERE svy_constraint.relation_fi = svy_relation.relation_id AND " .
2074 "svy_qst_constraint.constraint_fi = svy_constraint.constraint_id AND svy_qst_constraint.question_fi = %s " .
2075 "AND svy_qst_constraint.survey_fi = %s",
2076 array(
'integer',
'integer'),
2079 while ($row =
$ilDB->fetchAssoc($result)) {
2082 $question =
new $question_type();
2083 $question->loadFromDb($row[
"question_fi"]);
2084 $valueoutput = $question->getPreconditionValueOutput($row[
"value"]);
2085 $result_array[] = array(
"id" => $row[
"constraint_id"],
2086 "question" => $row[
"question_fi"],
2087 "short" => $row[
"shortname"],
2088 "long" => $row[
"longname"],
2089 "value" => $row[
"value"],
2090 "conjunction" => $row[
"conjunction"],
2091 "valueoutput" => $valueoutput
2094 return $result_array;
2105 $ilDB = $DIC->database();
2106 $result_array = array();
2107 $result =
$ilDB->queryF(
2108 "SELECT svy_qst_constraint.question_fi as for_question, svy_constraint.*, svy_relation.* " .
2109 "FROM svy_qst_constraint, svy_constraint, svy_relation WHERE svy_constraint.relation_fi = svy_relation.relation_id " .
2110 "AND svy_qst_constraint.constraint_fi = svy_constraint.constraint_id AND svy_qst_constraint.survey_fi = %s",
2114 while ($row =
$ilDB->fetchAssoc($result)) {
2115 $result_array[] = array(
"id" => $row[
"constraint_id"],
2116 "for_question" => $row[
"for_question"],
2117 "question" => $row[
"question_fi"],
2118 "short" => $row[
"shortname"],
2119 "long" => $row[
"longname"],
2120 "relation_id" => $row[
"relation_id"],
2121 "value" => $row[
"value"],
2122 'conjunction' => $row[
'conjunction']
2125 return $result_array;
2138 $result_array = array();
2139 $result =
$ilDB->queryF(
2140 "SELECT svy_variable.*, svy_category.title FROM svy_variable LEFT JOIN " .
2141 "svy_category ON svy_variable.category_fi = svy_category.category_id WHERE svy_variable.question_fi = %s " .
2142 "ORDER BY svy_variable.sequence",
2146 while ($row =
$ilDB->fetchObject($result)) {
2147 $result_array[$row->sequence] = $row;
2149 return $result_array;
2162 int $if_question_id,
2169 $next_id =
$ilDB->nextId(
'svy_constraint');
2170 $affectedRows =
$ilDB->manipulateF(
2171 "INSERT INTO svy_constraint (constraint_id, question_fi, relation_fi, value, conjunction) VALUES " .
2172 "(%s, %s, %s, %s, %s)",
2173 array(
'integer',
'integer',
'integer',
'float',
'integer'),
2174 array($next_id, $if_question_id, $relation, $value, $conjunction)
2176 if ($affectedRows) {
2188 int $to_question_id,
2193 $next_id =
$ilDB->nextId(
'svy_qst_constraint');
2195 "INSERT INTO svy_qst_constraint (question_constraint_id, survey_fi, question_fi, " .
2196 "constraint_fi) VALUES (%s, %s, %s, %s)",
2197 array(
'integer',
'integer',
'integer',
'integer'),
2198 array($next_id, $this->
getSurveyId(), $to_question_id, $constraint_id)
2206 int $precondition_id,
2207 int $if_question_id,
2214 "UPDATE svy_constraint SET question_fi = %s, relation_fi = %s, value = %s, conjunction = %s " .
2215 "WHERE constraint_id = %s",
2216 array(
'integer',
'integer',
'float',
'integer',
'integer'),
2217 array($if_question_id, $relation, $value, $conjunction, $precondition_id)
2229 foreach ($questions as $question_id) {
2231 "UPDATE svy_constraint SET conjunction = %s " .
2232 "WHERE constraint_id IN (SELECT constraint_fi FROM svy_qst_constraint WHERE svy_qst_constraint.question_fi = %s)",
2233 array(
'integer',
'integer'),
2234 array($conjunction, $question_id)
2243 bool $short_as_key =
false 2248 $custom_order = array(
"equal",
"not_equal",
"less",
"less_or_equal",
"more",
"more_or_equal");
2249 $custom_order = array_flip($custom_order);
2251 $result_array = array();
2252 $result =
$ilDB->query(
"SELECT * FROM svy_relation");
2253 while ($row =
$ilDB->fetchAssoc($result)) {
2254 if ($short_as_key) {
2255 $result_array[$row[
"shortname"]] = array(
"short" => $row[
"shortname"],
"long" => $row[
"longname"],
"id" => $row[
"relation_id"],
"order" => $custom_order[$row[
"longname"]]);
2257 $result_array[$row[
"relation_id"]] = array(
"short" => $row[
"shortname"],
"long" => $row[
"longname"],
"order" => $custom_order[$row[
"longname"]]);
2262 foreach ($result_array as $idx => $item) {
2263 unset($result_array[$idx][
"order"]);
2266 return $result_array;
2282 $affectedRows =
$ilDB->manipulateF(
2283 "DELETE FROM svy_answer WHERE question_fi = %s AND active_fi = %s",
2284 array(
'integer',
'integer'),
2285 array($question_id, $active_id)
2298 $result_array = array();
2299 $result =
$ilDB->queryF(
2300 "SELECT * FROM svy_answer WHERE question_fi = %s AND active_fi = %s",
2301 array(
'integer',
'integer'),
2302 array($question_id, $active_id)
2304 if ($result->numRows() >= 1) {
2305 while ($row =
$ilDB->fetchAssoc($result)) {
2306 $result_array[] = $row;
2309 return $result_array;
2323 "UPDATE svy_finished SET state = %s, tstamp = %s" .
2324 " WHERE survey_fi = %s AND finished_id = %s",
2325 array(
'text',
'integer',
'integer',
'integer'),
2326 array(1, time(), $this->
getSurveyId(), $finished_id)
2330 if ($this->
getMode() === self::MODE_SELF_EVAL) {
2333 $sskill->writeAndAddSelfEvalSkills($user[
'usr_id']);
2337 if ($this->
getMode() === self::MODE_IND_FEEDB) {
2342 $run_manager = $this->survey_service
2345 ->run($this, $this->
user->getId(), $appr_id);
2346 $run = $run_manager->getById($finished_id);
2349 $rater_id = $run->getUserId();
2351 foreach ($raters as
$id => $rater) {
2352 if (($rater[
"code"] ??
"") === $run->getCode()) {
2359 $sskill->writeAndAddIndFeedbackSkills($finished_id, $appr_id, $rater_id);
2378 "UPDATE svy_finished SET lastpage = %s WHERE finished_id = %s",
2379 array(
'integer',
'integer'),
2380 array(($page_id) ?: 0, $finished_id)
2392 string $a_anonymize_id,
2396 $placeholders = array(
2397 "FIRST_NAME" =>
"firstname",
2398 "LAST_NAME" =>
"lastname",
2401 "firstname" =>
"firstname" 2406 $recipients = explode(
",", $this->mailaddresses ??
"");
2407 foreach ($recipients as $recipient) {
2410 $ntf->setLangModules(array(
"survey"));
2412 $ntf->setSubjectLangId(
'finished_mail_subject');
2416 if (trim($messagetext ??
"")) {
2421 foreach ($placeholders as $key => $mapping) {
2423 $messagetext = str_replace(
'[' . $key .
']',
'', $messagetext);
2425 $messagetext = str_replace(
'[' . $key .
']', trim(
$data[$mapping] ??
""), $messagetext);
2428 $ntf->setIntroductionDirect($messagetext);
2430 $ntf->setIntroductionLangId(
'survey_notification_finished_introduction');
2435 $ntf->addAdditionalInfo(
2436 'survey_360_appraisee',
2441 $active_id = $this->
getActiveID($a_user_id, $a_anonymize_id, $a_appr_id);
2443 $ntf->addAdditionalInfo(
2450 $ntf->setGotoLangId(
'survey_notification_tutor_link');
2451 $ntf->setReasonLangId(
'survey_notification_finished_reason');
2453 $recipient = trim($recipient ??
"");
2456 $ntf->sendMailAndReturnRecipients([
$user_id]);
2459 if (count($user_ids) > 0) {
2460 $ntf->sendMailAndReturnRecipients([current($user_ids)]);
2491 $questioncounter = 1;
2492 foreach ($questions as $question_id => $question_data) {
2493 $textresult .= $questioncounter++ .
". " . $question_data[
"title"] .
"\n";
2494 $found = $userResults[$question_id][$active_id];
2496 if (is_array($found)) {
2497 $text = implode(
"\n", $found);
2502 $text = self::getSurveySkippedValue();
2504 $text = str_replace(
"<br />",
"\n", $text);
2505 $textresult .= $text .
"\n\n";
2516 string $anonymize_id,
2522 if ($anonymize_id) {
2523 $result =
$ilDB->queryF(
2524 "SELECT finished_id FROM svy_finished" .
2525 " WHERE survey_fi = %s AND anonymous_id = %s AND appr_id = %s",
2526 array(
'integer',
'text',
'integer'),
2527 array($this->
getSurveyId(), $anonymize_id, $appr_id)
2530 $result =
$ilDB->queryF(
2531 "SELECT finished_id FROM svy_finished" .
2532 " WHERE survey_fi = %s AND user_fi = %s AND appr_id = %s",
2533 array(
'integer',
'integer',
'integer'),
2537 if ($result->numRows() === 0) {
2540 $row =
$ilDB->fetchAssoc($result);
2541 return (
int) $row[
"finished_id"];
2553 $result =
$ilDB->queryF(
2554 "SELECT lastpage FROM svy_finished WHERE finished_id = %s",
2558 if ($row =
$ilDB->fetchAssoc($result)) {
2559 return (
int) $row[
"lastpage"];
2573 array $constraint_data,
2574 ?array $working_data
2576 if (!is_array($working_data) || count($working_data) === 0) {
2580 if ((count($working_data) === 1) and (strcmp($working_data[0][
"value"],
"") === 0)) {
2585 foreach ($working_data as
$data) {
2586 switch ($constraint_data[
"short"]) {
2588 if ($data[
"value"] < $constraint_data[
"value"]) {
2594 if ($data[
"value"] <= $constraint_data[
"value"]) {
2600 if ($data[
"value"] == $constraint_data[
"value"]) {
2606 if ($data[
"value"] <> $constraint_data[
"value"]) {
2612 if ($data[
"value"] >= $constraint_data[
"value"]) {
2618 if ($data[
"value"] > $constraint_data[
"value"]) {
2628 return (
int) $found;
2639 $ilDB = $DIC->database();
2641 $result =
$ilDB->queryF(
2642 "SELECT finished_id FROM svy_finished WHERE survey_fi = %s",
2646 return (
bool) $result->numRows();
2659 $result =
$ilDB->queryF(
2660 "SELECT * FROM svy_finished WHERE survey_fi = %s",
2664 if ($result->numRows()) {
2665 while ($row =
$ilDB->fetchAssoc($result)) {
2666 $users[] = (
int) $row[
"finished_id"];
2680 $evaluation = array();
2686 $question =
new $question_type();
2687 $question->loadFromDb($question_id);
2690 $q_res = $q_eval->getResults();
2693 foreach ($finished_ids as
$user_id) {
2694 $data[
$user_id] = $q_eval->parseUserSpecificResults($q_res, $user_id);
2697 $evaluation[$question_id] =
$data;
2709 bool $force_non_anonymous =
false 2713 $surveySetting =
new ilSetting(
"survey");
2714 $use_anonymous_id = $surveySetting->get(
"use_anonymous_id");
2715 $result =
$ilDB->queryF(
2716 "SELECT * FROM svy_finished WHERE finished_id = %s",
2721 $foundrows = $result->numRows();
2723 $row =
$ilDB->fetchAssoc($result);
2725 $name = ($use_anonymous_id) ? $row[
"anonymous_id"] : $this->
lng->txt(
"anonymous");
2727 "fullname" => $name,
2728 "sortname" => $name,
2733 "active_id" => (
string) $active_id
2736 if (($row[
"user_fi"] > 0) &&
2740 $force_non_anonymous)) {
2742 $userdata[
"fullname"] = $userdata[
"sortname"] = $this->
lng->txt(
"deleted_user");
2745 $userdata[
'usr_id'] = $row[
'user_fi'];
2748 if (strlen($gender) === 1) {
2749 $gender = $this->
lng->txt(
"gender_$gender");
2751 $userdata[
"gender"] = $gender;
2755 $userdata[
"login"] = $user->
getLogin();
2759 $code = $this->code_manager->getByUserKey((
string) $row[
"anonymous_id"]);
2760 if (!is_null($code) && $this->feature_config->usesAppraisees()) {
2761 $userdata[
"firstname"] = $code->getFirstName();
2762 $userdata[
"lastname"] = $code->getLastName();
2763 $userdata[
"sortname"] = $code->getLastName() .
", " . $code->getFirstName();
2782 $result =
$ilDB->queryF(
2783 "SELECT * FROM svy_answer WHERE active_fi = %s",
2787 while ($row =
$ilDB->fetchAssoc($result)) {
2788 if (!is_array($answers[$row[
"question_fi"]])) {
2789 $answers[$row[
"question_fi"]] = array();
2791 $answers[$row[
"question_fi"]][] = $row;
2795 "name" => $userdata[
"fullname"],
2796 "firstname" => $userdata[
"firstname"],
2797 "lastname" => $userdata[
"lastname"],
2798 "login" => $userdata[
"login"],
2799 "gender" => $userdata[
"gender"],
2800 "answers" => array()
2802 foreach ($questions as $key => $question) {
2803 if (array_key_exists($key, $answers)) {
2804 $resultset[
"answers"][$key] = $answers[$key];
2806 $resultset[
"answers"][$key] = array();
2808 sort($resultset[
"answers"][$key]);
2822 if (array_key_exists(
'title', $arrFilter) && strlen($arrFilter[
'title'])) {
2823 $where .=
" AND " .
$ilDB->like(
'svy_question.title',
'text',
"%%" . $arrFilter[
'title'] .
"%%");
2825 if (array_key_exists(
'description', $arrFilter) && strlen($arrFilter[
'description'])) {
2826 $where .=
" AND " .
$ilDB->like(
'svy_question.description',
'text',
"%%" . $arrFilter[
'description'] .
"%%");
2828 if (array_key_exists(
'author', $arrFilter) && strlen($arrFilter[
'author'])) {
2829 $where .=
" AND " .
$ilDB->like(
'svy_question.author',
'text',
"%%" . $arrFilter[
'author'] .
"%%");
2831 if (array_key_exists(
'type', $arrFilter) && strlen($arrFilter[
'type'])) {
2832 $where .=
" AND svy_qtype.type_tag = " .
$ilDB->quote($arrFilter[
'type'],
'text');
2834 if (array_key_exists(
'spl', $arrFilter) && strlen($arrFilter[
'spl'])) {
2835 $where .=
" AND svy_question.obj_fi = " .
$ilDB->quote($arrFilter[
'spl'],
'integer');
2839 $forbidden =
" AND " .
$ilDB->in(
'svy_question.obj_fi', array_keys($spls),
false,
'integer');
2840 $forbidden .=
" AND svy_question.complete = " .
$ilDB->quote(
"1",
'text');
2843 if (count($existing_questions)) {
2844 $existing =
" AND " .
$ilDB->in(
'svy_question.question_id', $existing_questions,
true,
'integer');
2849 $query_result =
$ilDB->query(
"SELECT svy_question.*, svy_qtype.type_tag, svy_qtype.plugin, object_reference.ref_id" .
2850 " FROM svy_question, svy_qtype, object_reference" .
2851 " WHERE svy_question.original_id IS NULL" . $forbidden . $existing .
2852 " AND svy_question.obj_fi = object_reference.obj_id AND svy_question.tstamp > 0" .
2853 " AND svy_question.questiontype_fi = svy_qtype.questiontype_id " . $where);
2856 if ($query_result->numRows()) {
2857 while ($row =
$ilDB->fetchAssoc($query_result)) {
2858 if (array_key_exists(
'spl_txt', $arrFilter) && strlen($arrFilter[
'spl_txt'])) {
2859 if (stripos($spls[$row[
"obj_fi"]], $arrFilter[
'spl_txt']) ===
false) {
2864 $row[
'ttype'] = $trans[$row[
'type_tag']];
2865 if ($row[
"plugin"]) {
2885 if (array_key_exists(
'title', $arrFilter) && strlen($arrFilter[
'title'])) {
2886 $where .=
" AND " .
$ilDB->like(
'svy_qblk.title',
'text',
"%%" . $arrFilter[
'title'] .
"%%");
2889 $query_result =
$ilDB->query(
"SELECT svy_qblk.*, svy_svy.obj_fi FROM svy_qblk , svy_qblk_qst, svy_svy WHERE " .
2890 "svy_qblk.questionblock_id = svy_qblk_qst.questionblock_fi AND svy_svy.survey_id = svy_qblk_qst.survey_fi " .
2891 "$where GROUP BY svy_qblk.questionblock_id, svy_qblk.title, svy_qblk.show_questiontext, svy_qblk.show_blocktitle, " .
2892 "svy_qblk.owner_fi, svy_qblk.tstamp, svy_svy.obj_fi");
2894 if ($query_result->numRows()) {
2896 $surveytitles = array();
2897 foreach ($survey_ref_ids as $survey_ref_id) {
2901 while ($row =
$ilDB->fetchAssoc($query_result)) {
2904 foreach ($questions_array as $key => $value) {
2905 $questions_array[$key] =
"$counter. $value";
2908 if (strlen($surveytitles[$row[
"obj_fi"]] ??
"")) {
2909 $rows[$row[
"questionblock_id"]] = array(
2910 "questionblock_id" => $row[
"questionblock_id"],
2911 "title" => $row[
"title"],
2912 "svy" => $surveytitles[$row[
"obj_fi"]],
2913 "contains" => implode(
", ", $questions_array),
2914 "owner" => $row[
"owner_fi"]
2930 $a_xml_writer->xmlHeader();
2932 "xmlns:xsi" =>
"http://www.w3.org/2001/XMLSchema-instance",
2933 "xsi:noNamespaceSchemaLocation" =>
"https://www.ilias.de/download/xsd/ilias_survey_4_2.xsd" 2935 $a_xml_writer->xmlStartTag(
"surveyobject", $attrs);
2940 $a_xml_writer->xmlStartTag(
"survey", $attrs);
2943 $a_xml_writer->xmlElement(
"author",
null, $this->
getAuthor());
2944 $a_xml_writer->xmlStartTag(
"objectives");
2946 "label" =>
"introduction" 2953 $a_xml_writer->xmlEndTag(
"objectives");
2956 $attribs = array(
"enabled" =>
"1");
2958 $attribs = array(
"enabled" =>
"0");
2960 $a_xml_writer->xmlElement(
"anonymisation", $attribs);
2961 $a_xml_writer->xmlStartTag(
"restrictions");
2963 $attribs = array(
"type" =>
"free");
2965 $attribs = array(
"type" =>
"restricted");
2967 $a_xml_writer->xmlElement(
"access", $attribs);
2969 $attrs = array(
"type" =>
"date");
2970 preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->
getStartDate(), $matches);
2971 $a_xml_writer->xmlElement(
"startingtime", $attrs, sprintf(
"%04d-%02d-%02dT%02d:%02d:00", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5]));
2974 $attrs = array(
"type" =>
"date");
2975 preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->
getEndDate(), $matches);
2976 $a_xml_writer->xmlElement(
"endingtime", $attrs, sprintf(
"%04d-%02d-%02dT%02d:%02d:00", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5]));
2978 $a_xml_writer->xmlEndTag(
"restrictions");
2982 $hasconstraints =
false;
2983 foreach ($pages as $question_array) {
2984 foreach ($question_array as $question) {
2985 if (count($question[
"constraints"])) {
2986 $hasconstraints =
true;
2991 if ($hasconstraints) {
2992 $a_xml_writer->xmlStartTag(
"constraints");
2993 foreach ($pages as $question_array) {
2994 foreach ($question_array as $question) {
2995 if (count($question[
"constraints"])) {
2997 foreach ($question[
"constraints"] as $constraint) {
2999 "sourceref" => $question[
"question_id"],
3000 "destref" => $constraint[
"question"],
3001 "relation" => $constraint[
"short"],
3002 "value" => $constraint[
"value"],
3003 "conjunction" => $constraint[
"conjunction"]
3005 $a_xml_writer->xmlElement(
"constraint", $attribs);
3010 $a_xml_writer->xmlEndTag(
"constraints");
3014 $a_xml_writer->xmlStartTag(
"metadata");
3016 $custom_properties = array();
3026 $custom_properties[
"mode"] = $this->
getMode();
3030 $custom_properties[
"mode_360_results"] = $this->
get360Results();
3039 foreach ($custom_properties as $label => $value) {
3040 $a_xml_writer->xmlStartTag(
"metadatafield");
3041 $a_xml_writer->xmlElement(
"fieldlabel",
null, $label);
3042 $a_xml_writer->xmlElement(
"fieldentry",
null, $value);
3043 $a_xml_writer->xmlEndTag(
"metadatafield");
3046 $a_xml_writer->xmlEndTag(
"metadata");
3047 $a_xml_writer->xmlEndTag(
"survey");
3049 $attribs = array(
"id" => $this->
getId());
3050 $a_xml_writer->xmlStartTag(
"surveyquestions", $attribs);
3052 foreach ($pages as $question_array) {
3053 if (count($question_array) > 1) {
3054 $attribs = array(
"id" => $question_array[0][
"question_id"]);
3056 "showQuestiontext" => $question_array[0][
"questionblock_show_questiontext"],
3057 "showBlocktitle" => $question_array[0][
"questionblock_show_blocktitle"],
3058 "compressView" => $question_array[0][
"questionblock_compress_view"]
3060 $a_xml_writer->xmlStartTag(
"questionblock", $attribs);
3061 if (strlen($question_array[0][
"questionblock_title"])) {
3062 $a_xml_writer->xmlElement(
"questionblocktitle",
null, $question_array[0][
"questionblock_title"]);
3065 foreach ($question_array as $question) {
3066 if (strlen($question[
"heading"] ??
"")) {
3067 $a_xml_writer->xmlElement(
"textblock",
null, $question[
"heading"]);
3069 $questionObject = self::_instanciateQuestion($question[
"question_id"]);
3073 if ($questionObject !==
false) {
3074 $questionObject->insertXML($a_xml_writer,
false);
3077 if (count($question_array) > 1) {
3078 $a_xml_writer->xmlEndTag(
"questionblock");
3082 $a_xml_writer->xmlEndTag(
"surveyquestions");
3083 $a_xml_writer->xmlEndTag(
"surveyobject");
3084 $xml = $a_xml_writer->xmlDumpMem(
false);
3095 if ($question_id < 1) {
3099 if ($question_type ===
'') {
3103 $question =
new $question_type();
3104 $question->loadFromDb($question_id);
3116 if (!is_dir($a_dir) || is_int(strpos($a_dir,
".."))) {
3119 $importDirectory =
"";
3122 $current_dir = opendir($a_dir);
3124 while ($entryname = readdir($current_dir)) {
3125 $files[] = $entryname;
3128 foreach ($files as $file) {
3129 if (is_dir($a_dir .
"/" . $file) and ($file !==
"." and $file !==
"..")) {
3131 $importDirectory = $a_dir .
"/" . $file;
3134 closedir($current_dir);
3135 if ($importDirectory !==
'') {
3137 $current_dir = opendir($importDirectory);
3139 while ($entryname = readdir($current_dir)) {
3140 $files[] = $entryname;
3142 foreach ($files as $file) {
3143 if (is_file($importDirectory .
"/" . $file) &&
3144 ($file !==
"." && $file !==
"..") &&
3145 (preg_match(
"/^[0-9]{10}__[0-9]+__(svy_)*[0-9]+\.[A-Za-z]{1,3}$/", $file) ||
3146 preg_match(
"/^[0-9]{10}__[0-9]+__(survey__)*[0-9]+\.[A-Za-z]{1,3}$/", $file))) {
3148 $xmlFile = $importDirectory .
"/" . $file;
3152 return array(
"dir" => $importDirectory,
"xml" => $xmlFile);
3166 if ($svy_qpl_id < 1) {
3170 $source = $file_info[
"tmp_name"];
3172 if (($source ===
'none') || (!$source) || $file_info[
"error"] > UPLOAD_ERR_OK) {
3173 $error = $this->
lng->txt(
"import_no_file_selected");
3178 if ((strcmp($file_info[
"type"],
"text/xml") === 0) || (strcmp($file_info[
"type"],
"application/xml") === 0)) {
3179 $this->svy_log->debug(
"isXML");
3183 $suffix = pathinfo($file_info[
"name"]);
3184 if (strcmp(strtolower($suffix[
"extension"]),
"zip") === 0) {
3185 $this->svy_log->debug(
"isZip");
3188 if (!$isXml && !$isZip) {
3189 $error = $this->
lng->txt(
"import_wrong_file_type");
3190 $this->svy_log->debug(
"Survey: Import error. Filetype was \"" . $file_info[
"type"] .
"\"");
3195 $import_subdir =
"";
3198 $importfile = $import_dir .
"/" . $file_info[
"name"];
3200 $this->domain->resources()->zip()->unzipFile($importfile);
3202 if (!((strlen($found[
"dir"]) > 0) && (strlen($found[
"xml"]) > 0))) {
3203 $error = $this->
lng->txt(
"wrong_import_file_structure");
3206 $importfile = $found[
"xml"];
3207 $import_subdir = $found[
"dir"];
3209 $importfile = tempnam($import_dir,
"survey_import");
3213 $this->svy_log->debug(
"Import file = $importfile");
3214 $this->svy_log->debug(
"Import subdir = $import_subdir");
3216 $fh = fopen($importfile,
'rb');
3218 $error = $this->
lng->txt(
"import_error_opening_file");
3221 $xml = fread($fh, filesize($importfile));
3222 $result = fclose($fh);
3224 $error = $this->
lng->txt(
"import_error_closing_file");
3228 $this->import_manager->clearMobs();
3229 if (strpos($xml,
"questestinterop")) {
3232 $this->svy_log->debug(
"survey id = " . $this->
getId());
3233 $this->svy_log->debug(
"question pool id = " . $svy_qpl_id);
3236 $config = $imp->getConfig(
"components/ILIAS/Survey");
3237 $config->setQuestionPoolID($svy_qpl_id);
3238 $imp->getMapping()->addMapping(
"components/ILIAS/Survey",
"svy", 0, $this->
getId());
3239 $imp->importFromDirectory($import_subdir,
"svy",
"components/ILIAS/Survey");
3240 $this->svy_log->debug(
"config(Modules/survey)->getQuestionPoolId =" . $config->getQuestionPoolID());
3246 public function cloneObject(
int $target_id,
int $copy_id = 0,
bool $omit_tree =
false): ?
ilObject 3256 $newObj = parent::cloneObject($target_id, $copy_id, $omit_tree);
3258 $newObj->updateMetaData();
3262 $newObj->setOutro($this->
getOutro());
3272 $newObj->setMode($this->
getMode());
3297 $question_pointer = array();
3301 foreach ($this->questions as $key => $question_id) {
3303 $question = self::_instanciateQuestion($question_id);
3307 $question->setObjId($newObj->getId());
3308 $question->saveToDb($original_id);
3309 $newObj->questions[$key] = $question->getId();
3310 $question_pointer[$question_id] = $question->getId();
3311 $mapping[$question_id] = $question->getId();
3318 if (!$cp_options->isRootNode($this->getRefId())) {
3322 $newObj->saveToDb();
3323 $newObj->cloneTextblocks($mapping);
3326 if (($svy_type === self::MODE_360 || $svy_type === self::MODE_SELF_EVAL) &&
3331 foreach ($mapping as $src_qst_id => $tgt_qst_id) {
3332 $qst_skill = $src_skills->getSkillForQuestion($src_qst_id);
3334 $tgt_skills->addQuestionSkillAssignment($tgt_qst_id, $qst_skill[
"base_skill_id"], $qst_skill[
"tref_id"]);
3339 $thresholds->cloneTo($newObj, $mapping);
3343 $questionblocks = array();
3344 $questionblock_questions = array();
3345 $result =
$ilDB->queryF(
3346 "SELECT * FROM svy_qblk_qst WHERE survey_fi = %s",
3350 if ($result->numRows() > 0) {
3351 while ($row =
$ilDB->fetchAssoc($result)) {
3352 $questionblock_questions[] = $row;
3353 $questionblocks[$row[
"questionblock_fi"]] = $row[
"questionblock_fi"];
3357 foreach ($questionblocks as $key => $value) {
3358 $questionblock = self::_getQuestionblock($key);
3359 $questionblock_id = self::_addQuestionblock(
3360 (
string) $questionblock[
"title"],
3361 (
int) $questionblock[
"owner_fi"],
3362 (
bool) $questionblock[
"show_questiontext"],
3363 (
bool) $questionblock[
"show_blocktitle"],
3364 (
bool) $questionblock[
"compress_view"]
3366 $questionblocks[$key] = $questionblock_id;
3369 foreach ($questionblock_questions as $key => $value) {
3370 if ($questionblocks[$value[
"questionblock_fi"]] &&
3371 $question_pointer[$value[
"question_fi"]]) {
3372 $next_id =
$ilDB->nextId(
'svy_qblk_qst');
3373 $affectedRows =
$ilDB->manipulateF(
3374 "INSERT INTO svy_qblk_qst (qblk_qst_id, survey_fi, questionblock_fi, question_fi) " .
3375 "VALUES (%s, %s, %s, %s)",
3376 array(
'integer',
'integer',
'integer',
'integer'),
3377 array($next_id, $newObj->getSurveyId(), $questionblocks[$value[
"questionblock_fi"]], $question_pointer[$value[
"question_fi"]])
3383 $constraints = self::_getConstraints($this->
getSurveyId());
3384 $newConstraints = array();
3385 foreach ($constraints as $key => $constraint) {
3386 if ($question_pointer[$constraint[
"for_question"]] &&
3387 $question_pointer[$constraint[
"question"]]) {
3388 if (!array_key_exists($constraint[
'id'], $newConstraints)) {
3389 $constraint_id = $newObj->addConstraint($question_pointer[$constraint[
"question"]], $constraint[
"relation_id"], $constraint[
"value"], $constraint[
'conjunction']);
3390 $newConstraints[$constraint[
'id']] = $constraint_id;
3392 $newObj->addConstraintToQuestion($question_pointer[$constraint[
"for_question"]], $newConstraints[$constraint[
'id']]);
3398 $obj_settings->cloneSettings($newObj->getId());
3399 unset($obj_settings);
3411 $result =
$ilDB->queryF(
3412 "SELECT * FROM svy_svy_qst WHERE question_fi = %s",
3416 if ($row =
$ilDB->fetchAssoc($result)) {
3417 return $row[
"heading"] ??
"";
3431 foreach ($mapping as $original_id => $new_id) {
3447 if (!is_writable($svy_data_dir)) {
3448 throw new ilSurveyException(
"Survey Data Directory (" . $svy_data_dir .
") not writeable.");
3452 $svy_dir = $svy_data_dir .
"/svy_" . $this->
getId();
3454 if (!is_dir($svy_dir)) {
3458 $export_dir = $svy_dir .
"/export";
3460 if (!is_dir($export_dir)) {
3486 if (!is_writable($svy_data_dir)) {
3487 throw new ilSurveyException(
"Survey Data Directory (" . $svy_data_dir .
") not writeable.");
3491 $svy_dir = $svy_data_dir .
"/svy_" . $this->
getId();
3493 if (!is_dir($svy_dir)) {
3498 $import_dir = $svy_dir .
"/import";
3500 if (!is_dir($import_dir)) {
3512 "/svy_" . $this->
getId() .
"/import";
3513 if (!is_dir($import_dir)) {
3516 if (is_dir($import_dir)) {
3535 "UPDATE svy_svy_qst SET heading=%s WHERE survey_fi=%s AND question_fi=%s",
3536 array(
'text',
'integer',
'integer'),
3537 array($heading, $this->
getSurveyId(), $insertbefore)
3541 "UPDATE svy_svy_qst SET heading=%s WHERE survey_fi=%s AND question_fi=%s",
3542 array(
'text',
'integer',
'integer'),
3556 $result =
$ilDB->queryF(
3557 "SELECT finished_id FROM svy_finished WHERE anonymous_id = %s AND survey_fi = %s",
3558 array(
'text',
'integer'),
3561 return $result->numRows() === 1;
3574 ?array $a_codes =
null,
3575 ?array $a_ids =
null 3581 $sql =
"SELECT svy_anonymous.*, svy_finished.state" .
3582 " FROM svy_anonymous" .
3583 " LEFT JOIN svy_finished ON (svy_anonymous.survey_key = svy_finished.anonymous_id)" .
3584 " WHERE svy_anonymous.survey_fi = " .
$ilDB->quote($this->
getSurveyId(),
"integer") .
3585 " AND svy_anonymous.user_key IS NULL";
3588 $sql .=
" AND " .
$ilDB->in(
"svy_anonymous.survey_key", $a_codes,
"",
"text");
3590 $sql .=
" AND " .
$ilDB->in(
"svy_anonymous.anonymous_id", $a_ids,
"",
"text");
3597 $titles[] =
'"' .
$lng->
txt(
"survey_code") .
'"';
3598 $titles[] =
'"' .
$lng->
txt(
"email") .
'"';
3599 $titles[] =
'"' .
$lng->
txt(
"lastname") .
'"';
3600 $titles[] =
'"' .
$lng->
txt(
"firstname") .
'"';
3601 $titles[] =
'"' .
$lng->
txt(
"create_date") .
'"';
3602 $titles[] =
'"' .
$lng->
txt(
"used") .
'"';
3603 $titles[] =
'"' .
$lng->
txt(
"mail_sent_short") .
'"';
3604 $titles[] =
'"' .
$lng->
txt(
"survey_code_url") .
'"';
3605 $export[] = implode(
";", $titles);
3607 $result =
$ilDB->query($sql);
3608 $default_lang = $ilUser->getPref(
"survey_code_language");
3609 while ($row =
$ilDB->fetchAssoc($result)) {
3611 $item[] = $row[
"survey_key"];
3613 if ($row[
"externaldata"]) {
3614 $ext = unserialize((
string) $row[
"externaldata"], [
'allowed_classes' =>
false]);
3615 $item[] = $ext[
"email"];
3616 $item[] = $ext[
"lastname"];
3617 $item[] = $ext[
"firstname"];
3629 $item[] = ($row[
"sent"]) ? 1 : 0;
3631 $params = array(
"accesscode" => $row[
"survey_key"]);
3632 if ($default_lang) {
3633 $params[
"lang"] = $default_lang;
3637 $export[] =
'"' . implode(
'";"', $item) .
'"';
3639 return implode(
"\n", $export);
3655 $sql =
"SELECT svy_anonymous.*, svy_finished.state" .
3656 " FROM svy_anonymous" .
3657 " LEFT JOIN svy_finished ON (svy_anonymous.survey_key = svy_finished.anonymous_id)" .
3658 " WHERE svy_anonymous.survey_fi = " .
$ilDB->quote($this->
getSurveyId(),
"integer")
3662 $sql .=
" AND " .
$ilDB->in(
"svy_anonymous.anonymous_id", $ids,
"",
"integer");
3665 $sql .=
" ORDER BY tstamp, survey_key ASC";
3666 $result =
$ilDB->query($sql);
3667 if ($result->numRows() > 0) {
3668 while ($row =
$ilDB->fetchAssoc($result)) {
3674 $params = array(
"accesscode" => $row[
"survey_key"]);
3683 'id' => $row[
"anonymous_id"],
3684 'code' => $row[
"survey_key"],
3685 'date' => $row[
"tstamp"],
3687 'sent' => $row[
'sent'],
3694 if ($row[
"externaldata"]) {
3695 $ext = unserialize((
string) $row[
"externaldata"], [
'allowed_classes' =>
false]);
3696 $item[
'email'] = $ext[
'email'] ??
"";
3697 $item[
'last_name'] = $ext[
'lastname'] ??
"";
3698 $item[
'first_name'] = $ext[
'firstname'] ??
"";
3714 $result =
$ilDB->queryF(
3715 "SELECT finished_id FROM svy_finished WHERE survey_fi = %s AND anonymous_id = %s",
3716 array(
'integer',
'text'),
3719 return $result->numRows() > 0;
3729 $result =
$ilDB->queryF(
3730 "SELECT anonymous_id FROM svy_anonymous WHERE survey_fi = %s AND survey_key = %s",
3731 array(
'integer',
'text'),
3734 return !(($result->numRows() > 0));
3741 string $a_anonymize_key,
3747 $next_id =
$ilDB->nextId(
'svy_anonymous');
3749 "INSERT INTO svy_anonymous (anonymous_id, survey_key, survey_fi, externaldata, tstamp) " .
3750 "VALUES (%s, %s, %s, %s, %s)",
3751 array(
'integer',
'text',
'integer',
'text',
'integer'),
3752 array($next_id, $a_anonymize_key, $this->
getSurveyId(), serialize($a_data), $a_created)
3771 $check_finished = ($not_sent > 1);
3776 foreach ($recipients as
$data) {
3777 if ($data[
'email'] && $data[
'code']) {
3779 switch ($not_sent) {
3781 $do_send = !(bool) $data[
'sent'];
3785 $do_send = $data[
'finished'];
3789 $do_send = !$data[
'finished'];
3799 $url = ilLink::_getLink(
3803 "accesscode" => $data[
"code"],
3807 $messagetext = str_replace(
'[url]',
$url, $messagetext);
3808 foreach ($data as $key => $value) {
3809 $messagetext = str_replace(
'[' . $key .
']', $value, $messagetext);
3827 "UPDATE svy_anonymous SET sent = %s WHERE survey_fi = %s AND externaldata IS NOT NULL",
3828 array(
'integer',
'integer'),
3837 bool $a_check_finished =
false 3840 $result =
$ilDB->queryF(
3841 "SELECT survey_key code, externaldata, sent FROM svy_anonymous WHERE survey_fi = %s",
3846 while ($row =
$ilDB->fetchAssoc($result)) {
3847 if (!$row[
'externaldata']) {
3851 $externaldata = unserialize((
string) $row[
'externaldata'], [
'allowed_classes' =>
false]);
3852 if (!$externaldata[
'email']) {
3856 $externaldata[
'code'] = $row[
'code'];
3857 $externaldata[
'sent'] = $row[
'sent'];
3859 if ($a_check_finished) {
3865 $res[] = $externaldata;
3878 $result = $this->db->queryF(
3879 "SELECT state FROM svy_finished WHERE survey_fi = %s AND anonymous_id = %s",
3880 array(
'integer',
'text'),
3884 $row = $this->db->fetchAssoc($result);
3886 return $row[
'state'] ??
false;
3897 if ($survey_code !==
'') {
3898 $affectedRows =
$ilDB->manipulateF(
3899 "DELETE FROM svy_anonymous WHERE survey_fi = %s AND survey_key = %s",
3900 array(
'integer',
'text'),
3916 $result =
$ilDB->queryF(
3917 "SELECT survey_key FROM svy_anonymous WHERE survey_fi = %s AND user_key = %s",
3918 array(
'integer',
'text'),
3921 if ($result->numRows()) {
3922 $row =
$ilDB->fetchAssoc($result);
3923 $access_code = $row[
"survey_key"];
3925 return $access_code;
3942 $next_id =
$ilDB->nextId(
'svy_anonymous');
3943 $affectedRows =
$ilDB->manipulateF(
3944 "INSERT INTO svy_anonymous (anonymous_id, survey_key, survey_fi, user_key, tstamp) " .
3945 "VALUES (%s, %s, %s, %s, %s)",
3946 array(
'integer',
'text',
'integer',
'text',
'integer'),
3947 array($next_id, $access_code, $this->
getSurveyId(), md5($user_id), time())
3960 $result =
$ilDB->queryF(
3961 "SELECT tstamp FROM svy_answer WHERE active_fi = %s ORDER BY tstamp DESC",
3965 if ($result->numRows()) {
3966 $row =
$ilDB->fetchAssoc($result);
3967 return (
int) $row[
"tstamp"];
3969 $result =
$ilDB->queryF(
3970 "SELECT tstamp FROM svy_finished WHERE finished_id = %s",
3974 if ($result->numRows()) {
3975 $row =
$ilDB->fetchAssoc($result);
3976 return (
int) $row[
"tstamp"];
3998 if (preg_match(
"/<[^>]*?>/", $a_text)) {
4012 bool $close_material_tag =
true,
4013 bool $add_mobs =
true,
4014 ?array $attribs =
null 4018 "type" =>
"text/plain" 4020 if ($this->
isHTML($a_material)) {
4021 $attrs[
"type"] =
"text/xhtml";
4024 $a_xml_writer->
xmlElement(
"mattext", $attrs, $mattext);
4028 foreach ($mobs as $mob) {
4029 $mob_id =
"il_" .
IL_INST_ID .
"_mob_" . $mob;
4030 if (strpos($mattext, $mob_id) !==
false) {
4034 "uri" =>
"objects/" .
"il_" .
IL_INST_ID .
"_mob_" . $mob .
"/" . $mob_obj->getTitle(),
4035 "type" =>
"svy:html",
4036 "id" => $this->
getId()
4042 if ($close_material_tag) {
4057 if ($this->surveyCodeSecurity ===
false) {
4081 if (count($ids) === 0) {
4085 $result =
$ilDB->query(
"SELECT usr_id, login, lastname, firstname FROM usr_data WHERE " .
$ilDB->in(
'usr_id', $ids,
false,
'integer') .
" ORDER BY login");
4086 $result_array = array();
4087 while ($row =
$ilDB->fetchAssoc($result)) {
4088 $result_array[$row[
"usr_id"]] = $row;
4090 return $result_array;
4106 $this->mailnotification = $a_notification;
4122 $this->mailaddresses = $a_addresses;
4138 $this->mailparticipantdata = $a_data;
4149 $result =
$ilDB->queryF(
4150 "SELECT * FROM svy_times WHERE finished_fi = %s",
4155 while ($row =
$ilDB->fetchAssoc($result)) {
4156 if ($row[
'left_page'] > 0 && $row[
'entered_page'] > 0) {
4157 $total += $row[
'left_page'] - $row[
'entered_page'];
4166 if (count($this->questions) === count($a_order)) {
4167 $this->questions = array_flip($a_order);
4179 $this->pool_usage = $a_value;
4188 string $a_last_name,
4189 string $a_first_name,
4194 $a_email = trim($a_email);
4201 $data = array(
"email" => $a_email,
4202 "lastname" => trim($a_last_name),
4203 "firstname" => trim($a_first_name));
4206 "externaldata" => array(
"text", serialize(
$data)),
4207 "sent" => array(
"integer", $a_sent)
4213 array(
"anonymous_id" => array(
"integer", $a_id))
4226 if ($this->
getMode() === self::MODE_360) {
4234 $this->mode_360_self_eval = $a_value;
4244 $this->mode_360_self_appr = $a_value;
4254 $this->mode_360_self_rate = $a_value;
4264 $this->mode_360_results = $a_value;
4280 $ilDB = $DIC->database();
4281 $access = $DIC->access();
4286 "obj_id" => array(
"integer", $this->
getSurveyId()),
4287 "user_id" => array(
"integer", $a_user_id)
4289 $ilDB->insert(
"svy_360_appr", $fields);
4305 $ntf->setLangModules(array(
"svy",
"survey"));
4307 $ntf->setGotoLangId(
'url');
4312 $ntf->setIntroductionLangId(
"svy_user_added_appraisee_mail");
4313 $subject = str_replace(
"%1", $this->
getTitle(),
$lng->
txt(
"svy_user_added_appraisee"));
4322 $ntf->composeAndGetMessage($a_user_id,
null,
"read",
true),
4334 $ntf->setLangModules(array(
"svy",
"survey"));
4336 $ntf->setGotoLangId(
'url');
4341 $ntf->setIntroductionLangId(
"svy_user_added_appraisee_close_mail");
4342 $subject = str_replace(
"%1", $this->
getTitle(),
$lng->
txt(
"svy_user_added_appraisee"));
4351 $ntf->composeAndGetMessage($a_user_id,
null,
"read",
true),
4364 $ntf->setLangModules(array(
"svy",
"survey"));
4366 $ntf->setGotoLangId(
'url');
4371 $ntf->setIntroductionLangId(
"svy_user_added_rater_mail");
4372 $subject = str_replace(
"%1", $this->
getTitle(),
$lng->
txt(
"svy_user_added_rater"));
4382 $ntf->composeAndGetMessage($a_user_id,
null,
"read",
true),
4394 $set =
$ilDB->query(
"SELECT user_id" .
4395 " FROM svy_360_appr" .
4396 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4397 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer"));
4398 return (
bool)
$ilDB->numRows($set);
4409 $set =
$ilDB->query(
"SELECT has_closed" .
4410 " FROM svy_360_appr" .
4411 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4412 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer"));
4413 $row =
$ilDB->fetchAssoc($set);
4414 return (
bool) ($row[
"has_closed"] ??
false);
4425 $ilDB->manipulate(
"DELETE FROM svy_360_appr" .
4426 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4427 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer"));
4429 $set =
$ilDB->query(
"SELECT user_id" .
4430 " FROM svy_360_rater" .
4431 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4432 " AND appr_id = " .
$ilDB->quote($a_user_id,
"integer"));
4433 while ($row =
$ilDB->fetchAssoc($set)) {
4451 $set =
$ilDB->query(
"SELECT * FROM svy_360_appr" .
4452 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer"));
4453 while ($row =
$ilDB->fetchAssoc($set)) {
4456 $name[
"name"] = $name[
"lastname"] .
", " . $name[
"firstname"];
4457 $res[$row[
"user_id"]] = $name;
4461 foreach ($raters as $rater) {
4462 if ($rater[
"finished"]) {
4466 $res[$row[
"user_id"]][
"finished"] = $finished .
"/" . count($raters);
4467 $res[$row[
"user_id"]][
"closed"] = $row[
"has_closed"];
4477 int $a_appraisee_id,
4479 int $a_anonymous_id = 0
4483 $ilDB = $DIC->database();
4484 $access = $DIC->access();
4487 !$this->
isRater($a_appraisee_id, $a_user_id, $a_anonymous_id)) {
4489 "obj_id" => array(
"integer", $this->
getSurveyId()),
4490 "appr_id" => array(
"integer", $a_appraisee_id),
4491 "user_id" => array(
"integer", $a_user_id),
4492 "anonymous_id" => array(
"integer", $a_anonymous_id)
4494 $ilDB->insert(
"svy_360_rater", $fields);
4510 int $a_appraisee_id,
4512 int $a_anonymous_id = 0
4519 (!$a_appraisee_id || $a_appraisee_id === $a_user_id)) {
4525 $sql =
"SELECT user_id" .
4526 " FROM svy_360_rater" .
4528 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer") .
4529 " AND anonymous_id = " .
$ilDB->quote($a_anonymous_id,
"integer");
4530 if ($a_appraisee_id) {
4531 $sql .=
" AND appr_id = " .
$ilDB->quote($a_appraisee_id,
"integer");
4533 $set =
$ilDB->query($sql);
4534 return (
bool)
$ilDB->numRows($set);
4541 int $a_appraisee_id,
4543 int $a_anonymous_id = 0
4552 $ilDB->manipulate(
"DELETE FROM svy_360_rater" .
4553 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4554 " AND appr_id = " .
$ilDB->quote($a_appraisee_id,
"integer") .
4555 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer") .
4556 " AND anonymous_id = " .
$ilDB->quote($a_anonymous_id,
"integer"));
4567 $res = $anonymous_ids = array();
4569 $set =
$ilDB->query(
"SELECT * FROM svy_360_rater" .
4570 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4571 " AND appr_id = " .
$ilDB->quote($a_appraisee_id,
"integer"));
4572 while ($row =
$ilDB->fetchAssoc($set)) {
4573 if ($row[
"anonymous_id"]) {
4574 $res[
"a" . $row[
"anonymous_id"]] = array(
4575 "lastname" =>
"unknown code " . $row[
"anonymous_id"],
4576 "sent" => $row[
"mail_sent"],
4579 $anonymous_ids[] = $row[
"anonymous_id"];
4582 $name[
"name"] = $name[
"lastname"] .
", " . $name[
"firstname"];
4583 $name[
"user_id"] =
"u" . $name[
"user_id"];
4585 $name[
"sent"] = $row[
"mail_sent"];
4586 $name[
"finished"] = (bool) $this->
is360SurveyStarted($a_appraisee_id, (
int) $row[
"user_id"]);
4587 $res[
"u" . $row[
"user_id"]] = $name;
4591 if (count($anonymous_ids)) {
4593 foreach (
$data as $item) {
4594 if (isset(
$res[
"a" . $item[
"id"]])) {
4595 $res[
"a" . $item[
"id"]] = array(
4596 "user_id" =>
"a" . $item[
"id"],
4597 "lastname" => $item[
"last_name"],
4598 "firstname" => $item[
"first_name"],
4599 "name" => $item[
"last_name"] .
", " . $item[
"first_name"],
4601 "email" => $item[
"email"],
4602 "code" => $item[
"code"],
4603 "href" => $item[
"href"],
4604 "sent" =>
$res[
"a" . $item[
"id"]][
"sent"],
4620 ?
int $a_anonymous_id =
null 4626 $sql =
"SELECT appr_id FROM svy_360_rater" .
4630 $sql .=
" AND user_id = " .
$ilDB->quote($a_user_id,
"integer");
4632 $sql .=
" AND anonymous_id = " .
$ilDB->quote($a_anonymous_id,
"integer");
4635 $set =
$ilDB->query($sql);
4636 while ($row =
$ilDB->fetchAssoc($set)) {
4637 $res[] = (
int) $row[
"appr_id"];
4643 !in_array($a_user_id,
$res)) {
4644 $res[] = $a_user_id;
4657 $set =
$ilDB->query(
"SELECT anonymous_id FROM svy_anonymous" .
4658 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4659 " AND survey_key = " .
$ilDB->quote($a_code,
"text"));
4661 return $res[
"anonymous_id"] ??
null;
4670 ?
string $anonymous_code =
null 4674 $sql =
"SELECT * FROM svy_finished" .
4676 " AND appr_id = " .
$ilDB->quote($appr_id,
"integer");
4678 $sql .=
" AND user_fi = " .
$ilDB->quote($user_id,
"integer");
4680 $sql .=
" AND anonymous_id = " .
$ilDB->quote($anonymous_code,
"text");
4682 $result =
$ilDB->query($sql);
4683 if ($result->numRows() === 0) {
4686 $row =
$ilDB->fetchAssoc($result);
4687 return (
int) $row[
"state"];
4700 ?
string $a_code =
null 4709 if ($this->feature_config->usesAppraisees() &&
4713 $code = $this->data_manager->code(
"")
4715 $this->code_manager->add($code);
4716 $a_code = $this->code_manager->getByUserId(
$user_id);
4722 $this->
getAnonymize() === self::ANONYMIZE_FREEACCESS) {
4727 $code = $this->data_manager->code(
"")
4729 $code_id = $this->code_manager->add($code);
4730 $a_code = $this->code_manager->getByCodeId($code_id);
4739 $sql =
"SELECT * FROM svy_finished" .
4743 $sql .=
" AND (user_fi = " .
$ilDB->quote(
$user_id,
"integer") .
4744 " OR anonymous_id = " .
$ilDB->quote($a_code,
"text") .
")";
4748 $sql .=
" AND anonymous_id = " .
$ilDB->quote($a_code,
"text");
4750 $set =
$ilDB->query($sql);
4751 while ($row =
$ilDB->fetchAssoc($set)) {
4752 $res[$row[
"finished_id"]] = array(
"appr_id" => $row[
"appr_id"],
4753 "user_id" => $row[
"user_fi"],
4754 "code" => $row[
"anonymous_id"],
4755 "finished" => (
bool) $row[
"state"]);
4757 return array(
"code" => $a_code,
"runs" =>
$res);
4769 $set =
$ilDB->query(
"SELECT sf.anonymous_id FROM svy_finished sf" .
4770 " WHERE sf.survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4771 " AND sf.user_fi = " .
$ilDB->quote($a_user_id,
"integer"));
4772 $a_code =
$ilDB->fetchAssoc($set);
4773 return (
string) ($a_code[
"anonymous_id"] ??
"");
4787 $set =
$ilDB->query(
"SELECT user_fi FROM svy_finished" .
4788 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4789 " AND anonymous_id = " .
$ilDB->quote($a_code,
"text"));
4805 bool $a_exclude_appraisee =
false 4811 $set =
$ilDB->query(
"SELECT finished_id, user_fi FROM svy_finished" .
4812 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4813 " AND appr_id = " .
$ilDB->quote($a_appr_id,
"integer"));
4814 while ($row =
$ilDB->fetchAssoc($set)) {
4815 if ($a_exclude_appraisee && $row[
"user_fi"] == $a_appr_id) {
4818 $res[] = (
int) $row[
"finished_id"];
4834 $set =
$ilDB->query(
"SELECT finished_id, user_fi FROM svy_finished" .
4835 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4836 " AND appr_id = " .
$ilDB->quote($a_appr_id,
"integer") .
4837 " AND user_fi = " .
$ilDB->quote($a_rat_id,
"integer"));
4838 if ($row =
$ilDB->fetchAssoc($set)) {
4839 return (
int) $row[
"finished_id"];
4849 $this->mode_skill_service = $a_val;
4861 int $a_appraisee_id,
4863 int $a_anonymous_id,
4864 ?
int $a_tstamp =
null 4872 $ilDB->manipulate(
"UPDATE svy_360_rater" .
4873 " SET mail_sent = " .
$ilDB->quote($a_tstamp,
"integer") .
4875 " AND appr_id = " .
$ilDB->quote($a_appraisee_id,
"integer") .
4876 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer") .
4877 " AND anonymous_id = " .
$ilDB->quote($a_anonymous_id,
"integer"));
4888 $ilDB = $DIC->database();
4889 $user = $DIC->user();
4892 $ilDB->manipulate(
"UPDATE svy_360_appr" .
4893 " SET has_closed = " .
$ilDB->quote(time(),
"integer") .
4895 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer"));
4901 $sskill->writeAndAddAppraiseeSkills($a_user_id);
4905 if ($user->
getId() !== $a_user_id) {
4917 $ilDB->manipulate(
"UPDATE svy_360_appr" .
4918 " SET has_closed = " .
$ilDB->quote(
null,
"integer") .
4925 public static function validateExternalRaterCode(
4932 $anonym_repo = $DIC->survey()
4938 if (!$anonym_repo->isExternalRaterValidated($a_ref_id)) {
4939 $svy =
new self($a_ref_id);
4942 $domain_service = $DIC->survey()->internal()->domain();
4943 $code_manager = $domain_service->code($svy, 0);
4944 $feature_config = $domain_service->modeFeatureConfig($svy->getMode());
4945 $access_manager = $domain_service->access($a_ref_id, 0);
4947 if ($access_manager->canStartSurvey() &&
4948 $feature_config->usesAppraisees() &&
4949 $code_manager->exists($a_code)) {
4950 $anonymous_id = $svy->getAnonymousIdByCode($a_code);
4951 if ($anonymous_id) {
4952 if (count($svy->getAppraiseesToRate(
null, $anonymous_id))) {
4953 $anonym_repo->setExternalRaterValidation($a_ref_id,
true);
4958 $anonym_repo->setExternalRaterValidation($a_ref_id,
false);
4962 return $anonym_repo->isExternalRaterValidated($a_ref_id);
4977 $this->reminder_status = $a_value;
4987 $this->reminder_start = $a_value;
4997 $this->reminder_end = $a_value;
5007 $this->reminder_frequency = $a_value;
5017 $this->reminder_target = $a_value;
5027 if ($a_value ==
"") {
5030 $this->reminder_last_sent = $a_value;
5034 bool $selectDefault =
false 5036 if ($selectDefault) {
5037 $defaultTemplateId = 0;
5040 if ($defaultTemplateId > 0) {
5041 return $defaultTemplateId;
5050 $this->reminder_tmpl = $a_value;
5063 $this->tutor_ntf_status = $a_value;
5079 $this->tutor_ntf_recipients = $a_value;
5095 $this->tutor_ntf_target = $a_value;
5105 $this->tutor_res_status = $a_value;
5115 $this->tutor_res_recipients = $a_value;
5131 $set =
$ilDB->query(
"SELECT COUNT(*) numall FROM svy_finished" .
5132 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
5133 " AND state = " .
$ilDB->quote(1,
"integer") .
5134 " AND " .
$ilDB->in(
"user_fi", $user_ids,
"",
"integer"));
5135 $row =
$ilDB->fetchAssoc($set);
5138 if ((
int) $row[
"numall"] === count($user_ids)) {
5152 $access = $DIC->access();
5154 $rater_ids = array();
5156 $this->svy_log->debug(
"Handle appraisee " . $app[
'user_id']);
5163 in_array($this->
getReminderTarget(), array(self::NOTIFICATION_APPRAISEES, self::NOTIFICATION_APPRAISEES_AND_RATERS))) {
5164 $this->svy_log->debug(
"...1");
5167 $this->svy_log->debug(
"...2");
5168 if (!isset($rater_ids[$app[
'user_id']])) {
5169 $rater_ids[$app[
'user_id']] = array();
5171 if (!isset($app[
"user_id"], $rater_ids[$app[
'user_id']])) {
5172 $rater_ids[$app[
'user_id']][] = $app[
"user_id"];
5177 $this->svy_log->debug(
"Check raters.");
5183 array(self::NOTIFICATION_RATERS, self::NOTIFICATION_APPRAISEES_AND_RATERS),
5189 if ($rater[
"login"] !==
"") {
5192 if ($rater_id > 0) {
5194 if (!($rater[
"anonymous_id"] ??
false) && !($rater[
"finished"] ??
false)) {
5195 if (!isset($rater_ids[$rater_id])) {
5196 $rater_ids[$rater_id] = array();
5198 if (!in_array($app[
"user_id"], $rater_ids[$rater_id])) {
5199 $rater_ids[$rater_id][] = $app[
"user_id"];
5208 $this->svy_log->debug(
"Found raters:" . count($rater_ids));
5210 foreach ($rater_ids as
$id => $app) {
5219 array $a_appraisee_ids
5221 $this->svy_log->debug(
"Send mail to:" . $a_user_id);
5224 $ntf->setLangModules(array(
"svy",
"survey"));
5226 $ntf->setGotoLangId(
'url');
5231 $ntf->setIntroductionLangId(
"svy_user_added_rater_reminder_mail");
5232 $subject = str_replace(
"%1", $this->
getTitle(),
$lng->
txt(
"svy_user_added_rater"));
5234 foreach ($a_appraisee_ids as $appraisee_id) {
5245 $ntf->composeAndGetMessage($a_user_id,
null,
"read",
true),
5263 if ($a_use_invited) {
5264 $user_ids = $this->invitation_manager->getAllForSurvey($this->
getSurveyId());
5267 if ($parent_grp_ref_id) {
5269 $user_ids = $part->getMembers();
5272 if ($parent_crs_ref_id) {
5274 $user_ids = $part->getMembers();
5292 $ulng->loadLanguageModule(
'survey');
5294 $subject = sprintf($ulng->txt(
'survey_notification_tutor_subject'), $this->
getTitle());
5297 $message .= $ulng->txt(
'survey_notification_tutor_body') .
":\n\n";
5298 $message .= $ulng->txt(
'obj_svy') .
": " . $this->
getTitle() .
"\n";
5299 $message .=
"\n" . $ulng->txt(
'survey_notification_tutor_link') .
": " . $link;
5302 $mail_obj->appendInstallationSignature(
true);
5320 $now_with_format = date(
"YmdHis", $now);
5321 $today = date(
"Y-m-d");
5323 $this->svy_log->debug(
"Check status and dates.");
5343 if ($today < $start ||
5344 ($end && $today > $end)) {
5348 $this->svy_log->debug(
"Check access period.");
5353 ($now < $item_data[
"timing_start"] ||
5354 $now > $item_data[
"timing_end"])) {
5358 $this->svy_log->debug(
"Check frequency.");
5365 $missing_ids = array();
5366 if (!$this->feature_config->usesAppraisees()) {
5367 $this->svy_log->debug(
"Entering survey mode.");
5373 $finished_ids = array();
5374 $set =
$ilDB->query(
"SELECT user_fi FROM svy_finished" .
5375 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
5376 " AND state = " .
$ilDB->quote(1,
"text") .
5377 " AND " .
$ilDB->in(
"user_fi", $user_ids,
"",
"integer"));
5378 while ($row =
$ilDB->fetchAssoc($set)) {
5379 $finished_ids[] = $row[
"user_fi"];
5383 $missing_ids = array_diff($user_ids, $finished_ids);
5385 foreach ($missing_ids as $idx =>
$user_id) {
5387 if (!$ilAccess->checkAccessOfUser(
$user_id,
"read",
"", $this->getRefId(),
"svy", $this->
getId())) {
5388 unset($missing_ids[$idx]);
5393 $this->sentReminder($missing_ids);
5397 $this->svy_log->debug(
"Entering 360 mode.");
5406 return count($missing_ids);
5412 protected function sentReminder(
5413 array $a_recipient_ids
5423 $templateService = $DIC->mail()->textTemplates();
5426 $tmpl_params = array(
5432 $tmpl_params =
null;
5436 foreach ($a_recipient_ids as
$user_id) {
5438 $subject = $tmpl->getSubject();
5445 $ulng->loadLanguageModule(
'survey');
5447 $subject = sprintf($ulng->txt(
'survey_reminder_subject'), $this->
getTitle());
5450 $message .= $ulng->txt(
'survey_reminder_body') .
":\n\n";
5451 $message .= $ulng->txt(
'obj_svy') .
": " . $this->
getTitle() .
"\n";
5452 $message .=
"\n" . $ulng->txt(
'survey_reminder_link') .
": " . $link;
5456 $mail_obj->appendInstallationSignature(
true);
5469 ?
int $starting_time =
null 5471 $this->activation_starting_time = $starting_time;
5475 ?
int $ending_time =
null 5477 $this->activation_ending_time = $ending_time;
5492 $this->view_own_results = $a_value;
5502 $this->mail_own_results = $a_value;
5512 $this->mail_confirmation = $a_value;
5522 $this->anon_user_list = $a_value;
5534 $lng = $DIC->language();
5538 $surveySetting =
new ilSetting(
"survey");
5539 if (!$surveySetting->get(
"skipped_is_custom",
false)) {
5542 return $surveySetting->get(
"skipped_custom_value",
"");
5547 ?
int &$defaultTemplateId =
null 5553 $templateService = $DIC->mail()->textTemplates();
5555 $res[$tmpl->getTplId()] = $tmpl->getTitle();
5556 if (
null !== $defaultTemplateId && $tmpl->isDefault()) {
5557 $defaultTemplateId = $tmpl->getTplId();
5567 array $a_context_params
5573 $user = new \ilObjUser($a_user_id);
5575 $a_message = $this->placeholder_resolver->resolve(
$context, $a_message, $user, $a_context_params);
5585 $this->mode = $a_value;
5595 $this->mode_self_eval_results = $a_value;
5615 $q =
"SELECT obj_fi FROM svy_svy" .
5616 " WHERE tutor_res_cron IS NULL" .
5617 " AND tutor_res_status = " . $ilDB->quote(1,
"integer") .
5618 " AND enddate < " . $ilDB->quote(date(
"Ymd000000"),
"text");
5621 $q =
"SELECT obj_fi FROM svy_svy" .
5622 " WHERE tutor_res_status = " . $ilDB->quote(1,
"integer") .
5623 " AND enddate < " . $ilDB->quote(date(
"Ymd000000"),
"text");
5626 $set = $ilDB->query(
$q);
5630 while ($row = $ilDB->fetchAssoc($set)) {
5631 $res[] = (
int) $row[
"obj_fi"];
5641 $sum_score += call_user_func([$c,
"getMaxSumScore"], $this->
getSurveyId());
deleteUserSettings(int $id)
static _replaceMediaObjectImageSrc(string $a_text, int $a_direction=0, string $nic='')
Replaces image source from mob image urls with the mob id or replaces mob id with the correct image s...
setTutorResultsRecipients(array $a_value)
getTutorNotificationTarget()
Group that is checked for the "all participants have finished" mail Either a) all members of a parent...
removeQuestions(array $remove_questions, array $remove_questionblocks)
setIntroduction(string $introduction="")
importSurveyCode(string $a_anonymize_key, int $a_created, array $a_data)
setReminderEnd(?ilDate $a_value=null)
updateConjunctionForQuestions(array $questions, int $conjunction)
getSurveyQuestions(bool $with_answers=false)
Returns the survey questions and questionblocks in an array.
isAnonymizedParticipant(string $key)
setReminderFrequency(int $a_value)
getLastAccess(int $finished_id)
ILIAS Survey Code CodeManager $code_manager
checkConstraint(array $constraint_data, ?array $working_data)
Checks if a constraint is valid.
isSurveyFinishedByCode(string $a_code)
Get if survey is finished for a specific anonymous user code.
setMailParticipantData(string $a_data)
Set preceding text (incl.
ILIAS SurveyQuestionPool Export ImportManager $import_manager
string $reminder_last_sent
setEndDate(string $end_date="")
isAppraisee(int $a_user_id)
getMailParticipantData()
Preceding text (incl.
string $mailparticipantdata
manipulateF(string $query, array $types, array $values)
setSurveyId(int $survey_id)
addAppraisee(int $a_user_id)
saveUserAccessCode(int $user_id, string $access_code)
Saves a survey access code for a registered user to the database.
static getLogger(string $a_component_id)
Get component logger.
setShowQuestionTitles(bool $a_show)
static _hasDatasets(int $survey_id)
setObligatoryStates(array $obligatory_questions)
Sets the obligatory states for questions in a survey from the questions form.
Mode FeatureConfig $feature_config
const EVALUATION_ACCESS_OFF
txt(string $a_topic, string $a_default_lang_fallback_mod="")
gets the text for a given topic if the topic is not in the list, the topic itself with "-" will be re...
setAnonymize(int $a_anonymize)
set anonymize status
getSurveyPages()
Returns the survey pages in an array (a page contains one or more questions)
getUserLanguage()
Return language of user.
int $display_question_titles
getTextblock(int $question_id)
Skill management settings.
const EVALUATION_ACCESS_PARTICIPANTS
getSurveyCodesTableData(?array $ids=null, ?string $lang=null)
Fetches the data for the survey codes table.
static _lookupFullname(int $a_user_id)
getVariables(int $question_id)
Returns all variables (answer options/scale values) of a question.
setReminderTemplate(?int $a_value)
is360SurveyStarted(int $appr_id, int $user_id, ?string $anonymous_code=null)
getExistingQuestions()
Gets the question id's of the questions which are already in the survey.
if(! $DIC->user() ->getId()||!ilLTIConsumerAccess::hasCustomProviderCreationAccess()) $params
static getSurveySkippedValue()
string $author
A text representation of the authors name.
bool $activation_visibility
isComplete()
Check if survey is complete for use.
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
addConstraint(int $if_question_id, int $relation, float $value, int $conjunction)
Adds a constraint.
setEndDateAndTime(string $end_date, string $end_time)
setMailNotification(bool $a_notification)
Activate mail to tutors each time a participant finishes the survey.
int $activation_ending_time
duplicateQuestionForSurvey(int $question_id, bool $a_force=false)
Takes a question and creates a copy of the question for use in the survey.
isAccessibleWithoutCode()
setSelfEvaluationResults(int $a_value)
static _getQuestionblock(int $questionblock_id)
get question block properties
getAppraiseesToRate(?int $a_user_id, ?int $a_anonymous_id=null)
const NOTIFICATION_APPRAISEES
getQuestionblocksTable(array $arrFilter)
Retrieve data for question block browser.
const TIMINGS_DEACTIVATED
getUserAccessCode(int $user_id)
Returns a survey access code that was saved for a registered user.
static _lookupName(int $a_user_id)
lookup user name
getFinishedIdsForAppraiseeId(int $a_appr_id, bool $a_exclude_appraisee=false)
findCodeForUser(int $a_user_id)
static _getAvailableQuestionpools(bool $use_object_id=false, bool $could_be_offline=false, bool $showPath=false, string $permission="read")
Returns the available question pools for the active user.
moveQuestions(array $move_questions, int $target_index, int $insert_mode)
Move questions and/or questionblocks to another position.
static _lookupId($a_user_str)
loadWorkingData(int $question_id, int $active_id)
Gets the given answer data of a question in a run.
getFullname(int $a_max_strlen=0)
addConstraintToQuestion(int $to_question_id, int $constraint_id)
static getUserIdsByEmail(string $a_email)
static _getQuestionType(int $question_id)
Returns the question type of a question with a given id.
setMailConfirmation(bool $a_value)
getSurveyParticipants(?array $finished_ids=null, bool $force_non_anonymous=false, bool $include_invites=false)
set360Results(int $a_value)
deleteAppraisee(int $a_user_id)
setMailAddresses(string $a_addresses)
Set (Tutor) Recipients of "single participant has finished" mails.
static _addQuestionblock(string $title="", int $owner=0, bool $show_questiontext=true, bool $show_blocktitle=false, bool $compress_view=false)
deleteAllUserData(bool $reset_LP=true)
Deletes all user data of a survey.
getQuestionpoolTitles(bool $could_be_offline=false, bool $showPath=false)
Returns the available question pools for the active user.
setAuthor(string $author="")
int $survey_id
A unique positive numerical ID which identifies the survey.
isUnusedCode(string $a_code, int $a_user_id)
static _getQuestionTypeTranslations()
static makeDirParents(string $a_dir)
Create a new directory and all parent directories.
checkTutorNotification()
Check, if mail to tutors after all participants have finished the survey should be sent...
setActivationStartDate(?int $starting_time=null)
removeSelectedSurveyResults(array $finished_ids)
Deletes the user data of a given array of survey participants.
getReminderTemplate(bool $selectDefault=false)
setActivationVisibility(bool $a_value)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
canExportSurveyCode()
Checks if the survey code can be exported with the survey evaluation.
insertQuestionblock(int $questionblock_id)
sort()
description: > Example for rendering a Sort Glyph.
sendTutorNotification()
Send mail to tutors after all participants have finished the survey.
sentReminderPlaceholders(string $a_message, int $a_user_id, array $a_context_params)
getReminderMailTemplates(?int &$defaultTemplateId=null)
setTutorNotificationStatus(bool $a_value)
Activates mail being sent to tutors after all participants have finished the survey.
static _lookupObjId(int $ref_id)
prepareTextareaOutput(string $txt_output)
Prepares a string for a text area output in surveys.
importObject(array $file_info, int $svy_qpl_id)
unfoldQuestionblocks(array $questionblocks)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getTemplateContextById(string $a_id)
xmlEndTag(string $tag)
Writes an endtag.
setViewOwnResults(bool $a_value)
static is_email(string $a_email, ?ilMailRfc822AddressParserFactory $mailAddressParserFactory=null)
This preg-based function checks whether an e-mail address is formally valid.
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
setOutro(string $outro="")
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getQuestionblockQuestions(int $questionblock_id)
setPage(int $finished_id, int $page_id)
Sets the number of the active survey page.
setReminderTarget(int $a_value)
getNextPage(int $active_page_question_id, int $direction)
Get current, previous or next page.
getTutorNotificationRecipients()
Mail being sent to tutors after all participants have finished the survey?
getParticipantTextResults(int $active_id)
InternalDomainService $domain
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getQuestionsTable(array $arrFilter)
Retrieve data for question browser.
cloneTextblocks(array $mapping)
Clones the text blocks of survey questions.
static _getQuestionGUI(?string $questiontype, int $question_id=-1)
Creates a question gui representation.
addQuestion(int $question_id)
Adds a question to the survey (used in importer!)
deleteSurveyRecord()
Deletes the survey from the database.
getWorkingtimeForParticipant(int $finished_id)
setPoolUsage(bool $a_value)
getEvaluationByUser(array $questions, int $active_id)
Calculates the evaluation data for a given run.
ILIAS Survey InternalService $survey_service
checkForParentType(int $a_ref_id, string $a_type, bool $a_exclude_source_check=false)
Check for parent type e.g check if a folder (ref_id 3) is in a parent course obj => checkForParentTyp...
static _isComplete(int $question_id)
Checks whether the question is complete or not.
setMailOwnResults(bool $a_value)
getMailNotification()
Send mail to tutors each time a participant finishes the survey?
cloneMetaData(ilObject $target_obj)
Copy meta data.
static _instanciateQuestionEvaluation(int $question_id, ?array $a_finished_ids=null)
isSurveyCodeUsed(string $code)
sendAppraiseeCloseNotification(int $a_user_id)
static getNamePresentation( $a_user_id, bool $a_user_image=false, bool $a_profile_link=false, string $a_profile_back_link='', bool $a_force_first_lastname=false, bool $a_omit_login=false, bool $a_sortable=true, bool $a_return_data_array=false, $a_ctrl_path='ilpublicuserprofilegui')
Default behaviour is:
static _lookupTitle(int $obj_id)
bool $calculate_sum_score
getPrecondition(int $constraint_id)
Returns a precondition with a given id.
updateCode(int $a_id, string $a_email, string $a_last_name, string $a_first_name, int $a_sent)
isQuestionInSurvey(int $a_question_fi)
string $evaluation_access
sendAppraiseeNotification(int $a_user_id)
set360RaterSent(int $a_appraisee_id, int $a_user_id, int $a_anonymous_id, ?int $a_tstamp=null)
const ANONYMIZE_FREEACCESS
static _getLanguageOfUser(int $a_usr_id)
Get language object of user.
static _getConstraints(int $survey_id)
const NOTIFICATION_PARENT_COURSE
setCalculateSumScore(bool $a_val)
static _instanciateQuestion(int $question_id)
Creates an instance of a question with a given question id.
getConstraints(int $question_id)
Returns the constraints to a given question or questionblock.
const RESULTS_SELF_EVAL_OWN
setStartDateAndTime(string $start_date, string $start_time)
const NOTIFICATION_APPRAISEES_AND_RATERS
updateOrder(array $a_order)
getQuestionblockQuestionIds(int $questionblock_id)
getSurveyCodesForExport(?array $a_codes=null, ?array $a_ids=null)
Return a list of survey codes for file export, note: user_key needs to be null to export a record...
static delDir(string $a_dir, bool $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
static _getStaticLink(?int $a_ref_id, string $a_type='', bool $a_fallback_goto=true, string $append="")
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
const QUESTIONTITLES_VISIBLE
getActivationVisibility()
getImportDirectory()
get import directory of survey
const QUESTIONTITLES_HIDDEN
modifyQuestionblock(int $questionblock_id, string $title, bool $show_questiontext, bool $show_blocktitle, bool $compress_view=false)
set360SelfRaters(bool $a_value)
setStartDate(string $start_date="")
setTutorNotificationRecipients(array $a_value)
Set tutor recipients for "all participants have finished" mail.
static _getUserData(array $a_internalids)
return user data for given user ids
getSelfEvaluationResults()
static _includeClass(string $question_type, int $gui=0)
Include the php class file for a given question type.
updateConstraint(int $precondition_id, int $if_question_id, int $relation, float $value, int $conjunction)
deleteSurveyCode(string $survey_code)
getUserSettings(int $usr_id, string $key)
toXML()
Returns a QTI xml representation of the survey.
saveAuthorToMetadata(string $a_author="")
Saves an authors name into the lifecycle metadata if no lifecycle metadata exists This will only be c...
static _getOriginalId(int $question_id, bool $a_return_question_id_if_no_original=true)
Returns the original id of a question.
getAnonymousIdByCode(string $a_code)
static _getUsedHTMLTagsAsString(string $a_module="")
Returns a string of all allowed HTML tags for text editing.
isHTML(string $a_text)
Checks if a given string contains HTML or not.
Participants InvitationsManager $invitation_manager
static moveUploadedFile(string $a_file, string $a_name, string $a_target, bool $a_raise_errors=true, string $a_mode="move_uploaded")
move uploaded file
static _getObjectsByOperations( $a_obj_type, string $a_operation, int $a_usr_id=0, int $limit=0)
Get all objects of a specific type and check access This function is not recursive, instead it parses the serialized rbac_pa entries.
getNotificationTargetUserIds(bool $a_use_invited)
These users must finish the survey to trigger the tutor notification "all users finished the survey" ...
setOfflineStatus(bool $status)
setTutorResultsStatus(bool $a_value)
static getDataDir()
get data directory (outside webspace)
const NOTIFICATION_INVITED_USERS
set360SelfEvaluation(bool $a_value)
getActiveID(int $user_id, string $anonymize_id, int $appr_id)
Get run id.
Class ilMailTemplatePlaceholderResolver.
getQuestionGUI(string $questiontype, int $question_id)
getAvailableQuestionpools(bool $use_obj_id=false, bool $could_be_offline=false, bool $showPath=false, string $permission="read")
Returns the available question pools for the active user.
deleteConstraints(int $question_id)
Deletes the constraints for a question.
createImportDirectory()
creates data directory for import files (data_dir/svy_data/svy_<id>/import)
setReminderLastSent(?string $a_value)
createExportDirectory()
creates data directory for export files (data_dir/svy_data/svy_<id>/export)
isRater(int $a_appraisee_id, int $a_user_id, int $a_anonymous_id=0)
set360SelfAppraisee(bool $a_value)
ilMailTemplatePlaceholderResolver $placeholder_resolver
const EVALUATION_ACCESS_ALL
getUserData(array $ids)
Returns a data of all users specified by id list.
isSurveyCodeUnique(string $code)
saveCompletionStatus()
Saves the completion status of the survey.
removeQuestionFromBlock(int $question_id, int $questionblock_id)
getSurveyFinishedIds()
Get run ids.
static getSurveysWithTutorResults()
getExternalCodeRecipients(bool $a_check_finished=false)
getAllRelations(bool $short_as_key=false)
removeConstraintsConcerningQuestion(int $question_id)
Remove constraints concerning a question with a given question_id.
deleteRater(int $a_appraisee_id, int $a_user_id, int $a_anonymous_id=0)
static getItem(int $ref_id)
getQuestionType(int $question_id)
setTutorNotificationTarget(int $a_value)
int $activation_starting_time
isQuestionInAnyBlock(int $a_question_fi)
isAppraiseeClosed(int $a_user_id)
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
__construct(Container $dic, ilPlugin $plugin)
getTutorResultsRecipients()
setActivationLimited(bool $a_value)
addRater(int $a_appraisee_id, int $a_user_id, int $a_anonymous_id=0)
array $tutor_ntf_recipients
const RESULTS_SELF_EVAL_NONE
setEvaluationAccess(string $evaluation_access=self::EVALUATION_ACCESS_OFF)
int $mode_self_eval_results
addQuestionToBlock(int $question_id, int $questionblock_id)
xmlStartTag(string $tag, ?array $attrs=null, bool $empty=false, bool $encode=true, bool $escape=true)
Writes a starttag.
getUserSpecificResults(array $finished_ids)
Calculates the evaluation data for the user specific results.
deleteWorkingData(int $question_id, int $active_id)
Deletes the working data of a question in the database.
setAnonymousUserList(bool $a_value)
static _getQuestionClasses()
sendRaterNotification(int $a_user_id, int $a_appraisee_id)
send360ReminderToUser(int $a_user_id, array $a_appraisee_ids)
static _getInstance(int $a_copy_id)
xmlElement(string $tag, $attrs=null, $data=null, $encode=true, $escape=true)
Writes a basic element (no children, just textual content)
insertQuestion(int $question_id)
Inserts a question in the survey and saves the relation to the database.
getUserDataFromActiveId(int $active_id, bool $force_non_anonymous=false)
Returns run information.
closeAppraisee(int $a_user_id)
ilPluginAdmin $plugin_admin
ILIAS Survey InternalDataService $data_manager
setSkillService(bool $a_val)
debug(string $message, array $context=[])
getTutorNotificationStatus()
__construct(int $a_id=0, bool $a_call_by_reference=true)
const NOTIFICATION_RATERS
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
addMaterialTag(ilXmlWriter $a_xml_writer, string $a_material, bool $close_material_tag=true, bool $add_mobs=true, ?array $attribs=null)
Creates an XML material tag from a plain text or xhtml text.
getRatersData(int $a_appraisee_id)
sendNotificationMail(int $a_user_id, string $a_anonymize_id, int $a_appr_id=0)
These mails are sent to tutors for each single participant that finishes a survey.
Basic class for all survey question types The SurveyQuestionGUI class defines and encapsulates basic ...
sendCodes(int $not_sent, string $subject, string $message, string $lang)
setReminderStatus(bool $a_value)
static getInstance(int $obj_id)
static _lookupEmail(int $a_user_id)
saveHeading(string $heading, int $insertbefore)
Class ilObjectActivation.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getUserSurveyExecutionStatus(?string $a_code=null)
Get current user execution status.
getFinishedIdForAppraiseeIdAndRaterId(int $a_appr_id, int $a_rat_id)
Get finished id for an appraisee and a rater.
deleteConstraint(int $constraint_id)
Deletes a single constraint.
createQuestionblock(string $title, bool $show_questiontext, bool $show_blocktitle, array $questions, bool $compress_view=false)
const RESULTS_SELF_EVAL_ALL
checkAccessOfUser(int $a_user_id, string $a_permission, string $a_cmd, int $a_ref_id, string $a_type="", ?int $a_obj_id=null, ?int $a_tree_id=null)
check access for an object (provide $a_type and $a_obj_id if available for better performance) ...
saveUserSettings(int $usr_id, string $key, string $title, string $value)
removeQuestion(int $question_id)
finishSurvey(int $finished_id, int $appr_id=0)
Finishes the survey creating an entry in the database.
sent360Reminders()
Send 360 reminders.
getMailAddresses()
(Tutor) Recipients of "single participant has finished" mails
static makeDir(string $a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
array $tutor_res_recipients
setReminderStart(?ilDate $a_value=null)
getLastActivePage(int $active_id)
Returns the question id of the last active page a user visited in a survey.
locateImportFiles(string $a_dir)
Locates the import directory and the xml file in a directory with an unzipped import file...
static sortArray(array $array, string $a_array_sortby_key, string $a_array_sortorder="asc", bool $a_numeric=false, bool $a_keep_keys=false)
setActivationEndDate(?int $ending_time=null)
static _lookupLogin(int $a_user_id)