src/EventListener/ApplicantApplicantEventListener.php line 59

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Component\Configuration\Util\Config;
  4. use App\Entity\Applicant;
  5. use App\Entity\Company;
  6. use App\Entity\Mail;
  7. use App\Entity\Vacancy;
  8. use App\Entity\VacancyDomain;
  9. use App\Event\ApplicantEvent;
  10. use App\Form\Setting\ApplicantSettingType as ApplicantSettings;
  11. use App\Sendgrid\MailerInterface;
  12. use App\Service\SiteService;
  13. use App\Util\StringToEntityUtil;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Flagception\Manager\FeatureManagerInterface;
  16. use Gedmo\Translatable\TranslatableListener;
  17. use League\Flysystem\Adapter\Local;
  18. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  19. use Symfony\Component\Routing\RouterInterface;
  20. class ApplicantApplicantEventListener extends FormSubmitEventListener
  21. {
  22.     private EntityManagerInterface $entityManager;
  23.     private FeatureManagerInterface $featureManager;
  24.     private Local $fileAdapter;
  25.     private SiteService $siteService;
  26.     private RouterInterface $router;
  27.     private EntityManagerInterface $parentEntityManager;
  28.     /**
  29.      * ApplicantApplicantEventListener constructor.
  30.      */
  31.     public function __construct(
  32.         EntityManagerInterface $entityManager,
  33.         FeatureManagerInterface $featureManager,
  34.         ParameterBagInterface $parameterBag,
  35.         MailerInterface $mailer,
  36.         StringToEntityUtil $stringToEntityUtil,
  37.         Local $fileAdapter,
  38.         SiteService $siteService,
  39.         RouterInterface $router,
  40.         ?TranslatableListener $translatableListener,
  41.         EntityManagerInterface $parentEntityManager,
  42.         Config $config
  43.     ) {
  44.         $this->entityManager $entityManager;
  45.         $this->featureManager $featureManager;
  46.         $this->fileAdapter $fileAdapter;
  47.         $this->siteService $siteService;
  48.         $this->router $router;
  49.         $this->config $config;
  50.         parent::__construct($mailer$parameterBag$stringToEntityUtil$translatableListener$config);
  51.         $this->parentEntityManager $parentEntityManager;
  52.     }
  53.     public function applicantSubmitted(ApplicantEvent $applicantEvent)
  54.     {
  55.         if (
  56.             $this->featureManager->isActive('feature_ats') ||
  57.             $this->featureManager->isActive(FeatureFlagListener::FEATURE_PEOPLE_XS_SEND_APPLICANT)
  58.         ) {
  59.             return;
  60.         }
  61.         $applicant $applicantEvent->getApplicant();
  62.         $vacancyUrl '';
  63.         $vacancyDomain null;
  64.         if ($applicant->getVacancy()) {
  65.             $vacancyUrl $this->router->generate('vacancy_detail', ['id' => $applicant->getVacancy()->getId(), 'slug' => $applicant->getVacancy()->getSlug()]);
  66.             $vacancyDomain $applicant->getVacancy()->getDomain();
  67.         }
  68.         $sender null;
  69.         if ($vacancyDomain && $vacancyDomain->getMailSet()) {
  70.             $sender = [$vacancyDomain->getMailSet()->getSenderEmail() => $vacancyDomain->getMailSet()->getSenderName()];
  71.         }
  72.         [$visitorMail$ownerMail] = $this->getMailTemplates($applicant$vacancyDomain);
  73.         if ($visitorMail && $this->config->get('site_applicant_applicant_send_mail')) {
  74.             $this->sendApplicantMail($applicant$visitorMail$applicantEvent$vacancyUrl$sender);
  75.         }
  76.         if ($ownerMail && $this->config->get('site_applicant_company_send_mail')) {
  77.             $this->sendCompanyMail($applicant$ownerMail$applicantEvent$vacancyUrl$sender);
  78.         }
  79.         if (!$this->featureManager->isActive(FeatureFlagListener::FEATURE_CREDITS)
  80.             || !$this->featureManager->isActive(FeatureFlagListener::FEATURE_APPLICANT_DONT_SAVE_TO_DB)) {
  81.             $this->updateApplicantSendToApplicationMail($applicant);
  82.         }
  83.     }
  84.     private function updateApplicantSendToApplicationMail(Applicant $applicant)
  85.     {
  86.         $entityManager $this->entityManager;
  87.         if ($this->featureManager->isActive(FeatureFlagListener::FEATURE_CHILD_SITE)) {
  88.             $entityManager $this->parentEntityManager;
  89.         }
  90.         $applicant->setApplicantSendToApplicantMail(true);
  91.         $entityManager->persist($applicant);
  92.         $entityManager->flush();
  93.     }
  94.     private function sendApplicantMail(
  95.         Applicant $applicant,
  96.         Mail $applicantMail,
  97.         ApplicantEvent $applicantEvent,
  98.         string $vacancyUrl,
  99.         ?array $sender null
  100.     ) {
  101.         if (!$applicantEvent->isResend() &&
  102.             $applicant->getEmail()
  103.         ) {
  104.             $this->mailer->mail(
  105.                 $applicantMail,
  106.                 $sender ?: $this->getCompanyEmailSender(),
  107.                 [$applicant->getEmail()],
  108.                 ['applicant' => $applicant'site' => $this->siteService->getSite(), 'vacancyUrl' => $vacancyUrl]
  109.             );
  110.         }
  111.     }
  112.     private function sendCompanyMail(
  113.         Applicant $applicant,
  114.         Mail $companyMail,
  115.         ApplicantEvent $applicantEvent,
  116.         string $vacancyUrl,
  117.         ?array $sender null
  118.     ) {
  119.         if ($applicant->getVacancy()) {
  120.             $recipientEmailAddress $this->getVacancyApplicationCompanyEmail($applicant->getVacancy());
  121.         } else {
  122.             $recipientEmailAddress $this->getOpenApplicationCompanyEmail($applicantEvent);
  123.         }
  124.         $files = [];
  125.         if ($this->config->get('site_applicant_attach_files')) {
  126.             if ($applicant->getFileName() && $this->fileAdapter->has($applicant->getFileName())) {
  127.                 $files[] = $this->fileAdapter->getPathPrefix().$applicant->getFileName();
  128.             }
  129.             if ($applicant->getFileNameMotivation() && $this->fileAdapter->has($applicant->getFileNameMotivation())) {
  130.                 $files[] = $this->fileAdapter->getPathPrefix().$applicant->getFileNameMotivation();
  131.             }
  132.         }
  133.         $this->mailer->mail(
  134.             $companyMail,
  135.             $sender ?: $this->getCompanyEmailSender(),
  136.             \is_string($recipientEmailAddress) ? [$recipientEmailAddress] : $recipientEmailAddress,
  137.             [
  138.                 'applicant' => $applicant,
  139.                 'site' => $this->siteService->getSite(),
  140.                 'vacancyUrl' => $vacancyUrl,
  141.                 'utm_source' => $applicant->getUtm()['utm_source'] ?? null,
  142.                 'utm_medium' => $applicant->getUtm()['utm_medium'] ?? null,
  143.                 'utm_campaign' => $applicant->getUtm()['utm_campaign'] ?? null,
  144.                 'utm_term' => $applicant->getUtm()['utm_term'] ?? null,
  145.                 'utm_content' => $applicant->getUtm()['utm_content'] ?? null,
  146.             ],
  147.             [],
  148.             [],
  149.             $files
  150.         );
  151.     }
  152.     private function getVacancyApplicationCompanyEmail(Vacancy $vacancy): string|array
  153.     {
  154.         $emailPolicy $this->config->get('site_applicant_applications_email_policy_company');
  155.         // Always 'prefer' applicantEmail when available
  156.         if (!empty($vacancy->getApplicantEmail())) {
  157.             return $vacancy->getApplicantEmail();
  158.         }
  159.         if (
  160.             ApplicantSettings::APPLICATION_NOTIFICATION_POLICY_VACANCY_RELATED_COMPANY === $emailPolicy &&
  161.             $company $vacancy->getCompany()
  162.         ) {
  163.             if (!empty($company->getApplicantEmail())) {
  164.                 return $company->getApplicantEmail();
  165.             }
  166.             if (!empty($company->getEmail())) {
  167.                 return $company->getEmail();
  168.             }
  169.         }
  170.         if (
  171.             ApplicantSettings::APPLICATION_NOTIFICATION_POLICY_VACANCY_RELATED_RECRUITER === $emailPolicy &&
  172.             $vacancy->getRecruiter() &&
  173.             $relatedRecruiterEmailAddress $vacancy->getRecruiter()->getEmail()
  174.         ) {
  175.             return $relatedRecruiterEmailAddress;
  176.         }
  177.         $address $this->parameterBag->get('site_company_email_address');
  178.         return \is_string($address) ? $address : [];
  179.     }
  180.     private function getOpenApplicationCompanyEmail(ApplicantEvent $applicantEvent): string|array
  181.     {
  182.         $emailPolicy $this->config->get('site_applicant_open_applications_email_policy_company');
  183.         if (ApplicantSettings::OPEN_APPLICATION_NOTIFICATION_POLICY_GLOBAL === $emailPolicy) {
  184.             $address $this->parameterBag->get('site_company_email_address');
  185.             return \is_string($address) ? $address : [];
  186.         }
  187.         if (
  188.             ApplicantSettings::OPEN_APPLICATION_NOTIFICATION_POLICY_CUSTOM === $emailPolicy &&
  189.             $customAddress $this->config->get('site_applicant_open_applications_company_custom_email')
  190.         ) {
  191.             return \is_string($customAddress) ? $customAddress : [];
  192.         }
  193.         if (
  194.             ApplicantSettings::OPEN_APPLICATION_NOTIFICATION_POLICY_COMPANY === $emailPolicy &&
  195.             $applicantEvent->getForm()?->has('company') &&
  196.             Company::class === \get_class($applicantEvent->getForm()?->get('company')->getData())
  197.         ) {
  198.             /** @var Company $company */
  199.             $company $applicantEvent->getForm()?->get('company')->getData();
  200.             if (!empty($company->getApplicantEmail())) {
  201.                 return $company->getApplicantEmail();
  202.             }
  203.             if (!empty($company->getEmail())) {
  204.                 return $company->getEmail();
  205.             }
  206.         }
  207.         $address $this->parameterBag->get('site_company_email_address');
  208.         return \is_string($address) ? $address : [];
  209.     }
  210.     private function getMailTemplates(Applicant $applicant, ?VacancyDomain $vacancyDomain): array
  211.     {
  212.         if ($this->featureManager->isActive(FeatureFlagListener::FEATURE_VACANCY_KNOCKOUT_QUESTIONS)
  213.             && $applicant->isRejectedByKnockout()
  214.         ) {
  215.             $visitorRejectMail $this->getMail('site_applicant_applicant_reject_mail');
  216.             $ownerRejectMail $this->getMail('site_applicant_company_reject_email');
  217.             return [$visitorRejectMail$ownerRejectMail];
  218.         }
  219.         if (!$applicant->getVacancy()) {
  220.             $visitorOpenMail $this->getMail('site_applicant_open_applicant_mail');
  221.             $ownerOpenRejectMail $this->getMail('site_applicant_open_company_email');
  222.             return [$visitorOpenMail$ownerOpenRejectMail];
  223.         }
  224.         if ($vacancyDomain && $vacancyDomain->getMailSet()) {
  225.             return [
  226.                 $vacancyDomain->getMailSet()->getVisitorMailTemplate(),
  227.                 $vacancyDomain->getMailSet()->getOwnerMailTemplate(),
  228.             ];
  229.         }
  230.         $visitorMail $this->getMail('site_applicant_applicant_mail');
  231.         $ownerMail $this->getMail('site_applicant_company_email');
  232.         return [$visitorMail$ownerMail];
  233.     }
  234. }