Skip to content
Snippets Groups Projects
ConsultationMailer.php 5.19 KiB
Newer Older
<?php
/**
 * @author  Jan-Hendrik Willms <tleilax+studip@gmail.com>
 * @license GPL2 or any later version
 */
class ConsultationMailer
{
    /**
     * Sends a consultation information message.
     *
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
     * @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
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
    public static function sendMessage(?User $sender, User $user, ConsultationBooking $booking, string $subject, ?string $reason = '')
    {
        // Don't send message if user doesn't want it
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
        if (
            $booking->user_id !== $user->id
            && !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)
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
        foreach (self::getResponsiblePersonsOfBlock($booking->slot->block) as $user) {
            self::sendMessage(
                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(
            $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.
     *
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
     * @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(
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
            $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 = '')
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed
        foreach (self::getResponsiblePersonsOfBlock($booking->slot->block) as $user) {
            self::sendMessage(
                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(
            $booking->user,
            $booking,
            sprintf(_('Termin bei %s abgesagt'), $booking->slot->block->range_display), trim($reason)
Jan-Hendrik Willms's avatar
Jan-Hendrik Willms committed

    /**
     * @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;
        }
    }