<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Crypto\DkimSigner;
use Symfony\Component\Mime\Crypto\DkimOptions;
use Symfony\Component\String\Slugger\SluggerInterface;
use App\Service\EvenementInfo;
use App\Entity\Envoi;
use App\Entity\Evenement;
use App\Entity\Message;
use App\Entity\EvenementIntervenant;
use App\Entity\Inscription;
/**
* @Route("/cron", name="app_cron_")
*/
class CronController extends AbstractController
{
private $doctrine;
private $mailer;
private $slugger;
private $evtInfo;
public function __construct(ManagerRegistry $doctrine, MailerInterface $mailer, SluggerInterface $slugger, EvenementInfo $evtInfo)
{
$this->doctrine = $doctrine;
$this->mailer = $mailer;
$this->slugger = $slugger;
$this->evtInfo = $evtInfo;
}
/**
* @Route("/testics", name="testics")
*/
public function testics(): Response
{
$evenement = $this->doctrine->getRepository(Evenement::class)->find(4);
$dateStartEnd = $this->evtInfo->getStartEndEvt($evenement);
$ics = $this->evtInfo->createIcs($evenement, $dateStartEnd);
return new Response(
'<html><body>-OK-</body></html>'
);
}
/**
* @Route("/envoi", name="cronenvoi")
*/
public function cronenvoi(): Response
{
//$response = $this->envoi();
$response = null;
for ($i=0; $i < 5 ; $i++) {
$response = $this->envoi();
if($response == "error") break;
else {
sleep(9);
}
}
return $this->redirectToRoute("app_cron_cronsatisfaction");
// dd($response)
// if($response == "error") {
// }
return new Response(
'<html><body>-'.$response.'-</body></html>'
);
}
/**
* @Route("/recap", name="cronrecap")
*/
public function cronrecap(): Response
{
$inscriptions = $this->doctrine->getRepository(Inscription::class)->findRecap();
$em = $this->doctrine->getManager();
//dump($inscriptions);
if(!empty($inscriptions) && $inscription = $inscriptions[0]) {
$message = $this->doctrine->getRepository(Message::class)->findOneBy(
[
'evenement' => $inscription->getEvenement(),
'type' => 'j-1'
]
);
$titre = $this->slugger->slug(strtolower($message->getEvenement()->getTitre()));
$html = $this->renderView('email/email.html.twig', [
'message' => $message,
'titre' => $titre,
]);
$email = (new Email())
->from(new Address('noreply@evenements.engie-solutions.com ', 'Invitation ENGIE Solutions'))
->subject($message->getObjet())
->replyTo('evenements.engiesolutions@engie.com')
->to(new Address($inscription->getContact()->getEmail(), $inscription->getContact()->getPrenom().' '.$inscription->getContact()->getNom()))
->html($html)
->text(strip_tags($html))
;
if($message->getPiecejointe() != null) {
$email->attachFromPath($this->getParameter('folder.uploadsite').$message->getPiecejointe());
}
//$signer = new DkimSigner('file:///'.$this->getParameter('folder.key').'/dkimkey.key', 'plusvertmoinscherevent.engie.fr', 'mail');
//$signedEmail = $signer->sign($email);
$signedEmail =$email;
try {
$this->mailer->send($signedEmail);
$inscription->setEnvoiRecap(new \DateTime);
$em->persist($inscription);
$em->flush();
} catch (TransportExceptionInterface $e) {
$date = \DateTime::createFromFormat('YmdHis', '20000101000000');
$inscription->setEnvoiRecap($date);
$em->persist($inscription);
$em->flush();
}
}
return new Response(
'<html><body></body></html>'
);
}
/**
* @Route("/satisfaction", name="cronsatisfaction")
*/
public function cronsatisfaction(): Response
{
$inscriptions = $this->doctrine->getRepository(Inscription::class)->findSatisfaction();
//dump($inscriptions);
if(!empty($inscriptions) && $inscription = $inscriptions[0]) {
$message = $this->doctrine->getRepository(Message::class)->findOneBy(
[
'evenement' => $inscription->getEvenement(),
'type' => 'j+1'
]
);
if($message) {
$response = $this->envoiSatisfaction($message, $inscription, "setEnvoiSatisfaction");
if($response) {
return new Response(
'<html><body>*'.$response.'*</body></html>'
);
}
}
}
return $this->redirectToRoute("app_cron_cronrecap");
return new Response(
'<html><body></body></html>'
);
}
private function envoiSatisfaction($message, $inscription, $methode) {
$em = $this->doctrine->getManager();
$titre = $this->slugger->slug(strtolower($message->getEvenement()->getTitre()));
$html = $this->renderView('email/email.html.twig', [
'message' => $message,
'inscription' => $inscription,
'titre' => $titre,
]);
$email = (new Email())
->from(new Address('contact@evenements.engie-solutions.com ', 'Invitation ENGIE Solutions'))
->subject($message->getObjet())
->replyTo('evenements.engiesolutions@engie.com')
->to(new Address($inscription->getContact()->getEmail(), $inscription->getContact()->getPrenom().' '.$inscription->getContact()->getNom()))
->html($html)
->text(strip_tags($html))
;
if($message->getPiecejointe() != null) {
$email->attachFromPath($this->getParameter('folder.uploadsite').$message->getPiecejointe());
}
// $signer = new DkimSigner('file:///'.$this->getParameter('folder.key').'/dkimkey.key', 'plusvertmoinscherevent.engie.fr', 'mail');
// $signedEmail = $signer->sign($email);
$signedEmail =$email;
try {
$this->mailer->send($signedEmail);
$inscription->{$methode}(new \DateTime);
$em->persist($inscription);
$em->flush();
return $inscription->getId();
} catch (TransportExceptionInterface $e) {
$date = \DateTime::createFromFormat('YmdHis', '20000101000000');
$inscription->{$methode}($date);
$em->persist($inscription);
$em->flush();
return false;
}
}
public function envoi()
{
$envoi = $this->doctrine->getRepository(Envoi::class)->findNextToSend();
if($envoi) {
$titre = $this->slugger->slug(strtolower($envoi->getMessage()->getEvenement()->getTitre()));
$html = $this->renderView('email/email.html.twig', [
'message' => $envoi->getMessage(),
'envoi' => $envoi,
'titre' => $titre,
'intervenants' => $this->doctrine->getRepository(EvenementIntervenant::class)->findBy(['evenement' => $envoi->getMessage()->getEvenement()]),
]);
$email = (new Email())
->from(new Address('contact@evenements.engie-solutions.com ', 'Invitation ENGIE Solutions'))
->subject($envoi->getMessage()->getObjet())
->replyTo('evenements.engiesolutions@engie.com')
->to(new Address($envoi->getContact()->getEmail(), $envoi->getContact()->getPrenom().' '.$envoi->getContact()->getNom()))
->html($html)
->text(strip_tags($html))
;
if($envoi->getMessage()->getPiecejointe() != null) {
$email->attachFromPath($this->getParameter('folder.uploadsite').$envoi->getMessage()->getPiecejointe());
}
// AJOUT DU ICS
if($envoi->getMessage()->getType() == "savethedate" || $envoi->getMessage()->getType() == "invitation") {
$dateStartEnd = $this->evtInfo->getStartEndEvt($envoi->getMessage()->getEvenement());
$ics = $this->evtInfo->createIcs($envoi->getMessage()->getEvenement(), $dateStartEnd);
$email->attachFromPath($this->getParameter('folder.uploadsite').$ics);
}
// $signer = new DkimSigner('file:///'.$this->getParameter('folder.key').'/dkimkey.key', 'plusvertmoinscherevent.engie.fr', 'mail');
// $signedEmail = $signer->sign($email);
// $signedEmail = $signer->sign($email, (new DkimOptions())
// ->bodyCanon('relaxed')
// ->headerCanon('relaxed')
// ->headersToIgnore(['Message-ID'])
// ->toArray()
// );
$signedEmail = $email;
$em = $this->doctrine->getManager();
try {
$this->mailer->send($signedEmail);
$envoi->setDateEnvoi(new \DateTime);
$em->persist($envoi);
$em->flush();
return $envoi->getId();
} catch (TransportExceptionInterface $e) {
$date = \DateTime::createFromFormat('YmdHis', '20000101000000');
$envoi->setDateEnvoi($date);
$em->persist($envoi);
$em->flush();
}
} else {
return "error";
}
}
/**
* @Route("/envoitest-{messageId<\d+>}", name="envoitest")
*/
public function envoiTest($messageId, Request $request)
{
$message = $this->doctrine->getRepository(Message::class)->find($messageId);
if($message) {
$titre = $this->slugger->slug(strtolower($message->getEvenement()->getTitre()));
$html = $this->renderView('email/email.html.twig', [
'message' => $message,
'titre' => $titre,
'intervenants' => $this->doctrine->getRepository(EvenementIntervenant::class)->findBy(['evenement' => $message->getEvenement()]),
]);
$email = (new Email())
->from(new Address('contact@evenements.engie-solutions.com ', 'Invitation ENGIE Solutions'))
->subject($message->getObjet())
->replyTo('evenements.engiesolutions@engie.com')
->to(new Address($request->request->get('email'), "Prénom Nom" ))
->html($html)
->text(strip_tags($html))
;
if($message->getPiecejointe() != null) {
$email->attachFromPath($this->getParameter('folder.uploadsite').$message->getPiecejointe());
}
// $signer = new DkimSigner('file:///'.$this->getParameter('folder.key').'/dkimkey.key', 'plusvertmoinscherevent.engie.fr', 'mail');
// $email = $signer->sign($email);
try {
$this->mailer->send($email);
} catch (TransportExceptionInterface $e) {
}
return $this->redirectToRoute('app_evenement', ['idevenement' => $message->getEvenement()->getId()]);
} else {
return "error";
}
}
/**
* @Route("/cleandoublons", name="cleandoublons")
*/
public function cleandoublons() {
// Modif du 17/05/2023
// Finalement c'est plus une liste unique par event, on avait pas dit jacadi
// Aled, il y a des doublons dans tous les sens
$emailsEnvoi = [];
$doublons = [];
$envoiProgrammes = $this->doctrine->getRepository(Envoi::class)->findForEvent(6, true);
$toRemove = [];
$toKeep = [];
$em = $this->doctrine->getManager();
foreach ($envoiProgrammes as $envoi) {
// Si l'email du contact de l'envoi est déjà dans la liste pour ce message, on vire l'envoi qui est un doublon
if(
isset($emailsEnvoi[$envoi->getMessage()->getId()])
&& in_array($envoi->getContact()->getEmail(), $emailsEnvoi[$envoi->getMessage()->getId()])
&& $envoi->getDateEnvoi() == null
) {
//if($envoi->getDateEnvoi() == null) $em->remove($envoi);
$doublons[$envoi->getContact()->getId()] = ($envoi->getMessage()->getId()." / ".$envoi->getContact()->getEmail());
$inscription = $this->doctrine->getRepository(Inscription::class)->findOneBy(
['contact' => $envoi->getContact()]
);
if($inscription) {
//dump($inscription);
$toKeep[$envoi->getContact()->getId()] = $envoi->getContact();
} else {
//$toRemove[$envoi->getContact()->getId()] = $envoi->getContact();
$em->remove($envoi->getContact());
}
} else {
$emailsEnvoi[$envoi->getMessage()->getId()][] = trim($envoi->getContact()->getEmail());
}
}
$em->flush();
// dump($toKeep);
// dump($toRemove);
// $emailInscrit = [];
// $dejaListes = [];
// $caDegage = [];
// foreach($doublons as $idcontact=>$email) {
// $inscription = $this->doctrine->getRepository(Inscription::class)->findOneBy(
// ['contact' => $idcontact, 'evenement' => 6]
// );
// if($inscription) {
// dump($inscription);
// $emailInscrit[] = $email;
// } else {
// if(in_array($email, $dejaListes) && !in_array($email, $emailInscrit)) {
// $caDegage[] = $idcontact;
// }
// }
// $dejaListes[] = $email;
// }
// dump($caDegage);
dd($doublons);
//$em->flush();
}
}