<?php namespace Lc\SovBundle\EventSubscriber\Ticket; use Lc\SovBundle\Event\EntityManager\EntityManagerEvent; use Lc\SovBundle\Event\Ticket\TicketEvent; use Lc\SovBundle\Model\Ticket\TicketInterface; use Lc\SovBundle\Model\Ticket\TicketMessageInterface; use Lc\SovBundle\Notification\MailMailjetNotification; use Lc\SovBundle\Repository\User\UserStore; use Lc\SovBundle\Solver\Ticket\TicketSolver; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; class SendNotificationTicketEventSubscriber implements EventSubscriberInterface { protected MailMailjetNotification $mailMailjetNotification; protected UserStore $userStore; protected AuthorizationCheckerInterface $authorizationChecker; protected TicketSolver $ticketSolver; public function __construct( MailMailjetNotification $mailMailjetNotification, UserStore $userStore, AuthorizationCheckerInterface $authorizationChecker, TicketSolver $ticketSolver ) { $this->mailMailjetNotification = $mailMailjetNotification; $this->userStore = $userStore; $this->authorizationChecker = $authorizationChecker; $this->ticketSolver = $ticketSolver; } public static function getSubscribedEvents() { return [ TicketEvent::NEW_MESSAGE_EVENT => ['sendNotificationAfterNewMessage'], TicketEvent::NEW_TICKET_EVENT => ['sendNotificationAfterNewTicket'], ]; } public function sendNotificationAfterNewTicket(TicketEvent $ticketEvent) { $ticket = $ticketEvent->getTicket(); $lastMessage = $this->ticketSolver->getLastMessage($ticket); if ($ticket->getUser()) { $firstname = $ticket->getUser()->getFirstname(); $email = $ticket->getUser()->getEmail(); } else { $firstname = $ticket->getVisitorFirstname(); $email = $ticket->getVisitorEmail(); } if ($lastMessage->getAnswerByAdmin()) { // envoi email au client $this->mailMailjetNotification->send( [ MailMailjetNotification::SUBJECT => 'Vous avez reçu un nouveau message', MailMailjetNotification::TO_EMAIL => $email, MailMailjetNotification::CONTENT_TEMPLATE => 'mail/ticket-new-by-admin', MailMailjetNotification::CONTENT_DATA => [ 'firstname' => $firstname, 'ticket' => $ticket, ], ] ); } else { $this->mailMailjetNotification->send( [ MailMailjetNotification::SUBJECT => 'Nouvelle demande', MailMailjetNotification::TO_EMAIL => $email, MailMailjetNotification::CONTENT_TEMPLATE => 'mail/ticket-new', MailMailjetNotification::CONTENT_DATA => [ 'firstname' => $firstname, 'ticket' => $ticket, ], ] ); } $this->notifyUser($ticket); } public function sendNotificationAfterNewMessage(TicketEvent $ticketEvent) { $ticket = $ticketEvent->getTicket(); $lastMessage = $this->ticketSolver->getLastMessage($ticket); if ($ticket->getUser()) { $firstname = $ticket->getUser()->getFirstname(); $email = $ticket->getUser()->getEmail(); } else { $firstname = $ticket->getVisitorFirstname(); $email = $ticket->getVisitorEmail(); } if ($lastMessage->getAnswerByAdmin()) { // envoi email au client $this->mailMailjetNotification->send( [ MailMailjetNotification::SUBJECT => 'Réponse à votre demande', MailMailjetNotification::TO_EMAIL => $email, MailMailjetNotification::CONTENT_TEMPLATE => 'mail/ticket-response', MailMailjetNotification::CONTENT_DATA => [ 'firstname' => $firstname, 'ticket' => $ticket, ], ] ); } $this->notifyUser($ticket); } protected function notifyUser(TicketInterface $ticket): void { // notifyAdmin $usersToNotify = $this->userStore->getByTicketTypesNotification($ticket->getType()); foreach ($usersToNotify as $userToNotify) { if ($this->authorizationChecker->isGranted('ROLE_ADMIN', $userToNotify)) { $this->mailMailjetNotification->send( [ MailMailjetNotification::SUBJECT => 'Nouveau ticket sur Place du Local', MailMailjetNotification::TO_EMAIL => $userToNotify->getEmail(), MailMailjetNotification::CONTENT_TEMPLATE => 'mail/ticket-notification', MailMailjetNotification::CONTENT_DATA => [ 'firstname' => $userToNotify->getFirstname(), 'ticket' => $ticket, 'ticketMessage' => $ticket->getTicketMessages()[0], ], ] ); } } } }