<?php
namespace App\Controller;
use App\Entity\DebuggingInfoBag;
use App\Entity\ExternalPartner\IntegratedExternalPartnerCustomer;
use App\Entity\RecurrentJob;
use App\Entity\RecurrentJobsSearch\RecurrentJobsSearchParameters;
use App\Entity\RecurrentJobsSearch\RecurrentJobsSearchResultset;
use App\Entity\UsageEvent;
use App\Entity\User;
use App\Entity\WantedJob;
use App\Exception\UncallableSearchPageException;
use App\Exception\UnknownZipcodeException;
use App\Form\RecurrentJobsSearchParametersType;
use App\Service\ConversionEventService;
use App\Service\DebuggingService;
use App\Service\ExternalPartner\IntegratedExternalPartnerService;
use App\Service\FeatureFlagService;
use App\Service\FeatureLimitationsService;
use App\Service\Membership\MembershipService;
use App\Service\RecurrentJobsSearchService;
use App\Service\RouterHelperService;
use App\Service\SearchTracingService;
use App\Service\SeoService;
use App\Service\SessionService;
use App\Service\UsageEventService;
use App\Value\GeneralApplicationSettingsValue;
use App\Value\ZipcodeRadiusesValue;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use JanusHercules\DatawarehouseIntegration\Domain\Entity\ExternalPartnerEvent;
use JanusHercules\DatawarehouseIntegration\Domain\Service\ExternalPartnerEventDomainService;
use Liip\ImagineBundle\Imagine\Cache\CacheManager;
use Monolog\Logger;
use Psr\Log\LoggerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
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\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Throwable;
use UnexpectedValueException;
class RecurrentJobsSearchController extends AbstractController implements DoAdditionalUserChecksControllerInterface
{
use SearchControllerHelper;
private FeatureFlagService $featureFlagService;
public function __construct(FeatureFlagService $featureFlagService)
{
$this->featureFlagService = $featureFlagService;
}
/** @throws Exception */
public function formAction(
Request $request,
TranslatorInterface $translator,
SessionService $sessionService,
SessionInterface $session,
RecurrentJobsSearchService $recurrentJobsSearchService,
ConversionEventService $conversionEventService,
FeatureLimitationsService $featureLimitationsService,
UsageEventService $usageEventService,
MembershipService $membershipService
) {
/** @var User|null $user */
$user = $this->getUser();
if ($user instanceof User && $user->isJobofferer()) {
$this->addFlash(
'info',
$translator->trans('recurrent_jobs_search.alert_jobofferers_not_allowed')
);
return $this->redirectToRoute('wanted_jobs_search.form');
}
$conversionEventService->initiateGoalReachedConversionTrackingBasedOnRequest(
$request,
$user
);
$formPrefillOccupationalFieldSearchterm = '';
if ($request->get('occupationalFieldSearchterm')) {
$formPrefillOccupationalFieldSearchterm = $request->get('occupationalFieldSearchterm');
}
$recurrentJobsSearchParameters = $recurrentJobsSearchService->prefillForm($user, $formPrefillOccupationalFieldSearchterm);
$sessionService->resetProfileIdsForMultiMessageSelection($session);
$premiumRadarPrice = $membershipService->getJobseekerPremiumRadarPrice();
$showMembershipModal = false;
if (!is_null($user) && $user->hasJobseekerProfile()) {
if ($showMembershipModal = $featureLimitationsService->jobseekerMustSeeMembershipModalInSearchForm($user->getDefaultJobseekerProfile())) {
$usageEventService->eventHasOccurredForUser($user, UsageEvent::EVENT_TYPE_USER_SAW_MEMBERSHIP_MODAL);
}
}
$queryString = '';
if ($showMembershipModal) {
$stepLinkCreatedConversionEvent = $conversionEventService->createStepLinkCreatedConversionEvent(
$user,
ConversionEventService::CAMPAIGN_ID_JOBSEEKER_MEMBERSHIP,
0,
null,
$request,
null,
json_encode(['premiumRadarPrice' => $premiumRadarPrice])
);
$queryString = '?' . ConversionEventService::QUERY_STRING_PARAM_NAME . '=' . $stepLinkCreatedConversionEvent->getId();
}
$form = $this->createForm(
RecurrentJobsSearchParametersType::class,
$recurrentJobsSearchParameters,
[
'action' => $this->generateUrl('janus_hercules.recurrent_jobs_search.results') . '#results',
'method' => 'GET'
]
);
$response = $this->render('/recurrent_jobs_search/form.html.twig', [
'form' => $form->createView(),
'waitingInfo' => $recurrentJobsSearchService->getWaitingInfo($user),
'showMembershipModal' => $showMembershipModal,
'premiumRadarPrice' => $premiumRadarPrice,
'queryString' => $queryString
]
);
$response->setVary('Cookie');
$response->setSharedMaxAge(60);
return $response;
}
public function profileSelectionForMultipleMessageAddApiAction(Request $request, SessionService $sessionService, SessionInterface $session)
{
if ($request->getMethod() === Request::METHOD_OPTIONS) {
return new Response('', Response::HTTP_NO_CONTENT, ['Allow' => 'OPTIONS, POST']);
}
if (!is_null($request->get('joboffererProfileId'))) {
$sessionService->addProfileIdForMultiMessageSelection($session, $request->get('joboffererProfileId'));
}
return new Response('', Response::HTTP_NO_CONTENT);
}
public function profileSelectionForMultipleMessageDeleteApiAction(Request $request, SessionService $sessionService, SessionInterface $session)
{
if ($request->getMethod() !== Request::METHOD_DELETE) {
return new Response('', Response::HTTP_NO_CONTENT, ['Allow' => 'DELETE']);
}
if (!is_null($request->get('joboffererProfileId'))) {
$sessionService->deleteProfileIdForMultiMessageSelection($session, $request->get('joboffererProfileId'));
}
return new Response('', Response::HTTP_NO_CONTENT);
}
public function profileSelectionForMultipleMessageGetApiAction(Request $request, SessionService $sessionService, SessionInterface $session)
{
if ($request->getMethod() === Request::METHOD_OPTIONS) {
return new Response('', Response::HTTP_NO_CONTENT, ['Allow' => 'OPTIONS, POST']);
}
return new JsonResponse($sessionService->getProfileIdsForMultiMessageSelection($session));
}
public function resultsAction(
Request $request
): RedirectResponse {
$queryString = $request->getQueryString();
if (!is_null($queryString)) {
$queryString = '?' . $queryString;
} else {
$queryString = '';
}
return new RedirectResponse(
$this->container->get('router')->generate(
'janus_hercules.recurrent_jobs_search.results',
[],
UrlGeneratorInterface::ABSOLUTE_URL) . $queryString,
301
);
}
public function allJobsAction(Request $request, TranslatorInterface $translator, ConversionEventService $conversionEventService)
{
/** @var User $user */
$user = $this->getUser();
$boostExternalJobs = $request->query->get('boostExternalJobs') === '1' ? true : false;
if (($user instanceof User && $user->isJobseeker()) || is_null($user) && $boostExternalJobs) {
$queryParameter = $request->query->get('recurrent_jobs_search_parameters');
$filterZipcode = array_key_exists('filterZipcode', $queryParameter)
? $queryParameter['filterZipcode']
: $user->getDefaultJoboffererProfile()->getZipcode();
$filterRequiredExperience = array_key_exists('filterRequiredExperience', $queryParameter)
? $queryParameter['filterRequiredExperience']
: RecurrentJob::EXPERIENCE_NONE;
$recurrentJobsSearchParameters = new RecurrentJobsSearchParameters(
RecurrentJobsSearchService::SEARCHTERM_ALL_JOBS,
$filterZipcode,
ZipcodeRadiusesValue::JOBSEEKER_PROFILE_DEFAULT,
$filterRequiredExperience,
RecurrentJob::POSSIBLE_CAREER_LEVELS,
false,
RecurrentJob::POSSIBLE_EMPLOYMENT_TYPES,
false,
true
);
return $this->redirectToRoute(
'janus_hercules.recurrent_jobs_search.results',
[
'recurrent_jobs_search_parameters' => $recurrentJobsSearchParameters->asArray(),
'filterAllJobs' => 1,
'boostExternalJobs' => $boostExternalJobs
]
);
} else {
$this->addFlash('info', $translator->trans('alert_jobofferers_not_allowed'));
return $this->redirectToRoute('recurrent_jobs_search.form');
}
}
/**
* @ParamConverter("wantedJob", class="App\Entity\WantedJob", options={"id" = "wantedJobId"}))
*/
public function specificWantedJobAction(WantedJob $wantedJob, Request $request)
{
$recurrentJobsSearchParameters = RecurrentJobsSearchParameters::fromWantedJob($wantedJob);
return $this->redirectToRoute(
'janus_hercules.recurrent_jobs_search.results',
[
'recurrent_jobs_search_parameters' => $recurrentJobsSearchParameters->asArray(),
]
);
}
public function landingpageAction(Request $request, string $slug, SeoService $seoService, LoggerInterface $logger)
{
try {
$seoParameters = $seoService->getSeoParametersFromRecurrentJobSearchSlug($slug);
$filterRequiredEmploymentTypes = strtolower($seoParameters['filterSearchterm']) === 'minijobs'
? ['recurrent_jobs.new_page.employment_types.help' => RecurrentJob::EMPLOYMENT_TYPE_HELP]
: null;
$filterRequiredEmploymentTypes = strtolower($seoParameters['filterSearchterm']) === 'teilzeitjobs'
? ['recurrent_jobs.new_page.employment_types.part_time' => RecurrentJob::EMPLOYMENT_TYPE_PART_TIME]
: $filterRequiredEmploymentTypes;
$searchParameters = $seoService->getRecurrentJobSeoSearchParameters(
$seoParameters['filterSearchterm'],
$seoParameters['zipcode'],
null,
$filterRequiredEmploymentTypes
);
} catch (UnexpectedValueException $e) {
$logger->info("Can't resolve search parameters from seo slug '{$slug}': {$e->getMessage()}");
return $this->render(
'/errors/notfound.html.twig',
[],
new Response(null, Response::HTTP_NOT_FOUND)
);
}
return $this->forward(
\JanusHercules\RecurrentJobsSearch\Presentation\Controller\RecurrentJobsSearchController::class . '::resultsAction',
[
'_route' => $request->attributes->get('_route'),
'seoParameters' => $seoParameters,
'_route_params' => $request->attributes->get('_route_params'),
'slug' => $slug
],
$searchParameters
);
}
public function getRecurrentJobIdsForAnonymousSearchRequestAction(Request $request, RecurrentJobsSearchService $recurrentJobsSearchService, SearchTracingService $tracingService, FeatureFlagService $featureFlagService, DebuggingService $debuggingService, LoggerInterface $logger)
{
try {
if (!is_null($this->getUser())) {
throw new AccessDeniedHttpException('Not applicable for registered users');
}
$searchParametersFromUri = base64_decode($request->get('recurrent_jobs_search_parameters'));
$searchParametersArray = json_decode($searchParametersFromUri);
$returnJson = [];
$searchParams = new RecurrentJobsSearchParameters(
$searchParametersArray->filterSearchterm,
$searchParametersArray->filterZipcode,
$searchParametersArray->filterZipcodeRadius,
$searchParametersArray->filterRequiredExperience,
[
RecurrentJob::CAREER_LEVEL_TRAINEE,
RecurrentJob::CAREER_LEVEL_ASSISTANT,
RecurrentJob::CAREER_LEVEL_EXPERT,
RecurrentJob::CAREER_LEVEL_EXECUTIVE
],
false,
[
RecurrentJob::EMPLOYMENT_TYPE_ONCE,
RecurrentJob::EMPLOYMENT_TYPE_HELP,
RecurrentJob::EMPLOYMENT_TYPE_PART_TIME,
RecurrentJob::EMPLOYMENT_TYPE_FULL_TIME
]
);
$showAnonymousResults = false;
$maximumTotalNumberOfResults = $numberOfResultsPerPage = $recurrentJobsSearchService->getMaxNumberOfResults(
false,
GeneralApplicationSettingsValue::RECURRENT_JOBS_SEARCH_ANONYMOUS_MAX_NUMBER_OF_RESULTS_PER_PAGE
);
$tracing = $tracingService->createTracing($recurrentJobsSearchService);
$fullResultset = new RecurrentJobsSearchResultset($searchParams, $tracing);
try {
$fullResultset = $recurrentJobsSearchService->getResultset(
$searchParams,
$maximumTotalNumberOfResults,
0,
$featureFlagService->isFeatureEnabledForUser($featureFlagService::FEATURE_EXTERNAL_PARTNERS, null),
$showAnonymousResults,
null
);
} catch (UnknownZipcodeException $e) {
$debuggingInfoBag = new DebuggingInfoBag(
'unknown-zipcode-recurrent-jobs-search',
'Unknown zipcode ' . $searchParams->getFilterZipcode() . ' in recurrent jobs search', '',
Logger::WARNING
);
$debuggingInfoBag->setRequest($request);
$debuggingService->log($debuggingInfoBag);
} catch (Exception $e) {
throw new HttpException(Response::HTTP_INTERNAL_SERVER_ERROR, 'An exception occurred while getting real recurrent job ids for anonymous search.', $e);
}
$fullResultset->sliceResults(0, $maximumTotalNumberOfResults);
try {
$resultsetForCurrentPage = $fullResultset->getResultsetForPage($fullResultset, 1, $numberOfResultsPerPage);
} catch (UncallableSearchPageException $e) {
return new Response('', Response::HTTP_NO_CONTENT);
}
foreach ($resultsetForCurrentPage->getResults() as $result) {
if ($result->containsRecurrentJob()) {
$returnJson[] = $result->getRecurrentJob()->getId();
}
}
} catch (Throwable $throwable) {
$logger->warning($throwable->getMessage(), ['exception' => $throwable]);
return new Response('', Response::HTTP_NO_CONTENT);
}
return new Response(json_encode($returnJson), Response::HTTP_OK);
}
public function getSimilarJobsApiAction(Request $request, RecurrentJobsSearchService $recurrentJobsSearchService, SearchTracingService $tracingService, DebuggingService $debuggingService, EntityManagerInterface $entityManager, RouterHelperService $routerHelperService, IntegratedExternalPartnerService $integratedExternalPartnerService, CacheManager $imagineCacheManager)
{
$recurrentJobId = $request->get('recurrentJobId');
$recurrentJob = null;
if (!is_null($recurrentJobId) && $recurrentJobId !== '') {
/** @var RecurrentJob|null $recurrentJob */
$recurrentJob = $entityManager->getRepository(RecurrentJob::class)->find($recurrentJobId);
}
if (!is_null($recurrentJob)) {
$showAnonymousResults = false;
$numberOfResultsPerPage = $recurrentJobsSearchService->getNumberOfResultsPerPage(false, $showAnonymousResults);
$maximumTotalNumberOfResults = $recurrentJobsSearchService->getMaxNumberOfResults(false, $numberOfResultsPerPage);
$searchParams = RecurrentJobsSearchParameters::fromRecurrentJob($recurrentJob);
$tracing = $tracingService->createTracing($recurrentJobsSearchService);
$fullResultset = new RecurrentJobsSearchResultset($searchParams, $tracing);
try {
$fullResultset = $recurrentJobsSearchService->getResultset(
$searchParams,
5,
0,
true,
$showAnonymousResults,
null
);
} catch (UnknownZipcodeException $e) {
$debuggingInfoBag = new DebuggingInfoBag(
'unknown-zipcode-recurrent-jobs-search',
'Unknown zipcode ' . $searchParams->getFilterZipcode() . ' in recurrent jobs search', '',
Logger::WARNING
);
$debuggingInfoBag->setRequest($request);
$debuggingService->log($debuggingInfoBag);
} catch (Exception $e) {
$userId = null;
throw new HttpException(Response::HTTP_INTERNAL_SERVER_ERROR, 'An exception occurred while trying to search for recurrent jobs. The query string is ' . $request->getQueryString() . ', and the userId is ' . $userId, $e);
}
}
$returnArray = [];
if (!is_null($fullResultset) && $fullResultset->getTotalNumberOfResults() > 0) {
foreach ($fullResultset->getResults() as $result) {
if ($result->containsRecurrentJob()) {
if ($result->getRecurrentJob()->getJoboffererProfile()->getBusinessName() !== $recurrentJob->getJoboffererProfile()->getBusinessName()) {
$returnArray[] = [
'id' => $result->getRecurrentJob()->getId(),
'businessName' => $result->getRecurrentJob()->getBusinessName(),
'searchterm' => $result->getRecurrentJob()->getOccupationalFieldSearchtermForDisplay(),
'zipcode' => $result->getRecurrentJob()->getZipcode(),
'city' => $result->getRecurrentJob()->getCity(),
'href' => $routerHelperService->generate(
'recurrent_jobs.share',
[
'recurrentJobId' => $result->getRecurrentJob()->getId(),
ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_CAMPAIGN_ID => ConversionEventService::CAMPAIGN_ID_SIMILAR_JOBS,
ConversionEventService::QUERY_STRING_PARAM_NAME_CONVERSION_SUBCAMPAIGN_ID => 0
],
UrlGeneratorInterface::ABSOLUTE_URL
),
'img' => ($result->getRecurrentJob()->isLinkedToExternalPartner() && $integratedExternalPartnerService->recurrentJobHasDedicatedHeaderImage($result->getRecurrentJob()))
?
str_replace('https://preview4.joboo.de/', '', $integratedExternalPartnerService->getRecurrentJobDedicatedHeaderImagePath($result->getRecurrentJob()))
:
(($result->getRecurrentJob()->hasProfilePhoto())
? str_replace(
'https://preview4.joboo.de/media/cache/resolve/', 'https://default.cdn.www.joboo.de/',
$imagineCacheManager->getBrowserPath($result->getRecurrentJob()->getProfilePhotoFileName(), $result->getRecurrentJob()->getImagineFilterNameForMaximizedProfilePhoto())
)
: null
)
];
}
}
}
}
return $this->json($returnArray);
}
public function resultsForOneSpecificCustomerAction(
Request $request
): RedirectResponse {
$customerInternalId = $request->get('customerInternalId');
if (is_null($customerInternalId)) {
$parameters = [];
} else {
$parameters = ['customerInternalId' => $customerInternalId];
}
$queryString = $request->getQueryString();
if (!is_null($queryString)) {
$queryString = '?' . $queryString;
} else {
$queryString = '';
}
return new RedirectResponse(
$this->container->get('router')->generate(
'janus_hercules.recurrent_jobs_search.results.for_specific_customer',
$parameters,
UrlGeneratorInterface::ABSOLUTE_URL) . $queryString,
301
);
}
/** @throws Exception */
public function resultsForOneSpecificCustomerFromGoogleAction(
Request $request,
ConversionEventService $conversionEventService,
EntityManagerInterface $entityManager
): Response {
$user = $this->getUser();
$customer = $entityManager
->getRepository(IntegratedExternalPartnerCustomer::class)
->findOneBy([
'internalId' => $request->get('customerInternalId')
]);
$subcampaignId = 0;
$currentHost = $request->getHost();
if ($currentHost === 'rossmann.www.joboo.de') {
$subcampaignId = 3;
} elseif ($currentHost === 'deutsche-bahn.www.joboo.de') {
$subcampaignId = 4;
}
$conversionEventService->initiateGoalReachedConversionTracking(
$user,
ConversionEventService::CAMPAIGN_ID_RECURRENT_JOBS_SEARCH_FOR_ONE_SPECIFIC_CUSTOMER,
$subcampaignId,
null,
$request,
null,
null,
$customer
);
return $this->redirectToRoute(
'janus_hercules.recurrent_jobs_search.results.for_specific_customer',
[
'customerInternalId' => $request->get('customerInternalId'),
'conversionCampaignId' => ConversionEventService::CAMPAIGN_ID_GOOGLE_ADS
]
);
}
public function resultsForPersomatchLandingPagesByCategoryAndCustomerAction(
Request $request,
ConversionEventService $conversionEventService,
EntityManagerInterface $entityManager
): Response {
$user = $this->getUser();
$subcampaignId = 0;
$customer = $entityManager
->getRepository(IntegratedExternalPartnerCustomer::class)
->findOneBy([
'internalId' => $request->get('customerInternalId')
]);
$conversionEventService->initiateGoalReachedConversionTracking(
$user,
ConversionEventService::CAMPAIGN_ID_PERSOMATCH_LANDINGPAGES_CATEGORY_AND_CUSTOMER,
$subcampaignId,
null,
$request,
null,
null,
$customer
);
return $this->redirectToRoute(
'janus_hercules.recurrent_jobs_search.results.persomatch_landing_pages_by_category_and_customer',
[
'customerInternalId' => $request->get('customerInternalId'),
'categoryTitle' => $request->get('categoryTitle'),
]
);
}
public function resultsForPersomatchLandingPagesByCategoryAndCatalogAction(
Request $request,
ConversionEventService $conversionEventService,
): Response {
$user = $this->getUser();
$subcampaignId = 0;
$customer = null;
$conversionEventService->initiateGoalReachedConversionTracking(
$user,
ConversionEventService::CAMPAIGN_ID_PERSOMATCH_LANDINGPAGES_CATEGORY_AND_CATALOG,
$subcampaignId,
null,
$request,
null,
null,
$customer
);
return $this->redirectToRoute(
'janus_hercules.recurrent_jobs_search.results.persomatch_landing_pages_by_category_and_catalog',
[
'categoryTitle' => $request->get('categoryTitle'),
'catalogName' => $request->get('catalogName'),
]
);
}
/** @throws Exception */
public function resultsForOneSpecificCustomerFromFacebookAction(
Request $request,
ConversionEventService $conversionEventService,
EntityManagerInterface $entityManager
): Response {
$user = $this->getUser();
$customer = $entityManager
->getRepository(IntegratedExternalPartnerCustomer::class)
->findOneBy([
'internalId' => $request->get('customerInternalId')
]);
$isLead = (bool)$request->get('lead') === true;
// For an A/B Test https://trello.com/c/VGZpgnh9/3435-dpdhl-facebook-ad-a-b-testing-2-url
$newCampaign = (bool)$request->get('nc') === true;
$oldCampaign = (bool)$request->get('oc') === true;
$conversionEventService->initiateGoalReachedConversionTracking(
$user,
ConversionEventService::CAMPAIGN_ID_RECURRENT_JOBS_SEARCH_FOR_ONE_SPECIFIC_CUSTOMER,
$newCampaign ? 5 : ($oldCampaign ? 6 : ($isLead ? 2 : 1)),
null,
$request,
null,
null,
$customer
);
return $this->redirectToRoute(
'janus_hercules.recurrent_jobs_search.results.for_specific_customer',
[
'customerInternalId' => $request->get('customerInternalId'),
'conversionCampaignId' => ConversionEventService::CAMPAIGN_ID_FACEBOOK
]
);
}
/** @throws Exception */
public function resultsForOneSpecificCustomerFromInstagramAction(
Request $request,
ConversionEventService $conversionEventService,
EntityManagerInterface $entityManager
): Response {
$user = $this->getUser();
$customer = $entityManager
->getRepository(IntegratedExternalPartnerCustomer::class)
->findOneBy([
'internalId' => $request->get('customerInternalId')
]);
$conversionEventService->initiateGoalReachedConversionTracking(
$user,
ConversionEventService::CAMPAIGN_ID_RECURRENT_JOBS_SEARCH_FOR_ONE_SPECIFIC_CUSTOMER,
7,
null,
$request,
null,
null,
$customer
);
$conversionEventService->initiateGoalReachedConversionTracking(
$user,
ConversionEventService::CAMPAIGN_ID_INSTAGRAM,
0,
null,
$request,
null,
null,
$customer
);
return $this->redirectToRoute(
'janus_hercules.recurrent_jobs_search.results.for_specific_customer',
[
'customerInternalId' => $request->get('customerInternalId'),
'conversionCampaignId' => ConversionEventService::CAMPAIGN_ID_INSTAGRAM
]
);
}
/**
* @throws Exception
*/
public function resultsForOneSpecificCustomerFromPersomatchGoogleAction(
Request $request,
ConversionEventService $conversionEventService,
EntityManagerInterface $entityManager,
ExternalPartnerEventDomainService $externalPartnerEventDomainService
): Response {
$user = $this->getUser();
$customer = $entityManager
->getRepository(IntegratedExternalPartnerCustomer::class)
->findOneBy([
'internalId' => $request->get('customerInternalId')
]);
$conversionEventService->initiateGoalReachedConversionTracking(
$user,
ConversionEventService::CAMPAIGN_ID_RECURRENT_JOBS_SEARCH_FOR_ONE_SPECIFIC_CUSTOMER,
8,
null,
$request,
null,
null,
$customer
);
$externalPartnerEventDomainService->writeEvent(
ExternalPartnerEvent::EVENT_TYPE_USER_HAS_BEEN_FORWARDED_TO_CUSTOMER_SPECIFIC_SEARCH_RESULTS_PAGE_VIA_PERSOMATCH_GOOGLE,
$customer->getExternalPartner(),
null,
null,
null,
null,
null,
null,
null,
$request
);
return $this->redirectToRoute(
'janus_hercules.recurrent_jobs_search.results.for_specific_customer',
[
'customerInternalId' => $request->get('customerInternalId'),
'conversionCampaignId' => ConversionEventService::CAMPAIGN_ID_PERSOMATCH_FEED
]
);
}
}