src/Controller/FicheController.php line 136

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 DateTime;
  11. use Swift_Mailer;
  12. use App\Entity\JPO;
  13. use App\Entity\Trace;
  14. use Twig\Environment;
  15. use App\Service\Tools;
  16. use App\Service\Slugify;
  17. use App\Service\Traceur;
  18. use App\Entity\QuoiMotCle;
  19. use App\Entity\Utilisateur;
  20. use App\Service\Historique;
  21. use Detection\MobileDetect;
  22. use App\Service\PathBuilder;
  23. use App\Elasticsearch\Moteur;
  24. use App\Entity\Etablissement;
  25. use App\Entity\FicheProspect;
  26. use App\Entity\ItemsInsertion;
  27. use App\Service\UserTransient;
  28. use App\Elasticsearch\Contexte;
  29. use App\Form\FicheProspectType;
  30. use App\Elasticsearch\Parametres;
  31. use App\Entity\DemandeInformation;
  32. use App\Entity\TexteReferencement;
  33. use App\Service\MailMessageFactory;
  34. use App\Entity\DonneeComplementaire;
  35. use App\Form\DemandeInformationType;
  36. use Doctrine\Persistence\ManagerRegistry;
  37. use App\Entity\DemandeInformationBlacklist;
  38. use Symfony\Component\HttpFoundation\Request;
  39. use Symfony\Component\HttpFoundation\Response;
  40. use Symfony\Component\Routing\Annotation\Route;
  41. use Symfony\Component\HttpFoundation\Session\Session;
  42. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  43. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  44. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  45. final class FicheController extends AbstractController
  46. {
  47.     private const MAX_RECOMMANDATION 6;   // Pour les non-participants
  48.     private const MAX_RECOMMANDATION_PARTICIPANT 8;
  49.     /** @var Slugify */
  50.     private $slugify;
  51.     /** @var Moteur */
  52.     private $moteur;
  53.     /** @var Historique */
  54.     private $historique;
  55.     /** @var Traceur */
  56.     private $traceur;
  57.     /** @var PathBuilder */
  58.     private $pathBuilder;
  59.     /** @var Swift_Mailer */
  60.     private $mailer;
  61.     /** @var MailMessageFactory */
  62.     private $mailMessageFactory;
  63.     /** @var UserTransient */
  64.     private $userTransient;
  65.     /**
  66.      * @var Environment
  67.      */
  68.     private $twig;  
  69.     
  70.     private ManagerRegistry $doctrine;
  71.     public function __construct(
  72.         Slugify $slugify,
  73.         Moteur $moteur,
  74.         Historique $historique,
  75.         Traceur $traceur,
  76.         PathBuilder $pathBuilder,
  77.         Swift_Mailer $mailer,
  78.         MailMessageFactory $mailMessageFactory,
  79.         UserTransient $userTransient,
  80.         Environment $twig,
  81.         ManagerRegistry $doctrine
  82.     ) {
  83.         $this->slugify $slugify;
  84.         $this->moteur $moteur;
  85.         $this->historique $historique;
  86.         $this->traceur $traceur;
  87.         $this->pathBuilder $pathBuilder;
  88.         $this->mailer $mailer;
  89.         $this->mailMessageFactory $mailMessageFactory;
  90.         $this->userTransient $userTransient;
  91.         $this->twig $twig;
  92.         $this->doctrine $doctrine;
  93.     }
  94.     /**
  95.      * @Route("/fiche-organisme/{id}", name="fiche-organisme",methods={"GET", "POST"}, requirements={"id"="^[A-Za-z0-9-]*$"})
  96.      * @Route("/fiche-fournisseur/{id}", name="fiche-fournisseur",methods={"GET", "POST"}, requirements={"id"="^[A-Za-z0-9-]*$"})
  97.      * @Route("/fiche/{slug}/{id}", name="fiche", methods={"GET", "POST"}, requirements={"id"="^[A-Za-z0-9-]*$"})
  98.      * @Route("/fiche/{slug}/{id}/internats", name="fiche-internat", methods={"GET", "POST"}, requirements={"id"="^[A-Za-z0-9-]*$"})
  99.      * @Route("/fiche/{id}", methods={"GET", "POST"}, requirements={"id"="^[A-Za-z0-9-]*$"})
  100.      * @Cache(
  101.      *     lastModified="etablissement ? etablissement.getDateDerniereModification() : null",
  102.      *     ETag="'Fiche' ~ (etablissement ? etablissement.getId() ~ etablissement.getDateDerniereModification().getTimestamp() : '')",
  103.      *     expires="+5 minutes",
  104.      *     public=false
  105.      * )
  106.      */
  107.     public function index(Request $request, ?Etablissement $etablissement): Response
  108.     {
  109.         //
  110.         // N'affiche pas établissement supprimé
  111.         //
  112.         if (!$etablissement || !$etablissement->isActif()) {
  113.             return $this->redirectToRoute('homepage', [], 301);
  114.         }
  115.         //
  116.         // Canonical URL
  117.         //
  118.         $urlCanonical null;
  119.         $path $this->pathBuilder->buildFiche($etablissement);
  120.         if ($request->getPathInfo() !== $path || \count($request->query)) {
  121.             $urlCanonical $this->pathBuilder->buildFiche($etablissement, [], UrlGeneratorInterface::ABSOLUTE_URL);
  122.         }
  123.         //
  124.         // Force l'établissement avoir un texte référencement
  125.         //
  126.         $repositoryTexteReferencement $this->getDoctrine()->getRepository(TexteReferencement::class);
  127.         $repositoryTexteReferencement->assureEtablissementDetientTexte($etablissementtrue);
  128.         //$quoi = new QuoiMotCle( $etablissement->getType() );
  129.         $quoi = new QuoiMotCle( \App\Service\Tools::typeEtablissement2MotCle$etablissement->getType() ) );
  130.         $lieu $etablissement->getVille();
  131.         //
  132.         // Cherche les établissements à proximité (recommendations)
  133.         //
  134.         $proches = [];
  135.         if ($quoi && $lieu) {
  136.             $paramsProches = new Parametres();
  137.             $paramsProches->setQuoiLieu($quoi$lieu);
  138.             $paramsProches->pageActuele 1;
  139.             $paramsProches->maxParPage $etablissement->isParticipant() ? static::MAX_RECOMMANDATION_PARTICIPANT : static::MAX_RECOMMANDATION;
  140.             $paramsProches->etablissementsExclues = [$etablissement->getId()];
  141.             $proches $this->moteur->cherche($paramsProches);
  142.         }
  143.         //
  144.         // Contexte de recherche
  145.         //
  146.         $precedent null;
  147.         $suivant null;
  148.         $contexte $this->userTransient->get(UserTransient::CONTEXTE_RECHERCHE);
  149.         $isContextValid =
  150.             $contexte instanceof Contexte &&
  151.             $contexte->hasEstablishment($etablissement);
  152.         $isQuoiLieuValid =
  153.             $quoi && $quoi->getSlug() &&
  154.             $lieu && $lieu->getSlug();
  155.         if (!$isContextValid && $isQuoiLieuValid) {
  156.             $paramsContexte = new Parametres();
  157.             $paramsContexte->setQuoiLieu($quoi$lieu);
  158.             $this->moteur->count($paramsContexte); // pour éteindre si necessaire
  159.             $contexte $this->moteur->createContext($paramsContexte);
  160.             $this->userTransient->set(UserTransient::CONTEXTE_RECHERCHE$contexte);
  161.         }
  162.         if ($contexte instanceof Contexte) {
  163.             list($precedent$suivant) = $contexte->getBounds($etablissement);
  164.             $repository $this->getDoctrine()->getRepository(Etablissement::class);
  165.             if ($precedent) {
  166.                 $precedent $repository->find($precedent);
  167.             }
  168.             if ($suivant) {
  169.                 $suivant $repository->find($suivant);
  170.             }
  171.         }
  172.         //recupère les insertions
  173.         // TODO : trop de requêtes SQL sur une meme table (ItemsInsertion) !! Il faut optimiser ce bloc
  174.         $items $this->getDoctrine()->getRepository(ItemsInsertion::class)->findBy([ 'etablissement' => $etablissement->getId() ], ['tri' => 'ASC']);
  175.         $formations = [];
  176.         $presentation = [];
  177.         $specificites = [];
  178.         $accueil = [];
  179.         $activites = [];
  180.         $hebergement = [];
  181.         $accompagnement = [];
  182.         $equipement = [];
  183.         $infos = [];
  184.         $classes= [];
  185.         $complement = [];
  186.         $tarifs = [];
  187.         $langues = [];
  188.         $prices = [];
  189.         foreach ($items as $item) {
  190.             if ( $item->getOnglet() == 'Formations' )
  191.                 $formations[] = $item;
  192.             if ( $item->getOnglet() == 'Présentation' )
  193.                 $presentation[] = $item;
  194.             if ( $item->getOnglet() == 'Spécificités' )
  195.                 $specificites[] = $item;
  196.             if ( $item->getOnglet() == 'Accueil/accès' )
  197.                 $accueil[] = $item;
  198.             if ( $item->getOnglet() == 'Activité(s) périscolaire(s)' )
  199.                 $activites[] = $item;
  200.             if ( $item->getOnglet() == 'Hébergement' )
  201.                 $hebergement[] = $item;
  202.             if ( $item->getOnglet() == 'Accompagnement scolaire' )
  203.                 $accompagnement[] = $item;
  204.             if ( $item->getOnglet() == 'Équipements complémentaires' )
  205.                 $equipement[] = $item;
  206.             if ( $item->getOnglet() == 'Informations pratiques' )
  207.                 $infos[] = $item;
  208.             if ( $item->getOnglet() == 'Classes' )
  209.                 $classes[] = $item;
  210.             if ( $item->getOnglet() == 'COMPLEMENT' )
  211.                 $complement[] = $item;
  212.             if ( $item->getOnglet() == 'Tarifs' )
  213.                 $tarifs[] = $item;
  214.             if ( $item->getOnglet() == 'Langues' )
  215.                 $langues[] = $item;
  216.             // if ( strpos($item->getIdentifiant(), 'ECOLE-TARIFS-') )
  217.             // if ( strtolower($item->getOnglet()) == strtolower('Frais de scolarité') )
  218.             if ( $item->getOnglet() == 'Frais de scolarité' )
  219.                 $prices[] = $item;
  220.         }
  221.         //
  222.         // Met à jour le historique
  223.         //
  224.         $this->historique->addFiche($etablissement);
  225.         //
  226.         // Enregistre les traces
  227.         //
  228.         $this->traceur->add(Trace::FICHE$etablissement);
  229.         $this->traceur->add(Trace::RECOMMANDATION$proches);
  230.         $this->traceur->add(Trace::RECOMMANDATION, [$precedent$suivant]);
  231.         //
  232.         // Retrouver le lien vers la page précédente
  233.         // Si on arrive depuis une page de liste on récupère la var de session, sinon on construit une URL générique
  234.         // la plus simple possible et qui est un des lien de l'onglet (en partant sur les données de la fiche en cours : type et/ou ville|dpt|region)
  235.         //
  236.         $session = new Session();
  237.         if ($session->has('ROUTE_ANNUAIRE'))
  238.             $urlPagePrecedente $session->get('ROUTE_ANNUAIRE');
  239.         else {
  240.             $urlPagePrecedente $this->pathBuilder->buildDefaultPath($etablissement);
  241.         }
  242.         // La toute première JPO à venir
  243.         $jpo $this->getDoctrine()->getRepository(JPO::class)->getLastByEtablissement($etablissement1);
  244.         if (!empty($jpo))
  245.             $jpo $jpo[0];
  246.         // Liste JPO à venir
  247.         $jpoListe = [];
  248.         $now = new DateTime('NOW');
  249.         if(count($etablissement->getJPOs()) > 0){
  250.             foreach ($etablissement->getJPOs() as $item){
  251.                 if($item->getDate() > $now ){
  252.                     $jpoListe[] = $item;
  253.                 }
  254.             }
  255.         }
  256.         // Template texte SEO - aléatoire entre 1 et 2
  257.         $type $etablissement->getTypeClient() == "internat" "internat" Tools::typeEtablissement($etablissement->getType());
  258.         if ($type == "" || $type == null)
  259.             $type "default";  // On ne sait jamais ...
  260.         $number crc32($etablissement->getId());
  261.         $rand $number == 2;
  262.         $template $type "-" $rand;
  263.         // Récupérer les données complémentaires (pour les diplomes et les modules (accueil|présentation|Spécificité))
  264.         $dcs $this->getDoctrine()->getManager()->getRepository(DonneeComplementaire::class)->findByEtablissement($etablissement);
  265.         // Trouver l'ets/internat lié (dans le cas d'un internant autonome)
  266.         $etsLie $internatLie null;
  267.         if ($etablissement->getTypeClient() == "internat") {
  268.             $etsLie $this->getDoctrine()->getRepository(Etablissement::class)->findOneBy(
  269.                 ['internat2' => $etablissement,
  270.                 'actif' => 1]
  271.             );
  272.         } elseif ($etablissement->getTypeClient() == "établissement") {
  273.             $internatLie $etablissement->getInternat2();
  274.         }
  275.         // Savoir s'il a payé certains textes complémentairs
  276.         $moduleAccueil false;
  277.         foreach ($items as $item)
  278.             if ( $item->getOnglet() == 'Accueil/accès' && $item->getLigneSecours() == 'non' )
  279.                 $moduleAccueil true;
  280.         $modulePresentation false;
  281.         foreach ($items as $item)
  282.             if ( $item->getOnglet() == 'Présentation' && $item->getLigneSecours() == 'non' )
  283.                 $modulePresentation true;
  284.         $moduleSpecificite false;
  285.         foreach ($items as $item)
  286.             if ( $item->getOnglet() == 'Spécificités' && $item->getLigneSecours() == 'non' )
  287.                 $moduleSpecificite true;
  288.         // Texte de présentation spéciali lycée-pro (dans les items) - Exp : et057-55
  289.         
  290.         $textePresentation null;
  291.         if ( $etablissement->isClient() ) {
  292.             $textePresentation =  $this->getDoctrine()->getRepository(ItemsInsertion::class)->findOneBy([ 'etablissement' => $etablissement->getId(), 'identifiant' => 'LYCPRO-PRESLIBRE-TXTS_IS']);
  293.             if ($textePresentation)
  294.                 $textePresentation $textePresentation->getTexte();            
  295.         }
  296.         // Formlaire INLINE de contact
  297.         $demande $this->createDemande();
  298.         $demande->setEtablissement($etablissement);
  299.         // Get route params
  300.         $routeParams $request->attributes->get('_route_params');
  301.         if (isset($routeParams['slug']) && isset($routeParams['id'])) {
  302.             $form $this->createForm(DemandeInformationType::class, $demande, [
  303.                 /*
  304.                 Pb : on arrive sur la fiche depuis "contacter etab" de la liste, ça fait un smoothscroll vers le form
  305.                 on submit le form : le hash est gardé et on scroll de nv ver sle form, et on zappe le flash en haut !
  306.                 Solution : focer le form à regénérer l'url de submit, il ne prend plus celle en cours
  307.                 */
  308.                 'action' => $this->generateUrl('fiche', ['slug' => $routeParams['slug'], 'id' => $routeParams['id']]),
  309.             ]);
  310.         } else {
  311.             $form $this->createForm(DemandeInformationType::class, $demande);
  312.         }
  313.         $form->handleRequest($request);
  314.         $diEnvoyee false;
  315.         if ($form->isSubmitted() && $form->isValid() && empty($form->get("email2")->getData())) {
  316.             // Vérifier si le gars est blacklisté en global ou seulement pour l'étab en cours
  317.             $email $demande->getInterlocuteurEmail();
  318.             $etabbId $etablissement->getId();
  319.             $n1 $this->doctrine->getRepository(DemandeInformationBlacklist::class)->getCountByEmail($email$etabbId);
  320.             $n2 $this->doctrine->getRepository(DemandeInformationBlacklist::class)->getCountByEmail($email);
  321.             $bypass false;
  322.             if ($n1 || $n2 >= 3) {
  323.                 $this->addFlash('success'"Votre demande d'information a été envoyée !");
  324.                 $bypass true;
  325.             }
  326.             // Persiste dans la base de données
  327.             if (!$bypass) {
  328.                 $entityManager $this->getDoctrine()->getManager();
  329.                 $demande->setProfil("");
  330.                 $demande->setNiveau([Tools::typeEtablissement($etablissement->getType())]);
  331.                 
  332.                 $detect = new MobileDetect();
  333.                 $device $detect->isMobile() ? 'mobile' : ($detect->isTablet() ? 'tablet' 'desktop');
  334.                 $demande->setSujet($device);
  335.                 $demande->setDate(new \DateTime()); // Forcer la maj de la date, sinon on aura tjr la meme !!!!
  336.                 $entityManager->persist($demande);
  337.                 $entityManager->flush();
  338.                 $etab $demande->getEtablissement();
  339.                 $salt $_SERVER['APP_SECRET'];
  340.                 $hashedDemandeId md5($demande->getId() . $salt);
  341.                 $html $this->twig->render('emails/demande-information.html.twig', ['demande' => $demande'hashedDemandeId' => $hashedDemandeId]);
  342.                 $plain $this->twig->render('emails/demande-information.txt.twig', ['demande' => $demande'hashedDemandeId' => $hashedDemandeId]);
  343.                 $plain str_replace("\n""\r\n"$plain);
  344.                 $tempTo 
  345.                     $this->getDestinatairesDemandeInformation($etab'ROLE_CONTACT_ADMISSION') ?? 
  346.                     $etab->getEmailPrincipal() ??
  347.                     $this->getDestinatairesDemandeInformation($etab'ROLE_RESPONSABLE_ETABLISSEMENT'true) ;
  348.                 $mail $this
  349.                     ->mailMessageFactory
  350.                     ->create()
  351.                     ->setSubject("Demande d'information")
  352.                     // Envoyer dans l'ordre au(x) contact(s) di, sinon au mail principale sinon au(x) responsable(s) étabs, même ci ce dernier a décoché son @ en tant que destinataire par défaut des Di (depuis son espace étab > gestion des mails > 1er bloc > icône enveloppe )
  353.                     ->setTo(
  354.                         $tempTo
  355.                     )
  356.                     ->setReplyTo($demande->getInterlocuteurEmail(), $demande->getInterlocuteurNom())
  357.                     ->setBody($html'text/html')
  358.                     ->addPart($plain'text/plain');
  359.                 $this->mailer->send($mail);
  360.                 // Garde la demande pour être réutilisé pour une prochaine fois
  361.                 $this->userTransient->set(UserTransient::DEMANDE_INFORMATION$demande->getId());
  362.                 $this->addFlash('success'"Votre demande d'information a été envoyée");
  363.                 $diEnvoyee true;
  364.             } // -- if (!$bypass)
  365.         }
  366.         // Pour utilisation Twig seulement
  367.         $typeEtab $etablissement->getType() != "" $etablissement->getType() : $etablissement->getTypeClient();
  368.         $typeEtab Tools::typeEtablissement($typeEtab);
  369.         return $this->render('fiche/index.html.twig', [
  370.             'urlCanonical' => $urlCanonical,
  371.             'etablissement' => $etablissement,
  372.             'formations' => $formations,
  373.             'presentation' => $presentation,
  374.             'langues' => $langues,
  375.             'specificites' => $specificites,
  376.             'accueil' => $accueil,
  377.             'activites' => $activites,
  378.             'prices' => $prices,
  379.             'hebergement' => $hebergement,
  380.             'accompagnement' => $accompagnement,
  381.             'equipement' => $equipement,
  382.             'infos' => $infos,
  383.             'classes' => $classes,
  384.             'etablissementsProches' => $proches,
  385.             'complement' => $complement,
  386.             'moduleAccueil'         => $moduleAccueil,
  387.             'modulePresentation'    => $modulePresentation,
  388.             'moduleSpecificite'     => $moduleSpecificite,
  389.             'contexte' => [
  390.                 'etablissement' => $etablissement,
  391.                 'quoi' => $contexte->quoi ?? null,
  392.                 'lieu' => $contexte->lieu ?? null,
  393.                 'precedent' => $precedent,
  394.                 'suivant' => $suivant,
  395.                 'urlPagePrecedente' => $urlPagePrecedente
  396.             ],
  397.             'jpo' => $jpo,
  398.             'jpoListe' => $jpoListe,
  399.             'template' => $template,
  400.             'dc' => $dcs,   // Données complémentaires (pour les diplomes/formations)
  401.             'tarifs' => $tarifs,
  402.             'etsLie'        => $etsLie,
  403.             'internatLie'   => $internatLie,
  404.             'textePresentation' => $textePresentation,
  405.             'form' => $form->createView(),
  406.             'type_etab' => $typeEtab,
  407.             'noindex' => $etablissement->getTypeClient() == "organisme" true false,
  408.             'diEnvoyee' => $diEnvoyee
  409.         ]);
  410.     }
  411.     /**
  412.      * @Route(
  413.      *     "/montrer-telephone/{id}",
  414.      *     name="montrer-telephone",
  415.      *     condition="request.isXmlHttpRequest()",
  416.      *     methods={"POST"},
  417.      *     options = { "expose" = true }
  418.      * )
  419.      */
  420.     public function traceTelephone(Etablissement $etablissement): Response
  421.     {
  422.         $this->traceur->add(Trace::TELEPHONE$etablissement);
  423.         return new Response();
  424.     }
  425.     /**
  426.      * @Route("/completer-fiche/{id}", name="completer-fiche", methods={"GET", "POST"})
  427.      */
  428.     public function formProspect(Request $requestEtablissement $etablissement): Response
  429.     {
  430.         // Évite formulaire de prospect pour les clients
  431.         if ($etablissement->isClient()) {
  432.             return $this->redirect(
  433.                 $this->pathBuilder->buildFiche($etablissement),
  434.                 Response::HTTP_FOUND
  435.             );
  436.         }
  437.         $prospect = new FicheProspect();
  438.         $prospect->setEtablissement($etablissement);
  439.         $form $this->createForm(FicheProspectType::class, $prospect);
  440.         $form->handleRequest($request);
  441.         if ($form->isSubmitted() && $form->isValid()) {
  442.             // Enregistre offre dans la base de données
  443.             $entityManager $this->getDoctrine()->getManager();
  444.             $entityManager->persist($prospect);
  445.             $entityManager->flush();
  446.             // Envoi email
  447.             $mailHtml $this->renderView('emails/fiche-prospect.html.twig', ['prospect' => $prospect]);
  448.             $mailTxt $this->renderView('emails/fiche-prospect.txt.twig', ['prospect' => $prospect]);
  449.             $mailTo $prospect->getAutoriseContact()
  450.                 ? $to 'infos_commerciales@onpc.fr'
  451.                 $to 'infos_complementaires@onpc.fr';
  452.             $mail $this
  453.                 ->mailMessageFactory
  454.                 ->create()
  455.                 ->setSubject(sprintf('Infos complémentaires (%s)'$etablissement->getId()))
  456.                 ->setTo($mailTo)
  457.                 ->setReplyTo($prospect->getEmail(), $prospect->getResponsable())
  458.                 ->setBody($mailHtml'text/html')
  459.                 ->addPart(str_replace("\n""\r\n"$mailTxt), 'text/plain');
  460.             $this->mailer->send($mail);
  461.             $this->addFlash('success''Vos informations ont été envoyées');
  462.             return $this->redirect(
  463.                 $this->pathBuilder->buildFiche($etablissement),
  464.                 Response::HTTP_FOUND
  465.             );
  466.         }
  467.         return $this->render('fiche/completer-fiche.html.twig', [
  468.             'etablissement' => $etablissement,
  469.             'form' => $form->createView(),
  470.         ]);
  471.     }
  472.     /**
  473.      * @Route("/fiche-maj/{id}", name="fiche-maj", methods={"GET"})
  474.      */
  475.     public function maj(Etablissement $etablissement): Response
  476.     {
  477.         return new Response($etablissement->getMaj()->format('c'), Response::HTTP_OK, [
  478.             'Content-Type' => 'text/plain',
  479.             'X-Robots-Tag' => 'noindex, nofollow',
  480.         ]);
  481.     }
  482.     private function createDemande(): DemandeInformation
  483.     {
  484.         $idTransient $this->userTransient->get(UserTransient::DEMANDE_INFORMATION);
  485.         if (!$idTransient) {
  486.             return new DemandeInformation();
  487.         }
  488.         $repository $this->getDoctrine()->getRepository(DemandeInformation::class);
  489.         $transient $repository->find($idTransient);
  490.         if (!$transient) {
  491.             return new DemandeInformation();
  492.         }
  493.         return clone $transient;
  494.     }
  495.     /**
  496.      * Renvoi la liste (tableau) de destinataires DI, par défaut (si aucun argument) toutes les @ du module contact (DI et gestionnaire)
  497.      * 
  498.      * @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
  499.      * @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
  500.      */
  501.     private function getDestinatairesDemandeInformation($etablissementstring $role nullbool $forceResponsable null)
  502.     {
  503.         $etabs = [];
  504.         $emails = [];
  505.         $responsables $this->getDoctrine()
  506.             ->getRepository(Utilisateur::class)
  507.             ->findResponsablesByEtablissement($etablissement);
  508.         foreach ($responsables as $responsable) {
  509.             $etabs $responsable->getEtablissementsResponsable();
  510.         }
  511.         $responsables $this->getDoctrine()
  512.             ->getRepository(Utilisateur::class)
  513.             ->findResponsablesByEtablissements($etabs);
  514.         foreach ($responsables as $responsable) {
  515.             if ( 
  516.                 (!$role || $role == "ROLE_RESPONSABLE_ETABLISSEMENT") and 
  517.                 $responsable->hasRole('ROLE_RESPONSABLE_ETABLISSEMENT') and 
  518.                 ($forceResponsable or $responsable->isMailDemandeAdmission())
  519.             ) {
  520.                 $emails[] = $responsable->getEmail();
  521.             }
  522.             if (
  523.                 (!$role || $role == "ROLE_CONTACT_ADMISSION") and 
  524.                 $responsable->hasRole('ROLE_CONTACT_ADMISSION')
  525.             ) {
  526.                 $emails[] = $responsable->getEmail();
  527.             }
  528.         }
  529.         return !empty($emails) ? $emails null;
  530.     }
  531. }