<?php
/**
* Created by Elements.at New Media Solutions GmbH
*
*/
namespace App\Controller;
use App\Twig\ConfigHelper;
use App\Twig\SimpleHelper;
use Carbon\Carbon;
use Elements\Bundle\CmsToolsBundle\Tool\Helper\MailHelper;
use Elements\Bundle\HashCashBundle\Service\HashCashService;
use Knp\Component\Pager\PaginatorInterface;
use Pimcore\Log\ApplicationLogger;
use Pimcore\Mail;
use Pimcore\Model\DataObject\Departments;
use Pimcore\Model\DataObject\Team;
use Pimcore\Model\DataObject\Job;
use Pimcore\Model\DataObject\Location;
use Pimcore\Model\DataObject\SiteConfig;
use Pimcore\Model\Document\Email;
use Pimcore\Model\Document\Page;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\Translation\TranslatorInterface;
class JobsController extends AbstractController
{
protected $maxUploadLimitContest = 10;
public function __construct(private HashCashService $hashCashService, private TranslatorInterface $translator, private ConfigHelper $configHelper, private SimpleHelper $simpleHelper, private ApplicationLogger $applicationLogger, private PaginatorInterface $paginator)
{
}
/**
*
* @param Request $request
*
* @return Response
*/
public function overviewAction(Request $request, PaginatorInterface $paginator): Response
{
$siteConfig = $this->configHelper->getSiteConfig();
$resort = $this->document->getProperty('resort');
$today = new Carbon();
$jobs = new Job\Listing();
$jobs->addConditionParam("name != '' AND name IS NOT NULL");
$jobs->addConditionParam('config LIKE :config', ['config' => '%' . $siteConfig->getId() . '%']);
$jobs->addConditionParam('showFrom <= "' . $today->format('Y-m-d') . '" OR showFrom IS NULL');
$jobs->addConditionParam('showTo >= "' . $today->format('Y-m-d') .'" OR showTo IS NULL');
$locations = [];
$departments = [];
foreach ($jobs->load() as $job) {
if ($job->getLocation() instanceof Location) {
$locations[$job->getLocation()->getId()]['location'] = $job->getLocation();
$locations[$job->getLocation()->getId()]['disabled'] = true;
}
if ($job->getDepartment() instanceof Departments) {
$departments[$job->getDepartment()->getId()]['department'] = $job->getDepartment();
$departments[$job->getDepartment()->getId()]['disabled'] = true;
}
}
if($resort != null && !$request->get('resort')){
$jobs->addConditionParam("resorts LIKE :resort", ['resort' => '%' . $resort . '%']);
}
if ($request->get('resort') && $request->get('resort') != 'all') {
$jobs->addConditionParam('resorts LIKE :keyword', ['keyword' => '%' . $request->get('resort') . '%']);
}
foreach ($jobs->load() as $job) {
if ($job->getLocation() instanceof Location) {
$locations[$job->getLocation()->getId()]['disabled'] = false;
}
if ($job->getDepartment() instanceof Departments) {
$departments[$job->getDepartment()->getId()]['disabled'] = false;
}
}
if ($request->get('department')) {
$jobs->addConditionParam('department__id = :department', ['department' => $request->get('department')]);
}
if ($request->get('location')) {
$jobs->addConditionParam('location__id = :location', ['location' => $request->get('location')]);
}
if ($request->get('q')) {
$jobs->addConditionParam('name LIKE :search OR teaserText LIKE :search OR text LIKE :search', ['search' => '%'.$request->get('q').'%']);
}
$jobs->setOrderKey(['beginDate']);
$jobs->setOrder(['DESC']);
$jobs = $paginator->paginate(
$jobs,
$request->get('page', 1),
6
);
$returnArray = [
'paginator' => $jobs,
'locations' => $locations,
'departments' => $departments,
];
if ($request->isXmlHttpRequest() && $request->get('ajax')) {
return $this->json([
'success' => true,
'html' => $this->render('jobs/includes/jobs-filter.html.twig', $returnArray)->getContent(),
]);
}
return $this->renderTemplate('jobs/overview.html.twig', $returnArray);
}
/**
*
* @param Request $request
*
* @return Response
*/
public function detailAction(Request $request, Job $id, PaginatorInterface $paginator, ConfigHelper $configHelper): Response
{
$job = $id;
$siteConfig = $configHelper->getSiteConfig();
$orCondition = [];
foreach ($job->getResorts() ?? [] as $resort) {
$orCondition[] = 'resorts LIKE "%' . $resort . '%"';
}
$similarJobs = [];
if(!empty($orCondition)) {
$similarJobs = new Job\Listing();
$similarJobs->addConditionParam('o_id != :id', ['id' => $job->getId()]);
$similarJobs->addConditionParam('name != "" AND name IS NOT NULL');
if ($siteConfig) {
$similarJobs->addConditionParam('config LIKE :config', ['config' => '%,' . $siteConfig->getId() . ',%']);
}
$similarJobs->addConditionParam(implode(' OR ', $orCondition));
}
$siteConfig = $this->configHelper->getSiteConfig();
\Pimcore\Cache::disable();
$errors = [];
$success = null;
if ($request->isMethod('POST')) {
if ($siteConfig instanceof SiteConfig) {
$successPage = $siteConfig->getSuccessPage();
if ($request->get('resort') == 'construction') {
$adminMail = $siteConfig->getConstructionAdminMail();
$userMail = $siteConfig->getConstructionUserMail();
$mailAddress = $siteConfig->getConstructionMailAddress();
}
if ($request->get('resort') == 'loader') {
$adminMail = $siteConfig->getLoaderAdminMail();
$userMail = $siteConfig->getLoaderUserMail();
$mailAddress = $siteConfig->getLoaderMailAddress();
}
}
$required = ['firstname', 'lastname', 'email', 'street', 'nr', 'plz', 'city'];
$params = $this->checkForm($request, $required);
$file1 = $request->files->get('cv');
$filenumber = 1;
$filesize = 0;
if ($file1 instanceof UploadedFile) {
$filesize = $this->simpleHelper->bytesToMiB($file1->getSize(), 3);
$this->applicationLogger->info('CV for Job ID' .$job->getId().': Complete Filesize in MB: '.$filesize.' Time: '.Carbon::now(), ['component' => 'Job Admin Mail', 'relatedObject' => $job]);
if ($file1->getSize() > $this->simpleHelper->mbToBytes($this->maxUploadLimitContest)) {
$params['errors']['cv'] = $this->translator->trans('error.form.Lebenslauf size too big');
}
} else {
$params['errors']['cv'] = $this->translator->trans('error.form.file required');
}
$file2 = $request->files->get('motivation');
if ($file2 instanceof UploadedFile) {
$filenumber = 2;
$filesize = $filesize + $this->simpleHelper->bytesToMiB($file2->getSize(), 3);
$this->applicationLogger->info('Motivation for Job ID' .$job->getId().': Complete Filesize in MB: '.$filesize.' Time: '.Carbon::now(), ['component' => 'Job Admin Mail', 'relatedObject' => $job]);
if ($file2->getSize() > $this->simpleHelper->mbToBytes($this->maxUploadLimitContest)) {
$params['errors']['motivation'] = $this->translator->trans('error.form.Motivation size too big');
}
}
$file3 = $request->files->get('others');
if ($file3 instanceof UploadedFile) {
$filenumber = 3;
$filesize = $filesize + $this->simpleHelper->bytesToMiB($file3->getSize(), 3);
$this->applicationLogger->info('Other Attachments for Job ID' .$job->getId().': Complete Filesize in MB: '.$filesize.' Time: '.Carbon::now(), ['component' => 'Job Admin Mail', 'relatedObject' => $job]);
if ($file3->getSize() > $this->simpleHelper->mbToBytes($this->maxUploadLimitContest)) {
$params['errors']['others'] = $this->translator->trans('error.form.Others size too big');
}
}
if($filesize > $this->maxUploadLimitContest){
$params['errors']['attachments'] = $this->translator->trans('error.form.size of Attachments too big');
}
if (!empty($params['errors'])) {
$errors = $params['errors'];
$success = false;
} else {
$adminMailSuccess = false;
$userMailSuccess = false;
if (isset($adminMail) && $adminMail instanceof Email && isset($mailAddress)) {
$mail = new Mail();
try {
$mail->setParams($params);
$mail->setDocument($adminMail);
$mail->addTo($mailAddress);
if ($file1 !== null) {
$mail->attach(file_get_contents($file1->getPathname()), $file1->getClientOriginalName(), $file1->getClientMimeType());
}
if ($file2 != null) {
$mail->attach(file_get_contents($file2->getPathname()), $file2->getClientOriginalName(), $file2->getClientMimeType());
}
if ($file3 != null) {
$mail->attach(file_get_contents($file3->getPathname()), $file3->getClientOriginalName(), $file3->getClientMimeType());
}
$mail->send();
$this->applicationLogger->info('Send Admin Mail for Job ID' .$job->getId().': Number of Files: '.$filenumber.' Complete Filesize in MB: '.$filesize.'Time: '.Carbon::now(), ['component' => 'Job Admin Mail', 'relatedObject' => $job]);
$adminMailSuccess = true;
} catch(\Exception $e) {
$this->applicationLogger->error('Error on sending Admin Mail for Job ID' .$job->getId().': Number of Files: '.$filenumber.' Complete Filesize in MB: '.$filesize.'Time: '.Carbon::now(), ['component' => 'Job Admin Mail', 'relatedObject' => $job]);
$errors[] = 'sending admin mail failed';
}
}
if (isset($userMail) && $userMail instanceof Email) {
$mail = new Mail();
try {
$mail->addTo($params['email']);
$mail->setDocument($userMail);
$mail->send();
$this->applicationLogger->info('Send User Mail for Job ID' .$job->getId().': Number of Files: '.$filenumber.' Complete Filesize in MB: '.$filesize.'Time: '.Carbon::now(), ['component' => 'Job User Mail', 'relatedObject' => $job]);
$userMailSuccess = true;
} catch(\Exception $e) {
$errors[] = 'sending user mail failed';
}
}
if ($adminMailSuccess && $userMailSuccess && isset($successPage) && $successPage instanceof Page) {
return $this->redirect((string)$successPage);
}
}
}
$similarJobs = $paginator->paginate(
$similarJobs,
$request->get('page', 1),
6
);
if ($request->isXmlHttpRequest() && $request->get('ajax')) {
return $this->json([
'success' => true,
'html' => $this->render('jobs/includes/jobs-content.html.twig', [
'errors' => $errors,
'success' => $success,
'job' => $job,
'similarJobs' => $similarJobs,
'paginator' => $similarJobs,
])->getContent(),
]);
}
return $this->renderTemplate('jobs/detail.html.twig', [
'errors' => $errors,
'success' => $success,
'job' => $job,
'similarJobs' => $similarJobs,
]);
}
/**
*
* @param Request $request
*
* @return Response
*/
public function teamDetailAction(Request $request, Team $id): Response
{
$team = $id;
return $this->renderTemplate('jobs/team-detail.html.twig', [
'team' => $team,
]);
}
/**
* @param Request $request
* @param mixed $required
*
* @return mixed
*/
private function checkForm(Request $request, mixed $required): mixed
{
$validHashCash = $this->hashCashService->validateProcessFrom();
if ($validHashCash) {
$params = $request->request->all();
unset($params['elhc_stamp'], $params['elhc_difficulty'], $params['elhc_nonce']);
$errors = [];
foreach ($required as $param) {
if ($request->get($param) == '') {
$errors[$param] = $param . ' is missing';
}
if ($param == 'email' && !MailHelper::isValidEmailAddress($request->get($param))) {
$errors[$param] = 'email invalid';
}
}
if (!empty($errors)) {
$params['errors'] = $errors;
}
if (isset($params['salutation'])) {
$params['salutation'] = $this->translator->trans('form.salutation.' . $params['salutation'], [], null, $request->getLocale());
}
$params['items'] = $params;
} else {
$params['errors'] = ['recaptcha' => 'invalid captcha'];
}
return $params;
}
}