<?php
// src/Controller/PostulerController.php
namespace App\Controller;
use App\Entity\Missions;
use App\Entity\ReponsesAO;
use App\Form\PostulerType;
use App\Entity\Consultants;
use App\Repository\MissionsRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\String\Slugger\SluggerInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
class PostulerController extends AbstractController
{
private $slugger;
private $cvsDirectory;
public function __construct(SluggerInterface $slugger, string $cvsDirectory)
{
$this->slugger = $slugger;
$this->cvsDirectory = $cvsDirectory;
}
#[Route('/postuler/{missionId}', name: 'app_postuler')]
public function postuler(
int $missionId,
Request $request,
EntityManagerInterface $em,
MissionsRepository $missionsRepository
): Response {
// Assurez-vous que l'utilisateur est connecté et est un consultant
$user = $this->getUser();
if (!$user || !$user instanceof Consultants) {
throw $this->createAccessDeniedException('Vous devez être connecté en tant que consultant pour postuler.');
}
// Récupérez la mission
$mission = $missionsRepository->find($missionId);
if (!$mission) {
throw $this->createNotFoundException('La mission n\'a pas été trouvée.');
}
// Créez une nouvelle réponse
$reponseAO = new ReponsesAO();
$reponseAO->setMission($mission);
$reponseAO->setConsultant($user);
$reponseAO->setStatut('en_attente');
// Créez et gérez le formulaire
$form = $this->createForm(PostulerType::class, $reponseAO, [
'missionId' => $missionId,
'mission' => $mission,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$missionIdFromForm = $form->get('missionId')->getData();
if ($missionIdFromForm != $missionId) {
throw $this->createAccessDeniedException('L\'ID de la mission ne correspond pas.');
}
$TJMPropose = $form->get('TJM_propose')->getData();
// Vérifiez si le TJM proposé est supérieur au budget de la mission
if ($TJMPropose > $mission->getBudget()) {
$this->addFlash('error', 'Votre TJM proposé (' . $TJMPropose . '€) dépasse le budget de la mission (' . $mission->getBudget() . '€).');
return $this->redirectToRoute('app_postuler', ['missionId' => $missionId]);
}
/** @var UploadedFile $cvFile */
$cvFile = $form->get('CV')->getData();
if ($cvFile) {
$originalFilename = pathinfo($cvFile->getClientOriginalName(), PATHINFO_FILENAME);
$safeFilename = $this->slugger->slug($originalFilename);
$newFilename = $safeFilename.'-'.uniqid().'.'.$cvFile->guessExtension();
try {
$cvFile->move($this->cvsDirectory, $newFilename);
$reponseAO->setCV($newFilename);
} catch (FileException $e) {
$this->addFlash('error', 'Échec du téléchargement du CV.');
}
} else {
// Utilisez le CV existant si aucun nouveau fichier n'est téléchargé
$reponseAO->setCV($user->getCV());
}
$reponseAO->setDateReponse(new \DateTime());
$em->persist($reponseAO);
$em->flush();
$this->addFlash('success', 'Félicitations ! Vous venez de postuler à la mission "' . $mission->getTitre() . '".');
return $this->redirectToRoute('app_home');
}
return $this->render('consultant/postuler/index.html.twig', [
'form' => $form->createView(),
'laMission' => $mission,
'consultantCV' => $user->getCV(),
]);
}
#[Route('/postuler/modifier/{id}', name: 'app_modifier_postuler')]
public function modifier(
int $id,
Request $request,
EntityManagerInterface $em
): Response {
$user = $this->getUser();
if (!$user || !$user instanceof Consultants) {
throw $this->createAccessDeniedException('Vous devez être connecté en tant que consultant pour modifier votre candidature.');
}
$reponseAO = $em->getRepository(ReponsesAO::class)->find($id);
if (!$reponseAO || $reponseAO->getConsultant() !== $user) {
throw $this->createNotFoundException('Candidature introuvable ou accès non autorisé.');
}
$mission = $reponseAO->getMission();
$form = $this->createForm(PostulerType::class, $reponseAO, [
'missionId' => $mission->getId(),
'mission' => $mission,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$TJMPropose = $form->get('TJM_propose')->getData();
if ($TJMPropose > $mission->getBudget()) {
$this->addFlash('error', 'Votre TJM proposé dépasse le budget de la mission.');
return $this->redirectToRoute('app_modifier_postuler', ['id' => $id]);
}
/** @var UploadedFile $cvFile */
$cvFile = $form->get('CV')->getData();
if ($cvFile) {
$originalFilename = pathinfo($cvFile->getClientOriginalName(), PATHINFO_FILENAME);
$safeFilename = $this->slugger->slug($originalFilename);
$newFilename = $safeFilename . '-' . uniqid() . '.' . $cvFile->guessExtension();
try {
$cvFile->move($this->cvsDirectory, $newFilename);
$reponseAO->setCV($newFilename);
} catch (FileException $e) {
$this->addFlash('error', 'Échec du téléchargement du CV.');
}
}
$em->flush();
$this->addFlash('success', 'Votre candidature a été modifiée avec succès.');
return $this->redirectToRoute('app_home');
}
return $this->render('consultant/postuler/modifier.html.twig', [
'form' => $form->createView(),
'reponseAO' => $reponseAO,
'laMission' => $mission,
'consultantCV' => $user->getCV(),
]);
}
#[Route('/postuler/supprimer/{id}', name: 'app_supprimer_postuler')]
public function supprimer(
int $id,
EntityManagerInterface $em
): Response {
$user = $this->getUser();
if (!$user || !$user instanceof Consultants) {
throw $this->createAccessDeniedException('Vous devez être connecté en tant que consultant pour supprimer votre candidature.');
}
$reponseAO = $em->getRepository(ReponsesAO::class)->find($id);
if (!$reponseAO || $reponseAO->getConsultant() !== $user) {
throw $this->createNotFoundException('Candidature introuvable ou accès non autorisé.');
}
$em->remove($reponseAO);
$em->flush();
$this->addFlash('success', 'Votre candidature a été supprimée avec succès.');
return $this->redirectToRoute('app_home');
}
}