aboutsummaryrefslogtreecommitdiff
path: root/db/migrations/5.3.30_repair_consultation_events.php
blob: 7a8f7765b5074d84313ae54c4a4fe728da53b44e (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
<?php
/**
 * @see https://gitlab.studip.de/studip/studip/-/issues/5475
 */
final class RepairConsultationEvents extends Migration
{
    use DatabaseMigrationTrait;

    protected function up()
    {
        $block_ids = $this->getBlockIds();

        if (!$block_ids) {
            return;
        }

        $event_table = 'calendar_dates';
        $event_id_column = 'id';

        if (!$this->tableExists($event_table)) {
            $event_table = 'event_data';
            $event_id_column = 'event_id';
        }

        $query = "DELETE `consultation_events`, `{$event_table}`
                  FROM `consultation_events`
                  LEFT JOIN `{$event_table}` ON `{$event_table}`.`{$event_id_column}` = `consultation_events`.`event_id`
                  JOIN `consultation_slots` AS s USING (`slot_id`)
                  WHERE `block_id` IN (?)
                    AND NOT EXISTS (
                      SELECT 1
                      FROM `consultation_responsibilities`
                      WHERE `block_id` = s.`block_id`
                        AND `range_type` = 'user'
                        AND `range_id` = `consultation_events`.`user_id`
                    ) AND NOT EXISTS (
                      SELECT 1
                      FROM `consultation_responsibilities`
                      JOIN `statusgruppe_user` ON `range_id` = `statusgruppe_id`
                      WHERE `block_id` = s.`block_id`
                        AND `range_type` = 'statusgroup'
                        AND `statusgruppe_user`.`user_id` = `consultation_events`.`user_id`
                    ) AND NOT EXISTS (
                      SELECT 1
                      FROM `consultation_responsibilities`
                      JOIN `user_inst` ON `range_id` = `Institut_id`
                      WHERE `block_id` = s.`block_id`
                        AND `range_type` = 'institute'
                        AND `user_inst`.`user_id` = `consultation_events`.`user_id`
                    )";
        DBManager::get()->execute($query, [$block_ids]);
    }

    private function getBlockIds(): array
    {
        // Responsibilities: Users
        $query = "SELECT `block_id`
                  FROM `consultation_responsibilities` AS r
                  JOIN `consultation_slots` AS s USING (`block_id`)
                  JOIN `consultation_events` AS e USING (`slot_id`)
                  WHERE r.`range_type` = 'user'
                  GROUP BY `block_id`
                  HAVING COUNT(DISTINCT r.`range_id`) < COUNT(DISTINCT e.`user_id`)";
        $block_ids0 = DBManager::get()->fetchFirst($query);

        // Responsibilities: Statusgroups
        $query = "SELECT `block_id`
                  FROM `consultation_responsibilities` AS r
                  JOIN `statusgruppe_user` AS su ON r.`range_id` = su.`statusgruppe_id`
                  JOIN `consultation_slots` AS s USING (`block_id`)
                  JOIN `consultation_events` AS e USING (`slot_id`)
                  WHERE r.`range_type` = 'statusgroup'
                  GROUP BY `block_id`
                  HAVING COUNT(DISTINCT su.`user_id`) < COUNT(DISTINCT e.`user_id`)";
        $block_ids1 = DBManager::get()->fetchFirst($query);

        // Responsibilities: Institutes
        $query = "SELECT `block_id`
                  FROM `consultation_responsibilities` AS r
                  JOIN `user_inst` AS ui ON r.`range_id` = ui.`Institut_id`
                  JOIN `consultation_slots` AS s USING (`block_id`)
                  JOIN `consultation_events` AS e USING (`slot_id`)
                  WHERE r.`range_type` = 'statusgroup'
                    AND ui.`inst_perms` IN ('tutor', 'dozent')
                  GROUP BY `block_id`
                  HAVING COUNT(DISTINCT ui.`user_id`) < COUNT(DISTINCT e.`user_id`)";
        $block_ids2 = DBManager::get()->fetchFirst($query);

        return array_unique(array_merge(
            $block_ids0,
            $block_ids1,
            $block_ids2
        ));
    }
}