<?php
namespace App\Services;
use App\Domain\Email\ExportEmail;
use App\Domain\Email\Receiver;
use App\Domain\SearchParams\ScheduleSearch;
use App\Entity\AppUser;
use App\Entity\Module;
use App\Entity\Schedule;
use App\Events\SendExportEmailEvent;
use App\Events\SendPasswordLinkEvent;
use DateTime;
use Swift_Attachment;
use Swift_Mailer;
use Swift_Message;
use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
/**
* Class MailService
* @package App\Services
*/
class MailService
{
/** @var Swift_Mailer $mailer */
private $mailer;
/** @var Environment */
private $templating;
/** @var string */
private $fromEmailAddress;
/**
* @var ExportEmailMessageRenderService
*/
private $renderService;
/**
* MailService constructor.
* @param Swift_Mailer $mailer
* @param Environment $templating
* @param string $fromEmailAddress
* @param ExportEmailMessageRenderService $renderService
*/
public function __construct(Swift_Mailer $mailer, Environment $templating, string $fromEmailAddress, ExportEmailMessageRenderService $renderService)
{
$this->mailer = $mailer;
$this->templating = $templating;
$this->fromEmailAddress = $fromEmailAddress;
$this->renderService = $renderService;
}
/**
* @param SendPasswordLinkEvent $event
* @throws LoaderError
* @throws RuntimeError
* @throws SyntaxError
*/
public function onSendPasswordLinkEmail(SendPasswordLinkEvent $event)
{
$passwordRequest = $event->getPasswordRequest();
$user = $passwordRequest->getUser();
$token = $passwordRequest->getToken();
$message = (new Swift_Message('Vergeben Sie ein Passwort für Trainee'))
->setFrom($this->fromEmailAddress)
->setTo($user->getEmail())
->setBody($this->templating->render('mail/password.link.email.html.twig', [
'token' => $token,
'user' => $user
]), 'text/html');
$this->mailer->send($message);
}
/**
* @param SendExportEmailEvent $event
* @throws LoaderError
* @throws RuntimeError
* @throws SyntaxError
*/
public function onSendTraineeScheduleExportEmail(SendExportEmailEvent $event)
{
$exportEmail = $event->getExportEmail();
$trainee = $exportEmail->getSchedule()->getTrainee();
$message = (new Swift_Message('Zeitplan: ' . $trainee->getFirstname() . ' ' . $trainee->getLastname()))
->setFrom($this->fromEmailAddress)
->setTo($exportEmail->getReceiverList())
->setBody($this->templating->render('mail/trainee.export.email.html.twig', [
'trainee' => $trainee,
'message' => $exportEmail->getMessage()
]), 'text/html');
$attachmentPath = $exportEmail->getAttachmentPath();
if ($attachmentPath !== null) {
$message->attach(
Swift_Attachment::fromPath($attachmentPath)
->setFilename(basename($attachmentPath))
);
}
$this->mailer->send($message);
}
/**
* @param SendExportEmailEvent $event
* @throws LoaderError
* @throws RuntimeError
* @throws SyntaxError
*/
public function onSendDepartmentScheduleExportEmail(SendExportEmailEvent $event)
{
$exportEmail = $event->getExportEmail();
$department = $exportEmail->getDepartment();
$start = new DateTime($exportEmail->getStart());
$message = (new Swift_Message('Zeitplan: ' . $department->getName() . '/' . $start->format('Y')))
->setFrom($this->fromEmailAddress)
->setTo($exportEmail->getReceiverList())
->setBody($this->templating->render('mail/department.export.email.html.twig', [
'department' => $department,
'message' => $exportEmail->getMessage()
]), 'text/html');
$attachmentPath = $exportEmail->getAttachmentPath();
if ($attachmentPath !== null) {
$message->attach(
Swift_Attachment::fromPath($attachmentPath)
->setFilename(basename($attachmentPath))
);
}
$this->mailer->send($message);
}
/**
* @param Schedule $schedule
* @param AppUser $user
* @return ExportEmail
* @throws LoaderError
* @throws RuntimeError
* @throws SyntaxError
*/
public function createExportFormData(Schedule $schedule, AppUser $user)
{
$sendExport = new ExportEmail();
$sendExport->setSchedule($schedule);
$trainee = $schedule->getTrainee();
$preRenderedMessage = $this->renderService->generateExportEmailMessage($trainee, $user);
$sendExport->setMessage($preRenderedMessage);
$appUsers = [];
$appUsers[] = $user;
$appUsers[] = $schedule->getTrainee();
/** @var Module $module */
foreach ($schedule->getModules() as $module) {
$department = $module->getDepartment();
$appUsers = array_merge($appUsers, $department->getContacts()->toArray());
}
foreach ($appUsers as $appUser) {
$receiver = new Receiver();
$receiver->setEmail($appUser->getEmail());
$sendExport->addReceiver($receiver);
}
return $sendExport;
}
/**
* @param ScheduleSearch $scheduleSearch
* @param AppUser $user
* @return ExportEmail
* @throws LoaderError
* @throws RuntimeError
* @throws SyntaxError
*/
public function createDepartmentExportFormData(ScheduleSearch $scheduleSearch, AppUser $user)
{
$sendExport = new ExportEmail();
$sendExport->setDepartment($scheduleSearch->getDepartment());
$sendExport->setStart($scheduleSearch->getStart()->format('d.m.Y'));
$department = $scheduleSearch->getDepartment();
$preRenderedMessage = $this->renderService->generateExportEmailMessageDepartment($department, $user);
$sendExport->setMessage($preRenderedMessage);
$appUsers = [];
$appUsers[] = $user;
$department = $scheduleSearch->getDepartment();
if($department->getContacts()) {
$appUsers = array_merge($appUsers, $department->getContacts()->toArray());
}
foreach ($appUsers as $appUser) {
$receiver = new Receiver();
$receiver->setEmail($appUser->getEmail());
$sendExport->addReceiver($receiver);
}
return $sendExport;
}
}