<?php
namespace App\Controller;
use App\Entity\Jobs;
use App\Entity\JobsApplications;
use App\Features\Core\Paginator;
use App\Features\JobApplication\JobApplicationFilter;
use App\Features\Jobs\IJobsException;
use App\Features\Jobs\JobFilter;
use App\Features\Jobs\JobsManager;
use App\Form\CertificateType;
use App\Form\ReCaptchaType\ReCaptchaType;
use App\Repository\JobsApplicationsRepository;
use App\Repository\JobsRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class JobsController extends AbstractController
{
#[Route("/compte/candidatures", name:"job-application")]
#[IsGranted("ROLE_APPLICANT")]
public function applications(Request $request, JobsApplicationsRepository $repository): Response
{
$query = $repository->filter(new JobApplicationFilter(applicant: $this->getUser()));
$paginator = new Paginator($query, $request->query->getInt('limit', 30), $request->query->getInt('page', 1));
return $this->render('JobsApplications/_application_list.html.twig', [
'applications' => $paginator,
"title" => "Mes candidatures"
]);
}
#[Route("/offre/{uuid}/detail", name:"job-detail")]
public function jobDetail(Jobs $job, JobsRepository $repository): Response
{
//get this job list having the same sector
$sectorsJobsQb = $repository->filter(new JobFilter(sectors: $job->getSectors()->getValues(), applicantNotExist: $this->getUser()));
$paginator = new Paginator($sectorsJobsQb, 5, 1);
return $this->render('Jobs/_job_detail.html.twig', [
'job' => $job,
'title' => $job->getTitle(),
'sectorsJobs' => $paginator,
]);
}
#[Route("/offre/{uuid}/candidature", name:"job-apply")]
#[IsGranted("ROLE_APPLICANT")]
public function applyToJob(Request $request, Jobs $job, JobsManager $jobsManager): Response
{
$form = $this->createFormBuilder([], ["attr"=>["id"=>"candidature"]])
->add('coverLetter', CertificateType::class, [
"required" => true,
])
->add('recaptcha', ReCaptchaType::class, [
"required" => true,
])
->getForm();
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
$certificate = $form->get("coverLetter")->getData();
try {
$application= $jobsManager->applyToJob($job, $this->getUser(), $certificate);
return $this->redirectToRoute('job-application-confirmation', [
'application'=> $application->getId()
]);
} catch (IJobsException $e) {
$this->addFlash('error', $e->getMessage());
}
}
return $this->render('Jobs/_job_application.html.twig', [
'job' => $job,
'cv' => $this->getUser()?->getCv(),
'title' => $job->getTitle(),
'form' => $form->createView(),
]);
}
#[Route("/candidature/{application}/modifier", name:"job-application-edit")]
#[IsGranted("ROLE_APPLICANT")]
public function editApplication(Request $request, JobsApplications $application, JobsManager $jobsManager): Response
{
$job= $application->getJob();
$form = $this->createFormBuilder(["coverLetter"=> $application->getCoverLetter()], ["attr"=>["id"=>"candidature"]])
->add('coverLetter', CertificateType::class, [
"required" => true,
])
->add('recaptcha', ReCaptchaType::class, [
"required" => true,
])
->getForm();
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
$certificate = $form->get("coverLetter")->getData();
$application= $jobsManager->editApplication($application, $certificate);
return $this->redirectToRoute('job-application-confirmation', [
'application'=> $application->getId()
]);
}
return $this->render('Jobs/_job_application.html.twig', [
'application' => $application,
'job' => $job,
'cv' => $this->getUser()?->getCv(),
'title' => $job?->getTitle(),
'form' => $form->createView(),
]);
}
#[Route("/candidature/{application}/confirmation", name:"job-application-confirmation")]
#[IsGranted("ROLE_APPLICANT")]
public function applicationConfirm(Request $request, JobsApplications $application, JobsManager $jobsManager): Response
{
$job= $application->getJob();
if($request->get("confirmer")){
$jobsManager->confirmApplication($application);
return $this->redirectToRoute('job-application');
}
return $this->render('Jobs/_job_application_confirmation.html.twig', [
'job' => $job,
'application' => $application,
'cv' => $this->getUser()?->getCv(),
'title' => "Confirmation de ma candidature",
]);
}
}