From f7f87f147455a790d93993a2721b75de40ff4b63 Mon Sep 17 00:00:00 2001 From: Finn Schneider Date: Fri, 13 Mar 2026 17:19:30 +0100 Subject: resultsVisible() eval --- lib/models/Questionnaire.php | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/lib/models/Questionnaire.php b/lib/models/Questionnaire.php index a3609c2..b6e462b 100644 --- a/lib/models/Questionnaire.php +++ b/lib/models/Questionnaire.php @@ -265,9 +265,49 @@ class Questionnaire extends SimpleORMap implements PrivacyObject if (!$this->isViewable()) { return false; } - return $this['resultvisibility'] === "always" + + if ($this->eval_assignment) { + $user = User::findCurrent(); + if ($user->hasPermissionLevel('root') + || $user->hasRole('Zentraler Evaluationsadmin') + || $user->hasRole('Einrichtungsbezogener Evaluationsadmin', Course::findCurrent()->institut_id)) { + return true; + } + + $eval_profile = QuestionnaireEvalCentralProfile::find($this->eval_assignment->semester_id); + + if ($eval_profile && $eval_profile->result_visible_for) { + $eval_visible = $user->hasPermissionLevel($eval_profile->result_visible_for, Context::get()); + } else { + return false; + } + + if ($eval_profile->anonymous) { + $statement = DBManager::get()->prepare( + "SELECT DISTINCT count(`user_id`) AS 'amount' FROM `questionnaire_anonymous_answers` + WHERE `questionnaire_id` = :questionnaire_id"); + } else { + $statement = DBManager::get()->prepare( + "SELECT DISTINCT count(`user_id`) AS 'amount' FROM `questionnaire_answers` + INNER JOIN `questionnaire_questions` + ON `questionnaire_questions`.`question_id` = `questionnaire_answers`.`question_id` + WHERE `questionnaire_id` = :questionnaire_id"); + } + $statement->execute([ + 'questionnaire_id' => $this->getId() + ]); + $response_amount = $statement->fetch()['amount']; + + $eval_visible = $eval_visible && ($response_amount >= $eval_profile->minimum_responses); + return $eval_visible + && ($eval_profile->resultvisibility === 'always' + || $eval_profile->resultvisibility === 'afterending' && $this->isStopped() + || $eval_profile->resultvisibility === 'afterparticipation' && $this->isAnswered()); + } + + return $this['resultvisibility'] === 'always' || $this->isEditable() - || ($this['resultvisibility'] === "afterending" && $this->isStopped()) + || ($this['resultvisibility'] === 'afterending' && $this->isStopped()) || ($this['resultvisibility'] === 'afterparticipation' && $this->isAnswered()); } -- cgit v1.0