src/App/EventSubscriber/App/RecurrentJobEventSubscriber.php line 1475

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\App;
  3. use App\Controller\ExternalPartnersApi\Gohiring\V1_4\PositionOpeningController;
  4. use App\Entity\ApplicationEvent;
  5. use App\Entity\ContentDistribution\ContentDistributor;
  6. use App\Entity\ExternalPartner\ExternalPartner;
  7. use App\Entity\ExternalPartner\IntegratedExternalPartnerCustomer;
  8. use App\Entity\PlatformEvent;
  9. use App\Entity\PlatformSite;
  10. use App\Enum\SyncRecurrentJobWithSearchesReason;
  11. use App\Event\RecurrentJobCreatedDuringProfileCreationEvent;
  12. use App\Event\RecurrentJobCreatedEvent;
  13. use App\Event\RecurrentJobDeactivatedEvent;
  14. use App\Event\RecurrentJobEditedEvent;
  15. use App\Event\RecurrentJobEvent;
  16. use App\Event\RecurrentJobExternalApplicationQuestionsWereImportedEvent;
  17. use App\Event\RecurrentJobPublishedEvent;
  18. use App\Event\RecurrentJobQuotaIncrementedDueToZipcodeChangeEvent;
  19. use App\Event\RecurrentJobReactivatedEvent;
  20. use App\Event\RecurrentJobSharePageRequestedEvent;
  21. use App\Event\RecurrentJobSkippedUsedQuotaIncreaseEvent;
  22. use App\Event\RecurrentJobUpdateAbortedBecauseZipcodeChangeNotPossibleEvent;
  23. use App\Event\RecurrentJobUpdatedEvent;
  24. use App\Event\RecurrentJobWillBeRemovedEvent;
  25. use App\Event\RecurrentJobWillForwardToExternalUrlEvent;
  26. use App\Service\AgenturFuerArbeitService;
  27. use App\Service\ApplicationEventService;
  28. use App\Service\ConversionEventService;
  29. use App\Service\DestatisEconomicSectorService;
  30. use App\Service\ExternalFeedsService;
  31. use App\Service\ExternalPartner\IntegratedExternalPartnerGohiringService;
  32. use App\Service\ExternalPartner\IntegratedExternalPartnerService;
  33. use App\Service\ExternalPartner\IntegratedExternalPartnerSoftgardenService;
  34. use App\Service\FeatureLimitationsService;
  35. use App\Service\GoogleIndexingApiService;
  36. use App\Service\NotificationService;
  37. use App\Service\PlatformEventService;
  38. use App\Service\ProfileService;
  39. use App\Service\RecurrentJobContentDistributionValueService;
  40. use App\Service\RecurrentJobService;
  41. use App\Service\RecurrentJobStatusService;
  42. use App\SymfonyMessage\SyncRecurrentJobWithSearchesSymfonyMessage;
  43. use App\Utility\DateTimeUtility;
  44. use App\Utility\RequestHelper;
  45. use Doctrine\ORM\EntityManagerInterface;
  46. use Exception;
  47. use Firebase\JWT\JWT;
  48. use FOS\ElasticaBundle\Persister\ObjectPersisterInterface;
  49. use JanusHercules\DatawarehouseIntegration\Domain\Entity\BusinessEvent;
  50. use JanusHercules\DatawarehouseIntegration\Domain\Entity\ExternalPartnerEvent;
  51. use JanusHercules\DatawarehouseIntegration\Domain\Service\BusinessEventDomainService;
  52. use JanusHercules\DatawarehouseIntegration\Domain\Service\ExternalPartnerEventDomainService;
  53. use JanusHercules\ExternalApplicationQuestions\Domain\Service\ExternalApplicationQuestionsDomainService;
  54. use JanusHercules\ExternalApplicationQuestions\Domain\SymfonyMessage\ImportExternalApplicationQuestionsSymfonyMessage;
  55. use JanusHercules\Jobradar\Domain\SymfonyMessage\CreateJobradarMatchTriggeredByRecurrentJobSymfonyMessage;
  56. use Psr\Log\LoggerInterface;
  57. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  58. use Symfony\Component\HttpFoundation\Request;
  59. use Symfony\Component\Messenger\MessageBusInterface;
  60. use Throwable;
  61. readonly class RecurrentJobEventSubscriber implements EventSubscriberInterface
  62. {
  63. public function __construct(
  64. private BusinessEventDomainService $businessEventDomainService,
  65. private NotificationService $notificationService,
  66. private ConversionEventService $conversionEventService,
  67. private ObjectPersisterInterface $recurrentJobsPersister,
  68. private IntegratedExternalPartnerService $integratedExternalPartnerService,
  69. private ExternalPartnerEventDomainService $externalPartnerEventDomainService,
  70. private GoogleIndexingApiService $googleIndexingApiService,
  71. private FeatureLimitationsService $featureLimitationsService,
  72. private PlatformEventService $platformEventService,
  73. private RecurrentJobContentDistributionValueService $recurrentJobContentDistributionValueService,
  74. private LoggerInterface $logger,
  75. private MessageBusInterface $messageBus,
  76. private RequestHelper $requestHelper,
  77. private ApplicationEventService $applicationEventService,
  78. private DestatisEconomicSectorService $destatisEconomicSectorService,
  79. private AgenturFuerArbeitService $agenturFuerArbeitService,
  80. private RecurrentJobService $recurrentJobService,
  81. private EntityManagerInterface $entityManager,
  82. private ProfileService $profileService,
  83. private RecurrentJobStatusService $recurrentJobStatusService
  84. ) {
  85. }
  86. public static function getSubscribedEvents(): array
  87. {
  88. return [
  89. RecurrentJobCreatedEvent::class => 'onRecurrentJobCreated',
  90. RecurrentJobCreatedDuringProfileCreationEvent::class => 'onRecurrentJobCreatedDuringProfileCreation',
  91. RecurrentJobPublishedEvent::class => 'onRecurrentJobPublished',
  92. RecurrentJobEditedEvent::class => 'onRecurrentJobEdited',
  93. RecurrentJobDeactivatedEvent::class => 'onRecurrentJobDeactivated',
  94. RecurrentJobReactivatedEvent::class => 'onRecurrentJobReactivated',
  95. RecurrentJobSharePageRequestedEvent::class => 'onRecurrentJobSharePageRequested',
  96. RecurrentJobWillForwardToExternalUrlEvent::class => 'onRecurrentJobWillForwardToExternalUrlEvent',
  97. RecurrentJobWillBeRemovedEvent::class => 'onRecurrentJobWillBeRemoved',
  98. RecurrentJobUpdatedEvent::class => 'onRecurrentJobUpdated',
  99. RecurrentJobExternalApplicationQuestionsWereImportedEvent::class => 'onRecurrentJobExternalApplicationQuestionsWereImported',
  100. RecurrentJobQuotaIncrementedDueToZipcodeChangeEvent::class => 'onRecurrentJobQuotaIncrementedDueToZipcodeChange',
  101. RecurrentJobUpdateAbortedBecauseZipcodeChangeNotPossibleEvent::class => 'onRecurrentJobUpdateAbortedBecauseZipcodeChangeNotPossible',
  102. RecurrentJobSkippedUsedQuotaIncreaseEvent::class => 'onRecurrentJobSkippedUsedQuotaIncrease',
  103. ];
  104. }
  105. public function onRecurrentJobQuotaIncrementedDueToZipcodeChange(
  106. RecurrentJobQuotaIncrementedDueToZipcodeChangeEvent $event
  107. ): void {
  108. $this->externalPartnerEventDomainService->writeEvent(
  109. ExternalPartnerEvent::EVENT_TYPE_USED_QUOTA_INCREMENTED_DUE_TO_CHANGED_ZIPCODE,
  110. $event->getRecurrentJob()->getExternalPartner(),
  111. $event->getRecurrentJob(),
  112. $event->getQuota(),
  113. null,
  114. null,
  115. null,
  116. null,
  117. $event->getRecurrentJob()->getJoboffererProfile()->getUser()
  118. );
  119. }
  120. public function onRecurrentJobUpdateAbortedBecauseZipcodeChangeNotPossible(
  121. RecurrentJobUpdateAbortedBecauseZipcodeChangeNotPossibleEvent $event
  122. ): void {
  123. $this->externalPartnerEventDomainService->writeEvent(
  124. ExternalPartnerEvent::EVENT_TYPE_RECURRENT_JOB_UPDATE_DENIED_BECAUSE_ZIPCODE_CHANGE_NOT_POSSIBLE,
  125. $event->getRecurrentJob()->getExternalPartner(),
  126. $event->getRecurrentJob(),
  127. null,
  128. null,
  129. null,
  130. null,
  131. null,
  132. $event->getRecurrentJob()->getJoboffererProfile()->getUser()
  133. );
  134. }
  135. /** @throws Exception */
  136. public function onRecurrentJobCreated(RecurrentJobEvent $event): void
  137. {
  138. if (!is_null($event->getRecurrentJob())
  139. && $event->getRecurrentJob()->isActive()
  140. ) {
  141. $this->messageBus->dispatch(
  142. new CreateJobradarMatchTriggeredByRecurrentJobSymfonyMessage(
  143. $event->getRecurrentJob()
  144. )
  145. );
  146. $this->messageBus->dispatch(
  147. new SyncRecurrentJobWithSearchesSymfonyMessage(
  148. $event->getRecurrentJob()->getId(),
  149. SyncRecurrentJobWithSearchesReason::CREATED
  150. )
  151. );
  152. if (ExternalApplicationQuestionsDomainService::recurrentJobCanHaveExternalApplicationQuestions($event->getRecurrentJob())) {
  153. $this->messageBus->dispatch(
  154. new ImportExternalApplicationQuestionsSymfonyMessage(
  155. $event->getRecurrentJob()
  156. )
  157. );
  158. }
  159. $this->businessEventDomainService->writeNewEvent(
  160. BusinessEvent::EVENT_TYPE_RECURRENT_JOB_PUBLISHED,
  161. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  162. $event->getRecurrentJob(),
  163. null,
  164. json_encode([
  165. 'isPlus' => $event->getRecurrentJob()->isPlus(),
  166. 'isFlex' => $this->featureLimitationsService->recurrentJobIsFlex($event->getRecurrentJob()),
  167. 'customer' => is_null($event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()) ? null : $event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()->getInternalId(),
  168. 'businessName' => $event->getRecurrentJob()->getBusinessName(),
  169. 'title' => $event->getRecurrentJob()->getTitle(),
  170. 'zipCode' => $event->getRecurrentJob()->getZipCode(),
  171. ])
  172. );
  173. }
  174. $customer = $event->getRecurrentJob()->getIntegratedExternalPartnerCustomer();
  175. $this->businessEventDomainService->writeNewEvent(
  176. BusinessEvent::EVENT_TYPE_RECURRENTJOB_CREATED,
  177. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  178. $event->getRecurrentJob(),
  179. null,
  180. json_encode(
  181. [
  182. 'recurrentJobId' => $event->getRecurrentJob()->getId(),
  183. 'userCreatedVia' => $event->getRecurrentJob()->getJoboffererProfile()->getUser()->getCreatedVia(),
  184. 'isPlus' => $event->getRecurrentJob()->isPlus(),
  185. 'isFlex' => $this->featureLimitationsService->recurrentJobIsFlex($event->getRecurrentJob()),
  186. 'applicationType' => $event->getRecurrentJob()->getApplicationType(),
  187. 'jobBoardProductId' => $event->getRecurrentJob()->getExternalPartnerRecurrentJobAdditionalInfoStringValueByName(
  188. IntegratedExternalPartnerGohiringService::RECURRENT_JOB_ADDITIONAL_INFO_STRING_VALUE_NAME_GOHIRING_JOB_BOARD_PRODUCT_ID
  189. ),
  190. 'customer' => is_null($customer) ? null : $customer->getInternalId(),
  191. 'businessName' => $event->getRecurrentJob()->getBusinessName(),
  192. 'title' => $event->getRecurrentJob()->getTitle(),
  193. 'zipCode' => $event->getRecurrentJob()->getZipCode(),
  194. ])
  195. );
  196. $this->notificationService->uncancelNotification(
  197. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  198. NotificationService::NOTIFICATION_TYPE_UNREAD_CONVERSATION_MESSAGES
  199. );
  200. $this->conversionEventService->handleConversionGoalReached(
  201. ConversionEventService::CAMPAIGN_ID_NOTIFICATION,
  202. NotificationService::NOTIFICATION_TYPE_MISSING_RECURRENT_JOBS
  203. );
  204. $this->conversionEventService->handleConversionGoalReached(
  205. ConversionEventService::CAMPAIGN_ID_JOBOO_MAILING_VONOVIA_2020_07_14,
  206. 0
  207. );
  208. if ($event->getRecurrentJob()->belongsToExternalPartner()) {
  209. switch ($event->getRecurrentJob()->getExternalPartner()->getId()) {
  210. case ExternalPartner::ID_GERMAN_PERSONNEL_FEED:
  211. $businessEventType = BusinessEvent::EVENT_TYPE_GERMAN_PERSONNEL_NEW_RECURRENT_JOB_CREATED;
  212. break;
  213. case ExternalPartner::ID_HAYS_FEED:
  214. $businessEventType = BusinessEvent::EVENT_TYPE_HAYS_NEW_RECURRENT_JOB_CREATED;
  215. break;
  216. case ExternalPartner::ID_MYSTAFFPILOT_FEED:
  217. $businessEventType = BusinessEvent::EVENT_TYPE_MYSTAFFPILOT_NEW_RECURRENT_JOB_CREATED;
  218. break;
  219. case ExternalPartner::ID_REWE_FEED:
  220. $businessEventType = BusinessEvent::EVENT_TYPE_REWE_NEW_RECURRENT_JOB_CREATED;
  221. break;
  222. default:
  223. $businessEventType = null;
  224. }
  225. if (!is_null($businessEventType)) {
  226. $this->businessEventDomainService->writeNewEvent(
  227. $businessEventType,
  228. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  229. $event->getRecurrentJob(),
  230. null,
  231. json_encode([
  232. 'externalId' => $this->integratedExternalPartnerService->getExternalIdForRecurrentJob($event->getRecurrentJob()),
  233. 'externalPartner' => $event->getRecurrentJob()->getExternalPartner()->getId(),
  234. 'occupationalFieldSearchterm' => $event->getRecurrentJob()->getOccupationalFieldSearchterm(),
  235. 'additionalSearchterms' => $event->getRecurrentJob()->getAdditionalOccupationalFieldSearchterms(),
  236. 'employmentType' => $event->getRecurrentJob()->getEmploymentTypes(),
  237. 'careerLevel' => $event->getRecurrentJob()->getCareerLevels(),
  238. 'businessName' => $event->getRecurrentJob()->getJoboffererProfile()->getBusinessName(),
  239. 'economicSector' => $event->getRecurrentJob()->getJoboffererProfile()->getEconomicSector(),
  240. 'titel' => $event->getRecurrentJob()->getTitle(),
  241. 'zipCode' => $event->getRecurrentJob()->getZipCode(),
  242. 'internalId' => $event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()->getInternalId(),
  243. ])
  244. );
  245. }
  246. $this->externalPartnerEventDomainService->writeEvent(
  247. ExternalPartnerEvent::EVENT_TYPE_RECURRENT_JOB_CREATED,
  248. $event->getRecurrentJob()->getExternalPartner(),
  249. $event->getRecurrentJob(),
  250. null,
  251. null,
  252. null,
  253. null,
  254. null,
  255. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  256. null
  257. );
  258. if (!is_null($event->getRecurrentJob()->getQuota())) {
  259. $this->businessEventDomainService->writeNewEvent(
  260. BusinessEvent::EVENT_TYPE_NEW_BILLING_FOR_EXTERNAL_RECURRENT_JOB,
  261. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  262. $event->getRecurrentJob(),
  263. null,
  264. json_encode([
  265. 'externalId' => $this->integratedExternalPartnerService->getExternalIdForRecurrentJob($event->getRecurrentJob()),
  266. 'externalPartner' => $event->getRecurrentJob()->getExternalPartner()->getId(),
  267. 'quotaId' => $event->getRecurrentJob()->getQuota()->getId(),
  268. 'userCreatedVia' => $event->getRecurrentJob()->getJoboffererProfile()->getUser()->getCreatedVia(),
  269. 'customer' => is_null($event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()) ? null : $event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()->getInternalId()
  270. ])
  271. );
  272. $this->businessEventDomainService->writeNewEvent(
  273. BusinessEvent::EVENT_TYPE_USED_QUOTA_VALUE_RAISED,
  274. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  275. $event->getRecurrentJob(),
  276. null,
  277. json_encode([
  278. 'quotaId' => $event->getRecurrentJob()->getQuota()->getId(),
  279. 'recurrentJobId' => $event->getRecurrentJob()->getId(),
  280. 'customerId' => $event->getRecurrentJob()->getQuota()->getIntegratedExternalPartnerCustomer()->getId(),
  281. 'customerInternalId' => $event->getRecurrentJob()->getQuota()->getIntegratedExternalPartnerCustomer()->getInternalId(),
  282. 'customerBusinessName' => $event->getRecurrentJob()->getQuota()->getIntegratedExternalPartnerCustomer()->getBusinessName(),
  283. 'userCreatedVia' => $event->getRecurrentJob()->getJoboffererProfile()->getUser()->getCreatedVia(),
  284. 'businessName' => $event->getRecurrentJob()->getBusinessName(),
  285. 'title' => $event->getRecurrentJob()->getTitle(),
  286. 'zipCode' => $event->getRecurrentJob()->getZipCode(),
  287. ])
  288. );
  289. }
  290. }
  291. $this->destatisEconomicSectorService->setDestatisEconomicSectorBasedOnOccupationalFieldSearchtermIfPossible($event->getRecurrentJob());
  292. $this->agenturFuerArbeitService->checkIfRecurrentJobCanBeAutomaticallyMatchedToAfaProfession($event->getRecurrentJob());
  293. $this->agenturFuerArbeitService->queueReminderMailingForAfaCategorizationIfNecessary($event->getRecurrentJob());
  294. }
  295. /**
  296. * @throws Exception
  297. */
  298. public function onRecurrentJobCreatedDuringProfileCreation(RecurrentJobEvent $event): void
  299. {
  300. if (!is_null($event->getRecurrentJob())
  301. && $event->getRecurrentJob()->isActive()
  302. ) {
  303. $this->messageBus->dispatch(
  304. new CreateJobradarMatchTriggeredByRecurrentJobSymfonyMessage(
  305. $event->getRecurrentJob()
  306. )
  307. );
  308. $this->messageBus->dispatch(
  309. new SyncRecurrentJobWithSearchesSymfonyMessage(
  310. $event->getRecurrentJob()->getId(),
  311. SyncRecurrentJobWithSearchesReason::CREATED_DURING_PROFILE_CREATION
  312. )
  313. );
  314. $this->businessEventDomainService->writeNewEvent(
  315. BusinessEvent::EVENT_TYPE_RECURRENT_JOB_PUBLISHED,
  316. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  317. $event->getRecurrentJob(),
  318. null,
  319. json_encode([
  320. 'isPlus' => $event->getRecurrentJob()->isPlus(),
  321. 'isFlex' => $this->featureLimitationsService->recurrentJobIsFlex($event->getRecurrentJob()),
  322. 'customer' => is_null($event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()) ? null : $event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()->getInternalId(),
  323. 'businessName' => $event->getRecurrentJob()->getBusinessName(),
  324. 'title' => $event->getRecurrentJob()->getTitle(),
  325. 'zipCode' => $event->getRecurrentJob()->getZipCode(),
  326. ])
  327. );
  328. }
  329. $this->businessEventDomainService->writeNewEvent(
  330. BusinessEvent::EVENT_TYPE_RECURRENTJOB_CREATED_DURING_PROFILE_CREATION,
  331. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  332. $event->getRecurrentJob(),
  333. null,
  334. json_encode($event->getRecurrentJob()->getId())
  335. );
  336. $this->agenturFuerArbeitService->checkIfRecurrentJobCanBeAutomaticallyMatchedToAfaProfession($event->getRecurrentJob());
  337. $this->agenturFuerArbeitService->queueReminderMailingForAfaCategorizationIfNecessary($event->getRecurrentJob());
  338. }
  339. /**
  340. * @throws Exception
  341. */
  342. public function onRecurrentJobPublished(RecurrentJobEvent $event): void
  343. {
  344. if (!is_null($event->getRecurrentJob())) {
  345. $this->messageBus->dispatch(
  346. new CreateJobradarMatchTriggeredByRecurrentJobSymfonyMessage(
  347. $event->getRecurrentJob()
  348. )
  349. );
  350. $this->messageBus->dispatch(
  351. new SyncRecurrentJobWithSearchesSymfonyMessage(
  352. $event->getRecurrentJob()->getId(),
  353. SyncRecurrentJobWithSearchesReason::PUBLISHED
  354. )
  355. );
  356. $this->businessEventDomainService->writeNewEvent(
  357. BusinessEvent::EVENT_TYPE_RECURRENT_JOB_PUBLISHED,
  358. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  359. $event->getRecurrentJob(),
  360. null,
  361. json_encode([
  362. 'isPlus' => $event->getRecurrentJob()->isPlus(),
  363. 'isFlex' => $this->featureLimitationsService->recurrentJobIsFlex($event->getRecurrentJob()),
  364. 'customer' => is_null($event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()) ? null : $event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()->getInternalId(),
  365. 'businessName' => $event->getRecurrentJob()->getBusinessName(),
  366. 'title' => $event->getRecurrentJob()->getTitle(),
  367. 'zipCode' => $event->getRecurrentJob()->getZipCode(),
  368. ])
  369. );
  370. $this->recurrentJobService->sendAlertEmailAboutJoboffererWithCriticalNumberOfRecurrentJobsIfNecessary($event->getRecurrentJob()->getJoboffererProfile());
  371. }
  372. }
  373. public function onRecurrentJobExternalApplicationQuestionsWereImported(
  374. RecurrentJobExternalApplicationQuestionsWereImportedEvent $event
  375. ): void {
  376. if (is_null($event->getRecurrentJob())) {
  377. return;
  378. }
  379. $this->externalPartnerEventDomainService->writeEvent(
  380. ExternalPartnerEvent::EVENT_TYPE_IMPORTED_EXTERNAL_APPLICATION_QUESTIONS,
  381. $event->getRecurrentJob()->getExternalPartner(),
  382. $event->getRecurrentJob(),
  383. null,
  384. null,
  385. null,
  386. null,
  387. null,
  388. $event->getRecurrentJob()->getJoboffererProfile()->getUser()
  389. );
  390. }
  391. /** @throws Exception */
  392. public function onRecurrentJobEdited(RecurrentJobEvent $event): void
  393. {
  394. if (!is_null($event->getRecurrentJob())
  395. && $event->getRecurrentJob()->isActive()
  396. ) {
  397. $this->messageBus->dispatch(
  398. new CreateJobradarMatchTriggeredByRecurrentJobSymfonyMessage(
  399. $event->getRecurrentJob()
  400. )
  401. );
  402. $this->messageBus->dispatch(
  403. new SyncRecurrentJobWithSearchesSymfonyMessage(
  404. $event->getRecurrentJob()->getId(),
  405. SyncRecurrentJobWithSearchesReason::EDITED
  406. )
  407. );
  408. }
  409. $this->businessEventDomainService->writeNewEvent(
  410. BusinessEvent::EVENT_TYPE_RECURRENTJOB_EDITED,
  411. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  412. $event->getRecurrentJob(),
  413. null,
  414. json_encode(
  415. [
  416. 'recurrentJobId' => $event->getRecurrentJob()->getId(),
  417. 'isPlus' => $event->getRecurrentJob()->isPlus(),
  418. 'isFlex' => $this->featureLimitationsService->recurrentJobIsFlex($event->getRecurrentJob()),
  419. 'applicationType' => $event->getRecurrentJob()->getApplicationType()
  420. ]
  421. )
  422. );
  423. $this->destatisEconomicSectorService->setDestatisEconomicSectorBasedOnOccupationalFieldSearchtermIfPossible($event->getRecurrentJob());
  424. $this->notificationService->uncancelNotification(
  425. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  426. NotificationService::NOTIFICATION_TYPE_UNREAD_CONVERSATION_MESSAGES
  427. );
  428. if ($event->getRecurrentJob()->isFindable()) {
  429. $this->recurrentJobsPersister->replaceOne($event->getRecurrentJob());
  430. }
  431. }
  432. public function onRecurrentJobDeactivated(RecurrentJobDeactivatedEvent $event): void
  433. {
  434. if (!is_null($event->getRecurrentJob())) {
  435. $this->messageBus->dispatch(
  436. new SyncRecurrentJobWithSearchesSymfonyMessage(
  437. $event->getRecurrentJob()->getId(),
  438. SyncRecurrentJobWithSearchesReason::DEACTIVATED
  439. )
  440. );
  441. }
  442. $recurrentJob = $event->getRecurrentJob();
  443. $integratedExternalPartnerCustomer = null;
  444. if (!is_null($recurrentJob)) {
  445. $integratedExternalPartnerCustomer = $recurrentJob->getIntegratedExternalPartnerCustomer();
  446. }
  447. $this->businessEventDomainService->writeNewEvent(
  448. BusinessEvent::EVENT_TYPE_RECURRENT_JOB_DEACTIVATED,
  449. $recurrentJob->getJoboffererProfile()->getUser(),
  450. $recurrentJob,
  451. null,
  452. json_encode(
  453. [
  454. 'isPlus' => $recurrentJob->isPlus(),
  455. 'isFlex' => $this->featureLimitationsService->recurrentJobIsFlex($recurrentJob),
  456. 'remainingActiveRecurrentJobs' => $this->recurrentJobStatusService->getNumberOfActiveRecurrentJobsFromJoboffererProfile($recurrentJob->getJoboffererProfile()),
  457. 'businessName' => $recurrentJob->getBusinessName(),
  458. 'title' => $recurrentJob->getTitle(),
  459. 'zipCode' => $recurrentJob->getZipCode(),
  460. 'internalId' => !is_null($integratedExternalPartnerCustomer) ? $integratedExternalPartnerCustomer->getInternalId() : null,
  461. ]
  462. )
  463. );
  464. if ($recurrentJob->belongsToExternalPartner()) {
  465. $this->externalPartnerEventDomainService->writeEvent(
  466. ExternalPartnerEvent::EVENT_TYPE_RECURRENT_JOB_DEACTIVATED,
  467. $recurrentJob->getExternalPartner(),
  468. $recurrentJob,
  469. $recurrentJob->getQuota(),
  470. null,
  471. null,
  472. null,
  473. null,
  474. $recurrentJob->getJoboffererProfile()->getUser()
  475. );
  476. }
  477. }
  478. /**
  479. * @throws Exception
  480. */
  481. public function onRecurrentJobSharePageRequested(RecurrentJobSharePageRequestedEvent $event): void
  482. {
  483. $request = $event->getRequest();
  484. $recurrentJob = $event->getRecurrentJob();
  485. $user = $event->getRequestingUser();
  486. if ((int)DateTimeUtility::createDateTimeCet()->format('Ym') > 202209) { // We want a clean cutoff for bot-filtered tracking on October 1, 2022
  487. if ($this->requestHelper::isBotOrCrawlerRequest($request)) {
  488. $this->applicationEventService->writeNewEvent(
  489. ApplicationEvent::EVENT_CATEGORY_INFO,
  490. ApplicationEvent::EVENT_TYPE_RECURRENT_JOB_SHARE_PAGE_WAS_REQUESTED_BY_BOT,
  491. null,
  492. null,
  493. null,
  494. json_encode([
  495. 'recurrentJobId' => !is_null($event->getRecurrentJob()) ? $event->getRecurrentJob()->getId() : null,
  496. 'requestHeaderUserAgent' => $request->headers->get('User-Agent'),
  497. 'requestHeaderXForwardedFor' => $request->headers->get('X-Forwarded-For'),
  498. 'realClientIpAddress' => RequestHelper::getRealClientIpAddress($request),
  499. ])
  500. );
  501. return; // No further event tracking / handling if this is a bot request
  502. }
  503. }
  504. $this->conversionEventService->initiateGoalReachedConversionTrackingBasedOnRequest(
  505. $request,
  506. $user
  507. );
  508. if (!is_null($recurrentJob)) {
  509. if ($this->featureLimitationsService->recurrentJobMustDisplayExtendedApplicationForm($recurrentJob, $user)) {
  510. $this->conversionEventService->initiateGoalReachedConversionTracking($user, ConversionEventService::CAMPAIGN_ID_EXTENDED_APPLICATION, is_null($user) ? 0 : 1, $recurrentJob, $request);
  511. }
  512. }
  513. $this->conversionEventService->handleRequest($request);
  514. $this->conversionEventService->handleConversionGoalReached(ConversionEventService::CAMPAIGN_ID_INTEGRATED_EXTERNAL_PARTNER_CUSTOMER_PREMIUM_RADAR, 1, $request, $user, $recurrentJob);
  515. if (!is_null($recurrentJob) && $recurrentJob->belongsToExternalPartner()) {
  516. $this->externalPartnerEventDomainService->writeEvent(
  517. ExternalPartnerEvent::EVENT_TYPE_RECURRENT_JOB_SHARE_PAGE_REQUESTED,
  518. $recurrentJob->getExternalPartner(),
  519. $recurrentJob,
  520. null,
  521. null,
  522. null,
  523. null,
  524. null,
  525. $user,
  526. $request,
  527. $event->getConversionCampaignId(),
  528. $event->getPlatformSiteId()
  529. );
  530. }
  531. if (!is_null($premiumRadarContext = $request->get('premiumRadarContext', null))) {
  532. $this->businessEventDomainService->writeNewEvent(BusinessEvent::EVENT_TYPE_INTEGRATED_EXTERNAL_PARTNER_CUSTOMER_PREMIUM_RADAR_LINK_CLICKED, $user, $recurrentJob, null, json_encode(['premiumRadarContext' => $premiumRadarContext, 'externalPartnerForwarding' => 'false', 'relatedWantedJobId' => $request->get('relatedWantedJobId', null)]));
  533. }
  534. if (!is_null($recurrentJob)
  535. && !is_null($request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID))
  536. && ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_TALENTCOM
  537. || (int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_JOBLIFT
  538. || (int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_EBAY
  539. || (int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_JOBWARE
  540. || (int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_GOOGLE_FOR_JOBS
  541. || (int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_AGENTUR_FUER_ARBEIT
  542. || (int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_INDEED_RECRUIT_DL_CONTENT_DISTRIBUTION_VIA_XML_FEED
  543. || (int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_STELLENONLINE
  544. || (int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_MEINESTADT
  545. )
  546. ) {
  547. $additionalData = [];
  548. $additionalData['directForwarding'] = (
  549. $recurrentJob->belongsToIntegratedExternalPartnerCustomer()
  550. && $this->featureLimitationsService->recurrentJobMustLinkExternally($recurrentJob)
  551. && $recurrentJob->getIntegratedExternalPartnerCustomer()->isDirectForwarded()
  552. );
  553. if ($recurrentJob->belongsToIntegratedExternalPartnerCustomer()) {
  554. $additionalData['internalId'] = $recurrentJob->getIntegratedExternalPartnerCustomer()->getInternalId();
  555. }
  556. $additionalData['title'] = $recurrentJob->getTitle();
  557. $additionalData['zipCode'] = $recurrentJob->getZipcode();
  558. $additionalData['recurrentJobId'] = $recurrentJob->getId();
  559. $additionalData['occupationalFieldSearchterm'] = $recurrentJob->getOccupationalFieldSearchterm();
  560. if (!is_null($recurrentJob->getJoboffererProfile())
  561. && !is_null($recurrentJob->getJoboffererProfile()->getEconomicSector())
  562. && !is_null($recurrentJob->getJoboffererProfile()->getEconomicSector()->getTitle())
  563. ) {
  564. $additionalData['economicSector'] = $recurrentJob->getJoboffererProfile()->getEconomicSector()->getTitle();
  565. $additionalData['businessName'] = $recurrentJob->getJoboffererProfile()->getBusinessName();
  566. }
  567. if ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_TALENTCOM) {
  568. /** @var ContentDistributor $contentDistributor */
  569. $contentDistributor = $this->entityManager->find(ContentDistributor::class, ExternalFeedsService::EXTERNAL_FEED_TALENTCOM);
  570. $clickPrice = $this->recurrentJobContentDistributionValueService->getCpcForXmlFeed($recurrentJob, $contentDistributor);
  571. if (is_null($clickPrice) || !is_numeric($clickPrice)) {
  572. $clickPrice = 0.00;
  573. }
  574. $additionalData['clickPrice'] = $clickPrice;
  575. $this->businessEventDomainService->writeNewEvent(
  576. BusinessEvent::EVENT_TYPE_TALENTCOM_LINK_CLICKED,
  577. $user,
  578. $recurrentJob,
  579. null,
  580. json_encode($additionalData)
  581. );
  582. if ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_A_FEED) {
  583. $this->platformEventService->eventHasOccurred(
  584. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_TALENTCOM_A_FEED,
  585. $recurrentJob->getId()
  586. );
  587. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_B_FEED) {
  588. $this->platformEventService->eventHasOccurred(
  589. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_TALENTCOM_B_FEED,
  590. $recurrentJob->getId()
  591. );
  592. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_C_FEED) {
  593. $this->platformEventService->eventHasOccurred(
  594. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_TALENTCOM_C_FEED,
  595. $recurrentJob->getId()
  596. );
  597. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_D_FEED) {
  598. $this->platformEventService->eventHasOccurred(
  599. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_TALENTCOM_D_FEED,
  600. $recurrentJob->getId()
  601. );
  602. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_E_FEED) {
  603. $this->platformEventService->eventHasOccurred(
  604. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_TALENTCOM_E_FEED,
  605. $recurrentJob->getId()
  606. );
  607. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_F_FEED) {
  608. $this->platformEventService->eventHasOccurred(
  609. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_TALENTCOM_F_FEED,
  610. $recurrentJob->getId()
  611. );
  612. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_G_FEED) {
  613. $this->platformEventService->eventHasOccurred(
  614. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_TALENTCOM_G_FEED,
  615. $recurrentJob->getId()
  616. );
  617. }
  618. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_JOBLIFT) {
  619. $this->businessEventDomainService->writeNewEvent(
  620. BusinessEvent::EVENT_TYPE_JOBLIFT_LINK_CLICKED,
  621. $user,
  622. $recurrentJob,
  623. null,
  624. json_encode($additionalData)
  625. );
  626. if ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_A_FEED) {
  627. $this->platformEventService->eventHasOccurred(
  628. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_A_FEED,
  629. $recurrentJob->getId()
  630. );
  631. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_B_FEED) {
  632. $this->platformEventService->eventHasOccurred(
  633. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_B_FEED,
  634. $recurrentJob->getId()
  635. );
  636. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_C_FEED) {
  637. $this->platformEventService->eventHasOccurred(
  638. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_C_FEED,
  639. $recurrentJob->getId()
  640. );
  641. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_D_FEED) {
  642. $this->platformEventService->eventHasOccurred(
  643. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_D_FEED,
  644. $recurrentJob->getId()
  645. );
  646. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_E_FEED) {
  647. $this->platformEventService->eventHasOccurred(
  648. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_E_FEED,
  649. $recurrentJob->getId()
  650. );
  651. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_F_FEED) {
  652. $this->platformEventService->eventHasOccurred(
  653. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_F_FEED,
  654. $recurrentJob->getId()
  655. );
  656. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_G_FEED) {
  657. $this->platformEventService->eventHasOccurred(
  658. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_G_FEED,
  659. $recurrentJob->getId()
  660. );
  661. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_M_FEED) {
  662. $this->platformEventService->eventHasOccurred(
  663. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_M_FEED,
  664. $recurrentJob->getId()
  665. );
  666. }
  667. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_EBAY) {
  668. $this->businessEventDomainService->writeNewEvent(
  669. BusinessEvent::EVENT_TYPE_EBAY_LINK_CLICKED,
  670. $user,
  671. $recurrentJob,
  672. null,
  673. json_encode($additionalData)
  674. );
  675. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_JOBWARE) {
  676. $this->businessEventDomainService->writeNewEvent(
  677. BusinessEvent::EVENT_TYPE_JOBWARE_LINK_CLICKED,
  678. $user,
  679. $recurrentJob,
  680. null,
  681. json_encode($additionalData)
  682. );
  683. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_STELLENONLINE) {
  684. $this->businessEventDomainService->writeNewEvent(
  685. BusinessEvent::EVENT_TYPE_STELLENONLINE_LINK_CLICKED,
  686. $user,
  687. $recurrentJob,
  688. null,
  689. json_encode($additionalData)
  690. );
  691. if ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_A_FEED) {
  692. $this->platformEventService->eventHasOccurred(
  693. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_A_FEED,
  694. $recurrentJob->getId()
  695. );
  696. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_B_FEED) {
  697. $this->platformEventService->eventHasOccurred(
  698. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_B_FEED,
  699. $recurrentJob->getId()
  700. );
  701. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_C_FEED) {
  702. $this->platformEventService->eventHasOccurred(
  703. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_C_FEED,
  704. $recurrentJob->getId()
  705. );
  706. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_D_FEED) {
  707. $this->platformEventService->eventHasOccurred(
  708. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_D_FEED,
  709. $recurrentJob->getId()
  710. );
  711. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_E_FEED) {
  712. $this->platformEventService->eventHasOccurred(
  713. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_E_FEED,
  714. $recurrentJob->getId()
  715. );
  716. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_F_FEED) {
  717. $this->platformEventService->eventHasOccurred(
  718. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_F_FEED,
  719. $recurrentJob->getId()
  720. );
  721. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_G_FEED) {
  722. $this->platformEventService->eventHasOccurred(
  723. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_G_FEED,
  724. $recurrentJob->getId()
  725. );
  726. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_M_FEED) {
  727. $this->platformEventService->eventHasOccurred(
  728. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_M_FEED,
  729. $recurrentJob->getId()
  730. );
  731. }
  732. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_JOOBLE) {
  733. $this->businessEventDomainService->writeNewEvent(
  734. BusinessEvent::EVENT_TYPE_JOOBLE_LINK_CLICKED,
  735. $user,
  736. $recurrentJob,
  737. null,
  738. json_encode($additionalData)
  739. );
  740. if ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_A_FEED) {
  741. $this->platformEventService->eventHasOccurred(
  742. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOOBLE_A_FEED,
  743. $recurrentJob->getId()
  744. );
  745. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_B_FEED) {
  746. $this->platformEventService->eventHasOccurred(
  747. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOOBLE_B_FEED,
  748. $recurrentJob->getId()
  749. );
  750. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_C_FEED) {
  751. $this->platformEventService->eventHasOccurred(
  752. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOOBLE_C_FEED,
  753. $recurrentJob->getId()
  754. );
  755. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_D_FEED) {
  756. $this->platformEventService->eventHasOccurred(
  757. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOOBLE_D_FEED,
  758. $recurrentJob->getId()
  759. );
  760. }
  761. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_MEINESTADT) {
  762. $this->businessEventDomainService->writeNewEvent(
  763. BusinessEvent::EVENT_TYPE_MEINESTADT_LINK_CLICKED,
  764. $user,
  765. $recurrentJob,
  766. null,
  767. json_encode($additionalData)
  768. );
  769. if ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_A_FEED) {
  770. $this->platformEventService->eventHasOccurred(
  771. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_A_FEED,
  772. $recurrentJob->getId()
  773. );
  774. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_B_FEED) {
  775. $this->platformEventService->eventHasOccurred(
  776. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_B_FEED,
  777. $recurrentJob->getId()
  778. );
  779. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_C_FEED) {
  780. $this->platformEventService->eventHasOccurred(
  781. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_C_FEED,
  782. $recurrentJob->getId()
  783. );
  784. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_H_FEED) {
  785. $this->platformEventService->eventHasOccurred(
  786. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_H_FEED,
  787. $recurrentJob->getId()
  788. );
  789. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_I_FEED) {
  790. $this->platformEventService->eventHasOccurred(
  791. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_I_FEED,
  792. $recurrentJob->getId()
  793. );
  794. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_J_FEED) {
  795. $this->platformEventService->eventHasOccurred(
  796. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_J_FEED,
  797. $recurrentJob->getId()
  798. );
  799. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_K_FEED) {
  800. $this->platformEventService->eventHasOccurred(
  801. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_K_FEED,
  802. $recurrentJob->getId()
  803. );
  804. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_L_FEED) {
  805. $this->platformEventService->eventHasOccurred(
  806. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_L_FEED,
  807. $recurrentJob->getId()
  808. );
  809. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_M_FEED) {
  810. $this->platformEventService->eventHasOccurred(
  811. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_M_FEED,
  812. $recurrentJob->getId()
  813. );
  814. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID, -1) === ExternalFeedsService::EXTERNAL_FEED_SUBCAMPAIGN_ID_N_FEED) {
  815. $this->platformEventService->eventHasOccurred(
  816. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_N_FEED,
  817. $recurrentJob->getId()
  818. );
  819. }
  820. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_AGENTUR_FUER_ARBEIT) {
  821. $this->businessEventDomainService->writeNewEvent(
  822. BusinessEvent::EVENT_TYPE_AGENTUR_FUER_ARBEIT_LINK_CLICKED,
  823. $user,
  824. $recurrentJob,
  825. null,
  826. json_encode($additionalData)
  827. );
  828. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_GOOGLE_FOR_JOBS) {
  829. $this->businessEventDomainService->writeNewEvent(
  830. BusinessEvent::EVENT_TYPE_GOOGLE_FOR_JOBS_LINK_CLICKED,
  831. $user,
  832. $recurrentJob,
  833. null,
  834. json_encode($additionalData)
  835. );
  836. } elseif ((int)$request->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1) === ConversionEventService::CAMPAIGN_ID_INDEED_RECRUIT_DL_CONTENT_DISTRIBUTION_VIA_XML_FEED) {
  837. $this->platformEventService->eventHasOccurred(
  838. PlatformEvent::EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_INDEED_FEED,
  839. $recurrentJob->getId()
  840. );
  841. }
  842. }
  843. if ($event->getPlatformSiteId() === PlatformSite::PLATFORM_SITE_ID_RECRUIT_DL) {
  844. $this->conversionEventService->initiateGoalReachedConversionTracking(
  845. $user,
  846. ConversionEventService::CAMPAIGN_ID_RECRUIT_DL_LANDINGPAGE,
  847. $this->featureLimitationsService->recurrentJobMustLinkExternally($recurrentJob) ? 1 : 0,
  848. $recurrentJob,
  849. $request
  850. );
  851. $additionalData = [
  852. 'occupationalFieldSearchterm' => $recurrentJob->getOccupationalFieldSearchterm(),
  853. 'recurrentJobId' => null
  854. ];
  855. if (!is_null($recurrentJob)) {
  856. $additionalData = [
  857. ...$additionalData,
  858. 'recurrentJobId' => $recurrentJob,
  859. 'titel' => $recurrentJob->getTitle(),
  860. 'businessName' => $recurrentJob->getBusinessName(),
  861. 'zipCode' => $recurrentJob->getZipCode(),
  862. ];
  863. }
  864. if ($recurrentJob->belongsToIntegratedExternalPartnerCustomer()) {
  865. $additionalData = [
  866. ...$additionalData,
  867. 'internalId' => $recurrentJob->getIntegratedExternalPartnerCustomer()->getInternalId(),
  868. ];
  869. }
  870. if (!is_null($recurrentJob)
  871. && !is_null($recurrentJob->getJoboffererProfile())
  872. && !is_null($recurrentJob->getJoboffererProfile()->getEconomicSector())
  873. && !is_null($recurrentJob->getJoboffererProfile()->getEconomicSector()->getTitle())
  874. ) {
  875. $additionalData = [
  876. ...$additionalData,
  877. 'economicSector' => $recurrentJob->getJoboffererProfile()->getEconomicSector()->getTitle(),
  878. ];
  879. }
  880. $this->businessEventDomainService->writeNewEvent(
  881. BusinessEvent::EVENT_TYPE_INDEED_RECRUIT_DL_LANDINGPAGE_SHOWN,
  882. null,
  883. $recurrentJob,
  884. null,
  885. json_encode($additionalData)
  886. );
  887. }
  888. if ($event->getPlatformSiteId() === PlatformSite::PLATFORM_SITE_ID_JOBOO_ONLINE) {
  889. if (!is_null($recurrentJob)
  890. && !is_null($recurrentJob->getJoboffererProfile())
  891. && !is_null($recurrentJob->getJoboffererProfile()->getEconomicSector())
  892. && !is_null($recurrentJob->getJoboffererProfile()->getEconomicSector()->getTitle())
  893. ) {
  894. $additionalData = json_encode(['occupationalFieldSearchterm' => $recurrentJob->getOccupationalFieldSearchterm(), 'economicSector' => $recurrentJob->getJoboffererProfile()->getEconomicSector()->getTitle(), 'recurrentJobId' => $recurrentJob->getId()]);
  895. } else {
  896. $additionalData = json_encode(['occupationalFieldSearchterm' => $recurrentJob->getOccupationalFieldSearchterm(), 'recurrentJobId' => $recurrentJob->getId()]);
  897. }
  898. $this->businessEventDomainService->writeNewEvent(
  899. BusinessEvent::EVENT_TYPE_JOBOO_ONLINE_LANDINGPAGE_SHOWN,
  900. null,
  901. $recurrentJob,
  902. null,
  903. $additionalData
  904. );
  905. }
  906. }
  907. /** @throws Exception */
  908. public function onRecurrentJobWillForwardToExternalUrlEvent(
  909. RecurrentJobWillForwardToExternalUrlEvent $event
  910. ): void {
  911. if (!is_null($event->getRecurrentJob()->getExternalPartner())) {
  912. $this->externalPartnerEventDomainService->writeEvent(
  913. ExternalPartnerEvent::EVENT_TYPE_USER_HAS_BEEN_FORWARDED_TO_EXTERNAL_JOB_POST_THAT_IS_RECURRENT_JOB,
  914. $event->getRecurrentJob()->getExternalPartner(),
  915. $event->getRecurrentJob(),
  916. null,
  917. null,
  918. null,
  919. null,
  920. null,
  921. $event->getUser(),
  922. $event->getRequest(),
  923. $event->getConversionCampaignId(),
  924. $event->getPlatformSiteId()
  925. );
  926. }
  927. if (!$event->getRecurrentJob()->isLinkedToExternalPartner() && !is_null($event->getRequest()) && !is_null($event->getRequest()->query) && $event->getRequest()->query->get('directForwarding', 'false') === 'true') {
  928. $this->conversionEventService->initiateGoalReachedConversionTrackingBasedOnRequest(
  929. $event->getRequest(),
  930. $event->getUser()
  931. );
  932. }
  933. foreach ([0, 1, 2, 3, 4, 5, 6, 7] as $subcampaignId) {
  934. $this->conversionEventService->handleConversionGoalReached(
  935. ConversionEventService::CAMPAIGN_ID_RECURRENT_JOBS_SEARCH_FOR_ONE_SPECIFIC_CUSTOMER,
  936. $subcampaignId,
  937. $event->getRequest(),
  938. $event->getUser(),
  939. $event->getRecurrentJob(),
  940. null,
  941. null,
  942. !is_null($event->getRecurrentJob())
  943. ? $event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()
  944. : null
  945. );
  946. }
  947. $this->conversionEventService->handleConversionGoalReached(
  948. ConversionEventService::CAMPAIGN_ID_INDEED_RECRUIT_DL_CONTENT_DISTRIBUTION_VIA_XML_FEED,
  949. 1,
  950. $event->getRequest(),
  951. $event->getUser(),
  952. $event->getRecurrentJob()
  953. );
  954. foreach ([0, 1] as $subcampaignId) {
  955. $this->conversionEventService->handleConversionGoalReached(
  956. ConversionEventService::CAMPAIGN_ID_PERSOMATCH_FEED,
  957. $subcampaignId,
  958. $event->getRequest(),
  959. $event->getUser(),
  960. $event->getRecurrentJob()
  961. );
  962. }
  963. $this->conversionEventService->handleConversionGoalReached(
  964. ConversionEventService::CAMPAIGN_ID_INSTAGRAM,
  965. 0,
  966. $event->getRequest(),
  967. $event->getUser(),
  968. $event->getRecurrentJob()
  969. );
  970. $this->conversionEventService->handleConversionGoalReached(
  971. ConversionEventService::CAMPAIGN_ID_RECRUIT_DL_LANDINGPAGE,
  972. 1,
  973. $event->getRequest(),
  974. $event->getUser(),
  975. $event->getRecurrentJob()
  976. );
  977. $this->conversionEventService->handleConversionGoalReached(
  978. ConversionEventService::CAMPAIGN_ID_AGENTUR_FUER_ARBEIT,
  979. 1,
  980. $event->getRequest(),
  981. $event->getUser(),
  982. $event->getRecurrentJob()
  983. );
  984. $this->conversionEventService->handleConversionGoalReached(
  985. ConversionEventService::CAMPAIGN_ID_WHATSAPP_MESSAGE_ABOUT_UNREAD_INTEGRATED_EXTERNAL_PARTNER_CUSTOMER_PREMIUM_RADAR_MESSAGE,
  986. 0,
  987. $event->getRequest(),
  988. $event->getUser(),
  989. $event->getRecurrentJob(),
  990. null,
  991. json_encode(['goalReachedBy' => 'forwarded'])
  992. );
  993. foreach ([0, 1, 2] as $subcampaignId) {
  994. $this->conversionEventService->handleConversionGoalReached(
  995. ConversionEventService::CAMPAIGN_ID_INTERNAL_APPLICATION_TRACKING_RECURRENT_JOBS_SEARCH,
  996. $subcampaignId,
  997. $event->getRequest(),
  998. $event->getUser(),
  999. $event->getRecurrentJob(),
  1000. null,
  1001. null,
  1002. !is_null($event->getRecurrentJob())
  1003. ? $event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()
  1004. : null
  1005. );
  1006. }
  1007. foreach ([0, 1, 2] as $subcampaignId) {
  1008. $this->conversionEventService->handleConversionGoalReached(
  1009. ConversionEventService::CAMPAIGN_ID_INTERNAL_APPLICATION_TRACKING_RECURRENT_JOBS_SEARCH_ALL_JOBS,
  1010. $subcampaignId,
  1011. $event->getRequest(),
  1012. $event->getUser(),
  1013. $event->getRecurrentJob(),
  1014. null,
  1015. null,
  1016. !is_null($event->getRecurrentJob())
  1017. ? $event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()
  1018. : null
  1019. );
  1020. }
  1021. foreach ([0, 1] as $subcampaignId) {
  1022. $this->conversionEventService->handleConversionGoalReached(
  1023. ConversionEventService::CAMPAIGN_ID_INTERNAL_APPLICATION_TRACKING_AUTOMATED_CONVERSATION_MESSAGES_MAILING,
  1024. $subcampaignId,
  1025. $event->getRequest(),
  1026. $event->getUser(),
  1027. $event->getRecurrentJob(),
  1028. null,
  1029. null,
  1030. !is_null($event->getRecurrentJob())
  1031. ? $event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()
  1032. : null
  1033. );
  1034. }
  1035. foreach ([0, 1] as $subcampaignId) {
  1036. $this->conversionEventService->handleConversionGoalReached(
  1037. ConversionEventService::CAMPAIGN_ID_INTERNAL_APPLICATION_TRACKING_INTEGRATED_EXTERNAL_PARTNER_CUSTOMER_PREMIUM_RADAR,
  1038. $subcampaignId,
  1039. $event->getRequest(),
  1040. $event->getUser(),
  1041. $event->getRecurrentJob(),
  1042. null,
  1043. null,
  1044. !is_null($event->getRecurrentJob())
  1045. ? $event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()
  1046. : null
  1047. );
  1048. }
  1049. $this->conversionEventService->handleConversionGoalReached(
  1050. ConversionEventService::CAMPAIGN_ID_XING_FEED,
  1051. 0,
  1052. $event->getRequest(),
  1053. $event->getUser(),
  1054. $event->getRecurrentJob()
  1055. );
  1056. if (!is_null($event->getRecurrentJob()) && !$event->getRecurrentJob()->isLinkedToExternalPartner()) {
  1057. $this->businessEventDomainService->writeNewEvent(
  1058. BusinessEvent::EVENT_TYPE_FORWARDED_TO_ORGANIC_RECURRENT_JOB_EXTERNAL_APPLICATION_URL,
  1059. $event->getUser(),
  1060. $event->getRecurrentJob(),
  1061. null,
  1062. json_encode([
  1063. 'directForwarding' => !is_null($event->getRequest()) && $event->getRequest()->query->get('directForwarding', 'false') === 'true',
  1064. 'recurrentJobId' => $event->getRecurrentJob()->getId(),
  1065. 'jobseekerHasCV' => (!is_null($event->getUser()) && !is_null($event->getUser()->getDefaultJobseekerProfile()) && !is_null($event->getUser()->getDefaultJobseekerProfile()->getDocumentFileName())) ? 'true' : 'false'
  1066. ])
  1067. );
  1068. }
  1069. $customer = $event->getRecurrentJob()->getIntegratedExternalPartnerCustomer();
  1070. $this->businessEventDomainService->writeNewEvent(
  1071. BusinessEvent::EVENT_TYPE_RECURRENTJOB_FORWARDED_TO_EXTERNAL_APPLICATION_URL,
  1072. $event->getUser(),
  1073. $event->getRecurrentJob(),
  1074. null,
  1075. json_encode(
  1076. [
  1077. 'context' => $event->getContext(),
  1078. 'jobseekerHasCV' => (
  1079. !is_null($event->getUser())
  1080. && !is_null($event->getUser()->getDefaultJobseekerProfile())
  1081. && !is_null($event->getUser()->getDefaultJobseekerProfile()->getDocumentFileName())
  1082. ) ? 'true' : 'false',
  1083. 'businessName' => $event->getRecurrentJob()->getBusinessName(),
  1084. 'titel' => $event->getRecurrentJob()->getTitle(),
  1085. 'zipCode' => $event->getRecurrentJob()->getZipCode(),
  1086. 'internalId' => !is_null($customer) ? $customer->getInternalId() : null,
  1087. ]
  1088. )
  1089. );
  1090. if ($event->getRecurrentJob()->isLinkedToExternalPartner()) {
  1091. $this->conversionEventService->handleConversionGoalReached(
  1092. ConversionEventService::CAMPAIGN_ID_HAYS_MAILING,
  1093. 0,
  1094. $event->getRequest(),
  1095. $event->getUser()
  1096. );
  1097. $this->conversionEventService->handleConversionGoalReached(
  1098. ConversionEventService::CAMPAIGN_ID_AGENTUR_FUER_ARBEIT,
  1099. 1,
  1100. $event->getRequest(),
  1101. $event->getUser(),
  1102. $event->getRecurrentJob()
  1103. );
  1104. $this->businessEventDomainService->writeNewEvent(
  1105. BusinessEvent::EVENT_TYPE_EXTERNAL_PARTNERS_JOBOFFER_VISITED,
  1106. $event->getUser(),
  1107. $event->getRecurrentJob(),
  1108. null,
  1109. json_encode([
  1110. 'directForwarding' => !is_null($event->getRequest()) && $event->getRequest()->query->get('directForwarding', 'false') === 'true',
  1111. 'recurrentJobId' => $event->getRecurrentJob()->getId(),
  1112. 'externalPartnerId' => (!is_null($event->getRecurrentJob()->getJoboffererProfile()->getUser()->getExternalPartner())) ? $event->getRecurrentJob()->getJoboffererProfile()->getUser()->getExternalPartner()->getId() : '',
  1113. 'jobseekerHasCV' => (!is_null($event->getUser()) && !is_null($event->getUser()->getDefaultJobseekerProfile()) && !is_null($event->getUser()->getDefaultJobseekerProfile()->getDocumentFileName())) ? 'true' : 'false',
  1114. 'businessName' => $event->getRecurrentJob()->getBusinessName(),
  1115. 'titel' => $event->getRecurrentJob()->getTitle(),
  1116. 'zipCode' => $event->getRecurrentJob()->getZipCode(),
  1117. 'internalId' => !is_null($customer) ? $customer->getInternalId() : null,
  1118. ])
  1119. );
  1120. if (
  1121. !is_null($event->getRecurrentJob()->getIntegratedExternalPartnerCustomer())
  1122. && $event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()->hasClickBasedBilling()
  1123. ) {
  1124. $this->platformEventService->eventHasOccurred(
  1125. PlatformEvent::EVENT_TYPE_FORWARDED_TO_CUSTOMER_WITH_CLICK_BASED_BILLING_RECURRENT_JOB,
  1126. $event->getRecurrentJob()->getIntegratedExternalPartnerCustomerId(),
  1127. null,
  1128. $event->getRecurrentJob(),
  1129. $event->getRequest()?->getSession()->getId()
  1130. );
  1131. }
  1132. $this->conversionEventService->handleConversionGoalReached(
  1133. ConversionEventService::CAMPAIGN_ID_INDEED_RECRUIT_DL_CONTENT_DISTRIBUTION_VIA_XML_FEED,
  1134. 1,
  1135. $event->getRequest(),
  1136. $event->getUser(),
  1137. $event->getRecurrentJob()
  1138. );
  1139. $this->conversionEventService->handleConversionGoalReached(
  1140. ConversionEventService::CAMPAIGN_ID_RECRUIT_DL_LANDINGPAGE,
  1141. 1,
  1142. $event->getRequest(),
  1143. $event->getUser(),
  1144. $event->getRecurrentJob()
  1145. );
  1146. if (!is_null($event->getRecurrentJob()->getJoboffererProfile()->getUser()->getExternalPartner()) && in_array($event->getRecurrentJob()->getJoboffererProfile()->getUser()->getExternalPartner()->getId(), [ExternalPartner::ID_REWE_FEED, ExternalPartner::ID_GOHIRING_API, ExternalPartner::ID_TANKUNDRAST_API_CLIENT])) {
  1147. $this->conversionEventService->handleConversionGoalReached(
  1148. ConversionEventService::CAMPAIGN_ID_REWE_MAILING_29_04_2021,
  1149. 0,
  1150. $event->getRequest(),
  1151. $event->getUser(),
  1152. $event->getRecurrentJob()
  1153. );
  1154. $this->conversionEventService->handleConversionGoalReached(
  1155. ConversionEventService::CAMPAIGN_ID_REWE_MAILING_29_04_2021,
  1156. 1,
  1157. $event->getRequest(),
  1158. $event->getUser(),
  1159. $event->getRecurrentJob()
  1160. );
  1161. if ($event->getRecurrentJob()->getJoboffererProfile()->getUser()->getExternalPartner()->getId() === ExternalPartner::ID_REWE_FEED) {
  1162. $this->conversionEventService->handleConversionGoalReached(
  1163. ConversionEventService::CAMPAIGN_ID_REWE_PUSH_NOTIFICATION_BOOST_SEARCH_RESULTS_PAGE,
  1164. 0,
  1165. $event->getRequest(),
  1166. $event->getUser(),
  1167. $event->getRecurrentJob()
  1168. );
  1169. }
  1170. }
  1171. if (
  1172. !is_null($event->getRequest()) && $event->getRequest()->query->get('directForwarding', 'false') === 'true'
  1173. || (
  1174. !is_null($event->getRequest()) && ($event->getRequest()->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID)
  1175. && (int)$event->getRequest()->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1)
  1176. === ConversionEventService::CAMPAIGN_ID_INDEED_RECRUIT_DL_CONTENT_DISTRIBUTION_VIA_XML_FEED
  1177. )
  1178. )
  1179. ) {
  1180. if ((int)$event->getRequest()->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1)
  1181. !== ConversionEventService::CAMPAIGN_ID_INTERNAL_APPLICATION_TRACKING_RECURRENT_JOBS_SEARCH
  1182. && (int)$event->getRequest()->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1)
  1183. !== ConversionEventService::CAMPAIGN_ID_INTERNAL_APPLICATION_TRACKING_RECURRENT_JOBS_SEARCH_ALL_JOBS
  1184. && (int)$event->getRequest()->get(ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID, -1)
  1185. !== ConversionEventService::CAMPAIGN_ID_INTERNAL_APPLICATION_TRACKING_AUTOMATED_CONVERSATION_MESSAGES_MAILING
  1186. ) {
  1187. $this->conversionEventService->initiateGoalReachedConversionTrackingBasedOnRequest(
  1188. $event->getRequest(),
  1189. $event->getUser()
  1190. );
  1191. }
  1192. if (!is_null($event->getRecurrentJob()->getIntegratedExternalPartnerCustomer())
  1193. && $event->getRecurrentJob()->getIntegratedExternalPartnerCustomer()->getInternalId()
  1194. === IntegratedExternalPartnerCustomer::INTERNAL_ID_XING
  1195. ) {
  1196. $this->conversionEventService->handleConversionGoalReached(
  1197. ConversionEventService::CAMPAIGN_ID_TALENTCOM,
  1198. 3,
  1199. $event->getRequest(),
  1200. $event->getUser(),
  1201. $event->getRecurrentJob()
  1202. );
  1203. $this->conversionEventService->handleConversionGoalReached(
  1204. ConversionEventService::CAMPAIGN_ID_JOBLIFT,
  1205. 3,
  1206. $event->getRequest(),
  1207. $event->getUser(),
  1208. $event->getRecurrentJob()
  1209. );
  1210. $this->conversionEventService->handleConversionGoalReached(
  1211. ConversionEventService::CAMPAIGN_ID_STELLENONLINE,
  1212. 3,
  1213. $event->getRequest(),
  1214. $event->getUser(),
  1215. $event->getRecurrentJob()
  1216. );
  1217. }
  1218. }
  1219. if (!is_null($event->getRequest()) && $event->getRequest()->query->get('directForwarding', 'false') === 'true') {
  1220. if (!is_null($recurrentJob = $event->getRecurrentJob())
  1221. && $recurrentJob->belongsToIntegratedExternalPartnerCustomer()
  1222. && !is_null($customer = $recurrentJob->getIntegratedExternalPartnerCustomer())
  1223. && $customer->getInternalId() === IntegratedExternalPartnerCustomer::INTERNAL_ID_DEUTSCHE_BAHN_AG
  1224. ) {
  1225. $this->conversionEventService->handleConversionGoalReached(
  1226. ConversionEventService::CAMPAIGN_ID_TALENTCOM,
  1227. 4,
  1228. $event->getRequest(),
  1229. $event->getUser(),
  1230. $event->getRecurrentJob()
  1231. );
  1232. $this->conversionEventService->handleConversionGoalReached(
  1233. ConversionEventService::CAMPAIGN_ID_JOBLIFT,
  1234. 4,
  1235. $event->getRequest(),
  1236. $event->getUser(),
  1237. $event->getRecurrentJob()
  1238. );
  1239. $this->conversionEventService->handleConversionGoalReached(
  1240. ConversionEventService::CAMPAIGN_ID_STELLENONLINE,
  1241. 4,
  1242. $event->getRequest(),
  1243. $event->getUser(),
  1244. $event->getRecurrentJob()
  1245. );
  1246. } elseif (!is_null($recurrentJob = $event->getRecurrentJob())
  1247. && $recurrentJob->belongsToIntegratedExternalPartnerCustomer()
  1248. && !is_null($customer = $recurrentJob->getIntegratedExternalPartnerCustomer())
  1249. && $customer->getInternalId() === IntegratedExternalPartnerCustomer::INTERNAL_ID_WISAG_CONCLUDIS_API
  1250. ) {
  1251. $this->conversionEventService->handleConversionGoalReached(
  1252. ConversionEventService::CAMPAIGN_ID_STELLENONLINE,
  1253. 5,
  1254. $event->getRequest(),
  1255. $event->getUser(),
  1256. $event->getRecurrentJob()
  1257. );
  1258. $this->conversionEventService->handleConversionGoalReached(
  1259. ConversionEventService::CAMPAIGN_ID_JOBLIFT,
  1260. 5,
  1261. $event->getRequest(),
  1262. $event->getUser(),
  1263. $event->getRecurrentJob()
  1264. );
  1265. } elseif (!is_null($recurrentJob = $event->getRecurrentJob())
  1266. && $recurrentJob->belongsToIntegratedExternalPartnerCustomer()
  1267. && !is_null($customer = $recurrentJob->getIntegratedExternalPartnerCustomer())
  1268. && $customer->getInternalId() === IntegratedExternalPartnerCustomer::INTERNAL_ID_MEINESTADT_DE
  1269. ) {
  1270. $this->conversionEventService->handleConversionGoalReached(
  1271. ConversionEventService::CAMPAIGN_ID_TALENTCOM,
  1272. 6,
  1273. $event->getRequest(),
  1274. $event->getUser(),
  1275. $event->getRecurrentJob()
  1276. );
  1277. $this->conversionEventService->handleConversionGoalReached(
  1278. ConversionEventService::CAMPAIGN_ID_STELLENONLINE,
  1279. 6,
  1280. $event->getRequest(),
  1281. $event->getUser(),
  1282. $event->getRecurrentJob()
  1283. );
  1284. $this->conversionEventService->handleConversionGoalReached(
  1285. ConversionEventService::CAMPAIGN_ID_JOBLIFT,
  1286. 6,
  1287. $event->getRequest(),
  1288. $event->getUser(),
  1289. $event->getRecurrentJob()
  1290. );
  1291. }
  1292. }
  1293. }
  1294. $this->conversionEventService->handleConversionGoalReached(
  1295. ConversionEventService::CAMPAIGN_ID_GOOGLE_FOR_JOBS,
  1296. 0,
  1297. $event->getRequest(),
  1298. $event->getUser(),
  1299. $event->getRecurrentJob()
  1300. );
  1301. $this->conversionEventService->handleConversionGoalReached(
  1302. ConversionEventService::CAMPAIGN_ID_EBAY,
  1303. 0,
  1304. $event->getRequest(),
  1305. $event->getUser(),
  1306. $event->getRecurrentJob()
  1307. );
  1308. foreach ([0, 1, 2, 7, 8, 9] as $subcampaignId) {
  1309. $this->conversionEventService->handleConversionGoalReached(
  1310. ConversionEventService::CAMPAIGN_ID_MEINESTADT,
  1311. $subcampaignId,
  1312. $event->getRequest(),
  1313. $event->getUser(),
  1314. $event->getRecurrentJob()
  1315. );
  1316. }
  1317. foreach ([0, 1, 2, 3, 4, 5] as $subcampaignId) {
  1318. $this->conversionEventService->handleConversionGoalReached(
  1319. ConversionEventService::CAMPAIGN_ID_JOBIJOBA,
  1320. $subcampaignId,
  1321. $event->getRequest(),
  1322. $event->getUser(),
  1323. $event->getRecurrentJob()
  1324. );
  1325. }
  1326. foreach ([0, 1, 2, 3, 4, 5] as $subcampaignId) {
  1327. $this->conversionEventService->handleConversionGoalReached(
  1328. ConversionEventService::CAMPAIGN_ID_WHATJOBS,
  1329. $subcampaignId,
  1330. $event->getRequest(),
  1331. $event->getUser(),
  1332. $event->getRecurrentJob()
  1333. );
  1334. }
  1335. foreach ([0, 1, 2, 3] as $subcampaignId) {
  1336. $this->conversionEventService->handleConversionGoalReached(
  1337. ConversionEventService::CAMPAIGN_ID_JOOBLE,
  1338. $subcampaignId,
  1339. $event->getRequest(),
  1340. $event->getUser(),
  1341. $event->getRecurrentJob()
  1342. );
  1343. }
  1344. $this->conversionEventService->handleConversionGoalReached(
  1345. ConversionEventService::CAMPAIGN_ID_LINKED_IN,
  1346. 0,
  1347. $event->getRequest(),
  1348. $event->getUser(),
  1349. $event->getRecurrentJob()
  1350. );
  1351. if ($event->getPlatformSiteId() === PlatformSite::PLATFORM_SITE_ID_JOBOO) {
  1352. if (!is_null($event->getRequest()) && $event->getRequest()->query->get('directForwarding', 'false') !== 'true') {
  1353. // When there was a forwarding on joboo by a user without base profile, it means they must have accepted our AGB now and they get a base profile
  1354. // Only on joboo.de and without direct forwarding
  1355. $this->profileService->checkIfUserHasAcceptedAGBBecauseOfForwarding($event->getUser());
  1356. }
  1357. }
  1358. $this->conversionEventService->handleConversionGoalReached(
  1359. ConversionEventService::CAMPAIGN_ID_WHATSAPP_MESSAGE_ABOUT_UNREAD_LEAD_CONVERSION_RADAR_MESSAGE,
  1360. 0,
  1361. $event->getRequest(),
  1362. $event->getUser(),
  1363. $event->getRecurrentJob(),
  1364. null,
  1365. json_encode(['goalReachedBy' => 'forwarding'])
  1366. );
  1367. $this->conversionEventService->handleConversionGoalReached(
  1368. ConversionEventService::CAMPAIGN_ID_WHATSAPP_MESSAGE_ABOUT_UNREAD_LEAD_CONVERSION_RADAR_MESSAGE,
  1369. 1,
  1370. $event->getRequest(),
  1371. $event->getUser(),
  1372. $event->getRecurrentJob(),
  1373. null,
  1374. json_encode(['goalReachedBy' => 'forwarding'])
  1375. );
  1376. }
  1377. public function onRecurrentJobWillBeRemoved(RecurrentJobWillBeRemovedEvent $event)
  1378. {
  1379. $recurrentJob = $event->getRecurrentJob();
  1380. if (!is_null($recurrentJob)) {
  1381. if ($recurrentJob->belongsToExternalPartner()) {
  1382. if ($recurrentJob->getExternalPartner()->getId() === ExternalPartner::ID_SOFTGARDEN_FEED) {
  1383. $this->businessEventDomainService->writeNewEvent(
  1384. BusinessEvent::EVENT_TYPE_SOFTGARDEN_RECURRENT_JOB_REMOVED,
  1385. $recurrentJob->getJoboffererProfile()->getUser(),
  1386. $recurrentJob,
  1387. null,
  1388. json_encode([
  1389. 'externalId' => $recurrentJob->getExternalPartnerRecurrentJobAdditionalInfoStringValueByName(
  1390. IntegratedExternalPartnerSoftgardenService::RECURRENT_JOB_ADDITIONAL_INFO_STRING_VALUE_NAME_SOFTGARDEN_EXTERNAL_ID
  1391. ),
  1392. 'activeDays' => DateTimeUtility::createDateTimeUtc()->diff($recurrentJob->getCreatedAt())->format('%d'),
  1393. 'businessName' => $recurrentJob->getBusinessName(),
  1394. 'searchterm' => $recurrentJob->getOccupationalFieldSearchtermForDisplay(),
  1395. 'titel' => $recurrentJob->getTitle(),
  1396. 'zipCode' => $recurrentJob->getZipCode(),
  1397. 'internalId' => $recurrentJob->getIntegratedExternalPartnerCustomer()?->getInternalId(),
  1398. ])
  1399. );
  1400. }
  1401. if (!is_null($recurrentJob->getExternalPartner())
  1402. && $recurrentJob->getExternalPartner()->getId() === ExternalPartner::ID_GOHIRING_API
  1403. ) {
  1404. try {
  1405. $uri = $recurrentJob->getExternalPartnerRecurrentJobAdditionalInfoStringValueByName(
  1406. IntegratedExternalPartnerGohiringService::RECURRENT_JOB_ADDITIONAL_INFO_STRING_VALUE_NAME_GOHIRING_POSTING_URI
  1407. );
  1408. // This implements the specification at https://common-api.gohiring.com/api-reference/common-api/
  1409. $headers = [];
  1410. $headers[] = 'Content-Type: application/vnd.api+json';
  1411. $jwtAsString = JWT::encode(
  1412. ['sub' => PositionOpeningController::JWT_PUBLIC_KEY],
  1413. PositionOpeningController::JWT_SECRET_TOKEN,
  1414. 'HS256'
  1415. );
  1416. $headers[] = 'Authorization: Bearer ' . $jwtAsString;
  1417. $curl = curl_init();
  1418. curl_setopt($curl, CURLOPT_CUSTOMREQUEST, Request::METHOD_DELETE);
  1419. curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
  1420. curl_setopt($curl, CURLOPT_URL, $uri);
  1421. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  1422. curl_setopt($curl, CURLOPT_HEADER, 1);
  1423. $response = curl_exec($curl);
  1424. if ($response === false) {
  1425. $this->logger->warning(curl_error($curl));
  1426. } else {
  1427. $responseLines = explode("\n", $response);
  1428. $firstResponseLine = trim($responseLines[0]);
  1429. if (!str_contains($firstResponseLine, ' 204')) {
  1430. $this->logger->warning("Expected '204 No Content', got '$firstResponseLine'.");
  1431. }
  1432. }
  1433. curl_close($curl);
  1434. } catch (Throwable $t) {
  1435. $this->logger->error("Error while trying to inform GOhiring about removal of recurrent job '{$recurrentJob->getId()}' at '$uri'.");
  1436. }
  1437. }
  1438. $this->externalPartnerEventDomainService->writeEvent(
  1439. ExternalPartnerEvent::EVENT_TYPE_RECURRENT_JOB_REMOVED,
  1440. $recurrentJob->getExternalPartner(),
  1441. $recurrentJob,
  1442. $recurrentJob->getQuota(),
  1443. null,
  1444. null,
  1445. null,
  1446. null,
  1447. $recurrentJob->getJoboffererProfile()->getUser()
  1448. );
  1449. }
  1450. $this->googleIndexingApiService->removeRecurrentJobFromIndexingAPI($event->getRecurrentJob());
  1451. $customer = $recurrentJob->getIntegratedExternalPartnerCustomer();
  1452. $this->businessEventDomainService->writeNewEvent(
  1453. BusinessEvent::EVENT_TYPE_RECURRENT_JOB_REMOVAL_REQUESTED,
  1454. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  1455. $event->getRecurrentJob(),
  1456. null,
  1457. json_encode([
  1458. 'isPlus' => $event->getRecurrentJob()->isPlus(),
  1459. 'businessName' => $event->getRecurrentJob()->getBusinessName(),
  1460. 'titel' => $event->getRecurrentJob()->getTitle(),
  1461. 'zipCode' => $event->getRecurrentJob()->getZipCode(),
  1462. 'internalId' => !is_null($customer) ? $customer->getInternalId() : null,
  1463. ])
  1464. );
  1465. }
  1466. }
  1467. public function onRecurrentJobReactivated(RecurrentJobReactivatedEvent $event)
  1468. {
  1469. if (!is_null($event->getRecurrentJob())) {
  1470. $this->messageBus->dispatch(
  1471. new SyncRecurrentJobWithSearchesSymfonyMessage(
  1472. $event->getRecurrentJob()->getId(),
  1473. SyncRecurrentJobWithSearchesReason::REACTIVATED
  1474. )
  1475. );
  1476. }
  1477. $recurrentJob = $event->getRecurrentJob();
  1478. $integratedExternalPartnerCustomer = null;
  1479. if (!is_null($recurrentJob)) {
  1480. $integratedExternalPartnerCustomer = $recurrentJob->getIntegratedExternalPartnerCustomer();
  1481. }
  1482. $this->businessEventDomainService->writeNewEvent(
  1483. BusinessEvent::EVENT_TYPE_RECURRENT_JOB_REACTIVATED,
  1484. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  1485. $event->getRecurrentJob(),
  1486. null,
  1487. json_encode([
  1488. 'isPlus' => $event->getRecurrentJob()->isPlus(),
  1489. 'titel' => $event->getRecurrentJob()->getTitle(),
  1490. 'businessName' => $event->getRecurrentJob()->getBusinessName(),
  1491. 'zipCode' => $event->getRecurrentJob()->getZipCode(),
  1492. 'internalId' => !is_null($integratedExternalPartnerCustomer) ? $integratedExternalPartnerCustomer->getInternalId() : null,
  1493. ])
  1494. );
  1495. $this->businessEventDomainService->writeNewEvent(
  1496. BusinessEvent::EVENT_TYPE_RECURRENT_JOB_PUBLISHED,
  1497. $event->getRecurrentJob()->getJoboffererProfile()->getUser(),
  1498. $event->getRecurrentJob(),
  1499. null,
  1500. json_encode([
  1501. 'isPlus' => $event->getRecurrentJob()->isPlus(),
  1502. 'isFlex' => $this->featureLimitationsService->recurrentJobIsFlex($event->getRecurrentJob()),
  1503. 'customer' => !is_null($integratedExternalPartnerCustomer) ? $integratedExternalPartnerCustomer->getInternalId() : null,
  1504. 'businessName' => $event->getRecurrentJob()->getBusinessName(),
  1505. 'title' => $event->getRecurrentJob()->getTitle(),
  1506. 'zipCode' => $event->getRecurrentJob()->getZipCode(),
  1507. ])
  1508. );
  1509. if ($event->getRecurrentJob()->belongsToExternalPartner()) {
  1510. $this->externalPartnerEventDomainService->writeEvent(
  1511. ExternalPartnerEvent::EVENT_TYPE_RECURRENT_JOB_PUBLISHED,
  1512. $event->getRecurrentJob()->getExternalPartner(),
  1513. $event->getRecurrentJob(),
  1514. $event->getRecurrentJob()->getQuota(),
  1515. null,
  1516. null,
  1517. null,
  1518. null,
  1519. $event->getRecurrentJob()->getJoboffererProfile()->getUser()
  1520. );
  1521. }
  1522. }
  1523. public function onRecurrentJobUpdated(RecurrentJobUpdatedEvent $event): void
  1524. {
  1525. if (!is_null($event->getRecurrentJob())) {
  1526. $this->messageBus->dispatch(
  1527. new SyncRecurrentJobWithSearchesSymfonyMessage(
  1528. $event->getRecurrentJob()->getId(),
  1529. SyncRecurrentJobWithSearchesReason::UPDATED
  1530. )
  1531. );
  1532. }
  1533. if ($event->getRecurrentJob()->belongsToExternalPartner()) {
  1534. $this->externalPartnerEventDomainService->writeEvent(
  1535. ExternalPartnerEvent::EVENT_TYPE_RECURRENT_JOB_UPDATED,
  1536. $event->getRecurrentJob()->getExternalPartner(),
  1537. $event->getRecurrentJob(),
  1538. $event->getRecurrentJob()->getQuota(),
  1539. null,
  1540. null,
  1541. null,
  1542. null,
  1543. $event->getRecurrentJob()->getJoboffererProfile()->getUser()
  1544. );
  1545. }
  1546. }
  1547. public function onRecurrentJobSkippedUsedQuotaIncrease(
  1548. RecurrentJobSkippedUsedQuotaIncreaseEvent $event
  1549. ): void {
  1550. $this->externalPartnerEventDomainService->writeEvent(
  1551. ExternalPartnerEvent::EVENT_TYPE_SKIPPED_USED_QUOTA_INCREASE_DUE_TO_RECURRENT_JOB_SPECIFIC_RULES,
  1552. $event->getRecurrentJob()->getExternalPartner(),
  1553. $event->getRecurrentJob(),
  1554. null,
  1555. null,
  1556. null,
  1557. null,
  1558. null,
  1559. $event->getRecurrentJob()->getJoboffererProfile()->getUser()
  1560. );
  1561. }
  1562. }