<?php
namespace App\EventSubscriber;
use App\Entity\Invoice;
use App\Entity\User;
use App\Entity\UserNotification;
use App\Event\InvoiceAddCommentEvent;
use App\Event\InvoiceChangeAssignedManagerEvent;
use App\Event\InvoiceChangeGradeEvent;
use App\Event\InvoiceChangePercipientUserEvent;
use App\Event\InvoiceStartConflictedEvent;
use App\Event\InvoiceStopConflictedEvent;
use App\Model\UserFilter;
use App\Model\UserRoles;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Notifier\NotifierInterface;
use Symfony\Component\Translation\Translator;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Environment;
class InvoiceSubscriber implements EventSubscriberInterface
{
private Environment $twig;
private NotifierInterface $notifier;
private EntityManagerInterface $entityManager;
/** @var Translator */
private TranslatorInterface $translator;
private UserRepository $userRepository;
/**
* @param Translator $translator
*/
public function __construct(
Environment $twig,
NotifierInterface $notifier,
EntityManagerInterface $entityManager,
TranslatorInterface $translator,
UserRepository $userRepository
) {
$this->twig = $twig;
$this->notifier = $notifier;
$this->entityManager = $entityManager;
$this->translator = $translator;
$this->userRepository = $userRepository;
}
public static function getSubscribedEvents()
{
return [
InvoiceChangeAssignedManagerEvent::class => 'onChangeAssignedManager',
InvoiceStartConflictedEvent::class => 'onStartConflicted',
InvoiceStopConflictedEvent::class => 'onStopConflicted',
InvoiceChangeGradeEvent::class => 'onChangeGrade',
InvoiceAddCommentEvent::class => 'onAddComment',
InvoiceChangePercipientUserEvent::class => 'onChangePercipientUser',
];
}
public function onChangeAssignedManager(InvoiceChangeAssignedManagerEvent $event): void
{
/** @var User|null $oldAssignedManager */
$oldAssignedManager = $event->getOldAssignedManager();
// Отправить тому кто был ранее что он снят
if (null != $oldAssignedManager && $event->getUser() !== $oldAssignedManager) {
$this->translator->setLocale($oldAssignedManager->getLocale());
$message = $this->twig->render('notifications/invoice.html.twig', [
'invoice' => $event->getInvoice(),
]);
$notification = new UserNotification();
$notification
->setTitle($this->translator->trans('user.notification.invoice.you_unassigned'))
->setMessage($message)
->setRecipient($oldAssignedManager);
$this->entityManager->persist($notification);
}
$newAssignedManager = $event->getNewAssignedManager();
// Если есть новый проверяющий отправить ему уведомление
if (null != $newAssignedManager && $event->getUser() !== $newAssignedManager) {
$this->translator->setLocale($newAssignedManager->getLocale());
$message = $this->twig->render('notifications/invoice.html.twig', [
'invoice' => $event->getInvoice(),
]);
$notification = new UserNotification();
$notification
->setTitle($this->translator->trans('user.notification.invoice.you_assigned'))
->setMessage($message)
->setRecipient($newAssignedManager);
$this->entityManager->persist($notification);
}
$this->entityManager->flush();
}
public function onStartConflicted(InvoiceStartConflictedEvent $event): void
{
$recipientsUsers = [];
// Получить всех админов
$userFilter = new UserFilter();
$userFilter->setRoles([UserRoles::ROLE_SUPER_ADMIN]);
$usersAdmins = $this->userRepository->findByFilter($userFilter);
if (null !== $usersAdmins && count($usersAdmins) > 0) {
/** @var User $userAdmin */
foreach ($usersAdmins as $userAdmin) {
$recipientsUsers[$userAdmin->getId()] = $userAdmin;
}
}
$invoiceOwner = $event->getInvoice()->getOwner();
if (null !== $invoiceOwner) {
$recipientsUsers[$invoiceOwner->getId()] = $invoiceOwner;
}
$invoiceAssignedManager = $event->getInvoice()->getAssignedManager();
if (null !== $invoiceAssignedManager) {
$recipientsUsers[$invoiceAssignedManager->getId()] = $invoiceAssignedManager;
}
foreach ($recipientsUsers as $recipientsUser) {
if ($recipientsUser == $event->getUser()) {
continue;
}
$this->translator->setLocale($recipientsUser->getLocale());
$message = $this->twig->render('notifications/invoice.html.twig', [
'invoice' => $event->getInvoice(),
]);
$notification = new UserNotification();
$notification
->setTitle($this->translator->trans('user.notification.invoice.start_conflict'))
->setMessage($message)
->setRecipient($recipientsUser);
$this->entityManager->persist($notification);
}
$this->entityManager->flush();
}
public function onStopConflicted(InvoiceStopConflictedEvent $event): void
{
$recipientsUsers = [];
$invoiceOwner = $event->getInvoice()->getOwner();
if (null !== $invoiceOwner) {
$recipientsUsers[$invoiceOwner->getId()] = $invoiceOwner;
}
$invoiceAssignedManager = $event->getInvoice()->getAssignedManager();
if (null !== $invoiceAssignedManager) {
$recipientsUsers[$invoiceAssignedManager->getId()] = $invoiceAssignedManager;
}
foreach ($recipientsUsers as $recipientsUser) {
if ($recipientsUser == $event->getUser()) {
continue;
}
$this->translator->setLocale($recipientsUser->getLocale());
$message = $this->twig->render('notifications/invoice.html.twig', [
'invoice' => $event->getInvoice(),
]);
$notification = new UserNotification();
$notification
->setTitle($this->translator->trans('user.notification.invoice.stop_conflict'))
->setMessage($message)
->setRecipient($recipientsUser);
$this->entityManager->persist($notification);
}
$this->entityManager->flush();
}
public function onChangeGrade(InvoiceChangeGradeEvent $event): void
{
if (
!in_array($event->getOldGrade(), [Invoice::GRADE_TYPE_ERROR, Invoice::GRADE_TYPE_WARNING], true)
&&
!in_array($event->getNewGrade(), [Invoice::GRADE_TYPE_ERROR, Invoice::GRADE_TYPE_WARNING], true)
) {
return;
}
$recipientsUsers = [];
foreach ($event->getInvoice()->getPercipientUsers() as $percipientUser) {
$recipientsUsers[] = $percipientUser;
}
foreach ($recipientsUsers as $recipientsUser) {
if ($recipientsUser == $event->getUser()) {
continue;
}
$this->translator->setLocale($recipientsUser->getLocale());
$message = $this->twig->render('notifications/invoice.html.twig', [
'invoice' => $event->getInvoice(),
]);
$notification = new UserNotification();
$notification
->setTitle($this->translator->trans('user.notification.invoice.changed_grade'))
->setMessage($message)
->setRecipient($recipientsUser);
$this->entityManager->persist($notification);
}
$this->entityManager->flush();
}
public function onAddComment(InvoiceAddCommentEvent $event): void
{
$recipientsUsers = [];
foreach ($event->getInvoice()->getPercipientUsers() as $percipientUser) {
$recipientsUsers[$percipientUser->getId()] = $percipientUser;
}
$invoiceOwner = $event->getInvoice()->getOwner();
if (null !== $invoiceOwner) {
$recipientsUsers[$invoiceOwner->getId()] = $invoiceOwner;
}
$invoiceAssignedManager = $event->getInvoice()->getAssignedManager();
if (null !== $invoiceAssignedManager) {
$recipientsUsers[$invoiceAssignedManager->getId()] = $invoiceAssignedManager;
}
foreach ($recipientsUsers as $recipientsUser) {
if ($recipientsUser == $event->getUser()) {
continue;
}
$this->translator->setLocale($recipientsUser->getLocale());
$message = $this->twig->render('notifications/invoice.html.twig', [
'invoice' => $event->getInvoice(),
]);
$notification = new UserNotification();
$notification
->setTitle($this->translator->trans('user.notification.invoice.added_comment'))
->setMessage($message)
->setRecipient($recipientsUser);
$this->entityManager->persist($notification);
}
$this->entityManager->flush();
}
public function onChangePercipientUser(InvoiceChangePercipientUserEvent $event): void
{
foreach ($event->getAddPercipientUsers() as $addPercipientUser) {
if ($addPercipientUser == $event->getUser()) {
continue;
}
$this->translator->setLocale($addPercipientUser->getLocale());
$message = $this->twig->render('notifications/invoice.html.twig', [
'invoice' => $event->getInvoice(),
]);
$notification = new UserNotification();
$notification
->setTitle($this->translator->trans('user.notification.invoice.you_added'))
->setMessage($message)
->setRecipient($addPercipientUser);
$this->entityManager->persist($notification);
}
foreach ($event->getRemovePercipientUsers() as $removePercipientUser) {
if ($removePercipientUser == $event->getUser()) {
continue;
}
$this->translator->setLocale($removePercipientUser->getLocale());
$message = $this->twig->render('notifications/invoice.html.twig', [
'invoice' => $event->getInvoice(),
]);
$notification = new UserNotification();
$notification
->setTitle($this->translator->trans('user.notification.invoice.you_removed'))
->setMessage($message)
->setRecipient($removePercipientUser);
$this->entityManager->persist($notification);
}
$this->entityManager->flush();
}
}