aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFinn Schneider <schneider@data-quest.de>2026-03-13 17:19:30 +0100
committerFinn Schneider <schneider@data-quest.de>2026-03-13 17:25:01 +0000
commitf7f87f147455a790d93993a2721b75de40ff4b63 (patch)
treef34d206588881da3b289bda2c417b862c31c24cd
parent7ae0067047d49c67678050f690a926ef998952e4 (diff)
resultsVisible() eval
-rw-r--r--lib/models/Questionnaire.php44
1 files 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());
}