src/App/EventSubscriber/App/SubscriptionEventSubscriber.php line 87

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\App;
  3. use App\Entity\AutomatedEmailNotificationDefinition\AutomatedEmailNotificationDefinitionTextContent;
  4. use App\Entity\UsageEvent;
  5. use App\Event\SubscriptionChooseAndPayFormPageSeenEvent;
  6. use App\Event\SubscriptionSuccessfullyCompletedEvent;
  7. use App\Repository\AutomatedEmailNotificationDefinitionTextContentRepository;
  8. use App\Service\AgenturFuerArbeitService;
  9. use App\Service\AutomatedEmailNotificationDefinitionService;
  10. use App\Service\ConversionEventService;
  11. use App\Service\MailService;
  12. use App\Service\Membership\BillwerkPlanVariantService;
  13. use App\Service\Membership\BillwerkSynchronizationService;
  14. use App\Service\Membership\MembershipService;
  15. use App\Service\NotificationService;
  16. use App\Service\ProfileService;
  17. use App\Service\RouterHelperService;
  18. use App\Service\UsageEventService;
  19. use App\Service\UserService;
  20. use App\SymfonyMessage\DispatchCreateJobradarMatchSymfonyMessagesForUserSymfonyMessage;
  21. use Exception;
  22. use JanusHercules\DatawarehouseIntegration\Domain\Entity\BusinessEvent;
  23. use JanusHercules\DatawarehouseIntegration\Domain\Service\BusinessEventDomainService;
  24. use Swift_Message;
  25. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  26. use Symfony\Component\Messenger\MessageBusInterface;
  27. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  28. use Symfony\Contracts\Translation\TranslatorInterface;
  29. use Twig\Environment;
  30. readonly class SubscriptionEventSubscriber implements EventSubscriberInterface
  31. {
  32. public function __construct(
  33. private BusinessEventDomainService $businessEventDomainService,
  34. private UsageEventService $usageEventService,
  35. private ConversionEventService $conversionEventService,
  36. private UserService $userService,
  37. private BillwerkPlanVariantService $billwerkPlanVariantService,
  38. private MembershipService $membershipService,
  39. private MessageBusInterface $messageBus,
  40. private AgenturFuerArbeitService $agenturFuerArbeitService,
  41. private AutomatedEmailNotificationDefinitionTextContentRepository $automatedEmailNotificationDefinitionTextContentRepository,
  42. private MailService $mailService,
  43. private RouterHelperService $routerHelperService,
  44. private Environment $twigEnvironment,
  45. private TranslatorInterface $translator
  46. ) {
  47. }
  48. public static function getSubscribedEvents(): array
  49. {
  50. return [
  51. SubscriptionChooseAndPayFormPageSeenEvent::class => 'onSubscriptionChooseAndPayFormPageSeen',
  52. SubscriptionSuccessfullyCompletedEvent::class => 'onSubscriptionSuccessfullyCompletedEvent'
  53. ];
  54. }
  55. /** @throws Exception */
  56. public function onSubscriptionChooseAndPayFormPageSeen(SubscriptionChooseAndPayFormPageSeenEvent $event): void
  57. {
  58. $user = $event->getUser();
  59. $this->usageEventService->eventHasOccurredForUser(
  60. $user,
  61. UsageEvent::EVENT_TYPE_USER_HAS_SEEN_SUBSCRIPTION_PAGE
  62. );
  63. // Since the flex membership is only selectable membership, we do not need to initialize the tracking for the other two memberships
  64. foreach ([14, 15, 16, 17, 18, 19, 20, 21] as $subcampaignId) {
  65. $this->conversionEventService->initiateGoalReachedConversionTracking(
  66. $user,
  67. ConversionEventService::CAMPAIGN_ID_SUBSCRIPTION,
  68. $subcampaignId,
  69. null,
  70. null,
  71. null,
  72. json_encode(['trialMitlgliedschaft' => $event->isTrialPage()])
  73. );
  74. }
  75. }
  76. /** @throws Exception
  77. * @throws \Doctrine\DBAL\Driver\Exception
  78. */
  79. public function onSubscriptionSuccessfullyCompletedEvent(SubscriptionSuccessfullyCompletedEvent $event): void
  80. {
  81. $user = $event->getUser();
  82. if ($user->isJobofferer()) {
  83. $this->businessEventDomainService->writeNewEvent(
  84. BusinessEvent::EVENT_TYPE_SUBSCRIPTION_COMPLETED,
  85. $user,
  86. null,
  87. null,
  88. json_encode(['billwerkPlanVariantId' => $event->getPlanVariantId()])
  89. );
  90. }
  91. if ($user->isJobseeker()) {
  92. $this->businessEventDomainService->writeNewEvent(
  93. BusinessEvent::EVENT_TYPE_JOBSEEKER_MEMBERSHIP_SUCCESSFULLY_CREATED,
  94. $user,
  95. null,
  96. null,
  97. json_encode(['billwerkPlanVariantId' => $event->getPlanVariantId()])
  98. );
  99. $this->conversionEventService->handleConversionGoalReached(
  100. ConversionEventService::CAMPAIGN_ID_JOBSEEKER_PREMIUM_MEMBERSHIP_MAILING,
  101. 0,
  102. null,
  103. $event->getUser()
  104. );
  105. }
  106. $this->usageEventService->eventHasOccurredForUser($user, UsageEvent::EVENT_TYPE_USER_HAS_COMPLETED_SUBSCRIPTION);
  107. $this->userService->unpauseIfPaused($user);
  108. $this->messageBus->dispatch(
  109. new DispatchCreateJobradarMatchSymfonyMessagesForUserSymfonyMessage(
  110. $user
  111. )
  112. );
  113. $membershipStatus = MembershipService::MEMBERSHIP_STATUS_FLEX;
  114. $planVariant = null;
  115. $contract = $this->membershipService->getLatestBillwerkContractForUser($user);
  116. if (!is_null($contract) && !is_null($planVariantId = $contract->getPlanVariantId())) {
  117. $planVariant = $this->billwerkPlanVariantService->getPlanVariantById($planVariantId);
  118. $membershipStatus = $this->billwerkPlanVariantService->getPlanVariantById($planVariantId)->getMembershipStatus();
  119. }
  120. $this->conversionEventService->handleConversionGoalReached(
  121. ConversionEventService::CAMPAIGN_ID_NOTIFICATION,
  122. NotificationService::NOTIFICATION_TYPE_MISSING_SUBSCRIPTION_WITHOUT_TRIAL_AFTER_SEEING_SUBSCRIPTION_PAGE,
  123. null,
  124. null,
  125. null,
  126. $planVariant
  127. );
  128. $subcampaignIdFlexMembership = 14;
  129. $this->conversionEventService->handleConversionGoalReached(
  130. ConversionEventService::CAMPAIGN_ID_SUBSCRIPTION,
  131. $membershipStatus === MembershipService::MEMBERSHIP_STATUS_MULTI_LOCATIONS ? 7 : $subcampaignIdFlexMembership,
  132. null,
  133. $user,
  134. null,
  135. $planVariant,
  136. json_encode(['trialMitgliedschaft' => $planVariant->getTrial()])
  137. );
  138. $this->conversionEventService->handleConversionGoalReached(
  139. ConversionEventService::CAMPAIGN_ID_OUTGOING_DIRECT_EMAILS,
  140. 1,
  141. null,
  142. $user,
  143. null,
  144. $planVariant
  145. );
  146. $this->conversionEventService->handleConversionGoalReached(
  147. ConversionEventService::CAMPAIGN_ID_OUTGOING_DIRECT_EMAILS,
  148. 3,
  149. null,
  150. $user,
  151. null,
  152. $planVariant
  153. );
  154. $subcampaignIds = [];
  155. if ($membershipStatus === MembershipService::MEMBERSHIP_STATUS_BASIC) {
  156. if (!is_null($event->getRuntime())) {
  157. switch ($event->getRuntime()) {
  158. case BillwerkSynchronizationService::RUNTIME_1_MONTH:
  159. $subcampaignIds[] = 1;
  160. break;
  161. case BillwerkSynchronizationService::RUNTIME_3_MONTHS:
  162. $subcampaignIds[] = 2;
  163. break;
  164. case BillwerkSynchronizationService::RUNTIME_6_MONTHS:
  165. $subcampaignIds[] = 3;
  166. break;
  167. default:
  168. break;
  169. }
  170. }
  171. if (!is_null($event->getPaymentMethod())) {
  172. switch ($event->getPaymentMethod()) {
  173. case BillwerkSynchronizationService::PAYMENT_METHOD_BANKACCOUNT:
  174. $subcampaignIds[] = 4;
  175. break;
  176. case BillwerkSynchronizationService::PAYMENT_METHOD_PAYPAL:
  177. $subcampaignIds[] = 5;
  178. break;
  179. case BillwerkSynchronizationService::PAYMENT_METHOD_CREDITCARD:
  180. $subcampaignIds[] = 6;
  181. break;
  182. default:
  183. break;
  184. }
  185. }
  186. } elseif ($membershipStatus === MembershipService::MEMBERSHIP_STATUS_MULTI_LOCATIONS) {
  187. if (!is_null($event->getRuntime())) {
  188. switch ($event->getRuntime()) {
  189. case BillwerkSynchronizationService::RUNTIME_1_MONTH:
  190. $subcampaignIds[] = 8;
  191. break;
  192. case BillwerkSynchronizationService::RUNTIME_3_MONTHS:
  193. $subcampaignIds[] = 9;
  194. break;
  195. case BillwerkSynchronizationService::RUNTIME_6_MONTHS:
  196. $subcampaignIds[] = 10;
  197. break;
  198. default:
  199. break;
  200. }
  201. }
  202. if (!is_null($event->getPaymentMethod())) {
  203. switch ($event->getPaymentMethod()) {
  204. case BillwerkSynchronizationService::PAYMENT_METHOD_BANKACCOUNT:
  205. $subcampaignIds[] = 11;
  206. break;
  207. case BillwerkSynchronizationService::PAYMENT_METHOD_PAYPAL:
  208. $subcampaignIds[] = 12;
  209. break;
  210. case BillwerkSynchronizationService::PAYMENT_METHOD_CREDITCARD:
  211. $subcampaignIds[] = 13;
  212. break;
  213. default:
  214. break;
  215. }
  216. }
  217. } elseif ($membershipStatus === MembershipService::MEMBERSHIP_STATUS_FLEX) {
  218. if (!is_null($event->getRuntime())) {
  219. switch ($event->getRuntime()) {
  220. case BillwerkSynchronizationService::RUNTIME_1_MONTH:
  221. $subcampaignIds[] = 15;
  222. break;
  223. case BillwerkSynchronizationService::RUNTIME_3_MONTHS:
  224. $subcampaignIds[] = 16;
  225. break;
  226. case BillwerkSynchronizationService::RUNTIME_6_MONTHS:
  227. $subcampaignIds[] = 17;
  228. break;
  229. default:
  230. break;
  231. }
  232. }
  233. if (!is_null($event->getPaymentMethod())) {
  234. switch ($event->getPaymentMethod()) {
  235. case BillwerkSynchronizationService::PAYMENT_METHOD_BANKACCOUNT:
  236. $subcampaignIds[] = 18;
  237. break;
  238. case BillwerkSynchronizationService::PAYMENT_METHOD_PAYPAL:
  239. $subcampaignIds[] = 19;
  240. break;
  241. case BillwerkSynchronizationService::PAYMENT_METHOD_CREDITCARD:
  242. $subcampaignIds[] = 20;
  243. break;
  244. case BillwerkSynchronizationService::PAYMENT_METHOD_INVOICE:
  245. $subcampaignIds[] = 21;
  246. break;
  247. default:
  248. break;
  249. }
  250. }
  251. }
  252. foreach ($subcampaignIds as $subcampaignId) {
  253. $this->conversionEventService->handleConversionGoalReached(
  254. ConversionEventService::CAMPAIGN_ID_SUBSCRIPTION,
  255. $subcampaignId,
  256. null,
  257. $user,
  258. null,
  259. $planVariant,
  260. json_encode(['trialMitgliedschaft' => $planVariant->getTrial()])
  261. );
  262. }
  263. $this->conversionEventService->handleConversionGoalReached(
  264. ConversionEventService::CAMPAIGN_ID_HOTEL_GASTRO_OEFFNET_WIEDER_MAILING_2020_05_06,
  265. 2,
  266. null,
  267. $user
  268. );
  269. $this->conversionEventService->handleConversionGoalReached(
  270. ConversionEventService::CAMPAIGN_ID_HOTEL_GASTRO_OEFFNET_WIEDER_MAILING_2020_05_06,
  271. 12,
  272. null,
  273. $user
  274. );
  275. $this->conversionEventService->handleConversionGoalReached(
  276. ConversionEventService::CAMPAIGN_ID_HOTEL_GASTRO_OEFFNET_WIEDER_MAILING_2020_05_06,
  277. 22,
  278. null,
  279. $user
  280. );
  281. $this->conversionEventService->handleConversionGoalReached(
  282. ConversionEventService::CAMPAIGN_ID_NOTIFICATION,
  283. NotificationService::NOTIFICATION_TYPE_MISSING_JOBOFFERER_ACTIVITY,
  284. null,
  285. $user,
  286. null,
  287. $planVariant
  288. );
  289. $this->conversionEventService->handleConversionGoalReached(
  290. ConversionEventService::CAMPAIGN_ID_NOTIFICATION,
  291. NotificationService::NOTIFICATION_TYPE_MISSING_SUBSCRIPTION_WITH_TRIAL,
  292. null,
  293. $user,
  294. null,
  295. $planVariant
  296. );
  297. $this->conversionEventService->handleConversionGoalReached(
  298. ConversionEventService::CAMPAIGN_ID_NOTIFICATION,
  299. NotificationService::NOTIFICATION_TYPE_MISSING_SUBSCRIPTION_WITHOUT_TRIAL,
  300. null,
  301. $user,
  302. null,
  303. $planVariant
  304. );
  305. $this->conversionEventService->handleConversionGoalReached(
  306. ConversionEventService::CAMPAIGN_ID_JOBOFFERER_MAILING_170521,
  307. 0,
  308. null,
  309. $user
  310. );
  311. $this->conversionEventService->handleConversionGoalReached(
  312. ConversionEventService::CAMPAIGN_ID_JOBOFFERER_MAILING_140621,
  313. 0,
  314. null,
  315. $user
  316. );
  317. $this->conversionEventService->handleConversionGoalReached(
  318. ConversionEventService::CAMPAIGN_ID_JOBOFFERER_MAILING_140621,
  319. 0,
  320. null,
  321. $user
  322. );
  323. $this->conversionEventService->handleConversionGoalReached(
  324. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_AKTION,
  325. 1,
  326. null,
  327. $user
  328. );
  329. $this->conversionEventService->handleConversionGoalReached(
  330. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_SONDERAKTION,
  331. 1,
  332. null,
  333. $user
  334. );
  335. $this->conversionEventService->handleConversionGoalReached(
  336. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_ANGEBOT,
  337. 1,
  338. null,
  339. $user
  340. );
  341. $this->conversionEventService->handleConversionGoalReached(
  342. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_SONDERANGEBOT,
  343. 1,
  344. null,
  345. $user
  346. );
  347. $this->conversionEventService->handleConversionGoalReached(
  348. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_JETZT,
  349. 1,
  350. null,
  351. $user
  352. );
  353. if ($user->isJobofferer()) {
  354. /** @var AutomatedEmailNotificationDefinitionTextContent $textContent */
  355. $textContent = $this->automatedEmailNotificationDefinitionTextContentRepository->findOneBy(
  356. [
  357. 'automatedEmailNotificationDefinition' => MailService::MAIL_ID_INFO_AFTER_SUCCESSFUL_SUBSCRIPTION,
  358. 'subjectId' => AutomatedEmailNotificationDefinitionService::SUBJECT_ID_INFO_AFTER_SUCCESSFUL_SUBSCRIPTION,
  359. 'bodyId' => AutomatedEmailNotificationDefinitionService::BODY_ID_INFO_AFTER_SUCCESSFUL_SUBSCRIPTION
  360. ]
  361. );
  362. $message = (new Swift_Message($textContent->getSubject()))
  363. ->setFrom('team@joboo.de', $this->translator->trans('mailfromname.team'))
  364. ->setTo($user->getEmail())
  365. ->setBody(
  366. $this->twigEnvironment->render(
  367. $textContent->getTwigTemplateName(),
  368. [
  369. 'firstname' => ProfileService::getFirstnameOrAlternativeForSalutation(
  370. $user->getDefaultJoboffererProfile()
  371. ),
  372. 'confirmationUrl' => $this->routerHelperService->generate(
  373. 'mydays_voucher_request',
  374. ['usersId' => $user->getId()],
  375. UrlGeneratorInterface::ABSOLUTE_URL
  376. )
  377. ]
  378. ),
  379. 'text/html'
  380. );
  381. $this->mailService->queueForSending(
  382. MailService::MAIL_ID_INFO_AFTER_SUCCESSFUL_SUBSCRIPTION,
  383. $message,
  384. $user
  385. );
  386. }
  387. $this->conversionEventService->handleConversionGoalReached(
  388. ConversionEventService::CAMPAIGN_ID_MEMBERSHIP_TRACKING_NEW_CTAS,
  389. 0,
  390. null,
  391. $event->getUser()
  392. );
  393. $this->conversionEventService->handleConversionGoalReached(
  394. ConversionEventService::CAMPAIGN_ID_MEMBERSHIP_TRACKING_NEW_CTAS,
  395. 1,
  396. null,
  397. $event->getUser()
  398. );
  399. $this->conversionEventService->handleConversionGoalReached(
  400. ConversionEventService::CAMPAIGN_ID_NOTIFICATION,
  401. NotificationService::NOTIFICATION_TYPE_MISSING_TRIAL_AFTER_REGISTRATION,
  402. null,
  403. $event->getUser()
  404. );
  405. $this->conversionEventService->handleConversionGoalReached(
  406. ConversionEventService::CAMPAIGN_ID_JOBOFFERERS_THAT_NEVER_USED_FREE_TRIAL_FREE_TWO_MONTH_TRIAL,
  407. 0,
  408. null,
  409. $event->getUser()
  410. );
  411. $this->conversionEventService->handleConversionGoalReached(
  412. ConversionEventService::CAMPAIGN_ID_JOBOFFERERS_THAT_NEVER_USED_FREE_TRIAL_FREE_TWO_MONTH_TRIAL,
  413. 1,
  414. null,
  415. $event->getUser()
  416. );
  417. $this->conversionEventService->handleConversionGoalReached(
  418. ConversionEventService::CAMPAIGN_ID_FACEBOOK,
  419. 502,
  420. null,
  421. $event->getUser()
  422. );
  423. // Marketing-Landingpages AG-Subscription (pages.joboo.de)
  424. // Loop über alle möglichen Subcampaign-IDs (0-1000)
  425. if ($user->isJobofferer()) {
  426. for ($subcampaignId = 0; $subcampaignId <= 1000; ++$subcampaignId) {
  427. $this->conversionEventService->handleConversionGoalReached(
  428. ConversionEventService::CAMPAIGN_ID_DIGITAL_ESTATE_MARKETING_LANDINGPAGES_AG_SUBSCRIPTION,
  429. $subcampaignId,
  430. null,
  431. $user,
  432. null,
  433. $planVariant
  434. );
  435. }
  436. }
  437. $this->agenturFuerArbeitService->queueReminderMailingForAfaCategorizationIfNecessary(null, $user);
  438. }
  439. }