src/EventSubscriber/InvoiceSubscriber.php line 142

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Invoice;
  4. use App\Entity\User;
  5. use App\Entity\UserNotification;
  6. use App\Event\InvoiceAddCommentEvent;
  7. use App\Event\InvoiceChangeAssignedManagerEvent;
  8. use App\Event\InvoiceChangeGradeEvent;
  9. use App\Event\InvoiceChangePercipientUserEvent;
  10. use App\Event\InvoiceStartConflictedEvent;
  11. use App\Event\InvoiceStopConflictedEvent;
  12. use App\Model\UserFilter;
  13. use App\Model\UserRoles;
  14. use App\Repository\UserRepository;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Symfony\Component\Notifier\NotifierInterface;
  18. use Symfony\Component\Translation\Translator;
  19. use Symfony\Contracts\Translation\TranslatorInterface;
  20. use Twig\Environment;
  21. class InvoiceSubscriber implements EventSubscriberInterface
  22. {
  23.     private Environment $twig;
  24.     private NotifierInterface $notifier;
  25.     private EntityManagerInterface $entityManager;
  26.     /** @var Translator */
  27.     private TranslatorInterface $translator;
  28.     private UserRepository $userRepository;
  29.     /**
  30.      * @param Translator $translator
  31.      */
  32.     public function __construct(
  33.         Environment $twig,
  34.         NotifierInterface $notifier,
  35.         EntityManagerInterface $entityManager,
  36.         TranslatorInterface $translator,
  37.         UserRepository $userRepository
  38.     ) {
  39.         $this->twig $twig;
  40.         $this->notifier $notifier;
  41.         $this->entityManager $entityManager;
  42.         $this->translator $translator;
  43.         $this->userRepository $userRepository;
  44.     }
  45.     public static function getSubscribedEvents()
  46.     {
  47.         return [
  48.             InvoiceChangeAssignedManagerEvent::class => 'onChangeAssignedManager',
  49.             InvoiceStartConflictedEvent::class => 'onStartConflicted',
  50.             InvoiceStopConflictedEvent::class => 'onStopConflicted',
  51.             InvoiceChangeGradeEvent::class => 'onChangeGrade',
  52.             InvoiceAddCommentEvent::class => 'onAddComment',
  53.             InvoiceChangePercipientUserEvent::class => 'onChangePercipientUser',
  54.         ];
  55.     }
  56.     public function onChangeAssignedManager(InvoiceChangeAssignedManagerEvent $event): void
  57.     {
  58.         /** @var User|null $oldAssignedManager */
  59.         $oldAssignedManager $event->getOldAssignedManager();
  60.         // Отправить тому кто был ранее что он снят
  61.         if (null != $oldAssignedManager && $event->getUser() !== $oldAssignedManager) {
  62.             $this->translator->setLocale($oldAssignedManager->getLocale());
  63.             $message $this->twig->render('notifications/invoice.html.twig', [
  64.                 'invoice' => $event->getInvoice(),
  65.             ]);
  66.             $notification = new UserNotification();
  67.             $notification
  68.                 ->setTitle($this->translator->trans('user.notification.invoice.you_unassigned'))
  69.                 ->setMessage($message)
  70.                 ->setRecipient($oldAssignedManager);
  71.             $this->entityManager->persist($notification);
  72.         }
  73.         $newAssignedManager $event->getNewAssignedManager();
  74.         // Если есть новый проверяющий отправить ему уведомление
  75.         if (null != $newAssignedManager && $event->getUser() !== $newAssignedManager) {
  76.             $this->translator->setLocale($newAssignedManager->getLocale());
  77.             $message $this->twig->render('notifications/invoice.html.twig', [
  78.                 'invoice' => $event->getInvoice(),
  79.             ]);
  80.             $notification = new UserNotification();
  81.             $notification
  82.                 ->setTitle($this->translator->trans('user.notification.invoice.you_assigned'))
  83.                 ->setMessage($message)
  84.                 ->setRecipient($newAssignedManager);
  85.             $this->entityManager->persist($notification);
  86.         }
  87.         $this->entityManager->flush();
  88.     }
  89.     public function onStartConflicted(InvoiceStartConflictedEvent $event): void
  90.     {
  91.         $recipientsUsers = [];
  92.         // Получить всех админов
  93.         $userFilter = new UserFilter();
  94.         $userFilter->setRoles([UserRoles::ROLE_SUPER_ADMIN]);
  95.         $usersAdmins $this->userRepository->findByFilter($userFilter);
  96.         if (null !== $usersAdmins && count($usersAdmins) > 0) {
  97.             /** @var User $userAdmin */
  98.             foreach ($usersAdmins as $userAdmin) {
  99.                 $recipientsUsers[$userAdmin->getId()] = $userAdmin;
  100.             }
  101.         }
  102.         $invoiceOwner $event->getInvoice()->getOwner();
  103.         if (null !== $invoiceOwner) {
  104.             $recipientsUsers[$invoiceOwner->getId()] = $invoiceOwner;
  105.         }
  106.         $invoiceAssignedManager $event->getInvoice()->getAssignedManager();
  107.         if (null !== $invoiceAssignedManager) {
  108.             $recipientsUsers[$invoiceAssignedManager->getId()] = $invoiceAssignedManager;
  109.         }
  110.         foreach ($recipientsUsers as $recipientsUser) {
  111.             if ($recipientsUser == $event->getUser()) {
  112.                 continue;
  113.             }
  114.             $this->translator->setLocale($recipientsUser->getLocale());
  115.             $message $this->twig->render('notifications/invoice.html.twig', [
  116.                 'invoice' => $event->getInvoice(),
  117.             ]);
  118.             $notification = new UserNotification();
  119.             $notification
  120.                 ->setTitle($this->translator->trans('user.notification.invoice.start_conflict'))
  121.                 ->setMessage($message)
  122.                 ->setRecipient($recipientsUser);
  123.             $this->entityManager->persist($notification);
  124.         }
  125.         $this->entityManager->flush();
  126.     }
  127.     public function onStopConflicted(InvoiceStopConflictedEvent $event): void
  128.     {
  129.         $recipientsUsers = [];
  130.         $invoiceOwner $event->getInvoice()->getOwner();
  131.         if (null !== $invoiceOwner) {
  132.             $recipientsUsers[$invoiceOwner->getId()] = $invoiceOwner;
  133.         }
  134.         $invoiceAssignedManager $event->getInvoice()->getAssignedManager();
  135.         if (null !== $invoiceAssignedManager) {
  136.             $recipientsUsers[$invoiceAssignedManager->getId()] = $invoiceAssignedManager;
  137.         }
  138.         foreach ($recipientsUsers as $recipientsUser) {
  139.             if ($recipientsUser == $event->getUser()) {
  140.                 continue;
  141.             }
  142.             $this->translator->setLocale($recipientsUser->getLocale());
  143.             $message $this->twig->render('notifications/invoice.html.twig', [
  144.                 'invoice' => $event->getInvoice(),
  145.             ]);
  146.             $notification = new UserNotification();
  147.             $notification
  148.                 ->setTitle($this->translator->trans('user.notification.invoice.stop_conflict'))
  149.                 ->setMessage($message)
  150.                 ->setRecipient($recipientsUser);
  151.             $this->entityManager->persist($notification);
  152.         }
  153.         $this->entityManager->flush();
  154.     }
  155.     public function onChangeGrade(InvoiceChangeGradeEvent $event): void
  156.     {
  157.         if (
  158.             !in_array($event->getOldGrade(), [Invoice::GRADE_TYPE_ERRORInvoice::GRADE_TYPE_WARNING], true)
  159.             &&
  160.             !in_array($event->getNewGrade(), [Invoice::GRADE_TYPE_ERRORInvoice::GRADE_TYPE_WARNING], true)
  161.         ) {
  162.             return;
  163.         }
  164.         $recipientsUsers = [];
  165.         foreach ($event->getInvoice()->getPercipientUsers() as $percipientUser) {
  166.             $recipientsUsers[] = $percipientUser;
  167.         }
  168.         foreach ($recipientsUsers as $recipientsUser) {
  169.             if ($recipientsUser == $event->getUser()) {
  170.                 continue;
  171.             }
  172.             $this->translator->setLocale($recipientsUser->getLocale());
  173.             $message $this->twig->render('notifications/invoice.html.twig', [
  174.                 'invoice' => $event->getInvoice(),
  175.             ]);
  176.             $notification = new UserNotification();
  177.             $notification
  178.                 ->setTitle($this->translator->trans('user.notification.invoice.changed_grade'))
  179.                 ->setMessage($message)
  180.                 ->setRecipient($recipientsUser);
  181.             $this->entityManager->persist($notification);
  182.         }
  183.         $this->entityManager->flush();
  184.     }
  185.     public function onAddComment(InvoiceAddCommentEvent $event): void
  186.     {
  187.         $recipientsUsers = [];
  188.         foreach ($event->getInvoice()->getPercipientUsers() as $percipientUser) {
  189.             $recipientsUsers[$percipientUser->getId()] = $percipientUser;
  190.         }
  191.         $invoiceOwner $event->getInvoice()->getOwner();
  192.         if (null !== $invoiceOwner) {
  193.             $recipientsUsers[$invoiceOwner->getId()] = $invoiceOwner;
  194.         }
  195.         $invoiceAssignedManager $event->getInvoice()->getAssignedManager();
  196.         if (null !== $invoiceAssignedManager) {
  197.             $recipientsUsers[$invoiceAssignedManager->getId()] = $invoiceAssignedManager;
  198.         }
  199.         foreach ($recipientsUsers as $recipientsUser) {
  200.             if ($recipientsUser == $event->getUser()) {
  201.                 continue;
  202.             }
  203.             $this->translator->setLocale($recipientsUser->getLocale());
  204.             $message $this->twig->render('notifications/invoice.html.twig', [
  205.                 'invoice' => $event->getInvoice(),
  206.             ]);
  207.             $notification = new UserNotification();
  208.             $notification
  209.                 ->setTitle($this->translator->trans('user.notification.invoice.added_comment'))
  210.                 ->setMessage($message)
  211.                 ->setRecipient($recipientsUser);
  212.             $this->entityManager->persist($notification);
  213.         }
  214.         $this->entityManager->flush();
  215.     }
  216.     public function onChangePercipientUser(InvoiceChangePercipientUserEvent $event): void
  217.     {
  218.         foreach ($event->getAddPercipientUsers() as $addPercipientUser) {
  219.             if ($addPercipientUser == $event->getUser()) {
  220.                 continue;
  221.             }
  222.             $this->translator->setLocale($addPercipientUser->getLocale());
  223.             $message $this->twig->render('notifications/invoice.html.twig', [
  224.                 'invoice' => $event->getInvoice(),
  225.             ]);
  226.             $notification = new UserNotification();
  227.             $notification
  228.                 ->setTitle($this->translator->trans('user.notification.invoice.you_added'))
  229.                 ->setMessage($message)
  230.                 ->setRecipient($addPercipientUser);
  231.             $this->entityManager->persist($notification);
  232.         }
  233.         foreach ($event->getRemovePercipientUsers() as $removePercipientUser) {
  234.             if ($removePercipientUser == $event->getUser()) {
  235.                 continue;
  236.             }
  237.             $this->translator->setLocale($removePercipientUser->getLocale());
  238.             $message $this->twig->render('notifications/invoice.html.twig', [
  239.                 'invoice' => $event->getInvoice(),
  240.             ]);
  241.             $notification = new UserNotification();
  242.             $notification
  243.                 ->setTitle($this->translator->trans('user.notification.invoice.you_removed'))
  244.                 ->setMessage($message)
  245.                 ->setRecipient($removePercipientUser);
  246.             $this->entityManager->persist($notification);
  247.         }
  248.         $this->entityManager->flush();
  249.     }
  250. }