<?php
namespace App\Controller\Frontend;
use App\Entity\Candidature;
use App\Entity\Job;
use App\Entity\CandidatureComment;
use App\Entity\CommentCandidature;
use App\Entity\ContactComment;
use App\Entity\Notification;
use App\Factory\CandidatureFactory;
use App\Form\CandidatureCommentType;
use App\Form\ContactCommentType;
use App\Form\FormFlow\CreateCandidatureFlow;
use App\Form\MissingPropertyType;
use App\Manager\PropertyManager;
use App\Message\SendEmailMessage;
use App\Repository\ArticleRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Utility\PropertyAndMediaUpdater;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\JobRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Messenger\MessageBusInterface;
class CandidatureController extends AbstractController
{
/**
* @Route("/espace-candidature/candidature/{id}", name="frontend_candidature")
* @Route("/espace-candidature/candidature/modify", name="frontend_candidature_modify")
*/
public function index(CreateCandidatureFlow $ccf, CandidatureFactory $candFactory, MessageBusInterface $mbi, PropertyAndMediaUpdater $pamu,EntityManagerInterface $em, $id = null): Response
{
if($id !== null){
$job = $em->getRepository(Job::class)->find($id);
}else{
$job = null;
}
if(count($this->getUser()->getContact()->getCandidatures())>0){
$contact = $this->getUser()->getContact();
$contact = $pamu->updateCandidate($contact);
$candidature = $this->getUser()->getContact()->getCandidatures()[0];
$candidature->setContact($contact);
}else{
$candidature = $candFactory->createCandidature();
$contact = $this->getUser()->getContact();
$contact = $pamu->updateCandidate($contact);
$candidature->setContact($contact);
}
$candidature->setJobPosition($job);
$ccf->bind($candidature);
$form = $ccf->createForm();
if ($ccf->isValid($form) && ($ccf->getCurrentStep() < 2 || $this->validateProperties($candidature->getContact()->getContactPropertyValues()))) {
$ccf->saveCurrentStepData($form);
$process = false;
if ($ccf->nextStep()) {
// form for the next step
$form = $ccf->createForm();
} else {
// flow finished
$em = $this->getDoctrine()->getManager();
$contact = $candidature->getContact();
$contact->setEmail($this->getUser()->getEmail());
$em->persist($contact);
$em->flush();
foreach($candidature->getContact()->getMedias()as $key => $media){
if(!$media->isFileOK()){
$this->addFlash('success','ce Format n\'est pas accepté, format accepté: '.implode(", ",$media->getMediaCategorie()->getAllowedFormat()));
return $this->render('frontend/candidature/candidature.html.twig', [
'form' => $form->createView(),
'flow' => $ccf,
]);
}
if($media->getMediaCategorie()->getIsPrivate()){
$media->setPrivateFile($media->getImgFile());
$media->setImgFile(null);
}
}
$candidature->setIsCoupDeCoeur(false);
$em->persist($candidature);
$em->flush();
//TODO: mettre la bonne adresse mail et ce à partir des params
$mbi->dispatch(new SendEmailMessage('candidature_receive',Candidature::class,$candidature->getId(),$candidature->getContact()->getEmail()));
$mbi->dispatch(new SendEmailMessage('candidature_receive_admin',Candidature::class,$candidature->getId(),'info@croqvacances.org'));
$ccf->reset(); // remove step data from the session
$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');
//on ajoute une notification
$notif = (new Notification())
->setRole("ROLE_HR")
->setTitle('Nouvelle Candidature')
->setSubtitle($contact->getFirstName()." ".$contact->getLastName().", déposée le ".$candidature->getSendDate()->format('d/m/Y'))
->setStatut(Notification::STATUT_OPEN)
->setUrl($this->generateUrl('admin_candidature',['id'=>$candidature->getId()]));
$em->persist($notif);
$em->flush();
return $this->redirect($this->generateUrl('espace_candidature')); // redirect when done
}
}
return $this->render('frontend/candidature/candidature.html.twig', [
'form' => $form->createView(),
'flow' => $ccf,
]);
}
/**
* @ROute("/espace-candidature/dispatcher", name="espace_candidature_dispatcher")
*/
public function dispatchCandidature()
{
$alreadyCandidat = count($this->getUser()->getContact()->getCandidatures());
if($alreadyCandidat == 0){
return $this->redirectToRoute('frontend_candidature');
}
return $this->redirectToRoute('espace_candidature');
}
/**
* @Route("/espace-candidature/infoManquantes",name="espace_candidature_missing_properties")
*/
public function missingProperties(PropertyManager $prm,Request $request)
{
$infosManquantes = $prm->listMissingPropertyFromContact($this->getUser()->getContact());
$form = $this->createForm(MissingPropertyType::class,null,['missingProperties'=>$infosManquantes]);
$form->handleRequest($request);
if($form->isSubmitted() and $form->isValid()){
$response = $form->getData();
//TODO: voters
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('espace_candidature');
}
return $this->render('espace_parent/informationsManquantes.html.twig',['missingProperties'=>$infosManquantes,'form'=>$form->createView()]);
}
/**
* @ROute("/espace-candidature", name="espace_candidature")
*/
public function updateCandidature(PropertyManager $prm, PropertyAndMediaUpdater $pamu)
{
$contact = $this->getUser()->getContact();
if($contact->getCandidatures() !== null and $contact->getCandidatures()[0]->getStatut()==Candidature::ACCEPTED){
$pamu->updateEmploye($contact);
}
$infosManquantes = $prm->listMissingPropertyFromContact($contact);
return $this->render('frontend/candidature/espace-candidature.html.twig',['missingProperties'=>$infosManquantes]);
}
/**
* @Route("/espace-candidature/interet", name="espace_candidature_interet")
*/
public function interet(Request $request, MessageBusInterface $messageBusInterface )
{
$lastCandidature = $this->getUser()->getContact()->getCandidatures()[0];
if($lastCandidature == null){
return $this->redirectToRoute("frontend_candidature");
}
$comment = (new ContactComment())
->setUser($this->getUser())
->setContact($lastCandidature->getContact());
$form = $this->createForm(ContactCommentType::class, $comment);
$form->handleRequest($request);
if($form->isSubmitted() and $form->isValid()){
$periode = $form->get('periode')->getData();
$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/>';
$comment->setComment($text.$comment->getComment());
$lastCandidature->setUpdatedDate(new \DateTime());
$lastCandidature->setAvailableFrom($form->get('dateDebut')->getData());
$lastCandidature->setAvailableTo($form->get('dateFin')->getData());
$this->getDoctrine()->getManager()->persist($comment);
$this->getDoctrine()->getManager()->flush();
$this->addFlash('success','Votre demande nous est parvenue, merci.');
$messageBusInterface->dispatch((new SendEmailMessage('candidat_signal_interet',Candidature::class,$lastCandidature->getId(),'personnel@croqvacances.org')));
return $this->redirectToRoute("espace_candidature");
}
return $this->render('frontend/form.html.twig',['form' => $form->createView(),'pageTitle'=> 'Je signale mes disponibilités']);
}
/**
* @Route("/recrutement.html", name="frontend_recrutement",options={"sitemap" = true})
*/
public function recrutement(JobRepository $jr, ArticleRepository $ar)
{
$seoText = $ar->findOneby(['title' => 'recrutement_teaser']);
$jobs = $jr->findBy(['isActive' => true], ['position' => 'ASC']);
return $this->render('frontend/candidature/index.html.twig', ['jobs' => $jobs, 'seoText' => $seoText]);
}
private function validateProperties(iterable $properties){
$ident = false;
$secu = true;
$tempNum = null;
$tempChecksum = null;
// if($tempNum && $tempChecksum !== null){
// $tempTest = $tempNum + $tempChecksum;
// $secu = $tempTest%97 == 0;
// }
return true;
return $ident && $secu;
}
}