aboutsummaryrefslogtreecommitdiff
path: root/lib/classes/UserFilterFields/MassMail/MassMailSelfAssignedInstituteFilter.php
blob: 8b732d202587d23703e36f3eeae76777d537d9e4 (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
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php

namespace UserFilterFields\MassMail;

use UserFilterField;
use MassMail\MassMailPermission;
use User;
use DBManager;

class MassMailSelfAssignedInstituteFilter extends UserFilterField
{
    public $valuesDbTable = 'Institute';
    public $valuesDbIdField = 'Institut_id';
    public $valuesDbNameField = 'Name';
    public $userDataDbTable = 'user_inst';
    public $userDataDbField = 'Institut_id';

    public static $sortOrder = 9;

    public static function getTargets()
    {
        return ['students'];
    }

    public function __construct($fieldId = '')
    {
        parent::__construct($fieldId);

        $this->validCompareOperators = [
            '='   => _('ist'),
            '!=' => _('ist nicht'),
        ];

        if (MassMailPermission::has(User::findCurrent()->id, true)) {
            // Get all available institutes from database, grouped by faculty.
            $faculties = DBManager::get()->fetchAll(
                "SELECT `Institut_id`, `Name` FROM `Institute`
                         WHERE `fakultaets_id` = `Institut_id` ORDER BY `Name`"
            );
            foreach ($faculties as $f) {
                $this->validValues[$f[$this->valuesDbIdField]] = $f[$this->valuesDbNameField];
                $this->validValues[$f[$this->valuesDbIdField].'_children'] =
                    sprintf(_('%s und Untereinrichtungen'),
                        $f[$this->valuesDbNameField]);
                $institutes = DBManager::get()->fetchAll(
                    "SELECT `Institut_id`, `Name` FROM `Institute`
                             WHERE `fakultaets_id` = :fak AND `Institut_id` != :fak ORDER BY `Name`",
                    ['fak' => $f[$this->valuesDbIdField]]
                );
                foreach ($institutes as $i) {
                    $this->validValues[$i[$this->valuesDbIdField]] = $i[$this->valuesDbNameField];
                }
            }
        } else if (MassMailPermission::has(User::findCurrent()->id)) {
            $this->validValues = [];

            $allowed = MassMailPermission::getForUser(User::findCurrent());

            // Get all available institutes from database, grouped by faculty.
            $faculties = DBManager::get()->fetchAll(
                "SELECT `Institut_id`, `Name` FROM `Institute`
                         WHERE `fakultaets_id` = `Institut_id` AND `Institut_id` IN (:allowed)
                         ORDER BY `Name`",
                ['allowed' => $allowed['allowed_institutes']]
            );
            foreach ($faculties as $f) {
                $this->validValues[$f[$this->valuesDbIdField]] = $f[$this->valuesDbNameField];
                $this->validValues[$f[$this->valuesDbIdField] . '_children'] =
                    sprintf(_('%s und Untereinrichtungen'),
                        $f[$this->valuesDbNameField]);
                $institutes = DBManager::get()->fetchAll(
                    "SELECT `Institut_id`, `Name` FROM `Institute`
                             WHERE `fakultaets_id` = :fak AND `Institut_id` != :fak AND `Institut_id` IN (:allowed)
                             ORDER BY `Name`",
                    ['fak' => $f[$this->valuesDbIdField], 'allowed' => $allowed['allowed_institutes']]
                );
                foreach ($institutes as $i) {
                    $this->validValues[$i[$this->valuesDbIdField]] = $i[$this->valuesDbNameField];
                }
            }

            $institutes = DBManager::get()->fetchAll(
                "SELECT `Institut_id`, `Name`
                 FROM `Institute`
                 WHERE `Institut_id` IN (:allowed)
                   AND `Institut_id` NOT IN (:processed)
                 ORDER BY `Name`",
                [
                    'allowed' => $allowed['allowed_institutes'],
                    'processed' => count($this->validValues) > 0 ? array_keys($this->validValues) : ''
                ]
            );
            foreach ($institutes as $i) {
                $this->validValues[$i[$this->valuesDbIdField]] = $i[$this->valuesDbNameField];
            }
        }
    }

    public function getName()
    {
        return _('Selbst zugeordnete Einrichtung');
    }

    /**
     * Gets all users belonging to a statusgroup with the given name. This is not done via statusgroup_id
     * in ordner to enable several institutes as filter.
     *
     * @return array All users that are affected by the current condition
     * field.
     */
    public function getUsers($restrictions = [])
    {
        $users = [];
        if (MassMailPermission::has(User::findCurrent()->id, true)) {
            $users = DBManager::get()->fetchFirst("SELECT DISTINCT `user_id` " .
                "FROM `" . $this->userDataDbTable . "` " .
                "WHERE `" . $this->userDataDbField . "`" . $this->compareOperator .
                "? AND `inst_perms` = 'user'", [$this->value]);
        } else if (MassMailPermission::has(User::findCurrent()->id)) {

            $allowed = MassMailPermission::getForUser(User::findCurrent());

            $sql = "SELECT DISTINCT `" . $this->userDataDbTable . "`.`user_id` FROM `" . $this->userDataDbTable
                . "`JOIN `user_inst` USING (`user_id`) ";
            $where = "WHERE `" . $this->userDataDbTable . "`.`" . $this->userDataDbField . "`" . $this->compareOperator
                . ":value AND `user_inst`.`Institut_id` IN (:institutes) AND `user_inst`.`inst_perms` = 'user'";
            $parameters = [
                'value' => $this->value,
                'institutes' => $allowed['institutes']->pluck('id')
            ];

            $users = DBManager::get()->fetchFirst($sql.$where, $parameters);
        }

        return $users;
    }
}