src/Controller/OffreEmploiController.php line 191

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * Copyright (C) Office National de Publication et de Communication - All Rights Reserved
  5.  *
  6.  * Unauthorized copying of this file, via any medium is strictly prohibited by law
  7.  * This file is proprietary and confidential
  8.  */
  9. namespace App\Controller;
  10. use Swift_Mailer;
  11. use App\Entity\Ville;
  12. use App\Entity\Region;
  13. use App\Service\Slugify;
  14. use App\Entity\Departement;
  15. use App\Entity\OffreEmploi;
  16. use App\Entity\Utilisateur;
  17. use App\Service\PathBuilder;
  18. use App\Common\LieuInterface;
  19. use App\Entity\Etablissement;
  20. use App\Service\UserTransient;
  21. use App\Entity\OffreEmploiProfil;
  22. use App\Service\OffreEmploiUnread;
  23. use App\Service\MailMessageFactory;
  24. use App\Entity\OffreEmploiCandidature;
  25. use App\Form\OffreEmploiCandidatureType;
  26. use App\Repository\OffreEmploiRepository;
  27. use App\Controller\Helper\CandidatureTrait;
  28. use Knp\Component\Pager\PaginatorInterface;
  29. use Symfony\Component\HttpFoundation\Request;
  30. use Symfony\Component\HttpFoundation\Response;
  31. use Symfony\Component\Routing\Annotation\Route;
  32. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  33. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  34. final class OffreEmploiController extends AbstractController
  35. {
  36.     use CandidatureTrait;
  37.     private const LIMIT 2// Nbre d'offres à afficher dans l'onglet du header
  38.     private const PER_PAGE 30;
  39.     /** @var PaginatorInterface */
  40.     private $paginator;
  41.     /** @var OffreEmploiUnread */
  42.     private $offreEmploiNonLu;
  43.     /** @var UserTransient */
  44.     private $transient;
  45.     /** @var Swift_Mailer */
  46.     private $mailer;
  47.     /** @var MailMessageFactory */
  48.     private $mailMessageFactory;
  49.     /** @var PathBuilder */
  50.     private $pathBuilder;
  51.     /**
  52.      * @var Slugify
  53.      */
  54.     private $slugify;
  55.     public function __construct(
  56.         PaginatorInterface $paginator,
  57.         OffreEmploiUnread $offreEmploiNonLu,
  58.         UserTransient $transient,
  59.         Swift_Mailer $mailer,
  60.         MailMessageFactory $mailMessageFactory,
  61.         PathBuilder $pathBuilder,
  62.         Slugify $slugify
  63.     ) {
  64.         $this->paginator $paginator;
  65.         $this->offreEmploiNonLu $offreEmploiNonLu;
  66.         $this->transient $transient;
  67.         $this->mailer $mailer;
  68.         $this->mailMessageFactory $mailMessageFactory;
  69.         $this->pathBuilder $pathBuilder;
  70.         $this->slugify $slugify;
  71.     }
  72.     /**
  73.      * @Route("/emplois", 
  74.      *      name="offre-emploi-root")
  75.      * @Route("/emplois/offre_emplois/{lieu}/{id}", 
  76.      *      name="offre-emploi-liste", defaults={"id": null, "lieu":"default"}, methods={"GET", "POST"})
  77.      * @Route("/emplois/{lieu}/{id}", 
  78.      *      name="offre-emploi-liste-old-2", defaults={"id": null, "lieu":"default"}, methods={"GET", "POST"})
  79.      * @Route("/offre-emploi/liste/{id}", 
  80.      *      name="offre-emploi-liste-old", defaults={"id": null}, methods={"GET"})
  81.      */
  82.     public function list(Request $request, ?Etablissement $etablissement, ?string $idstring $lieu null): Response
  83.     {
  84.         if (!$etablissement && $id) {
  85.             return $this->redirectToRoute('offre-emploi-root', [], 301);
  86.         }
  87.         $currentRoute $request->attributes->get('_route');
  88.         if ('offre-emploi-root' != $currentRoute) {
  89.             return $this->redirectToRoute('offre-emploi-root', [], 301);
  90.         }
  91.         if ($lieu != null)
  92.             return $this->redirectToRoute('offre-emploi-root', [], 301);
  93.         $profils_list $this->getDoctrine()->getRepository(OffreEmploiProfil::class)->findAllHavingJobs();
  94.         $profils $request->query->get('profil');
  95.         $currentURL $request->getPathInfo();
  96.         if ('default' != $lieu) {
  97.             $currentURL explode('/'$currentURL);
  98.             array_pop($currentURL);
  99.             $currentURL implode('/'$currentURL);
  100.         }
  101.         $types = [];
  102.         $ecole = [];
  103.         $college = [];
  104.         $lycee = [];
  105.         $professionnel = [];
  106.         $superieur = [];
  107.         $niveaux $request->query->get('niveau');
  108.         $robots_tag null;
  109.         if (isset($profils) || isset($niveaux))
  110.             $robots_tag "noindex, follow";
  111.         if ($niveaux) {
  112.             if (in_array('ecole'$niveaux)) {
  113.                 $ecole = ['02-ELEM''03-PRIM''01-MATER'];
  114.             }
  115.             if (in_array('college'$niveaux)) {
  116.                 $college = ['04-COLL'];
  117.             }
  118.             if (in_array('lycee'$niveaux)) {
  119.                 $lycee = ['05-LGEN''06-LTECH''07-LEGT'];
  120.             }
  121.             if (in_array('professionnel'$niveaux)) {
  122.                 $professionnel = ['08-LAGRI''09-LPROF''10-LEAP'];
  123.             }
  124.             if (in_array('superieur'$niveaux)) {
  125.                 $superieur = ['12-SUP'];
  126.             }
  127.             $types array_merge($ecole$college$lycee$professionnel$superieur);
  128.         }
  129.         $regions $departements $villes null;
  130.         /** @var OffreEmploiRepository $repository */
  131.         $repository $this->getDoctrine()->getRepository(OffreEmploi::class);
  132.         $queryBuilder $repository
  133.             ->createQueryBuilder('o')
  134.             ->orderBy('o.dateActualisation''DESC')
  135.             ->innerJoin('o.etablissement''e')
  136.             ->innerJoin('e.ville''v');
  137.         // Filter les offre valides
  138.         $repository->filterQueryWithValidOnly('o'$queryBuilder);
  139.         // Filtre par libellé
  140.         if ($profils) {
  141.             $queryBuilder
  142.                   ->andWhere($queryBuilder->expr()->in('o.profil'$profils));
  143.         }
  144.         
  145.         // Filtre par établissement
  146.         if ($etablissement) {
  147.             $queryBuilder
  148.                 ->andWhere($queryBuilder->expr()->eq('o.etablissement'':etablissement'))
  149.                 ->setParameter('etablissement'$etablissement);
  150.         }
  151.         // Filtre par niveau
  152.         if ($types) {
  153.             $queryBuilder
  154.                 ->andWhere($queryBuilder->expr()->in('e.type'$types));
  155.         }
  156.         $offres $this->paginator->paginate(
  157.             $queryBuilder->getQuery(),
  158.             $request->query->getInt('page'1),
  159.             self::PER_PAGE
  160.         );
  161.         $page $request->query->getInt('page');
  162.         if ($page $offres->getPageCount() || == $page) {
  163.             return $this->redirectToRoute('offre-emploi-root', [], 301);
  164.         }
  165.         return $this->render('offre-emploi/list.html.twig', [
  166.             'lieu' => $lieu,
  167.             'etablissement' => $etablissement,
  168.             'offres' => $offres,
  169.             'regions' => $regions,
  170.             'departements' => $departements,
  171.             'villes' => $villes,
  172.             'niveaux' => $niveaux,
  173.             'profils_list' => $profils_list,
  174.             'currentURL' => $currentURL,
  175.             'profils' => $profils,
  176.             'robots_tag' => $robots_tag,
  177.         ]);
  178.     }
  179.     /**
  180.      * @Route("/offre-emploi/fiche/{id}", name="offre-emploi", methods={"GET", "POST"})
  181.      */
  182.     //  * @Cache(
  183.     //  *     lastModified="offre.getDateActualisation()",
  184.     //  *     ETag="'OffreEmploi' ~ offre.getId() ~ offre.getDateActualisation().getTimestamp()",
  185.     //  *     expires="+5 minutes",
  186.     //  *     public=false
  187.     //  * )
  188.     public function fiche(Request $requestOffreEmploi $offre null): Response
  189.     {
  190.         if (null == $offre) {
  191.             $this->addFlash('success'"L'offre d'emploi a expirée ou a été supprimée !");
  192.             return $this->redirectToRoute('offre-emploi-root', [], 301);
  193.         }
  194.         if (!$offre->isValid()) {
  195.             $this->addFlash('success'"L'offre d'emploi a expirée.");
  196.             $etablissement $offre->getEtablissement();
  197.             if ($etablissement) {
  198.                 return $this->redirect(
  199.                     $this->pathBuilder->buildFiche($etablissement),
  200.                     Response::HTTP_MOVED_PERMANENTLY
  201.                 );
  202.             }
  203.             return $this->redirectToRoute('offre-emploi-root', [], 301);
  204.         }
  205.         $candidature = new OffreEmploiCandidature();
  206.         $form $this->createForm(OffreEmploiCandidatureType::class, $candidature);
  207.         $form->get('libelle')->setData($offre->getProfil().' '.$offre->getContrat());
  208.         $form->remove('libelle');
  209.         // Retablis valeurs
  210.         $form->get('civilite')->setData($this->transient->get(UserTransient::CIVILITE));
  211.         $form->get('nom')->setData($this->transient->get(UserTransient::NOM));
  212.         $form->get('prenom')->setData($this->transient->get(UserTransient::PRENOM));
  213.         $form->get('telephone')->setData($this->transient->get(UserTransient::TELEPHONE));
  214.         $form->get('email')->setData($this->transient->get(UserTransient::EMAIL));
  215.         $idLast $this->transient->get(UserTransient::OFFRE_EMPLOI_CANDIDATURE);
  216.         /** @var OffreEmploiCandidature $last */
  217.         $last $idLast $this->getDoctrine()->getRepository(OffreEmploiCandidature::class)->find($idLast) : null;
  218.         if ($last) {
  219.             $form->get('adresse')->setData($last->getAdresse());
  220.             $form->get('codePostal')->setData($last->getCodePostal());
  221.             $form->get('ville')->setData($last->getVille());
  222.             $form->get('commentaire')->setData($last->getCommentaire());
  223.         }
  224.         $form->handleRequest($request);
  225.         if ($form->isSubmitted() && $form->isValid() && empty($form->get("email2")->getData())) {
  226.             $candidature->setOffreEmploi($offre);
  227.             $this->persisteCandidature($candidature);
  228.             $this->sendCandidatureEmail($candidature);
  229.             $this->addFlash('success''Votre candidature a été envoyée');
  230.             $this->saveCandidatureTransientData($candidature);
  231.             return $this->redirectToRoute(
  232.                 'offre-emploi',
  233.                 ['id' => $offre->getId()],
  234.                 Response::HTTP_FOUND
  235.             );
  236.         }
  237.         $this->offreEmploiNonLu->markAsRead($offre);
  238.         return $this->render('offre-emploi/fiche.html.twig', [
  239.             'urlCanonical' => $offre->getUrl(),
  240.             'offre' => $offre,
  241.             'form' => $form->createView(),
  242.             'lieu' => $offre->getEtablissement()->getVille(),
  243.         ]);
  244.     }
  245.     /**
  246.      * @Route(
  247.      *     "/offre-emploi/header",
  248.      *     name="offre-emploi-header",
  249.      *     methods={"GET"}
  250.      * )
  251.      * @Cache(expires="+1 minutes")
  252.      */
  253.     public function headerList(LieuInterface $lieu null): Response
  254.     {
  255.         // Afficher les 2 derniers items en se basant sur la géoloc, on cherche dans ville sinon on monte plus haut
  256.         $items null;
  257.         // dump($lieu);
  258.         if ($lieu and $lieu->getSlug() != "default") {
  259.             $items $this->getDoctrine()->getRepository(OffreEmploi::class)->findByLieu($lieu);
  260.             // dump($items);
  261.             if ($lieu instanceof Ville && count($items) <= 1) {
  262.                 $lieu $lieu->getDepartement();
  263.                 $items $this->getDoctrine()->getRepository(OffreEmploi::class)->findByLieu($lieu);
  264.                 // dump($items);
  265.                 if (count($items) <= 1) {
  266.                     $lieu $lieu->getRegion();
  267.                     $items $this->getDoctrine()->getRepository(OffreEmploi::class)->findByLieu($lieu);
  268.                     // dump($items);
  269.                 }
  270.             } elseif ($lieu instanceof Departement && count($items) <= 1) {
  271.                 $lieu $lieu->getRegion();
  272.                 $items $this->getDoctrine()->getRepository(OffreEmploi::class)->findByLieu($lieu);
  273.                 // dump($items);
  274.             } elseif(count($items) <= 1) { // région
  275.                 $items $this->getDoctrine()->getRepository(OffreEmploi::class)->findByLieu($lieu);
  276.                 // dump($items);
  277.             }
  278.         }
  279.         if (empty($items)) { // toutes les items
  280.             $items $this->getDoctrine()->getRepository(OffreEmploi::class)->findBy(
  281.                 [],
  282.                 ['dateCreation' => 'DESC'],
  283.                 self::LIMIT
  284.             );
  285.             // dump($items);
  286.         
  287.         return $this->render('offre-emploi/dropdown.html.twig', [
  288.             'offres' => $items,
  289.         ]);        
  290.     }
  291.     /**
  292.      * Renvoi la liste (tableau) de destinataires Emploi, par défaut (si aucun argument) toutes les @ du module contact 
  293.      * 
  294.      * @param string $role renvoyer uniquement les @ ayant le role indiqué, éventuellement si c'est un responsable, on se limite à ceux ayant accepté leur @ comme défaut
  295.      * @param bool $forceResponsable ignorer le dernier pt du param précédent : c-a-d on ignore si le responsable a décoché son adr en tant que destinataire par défaut
  296.      */
  297.     private function getDestinatairesCandidature($etablissementstring $role nullbool $forceResponsable null)
  298.     {
  299.         $etabs = [];
  300.         $emails = [];
  301.         $responsables $this->getDoctrine()
  302.             ->getRepository(Utilisateur::class)
  303.             ->findResponsablesByEtablissement($etablissement);
  304.         foreach ($responsables as $responsable) {
  305.             $etabs $responsable->getEtablissementsResponsable();
  306.         }
  307.         $responsables $this->getDoctrine()
  308.             ->getRepository(Utilisateur::class)
  309.             ->findResponsablesByEtablissements($etabs);                                         
  310.         foreach ($responsables as $responsable) {
  311.             if ( 
  312.                 (!$role || $role == "ROLE_RESPONSABLE_ETABLISSEMENT") and 
  313.                 $responsable->hasRole('ROLE_RESPONSABLE_ETABLISSEMENT') and 
  314.                 ($forceResponsable or $responsable->isMailCandidatureOffreEmploi())
  315.             ) {
  316.                 $emails[] = $responsable->getEmail();
  317.             }
  318.             if (
  319.                 (!$role || $role == "ROLE_EMPLOI") and 
  320.                 $responsable->hasRole('ROLE_EMPLOI')
  321.             ) {
  322.                 $emails[] = $responsable->getEmail();
  323.             }
  324.         }
  325.         return !empty($emails) ? $emails null;
  326.     }    
  327. }