src/EventSubscriber/BookingMailSubscriber.php line 37

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use ApiPlatform\Core\EventListener\EventPriorities;
  4. use App\Entity\Booking;
  5. use App\Entity\User;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpKernel\Event\ViewEvent;
  11. use Symfony\Component\HttpKernel\KernelEvents;
  12. use Symfony\Component\Mailer\MailerInterface;
  13. use Symfony\Component\Security\Core\Security;
  14. final class BookingMailSubscriber implements EventSubscriberInterface
  15. {
  16.     private $mailer;
  17.     private $security;
  18.     private $em;
  19.     public function __construct(EntityManagerInterface $entityManagerInterfaceMailerInterface $mailerSecurity $s) {
  20.         $this->em $entityManagerInterface;
  21.         $this->mailer $mailer;
  22.         $this->security $s;
  23.     }
  24.     public static function getSubscribedEvents() {
  25.         return [
  26.             KernelEvents::VIEW => [
  27.                 'sendMail'EventPriorities::POST_WRITE
  28.             ],
  29.         ];
  30.     }
  31.     public function sendMail(ViewEvent $event) {
  32.         $booking $event->getControllerResult();
  33.         $method $event->getRequest()->getMethod();
  34.         if (!$booking instanceof Booking || Request::METHOD_PUT !== $method) {
  35.             return;
  36.         }
  37.         $changes json_decode($event->getRequest()->getContent(), true);
  38.         if (isset($changes['guests'])) {
  39.             $prev $booking->getPreviousBooking();
  40.             if (!$prev || $prev->getCheckout()->diff(new \DateTime())->days 2)
  41.                 return;
  42.             $recepients = [ !$prev->isClean() && $prev->getResponsible() ? $prev->getResponsible()->getEmail() : 'post@giaever-vertskap.no' ];
  43.             if ($prev->getResponsible() !== null && !$prev->isClean())
  44.                 $recepients array_merge($recepientsarray_map(function (User $u): string {
  45.                     return $u->getEmail();
  46.                 }, array_filter($this->em->getRepository(User::class)->findBy(['company' => $prev->getResponsible()->getCompany()]), function (User $u): bool {
  47.                     return in_array('ROLE_MANAGER'$u->getRoles());
  48.                 })));
  49.             $recepients array_unique(array_filter($recepients, fn(string $email): bool => stripos($email'askepott.no') === false));
  50.             return $this->mailer->send(
  51.                 (new TemplatedEmail())
  52.                     ->to(...$recepients)
  53.                     ->from('post@giaever-vertskap.no')
  54.                     ->subject(sprintf("Amount of guests updated by %s"$this->security->getUser()->getName()))
  55.                     ->htmlTemplate('emails/booking.guests.alert.html.twig')
  56.                     ->context([
  57.                         "user" => $this->security->getUser(),
  58.                         "previous" => $prev,
  59.                         "upcoming" => $booking,
  60.                     ])
  61.             );
  62.         } else if (isset($changes['clean'])) {
  63.             $email = (new TemplatedEmail())
  64.                 ->to('post@giaever-vertskap.no')
  65.                 ->from('post@giaever-vertskap.no')
  66.                 ->replyTo($this->security->getUser()->getEmail())
  67.                 ->subject(sprintf("Clean alert: %s (%s)",
  68.                     $booking->getProperty()->getAddress()['address'],
  69.                     $booking->getProperty()->getSection()
  70.                 ))
  71.                 ->htmlTemplate('emails/property.clean.alert.html.twig')
  72.                 ->context([
  73.                     "booking" => $booking,
  74.                     "request" => var_export($changestrue)
  75.                 ]);
  76.             return $this->mailer->send($email);
  77.         } else if (isset($changes['drivingTimeUsage']) || isset($changes['timeUsage'])) {
  78.             $email = (new TemplatedEmail())
  79.                 ->to('post@giaever-vertskap.no')
  80.                 ->from('post@giaever-vertskap.no')
  81.                 ->replyTo($this->security->getUser()->getEmail())
  82.                 ->subject(sprintf('%s time usage updated', isset($changes['drivingTimeUsage']) ? 'Driving' 'Cleaning'))
  83.                 ->htmlTemplate('emails/property.clean.time-usage.alert.html.twig')
  84.                 ->context([
  85.                     "booking" => $booking,
  86.                     "type" => isset($changes['drivingTimeUsage']) ? 'driving' 'cleaning'
  87.                 ]);
  88.         }
  89.     }
  90. }