<?php
namespace App\Controller;
use App\Entity\AutomatedEmailNotificationDefinition\AutomatedEmailNotificationDefinitionTextContent;
use App\Entity\ContactForCorporateClientMessage;
use App\Entity\ContactMessage;
use App\Entity\ConversationMessage\ConversationMessage;
use App\Entity\RecurrentJob;
use App\Entity\UsageEvent;
use App\Entity\User;
use App\Entity\WantedJob;
use App\Event\RatingEvent;
use App\Form\ContactForCorporateClientMessageType;
use App\Form\ContactMessageType;
use App\Form\RatingType;
use App\Form\RecurrentJobsSearchParametersType;
use App\Service\AutomatedEmailNotificationDefinitionService;
use App\Service\CaptchaService;
use App\Service\ConversationMessageFolderService;
use App\Service\ConversationMessageService;
use App\Service\ConversionEventService;
use App\Service\CookieService;
use App\Service\EntityTransformationService;
use App\Service\ExternalFeedsService;
use App\Service\FeatureLimitationsService;
use App\Service\FrontendSpaService;
use App\Service\GeneralValuesGaugesService;
use App\Service\LandingPageService;
use App\Service\MailService;
use App\Service\Membership\MembershipService;
use App\Service\ProfileService;
use App\Service\RatingService;
use App\Service\RecurrentJobsSearchService;
use App\Service\RedirectHelperService;
use App\Service\RouterHelperService;
use App\Service\SessionService;
use App\Service\UsageEventService;
use App\Utility\Checksummer;
use App\Utility\DateTimeUtility;
use App\Validator\XssSafeValidator;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use GuzzleHttp\Exception\GuzzleException;
use JanusHercules\DatawarehouseIntegration\Domain\Entity\BusinessEvent;
use JanusHercules\DatawarehouseIntegration\Domain\Service\BusinessEventDomainService;
use Psr\Http\Client\ClientExceptionInterface;
use Swift_Message;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
class DefaultController extends AbstractController
{
private TranslatorInterface $translator;
private RedirectHelperService $redirectHelperService;
public string $digitalEstateUrlContent;
public string $digitalEstateUrlPro;
public function __construct(
TranslatorInterface $translator,
RedirectHelperService $redirectHelperService,
string $digitalEstateUrlContent,
string $digitalEstateUrlPro,
private KernelInterface $kernel
) {
$this->translator = $translator;
$this->redirectHelperService = $redirectHelperService;
$this->digitalEstateUrlContent = $digitalEstateUrlContent;
$this->digitalEstateUrlPro = $digitalEstateUrlPro;
}
/**
* We end up here if no other route matches
* Because we want users to always be on a language path, we redirect.
*/
public function catchallAction(
Request $request,
RouterInterface $router
): Response {
if ($response = $this->redirectHelperService->getResponseForRequest($request, 'Diese Seite ist nicht verfügbar. <a href="/">Zur Startseite.</a>')) {
return $response;
}
$path = urldecode(parse_url($request->getRequestUri())['path']);
$preferred = $request->getPreferredLanguage(['de']);
$redirectTo = '/' . $preferred . $path;
try {
$matched = $router->match($redirectTo);
if ($matched['_route'] === 'catchall') {
return $this->render('/errors/notfound.html.twig', [], new Response(null, Response::HTTP_NOT_FOUND));
}
} catch (ResourceNotFoundException) {
return $this->render('/errors/notfound.html.twig', [], new Response(null, Response::HTTP_NOT_FOUND));
}
return $this->redirect($this->appendQueryStringToUrl($redirectTo, $request), Response::HTTP_MOVED_PERMANENTLY);
}
private function appendQueryStringToUrl(
string $url,
Request $request
): string {
$append = '';
if (trim($request->getQueryString()) !== '') {
$append = '?' . $request->getQueryString();
}
return $url . $append;
}
/** @throws Exception */
public function homepageAction(
Request $request,
GeneralValuesGaugesService $gaugesService,
FeatureLimitationsService $featureLimitationsService,
FrontendSpaService $frontendSpaService,
ConversionEventService $conversionEventService,
RecurrentJobsSearchService $recurrentJobsSearchService
): Response {
$scrollingNumberWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
/** @var User $user */
$user = $this->getUser();
$conversionEventService->initiateGoalReachedConversionTrackingBasedOnRequest(
$request,
$user
);
if (!is_null($user)) {
if (!$featureLimitationsService->userCanUseWebsiteOutsideOfExternalJobPostingCrawlerManager($user)) {
return $this->redirect($frontendSpaService->getSpaUrl(FrontendSpaService::ROUTE_EXTERNAL_JOB_POSTING_CRAWLER_MANAGEMENT_CONTENT_PARSER_TASK_MANAGER));
}
return $this->redirectToRoute('dashboard');
} else {
// Redirect to reverse proxy for webflow page
if ($this->kernel->getEnvironment() === 'prod') {
return new RedirectResponse(
'/de/home',
Response::HTTP_TEMPORARY_REDIRECT
);
}
}
$formPrefillOccupationalFieldSearchterm = '';
if ($request->get('occupationalFieldSearchterm')) {
$formPrefillOccupationalFieldSearchterm = $request->get('occupationalFieldSearchterm');
}
$recurrentJobsSearchParameters = $recurrentJobsSearchService->prefillForm($user, $formPrefillOccupationalFieldSearchterm);
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
$recurrentJobsSearchParameters,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
$response = $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'targetProfileTypes' => 'all',
'occupationalField' => null,
'scrollingNumbersWidgetValueSet' => $scrollingNumberWidgetValueSet
]
);
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
/**
* @throws Exception
*/
public function homepageFBAction(
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService
): Response {
$conversionEventService->initiateGoalReachedConversionTracking(
null,
ConversionEventService::CAMPAIGN_ID_FACEBOOK,
2
);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
$response = $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'targetProfileTypes' => 'all',
'occupationalField' => null,
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
/**
* @throws Exception
*/
public function landingpageFBDynamicAction(
Request $request,
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService
): Response {
$subcampaignId = (int)$request->get('subcampaignId');
if ($subcampaignId < 8 || $subcampaignId > 30) {
return $this->redirectToRoute('homepage');
}
$conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_FACEBOOK, $subcampaignId);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
$response = $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'targetProfileTypes' => 'all',
'occupationalField' => null,
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
/**
* @throws Exception
*/
public function homepageFBNewAction(
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService
): Response {
$conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_FACEBOOK, 6);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
$response = $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'targetProfileTypes' => 'all',
'occupationalField' => null,
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
/**
* @throws Exception
*/
public function landingpageFBSearchAction(
ConversionEventService $conversionEventService
): RedirectResponse {
$conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_FACEBOOK, 7);
return $this->redirectToRoute('recurrent_jobs_search.form');
}
/**
* @throws Exception
*/
public function criteoLandingpageAction(
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService
): Response {
if (is_null($this->getUser())) {
$conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_CRITEO, 1);
}
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
$response = $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'targetProfileTypes' => 'all',
'occupationalField' => null,
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
/**
* @throws Exception
*/
public function criteoRemarketingpageAction(
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService
): Response {
if (is_null($this->getUser())) {
$conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_CRITEO, 2);
}
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
$response = $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'targetProfileTypes' => 'all',
'occupationalField' => null,
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
public function videoAction(): Response
{
$response = $this->render('/default/video.html.twig');
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
/**
* @throws Exception
*/
public function landingpageAction(
Request $request,
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService,
RecurrentJobsSearchService $recurrentJobsSearchService
): Response {
if ($request->attributes->get('id') === '101') {
$conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_EBAY, 1);
}
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$user = $this->getUser();
$formPrefillOccupationalFieldSearchterm = '';
if ($request->get('occupationalFieldSearchterm')) {
$formPrefillOccupationalFieldSearchterm = $request->get('occupationalFieldSearchterm');
}
$recurrentJobsSearchParameters = $recurrentJobsSearchService->prefillForm($user, $formPrefillOccupationalFieldSearchterm);
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
$recurrentJobsSearchParameters,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
$response = $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'targetProfileTypes' => 'all',
'hasHgkExtra' => $request->attributes->get('id') === '112',
'occupationalField' => null,
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
public function landingpageJobseekerAction(): Response
{
$response = $this->render(
'/default/landingpage.html.twig',
[
'targetProfileTypes' => 'jobseekers'
]
);
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
public function landingpageJoboffererAction(): Response
{
$response = $this->render(
'/default/landingpage.html.twig',
[
'targetProfileTypes' => 'jobofferers'
]
);
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
/**
* @throws Exception
*/
public function trackableLandingpageGmxDesktopAction(
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService
): Response {
if (is_null($this->getUser())) {
$conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_GMX, 0);
}
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
$response = $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'targetProfileTypes' => 'all',
'occupationalField' => null,
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
/**
* @throws Exception
*/
public function trackableLandingpageGmxMobileAction(
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService
): Response {
if (is_null($this->getUser())) {
$conversionEventService->initiateGoalReachedConversionTracking(null, ConversionEventService::CAMPAIGN_ID_GMX, 1);
}
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
$response = $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'targetProfileTypes' => 'all',
'occupationalField' => null,
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
private function compileUserIdAndUserRole(
?User $user,
Request $request
): string {
$userId = (!is_null($user) ? $user->getId() : $this->translator->trans('contact_message.unknown'));
$userRole = '(unbekannt)';
$adminUrl = '';
if (!is_null($user)) {
$adminUrl = '(' . $request->getSchemeAndHttpHost() . $this->generateUrl('admin.users', ['q' => $user->getId()]) . ')';
if ($user->isJobofferer()) {
$userRole = 'Jobofferer';
} elseif ($user->isJobseeker()) {
$userRole = 'Jobseeker';
}
}
return $this->translator->trans('contact_message.email_prefix', [
'%id%' => $userId,
'%role%' => $userRole,
'%admin_url%' => $adminUrl
]);
}
/**
* @throws GuzzleException
* @throws ClientExceptionInterface
* @throws \Doctrine\DBAL\Driver\Exception
*/
public function contactAction(
Request $request,
CaptchaService $captchaService,
MailService $mailService,
EntityTransformationService $entityTransformationService,
): Response {
$form = $this->createForm(ContactMessageType::class);
$form->handleRequest($request);
/** @var User|null $user */
$user = $this->getUser();
if ($form->isSubmitted() && $form->isValid()) {
if (!$captchaService->requestContainsValidCaptchaSolution($request)) {
return $this->render(
'errors/general_error.html.twig',
[
'alert_message' => $this->translator->trans('errors.contact_form_wrong_recaptcha.alert_message'),
'main_content_message' => $this->translator->trans('errors.contact_form_wrong_recaptcha.main_content_message')
],
new Response('', Response::HTTP_BAD_REQUEST)
);
}
/** @var ContactMessage $contactMessage */
$contactMessage = $form->getData();
$compiledUserInformation = $this->compileUserIdAndUserRole($user, $request);
$message = new Swift_Message(
'Kundenmail: ' . $contactMessage->subject,
$compiledUserInformation . 'Absender: ' . $contactMessage->email . "\n\n" . $contactMessage->body
);
$message->setReplyTo($contactMessage->email);
$message->setTo(
[
MailService::RECEIVER_MAILADDRESS_INFO
]
);
$message->setFrom(MailService::DEFAULT_SENDER_ADMINISTRATION_MAILADDRESS, $this->translator->trans('mailfromname.administration'));
$mailService->queueForSending(MailService::MAIL_ID_CUSTOMER_SERVICE_CONTACT, $message, $this->getUser());
$this->addFlash('success', $this->translator->trans('contact_page.success'));
return $this->redirectToRoute(
'contact',
[],
Response::HTTP_SEE_OTHER
);
}
if (!$form->isSubmitted()) {
$subjectPrefill = $request->get('newContactMessageSubjectPrefill', '');
$bodyPrefill = $request->get('newContactMessageBodyPrefill', '');
$emailPrefill = $request->get('newContactMessageEmailPrefill', '');
$contactMessage = new ContactMessage();
$contactMessage->subject = strip_tags($subjectPrefill);
$contactMessage->body = strip_tags($bodyPrefill);
$contactMessage->email = strip_tags($emailPrefill);
$form->setData($contactMessage);
}
$response = $this->render(
'/default/contact.html.twig',
[
'form' => $form->createView(),
'faqs' => $entityTransformationService->getFAQsForView($user),
'contactOpen' => $request->get('contactOpen', false)
]
);
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
/**
* @throws SyntaxError
* @throws ClientExceptionInterface
* @throws \Doctrine\DBAL\Driver\Exception
* @throws RuntimeError
* @throws GuzzleException
* @throws LoaderError
*/
public function contactForCorporateClientsAction(
Request $request,
CaptchaService $captchaService,
MailService $mailService,
EntityManagerInterface $entityManager,
Environment $twigEnvironment
): Response {
$form = $this->createForm(ContactForCorporateClientMessageType::class);
$form->handleRequest($request);
$source = $request->get('source', '');
if (!XssSafeValidator::isXssSafe($source)) {
throw new BadRequestHttpException();
}
if ($form->isSubmitted() && $form->isValid()) {
if (!$captchaService->requestContainsValidCaptchaSolution($request)) {
return $this->render(
'errors/general_error.html.twig',
[
'alert_message' => $this->translator->trans('errors.contact_form_wrong_recaptcha.alert_message'),
'main_content_message' => $this->translator->trans('errors.contact_form_wrong_recaptcha.main_content_message')
],
new Response('', Response::HTTP_BAD_REQUEST)
);
} else {
/** @var ContactForCorporateClientMessage $contactForCorporateClientMessage */
$contactForCorporateClientMessage = $form->getData();
$body = $this->translator->trans(
'contact_for_corporate_clients_mail.body',
[
'%source%' => $source,
'%email%' => $contactForCorporateClientMessage->email,
'%numberOfOffices%' => $contactForCorporateClientMessage->numberOfOffices,
'%numberOfVacancies%' => $contactForCorporateClientMessage->numberOfVacancies,
'%company%' => $contactForCorporateClientMessage->company,
'%name%' => $contactForCorporateClientMessage->name,
'%phone%' => $contactForCorporateClientMessage->phone,
'%message%' => $contactForCorporateClientMessage->body
]
);
$subject = $this->translator->trans(
'contact_for_corporate_clients_mail.subject',
[
'%numberOfOffices%' => $contactForCorporateClientMessage->numberOfOffices,
'%company%' => $contactForCorporateClientMessage->company
]
);
$message = new Swift_Message($subject, $body);
$message->setTo(
[
'grosskundenanfrage@joboo.de'
]
);
$message->setFrom(MailService::DEFAULT_SENDER_ADMINISTRATION_MAILADDRESS, $this->translator->trans('mailfromname.administration'));
$mailService->queueForSending(MailService::MAIL_ID_CORPORATE_CUSTOMER_SERVICE_CONTACT, $message, $this->getUser());
/** @var AutomatedEmailNotificationDefinitionTextContent $confirmationTextContent */
$confirmationTextContent = $entityManager->getRepository(AutomatedEmailNotificationDefinitionTextContent::class)
->findOneBy(
[
'automatedEmailNotificationDefinition' => MailService::MAIL_ID_CORPORATE_CUSTOMER_SERVICE_CONTACT_CONFIRMATION,
'subjectId' => AutomatedEmailNotificationDefinitionService::SUBJECT_ID_CORPORATE_CUSTOMER_SERVICE_CONTACT_CONFIRMATION,
'bodyId' => AutomatedEmailNotificationDefinitionService::BODY_ID_CORPORATE_CUSTOMER_SERVICE_CONTACT_CONFIRMATION
]
);
$message = (new Swift_Message($confirmationTextContent->getSubject()))
->setFrom('team@joboo.de', $this->translator->trans('mailfromname.team'))
->setTo(
[
$contactForCorporateClientMessage->email
]
)
->setBody(
$twigEnvironment->render(
$confirmationTextContent->getTwigTemplateName()
),
'text/html'
);
$mailService->queueForSending(
$confirmationTextContent->getAutomatedEmailNotificationDefinition()
->getId(),
$message,
$this->getUser()
);
$this->addFlash('success', $this->translator->trans('contact_page.success'));
return $this->redirectToRoute(
'homepage',
[],
Response::HTTP_SEE_OTHER
);
}
}
return $this->render(
'/default/contact_for_corporate_clients.html.twig',
[
'form' => $form->createView()
]
);
}
public function contentAction(
Request $request,
string $content,
BusinessEventDomainService $businessEventDomainService
): Response {
if ($response = $this->redirectHelperService->getResponseForRequest($request, 'Dieser Inhalt ist nicht verfügbar. <a href="/">Zur Startseite.</a>')) {
return $response;
}
if (!in_array(
$content,
[
'agb',
'agb150219',
'impressum',
'so-geht-es',
'so-gehts-anleitung',
'datenschutz',
'preise',
'garantien',
'zufriedenheitsgarantie',
'vorteile-arbeitgeber',
'vorteile-jobsuchende'
]
)
) {
throw $this->createNotFoundException();
}
$parameters = [];
if ($content === 'preise') {
$businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_JOBOFFERER_LINK_TO_PROJOBOODE_PRICE_CLICKED,
$this->getUser()
);
return new RedirectResponse(
$this->digitalEstateUrlPro . '/preise/',
Response::HTTP_TEMPORARY_REDIRECT
);
}
$response = $this->render(
'/default/content/' . str_replace('-', '_', $content) . '.html.twig',
$parameters
);
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
public function occupationalFieldsLexiconAction(): Response
{
$response = $this->render('/default/occupational_fields_lexicon.html.twig');
$response->setVary('Cookie, Referer');
$response->setSharedMaxAge(60);
return $response;
}
public function occupationalFieldsLexiconEntryAction(
Request $request,
string $occupationalField,
RouterHelperService $routerHelperService,
GeneralValuesGaugesService $gaugesService
): Response {
if ($response = $this->redirectHelperService->getResponseForRequest($request, 'Dieser Inhalt ist nicht verfügbar. <a href="/">Zur Startseite.</a>')) {
return $response;
}
$occupationalField = strtolower(
str_replace(
[' / ', ' ', ' (m/w/d)', ',', 'ä', 'Ä', 'ö', 'Ö', 'ü', 'Ü'],
['_', '_', '', '', 'ae', 'AE', 'oe', 'OE', 'ue', 'UE'],
$occupationalField
)
);
if ($this->translator->trans('occupational_fields_lexicon.' . $occupationalField . '.title', [], 'lexicon') === 'occupational_fields_lexicon.' . $occupationalField . '.title') {
return new RedirectResponse($routerHelperService->generate('homepage'), Response::HTTP_MOVED_PERMANENTLY);
}
// Is this an "internal" request from a user that surfed on other pages before?
// Then show only the lexicon text.
if ($this->isRequestRefererFromOurHost($request)) {
$response = $this->render(
'/default/occupational_fields_lexicon_entry.html.twig', [
'occupationalField' => $occupationalField
]
);
// Is this an "external" request, e.g. from Google?
// Then, show the full homepage with Images and CTAs etc.
} else {
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
$response = $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'targetProfileTypes' => 'all',
'occupationalField' => $occupationalField,
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
// Ensure indiviual content for logged-in users, and avoid delivering
// the same content for not-logged-in users if the referer is different,
// in order to avoid serving the context meant for "external" requests (without GG referer)
// to "internal" requests (with GG referer).
$response->setVary('Cookie, Referer');
$response->setSharedMaxAge(60);
return $response;
}
private function isRequestRefererFromOurHost(
Request $request
): bool {
$isComingFrom = $request->server->get('HTTP_REFERER');
foreach (['go-gastro.com', 'joboo.de', 'localhost', '127.0.0.1'] as $host) {
if (stripos($isComingFrom, $host)) {
return true;
}
}
return false;
}
public function occupationalFieldsGuidebookAction(): Response
{
$response = $this->render('/default/occupational_fields_guidebook.html.twig');
$response->setVary('Cookie, Referer');
$response->setSharedMaxAge(60);
return $response;
}
public function jobApplicationGuidesAction(): Response
{
$response = $this->render('/default/job_application_guides.html.twig');
$response->setVary('Cookie, Referer');
$response->setSharedMaxAge(60);
return $response;
}
public function occupationalFieldsGuidebookEntryAction(
Request $request,
string $occupationalField
): Response {
if ($response = $this->redirectHelperService->getResponseForRequest($request, 'Dieser Inhalt ist nicht verfügbar. <a href="/">Zur Startseite.</a>')) {
return $response;
}
$occupationalField = strtolower(
str_replace(
[' / ', ' ', ' (m/w/d)', ',', 'ä', 'Ä', 'ö', 'Ö', 'ü', 'Ü'],
['_', '_', '', '', 'ae', 'AE', 'oe', 'OE', 'ue', 'UE'],
$occupationalField
)
);
if ($this->translator->trans('guidebook.' . $occupationalField . '.title', [], 'guidebook') === 'guidebook.' . $occupationalField . '.title') {
$this->addFlash(
'danger',
$this->translator->trans('guidebook.content_not_found', [], 'guidebook')
);
return $this->redirectToRoute('occupational_fields_guidebook');
} else {
$response = $this->render(
'/default/occupational_fields_guidebook.html.twig',
[
'occupationalField' => $occupationalField
]
);
}
// Ensure indiviual content for logged-in users, and avoid delivering
// the same content for not-logged-in users if the referer is different,
// in order to avoid serving the context meant for "external" requests (without GG referer)
// to "internal" requests (with GG referer).
$response->setVary('Cookie, Referer');
$response->setSharedMaxAge(60);
return $response;
}
/**
* @throws Exception
*/
public function dashboardAction(
Request $request,
EntityManagerInterface $entityManager,
UsageEventService $usageEventService,
BusinessEventDomainService $businessEventDomainService,
ConversationMessageService $conversationMessageService,
MembershipService $membershipService,
ConversationMessageFolderService $conversationMessageFolderService,
FrontendSpaService $frontendSpaService,
FeatureLimitationsService $featureLimitationsService,
RatingService $ratingService
): Response {
/** @var User $user */
$user = $this->getUser();
if (!is_null($user)) {
if (!$featureLimitationsService->userCanUseWebsiteOutsideOfExternalJobPostingCrawlerManager($user)) {
return $this->redirect($frontendSpaService->getSpaUrl(FrontendSpaService::ROUTE_EXTERNAL_JOB_POSTING_CRAWLER_MANAGEMENT_CONTENT_PARSER_TASK_MANAGER));
}
$profile = $user->getDefaultProfile();
if (is_null($profile)) {
return $this->redirectToRoute('account.profiles.index');
}
} else {
$this->addFlash(
'info',
$this->translator->trans('dashboard.anonymous.login')
);
return $this->redirectToRoute('fos_user_security_login');
}
$showHappyRater = false;
$showRater = true;
$renderParams = [];
$notYetDone = [];
if ($usageEventService->hasEventOccurredForUserInLastNDays($user, UsageEvent::EVENT_TYPE_USER_RATES_POSITIVE, 14)) {
$showHappyRater = true;
$businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_SEES_POSITIVE_RATING_OPTION,
$user
);
}
$userIsJOAndDoesNotHaveActiveMembership = $user->isJobofferer() && !$membershipService->userHasActiveJoboffererMembership($user);
if ($userIsJOAndDoesNotHaveActiveMembership
|| $usageEventService->hasEventOccurredForUser($user, UsageEvent::EVENT_TYPE_USER_HAS_RATED)
|| $conversationMessageService->getNumberOfMessagesAndExtendedApplicationsReceivedByProfileWithoutAutomatedMessagesSinceDate(
$user->getDefaultProfile(),
DateTime::createFromFormat('d/m/Y', '25/09/2019')
) < 5
|| !$usageEventService->hasEventOccurredForUserInLastNDays(
$user,
UsageEvent::EVENT_TYPE_USER_RECEIVED_FIVE_MESSAGES_EXCLUDING_JOBRADAR,
14
)
) {
$showRater = false;
} else {
$businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_SEES_RATING_OPTION,
$user
);
}
// AS LONG AS WE HAVE A SPAM PROBLEM, A SPECIAL WARNING WILL BE ADDED - TO BE REMOVED ONCE THE PROBLEM IS SOLVED
$notYetDone[] = 'spam';
$first_value = $notYetDone[array_rand($notYetDone)];
$renderParams['whichUpdate'] = $first_value;
$renderParams['showHappyRater'] = $showHappyRater;
$renderParams['showRater'] = $showRater;
// If you see this code section and it is past the $endOfBlackWeekDeal date,
// you can safely remove this part and the part inside of the dashboard_ticker template.
$now = DateTimeUtility::createDateTimeUtc();
$endOfBlackWeekDeal = DateTimeUtility::createDateTimeUtc()
->setDate(2025, 11, 30)
->setTime(23, 59, 59)
;
$isBlackWeek2025 = false;
if ($now < $endOfBlackWeekDeal) {
$isBlackWeek2025 = true;
}
$renderParams['blackWeek2025DealMustBeDisplayed'] = $isBlackWeek2025 && $userIsJOAndDoesNotHaveActiveMembership;
if ($user->isJobseeker()) {
$businessEventDomainService->writeNewEvent(BusinessEvent::EVENT_TYPE_DASHBOARD_ACTION, $user);
return $this->redirectToRoute('janus_aurora.jobseeker_dashboard');
} elseif ($user->isJobofferer()) {
$conversationMessageRepository = $entityManager->getRepository(ConversationMessage::class);
$recurrentJobRepository = $entityManager->getRepository(RecurrentJob::class);
$numberOfStarsScoreRating = $profile->getStarsScoreRating();
$boxProfileContent = $numberOfStarsScoreRating ? 'dashboard.jobofferer.box_profile.content' : 'dashboard.jobofferer.box_profile.content_static';
$recurrentJobs = $recurrentJobRepository->findPublishedRecurrentJobsByJoboffererProfileId($profile->getId());
$numberOfPublishedRecurrentJobs = count($recurrentJobs);
$boxJobsContent = $numberOfPublishedRecurrentJobs ? 'dashboard.jobofferer.box_jobs.content' : 'dashboard.jobofferer.box_jobs.content_static';
$numberOfUnreadProfileMessages = $conversationMessageRepository
->getSummaryOfUnreadReceivedMessages(
$profile,
$conversationMessageFolderService->getFolderDefinition(
$profile,
ConversationMessageService::FILTER_TYPE_RECEIVED,
ConversationMessageService::SUB_FILTER_TYPE_PROFILE_MESSAGES
)
)
->getTotalNumberOfUnreadMessages();
$boxMessageContent = $numberOfUnreadProfileMessages ? 'dashboard.jobofferer.box_messages.content' : 'dashboard.jobofferer.box_messages.content_static';
$renderParams['dashboard_jobofferer_box_profile_content'] = $this->translator->trans(
$boxProfileContent, [
'%jobofferer_stars_score%' => $numberOfStarsScoreRating
]
);
$renderParams['dashboard_jobofferer_box_jobs_content'] = $this->translator->trans(
$boxJobsContent, [
'%jobofferer_published_job_deals%' => $numberOfPublishedRecurrentJobs
]
);
$renderParams['dashboard_jobofferer_box_messages_content'] = $this->translator->trans(
$boxMessageContent, [
'%jobofferer_unread_job_deals%' => $numberOfUnreadProfileMessages
]
);
}
$form = $this->createForm(RatingType::class);
$form->handleRequest($request);
$renderParams['form'] = $form->createView();
$advice = $form['advice']->getData();
$rating = $form['rating']->getData();
/** @var User $user */
$user = $this->getUser();
$userEmail = $user ? $user->getEmail() : '[Der User war nicht angemeldet]';
if ($form->isSubmitted() && $form->isValid()) {
$ratingService->sendMailToInformAboutNegativeRating($userEmail, $advice, $rating);
$this->addFlash(
'success',
$this->translator->trans('rate.flash')
);
}
return $this->render('default/dashboard.html.twig', $renderParams);
}
public function loggedOutAction(Request $request): Response
{
$response = new Response();
if (!is_null($request->cookies->get(CookieService::COOKIE_NAME_LOGIN_WAS_FROM_ADMIN))) {
$response->headers->clearCookie(CookieService::COOKIE_NAME_LOGIN_WAS_FROM_ADMIN);
}
return $this->render('/default/logged_out.html.twig', [], $response);
}
public function reLoginAction(
Request $request,
SessionInterface $session,
SessionService $sessionService,
TokenStorageInterface $tokenStorage
): RedirectResponse {
$targetPath = $request->query->get('_target_path');
$targetPathChecksum = $request->query->get('_target_path_checksum');
if (!Checksummer::checksumIsValid($targetPath, $targetPathChecksum)) {
throw new BadRequestHttpException("Checksum $targetPathChecksum not valid for targetPath $targetPath.");
}
$tokenStorage->setToken();
$session->invalidate();
$response = new RedirectResponse($targetPath);
$response->headers->clearCookie('REMEMBERME');
$sessionService->setUsernamePrefillForLogin($session, $request->query->get('_username'));
return $response;
}
public function gridDemoAction(): Response
{
return $this->render('/default/grid_demo.html.twig');
}
/** @throws Exception
* @throws \Doctrine\DBAL\Driver\Exception
*/
public function ratingAction(
Request $request,
EventDispatcherInterface $eventDispatcher,
MailService $mailService,
EntityManagerInterface $entityManager,
RouterHelperService $routerHelperService
): Response {
/** @var User $user */
$user = $this->getUser();
if (is_null($user)) {
throw new BadRequestHttpException('Expected logged in user, got null.');
}
$ratingQuality = '';
if ($request->get('happy') === 'true') {
$ratingQuality = 'positive';
if (!empty($user->getEmail())) {
/** @var AutomatedEmailNotificationDefinitionTextContent $textContent */
$textContent = $entityManager->getRepository(AutomatedEmailNotificationDefinitionTextContent::class)
->findOneBy(
[
'automatedEmailNotificationDefinition' => MailService::MAIL_ID_NEW_RATING,
'subjectId' => AutomatedEmailNotificationDefinitionService::SUBJECT_ID_NEW_RATING_TICKER_OPINION,
'bodyId' => AutomatedEmailNotificationDefinitionService::BODY_ID_NEW_RATING_TICKER_OPINION
]
);
$mailService->sendHtmlNonNotificationMail(
$textContent->getAutomatedEmailNotificationDefinition(),
$user,
[
'firstname' => ProfileService::getFirstnameOrAlternativeForSalutation($user->getDefaultProfile()),
'ctaUrl' => $routerHelperService->generate('landingspage-rating-positive')
],
0
);
}
}
if ($request->get('happy') === 'false') {
$ratingQuality = 'negative';
if (!empty($user->getEmail())) {
if ($user->isJobofferer()) {
/** @var AutomatedEmailNotificationDefinitionTextContent $textContent */
$textContent = $entityManager->getRepository(AutomatedEmailNotificationDefinitionTextContent::class)
->findOneBy(
[
'automatedEmailNotificationDefinition' => MailService::MAIL_ID_NEW_RATING,
'subjectId' => AutomatedEmailNotificationDefinitionService::SUBJECT_ID_NEW_RATING_TICKER_OPINION_NEGATIVE,
'bodyId' => AutomatedEmailNotificationDefinitionService::BODY_ID_NEW_RATING_TICKER_OPINION_NEGATIVE_JOBOFFERER
]
);
$mailService->sendHtmlNonNotificationMail(
$textContent->getAutomatedEmailNotificationDefinition(),
$user,
[
'firstname' => ProfileService::getFirstnameOrAlternativeForSalutation($user->getDefaultProfile()),
'ctaUrl' => $routerHelperService->generate('landingspage-rating-negative')
],
0
);
}
if ($user->isJobseeker()) {
/** @var AutomatedEmailNotificationDefinitionTextContent $textContent */
$textContent = $entityManager->getRepository(AutomatedEmailNotificationDefinitionTextContent::class)
->findOneBy(
[
'automatedEmailNotificationDefinition' => MailService::MAIL_ID_NEW_RATING,
'subjectId' => AutomatedEmailNotificationDefinitionService::SUBJECT_ID_NEW_RATING_TICKER_OPINION_NEGATIVE,
'bodyId' => AutomatedEmailNotificationDefinitionService::BODY_ID_NEW_RATING_TICKER_OPINION_NEGATIVE_JOBSEEKER
]
);
$mailService->sendHtmlNonNotificationMail(
$textContent->getAutomatedEmailNotificationDefinition(),
$user,
[
'firstname' => ProfileService::getFirstnameOrAlternativeForSalutation($user->getDefaultProfile()),
'ctaUrl' => $routerHelperService->generate('landingspage-rating-negative')
],
0
);
}
}
}
$eventDispatcher->dispatch(
new RatingEvent($user, $ratingQuality),
RatingEvent::class
);
return new Response('', Response::HTTP_NO_CONTENT);
}
/**
* @throws Exception
*/
public function externalRatingLinkAction(
Request $request,
BusinessEventDomainService $businessEventDomainService,
UsageEventService $usageEventService
): Response {
/** @var User $user */
$user = $this->getUser();
if (is_null($user)) {
throw new BadRequestHttpException('Expected logged in user, got null.');
}
switch ($request->get('ratedOn')) {
case 'TRUSTEDSHOPS':
$businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_USED_TRUSTEDSHOPS_RATING_LINK,
$user
);
$usageEventService->eventHasOccurredForUser($user, UsageEvent::EVENT_TYPE_USER_HAS_CLICKED_RATING_LINK);
break;
case 'FACEBOOK':
$businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_USED_FACEBOOK_RATING_LINK,
$user
);
$usageEventService->eventHasOccurredForUser($user, UsageEvent::EVENT_TYPE_USER_HAS_CLICKED_RATING_LINK);
break;
case 'GOOGLE':
$businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_USED_GOOGLE_RATING_LINK,
$user
);
$usageEventService->eventHasOccurredForUser($user, UsageEvent::EVENT_TYPE_USER_HAS_CLICKED_RATING_LINK);
break;
}
return new Response('', Response::HTTP_NO_CONTENT);
}
public function gmailInstructionAction(): Response
{
return $this->render('/default/email_instruction.html.twig');
}
public function coronaTipsAction(): Response
{
return $this->render('/default/corona_tips.html.twig');
}
public function pressImagesDownloadAction(): Response
{
return $this->redirect('https://pages.joboo.de/presse/');
}
/**
* @throws Exception
*/
public function homepageGastroAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(0, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
return $this->render(
'/default/homepage_gastro.html.twig',
[
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function homepageFahrerAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(1, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
return $this->render(
'/default/homepage_fahrer.html.twig',
[
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function homepageFahrerGoogleAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(11, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
return $this->render(
'/default/homepage_fahrer.html.twig',
[
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingpageEbay0623Action(
Request $request,
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
$title = trim(strtolower($request->get('title')));
if ($title === '' || !in_array($title, ['reinigungskraft', 'packer', 'fahrer', 'gastro', 'kaufmann', 'handel', 'kueche'])) {
return $this->redirectToRoute('homepage');
}
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOn0623LandingPage($title, ExternalFeedsService::EXTERNAL_FEED_EBAY_NAME, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet,
'landingPageDefinition' => $title
]
);
}
/**
* @throws Exception
*/
public function landingpageGoogle0623Action(
Request $request,
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
$title = trim(strtolower($request->get('title')));
if ($title === '' || !in_array($title, ['reinigungskraft', 'packer', 'fahrer', 'gastro', 'kaufmann', 'handel', 'kueche'])) {
return $this->redirectToRoute('homepage');
}
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOn0623LandingPage($title, 'google', $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet,
'landingPageDefinition' => $title
]
);
}
/**
* @throws Exception
*/
public function landingpageGoogle0623AbTestAction(Request $request): RedirectResponse
{
$title = trim(strtolower($request->get('title')));
if ($title === '' || !in_array($title, ['gastro', 'kaufmann', 'kueche'])) {
return $this->redirectToRoute('homepage');
}
/** @var User|null $user */
if (!is_null($user = $this->getUser())) {
$randomChar = mb_substr(md5($user->getId()), 0, 1);
} else {
$randomChar = mb_substr(
md5(
$request->getSession()
->getId()
), 0, 1
);
}
if (in_array($randomChar, range(0, 7))) {
return $this->redirectToRoute('landingpages_google_0623', ['title' => $title]);
} else {
return $this->redirectToRoute('landingpage_' . $title . '_google');
}
}
/**
* @throws Exception
*/
public function homepageVideoGoogleAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(12, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function homepagePackerAction(
LandingPageService $landingPageService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(2, $user);
return $this->redirectToRoute('homepage');
}
/**
* @throws Exception
*/
public function homepagePackerGoogleAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(10, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
return $this->render(
'/default/homepage_packer.html.twig',
[
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function homepageReinigungskraftAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(3, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
return $this->render(
'/default/homepage_reinigungskraft.html.twig',
[
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function homepageReinigungskraftGoogleAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(9, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
return $this->render(
'/default/homepage_reinigungskraft.html.twig',
[
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function homepageHandelAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(4, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
return $this->render(
'/default/homepage_handel.html.twig',
[
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function homepageKaufmannAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(5, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
return $this->render(
'/default/homepage_kaufmann.html.twig',
[
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function homepageKaufmannGoogleAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(8, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
return $this->render(
'/default/homepage_kaufmann.html.twig',
[
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function homepageKaufmannBingAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnBingLandingPage(2, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
return $this->render(
'/default/homepage_kaufmann.html.twig',
[
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageJobboerseAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(13, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageStadtAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(17, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageStadtBingAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnBingLandingPage(3, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageJobboerseBingAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnBingLandingPage(1, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageJobooBrandAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(15, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageGGBrandAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(14, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageHandelAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(6, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
return $this->render(
'/default/homepage_handel.html.twig',
[
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageGastroAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(7, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
return $this->render(
'/default/homepage_gastro.html.twig',
[
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageGastroBingAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnBingLandingPage(0, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
return $this->render(
'/default/homepage_gastro.html.twig',
[
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageKuecheAction(
LandingPageService $landingPageService,
GeneralValuesGaugesService $gaugesService
): Response {
/** @var User $user */
$user = $this->getUser();
$landingPageService->initiateConversionTrackingOnLandingPage(16, $user);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
return $this->render(
'/default/homepage_gastro.html.twig',
[
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
public function landingPageWhatsappAction(
BusinessEventDomainService $businessEventDomainService,
GeneralValuesGaugesService $gaugesService
): Response {
$businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_WHATSAPP_LANDINGPAGE_VISITED,
$this->getUser()
);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageAktionAction(
Request $request,
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService
): Response {
$conversionEventService->initiateGoalReachedConversionTracking(
$this->getUser(),
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_AKTION,
0,
null,
$request
);
$conversionEventService->initiateGoalReachedConversionTracking(
$this->getUser(),
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_AKTION,
1,
null,
$request
);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageSonderaktionAction(
Request $request,
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService
): Response {
$conversionEventService->initiateGoalReachedConversionTracking(
$this->getUser(),
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_SONDERAKTION,
0,
null,
$request
);
$conversionEventService->initiateGoalReachedConversionTracking(
$this->getUser(),
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_SONDERAKTION,
1,
null,
$request
);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageAngebotAction(
Request $request,
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService
): Response {
$conversionEventService->initiateGoalReachedConversionTracking(
$this->getUser(),
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_ANGEBOT,
0,
null,
$request
);
$conversionEventService->initiateGoalReachedConversionTracking(
$this->getUser(),
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_ANGEBOT,
1,
null,
$request
);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageSonderangebotAction(
Request $request,
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService
): Response {
$conversionEventService->initiateGoalReachedConversionTracking(
$this->getUser(),
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_SONDERANGEBOT,
0,
null,
$request
);
$conversionEventService->initiateGoalReachedConversionTracking(
$this->getUser(),
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_SONDERANGEBOT,
1,
null,
$request
);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageJetztAction(
Request $request,
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService
): Response {
$conversionEventService->initiateGoalReachedConversionTracking(
$this->getUser(),
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_JETZT,
0,
null,
$request
);
$conversionEventService->initiateGoalReachedConversionTracking(
$this->getUser(),
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_JETZT,
1,
null,
$request
);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageYoutubeAction(
Request $request,
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService
): Response {
$conversionEventService->initiateGoalReachedConversionTracking(
$this->getUser(),
ConversionEventService::CAMPAIGN_ID_YOUTUBE,
0,
null,
$request
);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
/**
* @throws Exception
*/
public function landingPageEbayNewAction(
Request $request,
ConversionEventService $conversionEventService,
GeneralValuesGaugesService $gaugesService
): Response {
$conversionEventService->initiateGoalReachedConversionTracking(
$this->getUser(),
ConversionEventService::CAMPAIGN_ID_EBAY,
8,
null,
$request,
null,
json_encode(['searchterm' => $request->get('searchterm'), 'zipcode' => $request->get('zipcode')])
);
$scrollingNumbersWidgetValueSet = $gaugesService->getScrollingNumbersWidgetValueSetFromGeneralValueGauges();
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
null,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
return $this->render(
'/default/homepage.html.twig',
[
'form' => $form->createView(),
'scrollingNumbersWidgetValueSet' => $scrollingNumbersWidgetValueSet
]
);
}
public function landingPageEbayAction(RouterHelperService $routerHelperService): RedirectResponse
{
return $this->redirect(
$routerHelperService->generate(
'fos_user_registration_register'
) . '?createWithRole=ROLE_JOBSEEKER&away=true'
);
}
/**
* @throws Exception
*/
public function instructionPageEbayAction(ConversionEventService $conversionEventService): Response
{
/** @var User $user */
$user = $this->getUser();
$conversionEventService->initiateGoalReachedConversionTracking($user, ConversionEventService::CAMPAIGN_ID_EBAY, 2);
return $this->render('/default/content/so_gehts_anleitung.html.twig');
}
/**
* @throws Exception
*/
public function redirectToMailtoUriAction(
Request $request,
EntityManagerInterface $entityManager,
BusinessEventDomainService $businessEventDomainService,
ConversionEventService $conversionEventService
): RedirectResponse {
$mailtoUri = $request->get('mailtoUri');
$c = $request->get('c');
$conversationMessageId = $request->get('conversationMessageId');
if (is_null($mailtoUri) || is_null($c)) {
throw new BadRequestHttpException('Need query string parameters mailtoUri and c.');
}
if (!Checksummer::checksumIsValid($mailtoUri, $c)) {
throw new BadRequestHttpException('Wrong checksum.');
}
/** @var ConversationMessage $conversationMessage */
$conversationMessage = null;
/** @var RecurrentJob|null $relatedRecurrentJob */
$relatedRecurrentJob = null;
/** @var WantedJob|null $relatedWantedJob */
$relatedWantedJob = null;
if (!is_null($conversationMessageId)) {
$conversationMessage = $entityManager->find(ConversationMessage::class, $conversationMessageId);
if (!is_null($conversationMessage)) {
$relatedRecurrentJob = $conversationMessage->getRelatedRecurrentJob();
$relatedWantedJob = $conversationMessage->getRelatedWantedJob();
}
}
$businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_USER_CLICKED_MAILTO_LINK_IN_CONVERSATION_MESSAGE_BODY,
$this->getUser(),
$relatedRecurrentJob,
$relatedWantedJob,
json_encode(['conversationMessageId' => $conversationMessageId])
);
if (!is_null($conversationMessage)) {
if ($conversationMessage->getSenderProfile()
->getUser()
->getCreatedVia() === User::CREATED_VIA_RECRUIT_DL_RECURRENT_JOB_LANDINGPAGE
) {
$businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_USER_CLICKED_MAILTO_LINK_IN_CONVERSATION_MESSAGE_BODY_OF_RECRUIT_DL_SENDER,
$this->getUser(),
$relatedRecurrentJob,
$relatedWantedJob,
json_encode(['conversationMessageId' => $conversationMessageId])
);
$conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_INDEED_RECRUIT_DL_LANDINGPAGE_CONTACT_EMAIL,
0,
$request,
$this->getUser()
);
}
}
return $this->redirect("mailto:$mailtoUri");
}
public function redirectWithDirectLoginToAvoidSecurityAction(
?string $route,
?string $id = null
): RedirectResponse {
if (is_null($route)) {
throw $this->createNotFoundException();
}
return $this->redirectToRoute($route, ['id' => $id]);
}
/**
* @throws Exception
*/
public function redirectToChooseAndPayFromFixedBottomAlertAction(
Request $request,
ConversionEventService $conversionEventService,
BusinessEventDomainService $businessEventDomainService
): RedirectResponse {
/** @var User $user */
$user = $this->getUser();
$businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_USER_HAS_CLICKED_MEMBERSHIP_BUTTON_FROM_FIXED_BOTTOM_ALERT,
$user
);
$conversionEventService->initiateGoalReachedConversionTracking(
$user,
ConversionEventService::CAMPAIGN_ID_MEMBERSHIP_TRACKING_NEW_CTAS,
1,
null,
$request
);
return $this->redirectToRoute(
'account.subscription.jobofferer.choose_and_pay_form'
);
}
public function redirectToProJobooDeAction(
BusinessEventDomainService $businessEventDomainService
): Response {
$businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_JOBOFFERER_LINK_TO_PROJOBOODE_CLICKED,
$this->getUser()
);
return new RedirectResponse(
$this->digitalEstateUrlPro,
Response::HTTP_TEMPORARY_REDIRECT
);
}
public function redirectToProJobooDePriceAction(
BusinessEventDomainService $businessEventDomainService
): Response {
$businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_JOBOFFERER_LINK_TO_PROJOBOODE_PRICE_CLICKED,
$this->getUser()
);
return new RedirectResponse(
$this->digitalEstateUrlPro . '/preise/',
Response::HTTP_TEMPORARY_REDIRECT
);
}
public function redirectToContentJobooDeAction(
BusinessEventDomainService $businessEventDomainService
): Response {
$businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_JOBOFFERER_LINK_TO_CONTENTJOBOODE_CLICKED,
$this->getUser()
);
return new RedirectResponse(
$this->digitalEstateUrlContent,
Response::HTTP_TEMPORARY_REDIRECT
);
}
}