src/EventSubscriber/Mailer/DocumentStatusChangedSubscriber.php line 61

Open in your IDE?
  1. <?php
  2. /*
  3.  * Unauthorized copying of this file, via any medium is strictly prohibited
  4.  * Proprietary and confidential.
  5.  *
  6.  * @author Bilel AZRI          <azri.bilel@gmail.com>
  7.  * @author Assma BEN SASSI     <bensassiasma.bws@gmail.com>
  8.  *
  9.  * Bicking man (c) 2019-present.
  10.  */
  11. declare(strict_types=1);
  12. namespace App\EventSubscriber\Mailer;
  13. use App\Entity\Document\Document;
  14. use App\Entity\Document\DocumentModel;
  15. use App\Enum\DocumentModelTypeEnum;
  16. use App\Enum\DocumentStatusEnum;
  17. use App\Enum\DocumentTypeEnum;
  18. use App\Event\Document\DocumentStatusChangedEvent;
  19. use App\Service\UserService;
  20. use Doctrine\ORM\EntityManagerInterface;
  21. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  22. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  23. use Symfony\Component\Mailer\MailerInterface;
  24. use Symfony\Component\Mime\Address;
  25. use Twig\Environment;
  26. final class DocumentStatusChangedSubscriber implements EventSubscriberInterface
  27. {
  28.     private Environment $twig;
  29.     private string $senderEmail;
  30.     private string $senderName;
  31.     private MailerInterface $mailer;
  32.     private EntityManagerInterface $entityManager;
  33.     private UserService $userService;
  34.     public function __construct(Environment $twigMailerInterface $mailerEntityManagerInterface $entityManagerUserService $userService,
  35.                                 string $senderEmailstring $senderName)
  36.     {
  37.         $this->twig $twig;
  38.         $this->senderEmail $senderEmail;
  39.         $this->senderName $senderName;
  40.         $this->mailer $mailer;
  41.         $this->entityManager $entityManager;
  42.         $this->userService $userService;
  43.     }
  44.     public static function getSubscribedEvents(): array
  45.     {
  46.         return [DocumentStatusChangedEvent::NAME => 'doProcess'];
  47.     }
  48.     public function doProcess(DocumentStatusChangedEvent $event): void
  49.     {
  50.         $this->updateUserStatus($event);
  51.         $this->updateCourseUserSubscriptionStatus($event);
  52.         $this->sendMailToUser($event);
  53.     }
  54.     public static function getNotifSubscriptionDocEvents()
  55.     {
  56.         return [NotifDocumentStatusChangedEvent::NAME => 'notifSubscriptionDoc'];
  57.     }
  58.     public function notifSubscriptionDoc(DocumentStatusChangedEvent $event): void
  59.     {
  60.         $user $event->getUser();
  61.         $emailContent $this->twig->render('emails/user/user_register.html.twig', [
  62.             'user' => $user,
  63.         ]);
  64.         $email = (new TemplatedEmail())
  65.             ->from(new Address($this->senderEmail$this->senderName))
  66.             ->to((string) $user->getEmail())
  67.             ->subject('Bienvenu à BikingMan')
  68.             ->html($emailContent)
  69.         ;
  70.         $this->mailer->send($email);
  71.     }
  72.     private function updateUserStatus(DocumentStatusChangedEvent $event): void
  73.     {
  74.         $document $event->getDocument();
  75.         if (DocumentTypeEnum::GLOBAL !== $document->getType() && DocumentTypeEnum::USER !== $document->getType()) {
  76.             return;
  77.         }
  78.         $user $document->getParticipant();
  79.         $documentModels $this->entityManager->getRepository(DocumentModel::class)->findBy(['type' => DocumentModelTypeEnum::USER]);
  80.         /** @var DocumentModel $documentModel */
  81.         foreach ($documentModels as $documentModel) {
  82.             $userDocuments $this->entityManager->getRepository(Document::class)->findBy([
  83.                 'createdBy' => $user->getId(),
  84.                 'model' => $documentModel->getId(),
  85.                 'type' => DocumentTypeEnum::USER,
  86.                 'LastDoc' => true,
  87.             ]);
  88.             if (count($userDocuments) < 1) {
  89.                 return;
  90.             }
  91.             /** @var Document $userDocument */
  92.             foreach ($userDocuments as $userDocument) {
  93.                 if (DocumentStatusEnum::APPROVED !== $userDocument->getStatus()) {
  94.                     return;
  95.                 }
  96.             }
  97.         }
  98.         $user->setProgressiveStatus(100);
  99.         $this->entityManager->flush();
  100.         $this->userService->createCourseSubscription($user);
  101.         $this->userService->createCourseSubscriptionNotification($user);
  102.     }
  103.     private function updateCourseUserSubscriptionStatus(DocumentStatusChangedEvent $event): void
  104.     {
  105.         $document $event->getDocument();
  106.         if (DocumentTypeEnum::GLOBAL !== $document->getType() && DocumentTypeEnum::EVENT !== $document->getType()) {
  107.             return;
  108.         }
  109.         $user $document->getParticipant();
  110.         $courseUserSubscription $document->getCourseUserSubscription();
  111.         if (null != $courseUserSubscription) {
  112.             $course $courseUserSubscription->getCourse();
  113.             $documentModels $this->entityManager->getRepository(DocumentModel::class)->createQueryBuilder('dm')
  114.                 ->select('dm')
  115.                 ->addSelect('c')
  116.                 ->join('dm.courses''c')
  117.                 ->where('dm.type = :type')
  118.                 ->andWhere('c.id = :course')
  119.                 ->setParameter('type'DocumentModelTypeEnum::EVENT)
  120.                 ->setParameter('course'$course->getId())
  121.                 ->getQuery()
  122.                 ->getResult();
  123.             $courseUserSubscription->setProgressiveStatus($courseUserSubscription->getStatus() + 40);
  124.         } else {
  125.             $course null;
  126.             $documentModels $this->entityManager->getRepository(DocumentModel::class)->createQueryBuilder('dm')
  127.                 ->select('dm')
  128.                 ->addSelect('c')
  129.                 ->join('dm.courses''c')
  130.                 ->where('dm.type = :type')
  131.                 ->setParameter('type'DocumentModelTypeEnum::EVENT)
  132.                 ->getQuery()
  133.                 ->getResult();
  134.         }
  135.         /** @var DocumentModel $documentModel */
  136.         foreach ($documentModels as $documentModel) {
  137.             $userCourseDocuments $this->entityManager->getRepository(Document::class)->findBy([
  138.                 'createdBy' => $user->getId(),
  139.                 'model' => $documentModel->getId(),
  140.                 'type' => DocumentTypeEnum::EVENT,
  141.             ]);
  142.             if (count($userCourseDocuments) < 1) {
  143.                 return;
  144.             }
  145.             /** @var Document $userCourseDocument */
  146.             foreach ($userCourseDocuments as $userCourseDocument) {
  147.                 if (DocumentStatusEnum::APPROVED !== $userCourseDocument->getStatus()) {
  148.                     return;
  149.                 }
  150.             }
  151.         }
  152.     }
  153.     private function sendMailToUser(DocumentStatusChangedEvent $event): void
  154.     {
  155.         $document $event->getDocument();
  156.         $courseUserSubscription $document->getCourseUserSubscription();
  157.         $emailContent $this->twig->render('emails/user/document_status.html.twig', [
  158.             'document' => $document,
  159.         ]);
  160.         $user $document->getParticipant();
  161.         if (null !== $user) {
  162.             if($courseUserSubscription != null){
  163.                 $email = (new TemplatedEmail())
  164.                 ->from(new Address('app@bikingman.com''BikingMan'))
  165.                 ->to((string) $user->getEmail())
  166.                 ->subject('Vos documents pour le BikingMan '.$courseUserSubscription->getCourse()->translate('fr')->getname().' #'.$courseUserSubscription->getCourse()->getNumber().' '.$courseUserSubscription->getCourse()->getSeason())
  167.                 ->html($emailContent);
  168.             }else{
  169.                 $email = (new TemplatedEmail())
  170.                 ->from(new Address('app@bikingman.com''BikingMan'))
  171.                 ->to((string) $user->getEmail())
  172.                 ->subject('Vos documents BikingMan')
  173.                 ->html($emailContent);
  174.             }
  175.             
  176.             $this->mailer->send($email);
  177.         }
  178.     }
  179. }