src/Aqarmap/Bundle/ListingBundle/EventListener/LeadSubscribeListener.php line 71

  1. <?php
  2. namespace Aqarmap\Bundle\ListingBundle\EventListener;
  3. use Aqarmap\Bundle\ListingBundle\Constant\LeadTypes;
  4. use Aqarmap\Bundle\ListingBundle\Event\LeadEvent;
  5. use Aqarmap\Bundle\ListingBundle\Model\LeadModel;
  6. use Aqarmap\Bundle\ListingBundle\Service\LeadService;
  7. use Aqarmap\Bundle\MainBundle\Constant\ProcessEmailBodyTypes;
  8. use Aqarmap\Bundle\MainBundle\Constant\ProducerQueues;
  9. use Aqarmap\Bundle\MainBundle\Contract\ProducerFactoryInterface;
  10. use Aqarmap\Bundle\MainBundle\Model\MailUtilitiesModel;
  11. use Aqarmap\Bundle\UserBundle\Entity\User;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  16. use Symfony\Contracts\Translation\TranslatorInterface;
  17. class LeadSubscribeListener implements EventSubscriberInterface
  18. {
  19. public const USERNAME_FIRST_LETTER_INDEX = 0;
  20. public const USERNAME_LAST_LETTER_INDEX = 5;
  21. /**
  22. * @var EntityManagerInterface
  23. */
  24. protected $em;
  25. /**
  26. * @var LeadService
  27. */
  28. protected $leadService;
  29. /**
  30. * @var ParameterBagInterface
  31. */
  32. protected $parameterBagInterface;
  33. public function __construct(
  34. EntityManagerInterface $em,
  35. LeadService $leadService,
  36. ParameterBagInterface $parameterBag,
  37. private readonly TokenStorageInterface $tokenStorage,
  38. private readonly TranslatorInterface $translator,
  39. private readonly ProducerFactoryInterface $producerFactory,
  40. ) {
  41. $this->em = $em;
  42. $this->leadService = $leadService;
  43. $this->parameterBag = $parameterBag;
  44. }
  45. public function onContactSeller(LeadEvent $event): void
  46. {
  47. if (null != $event->getSource()
  48. && \in_array($event->getSource(), [LeadTypes::TARGET_USER_MESSAGE, LeadTypes::USER_DOMAIN_MESSAGE])
  49. ) {
  50. return;
  51. }
  52. $source = 'message-subscriber';
  53. $leadModel = new LeadModel();
  54. $leadModel->setLeadType(LeadTypes::SEND_MESSAGE);
  55. $leadModel->setListing($event->getListing());
  56. $leadModel->setUser($event->getUser());
  57. $leadModel->setSource($source);
  58. $leadModel->setCampaign($event->getCampaign());
  59. $this->leadService->addLead($leadModel, true);
  60. }
  61. public function onShowPhoneNumber(LeadEvent $event): void
  62. {
  63. $listing = $event->getListing();
  64. $lead = $event->getLead();
  65. // Check user listing role
  66. if ($listing->getParent() && $listing->getParent()->getSection()->getSearchable()) {
  67. return;
  68. }
  69. $token = $this->tokenStorage->getToken();
  70. $user = $token ?: null;
  71. if (!$user instanceof User) {
  72. $user = $lead->getUser();
  73. }
  74. $leadsInsightsEnabled = true;
  75. /** @var User $participant */
  76. foreach ($listing->getAllParticipants() as $participant) {
  77. if ($lead
  78. && (!$listing->getSection()->getSearchable() || $listing->getParent())) {
  79. $leadsInsightsEnabled = true;
  80. $user = $lead->getUser();
  81. }
  82. $subjectUsername = $lead->getFullName() ?: $user->getUsername();
  83. $mailUtility = new MailUtilitiesModel();
  84. $mailUtility->setSubject($subjectUsername);
  85. $mailUtility->setReplyTo([$listing->getUser()->getEmailCanonical()]);
  86. $mailUtility->setTo([$participant->getEmailCanonical()]);
  87. $this->translator->setLocale($participant->getLanguage() ?? $this->parameterBag->get('locale'));
  88. if ($user->getMainNumber() && 'undefined' != $user->getMainNumber()->getPhone()->getNumber()
  89. || 'undefined' != $lead->getPhone()->getNumber() || 'undefined' != $lead->getEmail()) {
  90. $mailUtilities = $this->buildMailUtilities($mailUtility);
  91. $producerFactory = $this->producerFactory;
  92. $producer = $producerFactory->create(ProducerQueues::PROCESS_EMAIL_BODY);
  93. $producer->publish(serialize([ProducerQueues::PROCESS_EMAIL_BODY_KEY => [
  94. 'type' => ProcessEmailBodyTypes::SHOW_PHONE_NUMBER_MAILS,
  95. 'template' => '@AqarmapListingBundle/Lead/Email/show_phone.html.twig',
  96. 'subject' => $mailUtilities->getSubject(),
  97. 'from' => $mailUtilities->getFrom(),
  98. 'reply_to' => $mailUtilities->getReplyTo(),
  99. 'to' => $mailUtilities->getTo(),
  100. 'text_headers' => $mailUtilities->getTextHeaders(),
  101. 'data' => [
  102. 'listing' => $listing->getId(),
  103. 'user' => $user instanceof User ? $user->getId() : null,
  104. 'lead' => $lead->getId(),
  105. 'leads_insights_enabled' => $leadsInsightsEnabled,
  106. 'participant' => $participant->getId(),
  107. ],
  108. ],
  109. ]));
  110. }
  111. }
  112. }
  113. /**
  114. * @return MailUtilitiesModel
  115. */
  116. private function buildMailUtilities(MailUtilitiesModel $mailUtility)
  117. {
  118. $subject = ucfirst($this->translator->trans('phone_call_email.subject', [
  119. '%user_name%' => $mailUtility->getSubject(),
  120. ], 'emails'));
  121. // check if name start with user+Number change subject in email
  122. if ('user+' == substr((string) $mailUtility->getSubject(), self::USERNAME_FIRST_LETTER_INDEX, self::USERNAME_LAST_LETTER_INDEX)) {
  123. $subject = ucfirst($this->translator->trans('phone_call_email.subject_without_name', [], 'emails'));
  124. }
  125. $from = [$this->parameterBag->get('website_email') => $this->translator->trans('layout.app_name')];
  126. $textHeaders = ['X-Mail-Category' => 'listings-lead-show-phone', 'X-Site-Country' => $this->parameterBag->get('country')];
  127. $mailUtility->setSubject($subject);
  128. $mailUtility->setFrom($from);
  129. $mailUtility->setTextHeaders($textHeaders);
  130. return $mailUtility;
  131. }
  132. public static function getSubscribedEvents(): array
  133. {
  134. return [
  135. 'aqarmap.listing.message_submitted' => 'onContactSeller',
  136. 'aqarmap.listing.show_seller_number' => 'onShowPhoneNumber',
  137. ];
  138. }
  139. }