src/Controller/Frontend/CandidatureController.php line 148

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Frontend;
  3. use App\Entity\Candidature;
  4. use App\Entity\Job;
  5. use App\Entity\CandidatureComment;
  6. use App\Entity\CommentCandidature;
  7. use App\Entity\ContactComment;
  8. use App\Entity\Notification;
  9. use App\Factory\CandidatureFactory;
  10. use App\Form\CandidatureCommentType;
  11. use App\Form\ContactCommentType;
  12. use App\Form\FormFlow\CreateCandidatureFlow;
  13. use App\Form\MissingPropertyType;
  14. use App\Manager\PropertyManager;
  15. use App\Message\SendEmailMessage;
  16. use App\Repository\ArticleRepository;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use App\Utility\PropertyAndMediaUpdater;
  21. use Doctrine\ORM\EntityManagerInterface;
  22. use App\Repository\JobRepository;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\Messenger\MessageBusInterface;
  25. class CandidatureController extends AbstractController
  26. {
  27. /**
  28. * @Route("/espace-candidature/candidature/{id}", name="frontend_candidature")
  29. * @Route("/espace-candidature/candidature/modify", name="frontend_candidature_modify")
  30. */
  31. public function index(CreateCandidatureFlow $ccf, CandidatureFactory $candFactory, MessageBusInterface $mbi, PropertyAndMediaUpdater $pamu,EntityManagerInterface $em, $id = null): Response
  32. {
  33. if($id !== null){
  34. $job = $em->getRepository(Job::class)->find($id);
  35. }else{
  36. $job = null;
  37. }
  38. if(count($this->getUser()->getContact()->getCandidatures())>0){
  39. $contact = $this->getUser()->getContact();
  40. $contact = $pamu->updateCandidate($contact);
  41. $candidature = $this->getUser()->getContact()->getCandidatures()[0];
  42. $candidature->setContact($contact);
  43. }else{
  44. $candidature = $candFactory->createCandidature();
  45. $contact = $this->getUser()->getContact();
  46. $contact = $pamu->updateCandidate($contact);
  47. $candidature->setContact($contact);
  48. }
  49. $candidature->setJobPosition($job);
  50. $ccf->bind($candidature);
  51. $form = $ccf->createForm();
  52. if ($ccf->isValid($form) && ($ccf->getCurrentStep() < 2 || $this->validateProperties($candidature->getContact()->getContactPropertyValues()))) {
  53. $ccf->saveCurrentStepData($form);
  54. $process = false;
  55. if ($ccf->nextStep()) {
  56. // form for the next step
  57. $form = $ccf->createForm();
  58. } else {
  59. // flow finished
  60. $em = $this->getDoctrine()->getManager();
  61. $contact = $candidature->getContact();
  62. $contact->setEmail($this->getUser()->getEmail());
  63. $em->persist($contact);
  64. $em->flush();
  65. foreach($candidature->getContact()->getMedias()as $key => $media){
  66. if(!$media->isFileOK()){
  67. $this->addFlash('success','ce Format n\'est pas accepté, format accepté: '.implode(", ",$media->getMediaCategorie()->getAllowedFormat()));
  68. return $this->render('frontend/candidature/candidature.html.twig', [
  69. 'form' => $form->createView(),
  70. 'flow' => $ccf,
  71. ]);
  72. }
  73. if($media->getMediaCategorie()->getIsPrivate()){
  74. $media->setPrivateFile($media->getImgFile());
  75. $media->setImgFile(null);
  76. }
  77. }
  78. $candidature->setIsCoupDeCoeur(false);
  79. $em->persist($candidature);
  80. $em->flush();
  81. //TODO: mettre la bonne adresse mail et ce à partir des params
  82. $mbi->dispatch(new SendEmailMessage('candidature_receive',Candidature::class,$candidature->getId(),$candidature->getContact()->getEmail()));
  83. $mbi->dispatch(new SendEmailMessage('candidature_receive_admin',Candidature::class,$candidature->getId(),'info@croqvacances.org'));
  84. $ccf->reset(); // remove step data from the session
  85. $this->addFlash('success', 'Merci pour votre candidature. Nous allons la traiter dans les plus brefs délais. Vous pouvez accéder à votre espace CANDIDAT (Recrutement - Espace candidat) afin d\'apporter les informations complémentaires ou modifications à tout moment. Nous reviendrons vers vous prochainement pour un entretien. En cas de recrutement par un directeur, MERCI de compléter toutes les informations');
  86. //on ajoute une notification
  87. $notif = (new Notification())
  88. ->setRole("ROLE_HR")
  89. ->setTitle('Nouvelle Candidature')
  90. ->setSubtitle($contact->getFirstName()." ".$contact->getLastName().", déposée le ".$candidature->getSendDate()->format('d/m/Y'))
  91. ->setStatut(Notification::STATUT_OPEN)
  92. ->setUrl($this->generateUrl('admin_candidature',['id'=>$candidature->getId()]));
  93. $em->persist($notif);
  94. $em->flush();
  95. return $this->redirect($this->generateUrl('espace_candidature')); // redirect when done
  96. }
  97. }
  98. return $this->render('frontend/candidature/candidature.html.twig', [
  99. 'form' => $form->createView(),
  100. 'flow' => $ccf,
  101. ]);
  102. }
  103. /**
  104. * @ROute("/espace-candidature/dispatcher", name="espace_candidature_dispatcher")
  105. */
  106. public function dispatchCandidature()
  107. {
  108. $alreadyCandidat = count($this->getUser()->getContact()->getCandidatures());
  109. if($alreadyCandidat == 0){
  110. return $this->redirectToRoute('frontend_candidature');
  111. }
  112. return $this->redirectToRoute('espace_candidature');
  113. }
  114. /**
  115. * @Route("/espace-candidature/infoManquantes",name="espace_candidature_missing_properties")
  116. */
  117. public function missingProperties(PropertyManager $prm,Request $request)
  118. {
  119. $infosManquantes = $prm->listMissingPropertyFromContact($this->getUser()->getContact());
  120. $form = $this->createForm(MissingPropertyType::class,null,['missingProperties'=>$infosManquantes]);
  121. $form->handleRequest($request);
  122. if($form->isSubmitted() and $form->isValid()){
  123. $response = $form->getData();
  124. //TODO: voters
  125. $this->getDoctrine()->getManager()->flush();
  126. return $this->redirectToRoute('espace_candidature');
  127. }
  128. return $this->render('espace_parent/informationsManquantes.html.twig',['missingProperties'=>$infosManquantes,'form'=>$form->createView()]);
  129. }
  130. /**
  131. * @ROute("/espace-candidature", name="espace_candidature")
  132. */
  133. public function updateCandidature(PropertyManager $prm, PropertyAndMediaUpdater $pamu)
  134. {
  135. $contact = $this->getUser()->getContact();
  136. if($contact->getCandidatures() !== null and $contact->getCandidatures()[0]->getStatut()==Candidature::ACCEPTED){
  137. $pamu->updateEmploye($contact);
  138. }
  139. $infosManquantes = $prm->listMissingPropertyFromContact($contact);
  140. return $this->render('frontend/candidature/espace-candidature.html.twig',['missingProperties'=>$infosManquantes]);
  141. }
  142. /**
  143. * @Route("/espace-candidature/interet", name="espace_candidature_interet")
  144. */
  145. public function interet(Request $request, MessageBusInterface $messageBusInterface )
  146. {
  147. $lastCandidature = $this->getUser()->getContact()->getCandidatures()[0];
  148. if($lastCandidature == null){
  149. return $this->redirectToRoute("frontend_candidature");
  150. }
  151. $comment = (new ContactComment())
  152. ->setUser($this->getUser())
  153. ->setContact($lastCandidature->getContact());
  154. $form = $this->createForm(ContactCommentType::class, $comment);
  155. $form->handleRequest($request);
  156. if($form->isSubmitted() and $form->isValid()){
  157. $periode = $form->get('periode')->getData();
  158. $text = '<b> Est intéressé pour la prochaine période: '. $periode. ' du '.$form->get('dateDebut')->getData()->format('d/m/Y').' au '.$form->get('dateFin')->getData()->format('d/m/Y').'</b><br/>';
  159. $comment->setComment($text.$comment->getComment());
  160. $lastCandidature->setUpdatedDate(new \DateTime());
  161. $lastCandidature->setAvailableFrom($form->get('dateDebut')->getData());
  162. $lastCandidature->setAvailableTo($form->get('dateFin')->getData());
  163. $this->getDoctrine()->getManager()->persist($comment);
  164. $this->getDoctrine()->getManager()->flush();
  165. $this->addFlash('success','Votre demande nous est parvenue, merci.');
  166. $messageBusInterface->dispatch((new SendEmailMessage('candidat_signal_interet',Candidature::class,$lastCandidature->getId(),'personnel@croqvacances.org')));
  167. return $this->redirectToRoute("espace_candidature");
  168. }
  169. return $this->render('frontend/form.html.twig',['form' => $form->createView(),'pageTitle'=> 'Je signale mes disponibilités']);
  170. }
  171. /**
  172. * @Route("/recrutement.html", name="frontend_recrutement",options={"sitemap" = true})
  173. */
  174. public function recrutement(JobRepository $jr, ArticleRepository $ar)
  175. {
  176. $seoText = $ar->findOneby(['title' => 'recrutement_teaser']);
  177. $jobs = $jr->findBy(['isActive' => true], ['position' => 'ASC']);
  178. return $this->render('frontend/candidature/index.html.twig', ['jobs' => $jobs, 'seoText' => $seoText]);
  179. }
  180. private function validateProperties(iterable $properties){
  181. $ident = false;
  182. $secu = true;
  183. $tempNum = null;
  184. $tempChecksum = null;
  185. // if($tempNum && $tempChecksum !== null){
  186. // $tempTest = $tempNum + $tempChecksum;
  187. // $secu = $tempTest%97 == 0;
  188. // }
  189. return true;
  190. return $ident && $secu;
  191. }
  192. }