<?php
namespace App\Controller;
use App\Entity\Candidature;
use App\Entity\CandidatureActivity;
use App\Entity\ExperienceProfessionelle;
use App\Entity\Leader;
use App\Entity\OffreEmploi;
use App\Entity\User;
use App\Form\CandidatureActivityFormType;
use App\Form\ExperienceProfessionelleFormType;
use App\Form\OffreEmploiFormType;
use App\Repository\CandidatureActivityRepository;
use App\Repository\CandidatureRepository;
use App\Repository\CvSportifRepository;
use App\Repository\LeaderRepository;
use App\Repository\OffreEmploiRepository;
use App\Repository\ServiceRepository;
use App\Repository\StatutCARepository;
use App\Repository\StatutOERepository;
use App\Repository\UserRepository;
use App\Security\UserAuthenticator;
use Doctrine\DBAL\Types\TextType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
use Symfony\Component\Security\Http\Authenticator\FormLoginAuthenticator;
class EspaceLeaderController extends AbstractController
{
private EntityManagerInterface $entityManager;
private OffreEmploiRepository $offreEmploiRepository;
private CvSportifRepository $cvSportifRepository;
private UserRepository $userRepository;
private CandidatureRepository $candidatureRepository;
private CandidatureActivityRepository $candidatureActivityRepository;
private StatutCARepository $statutCARepository;
private ServiceRepository $serviceRepository;
private StatutOERepository $statutOERepository;
private LeaderRepository $leaderRepository;
/**
* @var Security
*/
private $security;
public function __construct(EntityManagerInterface $entityManager, CvSportifRepository $cvSportifRepository, ServiceRepository $serviceRepository,
OffreEmploiRepository $offreEmploiRepository, Security $security, CandidatureActivityRepository $candidatureActivityRepository,
UserRepository $userRepository, CandidatureRepository $candidatureRepository,
StatutCARepository $statutCARepository,
StatutOERepository $statutOERepository, LeaderRepository $leaderRepository)
{
$this->entityManager = $entityManager;
$this->offreEmploiRepository = $offreEmploiRepository;
$this->security = $security;
$this->cvSportifRepository = $cvSportifRepository;
$this->userRepository = $userRepository;
$this->candidatureRepository = $candidatureRepository;
$this->candidatureActivityRepository = $candidatureActivityRepository;
$this->statutCARepository = $statutCARepository;
$this->serviceRepository = $serviceRepository;
$this->statutOERepository = $statutOERepository;
$this->leaderRepository = $leaderRepository;
}
#[Route('/espace/leader', name: 'app_espace_leader')]
public function index(): Response
{
return $this->render('espace_leader/index.html.twig', [
'controller_name' => 'EspaceLeaderController',
]);
}
#[Route('espace_leader', name: 'acces_espace_leader')]
public function accesEspaceLeader(Request $request): Response
{
$offresEmplois = $this->offreEmploiRepository->findAll();
$userCurrent = $this->security->getUser();
return $this->render('espace_leader.html.twig', [
'offres_emploi' => $offresEmplois,
'user_current' => $userCurrent,
]);
}
#[Route('creer_emploi', name: 'create_emploi')]
public function creerOffreEmploi(Request $request): Response
{
$offreEmploi = new OffreEmploi();
$form = $this->createForm(OffreEmploiFormType::class, $offreEmploi);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// encode the plain password
$offreEmploi->setTitre($form->get('titre')->getData());
$offreEmploi->setContenu($form->get('contenu')->getData());
$offreEmploi->setService($form->get('service')->getData());
$offreEmploi->setUser($this->security->getUser());
$statutOE = $this->statutOERepository->findOneBy([
'libelle'=>'ouvert'
]);
$offreEmploi->setStatutOE($statutOE);
$image = $form->get('image')->getData();
if ($image) {
$originalFilename = pathinfo($image->getClientOriginalName(), PATHINFO_FILENAME);
// this is needed to safely include the file name as part of the URL
$safeFilename = 'offre_emploi';
$newFilename = $safeFilename.'-'.uniqid().'.'.$image->guessExtension();
// Move the file to the directory where brochures are stored
try {
$image->move(
$this->getParameter('photos_candidats_directory'),
$newFilename
);
} catch (FileException $e) {
// ... handle exception if something happens during file upload
}
// updates the 'brochureFilename' property to store the PDF file name
// instead of its contents
$offreEmploi->setImage('uploads/photos_candidats/'.$newFilename);
}
$this->entityManager->persist($offreEmploi);
$this->entityManager->flush();
return $this->redirectToRoute('create_emploi');
}
$offresEmplois = $this->offreEmploiRepository->findAll();
$services = $this->serviceRepository->findAll();
$userCurrent = $this->security->getUser();
return $this->render('creer_offre_emploi.html.twig', [
'offres_emploi' => $offresEmplois,
'user_current' => $userCurrent,
'form' => $form->createView(),
]);
}
#[Route('cv_candidat/{id}', name: 'acces_cv_candidat')]
public function cvCandidat(Candidature $candidature, Request $request): Response
{
$candidatureActivity = new CandidatureActivity();
$form = $this->createForm(CandidatureActivityFormType::class, $candidatureActivity);
$form->handleRequest($request);
$offresEmplois = $this->offreEmploiRepository->findAll();
$userCurrent = $candidature->getUser();
$cvSportif = $this->cvSportifRepository->find($userCurrent->getId());
$diplomes = $cvSportif->getDiplomes();
$experiencesProfessionnelles = $cvSportif->getExperienceProfessionelles();
$langues = $cvSportif->getLangues();
$sports = $cvSportif->getSports();
$hobbies = $cvSportif->getHobbies();
$candidaturesActivity = $this->candidatureActivityRepository->findBy([
'candidature' => $candidature->getId(),
]);
if ($form->isSubmitted() && $form->isValid()) {
// encode the plain password
$candidatureActivity->setCommentaire($form->get('commentaire')->getData());
$user = $this->security->getUser();
$candidatureActivity->setUser($user);
$candidatureActivity->setDate(new \DateTime());
$candidatureActivity->setCandidature($candidature);
$statutca = $this->statutCARepository->findOneBy([
'libelle'=> 'commenté'
]);
$candidatureActivity->setStatutCA($statutca);
$this->entityManager->persist($candidatureActivity);
$this->entityManager->flush();
// do anything else you need here, like send an email
return $this->redirectToRoute('acces_cv_candidat', ['id' => $candidature->getId()]);
}
return $this->render('cv_candidat.html.twig', [
'offres_emploi' => $offresEmplois,
'user_current' => $userCurrent,
'cv_sportif' => $cvSportif,
'diplomes' => $diplomes,
'experiences_prof' => $experiencesProfessionnelles,
'langues' => $langues,
'sports' => $sports,
'hobbies' =>$hobbies,
'candidatureActivities' => $candidaturesActivity,
'form' => $form->createView(),
]);
}
#[Route('ajouter_candidature_activity', name: 'add_candidature')]
public function ajouterCandidatureActivity(Request $request, UserPasswordHasherInterface $userPasswordHasher,
UserAuthenticatorInterface $userAuthenticator,
UserAuthenticator $authenticator,
EntityManagerInterface $entityManager): Response{
$candidatureActivity = new CandidatureActivity();
$form = $this->createForm(CandidatureActivityFormType::class, $candidatureActivity);
$form->handleRequest($request);
$offresEmplois = $this->offreEmploiRepository->findAll();
$userCurrent = $this->security->getUser();
$cvSportif = $this->cvSportifRepository->find($userCurrent->getId());
$diplomes = $cvSportif->getDiplomes();
$experiencesProfessionnelles = $cvSportif->getExperienceProfessionelles();
$langues = $cvSportif->getLangues();
$sports = $cvSportif->getSports();
return $this->renderForm('cv_candidat.html.twig', [
'form' => $form,
'user_current' => $userCurrent,
'cv_sportif' => $cvSportif,
'diplomes' => $diplomes,
'experiences_prof' => $experiencesProfessionnelles,
'langues' => $langues,
'sports' => $sports,
]);
}
#[Route('loginleader', name: 'login_leader')]
public function connexionLeader(Request $request, UserPasswordHasherInterface $userPasswordHasher,
UserAuthenticatorInterface $userAuthenticator,
UserAuthenticator $formLoginAuthenticator,
EntityManagerInterface $entityManager): Response{
$code = $request->query->get('code');
$state = $request->query->get('state');
if($code != ""){
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://idpdecathlon.oxylane.com/as/token.oauth2",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "grant_type=authorization_code&client_id=Cb975cb74efdafb9f8baed6bf914c4102963d5252&code=".$code."&redirect_uri=https://recrut.sunudecath.com/loginleader&state=recrutement",
CURLOPT_HTTPHEADER => array(
"Authorization: Basic Q2I5NzVjYjc0ZWZkYWZiOWY4YmFlZDZiZjkxNGM0MTAyOTYzZDUyNTI6U2hXV0RyRWdOWnB0c2N5V01UQWpUSFM1MTRZQUh3MHl6SUcwdnQ5anZSS3pxY3VLZGtlSWdkM3Rtd0pQVXo4dg==",
"Postman-Token: 1850f2a5-26fb-452e-b9cf-87d8e61b5c07",
"cache-control: no-cache"
),
));
$res = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
$response = json_encode(array('status'=>'0', 'message' => 'erreur lors du traitement'));
return $this->json(json_decode($response), Response::HTTP_OK);
//echo "cURL Error #:" . $err;
}else{
$resp = json_decode($res, true);
$accessToken = $resp['access_token'];
//recupération des infos du collaborateur
$curl2 = curl_init();
curl_setopt_array($curl2, array(
CURLOPT_URL => "https://idpdecathlon.oxylane.com/idp/userinfo.openid",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "",
CURLOPT_HTTPHEADER => array(
"Authorization: Bearer ".$accessToken,
"Postman-Token: 1850f2a5-26fb-452e-b9cf-87d8e61b5c07",
"cache-control: no-cache"
),
));
$res2 = curl_exec($curl2);
$err2 = curl_error($curl2);
curl_close($curl2);
if ($err2) {
$response = json_encode(array('status'=>'0', 'message' => 'erreur lors du traitement'));
return $this->json(json_decode($response), Response::HTTP_OK);
}else{
$response = json_encode(array('status'=>'1', 'message' => 'Tout se passe bien', 'datas'=>json_decode($res2)));
$datas = json_decode($response)->datas;
$leader = $this->leaderRepository->findOneBy([
'email' => $datas->mail
]);
if ($leader == null){
return $this->renderForm('connexion_leader.html.twig', [
]);
}
else{
$user = $this->userRepository->findOneBy([
'email' => $datas->mail
]);
if ($user == null){
$userCon = new User();
$userCon->setEmail($datas->mail);
$userCon->setPassword($userPasswordHasher->hashPassword($userCon, 'password'));
$userCon->setUid($datas->uid);
$userCon->setVisibility(1);
$userCon->setRoles(["ROLE_ADMIN"]);
$userCon->setNom($datas->familyName);
$userCon->setPrenom($datas->givenName);
$this->entityManager->persist($userCon);
$this->entityManager->flush();
$userAuthenticator->authenticateUser($userCon, $formLoginAuthenticator, $request);
$offresEmplois = $this->offreEmploiRepository->findAll();
$userCurrent = $this->security->getUser();
return $userAuthenticator->authenticateUser(
$userCon,
$formLoginAuthenticator,
$request);
}
else {
$userCon = new User();
$userCon->setEmail($datas->mail);
$userCon->setPassword($userPasswordHasher->hashPassword($userCon, 'password'));
$userAuthenticator->authenticateUser($userCon, $formLoginAuthenticator, $request);
$offresEmplois = $this->offreEmploiRepository->findAll();
$userCurrent = $this->security->getUser();
return $userAuthenticator->authenticateUser(
$user,
$formLoginAuthenticator,
$request);
}
}
return $this->json(json_decode($response), Response::HTTP_OK);
}
}
}else{
$response = json_encode(array('status'=>'0', 'message' => 'code manquant'));
}
return $this->renderForm('connexion_leader.html.twig', [
]);
}
#[Route('fedredirect', name: 'redirect_fed')]
public function getRedirectionFed(Request $request): Response
{
return $this->renderForm('connexion_leader.html.twig', [
]);
}
#[Route('ajouter_leader', name: 'add_leader')]
public function ajouterLeader(Request $request)
{
$email = $request->request->get('email');
$leader = new Leader();
$leader->setEmail($email);
$this->entityManager->persist($leader);
$this->entityManager->flush();
return $this->redirectToRoute('acces_espace_leader');
}
}