src/App/EventSubscriber/App/ConversationMessageEventSubscriber.php line 503

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\App;
  3. use App\Entity\AutomatedConversationMessagesMailing;
  4. use App\Entity\PlatformEvent;
  5. use App\Entity\UsageEvent;
  6. use App\Event\ConversationMessageDeletedByReceiverEvent;
  7. use App\Event\ConversationMessageDirectAppliedEvent;
  8. use App\Event\ConversationMessageReadEvent;
  9. use App\Event\ConversationMessageRestoredByReceiverEvent;
  10. use App\Event\ConversationMessageSentEvent;
  11. use App\Service\ActivityMonitoringService;
  12. use App\Service\BrowserPushNotificationService;
  13. use App\Service\ConversationMessageService;
  14. use App\Service\ConversionEventService;
  15. use App\Service\DirectEmailCommunicationService;
  16. use App\Service\NotificationService;
  17. use App\Service\PlatformEventService;
  18. use App\Service\RecurrentJobService;
  19. use App\Service\UsageEventService;
  20. use App\Service\UserService;
  21. use App\Service\WhatsAppIntegration\WhatsAppMessageService;
  22. use App\SymfonyMessage\NotifyUserAboutUnreadIntegratedExternalPartnerCustomerPremiumRadarMessageViaWhatsAppSymfonyMessage;
  23. use App\SymfonyMessage\NotifyUserAboutUnreadOrganicConversationMessageViaWhatsAppSymfonyMessage;
  24. use App\SymfonyMessage\UpdateCachedUnreadConversationMessagesCountSymfonyMessage;
  25. use App\Utility\DateTimeUtility;
  26. use DateTime;
  27. use Exception;
  28. use JanusHercules\DatawarehouseIntegration\Domain\Entity\BusinessEvent;
  29. use JanusHercules\DatawarehouseIntegration\Domain\Entity\ExternalPartnerEvent;
  30. use JanusHercules\DatawarehouseIntegration\Domain\Service\BusinessEventDomainService;
  31. use JanusHercules\DatawarehouseIntegration\Domain\Service\ExternalPartnerEventDomainService;
  32. use Psr\Log\LoggerInterface;
  33. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  34. use Symfony\Component\Messenger\MessageBusInterface;
  35. use Symfony\Component\Messenger\Stamp\DelayStamp;
  36. use Throwable;
  37. class ConversationMessageEventSubscriber implements EventSubscriberInterface
  38. {
  39. private ActivityMonitoringService $activityMonitoringService;
  40. private LoggerInterface $logger;
  41. private BrowserPushNotificationService $browserPushNotificationService;
  42. private UserService $userService;
  43. private BusinessEventDomainService $businessEventDomainService;
  44. private ConversionEventService $conversionEventService;
  45. private ConversationMessageService $conversationMessageService;
  46. private UsageEventService $usageEventService;
  47. private ExternalPartnerEventDomainService $externalPartnerEventDomainService;
  48. private DirectEmailCommunicationService $directEmailCommunicationService;
  49. private MessageBusInterface $messageBus;
  50. private RecurrentJobService $recurrentJobService;
  51. private WhatsAppMessageService $whatsAppMessageService;
  52. private PlatformEventService $platformEventService;
  53. public function __construct(
  54. ActivityMonitoringService $activityMonitoringService,
  55. LoggerInterface $logger,
  56. BrowserPushNotificationService $browserPushNotificationService,
  57. UserService $userService,
  58. BusinessEventDomainService $businessEventDomainService,
  59. ConversionEventService $conversionEventService,
  60. ConversationMessageService $conversationMessageService,
  61. UsageEventService $usageEventService,
  62. ExternalPartnerEventDomainService $externalPartnerEventDomainService,
  63. DirectEmailCommunicationService $directEmailCommunicationService,
  64. MessageBusInterface $messageBus,
  65. RecurrentJobService $recurrentJobService,
  66. WhatsAppMessageService $whatsAppMessageService,
  67. PlatformEventService $platformEventService
  68. ) {
  69. $this->activityMonitoringService = $activityMonitoringService;
  70. $this->logger = $logger;
  71. $this->browserPushNotificationService = $browserPushNotificationService;
  72. $this->userService = $userService;
  73. $this->businessEventDomainService = $businessEventDomainService;
  74. $this->conversionEventService = $conversionEventService;
  75. $this->conversationMessageService = $conversationMessageService;
  76. $this->usageEventService = $usageEventService;
  77. $this->externalPartnerEventDomainService = $externalPartnerEventDomainService;
  78. $this->directEmailCommunicationService = $directEmailCommunicationService;
  79. $this->messageBus = $messageBus;
  80. $this->recurrentJobService = $recurrentJobService;
  81. $this->whatsAppMessageService = $whatsAppMessageService;
  82. $this->platformEventService = $platformEventService;
  83. }
  84. public static function getSubscribedEvents(): array
  85. {
  86. return [
  87. ConversationMessageSentEvent::class => 'onConversationMessageSent',
  88. ConversationMessageDirectAppliedEvent::class => 'onConversationMessageDirectApplied',
  89. ConversationMessageReadEvent::class => 'onConversationMessageRead',
  90. ConversationMessageDeletedByReceiverEvent::class => 'onConversationMessageDeletedByReceiverEvent',
  91. ConversationMessageRestoredByReceiverEvent::class => 'onConversationMessageRestoredByReceiverEvent'
  92. ];
  93. }
  94. /**
  95. * @throws Exception
  96. */
  97. public function onConversationMessageSent(ConversationMessageSentEvent $event): void
  98. {
  99. $this->messageBus->dispatch(
  100. new UpdateCachedUnreadConversationMessagesCountSymfonyMessage(
  101. $event->getConversationMessage()->getReceiverProfile()->getUser()
  102. )
  103. );
  104. $conversationMessage = $event->getConversationMessage();
  105. try {
  106. $this->activityMonitoringService->handleConversationMessageSentActivity($conversationMessage);
  107. } catch (Throwable $t) {
  108. // While this is important for us, it's not crucial for the user, which is why we ensure that a user doesn't
  109. // run into an error if we get an exception.
  110. $this->logger->warning(
  111. "Error while calling ActivityMonitoringService::handleConversationMessageSentActivity: {$t->getMessage()}",
  112. ['exception' => $t]);
  113. }
  114. $this->browserPushNotificationService->handleConversationMessageSent($conversationMessage);
  115. $this->businessEventDomainService->writeNewEvent(
  116. BusinessEvent::EVENT_TYPE_SENT_SINGLE_CONVERSATION_MESSAGE,
  117. $conversationMessage->getSenderProfile()->getUser(),
  118. $conversationMessage->getRelatedRecurrentJob(),
  119. $conversationMessage->getRelatedWantedJob(),
  120. json_encode([
  121. 'conversationMessageId' => $conversationMessage->getId(),
  122. 'joboffererProfileId' => $conversationMessage->getSenderProfile()->isJobofferer() ? $conversationMessage->getSenderProfile()->getId() : $conversationMessage->getReceiverProfile()->getId(),
  123. 'jobseekerProfileId' => $conversationMessage->getSenderProfile()->isJobseeker() ? $conversationMessage->getSenderProfile()->getId() : $conversationMessage->getReceiverProfile()->getId(),
  124. 'senderIsJobseeker' => $conversationMessage->getSenderProfile()->isJobseeker(),
  125. 'senderIsJobofferer' => $conversationMessage->getSenderProfile()->isJobofferer(),
  126. 'isPartOfMultiple' => !is_null($conversationMessage->getMultiConversationMessagesMailing()),
  127. 'isPartOfAutomatedConversationMessagesMailing' => !is_null($conversationMessage->getAutomatedConversationMessagesMailing())
  128. ])
  129. );
  130. if ($conversationMessage->isAutomatedMessage()) {
  131. $this->businessEventDomainService->writeNewEvent(
  132. BusinessEvent::EVENT_TYPE_SENT_AUTOMATED_CONVERSATION_MESSAGE,
  133. $conversationMessage->getReceiverProfile()->getUser(),
  134. $conversationMessage->getRelatedRecurrentJob(),
  135. $conversationMessage->getRelatedWantedJob(),
  136. json_encode([
  137. 'conversationMessageId' => $conversationMessage->getId(),
  138. 'jobseekerProfileId' => $conversationMessage->getJobseekerProfile()->getId(),
  139. 'joboffererProfileId' => $conversationMessage->getJoboffererProfile()->getId(),
  140. 'senderIsJobseeker' => false,
  141. 'senderIsJobofferer' => true,
  142. 'automatedConversationMessagesMailingId' => $conversationMessage->getAutomatedConversationMessagesMailing()->getId(),
  143. 'automatedConversationMessagesMailingType' => $conversationMessage->getAutomatedConversationMessagesMailing()->getMailingType(),
  144. 'automatedConversationMessagesTriggeringSide' => $conversationMessage->getAutomatedConversationMessagesMailing()->getTriggeringSide()
  145. ])
  146. );
  147. }
  148. if ($conversationMessage->isAutomatedJobradarMessage()) {
  149. $this->logger->warning(
  150. "Conversation Message '{$conversationMessage->getId()}' is an automated Jobradar message, but these must no longer be created, because they are replaced by Jobradar Matches."
  151. );
  152. } elseif (!$conversationMessage->isAutomatedMessage()) {
  153. $since = DateTime::createFromFormat('d/m/Y', '25/09/2019');
  154. if ($this->conversationMessageService->getNumberOfMessagesAndExtendedApplicationsReceivedByProfileWithoutAutomatedMessagesSinceDate(
  155. $conversationMessage->getReceiverProfile(),
  156. $since
  157. ) >= 4
  158. && !$this->usageEventService->hasEventOccurredForUser(
  159. $conversationMessage->getReceiverProfile()->getUser(),
  160. UsageEvent::EVENT_TYPE_USER_RECEIVED_FIVE_MESSAGES_EXCLUDING_JOBRADAR
  161. )
  162. ) {
  163. $this->usageEventService->eventHasOccurredForUser(
  164. $conversationMessage->getReceiverProfile()->getUser(),
  165. UsageEvent::EVENT_TYPE_USER_RECEIVED_FIVE_MESSAGES_EXCLUDING_JOBRADAR
  166. );
  167. }
  168. if ($conversationMessage->getSenderProfile()->getUser()->isJobofferer()) {
  169. $this->usageEventService->eventHasOccurredForUser(
  170. $conversationMessage->getSenderProfile()->getUser(),
  171. UsageEvent::EVENT_TYPE_JOBOFFERER_SENT_MESSAGE
  172. );
  173. }
  174. if ($conversationMessage->getSenderProfile()->getUser()->isJobseeker()) {
  175. $this->usageEventService->eventHasOccurredForUser(
  176. $conversationMessage->getSenderProfile()->getUser(),
  177. UsageEvent::EVENT_TYPE_JOBSEEKER_SENT_MESSAGE
  178. );
  179. }
  180. $this->usageEventService->eventHasOccurredForUser(
  181. $conversationMessage->getSenderProfile()->getUser(),
  182. UsageEvent::EVENT_TYPE_USER_SENT_CONVERSATION_MESSAGE
  183. );
  184. if ($conversationMessage->getReceiverProfile()->isJobseeker()) {
  185. if ($this->whatsAppMessageService->canProfileReceiveWhatsAppMessages($conversationMessage->getReceiverProfile())) {
  186. $this->messageBus->dispatch(
  187. new NotifyUserAboutUnreadOrganicConversationMessageViaWhatsAppSymfonyMessage(
  188. $conversationMessage
  189. ),
  190. [DelayStamp::delayUntil(
  191. DateTimeUtility::createDateTimeUtcForUpcomingMinuteSecond(
  192. (int)DateTimeUtility::createDateTimeUtc()->format('i'),
  193. (int)DateTimeUtility::createDateTimeUtc()->format('s'),
  194. false,
  195. 7,
  196. 21
  197. )
  198. )]
  199. );
  200. }
  201. }
  202. if (!is_null($conversationMessage->getMultiConversationMessagesMailing())) {
  203. $this->businessEventDomainService->writeNewEvent(
  204. BusinessEvent::EVENT_TYPE_SENT_MULTIPLE_CONVERSATION_MESSAGES,
  205. $conversationMessage->getSenderProfile()->getUser(),
  206. null,
  207. null,
  208. json_encode([
  209. 'jobseekerProfileId' => $conversationMessage->getJobseekerProfile()->getId(),
  210. 'joboffererProfileId' => $conversationMessage->getJoboffererProfile()->getId(),
  211. 'senderIsJobseeker' => $conversationMessage->getSenderProfile()->isJobseeker(),
  212. 'senderIsJobofferer' => $conversationMessage->getSenderProfile()->isJobofferer()
  213. ])
  214. );
  215. $this->usageEventService->eventHasOccurredForUser(
  216. $conversationMessage->getSenderProfile()->getUser(),
  217. UsageEvent::EVENT_TYPE_USER_SENT_CONVERSATION_MESSAGE
  218. );
  219. $this->usageEventService->eventHasOccurredForUser($conversationMessage->getSenderProfile()->getUser(), UsageEvent::EVENT_TYPE_USER_HAS_SENT_MULTIPLE_MESSAGES);
  220. if ($conversationMessage->getSenderProfile()->isJobseeker()) {
  221. $this->usageEventService->eventHasOccurredForUser($conversationMessage->getSenderProfile()->getUser(), UsageEvent::EVENT_TYPE_JOBSEEKER_SENT_MESSAGE);
  222. } elseif ($conversationMessage->getSenderProfile()->isJobofferer()) {
  223. $this->usageEventService->eventHasOccurredForUser($conversationMessage->getSenderProfile()->getUser(), UsageEvent::EVENT_TYPE_JOBOFFERER_SENT_MESSAGE);
  224. }
  225. }
  226. }
  227. if (!is_null($conversationMessage->getAutomatedConversationMessagesMailing())) {
  228. if (!is_null($conversationMessage->getJoboffererProfile()->getUser()->getExternalPartner()) && $conversationMessage->getAutomatedConversationMessagesMailing()->getMailingType() === AutomatedConversationMessagesMailing::MAILING_TYPE_JOBRADAR) {
  229. $this->logger->warning(
  230. "Conversation Message '{$conversationMessage->getId()}' is an automated Jobradar message, but these must no longer be created, because they are replaced by Jobradar Matches."
  231. );
  232. $this->externalPartnerEventDomainService->writeEvent(
  233. ExternalPartnerEvent::EVENT_TYPE_JOBRADAR_CREATED,
  234. $conversationMessage->getJoboffererProfile()->getUser()->getExternalPartner(),
  235. $conversationMessage->getRelatedRecurrentJob(),
  236. null,
  237. $conversationMessage->getRelatedWantedJob(),
  238. $conversationMessage,
  239. null,
  240. null,
  241. $conversationMessage->getRelatedWantedJob()->getJobseekerProfile()->getUser(),
  242. null
  243. );
  244. }
  245. if ($conversationMessage->getAutomatedConversationMessagesMailing()->getMailingType() === AutomatedConversationMessagesMailing::MAILING_TYPE_INTEGRATED_EXTERNAL_PARTNER_CUSTOMER_PREMIUM_RADAR) {
  246. if ($conversationMessage->getReceiverProfile()->isJobseeker()) {
  247. if ($this->whatsAppMessageService->canProfileReceiveWhatsAppMessages($conversationMessage->getReceiverProfile())) {
  248. $this->messageBus->dispatch(
  249. new NotifyUserAboutUnreadIntegratedExternalPartnerCustomerPremiumRadarMessageViaWhatsAppSymfonyMessage(
  250. $conversationMessage
  251. ),
  252. [DelayStamp::delayUntil(
  253. DateTimeUtility::createDateTimeUtcForUpcomingMinuteSecond(
  254. (int)DateTimeUtility::createDateTimeUtc()->format('i'),
  255. (int)DateTimeUtility::createDateTimeUtc()->format('s'),
  256. false,
  257. 7,
  258. 21
  259. )
  260. )]
  261. );
  262. }
  263. }
  264. $this->externalPartnerEventDomainService->writeEvent(
  265. ExternalPartnerEvent::EVENT_TYPE_PREMIUM_JOBRADAR_CREATED,
  266. $conversationMessage->getJoboffererProfile()->getUser()->getExternalPartner(),
  267. $conversationMessage->getRelatedRecurrentJob(),
  268. null,
  269. $conversationMessage->getRelatedWantedJob(),
  270. $conversationMessage,
  271. null,
  272. null,
  273. $conversationMessage->getRelatedWantedJob()->getJobseekerProfile()->getUser(),
  274. null
  275. );
  276. }
  277. if ($conversationMessage->getAutomatedConversationMessagesMailing()->getMailingType() === AutomatedConversationMessagesMailing::MAILING_TYPE_WISAG) {
  278. $this->externalPartnerEventDomainService->writeEvent(
  279. ExternalPartnerEvent::EVENT_TYPE_WISAG_RADAR_CREATED,
  280. $conversationMessage->getJoboffererProfile()->getUser()->getExternalPartner(),
  281. $conversationMessage->getRelatedRecurrentJob(),
  282. null,
  283. $conversationMessage->getRelatedWantedJob(),
  284. $conversationMessage,
  285. null,
  286. null,
  287. $conversationMessage->getRelatedWantedJob()->getJobseekerProfile()->getUser(),
  288. null
  289. );
  290. }
  291. if ($conversationMessage->getAutomatedConversationMessagesMailing()->getMailingType() === AutomatedConversationMessagesMailing::MAILING_TYPE_WISAG_PREMIUM) {
  292. $this->externalPartnerEventDomainService->writeEvent(
  293. ExternalPartnerEvent::EVENT_TYPE_WISAG_PREMIUM_RADAR_CREATED,
  294. $conversationMessage->getJoboffererProfile()->getUser()->getExternalPartner(),
  295. $conversationMessage->getRelatedRecurrentJob(),
  296. null,
  297. $conversationMessage->getRelatedWantedJob(),
  298. $conversationMessage,
  299. null,
  300. null,
  301. $conversationMessage->getRelatedWantedJob()->getJobseekerProfile()->getUser(),
  302. null
  303. );
  304. }
  305. }
  306. $this->userService->unpauseIfPaused(
  307. $conversationMessage->getSenderProfile()->getUser()
  308. );
  309. $this->conversionEventService->handleConversionGoalReached(
  310. ConversionEventService::CAMPAIGN_ID_OUTGOING_DIRECT_EMAILS,
  311. 2,
  312. null,
  313. $event->getConversationMessage()->getSenderProfile()->getUser()
  314. );
  315. foreach ([0, 1, 2, 3, 4, 5, 6, 7] as $subcampaignId) {
  316. $this->conversionEventService->handleConversionGoalReached(
  317. ConversionEventService::CAMPAIGN_ID_RECURRENT_JOBS_SEARCH_FOR_ONE_SPECIFIC_CUSTOMER,
  318. $subcampaignId,
  319. null,
  320. $event->getConversationMessage()->getSenderProfile()->getUser(),
  321. $event->getConversationMessage()->getRelatedRecurrentJob(),
  322. null,
  323. null,
  324. !is_null($event->getConversationMessage()->getRelatedRecurrentJob())
  325. ? $event->getConversationMessage()->getRelatedRecurrentJob()->getIntegratedExternalPartnerCustomer()
  326. : null
  327. );
  328. }
  329. if ($this->conversationMessageService->getNumberOfUnreadMessages($event->getConversationMessage()->getSenderProfile(), ConversationMessageService::SUB_FILTER_TYPE_NONE) === 0) {
  330. $this->conversionEventService->handleConversionGoalReached(
  331. ConversionEventService::CAMPAIGN_ID_NOTIFICATION,
  332. NotificationService::NOTIFICATION_TYPE_UNREAD_CONVERSATION_MESSAGES,
  333. null,
  334. $event->getConversationMessage()->getSenderProfile()->getUser()
  335. );
  336. }
  337. $this->conversionEventService->handleConversionGoalReached(
  338. ConversionEventService::CAMPAIGN_ID_JOBSEEKER_MAILING_150621,
  339. 0,
  340. null,
  341. $event->getConversationMessage()->getSenderProfile()->getUser()
  342. );
  343. if ($conversationMessage->getSenderProfile()->getUser()->isJobseeker() && !is_null($conversationMessage->getRelatedRecurrentJob()) && $this->recurrentJobService->recurrentJobBelongsToJobooGmbH($conversationMessage->getRelatedRecurrentJob())) {
  344. $this->conversionEventService->handleConversionGoalReached(
  345. ConversionEventService::CAMPAIGN_ID_RECURRENT_JOBS_BELONGING_TO_JOBOO_GMBH_INFO_MAIL,
  346. 0,
  347. null,
  348. $event->getConversationMessage()->getSenderProfile()->getUser()
  349. );
  350. }
  351. $this->conversionEventService->handleConversionGoalReached(
  352. ConversionEventService::CAMPAIGN_ID_WHATSAPP_MESSAGE_ABOUT_UNREAD_ORGANIC_CONVERSATION_MESSAGE,
  353. 0,
  354. null,
  355. $event->getConversationMessage()->getSenderProfile()->getUser(),
  356. $event->getConversationMessage()->getRelatedRecurrentJob()
  357. );
  358. $this->conversionEventService->handleConversionGoalReached(
  359. ConversionEventService::CAMPAIGN_ID_WHATSAPP_MESSAGE_ABOUT_UNREAD_INTEGRATED_EXTERNAL_PARTNER_CUSTOMER_PREMIUM_RADAR_MESSAGE,
  360. 0,
  361. null,
  362. $event->getConversationMessage()->getSenderProfile()->getUser(),
  363. $event->getConversationMessage()->getRelatedRecurrentJob(),
  364. null,
  365. json_encode(['goalReachedBy' => 'conversationMessageSent'])
  366. );
  367. if ($event->getConversationMessage()->isAutomatedMessage()
  368. && !is_null(
  369. $event->getConversationMessage()->getAutomatedConversationMessagesMailing()
  370. )
  371. && $event->getConversationMessage()->getAutomatedConversationMessagesMailing()->getMailingType()
  372. === AutomatedConversationMessagesMailing::MAILING_TYPE_INTEGRATED_EXTERNAL_PARTNER_CUSTOMER_PREMIUM_RADAR
  373. ) {
  374. $this->platformEventService->eventHasOccurred(
  375. PlatformEvent::EVENT_TYPE_INTEGRATED_EXTERNAL_PARTNER_CUSTOMER_PREMIUM_RADAR_WAS_CREATED_FOR_CUSTOMER,
  376. $event->getConversationMessage()->getSenderProfile()->getUser()->getIntegratedExternalPartnerCustomer()->getId()
  377. );
  378. }
  379. foreach ([0, 1, 2, 3] as $subcampaignId) {
  380. $this->conversionEventService->handleConversionGoalReached(
  381. ConversionEventService::CAMPAIGN_ID_INTERNAL_APPLICATION_TRACKING_RECURRENT_JOBS_SEARCH,
  382. $subcampaignId,
  383. null,
  384. $event->getConversationMessage()->getSenderProfile()->getUser(),
  385. $event->getConversationMessage()->getRelatedRecurrentJob()
  386. );
  387. }
  388. foreach ([0, 1, 2, 3] as $subcampaignId) {
  389. $this->conversionEventService->handleConversionGoalReached(
  390. ConversionEventService::CAMPAIGN_ID_INTERNAL_APPLICATION_TRACKING_RECURRENT_JOBS_SEARCH_ALL_JOBS,
  391. $subcampaignId,
  392. null,
  393. $event->getConversationMessage()->getSenderProfile()->getUser(),
  394. $event->getConversationMessage()->getRelatedRecurrentJob()
  395. );
  396. }
  397. foreach ([0, 1, 2, 3] as $subcampaignId) {
  398. $this->conversionEventService->handleConversionGoalReached(
  399. ConversionEventService::CAMPAIGN_ID_INTERNAL_APPLICATION_TRACKING_AUTOMATED_CONVERSATION_MESSAGES_MAILING,
  400. $subcampaignId,
  401. null,
  402. $event->getConversationMessage()->getSenderProfile()->getUser(),
  403. $event->getConversationMessage()->getRelatedRecurrentJob()
  404. );
  405. }
  406. foreach ([0, 1, 2] as $subcampaignId) {
  407. $this->conversionEventService->handleConversionGoalReached(
  408. ConversionEventService::CAMPAIGN_ID_INTERNAL_APPLICATION_TRACKING_INTEGRATED_EXTERNAL_PARTNER_CUSTOMER_PREMIUM_RADAR,
  409. $subcampaignId,
  410. null,
  411. $event->getConversationMessage()->getSenderProfile()->getUser(),
  412. $event->getConversationMessage()->getRelatedRecurrentJob()
  413. );
  414. }
  415. foreach ([0, 1] as $subcampaignId) {
  416. $this->conversionEventService->handleConversionGoalReached(
  417. ConversionEventService::CAMPAIGN_ID_INTERNAL_APPLICATION_TRACKING_INITIAL_JOBOFFERER_CONVERSATION_MESSAGE,
  418. $subcampaignId,
  419. null,
  420. $event->getConversationMessage()->getSenderProfile()->getUser(),
  421. $event->getConversationMessage()->getRelatedRecurrentJob()
  422. );
  423. }
  424. }
  425. /** @throws Exception */
  426. public function onConversationMessageDirectApplied(ConversationMessageDirectAppliedEvent $event)
  427. {
  428. $conversationMessage = $event->getConversationMessage();
  429. $this->conversionEventService->handleConversionGoalReached(
  430. ConversionEventService::CAMPAIGN_ID_NOTIFICATION,
  431. NotificationService::NOTIFICATION_TYPE_UNREAD_JOBRADAR_MATCHES
  432. );
  433. $this->businessEventDomainService->writeNewEvent(
  434. BusinessEvent::EVENT_TYPE_TRIGGERED_DIRECT_APPLICATION_FROM_CONVERSATION_MESSAGE,
  435. $conversationMessage->getReceiverProfile()->getUser(),
  436. $conversationMessage->getRelatedRecurrentJob(),
  437. $conversationMessage->getRelatedWantedJob(),
  438. json_encode(['conversationMessageId' => $conversationMessage->getId(), 'appliedConversationMessageId' => $event->getApplicationConversationMessage()->getId()])
  439. );
  440. $this->directEmailCommunicationService->createOutgoingEmailFromConversationMessage($event->getApplicationConversationMessage());
  441. }
  442. public function onConversationMessageRead(
  443. ConversationMessageReadEvent $event
  444. ): void {
  445. $this->messageBus->dispatch(
  446. new UpdateCachedUnreadConversationMessagesCountSymfonyMessage(
  447. $event->getConversationMessage()->getReceiverProfile()->getUser()
  448. )
  449. );
  450. }
  451. public function onConversationMessageDeletedByReceiverEvent(
  452. ConversationMessageDeletedByReceiverEvent $event
  453. ): void {
  454. $this->messageBus->dispatch(
  455. new UpdateCachedUnreadConversationMessagesCountSymfonyMessage(
  456. $event->getConversationMessage()->getSenderProfile()->getUser()
  457. )
  458. );
  459. }
  460. public function onConversationMessageRestoredByReceiverEvent(
  461. ConversationMessageRestoredByReceiverEvent $event
  462. ): void {
  463. $this->messageBus->dispatch(
  464. new UpdateCachedUnreadConversationMessagesCountSymfonyMessage(
  465. $event->getConversationMessage()->getSenderProfile()->getUser()
  466. )
  467. );
  468. }
  469. }