<?php
namespace App\Controller\Site;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Crypto\DkimSigner;
use Symfony\Component\Mime\Crypto\DkimOptions;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Address;
use Symfony\Component\String\Slugger\SluggerInterface;
use App\Service\EvenementInfo;
use App\Entity\Evenement;
use App\Entity\EvenementIntervenant;
use App\Entity\Inscription;
use App\Entity\Contact;
use App\Entity\Intervenant;
use App\Entity\Message;
use App\Entity\Envoi;
use App\Entity\Programme;
use App\Entity\Question;
use App\Entity\Reponse;
/**
* @Route("/", name="site_")
*/
class SiteController extends AbstractController
{
private $doctrine;
private $mailer;
private $slugger;
public function __construct(ManagerRegistry $doctrine, MailerInterface $mailer, SluggerInterface $slugger)
{
$this->doctrine = $doctrine;
$this->mailer = $mailer;
$this->slugger = $slugger;
}
/**
* @Route("", name="home")
*/
public function index(): Response
{
// $evenements = $this->doctrine->getRepository(Evenement::class)->findBy(
// [],
// ["date" => 'ASC'],
// 3
// );
$evenements = $this->doctrine->getRepository(Evenement::class)->getNextEvents(3);
//if(!count($evenements)) {
$evenementsPrev = $this->doctrine->getRepository(Evenement::class)->getPrevEvents(6);
// } else {
// $evenementsPrev = null;
// }
$intervenants = $this->doctrine->getRepository(Intervenant::class)->findAll();
shuffle($intervenants);
$intervenants = array_slice($intervenants, 0, 4);
$reponses = $this->doctrine->getRepository(Reponse::class)->findByHome(1);
return $this->render('site/index.html.twig', [
'evenements' => $evenements,
'evenementsPrev' => $evenementsPrev,
'intervenants' => $intervenants,
'hideLogo' => true,
'reponses' => $reponses
]);
}
/**
* @Route("evenements", name="evenements")
*/
public function evenements(): Response
{
$evenementsNext = $this->doctrine->getRepository(Evenement::class)->getNextEvents(3);
// $evenementsPrev = $this->doctrine->getRepository(Evenement::class)->findBy(
// [],
// ["date" => 'ASC'],
// 6,
// 3
// );
if(count($evenementsNext) == 0) {
$evenementsPrev = $this->doctrine->getRepository(Evenement::class)->getPrevEvents(9);
} else {
$evenementsPrev = $this->doctrine->getRepository(Evenement::class)->getPrevEvents(6);
}
return $this->render('site/evenements.html.twig', [
'evenementsNext' => $evenementsNext,
'evenementsPrev' => $evenementsPrev,
]);
}
/**
* @Route("evenements/{titre}_{idevent<\d+>}/{idmessage}-{hashmessage}/{iduser}-{hashuser}", name="evenement")
*/
public function evenement(Request $request, EvenementInfo $evtInfo, string $titre, $idevent, int $idmessage = 0, string $hashmessage='', int $iduser = 0, string $hashuser='' ): Response
{
$evenement = $this->doctrine->getRepository(Evenement::class)->find($idevent);
$message = null;
$contact = null;
$inscription = null;
if($idmessage
&& $iduser
&& sha1($idmessage.$this->getParameter('app.salt')) == $hashmessage
&& sha1($iduser.$this->getParameter('app.salt')) == $hashuser
) {
$message = $this->doctrine->getRepository(Message::class)->find($idmessage);
$contact = $this->doctrine->getRepository(Contact::class)->find($iduser);
$inscription = $this->doctrine->getRepository(Inscription::class)->findOneBy(
[
'message' => $message,
'contact' => $contact,
]
);
}
// Récupère les prochains évènements
$evenementsNext = $this->doctrine->getRepository(Evenement::class)->getNextEvents(3);
foreach($evenementsNext as $key=>$item) {
if($item->getId() == $idevent) {
unset($evenementsNext[$key]);
}
}
if(!count($evenementsNext)) {
$evenementsPrev = $this->doctrine->getRepository(Evenement::class)->getPrevEvents(6);
} else {
$evenementsPrev = null;
}
if($request->request->get('nom') !== null) {
$em = $this->doctrine->getManager();
if($contact === null) {
$existing = $this->doctrine->getRepository(Contact::class)->findOneByEmail($request->request->get('email'));
if($existing) $contact = $existing;
else $contact = new Contact;
$contact->setCivilite($request->request->get('civilite'));
$contact->setNom($request->request->get('nom'));
$contact->setPrenom($request->request->get('prenom'));
$contact->setEmail($request->request->get('email'));
$contact->setSociete($request->request->get('societe'));
$contact->setFonction($request->request->get('fonction'));
$contact->setTelephone($request->request->get('telephone'));
$em->persist($contact);
$em->flush();
}
$existing = $this->doctrine->getRepository(Inscription::class)->findOneByContact($contact);
if($existing) $inscription = $existing;
else $inscription = new Inscription;
$inscription->setDateInscription(new \DateTime);
$inscription->setContact($contact);
$inscription->setMessage($message);
$inscription->setEvenement($evenement);
$inscription->setAccordImage( $request->request->get('droitImage')!=null ? 1 : 0 );
$inscription->setHebergement( $request->request->get('hebergement')!=null ? 1 : 0 );
if($request->request->get('droitImage') == 1) {
$inscription->setNomDroitImage($request->request->get('nomprenomConsentement'));
}
$inscription->setIntegralite( $request->request->get('integralite')!=null ? 1 : 0 );
$inscription->setVisite( $request->request->get('visite')!=null ? 1 : 0 );
$inscription->setDeuxieme( $request->request->get('deuxieme')!=null ? 1 : 0 );
$inscription->setNavette( $request->request->get('navette')!=null ? 1 : 0 );
// Supprime les mails programmé pour les relances
try {
if($contact && $message) {
$poubelle = $this->doctrine->getRepository(Envoi::class)->findEnvoiASupprimer($contact, $message->getEvenement());
if($poubelle) {
foreach($poubelle as $envoi) {
$em->remove($envoi);
}
}
}
} catch (\Throwable $th) {
//throw $th;
}
// Envoi du mail de confirmation d'inscription
$confirmation = $this->doctrine->getRepository(Message::class)->findOneBy(
[
'evenement' => $evenement,
'type' => 'confirmation',
]
);
if($confirmation) {
$titre = $this->slugger->slug(strtolower($evenement->getTitre()));
$html = $this->renderView('email/email.html.twig', [
'message' => $confirmation,
'titre' => $titre,
]);
$email = (new Email())
->from(new Address('contact@plusvertmoinscherevent.engie.fr', 'Invitation ENGIE Solutions'))
->subject($confirmation->getObjet())
->replyTo('infos.plusvertmoinscherevent@engie.com')
->to(new Address($contact->getEmail(), $contact->getPrenom().' '.$contact->getNom()))
->html($html)
->text(strip_tags($html))
;
$lastProgramme = $this->doctrine->getRepository(Programme::class)->findBy(
['evenement' => $evenement],
['heureDebut' => 'DESC']
);
if($lastProgramme) {
$fin = $lastProgramme[0]->getHeureDebut();
if( $lastProgramme[0]->getHeureFin() != null ) {
$fin = $lastProgramme[0]->getHeureFin();
}
}
$dateStartEnd = $evtInfo->getStartEndEvt($evenement);
// AJout iCal
$ics = "BEGIN:VCALENDAR\n";
$ics .= "VERSION:2.0\n";
$ics .= "PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n";
$ics .= "BEGIN:VEVENT\n";
$ics .= "X-WR-TIMEZONE:Europe/Paris\n";
$ics .= "DTSTART:".$dateStartEnd['debut']['jour']->format('Ymd')."T".$dateStartEnd['debut']['heure']->format('His')."\n";
$ics .= "DTEND:".$dateStartEnd['fin']['jour']->format('Ymd')."T".$dateStartEnd['fin']['heure']->format('His')."\n";
// if(isset($fin)) {
// $ics .= "DTEND:".$evenement->getDate()->format('Ymd')."T".$fin->format('His')."\n";
// }
$ics .= "SUMMARY:".$evenement->getTitre()."\n";
$ics .= "LOCATION:".$evenement->getVille()." - ".($evenement->getLieu()!== null ? $evenement->getLieu() : '')."\n";
$ics .= "ORGANIZER:ENGIE Solutions\n";
$ics .= "DESCRIPTION:".html_entity_decode(strip_tags( str_replace(array("\r", "\n"), '', $evenement->getTexte()) ))."\n";
$ics .= "END:VEVENT\n";
$ics .= "END:VCALENDAR\n";
@unlink($this->getParameter('folder.uploadsite').'pvmc.ics');
$fichier = $this->getParameter('folder.uploadsite').'pvmc.ics';
$f = fopen($fichier, 'w+');
fputs($f, $ics);
$email->attachFromPath($this->getParameter('folder.uploadsite').'pvmc.ics');
$signedEmail = $email;
// $signer = new DkimSigner('file:///'.$this->getParameter('folder.key').'/dkimkey.key', 'plusvertmoinscherevent.engie.fr', 'mail');
// $signedEmail = $signer->sign($email);
$this->mailer->send($signedEmail);
}
$em->persist($inscription);
$em->flush();
}
// Programme ordonné
$programmeOrder = [];
foreach($evenement->getProgrammes() as $programme) {
if($programme->getJour() !== null) {
$programmeOrder[$programme->getJour()->format('Ymd')][$programme->getHeureDebut()->format('Hi')] = $programme;
ksort($programmeOrder[$programme->getJour()->format('Ymd')]);
}
}
ksort($programmeOrder);
$evenement->programmeOrder = $programmeOrder;
return $this->render('site/evenement.html.twig', [
'titre' => $titre,
'idevent' => $idevent,
'evenement' => $evenement,
'evenementsNext' => $evenementsNext,
'evenementsPrev' => $evenementsPrev,
'idmessage' => $idmessage,
'message' => $message,
'iduser' => $iduser,
'inscription' => $inscription,
'contact' => $contact,
'intervenants' => $this->doctrine->getRepository(EvenementIntervenant::class)->findByEvenement($evenement),
]);
}
/**
* @Route("satisfaction/{idinscription}-{hashinscription}", name="satisfaction")
*/
public function satisfaction(int $idinscription, string $hashinscription, Request $request): Response
{
$inscription = $this->doctrine->getRepository(Inscription::class)->find($idinscription);
// if(
// !$inscription
// || sha1($idinscription.$this->getParameter('app.salt')) != $hashinscription
// ) {
// return new Response(
// '<html><body></body></html>'
// );
// }
$questions = $this->doctrine->getRepository(Question::class)->findBy(
['evenement' => $inscription->getEvenement()],
['ordre' => 'ASC']
);
// Récupère les prochains évènements
$evenementsNext = $this->doctrine->getRepository(Evenement::class)->getNextEvents(3);
foreach($evenementsNext as $key=>$item) {
if($item->getId() == $inscription->getEvenement()->getId()) {
unset($evenementsNext[$key]);
}
}
if(count($request->request)) {
$em = $this->doctrine->getManager();
// Si déjà posté, supprime les anciennes réponses
$reponses = $this->doctrine->getRepository(Reponse::class)->findBy(
[
'inscription' => $inscription,
'contact' => $inscription->getContact(),
]
);
foreach($reponses as $reponse) {
$em->remove($reponse);
}
foreach($request->request as $key=>$choix) {
if(intval(explode("_", $key)[1]) && strpos($key, "commentaire") === false) {
$question = $this->doctrine->getRepository(Question::class)->find( intval( explode("_", $key)[1] ) );
$reponse = new Reponse;
$reponse->setInscription($inscription)
->setContact($inscription->getContact())
->setQuestion($question)
->setContenu($choix)
;
if($request->request->get($key.'_commentaire') != null) {
$reponse->setCommentaire($request->request->get($key.'_commentaire'));
}
$em->persist($reponse);
}
}
$em->flush();
}
return $this->render('site/satisfaction.html.twig', [
'evenement' => $inscription->getEvenement(),
'inscription' => $inscription,
'contact' => $inscription->getContact(),
'questions' => $questions,
'evenementsNext' => $evenementsNext,
]);
}
/**
* @Route("demarche", name="demarche")
*/
public function demarche(): Response
{
return $this->render('site/demarche.html.twig', [
'controller_name' => 'SiteController',
]);
}
/**
* @Route("contact", name="contact")
*/
public function contact(): Response
{
return $this->render('site/contact.html.twig', [
'controller_name' => 'SiteController',
]);
}
/**
* @Route("mentions-legales", name="mentions")
*/
public function mentions(): Response
{
return $this->render('site/mentions.html.twig', [
'controller_name' => 'SiteController',
]);
}
/**
* @Route("rgpd", name="rgpd")
*/
public function rgpd(): Response
{
return $this->render('site/rgpd.html.twig', [
'controller_name' => 'SiteController',
]);
}
/**
* @Route("intervenants", name="intervenants")
*/
public function intervenants(): Response
{
$intervenants = $this->doctrine->getRepository(Intervenant::class)->findBy(
[],
["nom" => 'ASC']
);
return $this->render('site/intervenants.html.twig', [
'intervenants' => $intervenants,
]);
}
/**
* @Route("desabo/{idenvoi}-{hashenvoi}", name="desabo")
*/
public function desabo(int $idenvoi, string $hashenvoi): Response
{
$envoi = $this->doctrine->getRepository(Envoi::class)->find($idenvoi);
if(
$envoi
&& sha1($idenvoi.$this->getParameter('app.salt')) == $hashenvoi
)
{
$message = "Votre adresse <b>".$envoi->getContact()->getEmail()."</b> a bien été supprimée de notre base.";
$em = $this->doctrine->getManager();
$optout = new Optout;
$optout->setEmail($envoi->getContact()->getEmail());
$optout->setDate(new \DateTime);
$em->persist($optout);
$em->remove($envoi->getContact());
$em->flush();
return new Response(
'<html style="background:#003b55; color:#fff; font-family:sans-serif;">
<body style="padding:20px 0;"><h3 style="text-align:center;font-weight: normal;">'.$message.'</h3></body>
</html>'
);
}
}
}