<?php declare(strict_types=1);
namespace App\StartPlatz\Bundle\AlphaBundle\Controller;
use App\StartPlatz\Bundle\FeedbackBundle\FeedbackService;
use App\StartPlatz\Bundle\MemberBundle\Entity\Team;
use App\StartPlatz\Bundle\UserBundle\Entity\User;
use App\StartPlatz\Bundle\WebsiteBundle\Utility\Utility;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\StartPlatz\Bundle\AlphaBundle\Entity\Job;
use App\StartPlatz\Bundle\AlphaBundle\Form\JobType;
use App\StartPlatz\Bundle\WebsiteBundle\MenuTranslationService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class JobController extends AbstractController
{
/**
* @var SessionInterface
*/
private SessionInterface $session;
/**
* @var MenuTranslationService
*/
private MenuTranslationService $menuTranslationService;
/**
* @var FeedbackService
*/
private FeedbackService $feedbackService;
public function __construct(SessionInterface $session, MenuTranslationService $menuTranslationService, FeedbackService $feedbackService)
{
$this->session = $session;
$this->menuTranslationService = $menuTranslationService;
$this->feedbackService = $feedbackService;
}
/**
*/
public function showJobsOffersAction($term)
{
$em = $this->getDoctrine()->getManager();
$term = ltrim($term, '#');
$jobs = $em->getRepository(Job::class)->findOpenJobsByTerm($term);
return $this->render('@StartPlatzAlphaBundle/Job/show_open_jobs.html.twig', [
'jobs' => $jobs,
'term' => $term,
'templateVars' => [],
]);
}
/**
* @Route("x/jobs/home", name="x_jobs_home")
* @Route("jobs/", name="extern_jobs_home")
* @Route("en/jobs/", name="extern_jobs_home_english")
*/
public function indexAction(Request $request)
{
$em=$this->getDoctrine()->getManager();
if ($user = $this->getUser()) {
$em->getRepository(User::class)->writeActivity($user);
}
$templateVars = $em->getRepository(Job::class)->getTemplateVars($request);
$jobs = $em->getRepository(Job::class)->findAllCurrentlyOpen();
$total = $em->getRepository(Job::class)->countAll();
$companyName= array_unique(array_map(fn ($item) => $item->getCompanyName(), $jobs));
$companyName = array_filter($companyName);
asort($companyName);
$jobTypes = array_unique(array_map(fn ($item) => $item->getJobType(), $jobs));
$jobTypes = array_filter($jobTypes);
$companyTypes = array_unique(array_map(fn ($item) => $item->getCompanyType(), $jobs));
$companyTypes = array_filter($companyTypes);
$location = array_unique(array_map(fn ($item) => $item->getLocation(), $jobs));
$location1 = array_unique(array_map(fn ($item) => $item->getLocationOptional(), $jobs));
$locations = array_merge($location, $location1);
$locations = array_filter($locations);
if ($request->get('companyName')) {
$filter = $request->get('companyName');
$companyName = array_filter($jobs, function ($item) use ($filter) {
$companyName = $item->getCompanyName();
asort($companyName);
if (!$companyName) {
return false;
}
return strtolower($filter) === strtolower($companyName);
});
$total = count($jobs);
}
if ($request->get('jobType')) {
$filter = $request->get('jobType');
$jobs = array_filter($jobs, function ($item) use ($filter) {
$JobType = $item->getJobType();
if (!$JobType) {
return false;
}
return strtolower($filter) === strtolower($JobType);
});
$total = count($jobs);
}
if ($request->get('companyType')) {
$filter = $request->get('companyType');
$jobs = array_filter($jobs, function ($item) use ($filter) {
$companyTypes = $item->getCompanyType();
if (!$companyTypes) {
return false;
}
return strtolower($filter) === strtolower($companyTypes);
});
$total = count($jobs);
}
if ($request->get('location')) {
$filter = $request->get('location');
$jobs = array_filter($jobs, function ($item) use ($filter) {
if ($item->getLocation()) {
$location = $item->getLocation();
} else {
$location = $item->getLocationOptional();
}
if (!$location) {
return false;
}
return strtolower($filter) === strtolower($location);
});
$total = count($jobs);
}
$location = array_filter($location);
foreach ($jobs as $job) {
if($applyTarget = $job->getApplyTarget()) {
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)) {
$job->applyTargetType = "mail";
} else {
$job->applyTargetType = "url";
}
} else {
$job->applyTargetType = null;
}
}
$route = $request->get('_route');
if ($route == 'x_jobs_home') {
if (!$this->getUser()) {
return $this->redirect($this->generateUrl('extern_jobs_home'));
}
$view = '@StartPlatzAlphaBundle/Job/Job_AB__index.twig';
} else {
$view = '@StartPlatzAlphaBundle/Job/index.extern.html.twig';
}
return $this->render($view, [
'templateVars' => $templateVars,
'companyName' => $companyName,
'jobTypes' => $jobTypes,
'locations' => $locations,
'companyTypes' => $companyTypes,
'jobs' => $jobs,
'total' => $total,
'selectedJobType' => $request->get('jobType'),
'selectedCompanyType' => $request->get('companyType'),
'selectedLocation' => $request->get('location'),
'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
'redirectUrl' => base64_encode(json_encode(['path' => 'x_jobs_home', 'parameters' => $templateVars ])),
]);
}
/**
* @Route("/website/jobs/home", name="website_jobs_home")
*/
public function indexWebsiteAction(Request $request)
{
$em=$this->getDoctrine()->getManager();
if ($user = $this->getUser()) {
$em->getRepository(User::class)->writeActivity($user);
}
$templateVars = $em->getRepository(Job::class)->getTemplateVars($request);
$jobs = $em->getRepository(Job::class)->findAll();
$total = $em->getRepository(Job::class)->countAll();
$companyName= array_unique(array_map(fn ($item) => $item->getCompanyName(), $jobs));
$companyName = array_filter($companyName);
asort($companyName);
$jobTypes = array_unique(array_map(fn ($item) => $item->getJobType(), $jobs));
$jobTypes = array_filter($jobTypes);
$companyTypes = array_unique(array_map(fn ($item) => $item->getCompanyType(), $jobs));
$companyTypes = array_filter($companyTypes);
$location = array_unique(array_map(fn ($item) => $item->getLocation(), $jobs));
$location1 = array_unique(array_map(fn ($item) => $item->getLocationOptional(), $jobs));
$location = array_merge($location, $location1);
if ($request->get('companyName')) {
$filter = $request->get('companyName');
$companyName = array_filter($jobs, function ($item) use ($filter) {
$companyName = $item->getCompanyName();
asort($companyName);
if (!$companyName) {
return false;
}
return strtolower($filter) === strtolower($companyName);
});
$total = count($jobs);
}
if ($request->get('jobType')) {
$filter = $request->get('jobType');
$jobs = array_filter($jobs, function ($item) use ($filter) {
$JobType = $item->getJobType();
if (!$JobType) {
return false;
}
return strtolower($filter) === strtolower($JobType);
});
$total = count($jobs);
}
if ($request->get('companyType')) {
$filter = $request->get('companyType');
$jobs = array_filter($jobs, function ($item) use ($filter) {
$companyTypes = $item->getCompanyType();
if (!$companyTypes) {
return false;
}
return strtolower($filter) === strtolower($companyTypes);
});
$total = count($jobs);
}
if ($request->get('location')) {
$filter = $request->get('location');
$jobs = array_filter($jobs, function ($item) use ($filter) {
$location = $item->getLocation();
$location =$item->getLocationOptional();
if (!$location) {
return false;
}
return strtolower($filter) === strtolower($location);
});
$total = count($jobs);
}
$location = array_filter($location);
$lang = 'DE';
if ($targetPath = $request->server->get('REDIRECT_URL')) {
$lang = $this->menuTranslationService->getLang($targetPath);
}
$menuLinksDe2En = $this->menuTranslationService->getMenuLinksSwitcher();
return $this->render('@StartPlatzAlphaBundle/Job/index.website.html.twig', [
'templateVars' => $templateVars,
'companyName' => $companyName,
'jobTypes' => $jobTypes,
'location' =>$location,
'companyTypes' => $companyTypes,
'jobs' => $jobs,
'total' => $total,
'targetPath' => $targetPath,
'menuLinksDe2En' => $menuLinksDe2En,
'menuLinksEn2De' => array_flip($menuLinksDe2En) ,
'menuPhrases' => $this->menuTranslationService->getMenuPhrases($lang),
'menuLinks' => $this->menuTranslationService->getMenuLinks($lang),
'footerPhrases' => $this->menuTranslationService->getFooterPhrases($lang),
'footerLinks' => $this->menuTranslationService->getFooterLinks($lang),
'lang' => $lang,
'selectedJobType' => $request->get('jobType'),
'selectedCompanyType' => $request->get('companyType'),
'selectedLocation' => $request->get('location'),
'redirectUrl' => base64_encode(json_encode(['path' => 'x_jobs_home', 'parameters' => $templateVars ])),
]);
}
/**
* @Route("/allmeda/jobs/get/jobs/search", name="allmeda_api_search_jobs_standard")
* @Security("is_granted('ROLE_USER')")
*/
public function apiJobsSearchAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$location = '';
if ($location = $request->query->get('location')) {
$location = (!in_array($location, ['CGN', 'DUS', 'SP']) ? 'all' : $location);
}
$jobs = $em->getRepository(Job::class)->find4ExternalAccess();
$response = new Response();
$response->setContent(json_encode($jobs));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/allmeda/jobs/home", name="allmeda_jobs_home")
* @Security("is_granted('ROLE_ADMIN')")
*/
public function indexAllmedaAction(Request $request)
{
$em=$this->getDoctrine()->getManager();
$user = $this->getUser();
$em->getRepository(User::class)->writeActivity($user);
$templateVars = $em->getRepository(Job::class)->getTemplateVars($request);
$orderBy = ($templateVars['dimensions']) ? $templateVars['dimensions'] : ['lastModified' => 'DESC'];
$criteria = $templateVars['criteria'];
$jobs = $em->getRepository(Job::class)->findBy($criteria, $orderBy);
$total = $em->getRepository(Job::class)->countByCriteria($criteria);
foreach ($jobs as $job) {
if($applyTarget = $job->getApplyTarget()) {
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)) {
$job->applyTargetType = "mail";
} else {
$job->applyTargetType = "url";
}
} else {
$job->applyTargetType = null;
}
}
return $this->render('@StartPlatzAlphaBundle/Job/index.allmeda.html.twig', [
'templateVars' => $templateVars,
'jobs' => $jobs,
'total' => $total,
'redirectUrl' => base64_encode(json_encode(['path' => 'allmeda_jobs_home', 'parameters' => $templateVars ])),
]);
}
/**
* @Route("/allmeda/jobs/filter/single", name="allmeda_jobs_filter_single")
* @Security("is_granted('ROLE_ADMIN')")
*/
public function selectFilterSingleAjaxAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$redirect = Utility::getRedirectTarget($request);
$templateVars = $em->getRepository(Job::class)->getTemplateVars($request);
$criteria = $templateVars['criteria'];
$user = $this->getUser();
$group = $request->get('filter');
$aggregates = $em->getRepository(Job::class)->getAggregateByGroup($group, []);
$group2 = "";
$aggregates2 = [];
$targetPath = "allmeda_jobs_home";
return $this->render('@StartPlatzStartupBundle/Admin/listAggregates.ajax.html.twig', [
'title' => "Set Filter on {$group}",
'aggregates' => $aggregates,
'btnClass' => "btn-outline-info",
'group' => $group,
'group2' => $group2,
'aggregates2' => $aggregates2,
'targetPath' => $targetPath,
'templateVars' => $templateVars,
'redirect' => $redirect,
'redirectUrl' => $request->get('redirect'),
]);
}
/**
* @Route("/allmeda/jobs/show/raw/{id}", name="allmeda_jobs_show_raw_ajax")
* @Security("is_granted('ROLE_ADMIN')")
*/
public function showRawAjaxAction(Request $request, $id)
{
$redirect = Utility::getRedirectTarget($request);
$em = $this->getDoctrine()->getManager();
/** @var Team $job */
if (!$job = $em->getRepository(Job::class)->findOneBy(['id' => $id])) {
$this->session->getFlashBag()->add('notice', 'ERROR Job not found');
return $this->redirect($this->generateUrl('allmeda_home'));
}
return $this->render('@StartPlatzAlpha/Job/showRawAjax.html.twig', [
'job' => $job,
'methods' => $this->feedbackService->getEntityMethodsArray($job, []),
]);
}
/**
* @Route("/allmeda/jobs/edit/{id}", name="allmeda_jobs_edit")
* @Security("is_granted('ROLE_ADMIN')")
*/
public function editAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
$em->getRepository(User::class)->writeActivity($user);
$templateVars = $em->getRepository(Job::class)->getTemplateVars($request);
$redirect = Utility::getRedirectTarget($request);
if ($id == 'create') {
$job = new Job();
$now = new \DateTime();
$job->setCreatedAt($now);
} else {
if (!$job = $em->getRepository(Job::class)->findOneBy(['id' => $id])) {
$this->session->getFlashBag()->add('notice', 'ERROR: no job found');
return $this->redirect($this->generateUrl($redirect->path, (array) $redirect->parameters));
}
}
$fields = Utility::getEntityFieldsArray($job, []);
$storedData = Utility::fillDataByObject($job, $fields);
$form = $this->createForm(JobType::class, $job, [
'action' => $this->generateUrl('allmeda_jobs_edit', ['id' => $id, 'redirect' => $request->get('redirect')] + $templateVars),
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$now = new \DateTime();
$job = $em->getRepository(Job::class)->setEndDate($job);
$tags = explode(',', str_replace(' ', '', (string) $job->getTags()));
$job->setTags(json_encode(array_values($tags)));
$updatedData = Utility::fillDataByObject($job, $fields);
$differences = array_diff_assoc($updatedData, $storedData);
$job->setLastModified($now);
$job->setLastChangeUser($this->getUser()->getEmail());
$logText = "";
if ($differences) {
foreach ($differences as $field => $value) {
$logText .= "{$field}: $value";
}
$job->setHistory('==== '. date("Y-m-d") . ' by ' . $job->getLastChangeUser() .' ==='. PHP_EOL . $logText . PHP_EOL . $job->getHistory());
}
$em->persist($job);
$em->flush();
$this->session->getFlashBag()->add('notice', 'SUCCESS Daten wurden gespeichert');
return $this->redirect($this->generateUrl($redirect->path, (array) $redirect->parameters));
} else {
$errorString = $form->getErrors(true, false);
// @todo: $errorString ist ein Array -> StringCast in der nächsten Zeile anders behandeln
if (str_contains((string) $errorString, 'ERROR:')) {
$this->session->getFlashBag()->add('notice', 'ERROR - Data have not been saved' . $errorString);
return $this->redirect($this->generateUrl($redirect->path, (array) $redirect->parameters));
}
}
return $this->render('@StartPlatzAlphaBundle/Job/edit.html.twig', [
'job' => $job,
'form' => $form->createView(),
'templateVars' => $templateVars,
'redirectUrl' => $this->redirect($this->generateUrl($redirect->path, (array) $redirect->parameters)),
]);
}
/**
* @Route("/allmeda/jobs/delete/{id}", name="allmeda_jobs_delete")
* @Security("is_granted('ROLE_ADMIN')")
*/
public function deleteAction($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
$em->getRepository(User::class)->writeActivity($user);
$templateVars = $em->getRepository(Job::class)->getTemplateVars($request);
$redirect = Utility::getRedirectTarget($request);
if (!$job = $em->getRepository(Job::class)->findOneBy(['id' => $id])) {
$this->session->getFlashBag()->add('notice', 'ERROR: no Job found');
return $this->redirect($this->generateUrl($redirect->path, (array) $redirect->parameters));
}
$em->remove($job);
$em->flush();
$this->session->getFlashBag()->add('notice', 'SUCCESSJob has been deleted');
return $this->redirect($this->generateUrl($redirect->path, (array) $redirect->parameters));
}
}