<?php
namespace App\EventSubscriber;
use App\Entity\Event;
use App\Event\ManufacturerPubUpdateEvent;
use App\Event\ManufacturerRegisterEvent;
use App\Event\ManufacturerSendInquiryLinkEvent;
use App\Repository\SubscriptionRepository;
use App\Repository\UserRepository;
use App\Service\Log\QuotationLogService;
use App\Service\RabbitMQ\RabbitMQDispatcher;
use App\Service\Subscription\SubscriptionService;
use App\Service\UserLog;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Security;
class ManufacturerSubscriber implements EventSubscriberInterface
{
protected $security;
protected $userRepo;
protected $urlGenerator;
protected $subscriptionRepo;
protected $subscriptionService;
protected $rabbitMQDispatcher;
/**
* @var UserLog
*/
private $userLog;
/**
* @var QuotationLogService
*/
private $logService;
public function __construct(
Security $security,
UserRepository $userRepo,
UrlGeneratorInterface $urlGenerator,
UserLog $userLog,
QuotationLogService $logService,
SubscriptionRepository $subscriptionRepo,
SubscriptionService $subscriptionService,
RabbitMQDispatcher $rabbitMQDispatcher
)
{
$this->rabbitMQDispatcher = $rabbitMQDispatcher;
$this->subscriptionRepo = $subscriptionRepo;
$this->subscriptionService = $subscriptionService;
$this->security = $security;
$this->userRepo = $userRepo;
$this->urlGenerator = $urlGenerator;
$this->userLog = $userLog;
$this->logService = $logService;
}
public static function getSubscribedEvents(): array
{
return [
ManufacturerSendInquiryLinkEvent::NAME => 'sendLinkNotification',
ManufacturerPubUpdateEvent::NAME => 'sendPublicUpdateNotification',
ManufacturerRegisterEvent::NAME => 'createSubscriptions',
];
}
public function sendLinkNotification(ManufacturerSendInquiryLinkEvent $event)
{
$eventData = $event->getAdditionalData();
$manager = $this->security->getUser();
$manufacturer = $event->getManufacturer();
$inquiry = $event->getPriceInquiry();
$date_deadline = null;
if ($inquiry->getDateDeadline() instanceof \DateTimeInterface) {
$date_deadline = $inquiry->getDateDeadline()->format('d.m.Y');
}
$email_data['inquiry_number'] = '#' . $inquiry->getFullInquiryNumber();
$email_data['date_deadline'] = $date_deadline;
$email_data['comment'] = $eventData['comment'];
$email_data['link'] = $eventData['link'];
$email_data['manager_name'] = $manager->getName();
$email_data['manager_email'] = $manager->getEmail();
$email_data['manager_phone'] = $manager->getPhone();
$bcc = $manager->getEmail();
$this->rabbitMQDispatcher->dispatch([
'data' => [
'uuid' => $manufacturer->getUuid(),
'manager_id' => $manager->getId(),
'inquiry_status' => $inquiry->getStatus(),
'email_data' => $email_data,
'bcc' => $bcc,
],
'action_name' => 'manufacturerSendLinkNotification',
'consumer_name' => 'notification_consumer'
]);
// $this->subscriptionService->proceedEvent(
// Event::MANUFACTURER_SEND_LINK,
// $manufacturer,
// [
// 'data' => [
// 'uuid' => $manufacturer->getUuid(),
// 'manager_id' => $manager->getId(),
// 'email_data' => $email_data,
// 'bcc' => $bcc,
// ],
// 'action_name' => 'manufacturerSendLinkNotification'
// ]);
$this->userLog->log(get_class(), 'inquiry.sent_offer_link', $inquiry->getId(), json_encode([
'targetEmail' => $manufacturer->getEmail()
]));
$this->logService->logAction(
$inquiry->getQuotation(),
'log.inquiry.sent_offer_link',
$inquiry->getInquiryNumber(),
$manager
);
}
public function sendPublicUpdateNotification(ManufacturerPubUpdateEvent $event)
{
$manufacturer = $event->getManufacturer();
$link = $this->urlGenerator->generate('manufacturers.open', ['uuid' => $manufacturer->getUuid()], UrlGeneratorInterface::ABSOLUTE_URL);
$email_data = $event->getAdditionalData();
$email_data['link'] = $link;
$email_data['manufacturer_code'] = $manufacturer->getCode();
$email_data['manufacturer_name'] = $manufacturer->getName();
$this->subscriptionService->proceedEvent(
Event::MANUFACTURER_PUB_UPDATE,
$manufacturer,
[
'data' => [
'email_data' => $email_data,
],
'action_name' => 'manufacturerSendPublicUpdateNotification',
]);
}
public function createSubscriptions(ManufacturerRegisterEvent $event)
{
$this->subscriptionService->generateSubscriptions($event->getManufacturer());
}
}