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

Open in your IDE?
  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.     /**
  34.      * @var TokenStorageInterface
  35.      */
  36.     private $tokenStorage;
  37.     /**
  38.      * @var TranslatorInterface
  39.      */
  40.     private $translator;
  41.     /**
  42.      * @var ProducerFactoryInterface
  43.      */
  44.     private $producerFactory;
  45.     public function __construct(
  46.         EntityManagerInterface $em,
  47.         LeadService $leadService,
  48.         ParameterBagInterface $parameterBag,
  49.         TokenStorageInterface $tokenStorage,
  50.         TranslatorInterface $translator,
  51.         ProducerFactoryInterface $producerFactory
  52.     ) {
  53.         $this->em $em;
  54.         $this->leadService $leadService;
  55.         $this->parameterBag $parameterBag;
  56.         $this->tokenStorage $tokenStorage;
  57.         $this->translator $translator;
  58.         $this->producerFactory $producerFactory;
  59.     }
  60.     public function onContactSeller(LeadEvent $event): void
  61.     {
  62.         if (null != $event->getSource()
  63.             && \in_array($event->getSource(), [LeadTypes::TARGET_USER_MESSAGELeadTypes::USER_DOMAIN_MESSAGE])
  64.         ) {
  65.             return;
  66.         }
  67.         $source 'message-subscriber';
  68.         $leadModel = new LeadModel();
  69.         $leadModel->setLeadType(LeadTypes::SEND_MESSAGE);
  70.         $leadModel->setListing($event->getListing());
  71.         $leadModel->setUser($event->getUser());
  72.         $leadModel->setSource($source);
  73.         $leadModel->setCampaign($event->getCampaign());
  74.         $this->leadService->addLead($leadModeltrue);
  75.     }
  76.     public function onShowPhoneNumber(LeadEvent $event): void
  77.     {
  78.         $listing $event->getListing();
  79.         $lead $event->getLead();
  80.         // Check user listing role
  81.         if ($listing->getParent() && $listing->getParent()->getSection()->getSearchable()) {
  82.             return;
  83.         }
  84.         $token $this->tokenStorage->getToken();
  85.         $user $token ?: null;
  86.         if (!$user instanceof User) {
  87.             $user $lead->getUser();
  88.         }
  89.         $leadsInsightsEnabled true;
  90.         /** @var User $participant */
  91.         foreach ($listing->getAllParticipants() as $participant) {
  92.             if ($lead
  93.                 && (!$listing->getSection()->getSearchable() || $listing->getParent())) {
  94.                 $leadsInsightsEnabled true;
  95.                 $user $lead->getUser();
  96.             }
  97.             $subjectUsername $lead->getFullName() ?: $user->getUsername();
  98.             $mailUtility = new MailUtilitiesModel();
  99.             $mailUtility->setSubject($subjectUsername);
  100.             $mailUtility->setReplyTo([$listing->getUser()->getEmailCanonical()]);
  101.             $mailUtility->setTo([$participant->getEmailCanonical()]);
  102.             $this->translator->setLocale($participant->getLanguage() ?? $this->parameterBag->get('locale'));
  103.             if ($user->getMainNumber() && 'undefined' != $user->getMainNumber()->getPhone()->getNumber()
  104.                 || 'undefined' != $lead->getPhone()->getNumber() || 'undefined' != $lead->getEmail()) {
  105.                 $mailUtilities $this->buildMailUtilities($mailUtility);
  106.                 $producerFactory $this->producerFactory;
  107.                 $producer $producerFactory->create(ProducerQueues::PROCESS_EMAIL_BODY);
  108.                 $producer->publish(serialize([ProducerQueues::PROCESS_EMAIL_BODY_KEY => [
  109.                     'type' => ProcessEmailBodyTypes::SHOW_PHONE_NUMBER_MAILS,
  110.                     'template' => '@AqarmapListingBundle/Lead/Email/show_phone.html.twig',
  111.                     'subject' => $mailUtilities->getSubject(),
  112.                     'from' => $mailUtilities->getFrom(),
  113.                     'reply_to' => $mailUtilities->getReplyTo(),
  114.                     'to' => $mailUtilities->getTo(),
  115.                     'text_headers' => $mailUtilities->getTextHeaders(),
  116.                     'data' => [
  117.                         'listing' => $listing->getId(),
  118.                         'user' => $user instanceof User $user->getId() : null,
  119.                         'lead' => $lead->getId(),
  120.                         'leads_insights_enabled' => $leadsInsightsEnabled,
  121.                         'participant' => $participant->getId(),
  122.                     ],
  123.                 ],
  124.                 ]));
  125.             }
  126.         }
  127.     }
  128.     /**
  129.      * @return MailUtilitiesModel
  130.      */
  131.     private function buildMailUtilities(MailUtilitiesModel $mailUtility)
  132.     {
  133.         $subject ucfirst($this->translator->trans('phone_call_email.subject', [
  134.             '%user_name%' => $mailUtility->getSubject(),
  135.         ], 'emails'));
  136.         // check if name start with user+Number change subject in email
  137.         if ('user+' == substr($mailUtility->getSubject(), self::USERNAME_FIRST_LETTER_INDEXself::USERNAME_LAST_LETTER_INDEX)) {
  138.             $subject ucfirst($this->translator->trans('phone_call_email.subject_without_name', [], 'emails'));
  139.         }
  140.         $from = [$this->parameterBag->get('website_email') => $this->translator->trans('layout.app_name')];
  141.         $textHeaders = ['X-Mail-Category' => 'listings-lead-show-phone''X-Site-Country' => $this->parameterBag->get('country')];
  142.         $mailUtility->setSubject($subject);
  143.         $mailUtility->setFrom($from);
  144.         $mailUtility->setTextHeaders($textHeaders);
  145.         return $mailUtility;
  146.     }
  147.     public static function getSubscribedEvents()
  148.     {
  149.         return [
  150.             'aqarmap.listing.message_submitted' => 'onContactSeller',
  151.             'aqarmap.listing.show_seller_number' => 'onShowPhoneNumber',
  152.         ];
  153.     }
  154. }