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

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