src/StartPlatz/Bundle/AlphaBundle/Controller/JobController.php line 30

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\StartPlatz\Bundle\AlphaBundle\Controller;
  3. use App\StartPlatz\Bundle\FeedbackBundle\FeedbackService;
  4. use App\StartPlatz\Bundle\UserBundle\Entity\User;
  5. use App\StartPlatz\Bundle\WebsiteBundle\Utility\Utility;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  9. use App\StartPlatz\Bundle\AlphaBundle\Entity\Job;
  10. use App\StartPlatz\Bundle\AlphaBundle\Form\JobType;
  11. use App\StartPlatz\Bundle\WebsiteBundle\MenuTranslationService;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\HttpFoundation\Request;
  15. class JobController extends AbstractController
  16. {
  17.     public function __construct(
  18.         private readonly EntityManagerInterface $entityManager,
  19.         private readonly MenuTranslationService $menuTranslationService,
  20.         private readonly FeedbackService $feedbackService)
  21.     {
  22.     }
  23.     #[Route('x/jobs/home'name'x_jobs_home')]
  24.     #[Route('jobs/'name'extern_jobs_home')]
  25.     #[Route('en/jobs/'name'extern_jobs_home_english')]
  26.     public function indexAction(Request $request)
  27.     {
  28.                 if ($user $this->getUser()) {
  29.             $this->entityManager->getRepository(User::class)->writeActivity($user);
  30.         }
  31.         $templateVars $this->entityManager->getRepository(Job::class)->getTemplateVars($request);
  32.         $jobs $this->entityManager->getRepository(Job::class)->findAllCurrentlyOpen();
  33.         $total $this->entityManager->getRepository(Job::class)->countAll();
  34.         $companyNamearray_unique(array_map(fn ($item) => $item->getCompanyName(), $jobs));
  35.         $companyName array_filter($companyName);
  36.         asort($companyName);
  37.         $jobTypes array_unique(array_map(fn ($item) => $item->getJobType(), $jobs));
  38.         $jobTypes array_filter($jobTypes);
  39.         $companyTypes array_unique(array_map(fn ($item) => $item->getCompanyType(), $jobs));
  40.         $companyTypes array_filter($companyTypes);
  41.         $location array_unique(array_map(fn ($item) => $item->getLocation(), $jobs));
  42.         $location1 array_unique(array_map(fn ($item) => $item->getLocationOptional(), $jobs));
  43.         $locations array_merge($location$location1);
  44.         $locations array_filter($locations);
  45.         if ($request->get('companyName')) {
  46.             $filter =  $request->get('companyName');
  47.             $companyName array_filter($jobs, function ($item) use ($filter) {
  48.                 $companyName $item->getCompanyName();
  49.                 asort($companyName);
  50.                 if (!$companyName) {
  51.                     return false;
  52.                 }
  53.                 return strtolower($filter) === strtolower($companyName);
  54.             });
  55.             $total count($jobs);
  56.         }
  57.         if ($request->get('jobType')) {
  58.             $filter =  $request->get('jobType');
  59.             $jobs array_filter($jobs, function ($item) use ($filter) {
  60.                 $JobType $item->getJobType();
  61.                 if (!$JobType) {
  62.                     return false;
  63.                 }
  64.                 return strtolower($filter) === strtolower($JobType);
  65.             });
  66.             $total count($jobs);
  67.         }
  68.         if ($request->get('companyType')) {
  69.             $filter =  $request->get('companyType');
  70.             $jobs array_filter($jobs, function ($item) use ($filter) {
  71.                 $companyTypes $item->getCompanyType();
  72.                 if (!$companyTypes) {
  73.                     return false;
  74.                 }
  75.                 return strtolower($filter) === strtolower($companyTypes);
  76.             });
  77.             $total count($jobs);
  78.         }
  79.         if ($request->get('location')) {
  80.             $filter =  $request->get('location');
  81.             $jobs array_filter($jobs, function ($item) use ($filter) {
  82.                 if ($item->getLocation()) {
  83.                     $location $item->getLocation();
  84.                 } else {
  85.                     $location $item->getLocationOptional();
  86.                 }
  87.                 if (!$location) {
  88.                     return false;
  89.                 }
  90.                 return strtolower($filter) === strtolower($location);
  91.             });
  92.             $total count($jobs);
  93.         }
  94.         $location array_filter($location);
  95.         foreach ($jobs as $job) {
  96.             if($applyTarget $job->getApplyTarget()) {
  97.                 if (preg_match('/[a-z0-9!#$%&*\\.+?^_-]+(?:\\.[a-z0-9!#$%&*+?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/i'$applyTarget)) {
  98.                     $job->applyTargetType "mail";
  99.                 } else {
  100.                     $job->applyTargetType "url";
  101.                 }
  102.             } else {
  103.                 $job->applyTargetType null;
  104.             }
  105.         }
  106.         $route $request->get('_route');
  107.         if ($route == 'x_jobs_home') {
  108.             if (!$this->getUser()) {
  109.                 return $this->redirect($this->generateUrl('extern_jobs_home'));
  110.             }
  111.             $view '@StartPlatzAlphaBundle/Job/Job_AB__index.twig';
  112.         } else {
  113.             $view '@StartPlatzAlphaBundle/Job/index.extern.html.twig';
  114.         }
  115.         return $this->render($view, [
  116.             'templateVars'        => $templateVars,
  117.             'companyName'         => $companyName,
  118.             'jobTypes'            => $jobTypes,
  119.             'locations'           => $locations,
  120.             'companyTypes'        => $companyTypes,
  121.             'jobs'                => $jobs,
  122.             'total'               => $total,
  123.             'selectedJobType'     => $request->get('jobType'),
  124.             'selectedCompanyType' => $request->get('companyType'),
  125.             'selectedLocation'    => $request->get('location'),
  126.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  127.             'redirectUrl'         => base64_encode(json_encode(['path' => 'x_jobs_home''parameters' => $templateVars ])),
  128.         ]);
  129.     }
  130.     #[Route('/website/jobs/home'name'website_jobs_home')]
  131.     public function indexWebsiteAction(Request $request)
  132.     {
  133.                 if ($user $this->getUser()) {
  134.             $this->entityManager->getRepository(User::class)->writeActivity($user);
  135.         }
  136.         $templateVars $this->entityManager->getRepository(Job::class)->getTemplateVars($request);
  137.         $jobs $this->entityManager->getRepository(Job::class)->findAll();
  138.         $total $this->entityManager->getRepository(Job::class)->countAll();
  139.         $companyNamearray_unique(array_map(fn ($item) => $item->getCompanyName(), $jobs));
  140.         $companyName array_filter($companyName);
  141.         asort($companyName);
  142.         $jobTypes array_unique(array_map(fn ($item) => $item->getJobType(), $jobs));
  143.         $jobTypes array_filter($jobTypes);
  144.         $companyTypes array_unique(array_map(fn ($item) => $item->getCompanyType(), $jobs));
  145.         $companyTypes array_filter($companyTypes);
  146.         $location array_unique(array_map(fn ($item) => $item->getLocation(), $jobs));
  147.         $location1 array_unique(array_map(fn ($item) => $item->getLocationOptional(), $jobs));
  148.         $location array_merge($location$location1);
  149.         if ($request->get('companyName')) {
  150.             $filter =  $request->get('companyName');
  151.             $companyName array_filter($jobs, function ($item) use ($filter) {
  152.                 $companyName $item->getCompanyName();
  153.                 asort($companyName);
  154.                 if (!$companyName) {
  155.                     return false;
  156.                 }
  157.                 return strtolower($filter) === strtolower($companyName);
  158.             });
  159.             $total count($jobs);
  160.         }
  161.         if ($request->get('jobType')) {
  162.             $filter =  $request->get('jobType');
  163.             $jobs array_filter($jobs, function ($item) use ($filter) {
  164.                 $JobType $item->getJobType();
  165.                 if (!$JobType) {
  166.                     return false;
  167.                 }
  168.                 return strtolower($filter) === strtolower($JobType);
  169.             });
  170.             $total count($jobs);
  171.         }
  172.         if ($request->get('companyType')) {
  173.             $filter =  $request->get('companyType');
  174.             $jobs array_filter($jobs, function ($item) use ($filter) {
  175.                 $companyTypes $item->getCompanyType();
  176.                 if (!$companyTypes) {
  177.                     return false;
  178.                 }
  179.                 return strtolower($filter) === strtolower($companyTypes);
  180.             });
  181.             $total count($jobs);
  182.         }
  183.         if ($request->get('location')) {
  184.             $filter =  $request->get('location');
  185.             $jobs array_filter($jobs, function ($item) use ($filter) {
  186.                 $location $item->getLocation();
  187.                 $location =$item->getLocationOptional();
  188.                 if (!$location) {
  189.                     return false;
  190.                 }
  191.                 return strtolower($filter) === strtolower($location);
  192.             });
  193.             $total count($jobs);
  194.         }
  195.         $location array_filter($location);
  196.         $lang 'DE';
  197.         if ($targetPath $request->server->get('REDIRECT_URL')) {
  198.             $lang $this->menuTranslationService->getLang($targetPath);
  199.         }
  200.         $menuLinksDe2En $this->menuTranslationService->getMenuLinksSwitcher();
  201.         return $this->render('@StartPlatzAlphaBundle/Job/index.website.html.twig', [
  202.             'templateVars' => $templateVars,
  203.             'companyName' => $companyName,
  204.             'jobTypes' => $jobTypes,
  205.             'location' =>$location,
  206.             'companyTypes' => $companyTypes,
  207.             'jobs'        => $jobs,
  208.             'total'        => $total,
  209.             'targetPath'    => $targetPath,
  210.             'menuLinksDe2En' => $menuLinksDe2En,
  211.             'menuLinksEn2De' => array_flip($menuLinksDe2En) ,
  212.             'menuPhrases'    => $this->menuTranslationService->getMenuPhrases($lang),
  213.             'menuLinks'      => $this->menuTranslationService->getMenuLinks($lang),
  214.             'footerPhrases'  => $this->menuTranslationService->getFooterPhrases($lang),
  215.             'footerLinks'    => $this->menuTranslationService->getFooterLinks($lang),
  216.             'lang'           => $lang,
  217.             'selectedJobType'     => $request->get('jobType'),
  218.             'selectedCompanyType'     => $request->get('companyType'),
  219.             'selectedLocation'     => $request->get('location'),
  220.             'redirectUrl'  => base64_encode(json_encode(['path' => 'x_jobs_home''parameters' => $templateVars ])),
  221.         ]);
  222.     }
  223.     #[Route('/allmeda/jobs/get/jobs/search'name'allmeda_api_search_jobs_standard')]
  224.     /**
  225.      * @IsGranted("ROLE_USER")
  226.      */
  227.     public function apiJobsSearchAction(Request $request)
  228.     {
  229.                 $location '';
  230.         if ($location $request->query->get('location')) {
  231.             $location = (!in_array($location, ['CGN''DUS''SP']) ? 'all' $location);
  232.         }
  233.         $jobs $this->entityManager->getRepository(Job::class)->find4ExternalAccess();
  234.         $response = new Response();
  235.         $response->setContent(json_encode($jobs));
  236.         $response->headers->set('Content-Type''application/json');
  237.         return $response;
  238.     }
  239.     #[Route('/allmeda/jobs/home'name'allmeda_jobs_home')]
  240.     /**
  241.      * @IsGranted("ROLE_ADMIN")
  242.      */
  243.     public function indexAllmedaAction(Request $request)
  244.     {
  245.                 $user $this->getUser();
  246.         $this->entityManager->getRepository(User::class)->writeActivity($user);
  247.         $templateVars $this->entityManager->getRepository(Job::class)->getTemplateVars($request);
  248.         $orderBy = ($templateVars['dimensions']) ? $templateVars['dimensions'] : ['lastModified' => 'DESC'];
  249.         $criteria   $templateVars['criteria'];
  250.         $jobs  $this->entityManager->getRepository(Job::class)->findBy($criteria$orderBy);
  251.         $total $this->entityManager->getRepository(Job::class)->countByCriteria($criteria);
  252.         foreach ($jobs as $job) {
  253.             if($applyTarget $job->getApplyTarget()) {
  254.                 if (preg_match('/[a-z0-9!#$%&*\\.+?^_-]+(?:\\.[a-z0-9!#$%&*+?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/i'$applyTarget)) {
  255.                     $job->applyTargetType "mail";
  256.                 } else {
  257.                     $job->applyTargetType "url";
  258.                 }
  259.             } else {
  260.                 $job->applyTargetType null;
  261.             }
  262.         }
  263.         return $this->render('@StartPlatzAlphaBundle/Job/index.allmeda.v3.html.twig', [
  264.             'templateVars' => $templateVars,
  265.             'jobs'         => $jobs,
  266.             'total'        => $total,
  267.             'redirectUrl'  => base64_encode(json_encode(['path' => 'allmeda_jobs_home''parameters' => $templateVars ])),
  268.         ]);
  269.     }
  270.     #[Route('/allmeda/jobs/filter/single'name'allmeda_jobs_filter_single')]
  271.     /**
  272.      * @IsGranted("ROLE_ADMIN")
  273.      */
  274.     public function selectFilterSingleAjaxAction(Request $request)
  275.     {
  276.                 $redirect Utility::getRedirectTarget($request);
  277.         $templateVars $this->entityManager->getRepository(Job::class)->getTemplateVars($request);
  278.         $criteria $templateVars['criteria'];
  279.         $user $this->getUser();
  280.         $group $request->get('filter');
  281.         $aggregates $this->entityManager->getRepository(Job::class)->getAggregateByGroup($group, []);
  282.         $group2 "";
  283.         $aggregates2 = [];
  284.         $targetPath "allmeda_jobs_home";
  285.         return $this->render('@StartPlatzStartupBundle/Admin/listAggregates.ajax.html.twig', [
  286.             'title'        => "Set Filter on {$group}",
  287.             'aggregates'   => $aggregates,
  288.             'btnClass'     => "btn-outline-info",
  289.             'group'        => $group,
  290.             'group2'       => $group2,
  291.             'aggregates2'  => $aggregates2,
  292.             'targetPath'   => $targetPath,
  293.             'templateVars' => $templateVars,
  294.             'redirect'     => $redirect,
  295.             'redirectUrl'  => $request->get('redirect'),
  296.         ]);
  297.     }
  298.     #[Route('/allmeda/jobs/show/raw/{id}'name'allmeda_jobs_show_raw_ajax')]
  299.     /**
  300.      * @IsGranted("ROLE_ADMIN")
  301.      */
  302.     public function showRawAjaxAction(Request $request$id)
  303.     {
  304.         $redirect Utility::getRedirectTarget($request);
  305.                 /** @var Job $job */
  306.         if (!$job $this->entityManager->getRepository(Job::class)->findOneBy(['id' => $id])) {
  307.             $request->getSession()->getFlashBag()->add('notice''ERROR Job not found');
  308.             return $this->redirect($this->generateUrl('allmeda_home'));
  309.         }
  310.         return $this->render('@StartPlatzAlpha/Job/showRawAjax.html.twig', [
  311.             'job' => $job,
  312.             'methods' => $this->feedbackService->getEntityMethodsArray($job, []),
  313.         ]);
  314.     }
  315.     #[Route('/allmeda/jobs/filter/single/v3'name'allmeda_jobs_filter_single_v3')]
  316.     /**
  317.      * @IsGranted("ROLE_ADMIN")
  318.      */
  319.     public function selectFilterSingleV3Action(Request $request)
  320.     {
  321.         $templateVars $this->entityManager->getRepository(Job::class)->getTemplateVars($request);
  322.         $group $request->get('filter');
  323.         $aggregates $this->entityManager->getRepository(Job::class)->getAggregateByGroup($group, []);
  324.         return $this->render('@StartPlatzStartupBundle/Admin/listAggregates.ajax.v3.html.twig', [
  325.             'title'        => "Set Filter on {$group}",
  326.             'aggregates'   => $aggregates,
  327.             'group'        => $group,
  328.             'targetPath'   => 'allmeda_jobs_home',
  329.             'templateVars' => $templateVars,
  330.         ]);
  331.     }
  332.     #[Route('/allmeda/jobs/show/raw/{id}/v3'name'allmeda_jobs_show_raw_ajax_v3')]
  333.     /**
  334.      * @IsGranted("ROLE_ADMIN")
  335.      */
  336.     public function showRawAjaxV3Action(Request $request$id)
  337.     {
  338.         if (!$job $this->entityManager->getRepository(Job::class)->findOneBy(['id' => $id])) {
  339.             return new Response('Job not found'404);
  340.         }
  341.         return $this->render('@StartPlatzAlpha/Job/showRawAjax.v3.html.twig', [
  342.             'job'     => $job,
  343.             'methods' => $this->feedbackService->getEntityMethodsArray($job, []),
  344.         ]);
  345.     }
  346.     #[Route('/allmeda/jobs/edit/{id}'name'allmeda_jobs_edit')]
  347.     /**
  348.      * @IsGranted("ROLE_ADMIN")
  349.      */
  350.     public function editAction(Request $request$id)
  351.     {
  352.                 $user $this->getUser();
  353.         $this->entityManager->getRepository(User::class)->writeActivity($user);
  354.         $templateVars $this->entityManager->getRepository(Job::class)->getTemplateVars($request);
  355.         $redirect Utility::getRedirectTarget($request);
  356.         if ($id == 'create') {
  357.             $job = new Job();
  358.             $now = new \DateTime();
  359.             $job->setCreatedAt($now);
  360.         } else {
  361.             if (!$job $this->entityManager->getRepository(Job::class)->findOneBy(['id' => $id])) {
  362.                 $request->getSession()->getFlashBag()->add('notice''ERROR: no job found');
  363.                 return $this->redirect($this->generateUrl($redirect->path, (array) $redirect->parameters));
  364.             }
  365.         }
  366.         $fields     Utility::getEntityFieldsArray($job, []);
  367.         $storedData Utility::fillDataByObject($job$fields);
  368.         $form $this->createForm(JobType::class, $job, [
  369.             'action' => $this->generateUrl('allmeda_jobs_edit', ['id' => $id'redirect' => $request->get('redirect')] + $templateVars),
  370.         ]);
  371.         $form->handleRequest($request);
  372.         if ($form->isSubmitted() && $form->isValid()) {
  373.             $now = new \DateTime();
  374.             $job $this->entityManager->getRepository(Job::class)->setEndDate($job);
  375.             $tags explode(','str_replace(' ''', (string) $job->getTags()));
  376.             $job->setTags(json_encode(array_values($tags)));
  377.             $updatedData Utility::fillDataByObject($job$fields);
  378.             $differences array_diff_assoc($updatedData$storedData);
  379.             $job->setLastModified($now);
  380.             $job->setLastChangeUser($this->getUser()->getEmail());
  381.             $logText "";
  382.             if ($differences) {
  383.                 foreach ($differences as $field => $value) {
  384.                     $logText .= "{$field}$value";
  385.                 }
  386.                 $job->setHistory('==== 'date("Y-m-d") . ' by ' $job->getLastChangeUser() .' ==='PHP_EOL $logText   PHP_EOL $job->getHistory());
  387.             }
  388.             $this->entityManager->persist($job);
  389.             $this->entityManager->flush();
  390.             $request->getSession()->getFlashBag()->add('notice''SUCCESS Daten wurden gespeichert');
  391.             return $this->redirect($this->generateUrl($redirect->path, (array) $redirect->parameters));
  392.         } else {
  393.             $errorString $form->getErrors(truefalse);
  394.             // @todo: $errorString ist ein Array -> StringCast in der nächsten Zeile anders behandeln
  395.             if (str_contains((string) $errorString'ERROR:')) {
  396.                 $request->getSession()->getFlashBag()->add('notice''ERROR - Data have not been saved' $errorString);
  397.                 return $this->redirect($this->generateUrl($redirect->path, (array) $redirect->parameters));
  398.             }
  399.         }
  400.         return $this->render('@StartPlatzAlphaBundle/Job/edit.v3.html.twig', [
  401.             'job'         => $job,
  402.             'form'         => $form->createView(),
  403.             'templateVars' => $templateVars,
  404.             'redirectUrl'  => $this->redirect($this->generateUrl($redirect->path, (array) $redirect->parameters)),
  405.         ]);
  406.     }
  407.     #[Route('/allmeda/jobs/delete/{id}'name'allmeda_jobs_delete')]
  408.     /**
  409.      * @IsGranted("ROLE_ADMIN")
  410.      */
  411.     public function deleteAction($idRequest $request)
  412.     {
  413.                 $user $this->getUser();
  414.         $this->entityManager->getRepository(User::class)->writeActivity($user);
  415.         $templateVars $this->entityManager->getRepository(Job::class)->getTemplateVars($request);
  416.         $redirect Utility::getRedirectTarget($request);
  417.         if (!$job $this->entityManager->getRepository(Job::class)->findOneBy(['id' => $id])) {
  418.             $request->getSession()->getFlashBag()->add('notice''ERROR: no Job found');
  419.             return $this->redirect($this->generateUrl($redirect->path, (array) $redirect->parameters));
  420.         }
  421.         $this->entityManager->remove($job);
  422.         $this->entityManager->flush();
  423.         $request->getSession()->getFlashBag()->add('notice''SUCCESSJob has been deleted');
  424.         return $this->redirect($this->generateUrl($redirect->path, (array) $redirect->parameters));
  425.     }
  426. }