<?phpnamespace Harmonizely\Service\EventSubscriber;use Harmonizely\Background\Data\EventMailManagerData;use Harmonizely\CalendarEvents;use Harmonizely\EmailManager\EventEmailManagerInterface;use Harmonizely\Entity\Company\ApproveEventEntity;use Harmonizely\Model\Event;use Harmonizely\Model\EventInterface;use Harmonizely\Repository\Company\Contract\IApproveEventRepository;use Harmonizely\Service\Core\Contract\ICompanySelector;use Harmonizely\Service\Panel\Api\ApproveEvent\Contract\IIsApproveEventRequired;use Harmonizely\Types\Company\ApproveEventStatus;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\EventDispatcher\GenericEvent;class ApproveEventSubscriber implements EventSubscriberInterface{ /** * @var IIsApproveEventRequired */ private IIsApproveEventRequired $isApproveEventRequired; /** * @var IApproveEventRepository */ private IApproveEventRepository $approveEventRepository; /** * @var ICompanySelector */ private ICompanySelector $companySelector; /** * @var EventEmailManagerInterface */ private EventEmailManagerInterface $eventEmailManager; /** * @param IIsApproveEventRequired $isApproveEventRequired * @param IApproveEventRepository $approveEventRepository * @param ICompanySelector $companySelector * @param EventEmailManagerInterface $eventEmailManager */ public function __construct( IIsApproveEventRequired $isApproveEventRequired, IApproveEventRepository $approveEventRepository, ICompanySelector $companySelector, EventEmailManagerInterface $eventEmailManager ) { $this->isApproveEventRequired = $isApproveEventRequired; $this->approveEventRepository = $approveEventRepository; $this->companySelector = $companySelector; $this->eventEmailManager = $eventEmailManager; } /** * @return string[] */ public static function getSubscribedEvents(): array { return [ CalendarEvents::EVENT_AFTER_PERSIST => 'afterPersistEvent', CalendarEvents::EVENT_POST_CREATE => 'eventPostCreate', ]; } /** * @param GenericEvent $genericEvent * @return void */ public function afterPersistEvent(GenericEvent $genericEvent): void { /** @var Event $event */ $event = $genericEvent->getSubject(); if (!$this->isApproveEventRequired->perform($event, true)) { return; } $approveEvent = new ApproveEventEntity($event); $this->approveEventRepository->save($approveEvent); $event->setApproveEvent($approveEvent); $this->eventEmailManager->sendBackgroundNotification(new EventMailManagerData( $event->getId(), EventMailManagerData::NEW_EVENT_EMAIL_CONFIRMATION, $this->companySelector->getCompany() )); } /** * @param GenericEvent $genericEvent * @return void */ public function eventPostCreate(GenericEvent $genericEvent) { /** @var EventInterface $event */ $event = $genericEvent->getSubject(); $approveEvent = $event->getApproveEvent(); if ($approveEvent && $approveEvent->getStatus() === ApproveEventStatus::STATUS_NEW) { $approveEvent->approve(); $this->approveEventRepository->save($approveEvent); } }}