1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
<?php
namespace Studip\Processes;
class Questionnaires implements ProcessProvider
{
/**
* Retrieves all active questionnaires accessible to the given user.
*
* This method fetches questionnaires that:
* - Are currently active (within start and stop dates)
* - Are visible
* - Are assigned to courses, institutes, or status groups where the user is a member
* - Are either unanswered or still editable by the user
*
* For each qualifying questionnaire, it creates a RunningProcess object containing:
* - Context information (course/institute/status group)
* - Questionnaire details (title, URL)
* - Time constraints (start and end dates)
* - Response statistics (number of answers / total possible respondents)
*
* @return array : RunningProcess[]
*/
public static function getProcesses(\User $user) : array
{
$statement = \DBManager::get()->prepare("
SELECT `questionnaires`.*
FROM `questionnaires`
INNER JOIN `questionnaire_assignments` USING (`questionnaire_id`)
LEFT JOIN `seminar_user` ON (`seminar_user`.`Seminar_id` = `questionnaire_assignments`.`range_id` AND `questionnaire_assignments`.`range_type` = 'course')
LEFT JOIN `user_inst` ON (`user_inst`.`Institut_id` = `questionnaire_assignments`.`range_id` AND `questionnaire_assignments`.`range_type` = 'institute')
LEFT JOIN `statusgruppe_user` ON (`statusgruppe_user`.`statusgruppe_id` = `questionnaire_assignments`.`range_id` AND `questionnaire_assignments`.`range_type` = 'statusgruppe')
LEFT JOIN `statusgruppen` ON (`statusgruppen`.`statusgruppe_id` = `questionnaire_assignments`.`range_id` AND `questionnaire_assignments`.`range_type` = 'statusgruppe')
LEFT JOIN `seminar_user` AS `teacher` ON (`teacher`.`Seminar_id` = `statusgruppen`.`range_id` AND `questionnaire_assignments`.`range_type` = 'statusgruppe' AND `teacher`.`status` IN ('tutor', 'dozent'))
WHERE `questionnaires`.`startdate` <= UNIX_TIMESTAMP()
AND `questionnaires`.`stopdate` >= UNIX_TIMESTAMP()
AND `questionnaires`.`visible` = 1
AND (`seminar_user`.`user_id` = :user_id OR `teacher`.`user_id` = :user_id OR `user_inst`.`user_id` = :user_id OR `statusgruppe_user`.`user_id` = :user_id)
GROUP BY `questionnaires`.`questionnaire_id`
");
$statement->execute(['user_id' => $user->id]);
$questionnaires = $statement->fetchAll(\PDO::FETCH_ASSOC);
$result = [];
foreach ($questionnaires as $questionnaire_data) {
$questionnaire = \Questionnaire::buildExisting($questionnaire_data);
if ($questionnaire->isViewable() && (!$questionnaire->isAnswered() || $questionnaire->isEditable())) {
foreach ($questionnaire->assignments as $assignment) {
if ($questionnaire->isAnswerable() || $questionnaire->isEditable()) {
$answers = $questionnaire->countAnswers();
if ($assignment->range_type === 'course') {
$allPersons = \CourseMember::countBySQL("`Seminar_id` = ?", [$assignment->range_id]);
$range_id = $assignment->range_id;
} elseif($assignment->range_type === 'institute') {
$allPersons = \InstituteMember::countBySQL("`Institut_id` = ?", [$assignment->range_id]);
$range_id = $assignment->range_id;
} elseif($assignment->range_type === 'statusgruppe') {
$allPersons = \StatusgruppeUser::countBySQL("`statusgruppe_id` = ?", [$assignment->range_id]);
$statusgroup = \Statusgruppen::find($assignment->range_id);
if ($statusgroup) {
$range_id = $statusgroup->range_id;
}
}
$result[] = new \RunningProcess(
$range_id,
\Icon::create("vote"),
_('Fragebogen'),
$questionnaire->isEditable()
? \URLHelper::getURL('dispatch.php/questionnaire/evaluate/'.$questionnaire->id)
: \URLHelper::getURL('dispatch.php/questionnaire/answer/'.$questionnaire->id),
$questionnaire->startdate,
$questionnaire->stopdate,
true,
$questionnaire->title,
$questionnaire->isEditable() ? $answers.'/'.$allPersons : '',
$questionnaire->isEditable() ? sprintf(_('Rücklaufquote: %s'), $answers.'/'.$allPersons) : ''
);
}
}
}
}
return $result;
}
}
|