src/App/Controller/DefaultController.php line 180

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\AutomatedEmailNotificationDefinition\AutomatedEmailNotificationDefinitionTextContent;
  4. use App\Entity\ContactForCorporateClientMessage;
  5. use App\Entity\ContactMessage;
  6. use App\Entity\ConversationMessage\ConversationMessage;
  7. use App\Entity\RecurrentJob;
  8. use App\Entity\UsageEvent;
  9. use App\Entity\User;
  10. use App\Entity\WantedJob;
  11. use App\Event\RatingEvent;
  12. use App\Form\ContactForCorporateClientMessageType;
  13. use App\Form\ContactMessageType;
  14. use App\Form\RatingType;
  15. use App\Form\RecurrentJobsSearchParametersType;
  16. use App\Service\AutomatedEmailNotificationDefinitionService;
  17. use App\Service\CaptchaService;
  18. use App\Service\ConversationMessageFolderService;
  19. use App\Service\ConversationMessageService;
  20. use App\Service\ConversionEventService;
  21. use App\Service\CookieService;
  22. use App\Service\EntityTransformationService;
  23. use App\Service\ExternalFeedsService;
  24. use App\Service\FeatureLimitationsService;
  25. use App\Service\FrontendSpaService;
  26. use App\Service\GeneralValuesGaugesService;
  27. use App\Service\LandingPageService;
  28. use App\Service\MailService;
  29. use App\Service\Membership\MembershipService;
  30. use App\Service\ProfileService;
  31. use App\Service\RatingService;
  32. use App\Service\RecurrentJobsSearchService;
  33. use App\Service\RedirectHelperService;
  34. use App\Service\RouterHelperService;
  35. use App\Service\SessionService;
  36. use App\Service\UsageEventService;
  37. use App\Utility\Checksummer;
  38. use App\Utility\DateTimeUtility;
  39. use App\Validator\XssSafeValidator;
  40. use DateTime;
  41. use Doctrine\ORM\EntityManagerInterface;
  42. use Exception;
  43. use GuzzleHttp\Exception\GuzzleException;
  44. use JanusHercules\DatawarehouseIntegration\Domain\Entity\BusinessEvent;
  45. use JanusHercules\DatawarehouseIntegration\Domain\Service\BusinessEventDomainService;
  46. use Psr\Http\Client\ClientExceptionInterface;
  47. use Swift_Message;
  48. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  49. use Symfony\Component\HttpFoundation\RedirectResponse;
  50. use Symfony\Component\HttpFoundation\Request;
  51. use Symfony\Component\HttpFoundation\Response;
  52. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  53. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  54. use Symfony\Component\HttpKernel\KernelInterface;
  55. use Symfony\Component\Routing\Exception\ResourceNotFoundException;
  56. use Symfony\Component\Routing\RouterInterface;
  57. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  58. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  59. use Symfony\Contracts\Translation\TranslatorInterface;
  60. use Twig\Environment;
  61. use Twig\Error\LoaderError;
  62. use Twig\Error\RuntimeError;
  63. use Twig\Error\SyntaxError;
  64. class DefaultController extends AbstractController
  65. {
  66. private TranslatorInterface $translator;
  67. private RedirectHelperService $redirectHelperService;
  68. public string $digitalEstateUrlContent;
  69. public string $digitalEstateUrlPro;
  70. public function __construct(
  71. TranslatorInterface $translator,
  72. RedirectHelperService $redirectHelperService,
  73. string $digitalEstateUrlContent,
  74. string $digitalEstateUrlPro,
  75. private KernelInterface $kernel
  76. ) {
  77. $this->translator = $translator;
  78. $this->redirectHelperService = $redirectHelperService;
  79. $this->digitalEstateUrlContent = $digitalEstateUrlContent;
  80. $this->digitalEstateUrlPro = $digitalEstateUrlPro;
  81. }
  82. /**
  83. * We end up here if no other route matches
  84. * Because we want users to always be on a language path, we redirect.
  85. */
  86. public function catchallAction(
  87. Request $request,
  88. RouterInterface $router
  89. ): Response {
  90. if ($response = $this->redirectHelperService->getResponseForRequest($request, 'Diese Seite ist nicht verfügbar. <a href="/">Zur Startseite.</a>')) {
  91. return $response;
  92. }
  93. $path = urldecode(parse_url($request->getRequestUri())['path']);
  94. $preferred = $request->getPreferredLanguage(['de']);
  95. $redirectTo = '/' . $preferred . $path;
  96. try {
  97. $matched = $router->match($redirectTo);
  98. if ($matched['_route'] === 'catchall') {
  99. return $this->render('/errors/notfound.html.twig', [], new Response(null, Response::HTTP_NOT_FOUND));
  100. }
  101. } catch (ResourceNotFoundException) {
  102. return $this->render('/errors/notfound.html.twig', [], new Response(null, Response::HTTP_NOT_FOUND));
  103. }
  104. return $this->redirect($this->appendQueryStringToUrl($redirectTo, $request), Response::HTTP_MOVED_PERMANENTLY);
  105. }
  106. private function appendQueryStringToUrl(
  107. string $url,
  108. Request $request
  109. ): string {
  110. $append = '';
  111. if (trim($request->getQueryString()) !== '') {
  112. $append = '?' . $request->getQueryString();
  113. }
  114. return $url . $append;
  115. }
  116. /** @throws Exception */
  117. public function homepageAction(
  118. Request $request,
  119. GeneralValuesGaugesService $gaugesService,
  120. FeatureLimitationsService $featureLimitationsService,
  121. FrontendSpaService $frontendSpaService,
  122. ConversionEventService $conversionEventService,
  123. RecurrentJobsSearchService $recurrentJobsSearchService
  124. ): Response {
  125. $scrollingNumberWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  126. /** @var User $user */
  127. $user = $this->getUser();
  128. $conversionEventService->initiateGoalReachedConversionTrackingBasedOnRequest(
  129. $request,
  130. $user
  131. );
  132. if (!is_null($user)) {
  133. if (!$featureLimitationsService->userCanUseWebsiteOutsideOfExternalJobPostingCrawlerManager($user)) {
  134. return $this->redirect($frontendSpaService->getSpaUrl(FrontendSpaService::ROUTE_EXTERNAL_JOB_POSTING_CRAWLER_MANAGEMENT_CONTENT_PARSER_TASK_MANAGER));
  135. }
  136. return $this->redirectToRoute('dashboard');
  137. } else {
  138. // Redirect to reverse proxy for webflow page
  139. if ($this->kernel->getEnvironment() === 'prod') {
  140. return new RedirectResponse(
  141. '/de/home',
  142. Response::HTTP_TEMPORARY_REDIRECT
  143. );
  144. }
  145. }
  146. $formPrefillOccupationalFieldSearchterm = '';
  147. if ($request->get('occupationalFieldSearchterm')) {
  148. $formPrefillOccupationalFieldSearchterm = $request->get('occupationalFieldSearchterm');
  149. }
  150. $recurrentJobsSearchParameters = $recurrentJobsSearchService->prefillForm($user, $formPrefillOccupationalFieldSearchterm);
  151. $form = $this->createForm(
  152. RecurrentJobsSearchParametersType::class,
  153. $recurrentJobsSearchParameters,
  154. [
  155. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  156. 'method' => 'GET'
  157. ]
  158. );
  159. $response = $this->render(
  160. '/default/homepage.html.twig',
  161. [
  162. 'form' => $form->createView(),
  163. 'targetProfileTypes' => 'all',
  164. 'occupationalField' => null,
  165. 'scrollingNumbersWidgetValueSet' => $scrollingNumberWidgetValueSet
  166. ]
  167. );
  168. $response->setVary('Cookie');
  169. $response->setSharedMaxAge(60);
  170. return $response;
  171. }
  172. /**
  173. * @throws Exception
  174. */
  175. public function homepageFBAction(
  176. ConversionEventService $conversionEventService,
  177. GeneralValuesGaugesService $gaugesService
  178. ): Response {
  179. $conversionEventService->initiateGoalReachedConversionTracking(
  180. null,
  181. ConversionEventService::CAMPAIGN_ID_FACEBOOK,
  182. 2
  183. );
  184. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  185. $form = $this->createForm(
  186. RecurrentJobsSearchParametersType::class,
  187. null,
  188. [
  189. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  190. 'method' => 'GET'
  191. ]
  192. );
  193. $response = $this->render(
  194. '/default/homepage.html.twig',
  195. [
  196. 'form' => $form->createView(),
  197. 'targetProfileTypes' => 'all',
  198. 'occupationalField' => null,
  199. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  200. ]
  201. );
  202. $response->setVary('Cookie');
  203. $response->setSharedMaxAge(60);
  204. return $response;
  205. }
  206. /**
  207. * @throws Exception
  208. */
  209. public function landingpageFBDynamicAction(
  210. Request $request,
  211. ConversionEventService $conversionEventService,
  212. GeneralValuesGaugesService $gaugesService
  213. ): Response {
  214. $subcampaignId = (int)$request->get('subcampaignId');
  215. if ($subcampaignId < 8 || $subcampaignId > 30) {
  216. return $this->redirectToRoute('homepage');
  217. }
  218. $conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_FACEBOOK, $subcampaignId);
  219. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  220. $form = $this->createForm(
  221. RecurrentJobsSearchParametersType::class,
  222. null,
  223. [
  224. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  225. 'method' => 'GET'
  226. ]
  227. );
  228. $response = $this->render(
  229. '/default/homepage.html.twig',
  230. [
  231. 'form' => $form->createView(),
  232. 'targetProfileTypes' => 'all',
  233. 'occupationalField' => null,
  234. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  235. ]
  236. );
  237. $response->setVary('Cookie');
  238. $response->setSharedMaxAge(60);
  239. return $response;
  240. }
  241. /**
  242. * @throws Exception
  243. */
  244. public function homepageFBNewAction(
  245. ConversionEventService $conversionEventService,
  246. GeneralValuesGaugesService $gaugesService
  247. ): Response {
  248. $conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_FACEBOOK, 6);
  249. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  250. $form = $this->createForm(
  251. RecurrentJobsSearchParametersType::class,
  252. null,
  253. [
  254. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  255. 'method' => 'GET'
  256. ]
  257. );
  258. $response = $this->render(
  259. '/default/homepage.html.twig',
  260. [
  261. 'form' => $form->createView(),
  262. 'targetProfileTypes' => 'all',
  263. 'occupationalField' => null,
  264. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  265. ]
  266. );
  267. $response->setVary('Cookie');
  268. $response->setSharedMaxAge(60);
  269. return $response;
  270. }
  271. /**
  272. * @throws Exception
  273. */
  274. public function landingpageFBSearchAction(
  275. ConversionEventService $conversionEventService
  276. ): RedirectResponse {
  277. $conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_FACEBOOK, 7);
  278. return $this->redirectToRoute('recurrent_jobs_search.form');
  279. }
  280. /**
  281. * @throws Exception
  282. */
  283. public function criteoLandingpageAction(
  284. ConversionEventService $conversionEventService,
  285. GeneralValuesGaugesService $gaugesService
  286. ): Response {
  287. if (is_null($this->getUser())) {
  288. $conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_CRITEO, 1);
  289. }
  290. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  291. $form = $this->createForm(
  292. RecurrentJobsSearchParametersType::class,
  293. null,
  294. [
  295. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  296. 'method' => 'GET'
  297. ]
  298. );
  299. $response = $this->render(
  300. '/default/homepage.html.twig',
  301. [
  302. 'form' => $form->createView(),
  303. 'targetProfileTypes' => 'all',
  304. 'occupationalField' => null,
  305. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  306. ]
  307. );
  308. $response->setVary('Cookie');
  309. $response->setSharedMaxAge(60);
  310. return $response;
  311. }
  312. /**
  313. * @throws Exception
  314. */
  315. public function criteoRemarketingpageAction(
  316. ConversionEventService $conversionEventService,
  317. GeneralValuesGaugesService $gaugesService
  318. ): Response {
  319. if (is_null($this->getUser())) {
  320. $conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_CRITEO, 2);
  321. }
  322. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  323. $form = $this->createForm(
  324. RecurrentJobsSearchParametersType::class,
  325. null,
  326. [
  327. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  328. 'method' => 'GET'
  329. ]
  330. );
  331. $response = $this->render(
  332. '/default/homepage.html.twig',
  333. [
  334. 'form' => $form->createView(),
  335. 'targetProfileTypes' => 'all',
  336. 'occupationalField' => null,
  337. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  338. ]
  339. );
  340. $response->setVary('Cookie');
  341. $response->setSharedMaxAge(60);
  342. return $response;
  343. }
  344. public function videoAction(): Response
  345. {
  346. $response = $this->render('/default/video.html.twig');
  347. $response->setVary('Cookie');
  348. $response->setSharedMaxAge(60);
  349. return $response;
  350. }
  351. /**
  352. * @throws Exception
  353. */
  354. public function landingpageAction(
  355. Request $request,
  356. ConversionEventService $conversionEventService,
  357. GeneralValuesGaugesService $gaugesService,
  358. RecurrentJobsSearchService $recurrentJobsSearchService
  359. ): Response {
  360. if ($request->attributes->get('id') === '101') {
  361. $conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_EBAY, 1);
  362. }
  363. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  364. $user = $this->getUser();
  365. $formPrefillOccupationalFieldSearchterm = '';
  366. if ($request->get('occupationalFieldSearchterm')) {
  367. $formPrefillOccupationalFieldSearchterm = $request->get('occupationalFieldSearchterm');
  368. }
  369. $recurrentJobsSearchParameters = $recurrentJobsSearchService->prefillForm($user, $formPrefillOccupationalFieldSearchterm);
  370. $form = $this->createForm(
  371. RecurrentJobsSearchParametersType::class,
  372. $recurrentJobsSearchParameters,
  373. [
  374. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  375. 'method' => 'GET'
  376. ]
  377. );
  378. $response = $this->render(
  379. '/default/homepage.html.twig',
  380. [
  381. 'form' => $form->createView(),
  382. 'targetProfileTypes' => 'all',
  383. 'hasHgkExtra' => $request->attributes->get('id') === '112',
  384. 'occupationalField' => null,
  385. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  386. ]
  387. );
  388. $response->setVary('Cookie');
  389. $response->setSharedMaxAge(60);
  390. return $response;
  391. }
  392. public function landingpageJobseekerAction(): Response
  393. {
  394. $response = $this->render(
  395. '/default/landingpage.html.twig',
  396. [
  397. 'targetProfileTypes' => 'jobseekers'
  398. ]
  399. );
  400. $response->setVary('Cookie');
  401. $response->setSharedMaxAge(60);
  402. return $response;
  403. }
  404. public function landingpageJoboffererAction(): Response
  405. {
  406. $response = $this->render(
  407. '/default/landingpage.html.twig',
  408. [
  409. 'targetProfileTypes' => 'jobofferers'
  410. ]
  411. );
  412. $response->setVary('Cookie');
  413. $response->setSharedMaxAge(60);
  414. return $response;
  415. }
  416. /**
  417. * @throws Exception
  418. */
  419. public function trackableLandingpageGmxDesktopAction(
  420. ConversionEventService $conversionEventService,
  421. GeneralValuesGaugesService $gaugesService
  422. ): Response {
  423. if (is_null($this->getUser())) {
  424. $conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_GMX, 0);
  425. }
  426. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  427. $form = $this->createForm(
  428. RecurrentJobsSearchParametersType::class,
  429. null,
  430. [
  431. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  432. 'method' => 'GET'
  433. ]
  434. );
  435. $response = $this->render(
  436. '/default/homepage.html.twig',
  437. [
  438. 'form' => $form->createView(),
  439. 'targetProfileTypes' => 'all',
  440. 'occupationalField' => null,
  441. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  442. ]
  443. );
  444. $response->setVary('Cookie');
  445. $response->setSharedMaxAge(60);
  446. return $response;
  447. }
  448. /**
  449. * @throws Exception
  450. */
  451. public function trackableLandingpageGmxMobileAction(
  452. ConversionEventService $conversionEventService,
  453. GeneralValuesGaugesService $gaugesService
  454. ): Response {
  455. if (is_null($this->getUser())) {
  456. $conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_GMX, 1);
  457. }
  458. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  459. $form = $this->createForm(
  460. RecurrentJobsSearchParametersType::class,
  461. null,
  462. [
  463. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  464. 'method' => 'GET'
  465. ]
  466. );
  467. $response = $this->render(
  468. '/default/homepage.html.twig',
  469. [
  470. 'form' => $form->createView(),
  471. 'targetProfileTypes' => 'all',
  472. 'occupationalField' => null,
  473. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  474. ]
  475. );
  476. $response->setVary('Cookie');
  477. $response->setSharedMaxAge(60);
  478. return $response;
  479. }
  480. private function compileUserIdAndUserRole(
  481. ?User $user,
  482. Request $request
  483. ): string {
  484. $userId = (!is_null($user) ? $user->getId() : $this->translator->trans('contact_message.unknown'));
  485. $userRole = '(unbekannt)';
  486. $adminUrl = '';
  487. if (!is_null($user)) {
  488. $adminUrl = '(' . $request->getSchemeAndHttpHost() . $this->generateUrl('admin.users', ['q' => $user->getId()]) . ')';
  489. if ($user->isJobofferer()) {
  490. $userRole = 'Jobofferer';
  491. } elseif ($user->isJobseeker()) {
  492. $userRole = 'Jobseeker';
  493. }
  494. }
  495. return $this->translator->trans('contact_message.email_prefix', [
  496. '%id%' => $userId,
  497. '%role%' => $userRole,
  498. '%admin_url%' => $adminUrl
  499. ]);
  500. }
  501. /**
  502. * @throws GuzzleException
  503. * @throws ClientExceptionInterface
  504. * @throws \Doctrine\DBAL\Driver\Exception
  505. */
  506. public function contactAction(
  507. Request $request,
  508. CaptchaService $captchaService,
  509. MailService $mailService,
  510. EntityTransformationService $entityTransformationService,
  511. ): Response {
  512. $form = $this->createForm(ContactMessageType::class);
  513. $form->handleRequest($request);
  514. /** @var User|null $user */
  515. $user = $this->getUser();
  516. if ($form->isSubmitted() && $form->isValid()) {
  517. if (!$captchaService->requestContainsValidCaptchaSolution($request)) {
  518. return $this->render(
  519. 'errors/general_error.html.twig',
  520. [
  521. 'alert_message' => $this->translator->trans('errors.contact_form_wrong_recaptcha.alert_message'),
  522. 'main_content_message' => $this->translator->trans('errors.contact_form_wrong_recaptcha.main_content_message')
  523. ],
  524. new Response('', Response::HTTP_BAD_REQUEST)
  525. );
  526. }
  527. /** @var ContactMessage $contactMessage */
  528. $contactMessage = $form->getData();
  529. $compiledUserInformation = $this->compileUserIdAndUserRole($user, $request);
  530. $message = new Swift_Message(
  531. 'Kundenmail: ' . $contactMessage->subject,
  532. $compiledUserInformation . 'Absender: ' . $contactMessage->email . "\n\n" . $contactMessage->body
  533. );
  534. $message->setReplyTo($contactMessage->email);
  535. $message->setTo(
  536. [
  537. MailService::RECEIVER_MAILADDRESS_INFO
  538. ]
  539. );
  540. $message->setFrom(MailService::DEFAULT_SENDER_ADMINISTRATION_MAILADDRESS, $this->translator->trans('mailfromname.administration'));
  541. $mailService->queueForSending(MailService::MAIL_ID_CUSTOMER_SERVICE_CONTACT, $message, $this->getUser());
  542. $this->addFlash('success', $this->translator->trans('contact_page.success'));
  543. return $this->redirectToRoute(
  544. 'contact',
  545. [],
  546. Response::HTTP_SEE_OTHER
  547. );
  548. }
  549. if (!$form->isSubmitted()) {
  550. $subjectPrefill = $request->get('newContactMessageSubjectPrefill', '');
  551. $bodyPrefill = $request->get('newContactMessageBodyPrefill', '');
  552. $emailPrefill = $request->get('newContactMessageEmailPrefill', '');
  553. $contactMessage = new ContactMessage();
  554. $contactMessage->subject = strip_tags($subjectPrefill);
  555. $contactMessage->body = strip_tags($bodyPrefill);
  556. $contactMessage->email = strip_tags($emailPrefill);
  557. $form->setData($contactMessage);
  558. }
  559. $response = $this->render(
  560. '/default/contact.html.twig',
  561. [
  562. 'form' => $form->createView(),
  563. 'faqs' => $entityTransformationService->getFAQsForView($user),
  564. 'contactOpen' => $request->get('contactOpen', false)
  565. ]
  566. );
  567. $response->setVary('Cookie');
  568. $response->setSharedMaxAge(60);
  569. return $response;
  570. }
  571. /**
  572. * @throws SyntaxError
  573. * @throws ClientExceptionInterface
  574. * @throws \Doctrine\DBAL\Driver\Exception
  575. * @throws RuntimeError
  576. * @throws GuzzleException
  577. * @throws LoaderError
  578. */
  579. public function contactForCorporateClientsAction(
  580. Request $request,
  581. CaptchaService $captchaService,
  582. MailService $mailService,
  583. EntityManagerInterface $entityManager,
  584. Environment $twigEnvironment
  585. ): Response {
  586. $form = $this->createForm(ContactForCorporateClientMessageType::class);
  587. $form->handleRequest($request);
  588. $source = $request->get('source', '');
  589. if (!XssSafeValidator::isXssSafe($source)) {
  590. throw new BadRequestHttpException();
  591. }
  592. if ($form->isSubmitted() && $form->isValid()) {
  593. if (!$captchaService->requestContainsValidCaptchaSolution($request)) {
  594. return $this->render(
  595. 'errors/general_error.html.twig',
  596. [
  597. 'alert_message' => $this->translator->trans('errors.contact_form_wrong_recaptcha.alert_message'),
  598. 'main_content_message' => $this->translator->trans('errors.contact_form_wrong_recaptcha.main_content_message')
  599. ],
  600. new Response('', Response::HTTP_BAD_REQUEST)
  601. );
  602. } else {
  603. /** @var ContactForCorporateClientMessage $contactForCorporateClientMessage */
  604. $contactForCorporateClientMessage = $form->getData();
  605. $body = $this->translator->trans(
  606. 'contact_for_corporate_clients_mail.body',
  607. [
  608. '%source%' => $source,
  609. '%email%' => $contactForCorporateClientMessage->email,
  610. '%numberOfOffices%' => $contactForCorporateClientMessage->numberOfOffices,
  611. '%numberOfVacancies%' => $contactForCorporateClientMessage->numberOfVacancies,
  612. '%company%' => $contactForCorporateClientMessage->company,
  613. '%name%' => $contactForCorporateClientMessage->name,
  614. '%phone%' => $contactForCorporateClientMessage->phone,
  615. '%message%' => $contactForCorporateClientMessage->body
  616. ]
  617. );
  618. $subject = $this->translator->trans(
  619. 'contact_for_corporate_clients_mail.subject',
  620. [
  621. '%numberOfOffices%' => $contactForCorporateClientMessage->numberOfOffices,
  622. '%company%' => $contactForCorporateClientMessage->company
  623. ]
  624. );
  625. $message = new Swift_Message($subject, $body);
  626. $message->setTo(
  627. [
  628. 'grosskundenanfrage@joboo.de'
  629. ]
  630. );
  631. $message->setFrom(MailService::DEFAULT_SENDER_ADMINISTRATION_MAILADDRESS, $this->translator->trans('mailfromname.administration'));
  632. $mailService->queueForSending(MailService::MAIL_ID_CORPORATE_CUSTOMER_SERVICE_CONTACT, $message, $this->getUser());
  633. /** @var AutomatedEmailNotificationDefinitionTextContent $confirmationTextContent */
  634. $confirmationTextContent = $entityManager->getRepository(AutomatedEmailNotificationDefinitionTextContent::class)
  635. ->findOneBy(
  636. [
  637. 'automatedEmailNotificationDefinition' => MailService::MAIL_ID_CORPORATE_CUSTOMER_SERVICE_CONTACT_CONFIRMATION,
  638. 'subjectId' => AutomatedEmailNotificationDefinitionService::SUBJECT_ID_CORPORATE_CUSTOMER_SERVICE_CONTACT_CONFIRMATION,
  639. 'bodyId' => AutomatedEmailNotificationDefinitionService::BODY_ID_CORPORATE_CUSTOMER_SERVICE_CONTACT_CONFIRMATION
  640. ]
  641. );
  642. $message = (new Swift_Message($confirmationTextContent->getSubject()))
  643. ->setFrom('team@joboo.de', $this->translator->trans('mailfromname.team'))
  644. ->setTo(
  645. [
  646. $contactForCorporateClientMessage->email
  647. ]
  648. )
  649. ->setBody(
  650. $twigEnvironment->render(
  651. $confirmationTextContent->getTwigTemplateName()
  652. ),
  653. 'text/html'
  654. );
  655. $mailService->queueForSending(
  656. $confirmationTextContent->getAutomatedEmailNotificationDefinition()
  657. ->getId(),
  658. $message,
  659. $this->getUser()
  660. );
  661. $this->addFlash('success', $this->translator->trans('contact_page.success'));
  662. return $this->redirectToRoute(
  663. 'homepage',
  664. [],
  665. Response::HTTP_SEE_OTHER
  666. );
  667. }
  668. }
  669. return $this->render(
  670. '/default/contact_for_corporate_clients.html.twig',
  671. [
  672. 'form' => $form->createView()
  673. ]
  674. );
  675. }
  676. public function contentAction(
  677. Request $request,
  678. string $content,
  679. BusinessEventDomainService $businessEventDomainService
  680. ): Response {
  681. if ($response = $this->redirectHelperService->getResponseForRequest($request, 'Dieser Inhalt ist nicht verfügbar. <a href="/">Zur Startseite.</a>')) {
  682. return $response;
  683. }
  684. if (!in_array(
  685. $content,
  686. [
  687. 'agb',
  688. 'agb150219',
  689. 'impressum',
  690. 'so-geht-es',
  691. 'so-gehts-anleitung',
  692. 'datenschutz',
  693. 'preise',
  694. 'garantien',
  695. 'zufriedenheitsgarantie',
  696. 'vorteile-arbeitgeber',
  697. 'vorteile-jobsuchende'
  698. ]
  699. )
  700. ) {
  701. throw $this->createNotFoundException();
  702. }
  703. $parameters = [];
  704. if ($content === 'preise') {
  705. $businessEventDomainService->writeNewEvent(
  706. BusinessEvent::EVENT_TYPE_JOBOFFERER_LINK_TO_PROJOBOODE_PRICE_CLICKED,
  707. $this->getUser()
  708. );
  709. return new RedirectResponse(
  710. $this->digitalEstateUrlPro . '/preise/',
  711. Response::HTTP_TEMPORARY_REDIRECT
  712. );
  713. }
  714. $response = $this->render(
  715. '/default/content/' . str_replace('-', '_', $content) . '.html.twig',
  716. $parameters
  717. );
  718. $response->setVary('Cookie');
  719. $response->setSharedMaxAge(60);
  720. return $response;
  721. }
  722. public function occupationalFieldsLexiconAction(): Response
  723. {
  724. $response = $this->render('/default/occupational_fields_lexicon.html.twig');
  725. $response->setVary('Cookie, Referer');
  726. $response->setSharedMaxAge(60);
  727. return $response;
  728. }
  729. public function occupationalFieldsLexiconEntryAction(
  730. Request $request,
  731. string $occupationalField,
  732. RouterHelperService $routerHelperService,
  733. GeneralValuesGaugesService $gaugesService
  734. ): Response {
  735. if ($response = $this->redirectHelperService->getResponseForRequest($request, 'Dieser Inhalt ist nicht verfügbar. <a href="/">Zur Startseite.</a>')) {
  736. return $response;
  737. }
  738. $occupationalField = strtolower(
  739. str_replace(
  740. [' / ', ' ', ' (m/w/d)', ',', 'ä', 'Ä', 'ö', 'Ö', 'ü', 'Ü'],
  741. ['_', '_', '', '', 'ae', 'AE', 'oe', 'OE', 'ue', 'UE'],
  742. $occupationalField
  743. )
  744. );
  745. if ($this->translator->trans('occupational_fields_lexicon.' . $occupationalField . '.title', [], 'lexicon') === 'occupational_fields_lexicon.' . $occupationalField . '.title') {
  746. return new RedirectResponse($routerHelperService->generate('homepage'), Response::HTTP_MOVED_PERMANENTLY);
  747. }
  748. // Is this an "internal" request from a user that surfed on other pages before?
  749. // Then show only the lexicon text.
  750. if ($this->isRequestRefererFromOurHost($request)) {
  751. $response = $this->render(
  752. '/default/occupational_fields_lexicon_entry.html.twig', [
  753. 'occupationalField' => $occupationalField
  754. ]
  755. );
  756. // Is this an "external" request, e.g. from Google?
  757. // Then, show the full homepage with Images and CTAs etc.
  758. } else {
  759. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  760. $form = $this->createForm(
  761. RecurrentJobsSearchParametersType::class,
  762. null,
  763. [
  764. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  765. 'method' => 'GET'
  766. ]
  767. );
  768. $response = $this->render(
  769. '/default/homepage.html.twig',
  770. [
  771. 'form' => $form->createView(),
  772. 'targetProfileTypes' => 'all',
  773. 'occupationalField' => $occupationalField,
  774. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  775. ]
  776. );
  777. }
  778. // Ensure indiviual content for logged-in users, and avoid delivering
  779. // the same content for not-logged-in users if the referer is different,
  780. // in order to avoid serving the context meant for "external" requests (without GG referer)
  781. // to "internal" requests (with GG referer).
  782. $response->setVary('Cookie, Referer');
  783. $response->setSharedMaxAge(60);
  784. return $response;
  785. }
  786. private function isRequestRefererFromOurHost(
  787. Request $request
  788. ): bool {
  789. $isComingFrom = $request->server->get('HTTP_REFERER');
  790. foreach (['go-gastro.com', 'joboo.de', 'localhost', '127.0.0.1'] as $host) {
  791. if (stripos($isComingFrom, $host)) {
  792. return true;
  793. }
  794. }
  795. return false;
  796. }
  797. public function occupationalFieldsGuidebookAction(): Response
  798. {
  799. $response = $this->render('/default/occupational_fields_guidebook.html.twig');
  800. $response->setVary('Cookie, Referer');
  801. $response->setSharedMaxAge(60);
  802. return $response;
  803. }
  804. public function jobApplicationGuidesAction(): Response
  805. {
  806. $response = $this->render('/default/job_application_guides.html.twig');
  807. $response->setVary('Cookie, Referer');
  808. $response->setSharedMaxAge(60);
  809. return $response;
  810. }
  811. public function occupationalFieldsGuidebookEntryAction(
  812. Request $request,
  813. string $occupationalField
  814. ): Response {
  815. if ($response = $this->redirectHelperService->getResponseForRequest($request, 'Dieser Inhalt ist nicht verfügbar. <a href="/">Zur Startseite.</a>')) {
  816. return $response;
  817. }
  818. $occupationalField = strtolower(
  819. str_replace(
  820. [' / ', ' ', ' (m/w/d)', ',', 'ä', 'Ä', 'ö', 'Ö', 'ü', 'Ü'],
  821. ['_', '_', '', '', 'ae', 'AE', 'oe', 'OE', 'ue', 'UE'],
  822. $occupationalField
  823. )
  824. );
  825. if ($this->translator->trans('guidebook.' . $occupationalField . '.title', [], 'guidebook') === 'guidebook.' . $occupationalField . '.title') {
  826. $this->addFlash(
  827. 'danger',
  828. $this->translator->trans('guidebook.content_not_found', [], 'guidebook')
  829. );
  830. return $this->redirectToRoute('occupational_fields_guidebook');
  831. } else {
  832. $response = $this->render(
  833. '/default/occupational_fields_guidebook.html.twig',
  834. [
  835. 'occupationalField' => $occupationalField
  836. ]
  837. );
  838. }
  839. // Ensure indiviual content for logged-in users, and avoid delivering
  840. // the same content for not-logged-in users if the referer is different,
  841. // in order to avoid serving the context meant for "external" requests (without GG referer)
  842. // to "internal" requests (with GG referer).
  843. $response->setVary('Cookie, Referer');
  844. $response->setSharedMaxAge(60);
  845. return $response;
  846. }
  847. /**
  848. * @throws Exception
  849. */
  850. public function dashboardAction(
  851. Request $request,
  852. EntityManagerInterface $entityManager,
  853. UsageEventService $usageEventService,
  854. BusinessEventDomainService $businessEventDomainService,
  855. ConversationMessageService $conversationMessageService,
  856. MembershipService $membershipService,
  857. ConversationMessageFolderService $conversationMessageFolderService,
  858. FrontendSpaService $frontendSpaService,
  859. FeatureLimitationsService $featureLimitationsService,
  860. RatingService $ratingService
  861. ): Response {
  862. /** @var User $user */
  863. $user = $this->getUser();
  864. if (!is_null($user)) {
  865. if (!$featureLimitationsService->userCanUseWebsiteOutsideOfExternalJobPostingCrawlerManager($user)) {
  866. return $this->redirect($frontendSpaService->getSpaUrl(FrontendSpaService::ROUTE_EXTERNAL_JOB_POSTING_CRAWLER_MANAGEMENT_CONTENT_PARSER_TASK_MANAGER));
  867. }
  868. $profile = $user->getDefaultProfile();
  869. if (is_null($profile)) {
  870. return $this->redirectToRoute('account.profiles.index');
  871. }
  872. } else {
  873. $this->addFlash(
  874. 'info',
  875. $this->translator->trans('dashboard.anonymous.login')
  876. );
  877. return $this->redirectToRoute('fos_user_security_login');
  878. }
  879. $showHappyRater = false;
  880. $showRater = true;
  881. $renderParams = [];
  882. $notYetDone = [];
  883. if ($usageEventService->hasEventOccurredForUserInLastNDays($user, UsageEvent::EVENT_TYPE_USER_RATES_POSITIVE, 14)) {
  884. $showHappyRater = true;
  885. $businessEventDomainService->writeNewEvent(
  886. BusinessEvent::EVENT_TYPE_SEES_POSITIVE_RATING_OPTION,
  887. $user
  888. );
  889. }
  890. $userIsJOAndDoesNotHaveActiveMembership = $user->isJobofferer() && !$membershipService->userHasActiveJoboffererMembership($user);
  891. if ($userIsJOAndDoesNotHaveActiveMembership
  892. || $usageEventService->hasEventOccurredForUser($user, UsageEvent::EVENT_TYPE_USER_HAS_RATED)
  893. || $conversationMessageService->getNumberOfMessagesAndExtendedApplicationsReceivedByProfileWithoutAutomatedMessagesSinceDate(
  894. $user->getDefaultProfile(),
  895. DateTime::createFromFormat('d/m/Y', '25/09/2019')
  896. ) < 5
  897. || !$usageEventService->hasEventOccurredForUserInLastNDays(
  898. $user,
  899. UsageEvent::EVENT_TYPE_USER_RECEIVED_FIVE_MESSAGES_EXCLUDING_JOBRADAR,
  900. 14
  901. )
  902. ) {
  903. $showRater = false;
  904. } else {
  905. $businessEventDomainService->writeNewEvent(
  906. BusinessEvent::EVENT_TYPE_SEES_RATING_OPTION,
  907. $user
  908. );
  909. }
  910. // AS LONG AS WE HAVE A SPAM PROBLEM, A SPECIAL WARNING WILL BE ADDED - TO BE REMOVED ONCE THE PROBLEM IS SOLVED
  911. $notYetDone[] = 'spam';
  912. $first_value = $notYetDone[array_rand($notYetDone)];
  913. $renderParams['whichUpdate'] = $first_value;
  914. $renderParams['showHappyRater'] = $showHappyRater;
  915. $renderParams['showRater'] = $showRater;
  916. // If you see this code section and it is past the $endOfBlackWeekDeal date,
  917. // you can safely remove this part and the part inside of the dashboard_ticker template.
  918. $now = DateTimeUtility::createDateTimeUtc();
  919. $endOfBlackWeekDeal = DateTimeUtility::createDateTimeUtc()
  920. ->setDate(2025, 11, 30)
  921. ->setTime(23, 59, 59)
  922. ;
  923. $isBlackWeek2025 = false;
  924. if ($now < $endOfBlackWeekDeal) {
  925. $isBlackWeek2025 = true;
  926. }
  927. $renderParams['blackWeek2025DealMustBeDisplayed'] = $isBlackWeek2025 && $userIsJOAndDoesNotHaveActiveMembership;
  928. if ($user->isJobseeker()) {
  929. $businessEventDomainService->writeNewEvent(BusinessEvent::EVENT_TYPE_DASHBOARD_ACTION, $user);
  930. return $this->redirectToRoute('janus_aurora.jobseeker_dashboard');
  931. } elseif ($user->isJobofferer()) {
  932. $conversationMessageRepository = $entityManager->getRepository(ConversationMessage::class);
  933. $recurrentJobRepository = $entityManager->getRepository(RecurrentJob::class);
  934. $numberOfStarsScoreRating = $profile->getStarsScoreRating();
  935. $boxProfileContent = $numberOfStarsScoreRating ? 'dashboard.jobofferer.box_profile.content' : 'dashboard.jobofferer.box_profile.content_static';
  936. $recurrentJobs = $recurrentJobRepository->findPublishedRecurrentJobsByJoboffererProfileId($profile->getId());
  937. $numberOfPublishedRecurrentJobs = count($recurrentJobs);
  938. $boxJobsContent = $numberOfPublishedRecurrentJobs ? 'dashboard.jobofferer.box_jobs.content' : 'dashboard.jobofferer.box_jobs.content_static';
  939. $numberOfUnreadProfileMessages = $conversationMessageRepository
  940. ->getSummaryOfUnreadReceivedMessages(
  941. $profile,
  942. $conversationMessageFolderService->getFolderDefinition(
  943. $profile,
  944. ConversationMessageService::FILTER_TYPE_RECEIVED,
  945. ConversationMessageService::SUB_FILTER_TYPE_PROFILE_MESSAGES
  946. )
  947. )
  948. ->getTotalNumberOfUnreadMessages();
  949. $boxMessageContent = $numberOfUnreadProfileMessages ? 'dashboard.jobofferer.box_messages.content' : 'dashboard.jobofferer.box_messages.content_static';
  950. $renderParams['dashboard_jobofferer_box_profile_content'] = $this->translator->trans(
  951. $boxProfileContent, [
  952. '%jobofferer_stars_score%' => $numberOfStarsScoreRating
  953. ]
  954. );
  955. $renderParams['dashboard_jobofferer_box_jobs_content'] = $this->translator->trans(
  956. $boxJobsContent, [
  957. '%jobofferer_published_job_deals%' => $numberOfPublishedRecurrentJobs
  958. ]
  959. );
  960. $renderParams['dashboard_jobofferer_box_messages_content'] = $this->translator->trans(
  961. $boxMessageContent, [
  962. '%jobofferer_unread_job_deals%' => $numberOfUnreadProfileMessages
  963. ]
  964. );
  965. }
  966. $form = $this->createForm(RatingType::class);
  967. $form->handleRequest($request);
  968. $renderParams['form'] = $form->createView();
  969. $advice = $form['advice']->getData();
  970. $rating = $form['rating']->getData();
  971. /** @var User $user */
  972. $user = $this->getUser();
  973. $userEmail = $user ? $user->getEmail() : '[Der User war nicht angemeldet]';
  974. if ($form->isSubmitted() && $form->isValid()) {
  975. $ratingService->sendMailToInformAboutNegativeRating($userEmail, $advice, $rating);
  976. $this->addFlash(
  977. 'success',
  978. $this->translator->trans('rate.flash')
  979. );
  980. }
  981. return $this->render('default/dashboard.html.twig', $renderParams);
  982. }
  983. public function loggedOutAction(Request $request): Response
  984. {
  985. $response = new Response();
  986. if (!is_null($request->cookies->get(CookieService::COOKIE_NAME_LOGIN_WAS_FROM_ADMIN))) {
  987. $response->headers->clearCookie(CookieService::COOKIE_NAME_LOGIN_WAS_FROM_ADMIN);
  988. }
  989. return $this->render('/default/logged_out.html.twig', [], $response);
  990. }
  991. public function reLoginAction(
  992. Request $request,
  993. SessionInterface $session,
  994. SessionService $sessionService,
  995. TokenStorageInterface $tokenStorage
  996. ): RedirectResponse {
  997. $targetPath = $request->query->get('_target_path');
  998. $targetPathChecksum = $request->query->get('_target_path_checksum');
  999. if (!Checksummer::checksumIsValid($targetPath, $targetPathChecksum)) {
  1000. throw new BadRequestHttpException("Checksum $targetPathChecksum not valid for targetPath $targetPath.");
  1001. }
  1002. $tokenStorage->setToken();
  1003. $session->invalidate();
  1004. $response = new RedirectResponse($targetPath);
  1005. $response->headers->clearCookie('REMEMBERME');
  1006. $sessionService->setUsernamePrefillForLogin($session, $request->query->get('_username'));
  1007. return $response;
  1008. }
  1009. public function gridDemoAction(): Response
  1010. {
  1011. return $this->render('/default/grid_demo.html.twig');
  1012. }
  1013. /** @throws Exception
  1014. * @throws \Doctrine\DBAL\Driver\Exception
  1015. */
  1016. public function ratingAction(
  1017. Request $request,
  1018. EventDispatcherInterface $eventDispatcher,
  1019. MailService $mailService,
  1020. EntityManagerInterface $entityManager,
  1021. RouterHelperService $routerHelperService
  1022. ): Response {
  1023. /** @var User $user */
  1024. $user = $this->getUser();
  1025. if (is_null($user)) {
  1026. throw new BadRequestHttpException('Expected logged in user, got null.');
  1027. }
  1028. $ratingQuality = '';
  1029. if ($request->get('happy') === 'true') {
  1030. $ratingQuality = 'positive';
  1031. if (!empty($user->getEmail())) {
  1032. /** @var AutomatedEmailNotificationDefinitionTextContent $textContent */
  1033. $textContent = $entityManager->getRepository(AutomatedEmailNotificationDefinitionTextContent::class)
  1034. ->findOneBy(
  1035. [
  1036. 'automatedEmailNotificationDefinition' => MailService::MAIL_ID_NEW_RATING,
  1037. 'subjectId' => AutomatedEmailNotificationDefinitionService::SUBJECT_ID_NEW_RATING_TICKER_OPINION,
  1038. 'bodyId' => AutomatedEmailNotificationDefinitionService::BODY_ID_NEW_RATING_TICKER_OPINION
  1039. ]
  1040. );
  1041. $mailService->sendHtmlNonNotificationMail(
  1042. $textContent->getAutomatedEmailNotificationDefinition(),
  1043. $user,
  1044. [
  1045. 'firstname' => ProfileService::getFirstnameOrAlternativeForSalutation($user->getDefaultProfile()),
  1046. 'ctaUrl' => $routerHelperService->generate('landingspage-rating-positive')
  1047. ],
  1048. 0
  1049. );
  1050. }
  1051. }
  1052. if ($request->get('happy') === 'false') {
  1053. $ratingQuality = 'negative';
  1054. if (!empty($user->getEmail())) {
  1055. if ($user->isJobofferer()) {
  1056. /** @var AutomatedEmailNotificationDefinitionTextContent $textContent */
  1057. $textContent = $entityManager->getRepository(AutomatedEmailNotificationDefinitionTextContent::class)
  1058. ->findOneBy(
  1059. [
  1060. 'automatedEmailNotificationDefinition' => MailService::MAIL_ID_NEW_RATING,
  1061. 'subjectId' => AutomatedEmailNotificationDefinitionService::SUBJECT_ID_NEW_RATING_TICKER_OPINION_NEGATIVE,
  1062. 'bodyId' => AutomatedEmailNotificationDefinitionService::BODY_ID_NEW_RATING_TICKER_OPINION_NEGATIVE_JOBOFFERER
  1063. ]
  1064. );
  1065. $mailService->sendHtmlNonNotificationMail(
  1066. $textContent->getAutomatedEmailNotificationDefinition(),
  1067. $user,
  1068. [
  1069. 'firstname' => ProfileService::getFirstnameOrAlternativeForSalutation($user->getDefaultProfile()),
  1070. 'ctaUrl' => $routerHelperService->generate('landingspage-rating-negative')
  1071. ],
  1072. 0
  1073. );
  1074. }
  1075. if ($user->isJobseeker()) {
  1076. /** @var AutomatedEmailNotificationDefinitionTextContent $textContent */
  1077. $textContent = $entityManager->getRepository(AutomatedEmailNotificationDefinitionTextContent::class)
  1078. ->findOneBy(
  1079. [
  1080. 'automatedEmailNotificationDefinition' => MailService::MAIL_ID_NEW_RATING,
  1081. 'subjectId' => AutomatedEmailNotificationDefinitionService::SUBJECT_ID_NEW_RATING_TICKER_OPINION_NEGATIVE,
  1082. 'bodyId' => AutomatedEmailNotificationDefinitionService::BODY_ID_NEW_RATING_TICKER_OPINION_NEGATIVE_JOBSEEKER
  1083. ]
  1084. );
  1085. $mailService->sendHtmlNonNotificationMail(
  1086. $textContent->getAutomatedEmailNotificationDefinition(),
  1087. $user,
  1088. [
  1089. 'firstname' => ProfileService::getFirstnameOrAlternativeForSalutation($user->getDefaultProfile()),
  1090. 'ctaUrl' => $routerHelperService->generate('landingspage-rating-negative')
  1091. ],
  1092. 0
  1093. );
  1094. }
  1095. }
  1096. }
  1097. $eventDispatcher->dispatch(
  1098. new RatingEvent($user, $ratingQuality),
  1099. RatingEvent::class
  1100. );
  1101. return new Response('', Response::HTTP_NO_CONTENT);
  1102. }
  1103. /**
  1104. * @throws Exception
  1105. */
  1106. public function externalRatingLinkAction(
  1107. Request $request,
  1108. BusinessEventDomainService $businessEventDomainService,
  1109. UsageEventService $usageEventService
  1110. ): Response {
  1111. /** @var User $user */
  1112. $user = $this->getUser();
  1113. if (is_null($user)) {
  1114. throw new BadRequestHttpException('Expected logged in user, got null.');
  1115. }
  1116. switch ($request->get('ratedOn')) {
  1117. case 'TRUSTEDSHOPS':
  1118. $businessEventDomainService->writeNewEvent(
  1119. BusinessEvent::EVENT_TYPE_USED_TRUSTEDSHOPS_RATING_LINK,
  1120. $user
  1121. );
  1122. $usageEventService->eventHasOccurredForUser($user, UsageEvent::EVENT_TYPE_USER_HAS_CLICKED_RATING_LINK);
  1123. break;
  1124. case 'FACEBOOK':
  1125. $businessEventDomainService->writeNewEvent(
  1126. BusinessEvent::EVENT_TYPE_USED_FACEBOOK_RATING_LINK,
  1127. $user
  1128. );
  1129. $usageEventService->eventHasOccurredForUser($user, UsageEvent::EVENT_TYPE_USER_HAS_CLICKED_RATING_LINK);
  1130. break;
  1131. case 'GOOGLE':
  1132. $businessEventDomainService->writeNewEvent(
  1133. BusinessEvent::EVENT_TYPE_USED_GOOGLE_RATING_LINK,
  1134. $user
  1135. );
  1136. $usageEventService->eventHasOccurredForUser($user, UsageEvent::EVENT_TYPE_USER_HAS_CLICKED_RATING_LINK);
  1137. break;
  1138. }
  1139. return new Response('', Response::HTTP_NO_CONTENT);
  1140. }
  1141. public function gmailInstructionAction(): Response
  1142. {
  1143. return $this->render('/default/email_instruction.html.twig');
  1144. }
  1145. public function coronaTipsAction(): Response
  1146. {
  1147. return $this->render('/default/corona_tips.html.twig');
  1148. }
  1149. public function pressImagesDownloadAction(): Response
  1150. {
  1151. return $this->redirect('https://pages.joboo.de/presse/');
  1152. }
  1153. /**
  1154. * @throws Exception
  1155. */
  1156. public function homepageGastroAction(
  1157. LandingPageService $landingPageService,
  1158. GeneralValuesGaugesService $gaugesService
  1159. ): Response {
  1160. /** @var User $user */
  1161. $user = $this->getUser();
  1162. $landingPageService->initiateConversionTrackingOnLandingPage(0, $user);
  1163. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1164. return $this->render(
  1165. '/default/homepage_gastro.html.twig',
  1166. [
  1167. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1168. ]
  1169. );
  1170. }
  1171. /**
  1172. * @throws Exception
  1173. */
  1174. public function homepageFahrerAction(
  1175. LandingPageService $landingPageService,
  1176. GeneralValuesGaugesService $gaugesService
  1177. ): Response {
  1178. /** @var User $user */
  1179. $user = $this->getUser();
  1180. $landingPageService->initiateConversionTrackingOnLandingPage(1, $user);
  1181. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1182. return $this->render(
  1183. '/default/homepage_fahrer.html.twig',
  1184. [
  1185. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1186. ]
  1187. );
  1188. }
  1189. /**
  1190. * @throws Exception
  1191. */
  1192. public function homepageFahrerGoogleAction(
  1193. LandingPageService $landingPageService,
  1194. GeneralValuesGaugesService $gaugesService
  1195. ): Response {
  1196. /** @var User $user */
  1197. $user = $this->getUser();
  1198. $landingPageService->initiateConversionTrackingOnLandingPage(11, $user);
  1199. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1200. return $this->render(
  1201. '/default/homepage_fahrer.html.twig',
  1202. [
  1203. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1204. ]
  1205. );
  1206. }
  1207. /**
  1208. * @throws Exception
  1209. */
  1210. public function landingpageEbay0623Action(
  1211. Request $request,
  1212. LandingPageService $landingPageService,
  1213. GeneralValuesGaugesService $gaugesService
  1214. ): Response {
  1215. $title = trim(strtolower($request->get('title')));
  1216. if ($title === '' || !in_array($title, ['reinigungskraft', 'packer', 'fahrer', 'gastro', 'kaufmann', 'handel', 'kueche'])) {
  1217. return $this->redirectToRoute('homepage');
  1218. }
  1219. /** @var User $user */
  1220. $user = $this->getUser();
  1221. $landingPageService->initiateConversionTrackingOn0623LandingPage($title, ExternalFeedsService::EXTERNAL_FEED_EBAY_NAME, $user);
  1222. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1223. $form = $this->createForm(
  1224. RecurrentJobsSearchParametersType::class,
  1225. null,
  1226. [
  1227. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1228. 'method' => 'GET'
  1229. ]
  1230. );
  1231. return $this->render(
  1232. '/default/homepage.html.twig',
  1233. [
  1234. 'form' => $form->createView(),
  1235. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet,
  1236. 'landingPageDefinition' => $title
  1237. ]
  1238. );
  1239. }
  1240. /**
  1241. * @throws Exception
  1242. */
  1243. public function landingpageGoogle0623Action(
  1244. Request $request,
  1245. LandingPageService $landingPageService,
  1246. GeneralValuesGaugesService $gaugesService
  1247. ): Response {
  1248. $title = trim(strtolower($request->get('title')));
  1249. if ($title === '' || !in_array($title, ['reinigungskraft', 'packer', 'fahrer', 'gastro', 'kaufmann', 'handel', 'kueche'])) {
  1250. return $this->redirectToRoute('homepage');
  1251. }
  1252. /** @var User $user */
  1253. $user = $this->getUser();
  1254. $landingPageService->initiateConversionTrackingOn0623LandingPage($title, 'google', $user);
  1255. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1256. $form = $this->createForm(
  1257. RecurrentJobsSearchParametersType::class,
  1258. null,
  1259. [
  1260. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1261. 'method' => 'GET'
  1262. ]
  1263. );
  1264. return $this->render(
  1265. '/default/homepage.html.twig',
  1266. [
  1267. 'form' => $form->createView(),
  1268. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet,
  1269. 'landingPageDefinition' => $title
  1270. ]
  1271. );
  1272. }
  1273. /**
  1274. * @throws Exception
  1275. */
  1276. public function landingpageGoogle0623AbTestAction(Request $request): RedirectResponse
  1277. {
  1278. $title = trim(strtolower($request->get('title')));
  1279. if ($title === '' || !in_array($title, ['gastro', 'kaufmann', 'kueche'])) {
  1280. return $this->redirectToRoute('homepage');
  1281. }
  1282. /** @var User|null $user */
  1283. if (!is_null($user = $this->getUser())) {
  1284. $randomChar = mb_substr(md5($user->getId()), 0, 1);
  1285. } else {
  1286. $randomChar = mb_substr(
  1287. md5(
  1288. $request->getSession()
  1289. ->getId()
  1290. ), 0, 1
  1291. );
  1292. }
  1293. if (in_array($randomChar, range(0, 7))) {
  1294. return $this->redirectToRoute('landingpages_google_0623', ['title' => $title]);
  1295. } else {
  1296. return $this->redirectToRoute('landingpage_' . $title . '_google');
  1297. }
  1298. }
  1299. /**
  1300. * @throws Exception
  1301. */
  1302. public function homepageVideoGoogleAction(
  1303. LandingPageService $landingPageService,
  1304. GeneralValuesGaugesService $gaugesService
  1305. ): Response {
  1306. /** @var User $user */
  1307. $user = $this->getUser();
  1308. $landingPageService->initiateConversionTrackingOnLandingPage(12, $user);
  1309. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1310. $form = $this->createForm(
  1311. RecurrentJobsSearchParametersType::class,
  1312. null,
  1313. [
  1314. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1315. 'method' => 'GET'
  1316. ]
  1317. );
  1318. return $this->render(
  1319. '/default/homepage.html.twig',
  1320. [
  1321. 'form' => $form->createView(),
  1322. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1323. ]
  1324. );
  1325. }
  1326. /**
  1327. * @throws Exception
  1328. */
  1329. public function homepagePackerAction(
  1330. LandingPageService $landingPageService
  1331. ): Response {
  1332. /** @var User $user */
  1333. $user = $this->getUser();
  1334. $landingPageService->initiateConversionTrackingOnLandingPage(2, $user);
  1335. return $this->redirectToRoute('homepage');
  1336. }
  1337. /**
  1338. * @throws Exception
  1339. */
  1340. public function homepagePackerGoogleAction(
  1341. LandingPageService $landingPageService,
  1342. GeneralValuesGaugesService $gaugesService
  1343. ): Response {
  1344. /** @var User $user */
  1345. $user = $this->getUser();
  1346. $landingPageService->initiateConversionTrackingOnLandingPage(10, $user);
  1347. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1348. return $this->render(
  1349. '/default/homepage_packer.html.twig',
  1350. [
  1351. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1352. ]
  1353. );
  1354. }
  1355. /**
  1356. * @throws Exception
  1357. */
  1358. public function homepageReinigungskraftAction(
  1359. LandingPageService $landingPageService,
  1360. GeneralValuesGaugesService $gaugesService
  1361. ): Response {
  1362. /** @var User $user */
  1363. $user = $this->getUser();
  1364. $landingPageService->initiateConversionTrackingOnLandingPage(3, $user);
  1365. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1366. return $this->render(
  1367. '/default/homepage_reinigungskraft.html.twig',
  1368. [
  1369. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1370. ]
  1371. );
  1372. }
  1373. /**
  1374. * @throws Exception
  1375. */
  1376. public function homepageReinigungskraftGoogleAction(
  1377. LandingPageService $landingPageService,
  1378. GeneralValuesGaugesService $gaugesService
  1379. ): Response {
  1380. /** @var User $user */
  1381. $user = $this->getUser();
  1382. $landingPageService->initiateConversionTrackingOnLandingPage(9, $user);
  1383. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1384. return $this->render(
  1385. '/default/homepage_reinigungskraft.html.twig',
  1386. [
  1387. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1388. ]
  1389. );
  1390. }
  1391. /**
  1392. * @throws Exception
  1393. */
  1394. public function homepageHandelAction(
  1395. LandingPageService $landingPageService,
  1396. GeneralValuesGaugesService $gaugesService
  1397. ): Response {
  1398. /** @var User $user */
  1399. $user = $this->getUser();
  1400. $landingPageService->initiateConversionTrackingOnLandingPage(4, $user);
  1401. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1402. return $this->render(
  1403. '/default/homepage_handel.html.twig',
  1404. [
  1405. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1406. ]
  1407. );
  1408. }
  1409. /**
  1410. * @throws Exception
  1411. */
  1412. public function homepageKaufmannAction(
  1413. LandingPageService $landingPageService,
  1414. GeneralValuesGaugesService $gaugesService
  1415. ): Response {
  1416. /** @var User $user */
  1417. $user = $this->getUser();
  1418. $landingPageService->initiateConversionTrackingOnLandingPage(5, $user);
  1419. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1420. return $this->render(
  1421. '/default/homepage_kaufmann.html.twig',
  1422. [
  1423. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1424. ]
  1425. );
  1426. }
  1427. /**
  1428. * @throws Exception
  1429. */
  1430. public function homepageKaufmannGoogleAction(
  1431. LandingPageService $landingPageService,
  1432. GeneralValuesGaugesService $gaugesService
  1433. ): Response {
  1434. /** @var User $user */
  1435. $user = $this->getUser();
  1436. $landingPageService->initiateConversionTrackingOnLandingPage(8, $user);
  1437. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1438. return $this->render(
  1439. '/default/homepage_kaufmann.html.twig',
  1440. [
  1441. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1442. ]
  1443. );
  1444. }
  1445. /**
  1446. * @throws Exception
  1447. */
  1448. public function homepageKaufmannBingAction(
  1449. LandingPageService $landingPageService,
  1450. GeneralValuesGaugesService $gaugesService
  1451. ): Response {
  1452. /** @var User $user */
  1453. $user = $this->getUser();
  1454. $landingPageService->initiateConversionTrackingOnBingLandingPage(2, $user);
  1455. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1456. return $this->render(
  1457. '/default/homepage_kaufmann.html.twig',
  1458. [
  1459. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1460. ]
  1461. );
  1462. }
  1463. /**
  1464. * @throws Exception
  1465. */
  1466. public function landingPageJobboerseAction(
  1467. LandingPageService $landingPageService,
  1468. GeneralValuesGaugesService $gaugesService
  1469. ): Response {
  1470. /** @var User $user */
  1471. $user = $this->getUser();
  1472. $landingPageService->initiateConversionTrackingOnLandingPage(13, $user);
  1473. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1474. $form = $this->createForm(
  1475. RecurrentJobsSearchParametersType::class,
  1476. null,
  1477. [
  1478. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1479. 'method' => 'GET'
  1480. ]
  1481. );
  1482. return $this->render(
  1483. '/default/homepage.html.twig',
  1484. [
  1485. 'form' => $form->createView(),
  1486. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1487. ]
  1488. );
  1489. }
  1490. /**
  1491. * @throws Exception
  1492. */
  1493. public function landingPageStadtAction(
  1494. LandingPageService $landingPageService,
  1495. GeneralValuesGaugesService $gaugesService
  1496. ): Response {
  1497. /** @var User $user */
  1498. $user = $this->getUser();
  1499. $landingPageService->initiateConversionTrackingOnLandingPage(17, $user);
  1500. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1501. $form = $this->createForm(
  1502. RecurrentJobsSearchParametersType::class,
  1503. null,
  1504. [
  1505. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1506. 'method' => 'GET'
  1507. ]
  1508. );
  1509. return $this->render(
  1510. '/default/homepage.html.twig',
  1511. [
  1512. 'form' => $form->createView(),
  1513. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1514. ]
  1515. );
  1516. }
  1517. /**
  1518. * @throws Exception
  1519. */
  1520. public function landingPageStadtBingAction(
  1521. LandingPageService $landingPageService,
  1522. GeneralValuesGaugesService $gaugesService
  1523. ): Response {
  1524. /** @var User $user */
  1525. $user = $this->getUser();
  1526. $landingPageService->initiateConversionTrackingOnBingLandingPage(3, $user);
  1527. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1528. $form = $this->createForm(
  1529. RecurrentJobsSearchParametersType::class,
  1530. null,
  1531. [
  1532. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1533. 'method' => 'GET'
  1534. ]
  1535. );
  1536. return $this->render(
  1537. '/default/homepage.html.twig',
  1538. [
  1539. 'form' => $form->createView(),
  1540. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1541. ]
  1542. );
  1543. }
  1544. /**
  1545. * @throws Exception
  1546. */
  1547. public function landingPageJobboerseBingAction(
  1548. LandingPageService $landingPageService,
  1549. GeneralValuesGaugesService $gaugesService
  1550. ): Response {
  1551. /** @var User $user */
  1552. $user = $this->getUser();
  1553. $landingPageService->initiateConversionTrackingOnBingLandingPage(1, $user);
  1554. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1555. $form = $this->createForm(
  1556. RecurrentJobsSearchParametersType::class,
  1557. null,
  1558. [
  1559. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1560. 'method' => 'GET'
  1561. ]
  1562. );
  1563. return $this->render(
  1564. '/default/homepage.html.twig',
  1565. [
  1566. 'form' => $form->createView(),
  1567. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1568. ]
  1569. );
  1570. }
  1571. /**
  1572. * @throws Exception
  1573. */
  1574. public function landingPageJobooBrandAction(
  1575. LandingPageService $landingPageService,
  1576. GeneralValuesGaugesService $gaugesService
  1577. ): Response {
  1578. /** @var User $user */
  1579. $user = $this->getUser();
  1580. $landingPageService->initiateConversionTrackingOnLandingPage(15, $user);
  1581. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1582. $form = $this->createForm(
  1583. RecurrentJobsSearchParametersType::class,
  1584. null,
  1585. [
  1586. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1587. 'method' => 'GET'
  1588. ]
  1589. );
  1590. return $this->render(
  1591. '/default/homepage.html.twig',
  1592. [
  1593. 'form' => $form->createView(),
  1594. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1595. ]
  1596. );
  1597. }
  1598. /**
  1599. * @throws Exception
  1600. */
  1601. public function landingPageGGBrandAction(
  1602. LandingPageService $landingPageService,
  1603. GeneralValuesGaugesService $gaugesService
  1604. ): Response {
  1605. /** @var User $user */
  1606. $user = $this->getUser();
  1607. $landingPageService->initiateConversionTrackingOnLandingPage(14, $user);
  1608. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1609. $form = $this->createForm(
  1610. RecurrentJobsSearchParametersType::class,
  1611. null,
  1612. [
  1613. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1614. 'method' => 'GET'
  1615. ]
  1616. );
  1617. return $this->render(
  1618. '/default/homepage.html.twig',
  1619. [
  1620. 'form' => $form->createView(),
  1621. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1622. ]
  1623. );
  1624. }
  1625. /**
  1626. * @throws Exception
  1627. */
  1628. public function landingPageHandelAction(
  1629. LandingPageService $landingPageService,
  1630. GeneralValuesGaugesService $gaugesService
  1631. ): Response {
  1632. /** @var User $user */
  1633. $user = $this->getUser();
  1634. $landingPageService->initiateConversionTrackingOnLandingPage(6, $user);
  1635. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1636. return $this->render(
  1637. '/default/homepage_handel.html.twig',
  1638. [
  1639. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1640. ]
  1641. );
  1642. }
  1643. /**
  1644. * @throws Exception
  1645. */
  1646. public function landingPageGastroAction(
  1647. LandingPageService $landingPageService,
  1648. GeneralValuesGaugesService $gaugesService
  1649. ): Response {
  1650. /** @var User $user */
  1651. $user = $this->getUser();
  1652. $landingPageService->initiateConversionTrackingOnLandingPage(7, $user);
  1653. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1654. return $this->render(
  1655. '/default/homepage_gastro.html.twig',
  1656. [
  1657. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1658. ]
  1659. );
  1660. }
  1661. /**
  1662. * @throws Exception
  1663. */
  1664. public function landingPageGastroBingAction(
  1665. LandingPageService $landingPageService,
  1666. GeneralValuesGaugesService $gaugesService
  1667. ): Response {
  1668. /** @var User $user */
  1669. $user = $this->getUser();
  1670. $landingPageService->initiateConversionTrackingOnBingLandingPage(0, $user);
  1671. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1672. return $this->render(
  1673. '/default/homepage_gastro.html.twig',
  1674. [
  1675. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1676. ]
  1677. );
  1678. }
  1679. /**
  1680. * @throws Exception
  1681. */
  1682. public function landingPageKuecheAction(
  1683. LandingPageService $landingPageService,
  1684. GeneralValuesGaugesService $gaugesService
  1685. ): Response {
  1686. /** @var User $user */
  1687. $user = $this->getUser();
  1688. $landingPageService->initiateConversionTrackingOnLandingPage(16, $user);
  1689. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1690. return $this->render(
  1691. '/default/homepage_gastro.html.twig',
  1692. [
  1693. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1694. ]
  1695. );
  1696. }
  1697. public function landingPageWhatsappAction(
  1698. BusinessEventDomainService $businessEventDomainService,
  1699. GeneralValuesGaugesService $gaugesService
  1700. ): Response {
  1701. $businessEventDomainService->writeNewEvent(
  1702. BusinessEvent::EVENT_TYPE_WHATSAPP_LANDINGPAGE_VISITED,
  1703. $this->getUser()
  1704. );
  1705. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1706. $form = $this->createForm(
  1707. RecurrentJobsSearchParametersType::class,
  1708. null,
  1709. [
  1710. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1711. 'method' => 'GET'
  1712. ]
  1713. );
  1714. return $this->render(
  1715. '/default/homepage.html.twig',
  1716. [
  1717. 'form' => $form->createView(),
  1718. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1719. ]
  1720. );
  1721. }
  1722. /**
  1723. * @throws Exception
  1724. */
  1725. public function landingPageAktionAction(
  1726. Request $request,
  1727. ConversionEventService $conversionEventService,
  1728. GeneralValuesGaugesService $gaugesService
  1729. ): Response {
  1730. $conversionEventService->initiateGoalReachedConversionTracking(
  1731. $this->getUser(),
  1732. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_AKTION,
  1733. 0,
  1734. null,
  1735. $request
  1736. );
  1737. $conversionEventService->initiateGoalReachedConversionTracking(
  1738. $this->getUser(),
  1739. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_AKTION,
  1740. 1,
  1741. null,
  1742. $request
  1743. );
  1744. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1745. $form = $this->createForm(
  1746. RecurrentJobsSearchParametersType::class,
  1747. null,
  1748. [
  1749. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1750. 'method' => 'GET'
  1751. ]
  1752. );
  1753. return $this->render(
  1754. '/default/homepage.html.twig',
  1755. [
  1756. 'form' => $form->createView(),
  1757. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1758. ]
  1759. );
  1760. }
  1761. /**
  1762. * @throws Exception
  1763. */
  1764. public function landingPageSonderaktionAction(
  1765. Request $request,
  1766. ConversionEventService $conversionEventService,
  1767. GeneralValuesGaugesService $gaugesService
  1768. ): Response {
  1769. $conversionEventService->initiateGoalReachedConversionTracking(
  1770. $this->getUser(),
  1771. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_SONDERAKTION,
  1772. 0,
  1773. null,
  1774. $request
  1775. );
  1776. $conversionEventService->initiateGoalReachedConversionTracking(
  1777. $this->getUser(),
  1778. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_SONDERAKTION,
  1779. 1,
  1780. null,
  1781. $request
  1782. );
  1783. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1784. $form = $this->createForm(
  1785. RecurrentJobsSearchParametersType::class,
  1786. null,
  1787. [
  1788. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1789. 'method' => 'GET'
  1790. ]
  1791. );
  1792. return $this->render(
  1793. '/default/homepage.html.twig',
  1794. [
  1795. 'form' => $form->createView(),
  1796. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1797. ]
  1798. );
  1799. }
  1800. /**
  1801. * @throws Exception
  1802. */
  1803. public function landingPageAngebotAction(
  1804. Request $request,
  1805. ConversionEventService $conversionEventService,
  1806. GeneralValuesGaugesService $gaugesService
  1807. ): Response {
  1808. $conversionEventService->initiateGoalReachedConversionTracking(
  1809. $this->getUser(),
  1810. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_ANGEBOT,
  1811. 0,
  1812. null,
  1813. $request
  1814. );
  1815. $conversionEventService->initiateGoalReachedConversionTracking(
  1816. $this->getUser(),
  1817. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_ANGEBOT,
  1818. 1,
  1819. null,
  1820. $request
  1821. );
  1822. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1823. $form = $this->createForm(
  1824. RecurrentJobsSearchParametersType::class,
  1825. null,
  1826. [
  1827. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1828. 'method' => 'GET'
  1829. ]
  1830. );
  1831. return $this->render(
  1832. '/default/homepage.html.twig',
  1833. [
  1834. 'form' => $form->createView(),
  1835. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1836. ]
  1837. );
  1838. }
  1839. /**
  1840. * @throws Exception
  1841. */
  1842. public function landingPageSonderangebotAction(
  1843. Request $request,
  1844. ConversionEventService $conversionEventService,
  1845. GeneralValuesGaugesService $gaugesService
  1846. ): Response {
  1847. $conversionEventService->initiateGoalReachedConversionTracking(
  1848. $this->getUser(),
  1849. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_SONDERANGEBOT,
  1850. 0,
  1851. null,
  1852. $request
  1853. );
  1854. $conversionEventService->initiateGoalReachedConversionTracking(
  1855. $this->getUser(),
  1856. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_SONDERANGEBOT,
  1857. 1,
  1858. null,
  1859. $request
  1860. );
  1861. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1862. $form = $this->createForm(
  1863. RecurrentJobsSearchParametersType::class,
  1864. null,
  1865. [
  1866. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1867. 'method' => 'GET'
  1868. ]
  1869. );
  1870. return $this->render(
  1871. '/default/homepage.html.twig',
  1872. [
  1873. 'form' => $form->createView(),
  1874. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1875. ]
  1876. );
  1877. }
  1878. /**
  1879. * @throws Exception
  1880. */
  1881. public function landingPageJetztAction(
  1882. Request $request,
  1883. ConversionEventService $conversionEventService,
  1884. GeneralValuesGaugesService $gaugesService
  1885. ): Response {
  1886. $conversionEventService->initiateGoalReachedConversionTracking(
  1887. $this->getUser(),
  1888. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_JETZT,
  1889. 0,
  1890. null,
  1891. $request
  1892. );
  1893. $conversionEventService->initiateGoalReachedConversionTracking(
  1894. $this->getUser(),
  1895. ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_JETZT,
  1896. 1,
  1897. null,
  1898. $request
  1899. );
  1900. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1901. $form = $this->createForm(
  1902. RecurrentJobsSearchParametersType::class,
  1903. null,
  1904. [
  1905. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1906. 'method' => 'GET'
  1907. ]
  1908. );
  1909. return $this->render(
  1910. '/default/homepage.html.twig',
  1911. [
  1912. 'form' => $form->createView(),
  1913. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1914. ]
  1915. );
  1916. }
  1917. /**
  1918. * @throws Exception
  1919. */
  1920. public function landingPageYoutubeAction(
  1921. Request $request,
  1922. ConversionEventService $conversionEventService,
  1923. GeneralValuesGaugesService $gaugesService
  1924. ): Response {
  1925. $conversionEventService->initiateGoalReachedConversionTracking(
  1926. $this->getUser(),
  1927. ConversionEventService::CAMPAIGN_ID_YOUTUBE,
  1928. 0,
  1929. null,
  1930. $request
  1931. );
  1932. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1933. $form = $this->createForm(
  1934. RecurrentJobsSearchParametersType::class,
  1935. null,
  1936. [
  1937. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1938. 'method' => 'GET'
  1939. ]
  1940. );
  1941. return $this->render(
  1942. '/default/homepage.html.twig',
  1943. [
  1944. 'form' => $form->createView(),
  1945. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1946. ]
  1947. );
  1948. }
  1949. /**
  1950. * @throws Exception
  1951. */
  1952. public function landingPageEbayNewAction(
  1953. Request $request,
  1954. ConversionEventService $conversionEventService,
  1955. GeneralValuesGaugesService $gaugesService
  1956. ): Response {
  1957. $conversionEventService->initiateGoalReachedConversionTracking(
  1958. $this->getUser(),
  1959. ConversionEventService::CAMPAIGN_ID_EBAY,
  1960. 8,
  1961. null,
  1962. $request,
  1963. null,
  1964. json_encode(['searchterm' => $request->get('searchterm'), 'zipcode' => $request->get('zipcode')])
  1965. );
  1966. $scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
  1967. $form = $this->createForm(
  1968. RecurrentJobsSearchParametersType::class,
  1969. null,
  1970. [
  1971. 'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
  1972. 'method' => 'GET'
  1973. ]
  1974. );
  1975. return $this->render(
  1976. '/default/homepage.html.twig',
  1977. [
  1978. 'form' => $form->createView(),
  1979. 'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
  1980. ]
  1981. );
  1982. }
  1983. public function landingPageEbayAction(RouterHelperService $routerHelperService): RedirectResponse
  1984. {
  1985. return $this->redirect(
  1986. $routerHelperService->generate(
  1987. 'fos_user_registration_register'
  1988. ) . '?createWithRole=ROLE_JOBSEEKER&away=true'
  1989. );
  1990. }
  1991. /**
  1992. * @throws Exception
  1993. */
  1994. public function instructionPageEbayAction(ConversionEventService $conversionEventService): Response
  1995. {
  1996. /** @var User $user */
  1997. $user = $this->getUser();
  1998. $conversionEventService->initiateGoalReachedConversionTracking($user, ConversionEventService::CAMPAIGN_ID_EBAY, 2);
  1999. return $this->render('/default/content/so_gehts_anleitung.html.twig');
  2000. }
  2001. /**
  2002. * @throws Exception
  2003. */
  2004. public function redirectToMailtoUriAction(
  2005. Request $request,
  2006. EntityManagerInterface $entityManager,
  2007. BusinessEventDomainService $businessEventDomainService,
  2008. ConversionEventService $conversionEventService
  2009. ): RedirectResponse {
  2010. $mailtoUri = $request->get('mailtoUri');
  2011. $c = $request->get('c');
  2012. $conversationMessageId = $request->get('conversationMessageId');
  2013. if (is_null($mailtoUri) || is_null($c)) {
  2014. throw new BadRequestHttpException('Need query string parameters mailtoUri and c.');
  2015. }
  2016. if (!Checksummer::checksumIsValid($mailtoUri, $c)) {
  2017. throw new BadRequestHttpException('Wrong checksum.');
  2018. }
  2019. /** @var ConversationMessage $conversationMessage */
  2020. $conversationMessage = null;
  2021. /** @var RecurrentJob|null $relatedRecurrentJob */
  2022. $relatedRecurrentJob = null;
  2023. /** @var WantedJob|null $relatedWantedJob */
  2024. $relatedWantedJob = null;
  2025. if (!is_null($conversationMessageId)) {
  2026. $conversationMessage = $entityManager->find(ConversationMessage::class, $conversationMessageId);
  2027. if (!is_null($conversationMessage)) {
  2028. $relatedRecurrentJob = $conversationMessage->getRelatedRecurrentJob();
  2029. $relatedWantedJob = $conversationMessage->getRelatedWantedJob();
  2030. }
  2031. }
  2032. $businessEventDomainService->writeNewEvent(
  2033. BusinessEvent::EVENT_TYPE_USER_CLICKED_MAILTO_LINK_IN_CONVERSATION_MESSAGE_BODY,
  2034. $this->getUser(),
  2035. $relatedRecurrentJob,
  2036. $relatedWantedJob,
  2037. json_encode(['conversationMessageId' => $conversationMessageId])
  2038. );
  2039. if (!is_null($conversationMessage)) {
  2040. if ($conversationMessage->getSenderProfile()
  2041. ->getUser()
  2042. ->getCreatedVia() === User::CREATED_VIA_RECRUIT_DL_RECURRENT_JOB_LANDINGPAGE
  2043. ) {
  2044. $businessEventDomainService->writeNewEvent(
  2045. BusinessEvent::EVENT_TYPE_USER_CLICKED_MAILTO_LINK_IN_CONVERSATION_MESSAGE_BODY_OF_RECRUIT_DL_SENDER,
  2046. $this->getUser(),
  2047. $relatedRecurrentJob,
  2048. $relatedWantedJob,
  2049. json_encode(['conversationMessageId' => $conversationMessageId])
  2050. );
  2051. $conversionEventService->handleConversionGoalReached(
  2052. ConversionEventService::CAMPAIGN_ID_INDEED_RECRUIT_DL_LANDINGPAGE_CONTACT_EMAIL,
  2053. 0,
  2054. $request,
  2055. $this->getUser()
  2056. );
  2057. }
  2058. }
  2059. return $this->redirect("mailto:$mailtoUri");
  2060. }
  2061. public function redirectWithDirectLoginToAvoidSecurityAction(
  2062. ?string $route,
  2063. ?string $id = null
  2064. ): RedirectResponse {
  2065. if (is_null($route)) {
  2066. throw $this->createNotFoundException();
  2067. }
  2068. return $this->redirectToRoute($route, ['id' => $id]);
  2069. }
  2070. /**
  2071. * @throws Exception
  2072. */
  2073. public function redirectToChooseAndPayFromFixedBottomAlertAction(
  2074. Request $request,
  2075. ConversionEventService $conversionEventService,
  2076. BusinessEventDomainService $businessEventDomainService
  2077. ): RedirectResponse {
  2078. /** @var User $user */
  2079. $user = $this->getUser();
  2080. $businessEventDomainService->writeNewEvent(
  2081. BusinessEvent::EVENT_TYPE_USER_HAS_CLICKED_MEMBERSHIP_BUTTON_FROM_FIXED_BOTTOM_ALERT,
  2082. $user
  2083. );
  2084. $conversionEventService->initiateGoalReachedConversionTracking(
  2085. $user,
  2086. ConversionEventService::CAMPAIGN_ID_MEMBERSHIP_TRACKING_NEW_CTAS,
  2087. 1,
  2088. null,
  2089. $request
  2090. );
  2091. return $this->redirectToRoute(
  2092. 'account.subscription.jobofferer.choose_and_pay_form'
  2093. );
  2094. }
  2095. public function redirectToProJobooDeAction(
  2096. BusinessEventDomainService $businessEventDomainService
  2097. ): Response {
  2098. $businessEventDomainService->writeNewEvent(
  2099. BusinessEvent::EVENT_TYPE_JOBOFFERER_LINK_TO_PROJOBOODE_CLICKED,
  2100. $this->getUser()
  2101. );
  2102. return new RedirectResponse(
  2103. $this->digitalEstateUrlPro,
  2104. Response::HTTP_TEMPORARY_REDIRECT
  2105. );
  2106. }
  2107. public function redirectToProJobooDePriceAction(
  2108. BusinessEventDomainService $businessEventDomainService
  2109. ): Response {
  2110. $businessEventDomainService->writeNewEvent(
  2111. BusinessEvent::EVENT_TYPE_JOBOFFERER_LINK_TO_PROJOBOODE_PRICE_CLICKED,
  2112. $this->getUser()
  2113. );
  2114. return new RedirectResponse(
  2115. $this->digitalEstateUrlPro . '/preise/',
  2116. Response::HTTP_TEMPORARY_REDIRECT
  2117. );
  2118. }
  2119. public function redirectToContentJobooDeAction(
  2120. BusinessEventDomainService $businessEventDomainService
  2121. ): Response {
  2122. $businessEventDomainService->writeNewEvent(
  2123. BusinessEvent::EVENT_TYPE_JOBOFFERER_LINK_TO_CONTENTJOBOODE_CLICKED,
  2124. $this->getUser()
  2125. );
  2126. return new RedirectResponse(
  2127. $this->digitalEstateUrlContent,
  2128. Response::HTTP_TEMPORARY_REDIRECT
  2129. );
  2130. }
  2131. }