<?php
namespace App\EventSubscriber;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\Booking;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Security\Core\Security;
final class BookingMailSubscriber implements EventSubscriberInterface
{
private $mailer;
private $security;
private $em;
public function __construct(EntityManagerInterface $entityManagerInterface, MailerInterface $mailer, Security $s) {
$this->em = $entityManagerInterface;
$this->mailer = $mailer;
$this->security = $s;
}
public static function getSubscribedEvents() {
return [
KernelEvents::VIEW => [
'sendMail', EventPriorities::POST_WRITE
],
];
}
public function sendMail(ViewEvent $event) {
$booking = $event->getControllerResult();
$method = $event->getRequest()->getMethod();
if (!$booking instanceof Booking || Request::METHOD_PUT !== $method) {
return;
}
$changes = json_decode($event->getRequest()->getContent(), true);
if (isset($changes['guests'])) {
$prev = $booking->getPreviousBooking();
if (!$prev || $prev->getCheckout()->diff(new \DateTime())->days > 2)
return;
$recepients = [ !$prev->isClean() && $prev->getResponsible() ? $prev->getResponsible()->getEmail() : 'post@giaever-vertskap.no' ];
if ($prev->getResponsible() !== null && !$prev->isClean())
$recepients = array_merge($recepients, array_map(function (User $u): string {
return $u->getEmail();
}, array_filter($this->em->getRepository(User::class)->findBy(['company' => $prev->getResponsible()->getCompany()]), function (User $u): bool {
return in_array('ROLE_MANAGER', $u->getRoles());
})));
$recepients = array_unique(array_filter($recepients, fn(string $email): bool => stripos($email, 'askepott.no') === false));
return $this->mailer->send(
(new TemplatedEmail())
->to(...$recepients)
->from('post@giaever-vertskap.no')
->subject(sprintf("Amount of guests updated by %s", $this->security->getUser()->getName()))
->htmlTemplate('emails/booking.guests.alert.html.twig')
->context([
"user" => $this->security->getUser(),
"previous" => $prev,
"upcoming" => $booking,
])
);
} else if (isset($changes['clean'])) {
$email = (new TemplatedEmail())
->to('post@giaever-vertskap.no')
->from('post@giaever-vertskap.no')
->replyTo($this->security->getUser()->getEmail())
->subject(sprintf("Clean alert: %s (%s)",
$booking->getProperty()->getAddress()['address'],
$booking->getProperty()->getSection()
))
->htmlTemplate('emails/property.clean.alert.html.twig')
->context([
"booking" => $booking,
"request" => var_export($changes, true)
]);
return $this->mailer->send($email);
} else if (isset($changes['drivingTimeUsage']) || isset($changes['timeUsage'])) {
$email = (new TemplatedEmail())
->to('post@giaever-vertskap.no')
->from('post@giaever-vertskap.no')
->replyTo($this->security->getUser()->getEmail())
->subject(sprintf('%s time usage updated', isset($changes['drivingTimeUsage']) ? 'Driving' : 'Cleaning'))
->htmlTemplate('emails/property.clean.time-usage.alert.html.twig')
->context([
"booking" => $booking,
"type" => isset($changes['drivingTimeUsage']) ? 'driving' : 'cleaning'
]);
}
}
}