aboutsummaryrefslogtreecommitdiff
path: root/db/migrations/5.3.14_revamp_questionnaires.php
blob: 0fc86394d49748d1e49b0b48b0749e3091c7ea0c (plain)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php


class RevampQuestionnaires extends Migration
{
    public function description()
    {
        return 'Better questionnaires and no old evaluations for Stud.IP';
    }


    public function up()
    {
        $query = 'INSERT INTO `config` (`field`, `value`, `type`, `range`, `section`, `mkdate`, `chdate`, `description`)
                  VALUES (:name, :value, :type, :range, :section, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), :description)';
        $statement = DBManager::get()->prepare($query);
        $statement->execute([
            'name'        => 'EVAL_ENABLE',
            'description' => 'Sollen die alten Evaluationen weiterhin eingeschaltet bleiben? Achtung, die alten Evaluationen werden in einem zukünftigen Stud.IP-Release entfernt.',
            'range'       => 'global',
            'type'        => 'boolean',
            'value'       => '1',
            'section'     => 'evaluation'
        ]);

        //Umbau der Fragebögen, sodass sie nicht mehr die etask-Tabellen verwenden:
        DBManager::get()->exec("
            ALTER TABLE `questionnaire_questions`
            ADD COLUMN `questiontype` varchar(64) NOT NULL DEFAULT '' AFTER `questionnaire_id`,
            ADD COLUMN `internal_name` varchar(128) DEFAULT NULL AFTER `questiontype`,
            ADD COLUMN `questiondata` text NOT NULL DEFAULT '' AFTER `internal_name`
        ");

        $allquestions = DBManager::get()->prepare("
            SELECT * FROM `questionnaire_questions`
        ");
        $allquestions->execute();
        $updatequestion = DBManager::get()->prepare("
            UPDATE `questionnaire_questions`
            SET `questiondata` = :questiondata,
                `questiontype` = :questiontype
            WHERE `question_id` = :question_id
        ");
        $get_etask = DBManager::get()->prepare("
            SELECT * FROM `etask_tasks` WHERE `id` = ?
        ");

        while ($question = $allquestions->fetch(PDO::FETCH_ASSOC)) {
            $get_etask->execute([$question['etask_task_id']]);
            $etask = $get_etask->fetch(PDO::FETCH_ASSOC);

            $task = json_decode($etask['task'], true);
            $options = array_map(function ($answer) { return $answer['text']; }, (array) $task['answers']);
            $scores = array_map(function ($answer) { return $answer['score']; }, (array) $task['answers']);

            if ($etask['type'] === 'multiple-choice') {
                //Vote or Test
                $questiontype = array_sum($scores) > 0 ? 'Test' : 'Vote';
                $questiondata = [
                    'description' => $etask['description'],
                    'multiplechoice' => $task['type'] === 'multiple' ? '1' : '0',
                    'options' => $options
                ];
            } else {
                //Most of the times Freetext
                $questiontype = ucfirst($etask['type']);
                $questiondata = $task;
                $questiondata['description'] = $etask['description'];
            }
            $questiondata = array_merge($questiondata, (array) json_decode($etask['options'], true));

            $updatequestion->execute([
                'question_id' => $question['question_id'],
                'questiondata' => json_encode($questiondata),
                'questiontype' => $questiontype
            ]);
        }

        DBManager::get()->exec("
            DELETE FROM `etask_tasks`
            WHERE `id` IN (SELECT `etask_task_id` FROM `questionnaire_questions`)
        ");

        DBManager::get()->exec("
            ALTER TABLE `questionnaire_questions`
            DROP COLUMN `etask_task_id`
        ");

        DBManager::get()->exec("
            ALTER TABLE `questionnaires`
            CHANGE COLUMN `resultvisibility` `resultvisibility` enum('always','never','afterending', 'afterparticipation') CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT 'always'
        ");

        //Tests aus den Fragebögen löschen:
        DBManager::get()->exec("
            DELETE FROM `questionnaire_questions`
            WHERE `questiontype` = 'Test'
        ");
        //Dann noch die jetzt vielleicht leeren Fragebögen abräumen:
        DBManager::get()->exec("
            DELETE FROM `questionnaires`
            WHERE `questionnaire_id` NOT IN (SELECT `questionnaire_id` FROM `questionnaire_questions`)
        ");
        DBManager::get()->exec("
            DELETE FROM `questionnaire_anonymous_answers`
            WHERE `questionnaire_id` NOT IN (SELECT `questionnaire_id` FROM `questionnaires`)
        ");
        DBManager::get()->exec("
            DELETE FROM `questionnaire_assignments`
            WHERE `questionnaire_id` NOT IN (SELECT `questionnaire_id` FROM `questionnaires`)
        ");
        DBManager::get()->exec("
            DELETE FROM `questionnaire_answers`
            WHERE `question_id` NOT IN (SELECT `question_id` FROM questionnaire_questions)
        ");

    }


    public function down()
    {

    }
}