<?php
namespace App\EventSubscriber;
use App\Entity\Formation;
use App\Entity\User;
use App\Events\Events;
use App\Service\email\EmailHandlerSendGrid;
use App\Service\JwtHandler;
use App\Service\Utils\Constante\AbonnementConst;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Twig\Environment;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
class EmailNotificationSubscriber implements EventSubscriberInterface
{
/**
* @var EmailHandlerSendGrid
*/
private $emailHandler;
/**
* @var JwtHandler
*/
private $jwt;
/**
* @var UrlGeneratorInterface
*/
private $urlGenerator;
/**
* @var Environment
*/
private $twig;
/**
* @var User
*/
private $user;
/**
* EmailNotificationSubscriber constructor.
*/
public function __construct(EmailHandlerSendGrid $emailHandler, JwtHandler $jwt, UrlGeneratorInterface $urlGenerator, Environment $twig, TokenStorageInterface $tokenStorage)
{
$this->emailHandler = $emailHandler;
$this->jwt = $jwt;
$this->urlGenerator = $urlGenerator;
$this->twig = $twig;
$this->user = $tokenStorage->getToken() ? $tokenStorage->getToken()->getUser() : null;
}
public static function getSubscribedEvents()
{
return [
Events::EMAIL_FORGOT_PWD => 'onForgotPwd',
Events::EMAIL_NEW_ACCOUNT => 'onNewAccount',
Events::FORMATION_REGISTRATION => 'onFormationRegistration',
Events::FORMATION_REMINDER => 'onFormationReminder',
Events::FORMATION_ADMIN_REMINDER => 'onFormationAdminReminder',
Events::FORMATION_RELANCE => 'onFormationRelance',
Events::EMAIL_CONTACT => 'onContact',
Events::COMPANY_STATUS_CHANGE => 'onCompanyStatusChange',
Events::SUBSCRIPTION_END_ADMIN => 'onSubscriptionEndAdmin',
Events::SUBSCRIPTION_END_RH => 'onSubscriptionEndRh',
Events::SUBSCRIPTION_EXPIRED_RH => 'onSubscriptionExpired',
Events::NOTIFICATION_NEW => 'onNotificationNew',
Events::NEW_ACCOUNT_RELANCE => 'onNewAccountRelance',
Events::EMAIL_COMPLETION => 'onCompletionLessThan',
];
}
public function onForgotPwd(GenericEvent $event)
{
$data = $event->getSubject();
/* @var $user User*/
$user = $data['user'];
$context = $data['context'];
//create token
$jwt = $this->jwt->createToken(['uid' => $user->getId()]);
$path = $context === "reset" ? "reset-password" : "create-account";
$link = $this->urlGenerator->generate($path, ['user' => $user->getId(), 'token' => $jwt], UrlGeneratorInterface::ABSOLUTE_URL);
$html = $this->twig->render('email/new/reset.account.html.twig', [
'user' => $user,
'link' => $link,
'context'=>$context,
'home_url' => $_ENV['HOME_URL'] ? $_ENV['HOME_URL'] : '#'
]);
/*Send email*/
$this->emailHandler->send([
'to' => $user->getEmail(),
'subject' => $context === "reset" ? 'Réinitialisation de votre mot de passe' : 'Création de votre mot de passe',
'html' => $html
]);
}
public function onNewAccount(GenericEvent $event)
{
/* @var $user User*/
$user = $event->getSubject();
//create token
$jwt = $this->jwt->createToken(['uid' => $user->getId()]);
$link = $this->urlGenerator->generate('create-account', ['user' => $user->getId(), 'token' => $jwt], UrlGeneratorInterface::ABSOLUTE_URL);
if($user->hasRole('ROLE_RH')){
$html = $this->twig->render('email/new/new.account.user.rh.html.twig', [
'link' => $link,
'user'=>$user,
'home_url' => $_ENV['HOME_URL'] ?? '#'
]);
}
else{
$html = $this->twig->render('email/new/new.account.user.html.twig', [
'link' => $link,
'user'=>$user,
'home_url' => $_ENV['HOME_URL'] ?? '#'
]);
}
/*Send email*/
$this->emailHandler->send([
'to' => $user->getEmail(),
'subject' => "Bienvenue sur Kinalgo Corporate !",
'html' => $html
]);
}
public function onNewAccountRelance(GenericEvent $event)
{
/* @var $user User*/
$user = $event->getSubject();
//create token
$jwt = $this->jwt->createToken(['uid' => $user->getId()]);
$link = $this->urlGenerator->generate('create-account', ['user' => $user->getId(), 'token' => $jwt], UrlGeneratorInterface::ABSOLUTE_URL);
if($user->hasRole('ROLE_RH')){
$html = $this->twig->render('email/new/relance.new.account.rh.html.twig', [
'link' => $link,
'user'=>$user,
'home_url' => $_ENV['HOME_URL'] ?? '#'
]);
}
else{
$html = $this->twig->render('email/new/relance.new.account.html.twig', [
'link' => $link,
'user'=>$user,
'home_url' => $_ENV['HOME_URL'] ?? '#'
]);
}
/*Send email*/
$this->emailHandler->send([
'to' => $user->getEmail(),
'subject' => "📢 Dernier rappel : activez votre compte maintenant !",
'html' => $html
]);
}
public function onFormationRegistration(GenericEvent $event)
{
$data = $event->getSubject();
$html = $this->twig->render('email/new/formation.registration.html.twig', [
'link' => $data['link'],
'user' => $data['user'],
'home_url' => $_ENV['HOME_URL'] ? $_ENV['HOME_URL'] : '#'
]);
/*Send email*/
$this->emailHandler->send([
'to' => $data['user'] instanceof User ? $data['user']->getEmail() : $data['user']['email'],
'subject' => "Vous avez reçu 1 recommandation de votre employeur",
'html' => $html
]);
}
public function onFormationRelance(GenericEvent $event)
{
$data = $event->getSubject();
$html = $this->twig->render('email/new/formation.relance.html.twig', [
'link' => $data['link'],
'user' => $data['user'],
'formation' => $data['formation'],
]);
/*Send email*/
$this->emailHandler->send([
'to' => $data['user'] instanceof User ? $data['user']->getEmail() : $data['user']['email'],
'subject' => "Rappel : ".$data['formation']->getTitle(),
'html' => $html
]);
}
public function onFormationReminder(GenericEvent $event)
{
$data = $event->getSubject();
$subject = isset($data['subject']) ? $data['subject'] : "N’oubliez pas de consulter votre recommandation";
$html = $this->twig->render('email/new/formation.reminder.html.twig', [
'link' => $data['link'],
'firstname' => $data['firstname'],
'home_url' => $_ENV['HOME_URL'] ?? '#'
]);
/*Send email*/
$this->emailHandler->send([
'to' => $data['email'],
'subject' => $subject,
'html' => $html
]);
}
/**
* TODO PAS UTILISE
* @param GenericEvent $event
* @return void
* @throws LoaderError
* @throws RuntimeError
* @throws SyntaxError
*/
public function onFormationAdminReminder(GenericEvent $event)
{
$data = $event->getSubject();
$message = "Nous vous informons que votre publication ${data['title']} n'a toujours pas été entièrement visionnée par ${data['user_firstname']} ${data['user_lastname']}. ";
$subject = "Publication obligatoire non lue";
$html = $this->twig->render('email/formation.registration.html.twig', [
'user' => ['firstname' => $data['author_firstname']],
'message' => $message,
'home_url' => $_ENV['HOME_URL'] ?? '#'
]);
/*Send email*/
$this->emailHandler->send([
'to' => $data['email'],
'subject' => $subject,
'html' => $html
]);
}
public function onContact(GenericEvent $event)
{
$data = $event->getSubject();
$html = $this->twig->render('email/contact.html.twig', [
'user' => $this->user,
'subject' => $data['subject'],
'message' => $data['message'],
'home_url' => $_ENV['HOME_URL'] ? $_ENV['HOME_URL'] : '#'
]);
/*Send email*/
$this->emailHandler->send([
'to' => $_ENV['EMAIL_ADMIN'],
'subject' => $data['subject'],
'html' => $html
]);
}
public function onCompanyStatusChange(GenericEvent $event)
{
$data = $event->getSubject();
$user = $data['user'];
$subject = $data['status'] === AbonnementConst::STATUS_ACTIVATED ? 'Réactivation de votre compte' : 'Suspension de votre compte';
if($data['status'] === AbonnementConst::STATUS_ACTIVATED){
$html = $this->twig->render('email/new/subscription.activated.html.twig', [
'user' => $user,
'home_url' => $_ENV['HOME_URL'] ? $_ENV['HOME_URL'] : '#'
]);
}
else if($data['status'] === AbonnementConst::STATUS_SUSPENDED){
$html = $this->twig->render('email/new/subscription.suspended.html.twig', [
'user' => $user,
'home_url' => $_ENV['HOME_URL'] ? $_ENV['HOME_URL'] : '#'
]);
}else{
return false;
}
/*Send email*/
$this->emailHandler->send([
'to' => $user->getEmail(),
'subject' => $subject,
'html' => $html
]);
}
public function onSubscriptionEndAdmin(GenericEvent $event)
{
$data = $event->getSubject();
$subject = "Abonnement de ${data['name']} bientôt expiré";
$html = $this->twig->render('email/new/rappel.subscription.admin.html.twig', $data);
/*Send email*/
$this->emailHandler->send([
'to' => isset( $data["email"]) ? $data['email'] : $_ENV['EMAIL_ADMIN'],
'subject' => $subject,
'html' => $html
]);
$this->emailHandler->send([
'to' => "sebastien.bourrel@kinalgo.com",
'subject' => $subject,
'html' => $html
]);
}
public function onSubscriptionEndRh(GenericEvent $event)
{
$data = $event->getSubject();
$subject = "Votre abonnement va bientôt expirer";
$html = $this->twig->render('email/new/rappel.subscription.rh.html.twig', $data);
/*Send email*/
$this->emailHandler->send([
'to' => $data['email'],
'subject' => $subject,
'html' => $html
]);
}
public function onSubscriptionExpired(GenericEvent $event)
{
$data = $event->getSubject();
$subject = "Votre abonnement a expiré";
$html = $this->twig->render('email/new/subscription.expired.rh.html.twig', $data);
/*Send email*/
$this->emailHandler->send([
'to' => $data['email'],
'subject' => $subject,
'html' => $html
]);
}
public function onNotificationNew(GenericEvent $event)
{
$data = $event->getSubject();
$user = $data['userTo'];
$userFrom = $data['userFrom'];
$type = $data['type'] === 'formation' ? 'publication' : $data['type'];
if (in_array('ROLE_ADMIN',$userFrom->getRoles())){
$fullName = "Kinalgo® Corporate";
}
elseif (in_array('ROLE_RH',$userFrom->getRoles())){
$fullName = "Votre établissement";
}
else{
$fullName = $userFrom->getFirstname() . " " . $userFrom->getLastname();
}
$message=sprintf(
'<p style="line-height:24px "> %s vous a partagé la %s : <br><a href="%s" style="color:#2B93D1">%s</a></p>',
$fullName,$type,$data['link'],$data['title']);
$html = $this->twig->render('email/new/notification.new.html.twig', [
"user"=>$user,
"message"=>$message,
"link"=>$data['link']
]);
/*Send email*/
$this->emailHandler->send([
'to' => $user->getEmail(),
'subject' => "Vous avez 1 nouvelle notification",
'html' => $html
]);
}
public function onCompletionLessThan(GenericEvent $event)
{
/* @var $user User*/
$user = $event->getSubject();
$html = $this->twig->render('email/new/completion.html.twig', [
'user' => $user
]);
/*Send email*/
$this->emailHandler->send([
'to' => $user->getEmail(),
'subject' => "Personnalisez votre expérience dès maintenant !",
'html' => $html
]);
}
}