src/Controller/PostulerController.php line 33

Open in your IDE?
  1. <?php
  2. // src/Controller/PostulerController.php
  3. namespace App\Controller;
  4. use App\Entity\Missions;
  5. use App\Entity\ReponsesAO;
  6. use App\Form\PostulerType;
  7. use App\Entity\Consultants;
  8. use App\Repository\MissionsRepository;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\Security\Core\Security;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Symfony\Component\String\Slugger\SluggerInterface;
  15. use Symfony\Component\HttpFoundation\File\UploadedFile;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  18. class PostulerController extends AbstractController
  19. {
  20.     private $slugger;
  21.     private $cvsDirectory;
  22.     public function __construct(SluggerInterface $sluggerstring $cvsDirectory)
  23.     {
  24.         $this->slugger $slugger;
  25.         $this->cvsDirectory $cvsDirectory;
  26.     }
  27.     #[Route('/postuler/{missionId}'name'app_postuler')]
  28.     public function postuler(
  29.         int $missionId,
  30.         Request $request,
  31.         EntityManagerInterface $em,
  32.         MissionsRepository $missionsRepository
  33.     ): Response {
  34.         // Assurez-vous que l'utilisateur est connecté et est un consultant
  35.         $user $this->getUser();
  36.         if (!$user || !$user instanceof Consultants) {
  37.             throw $this->createAccessDeniedException('Vous devez être connecté en tant que consultant pour postuler.');
  38.         }
  39.         // Récupérez la mission
  40.         $mission $missionsRepository->find($missionId);
  41.         if (!$mission) {
  42.             throw $this->createNotFoundException('La mission n\'a pas été trouvée.');
  43.         }
  44.         // Créez une nouvelle réponse
  45.         $reponseAO = new ReponsesAO();
  46.         $reponseAO->setMission($mission);
  47.         $reponseAO->setConsultant($user);
  48.         $reponseAO->setStatut('en_attente');
  49.         // Créez et gérez le formulaire
  50.         $form $this->createForm(PostulerType::class, $reponseAO, [
  51.             'missionId' => $missionId,
  52.             'mission' => $mission,
  53.         ]);
  54.         $form->handleRequest($request);
  55.         if ($form->isSubmitted() && $form->isValid()) {
  56.             $missionIdFromForm $form->get('missionId')->getData();
  57.             
  58.             if ($missionIdFromForm != $missionId) {
  59.                 throw $this->createAccessDeniedException('L\'ID de la mission ne correspond pas.');
  60.             }
  61.             $TJMPropose $form->get('TJM_propose')->getData();
  62.             // Vérifiez si le TJM proposé est supérieur au budget de la mission
  63.             if ($TJMPropose $mission->getBudget()) {
  64.                 $this->addFlash('error''Votre TJM proposé (' $TJMPropose '€) dépasse le budget de la mission (' $mission->getBudget() . '€).');
  65.                 return $this->redirectToRoute('app_postuler', ['missionId' => $missionId]);
  66.             }
  67.             /** @var UploadedFile $cvFile */
  68.             $cvFile $form->get('CV')->getData();
  69.             if ($cvFile) {
  70.                 $originalFilename pathinfo($cvFile->getClientOriginalName(), PATHINFO_FILENAME);
  71.                 $safeFilename $this->slugger->slug($originalFilename);
  72.                 $newFilename $safeFilename.'-'.uniqid().'.'.$cvFile->guessExtension();
  73.                 try {
  74.                     $cvFile->move($this->cvsDirectory$newFilename);
  75.                     $reponseAO->setCV($newFilename);
  76.                 } catch (FileException $e) {
  77.                     $this->addFlash('error''Échec du téléchargement du CV.');
  78.                 }
  79.             } else {
  80.                 // Utilisez le CV existant si aucun nouveau fichier n'est téléchargé
  81.                 $reponseAO->setCV($user->getCV());
  82.             }
  83.             $reponseAO->setDateReponse(new \DateTime());
  84.             $em->persist($reponseAO);
  85.             $em->flush();
  86.             $this->addFlash('success''Félicitations ! Vous venez de postuler à la mission "' $mission->getTitre() . '".');
  87.             return $this->redirectToRoute('app_home');
  88.         }
  89.         return $this->render('consultant/postuler/index.html.twig', [
  90.             'form' => $form->createView(),
  91.             'laMission' => $mission,
  92.             'consultantCV' => $user->getCV(),
  93.         ]);
  94.     }
  95.     #[Route('/postuler/modifier/{id}'name'app_modifier_postuler')]
  96.     public function modifier(
  97.         int $id,
  98.         Request $request,
  99.         EntityManagerInterface $em
  100.     ): Response {
  101.         $user $this->getUser();
  102.         if (!$user || !$user instanceof Consultants) {
  103.             throw $this->createAccessDeniedException('Vous devez être connecté en tant que consultant pour modifier votre candidature.');
  104.         }
  105.         $reponseAO $em->getRepository(ReponsesAO::class)->find($id);
  106.         if (!$reponseAO || $reponseAO->getConsultant() !== $user) {
  107.             throw $this->createNotFoundException('Candidature introuvable ou accès non autorisé.');
  108.         }
  109.         $mission $reponseAO->getMission();
  110.         $form $this->createForm(PostulerType::class, $reponseAO, [
  111.             'missionId' => $mission->getId(),
  112.             'mission' => $mission,
  113.         ]);
  114.         $form->handleRequest($request);
  115.         if ($form->isSubmitted() && $form->isValid()) {
  116.             $TJMPropose $form->get('TJM_propose')->getData();
  117.             if ($TJMPropose $mission->getBudget()) {
  118.                 $this->addFlash('error''Votre TJM proposé dépasse le budget de la mission.');
  119.                 return $this->redirectToRoute('app_modifier_postuler', ['id' => $id]);
  120.             }
  121.             /** @var UploadedFile $cvFile */
  122.             $cvFile $form->get('CV')->getData();
  123.             if ($cvFile) {
  124.                 $originalFilename pathinfo($cvFile->getClientOriginalName(), PATHINFO_FILENAME);
  125.                 $safeFilename $this->slugger->slug($originalFilename);
  126.                 $newFilename $safeFilename '-' uniqid() . '.' $cvFile->guessExtension();
  127.                 try {
  128.                     $cvFile->move($this->cvsDirectory$newFilename);
  129.                     $reponseAO->setCV($newFilename);
  130.                 } catch (FileException $e) {
  131.                     $this->addFlash('error''Échec du téléchargement du CV.');
  132.                 }
  133.             }
  134.             $em->flush();
  135.             $this->addFlash('success''Votre candidature a été modifiée avec succès.');
  136.             return $this->redirectToRoute('app_home');
  137.         }
  138.         return $this->render('consultant/postuler/modifier.html.twig', [
  139.             'form' => $form->createView(),
  140.             'reponseAO' => $reponseAO,
  141.             'laMission' => $mission,
  142.             'consultantCV' => $user->getCV(),
  143.         ]);
  144.     }
  145.     #[Route('/postuler/supprimer/{id}'name'app_supprimer_postuler')]
  146.     public function supprimer(
  147.         int $id,
  148.         EntityManagerInterface $em
  149.     ): Response {
  150.         $user $this->getUser();
  151.         if (!$user || !$user instanceof Consultants) {
  152.             throw $this->createAccessDeniedException('Vous devez être connecté en tant que consultant pour supprimer votre candidature.');
  153.         }
  154.         $reponseAO $em->getRepository(ReponsesAO::class)->find($id);
  155.         if (!$reponseAO || $reponseAO->getConsultant() !== $user) {
  156.             throw $this->createNotFoundException('Candidature introuvable ou accès non autorisé.');
  157.         }
  158.         $em->remove($reponseAO);
  159.         $em->flush();
  160.         $this->addFlash('success''Votre candidature a été supprimée avec succès.');
  161.         return $this->redirectToRoute('app_home');
  162.     }
  163. }