src/Controller/Site/SiteController.php line 51

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Site;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\Routing\Annotation\Route;
  7. use Doctrine\Persistence\ManagerRegistry;
  8. use Symfony\Component\Mailer\MailerInterface;
  9. use Symfony\Component\Mime\Crypto\DkimSigner;
  10. use Symfony\Component\Mime\Crypto\DkimOptions;
  11. use Symfony\Component\Mime\Email;
  12. use Symfony\Component\Mime\Address;
  13. use Symfony\Component\String\Slugger\SluggerInterface;
  14. use App\Service\EvenementInfo;
  15. use App\Entity\Evenement;
  16. use App\Entity\EvenementIntervenant;
  17. use App\Entity\Inscription;
  18. use App\Entity\Contact;
  19. use App\Entity\Intervenant;
  20. use App\Entity\Message;
  21. use App\Entity\Envoi;
  22. use App\Entity\Programme;
  23. use App\Entity\Question;
  24. use App\Entity\Reponse;
  25. /**
  26.  * @Route("/", name="site_")
  27.  */
  28. class SiteController extends AbstractController
  29. {
  30.     private $doctrine;
  31.     private $mailer;
  32.     private $slugger;
  33.     public function __construct(ManagerRegistry $doctrineMailerInterface $mailerSluggerInterface $slugger)
  34.     {
  35.         $this->doctrine $doctrine;
  36.         $this->mailer $mailer;
  37.         $this->slugger $slugger;
  38.     }
  39.     /**
  40.      * @Route("", name="home")
  41.      */
  42.     public function index(): Response
  43.     {
  44.         // $evenements = $this->doctrine->getRepository(Evenement::class)->findBy(
  45.         //     [], 
  46.         //     ["date" => 'ASC'], 
  47.         //     3
  48.         // );
  49.         $evenements $this->doctrine->getRepository(Evenement::class)->getNextEvents(3);
  50.         //if(!count($evenements)) {
  51.             $evenementsPrev $this->doctrine->getRepository(Evenement::class)->getPrevEvents(6);
  52.         // } else {
  53.         //     $evenementsPrev = null;
  54.         // }
  55.         $intervenants $this->doctrine->getRepository(Intervenant::class)->findAll();
  56.         shuffle($intervenants);
  57.         $intervenants array_slice($intervenants04);
  58.         $reponses $this->doctrine->getRepository(Reponse::class)->findByHome(1);
  59.         return $this->render('site/index.html.twig', [
  60.             'evenements'   => $evenements,
  61.             'evenementsPrev'   => $evenementsPrev,
  62.             'intervenants' => $intervenants,
  63.             'hideLogo'     => true,
  64.             'reponses'     => $reponses
  65.         ]);
  66.     }
  67.     /**
  68.      * @Route("evenements", name="evenements")
  69.      */
  70.     public function evenements(): Response
  71.     {
  72.         $evenementsNext $this->doctrine->getRepository(Evenement::class)->getNextEvents(3);
  73.         
  74.         // $evenementsPrev = $this->doctrine->getRepository(Evenement::class)->findBy(
  75.         //     [], 
  76.         //     ["date" => 'ASC'], 
  77.         //     6, 
  78.         //     3
  79.         // );
  80.         if(count($evenementsNext) == 0) {
  81.             $evenementsPrev $this->doctrine->getRepository(Evenement::class)->getPrevEvents(9);
  82.         } else {
  83.             $evenementsPrev $this->doctrine->getRepository(Evenement::class)->getPrevEvents(6);
  84.         }
  85.         return $this->render('site/evenements.html.twig', [
  86.             'evenementsNext' => $evenementsNext,
  87.             'evenementsPrev' => $evenementsPrev,
  88.         ]);
  89.     }
  90.     /**
  91.      * @Route("evenements/{titre}_{idevent<\d+>}/{idmessage}-{hashmessage}/{iduser}-{hashuser}", name="evenement")
  92.      */
  93.     public function evenement(Request $requestEvenementInfo $evtInfostring $titre$ideventint $idmessage 0string $hashmessage=''int $iduser 0string $hashuser='' ): Response
  94.     {
  95.         $evenement $this->doctrine->getRepository(Evenement::class)->find($idevent);
  96.     
  97.         $message null;
  98.         $contact null;
  99.         $inscription null;
  100.         if($idmessage 
  101.             && $iduser 
  102.             && sha1($idmessage.$this->getParameter('app.salt')) ==  $hashmessage
  103.             && sha1($iduser.$this->getParameter('app.salt')) ==  $hashuser
  104.             ) {
  105.             $message $this->doctrine->getRepository(Message::class)->find($idmessage);
  106.             $contact $this->doctrine->getRepository(Contact::class)->find($iduser);
  107.             $inscription $this->doctrine->getRepository(Inscription::class)->findOneBy(
  108.                 [
  109.                     'message' => $message,
  110.                     'contact' => $contact,
  111.                     ]
  112.                 );
  113.         }     
  114.         // Récupère les prochains évènements
  115.         $evenementsNext $this->doctrine->getRepository(Evenement::class)->getNextEvents(3);
  116.         foreach($evenementsNext as $key=>$item) {
  117.             if($item->getId() == $idevent) {
  118.                 unset($evenementsNext[$key]);
  119.             }
  120.         }
  121.         if(!count($evenementsNext)) {
  122.             $evenementsPrev $this->doctrine->getRepository(Evenement::class)->getPrevEvents(6);
  123.         } else {
  124.             $evenementsPrev null;
  125.         }
  126.         
  127.         if($request->request->get('nom') !== null) {
  128.             $em $this->doctrine->getManager();
  129.             if($contact === null) {
  130.                 $existing $this->doctrine->getRepository(Contact::class)->findOneByEmail($request->request->get('email'));
  131.                 if($existing$contact $existing;
  132.                 else $contact = new Contact;
  133.                 $contact->setCivilite($request->request->get('civilite'));
  134.                 $contact->setNom($request->request->get('nom'));
  135.                 $contact->setPrenom($request->request->get('prenom'));
  136.                 $contact->setEmail($request->request->get('email'));
  137.                 $contact->setSociete($request->request->get('societe'));
  138.                 $contact->setFonction($request->request->get('fonction'));
  139.                 $contact->setTelephone($request->request->get('telephone'));
  140.                 $em->persist($contact);
  141.                 $em->flush();
  142.             }
  143.             $existing $this->doctrine->getRepository(Inscription::class)->findOneByContact($contact);
  144.             if($existing$inscription $existing;
  145.             else $inscription = new Inscription;
  146.             $inscription->setDateInscription(new \DateTime);
  147.             $inscription->setContact($contact);
  148.             $inscription->setMessage($message);
  149.             $inscription->setEvenement($evenement);
  150.             $inscription->setAccordImage$request->request->get('droitImage')!=null 0  );
  151.             $inscription->setHebergement$request->request->get('hebergement')!=null 0  );
  152.             if($request->request->get('droitImage') == 1) {
  153.                 $inscription->setNomDroitImage($request->request->get('nomprenomConsentement'));
  154.             }            
  155.             $inscription->setIntegralite$request->request->get('integralite')!=null 0  );
  156.             $inscription->setVisite$request->request->get('visite')!=null 0  );
  157.             $inscription->setDeuxieme$request->request->get('deuxieme')!=null 0  );
  158.             $inscription->setNavette$request->request->get('navette')!=null 0  );
  159.             // Supprime les mails programmé pour les relances
  160.             try {
  161.                 if($contact && $message) { 
  162.                     $poubelle $this->doctrine->getRepository(Envoi::class)->findEnvoiASupprimer($contact$message->getEvenement());
  163.                     if($poubelle) {
  164.                         foreach($poubelle as $envoi) {
  165.                             $em->remove($envoi);
  166.                         }
  167.                     }
  168.                 }
  169.             } catch (\Throwable $th) {
  170.                 //throw $th;
  171.             }
  172.             // Envoi du mail de confirmation d'inscription
  173.             $confirmation  $this->doctrine->getRepository(Message::class)->findOneBy(
  174.                 [
  175.                     'evenement' => $evenement,
  176.                     'type' => 'confirmation',
  177.                 ]
  178.             );
  179.             if($confirmation) {
  180.                 $titre $this->slugger->slug(strtolower($evenement->getTitre()));
  181.                 $html $this->renderView('email/email.html.twig', [
  182.                     'message' => $confirmation,
  183.                     'titre' => $titre,
  184.                 ]);
  185.                 $email = (new Email())
  186.                     ->from(new Address('contact@plusvertmoinscherevent.engie.fr''Invitation ENGIE Solutions'))
  187.                     ->subject($confirmation->getObjet())
  188.                     ->replyTo('infos.plusvertmoinscherevent@engie.com')
  189.                     ->to(new Address($contact->getEmail(), $contact->getPrenom().' '.$contact->getNom()))
  190.                     ->html($html)
  191.                     ->text(strip_tags($html))
  192.                 ;     
  193.                 $lastProgramme $this->doctrine->getRepository(Programme::class)->findBy(
  194.                     ['evenement' => $evenement], 
  195.                     ['heureDebut' => 'DESC']
  196.                 );
  197.                 if($lastProgramme) {
  198.                     $fin $lastProgramme[0]->getHeureDebut();
  199.                     if( $lastProgramme[0]->getHeureFin() != null ) {
  200.                         $fin $lastProgramme[0]->getHeureFin();
  201.                     }
  202.                     
  203.                 }
  204.                 $dateStartEnd $evtInfo->getStartEndEvt($evenement);
  205.                 
  206.                 // AJout iCal
  207.                 $ics "BEGIN:VCALENDAR\n";
  208.                 $ics .= "VERSION:2.0\n";
  209.                 $ics .= "PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n";
  210.                 $ics .= "BEGIN:VEVENT\n";
  211.                 $ics .= "X-WR-TIMEZONE:Europe/Paris\n";
  212.                 $ics .= "DTSTART:".$dateStartEnd['debut']['jour']->format('Ymd')."T".$dateStartEnd['debut']['heure']->format('His')."\n";
  213.                 $ics .= "DTEND:".$dateStartEnd['fin']['jour']->format('Ymd')."T".$dateStartEnd['fin']['heure']->format('His')."\n";
  214.                 // if(isset($fin)) {
  215.                 // $ics .= "DTEND:".$evenement->getDate()->format('Ymd')."T".$fin->format('His')."\n";
  216.                 // }
  217.                 $ics .= "SUMMARY:".$evenement->getTitre()."\n";
  218.                 $ics .= "LOCATION:".$evenement->getVille()." - ".($evenement->getLieu()!== null $evenement->getLieu() : '')."\n";
  219.                 $ics .= "ORGANIZER:ENGIE Solutions\n";
  220.                 $ics .= "DESCRIPTION:".html_entity_decode(strip_tagsstr_replace(array("\r""\n"), ''$evenement->getTexte()) ))."\n";
  221.                 $ics .= "END:VEVENT\n";
  222.                 $ics .= "END:VCALENDAR\n";
  223.                 @unlink($this->getParameter('folder.uploadsite').'pvmc.ics');
  224.                 $fichier $this->getParameter('folder.uploadsite').'pvmc.ics';
  225.                 $f fopen($fichier'w+');
  226.                 fputs($f$ics);
  227.                 $email->attachFromPath($this->getParameter('folder.uploadsite').'pvmc.ics');
  228.                 $signedEmail $email;
  229.                 // $signer = new DkimSigner('file:///'.$this->getParameter('folder.key').'/dkimkey.key', 'plusvertmoinscherevent.engie.fr', 'mail');
  230.                 // $signedEmail = $signer->sign($email);
  231.                 $this->mailer->send($signedEmail);
  232.             }
  233.             $em->persist($inscription);
  234.             $em->flush();
  235.         }
  236.         
  237.         // Programme ordonné
  238.         $programmeOrder = [];
  239.         foreach($evenement->getProgrammes() as $programme) {
  240.             if($programme->getJour() !== null) {
  241.                 $programmeOrder[$programme->getJour()->format('Ymd')][$programme->getHeureDebut()->format('Hi')] = $programme;
  242.                 ksort($programmeOrder[$programme->getJour()->format('Ymd')]);
  243.             }
  244.         }
  245.         ksort($programmeOrder);
  246.         
  247.         $evenement->programmeOrder $programmeOrder;
  248.        
  249.         
  250.         return $this->render('site/evenement.html.twig', [
  251.             'titre'          => $titre,
  252.             'idevent'        => $idevent,
  253.             'evenement'      => $evenement,
  254.             'evenementsNext' => $evenementsNext,
  255.             'evenementsPrev' => $evenementsPrev,
  256.             'idmessage'      => $idmessage,
  257.             'message'        => $message,
  258.             'iduser'         => $iduser,
  259.             'inscription'    => $inscription,
  260.             'contact'        => $contact,
  261.             'intervenants'   => $this->doctrine->getRepository(EvenementIntervenant::class)->findByEvenement($evenement),
  262.         ]);
  263.     }
  264.     /**
  265.      * @Route("satisfaction/{idinscription}-{hashinscription}", name="satisfaction")
  266.      */
  267.     public function satisfaction(int $idinscriptionstring $hashinscriptionRequest $request): Response
  268.     {
  269.         $inscription $this->doctrine->getRepository(Inscription::class)->find($idinscription);
  270.         // if(
  271.         //     !$inscription 
  272.         //     || sha1($idinscription.$this->getParameter('app.salt')) !=  $hashinscription
  273.         // ) {
  274.         //     return new Response(
  275.         //         '<html><body></body></html>'
  276.         //     );
  277.         // }
  278.         $questions $this->doctrine->getRepository(Question::class)->findBy(
  279.             ['evenement' => $inscription->getEvenement()],
  280.             ['ordre' => 'ASC']
  281.         );
  282.         // Récupère les prochains évènements
  283.         $evenementsNext $this->doctrine->getRepository(Evenement::class)->getNextEvents(3);
  284.         foreach($evenementsNext as $key=>$item) {
  285.             if($item->getId() == $inscription->getEvenement()->getId()) {
  286.                 unset($evenementsNext[$key]);
  287.             }
  288.         }
  289.         if(count($request->request)) {
  290.             $em $this->doctrine->getManager();
  291.             // Si déjà posté, supprime les anciennes réponses
  292.             $reponses $this->doctrine->getRepository(Reponse::class)->findBy(
  293.                 [
  294.                     'inscription' => $inscription,
  295.                     'contact' => $inscription->getContact(),
  296.                 ]
  297.             );
  298.             foreach($reponses as $reponse) {
  299.                 $em->remove($reponse);
  300.             }
  301.             foreach($request->request as $key=>$choix) {
  302.                 if(intval(explode("_"$key)[1]) && strpos($key"commentaire") === false) {
  303.                     $question $this->doctrine->getRepository(Question::class)->findintvalexplode("_"$key)[1] ) );
  304.                     $reponse = new Reponse;
  305.                     $reponse->setInscription($inscription)
  306.                     ->setContact($inscription->getContact())
  307.                     ->setQuestion($question)
  308.                     ->setContenu($choix)
  309.                     ;
  310.                     if($request->request->get($key.'_commentaire') != null) {
  311.                         $reponse->setCommentaire($request->request->get($key.'_commentaire'));
  312.                     }
  313.                     
  314.                     $em->persist($reponse);
  315.                 }
  316.             }
  317.             $em->flush();
  318.         }
  319.         return $this->render('site/satisfaction.html.twig', [
  320.             'evenement'   => $inscription->getEvenement(),
  321.             'inscription' => $inscription,
  322.             'contact'     => $inscription->getContact(),
  323.             'questions'   => $questions,
  324.             'evenementsNext' => $evenementsNext,
  325.         ]);
  326.     }
  327.     /**
  328.      * @Route("demarche", name="demarche")
  329.      */
  330.     public function demarche(): Response
  331.     {
  332.         return $this->render('site/demarche.html.twig', [
  333.             'controller_name' => 'SiteController',
  334.         ]);
  335.     }
  336.     /**
  337.      * @Route("contact", name="contact")
  338.      */
  339.     public function contact(): Response
  340.     {
  341.         return $this->render('site/contact.html.twig', [
  342.             'controller_name' => 'SiteController',
  343.         ]);
  344.     }
  345.     /**
  346.      * @Route("mentions-legales", name="mentions")
  347.      */
  348.     public function mentions(): Response
  349.     {
  350.         return $this->render('site/mentions.html.twig', [
  351.             'controller_name' => 'SiteController',
  352.         ]);
  353.     }
  354.     /**
  355.      * @Route("rgpd", name="rgpd")
  356.      */
  357.     public function rgpd(): Response
  358.     {
  359.         return $this->render('site/rgpd.html.twig', [
  360.             'controller_name' => 'SiteController',
  361.         ]);
  362.     }
  363.     /**
  364.      * @Route("intervenants", name="intervenants")
  365.      */
  366.     public function intervenants(): Response
  367.     {
  368.         $intervenants $this->doctrine->getRepository(Intervenant::class)->findBy(
  369.             [], 
  370.             ["nom" => 'ASC']
  371.         );
  372.         return $this->render('site/intervenants.html.twig', [
  373.             'intervenants' => $intervenants,
  374.         ]);
  375.     }
  376.     
  377.     /**
  378.      * @Route("desabo/{idenvoi}-{hashenvoi}", name="desabo")
  379.      */
  380.     public function desabo(int $idenvoistring $hashenvoi): Response
  381.     {
  382.         $envoi $this->doctrine->getRepository(Envoi::class)->find($idenvoi);
  383.         if(
  384.             $envoi 
  385.             && sha1($idenvoi.$this->getParameter('app.salt')) ==  $hashenvoi
  386.             
  387.         {
  388.             $message "Votre adresse <b>".$envoi->getContact()->getEmail()."</b> a bien été supprimée de notre base.";
  389.             
  390.             $em $this->doctrine->getManager();
  391.             
  392.             $optout = new Optout;
  393.             $optout->setEmail($envoi->getContact()->getEmail());
  394.             $optout->setDate(new \DateTime);
  395.             $em->persist($optout);
  396.             
  397.             $em->remove($envoi->getContact());
  398.             $em->flush();
  399.             return new Response(
  400.                 '<html style="background:#003b55; color:#fff; font-family:sans-serif;">
  401.                     <body style="padding:20px 0;"><h3 style="text-align:center;font-weight: normal;">'.$message.'</h3></body>
  402.                 </html>'
  403.             );
  404.             
  405.         }
  406.     }
  407.     
  408. }