<?php
namespace App\Controller;
use DateTime;
use App\Entity\User;
use App\Entity\Offre;
use App\Entity\Images;
use App\Entity\Demande;
use App\Form\OffreType;
use App\Data\SearchData;
use App\Entity\Comments;
use App\Data\SearchOffre;
use App\Entity\Candidature;
use App\Form\CommentsType;
use App\Entity\CommentOffre;
use App\Form\SearchFormType;
use App\Form\SearchOffreType;
use App\Form\CommentOffreType;
use App\Form\PublierDemandeType;
use App\Form\PublierDemandeType2;
use App\Repository\CandidatureRepository;
use App\Repository\UserRepository;
use App\Repository\OffreRepository;
use App\Repository\DemandeRepository;
use App\Repository\CommentsRepository;
use App\Repository\CategorieRepository;
use App\Repository\UserImageRepository;
use App\Repository\SousCategorieRepository;
use Doctrine\Persistence\ManagerRegistry;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
class HomeController extends AbstractController
{
/**
* @var MailerInterface
*/
private $mailer;
public function __construct(MailerInterface $mailer)
{
$this->mailer = $mailer;
}
/**
* @Route("/", name="home",methods={"GET", "POST"})
*/
public function index(DemandeRepository $demandeRepository, CategorieRepository $categorieRepository, UserRepository $userRepository, OffreRepository $offreRepository, SousCategorieRepository $sousCategorieRepository): Response
{
$user = $this->getUser();
if ($user) {
$demandes = $demandeRepository->findDemandeHome("DISPONIBLE");
$demandesall = $demandeRepository->findAll();
$demandesIds = $demandeRepository->findDemandeIds($user->getId());
$candidats = $userRepository->findCandidat($user->getId(), $demandesIds);
return $this->render('base.html.twig', [
'categories' => $categorieRepository->findAll(),
'souscategories' => $sousCategorieRepository->findAll(),
'candidats' => $candidats,
'demandes' => $demandes,
'demandesall' => $demandesall,
'users' => $userRepository->findAll(),
'controller_name' => 'Acceuil',
]);
} else {
$demandesall = $demandeRepository->findAll();
$demandes = $demandeRepository->findDemandeHome("DISPONIBLE");
return $this->render('base.html.twig', [
'categories' => $categorieRepository->findAll(),
'souscategories' => $sousCategorieRepository->findAll(),
'users' => $userRepository->findAll(),
'demandes' => $demandes,
'demandesall' => $demandesall,
'controller_name' => 'Acceuil',
]);
}
}
/**
* @Route("/{id}/verification", name="msgverif", methods={"GET","POST"})
*/
public function msgverif(User $user): Response
{
return $this->render('home/msgverif.html.twig', [
'user' => $user,
'controller_name' => 'Vérification',
]);
}
/**
* @IsGranted("ROLE_USER")
* @Route("/confirme_offre", name="msgconf")
*/
public function msgconf(): Response
{
return $this->render('home/msgconf.html.twig', [
'controller_name' => 'Confirme demande'
]);
}
/**
* @Route("/demande", name="demande")
*/
public function demande(DemandeRepository $demandeRepository, Request $request, PaginatorInterface $paginator): Response
{
$data = new SearchData();
$data->page = $request->get('page', 1);
$form = $this->createForm(SearchFormType::class, $data);
$form->handleRequest($request);
$user = $this->getUser();
if ($user) {
$demandes = $demandeRepository->findSearch($data, "DISPONIBLE");
$demandesDispo = $demandeRepository->findSearch2($data, "DISPONIBLE", $user->getId());
$demandesAttente = $demandeRepository->findSearch2($data, "EN_ATTENTE", $user->getId());
$demandesArchives = $demandeRepository->findSearch2($data, "HISTORIQUE", $user->getId());
$demandes = $paginator->paginate(
$demandes, // Requête contenant les données à paginer (ici nos articles)
$request->query->getInt('page', 1), // Numéro de la page en cours, passé dans l'URL, 1 si aucune page
10 // Nombre de résultats par page
);
$demandesDispo = $paginator->paginate(
$demandesDispo, // Requête contenant les données à paginer (ici nos articles)
$request->query->getInt('page', 1), // Numéro de la page en cours, passé dans l'URL, 1 si aucune page
10 // Nombre de résultats par page
);
$demandesAttente = $paginator->paginate(
$demandesAttente, // Requête contenant les données à paginer (ici nos articles)
$request->query->getInt('page', 1), // Numéro de la page en cours, passé dans l'URL, 1 si aucune page
10 // Nombre de résultats par page
);
$demandesArchives = $paginator->paginate(
$demandesArchives, // Requête contenant les données à paginer (ici nos articles)
$request->query->getInt('page', 1), // Numéro de la page en cours, passé dans l'URL, 1 si aucune page
10 // Nombre de résultats par page
);
if (!$demandesDispo || !$demandesAttente || !$demandesArchives || !$demandes) {
$this->addFlash('warning', 'Opppss!! pas d offre pour le moment .');
}
return $this->render('demande/demande.html.twig', [
'demandes' => $demandes,
'demandesDispo' => $demandesDispo,
'demandesAttente' => $demandesAttente,
'demandesArchives' => $demandesArchives,
'form' => $form->createView(),
'controller_name' => 'Demandes'
]);
} else {
$demandes = $demandeRepository->findSearch($data, "DISPONIBLE");
$demandes = $paginator->paginate(
$demandes, // Requête contenant les données à paginer (ici nos articles)
$request->query->getInt('page', 1), // Numéro de la page en cours, passé dans l'URL, 1 si aucune page
10 // Nombre de résultats par page
);
if (!$demandes) {
$this->addFlash('warning', 'Opppss!! pas d offre pour le moment');
}
return $this->render('demande/demande.html.twig', [
'demandes' => $demandes,
'form' => $form->createView(),
'controller_name' => 'Demandes'
]);
}
}
/**
* @Route("/demande/categorie/{id}", name="demande_par_categorie")
*/
public function demandeParCategorie(DemandeRepository $demandeRepository, SousCategorieRepository $sousCategorieRepository, Request $request, PaginatorInterface $paginator, $id): Response
{
$data = new SearchData();
$data->page = $request->get('page', 1);
$form = $this->createForm(SearchFormType::class, $data);
$form->handleRequest($request);
$categorie = $sousCategorieRepository->find($id);
$donnees = $demandeRepository->findSearchCat($data, "DISPONIBLE", $categorie->getId());
$demandes = $paginator->paginate(
$donnees, // Requête contenant les données à paginer (ici nos articles)
$request->query->getInt('page', 1), // Numéro de la page en cours, passé dans l'URL, 1 si aucune page
10 // Nombre de résultats par page
);
if (!$donnees) {
$this->addFlash('warning', 'Opppss!! pas d offre pour le moment');
}
return $this->render('demande/demandeCat.html.twig', [
'demandes' => $demandes,
'categorie' => $categorie,
'form' => $form->createView(),
'controller_name' => 'Demandes Par Categorie '
]);
}
/**
* @IsGranted("ROLE_EMPLOYEE")
* @Route("/demande/{id}/apply", name="job_apply" ,methods={"GET","POST"})
*/
public function apply(UserRepository $userRepository, Demande $job)
{
$user = $this->getUser();
$candidature = new Candidature();
$candidature->setDemande($job);
$candidature->setUser($user);
$candidature->setEtat("EN_ATTENTE");
$job->addCandidature($candidature);
$em = $this->getDoctrine()->getManager();
$em->persist($job);
$em->persist($candidature);
$em->flush();
$em = "jobeasy987@gmail.com";
$email = (new TemplatedEmail())
->from("easy.jobb2022@gmail.com")
->to($user->getEmail())
->subject('Nouvelle Candidature!')
// path of the Twig template to render
->htmlTemplate('emails/apply.html.twig')
->context([
'job' => $job,
]);
$emailRec = (new TemplatedEmail())
->from("easy.jobb2022@gmail.com")
->to($job->getUser()->getEmail())
->subject('Nouvelle Candidature !')
->htmlTemplate('emails/candidature.html.twig')
->context([
'candidat' => $user,
'job' => $job
]);
$this->mailer->send($email);
$this->mailer->send($emailRec);
$this->addFlash("success", "Candidature envoyée avec success !");
return $this->redirectToRoute('demande');
}
/**
* @IsGranted("ROLE_EMPLOYEE")
* @Route("/demande/{id}/annuler", name="job_annuler" ,methods={"GET","POST"})
*/
public function annuler(UserRepository $userRepository, DemandeRepository $demandeRepository, CandidatureRepository $candidatureRepository, $id)
{
$user = $this->getUser();
$candidature = $candidatureRepository->find($id);
$demande = $demandeRepository->find($id);
$em = $this->getDoctrine()->getManager();
$em->remove($candidature);
$em->flush();
$this->addFlash("warning", "Candidature annulée !");
return $this->redirectToRoute('mes_candidature_demande', ['id' => $user->getId()]);
}
/**
* @Route("/offres", name="offres")
*/
public function offres(OffreRepository $OffreRepository, Request $request, PaginatorInterface $paginator): Response
{
$data = new SearchOffre();
$data->page = $request->get('page', 1);
$form = $this->createForm(SearchOffreType::class, $data);
$form->handleRequest($request);
$donnees = $OffreRepository->findSearch($data, "DISPONIBLE");
$offres = $paginator->paginate(
$donnees, // Requête contenant les données à paginer (ici nos articles)
$request->query->getInt('page', 1), // Numéro de la page en cours, passé dans l'URL, 1 si aucune page
10 // Nombre de résultats par page
);
if (!$donnees) {
$this->addFlash('warning', 'Opppss!! Recherche introuvable .');
}
return $this->render('offres/offres.html.twig', [
'controller_name' => 'Offres',
'offres' => $offres,
'form' => $form->createView(),
]);
}
/**
* @IsGranted("ROLE_RECRUITER")
* @Route("/publier_demande", name="publier_demande")
*/
public function PublierDeamnde(Request $request): Response
{
$demande = new Demande();
$form = $this->createForm(PublierDemandeType::class, $demande);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$demande->setUser($this->getUser());
$demande->setEtat("DISPONIBLE");
$demande->setEpingle(false);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($demande);
$entityManager->flush();
return $this->redirectToRoute('demande');
}
return $this->render('home/publierDemande.html.twig', [
'form' => $form->createView(),
'controller_name' => 'Publier demande'
]);
}
/**
* @IsGranted("ROLE_RECRUITER")
* @Route("/supprimer_demande/{id}", name="supprimer_demande", methods={"POST"})
*/
public function supprimerDemande(DemandeRepository $demandeRepository, Request $request, $id): Response
{
$demande = $demandeRepository->find($id);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($demande);
$entityManager->flush();
$this->addFlash('success', 'Demande a été supprimé avec succès');
return $this->redirectToRoute('demande');
}
/**
* @IsGranted("ROLE_USER")
* @Route("/{id}/detail_demande", name="detail_demande", methods={"GET","POST"})
*/
public function Detail_demande(DemandeRepository $demandeRepository, Request $request, $id): Response
{
$offre = $demandeRepository->findDemandeDetails($id);
// dd($offre);
// $candidatures = $offre->getCandidatures();
// foreach ($candidatures as $candidature) {
// $id_user = $candidature->getUser()->getId();
// $array = array("$id_user");
// }
// return new JsonResponse($array);
// $user = $this->getUser();
// foreach ($candidatures as $candidature) {
// $user_id = $candidature->getUser()->getId();
// dd($user_id);
// }
$comment = new Comments();
$commentForm = $this->createForm(CommentsType::class, $comment);
$commentForm->handleRequest($request);
//traintement de formulaire
if ($commentForm->isSubmitted() && $commentForm->isValid()) {
$comment->setCreatedAt(new DateTime());
$comment->setDemandes($offre);
$comment->setUser($this->getUser());
// on récupere le contenu de champs parantid
$parentid = $commentForm->get('parentid')->getData();
//on va cherche le commentaire correspondant
$em = $this->getDoctrine()->getManager();
if ($parentid != null) {
$parent = $em->getRepository(Comments::class)->find($parentid);
}
// on définit le parent
$comment->setParent($parent ?? null);
$em->persist($comment);
$em->flush();
$this->addFlash('message', 'votre commentaire a bien été envoyé');
return $this->redirectToRoute('detail_demande', ['id' => $offre->getId()]);
}
return $this->render('demande/detail_demande.html.twig', [
'demande' => $offre,
//'img'=>$img,
'commentForm' => $commentForm->createView(),
'controller_name' => 'Détail demande'
]);
}
/**
* @IsGranted("ROLE_ADMIN")
* @Route("/confirme_demande", name="confirme_demande")
*/
public function confirme_demande(): Response
{
return $this->render('home/confirme_demande.html.twig', [
'controller_name' => 'Confirme demande'
]);
}
/**
* @IsGranted("ROLE_RECRUITER")
* @Route("/publier_offre", name="publier_offre")
*/
public function PublierOffre(Request $request): Response
{
$offre = new Offre();
$form = $this->createForm(OffreType::class, $offre);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// On récupère les images transmises
$images = $form->get('images')->getData();
// On boucle sur les images
foreach ($images as $image) {
// On génère un nouveau nom de fichier
$fichier = md5(uniqid()) . '.' . $image->guessExtension();
// On copie le fichier dans le dossier uploads en service.yaml
$image->move(
$this->getParameter('images_directory'),
$fichier
);
// On crée l'image dans la base de données
$img = new Images();
$img->setName($fichier);
$offre->addImage($img);
}
$offre->setEtat("EN_ATTENTE");
$offre->setEpingle(false);
$offre->setUser($this->getUser());
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($offre);
$entityManager->flush();
$this->addFlash('message', 'votre offres a bien été envoyé ');
return $this->redirectToRoute('offres');
}
return $this->render('home/publieroffre.html.twig', [
'form' => $form->createView(),
'controller_name' => 'Publier offre'
]);
}
/**
* @Route("/{id}/detail_offre", name="detail_offre", methods={"GET","POST"})
*/
public function Detail_Offre(OffreRepository $offreRepository, Request $request, $id, UserImageRepository $userimg): Response
{
$offre = $offreRepository->find($id);
//$user = $offre->getUser()->getId();
//$img = $userimg->findBy(['user'=>$user],['updatedAt'=>'DESC'], ['limit'=>1]);
//commentaires
$comment = new CommentOffre();
$commentForm = $this->createForm(CommentOffreType::class, $comment);
$commentForm->handleRequest($request);
//traintement de formulaire
if ($commentForm->isSubmitted() && $commentForm->isValid()) {
$comment->setCreatedAt(new DateTime());
$comment->setOffres($offre);
$comment->setUser($this->getUser());
// on récupere le contenu de champs parantid
$parentid = $commentForm->get('parentid')->getData();
//on va cherche le commentaire correspondant
$em = $this->getDoctrine()->getManager();
if ($parentid != null) {
$parent = $em->getRepository(CommentOffre::class)->find($parentid);
}
// on définit le parent
$comment->setParent($parent ?? null);
$em->persist($comment);
$em->flush();
$this->addFlash('message', 'votre commentaire a bien été envoyé');
return $this->redirectToRoute('detail_offre', ['id' => $offre->getId()]);
}
return $this->render('offres/detail_offre.html.twig', [
'offre' => $offre,
//'img'=>$img,
'commentForm' => $commentForm->createView(),
'controller_name' => 'Détail offre'
]);
}
/**
* @Route("/a-propos", name="apropos")
*/
public function Apropos(UserRepository $userRepository, OffreRepository $offreRepository, DemandeRepository $demandeRepository, CommentsRepository $commentsRepository): Response
{
return $this->render('home/apropos.html.twig', [
'controller_name' => 'A propos',
'users' => $userRepository->findAll(),
'offres' => $offreRepository->findAll(),
'comments' => $commentsRepository->findAll(),
'demandes' => $demandeRepository->findAll(),
]);
}
/**
* @Route("/registerr", name="registerr")
*/
public function registerr(Request $request)
{
return $this->render('registerr.html.twig');
}
}