<?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\String\Slugger\SluggerInterface;
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 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;
use App\Entity\Optout;
use App\Service\EvenementInfo;
class PublicController 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 home() {
return $this->render('site/home.html.twig', []);
}
/**
* @Route("/evenement/{slug}", name="evenement")
*/
public function index(Request $request, SluggerInterface $slugger, EvenementInfo $evtInfo, string $slug): Response
{
$evenement = $this->doctrine->getRepository(Evenement::class)->findOneBySlug($slug);
$message = null;
$contact = null;
$inscription = null;
$warning = 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,
// ]
// );
// }
if($request->request->get('nom') !== null) {
//dd($request);
$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->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);
$existing = $this->doctrine->getRepository(Inscription::class)->findOneBy(
[
'contact' => $contact,
'evenement' => $evenement,
]
);
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->setNom($request->request->get('nom'));
$inscription->setPrenom($request->request->get('prenom'));
$inscription->setEmail($request->request->get('email'));
$inscription->setTelephone($request->request->get('telephone'));
$inscription->setPostal($request->request->get('postal'));
$inscription->setSociete($request->request->get('societe'));
$inscription->setFonction($request->request->get('fonction'));
$inscription->setConnu($request->request->get('connu'));
$inscription->setAttentes($request->request->get('attentes'));
if($request->request->get('attentes') == "Autre") {
$inscription->setAttentesAutre($request->request->get('attentesAutre'));
}
$inscription->setNbParticipants(1);
if($request->request->get('inviteNom') != null && $request->request->get('invitePrenom') != null) {
$inscription->setInviteNom($request->request->get('inviteNom'));
$inscription->setInvitePrenom($request->request->get('invitePrenom'));
}
if($request->request->get('type') == 'groupe') {
// La nouvelle inscription concerne un groupe
$inscription->setNbParticipants(intval($request->request->get('nbparticipants')));
$inscription->setCreneau($request->request->get('creneau'));
} else {
// inscription individuelle classique
if($request->files->get("cv") !== null) {
// Y a un CV
if(!is_dir($this->getParameter('folder.uploadcv'))) {
mkdir($this->getParameter('folder.uploadcv'), 0775);
}
if(
($request->files->get("cv")->getMimeType() == "application/msword"
|| $request->files->get("cv")->getMimeType() == "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|| $request->files->get("cv")->getMimeType() == "application/pdf" )
&& $request->files->get("cv")->getSize() < 5000000
) {
$cv = $request->files->get('cv');
$safeFilename = $slugger->slug($request->request->get('nom')."_".$request->request->get('prenom'));
$newFilename = $safeFilename.'-'.date('YmdHis').'.'.$cv->guessExtension();
try {
$cv->move(
$this->getParameter('folder.uploadcv'),
$newFilename
);
$inscription->setCv($newFilename);
} catch (FileException $e) {
}
} else {
// Pas le bon format
$warning = "Votre CV n'a pas été joint. Merci d'utiliser les formats PDF ou DOC, et de limiter le poids du fichier à 3Mo maximum.";
}
}
}
$inscription->setType($request->request->get('type'));
// 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@evenements.engie-solutions.com ', 'Invitation ENGIE Solutions'))
->subject($confirmation->getObjet())
->replyTo('evenements.engiesolutions@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);
$ics = $evtInfo->createIcs($evenement, $dateStartEnd);
$email->attachFromPath($this->getParameter('folder.uploadsite').$ics);
// $signer = new DkimSigner('file:///'.$this->getParameter('folder.key').'/dkimkey.key', 'plusvertmoinscherevent.engie.fr', 'mail');
// $email = $signer->sign($email);
$this->mailer->send($email);
}
$em->persist($inscription);
$em->flush();
}
return $this->render('site/evenement.html.twig', [
'contact' => null,
'inscription' => $inscription,
'evenement' => $evenement,
'intervenants' => $this->doctrine->getRepository(EvenementIntervenant::class)->findByEvenement($evenement),
]);
}
/**
* @Route("satisfaction/{idinscription}-{hashinscription}-{idevent}", name="satisfaction")
*/
public function satisfaction(Request $request, int $idinscription, string $hashinscription, int $idevent = 0 ): Response
{
$inscription = $this->doctrine->getRepository(Inscription::class)->find($idinscription);
if($inscription) {
$evenement = $inscription->getEvenement();
} else {
$evenement = $this->doctrine->getRepository(Evenement::class)->find($idevent);
}
// if(
// !$inscription
// || sha1($idinscription.$this->getParameter('app.salt')) != $hashinscription
// ) {
// return new Response(
// '<html><body></body></html>'
// );
// }
$questions = $this->doctrine->getRepository(Question::class)->findBy(
['evenement' => $evenement ],
['ordre' => 'ASC']
);
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' => $evenement,
'inscription' => $inscription,
'questions' => $questions,
]);
}
/**
* @Route("/evenement/{slug}/mentions-legales", name="site_mentions")
*/
public function mentions(string $slug): Response
{
$evenement = $this->doctrine->getRepository(Evenement::class)->findOneBySlug($slug);
return $this->render('site/mentions.html.twig', [
'evenement' => $evenement,
]);
}
/**
* @Route("/evenement/{slug}/rgpd", name="site_rgpd")
*/
public function rgpd(string $slug): Response
{
$evenement = $this->doctrine->getRepository(Evenement::class)->findOneBySlug($slug);
return $this->render('site/rgpd.html.twig', [
'evenement' => $evenement,
]);
}
/**
* @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>'
);
}
}
}