aboutsummaryrefslogtreecommitdiff
path: root/lib/classes/ConsultationMailer.php
blob: cf5af537fd9b60f6f06b84f1272f7df8ee1ed4b2 (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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<?php
/**
 * @author  Jan-Hendrik Willms <tleilax+studip@gmail.com>
 * @license GPL2 or any later version
 */
class ConsultationMailer
{
    /**
     * Sends a consultation information message.
     *
     * @param User|null           $sender  Sender
     * @param User                $user    Recipient
     * @param ConsultationBooking $booking    Booking in question
     * @param string              $subject Subject of the message
     * @param string|null         $reason  Reason for a booking or cancelation
     */
    public static function sendMessage(?User $sender, User $user, ConsultationBooking $booking, string $subject, ?string $reason = '')
    {
        // Don't send message if user doesn't want it
        if (!UserConfig::get($user->id)->CONSULTATION_SEND_MESSAGES) {
            return;
        }

        setTempLanguage($user->id);

        $message = $GLOBALS['template_factory']->open('consultations/mail.php')->render([
            'user'   => $booking->user,
            'slot'   => $booking->slot,
            'reason' => $reason ?: _('Kein Grund angegeben'),
        ]);

        if ($sender === null) {
            messaging::sendSystemMessage($user, $subject, $message);
        } else {
            $messaging = new messaging();
            $messaging->insert_message($message, $user->username, $sender->id, '', '', '', '', $subject);
        }

        restoreLanguage();
    }

    /**
     * Send a booking information message to the teacher of the booked slot.
     *
     * @param User|null            $sender
     * @param ConsultationBooking $booking The booking
     */
    public static function sendBookingMessageToResponsibilities(?User $sender, ConsultationBooking $booking)
    {
        foreach (self::getResponsiblePersonsOfBlock($booking->slot->block) as $user) {
            self::sendMessage(
                $sender,
                $user,
                $booking,
                sprintf(_('Termin von %s zugesagt'), $booking->user->getFullName()), $booking->reason
            );
        }
    }

    /**
     * Send a booking information message to the user of the booked slot.
     *
     * @param User|null            $sender
     * @param  ConsultationBooking $booking The booking
     */
    public static function sendBookingMessageToUser(?User $sender, ConsultationBooking $booking)
    {
        self::sendMessage(
            $sender,
            $booking->user,
            $booking,
            sprintf(_('Termin bei %s zugesagt'), $booking->slot->block->range_display), $booking->reason
        );
    }

    /**
     * Send an information message about a changed reason to a user of the
     * booked slot.
     *
     * @param User|null           $sender   The sender of the message
     * @param ConsultationBooking $booking  The booking
     * @param User                $receiver The receiver of the message
     */
    public static function sendReasonMessage(?User $sender, ConsultationBooking $booking, User $receiver)
    {
        self::sendMessage(
            $sender,
            $receiver,
            $booking,
            sprintf(_('Grund des Termins bei %s bearbeitet'), $booking->slot->block->range_display), $booking->reason
        );
    }

    /**
     * Send a cancelation message to the teacher of the booked slot.
     *
     * @param User|null            $sender
     * @param  ConsultationBooking $booking The booking
     * @param String               $reason  Reason of the cancelation
     */
    public static function sendCancelMessageToResponsibilities(?User $sender, ConsultationBooking $booking, string $reason = '')
    {
        foreach (self::getResponsiblePersonsOfBlock($booking->slot->block) as $user) {
            self::sendMessage(
                $sender,
                $user,
                $booking,
                sprintf(_('Termin von %s abgesagt'), $booking->user->getFullName()), trim($reason)
            );
        }
    }

    /**
     * Send a cancelation message to the user of the booked slot.
     *
     * @param User|null            $sender
     * @param  ConsultationBooking $booking The booking
     * @param String               $reason  Reason of the cancelation
     */
    public static function sendCancelMessageToUser(?User $sender, ConsultationBooking $booking, string $reason)
    {
        self::sendMessage(
            $sender,
            $booking->user,
            $booking,
            sprintf(_('Termin bei %s abgesagt'), $booking->slot->block->range_display), trim($reason)
        );
    }

    /**
     * @return Generator<User>
     */
    private static function getResponsiblePersonsOfBlock(ConsultationBlock $block): Generator
    {
        foreach ($block->responsible_persons as $user) {
            /** @var User $user */

            // No mail to self
            if ($user->id === User::findCurrent()->id) {
                continue;
            }

            // No mails to tutors
            if (
                $block->range_type === 'course'
                && !$block->mail_to_tutors
                && !$GLOBALS['perm']->have_studip_perm('dozent', $block->range_id, $user->id)
            ) {
                continue;
            }

            yield $user;
        }
    }
}