<?php
/**
* Created by PhpStorm.
* User: grego
* Date: 31/05/2022
* Time: 12:22
*/
namespace App\Manager;
use App\Entity\Badge;
use App\Entity\Recipient;
use App\Entity\User;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Container\ContainerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Environment;
use Sonata\MediaBundle\Provider\Pool;
class MailerManager
{
const SENDER_EMAIL = "noreply@globalcoss.com";
const SENDER_LABEL = "COSS";
protected $mailer;
protected $em;
protected $container;
protected $translator;
protected $userManager;
protected $cossManager;
protected $requestStack;
protected $pool;
protected $router;
protected $parameterBag;
public function __construct(MailerInterface $mailer, EntityManagerInterface $em,ContainerInterface $container, TranslatorInterface $translator, RequestStack $requestStack, UserManager $userManager, CossManager $cossManager, Pool $pool, UrlGeneratorInterface $router, ParameterBagInterface $parameterBag)
{
$this->mailer = $mailer;
$this->em = $em;
$this->container = $container;
$this->translator = $translator;
$this->requestStack = $requestStack;
$this->userManager = $userManager;
$this->cossManager = $cossManager;
$this->pool = $pool;
$this->router = $router;
$this->parameterBag = $parameterBag;
}
public function sendEmail($to, $subject, $template, $params){
if(filter_var($to, FILTER_VALIDATE_EMAIL)){
$mail = (new TemplatedEmail())
->from(new Address(MailerManager::SENDER_EMAIL, MailerManager::SENDER_LABEL))
->to($to)
->subject($subject)
->htmlTemplate($template)
->context($params)
;
try {
$this->mailer->send($mail);
} catch (TransportExceptionInterface $e) {
}
}
}
public function getRecipientGuestToken($manager, $user){
$data = $manager->getId()."-manager-recipient-list-".$user->getId();
$r = hash("sha512", $data, false);
return $r;
}
public function getRecipientGuestUrl($manager, $user){
return "https://manager.globalcoss.com/recipients/list/validation/".$this->getRecipientGuestToken($manager, $user)."/".$user->getId();
}
public function sendAdminGeneratedPassword(User $user, $password){
$request = $this->requestStack->getCurrentRequest();
if($user->getLocale()){
$request->setLocale($user->getLocale());
$this->translator->setLocale($user->getLocale());
} else {
$request->setLocale("fr");
$this->translator->setLocale("fr");
}
if (in_array( 'ROLE_LOG_ACCESS', $user->getRoles() )){
$role = $this->translator->trans("Auditeur", array(), 'mail');
} elseif (in_array( 'ROLE_SUPER_ADMIN', $user->getRoles() )){
$role = $this->translator->trans("Super Administrateur", array(), 'mail');
} elseif (in_array( 'ROLE_BUSINESS_ADMIN', $user->getRoles() )){
$role = $this->translator->trans("Super Administrateur Métier", array(), 'mail');
} elseif (in_array( 'ROLE_TECHNICAL_ADMIN', $user->getRoles() )){
$role = $this->translator->trans("Super Administrateur Fonctionnel", array(), 'mail');
} else {
$role = $this->translator->trans("Utilisateur", array(), 'mail');
}
$subject = $this->translator->trans("COSS - Création de votre compte %role%", array('%role%' => $role), 'mail');
$template = 'ApiBundle/Mail/admin_account_with_generated_password_email.html.twig';
$params = array(
"user" => $user,
"password" => $password,
"role" => $role
);
$this->sendEmail($user->getEmail(), $subject, $template, $params);
}
public function sendCossGeneratedPassword($user, $password){
$request = $this->requestStack->getCurrentRequest();
if($user->getLocale()){
$request->setLocale($user->getLocale());
$this->translator->setLocale($user->getLocale());
} else {
$request->setLocale("fr");
$this->translator->setLocale("fr");
}
$subject = $this->translator->trans("Ton compte COSS by 5Feedback est créé, tu peux désormais attester de tes soft skills !", array(), 'mail');
$template = 'ApiBundle/Mail/coss_student_account_with_generated_password_email.html.twig';
$params = array(
"user" => $user,
"password" => $password,
);
$this->sendEmail($user->getEmail(), $subject, $template, $params);
}
public function sendFeedbackRecap($user, $type){
$request = $this->requestStack->getCurrentRequest();
if($user->getLocale()){
$request->setLocale($user->getLocale());
$this->translator->setLocale($user->getLocale());
} else {
$request->setLocale("fr");
$this->translator->setLocale("fr");
}
switch($type){
case "j2":
$startDate = new Datetime();
$startDate->modify('-2 days');
$startDate->setTime('0','0','0');
$endDate= clone($startDate);
$endDate->setTime('23','59','59');
break;
case "j7":
$startDate = new Datetime();
$startDate->modify('-7 days');
$startDate->setTime('0', '0', '0');
$endDate= clone($startDate);
$endDate->setTime('23','59','59');
break;
case "recall":
$startDate = new Datetime();
$startDate->modify('-1 year');
$startDate->setTime('0','0','0');
$endDate= clone($startDate);
$endDate->setTime('23','59','59');
break;
}
$firstnameReceiver = $user->getFirstname();
$pendingFeedbacks = $this->userManager->getPendingFeedbacks($user->getId(), $startDate, $endDate);
if(sizeof($pendingFeedbacks)!= 0){
$fullnameFirstFeedback = $pendingFeedbacks[0]->getSender()->getFirstname()." ".$pendingFeedbacks[0]->getSender()->getLastname();
$totalSenders = Array();
$feedbacksBySender = Array();
foreach($pendingFeedbacks as $feedback) {
// Get total senders
$totalSenders[] = $feedback->getSender()->getId();
// Get sender's photo url and name
$featured = $feedback->getSender()->getImage();
if ($featured) {
$provider = $this->pool->getProvider($featured->getProviderName());
$format = $provider->getFormatName($featured, "reference");
$senderImage = $request->getSchemeAndHttpHost()."/uploads/media/".$provider->generatePrivateUrl($featured, $format);
} else {
$senderImage = null;
}
$senderName = $feedback->getSender()->getFirstname()." ".$feedback->getSender()->getLastname();
if($feedback->getSender()->getCompany() != null){
$senderCompany = $feedback->getSender()->getCompany();
} else {
$request->setLocale($user->getLocale());
$senderCompany = $this->translator->trans(
"Pas de société", array(), 'mail'
);
}
//Group Feedbacks by Sender
$sender = $feedback->getSender()->getId();
if (isset($feedbacksBySender[$sender])) {
$feedbacksBySender[$sender]["feedbacks"][] = $feedback;
} else {
$feedbacksBySender[$sender]["name"] = $senderName;
$feedbacksBySender[$sender]["company"] = $senderCompany;
$feedbacksBySender[$sender]["photo"] = $senderImage;
$feedbacksBySender[$sender]["feedbacks"] = array($feedback);
}
}
foreach ($feedbacksBySender as $feedbackBySender ){
$request->setLocale($user->getLocale());
$this->translator->setLocale($user->getLocale());
if($type == "j2"){
$subject = $this->translator->trans(
"Relance - Répondez à %fullnameFirstFeedback% dans les 48 heures",
array('%fullnameFirstFeedback%' => $fullnameFirstFeedback),'mail'
);
$template = 'ApiBundle/Mail/recall_2_feedback_recap_email.html.twig';
} elseif ($type == "j7"){
$subject = $this->translator->trans(
"Relance - %fullnameFirstFeedback% a besoin de 8 réponses minimum",
array('%fullnameFirstFeedback%' => $fullnameFirstFeedback),'mail'
);
$template = 'ApiBundle/Mail/recall_7_feedback_recap_email.html.twig';
} elseif ($type == "recall"){
$subject = $this->translator->trans(
"%fullnameFirstFeedback% vous relance pour sa certification ESSEC & PwC",
array('%fullnameFirstFeedback%' => $fullnameFirstFeedback),'mail'
);
$template = 'ApiBundle/Mail/recall_manual_feedback_recap_email.html.twig';
}
$params = array(
"fullnameFirstFeedback" => $fullnameFirstFeedback,
"feedbacksBySender" => $feedbackBySender,
"locale" => $user->getLocale(),
"defaultAvatar" => $request->getSchemeAndHttpHost()."/build/images/avatar-default.png"
);
$this->sendEmail($user->getEmail(), $subject, $template, $params);
}
// Set lastRecallDate on user's recipients objects
if($type == 'recall'){
$userRecipientsObjects = $this->em->getRepository(Recipient::class)->findBy(array('user' => $user));
foreach ($userRecipientsObjects as $recipientObject){
$recipientObject->setLastRecallDate(new DateTime());
$this->em->persist($recipientObject);
}
$this->em->flush();
}
} else {
return;
}
}
public function sendBadRatingEmail($feedback){
$subject = "[BO-COSS]Moyenne inférieure à 2 - ".$feedback->getSender()->getFirstname()." ".$feedback->getSender()->getLastname();
$template = 'ApiBundle/Mail/bad_rating_email.html.twig';
$params = array(
"feedback" => $feedback,
);
$this->sendEmail("contact@5feedback.com", $subject, $template, $params);
}
public function sendBadgesEmail($user, $link, $badge){
$request = $this->requestStack->getCurrentRequest();
if($user->getLocale()){
$request->setLocale($user->getLocale());
$this->translator->setLocale($user->getLocale());
} else {
$request->setLocale("fr");
$this->translator->setLocale("fr");
}
$subject = $this->translator->trans("Félicitations, vous avez obtenu une certification COSS by ESSEC et PwC ", array(), 'mail');
$template = 'ApiBundle/Mail/badges_email.html.twig';
$params = array(
"user" => $user,
"link" => $link,
"skill" => $badge->getSkill()->getTitle()
);
$mail = (new TemplatedEmail())
->from(new Address(MailerManager::SENDER_EMAIL, MailerManager::SENDER_LABEL))
->to($user->getEmail())
->subject($subject)
->htmlTemplate($template)
->context($params)
;
$mail->attachFromPath($badge['link'], $badge['name']);
try {
$this->mailer->send($mail);
} catch (TransportExceptionInterface $e) {
}
}
public function sendAutomaticBadgesEmail($user, $link, $badge){
$request = $this->requestStack->getCurrentRequest();
if($user->getLocale()){
$request->setLocale($user->getLocale());
$this->translator->setLocale($user->getLocale());
} else {
$request->setLocale("fr");
$this->translator->setLocale("fr");
}
$subject = $this->translator->trans("Bravo, vous avez obtenu un badge COSS pour attester de votre niveau", array(), 'mail');
$template = 'ApiBundle/Mail/badges_automatic_email.html.twig';
$params = array(
"user" => $user,
"link" => $link
);
$mail = (new TemplatedEmail())
->from(new Address(MailerManager::SENDER_EMAIL, MailerManager::SENDER_LABEL))
->to($user->getEmail())
->subject($subject)
->htmlTemplate($template)
->context($params)
;
$mail->attachFromPath($badge['link'], $badge['name']);
try {
$this->mailer->send($mail);
} catch (TransportExceptionInterface $e) {
}
}
public function prepareBadgeEmail($user, $skill, $badge, $locale){
$average = $this->userManager->getUserSkillAverage($user, $skill, $locale);
if($average) {
$projectDir = $this->parameterBag->get('kernel.project_dir');
$outputPngPath = $projectDir . '/public/badges/'.$badge->getUser()->getId().'/baked/' . $badge->getToken().'-badge-baked.png'; // Baked badge PNG
if(!file_exists($outputPngPath)){
$bakedBadgeImage = $this->cossManager->bakeOpenBadge($badge, $skill, $outputPngPath);
}
$link = $this->router->generate('badges_detail', array('token' => $badge->getToken()), UrlGeneratorInterface::ABSOLUTE_URL);
$now = new \DateTime();
$this->sendAutomaticBadgesEmail($user, $link, array('link' => $outputPngPath, 'name' => "badge-".$skill->getTitle().'-'.$now->format('d-m-Y').'.png'));
}
}
public function sendRecipientListChanged($manager, $user){
$request = $this->requestStack->getCurrentRequest();
if($manager->getLocale()){
$request->setLocale($manager->getLocale());
$this->translator->setLocale($manager->getLocale());
} else {
$request->setLocale("fr");
$this->translator->setLocale("fr");
}
$guestUrl = $this->getRecipientGuestUrl($manager, $user);
$subject = $this->translator->trans("Pour validation – Certification ESSEC & PwC de %name%", array('%name%' => $user->getFirstname()." ".$user->getLastname()), 'mail');
$template = 'ApiBundle\Mail\recipient_list_changed.html.twig';
$params = array(
"user" => $user,
"guestUrl" => $guestUrl
);
$this->sendEmail($manager->getEmail(), $subject, $template, $params);
}
public function sendRecipientListChangedRecall($manager, $user){
$request = $this->requestStack->getCurrentRequest();
if($manager->getLocale()){
$request->setLocale($manager->getLocale());
$this->translator->setLocale($manager->getLocale());
} else {
$request->setLocale("fr");
$this->translator->setLocale("fr");
}
$guestUrl = $this->getRecipientGuestUrl($manager, $user);
$subject = $this->translator->trans("Relance pour validation – Certification ESSEC & PwC de %name%", array('%name%' => $user->getFirstname()." ".$user->getLastname()), 'mail');
$template = 'ApiBundle\Mail\recipient_list_changed_recall.html.twig';
$params = array(
"user" => $user,
"guestUrl" => $guestUrl
);
$this->sendEmail($manager->getEmail(), $subject, $template, $params);
}
public function sendCOSSRecipientListChanged($user){
$request = $this->requestStack->getCurrentRequest();
$request->setLocale("fr");
$this->translator->setLocale("fr");
$link = $this->router->generate('list_user_recipients', array('appUser' => $user->getId()), UrlGeneratorInterface::ABSOLUTE_URL);
$subject = $this->translator->trans("Relance pour validation – Certification ESSEC & PwC de %name%", array('%name%' => $user->getFirstname()." ".$user->getLastname()), 'mail');
$template = 'ApiBundle\Mail\recipient_list_changed.html.twig';
$params = array(
"user" => $user,
"guestUrl" => $link
);
$this->sendEmail("contact@globalcoss.com", $subject, $template, $params);
}
public function setRecipientsOnlyValidatedEmail($user, $recipientsData){
$request = $this->requestStack->getCurrentRequest();
if($user->getLocale()){
$request->setLocale($user->getLocale());
$this->translator->setLocale($user->getLocale());
} else {
$request->setLocale("fr");
$this->translator->setLocale("fr");
}
$subject = $this->translator->trans("Vos contacts COSS ont été validés", array(), 'mail');
$template = 'ApiBundle\Mail\all_recipients_validated.html.twig';
$params = array(
"user" => $user,
"recipients" => $recipientsData
);
$this->sendEmail($user->getEmail(), $subject, $template, $params);
}
public function setRecipientsOnlyDeletedEmail($user, $recipientsData){
$request = $this->requestStack->getCurrentRequest();
if($user->getLocale()){
$request->setLocale($user->getLocale());
$this->translator->setLocale($user->getLocale());
} else {
$request->setLocale("fr");
$this->translator->setLocale("fr");
}
$subject = $this->translator->trans("Vos contacts COSS ont été invalidés", array(), 'mail');
$template = 'ApiBundle\Mail\all_recipients_deleted.html.twig';
$params = array(
"user" => $user,
"recipients" => $recipientsData
);
$this->sendEmail($user->getEmail(), $subject, $template, $params);
}
public function setRecipientsOnlyInfoEmail($user, $recipientsData){
$request = $this->requestStack->getCurrentRequest();
if($user->getLocale()){
$request->setLocale($user->getLocale());
$this->translator->setLocale($user->getLocale());
} else {
$request->setLocale("fr");
$this->translator->setLocale("fr");
}
$subject = $this->translator->trans("Tes contacts COSS : demande d'infos supplémentaires", array(), 'mail');
$template = 'ApiBundle\Mail\all_recipients_info.html.twig';
$link = $this->router->generate('user_recipients_proof', array('id' => $user->getId(), 'token' => $user->getRecipientProofGuestToken()), UrlGeneratorInterface::ABSOLUTE_URL);
$params = array(
"user" => $user,
"recipients" => $recipientsData,
"link" => $link
);
$this->sendEmail($user->getEmail(), $subject, $template, $params);
}
public function setRecipientsMultiCaseEmail($user, $recipientsData){
$request = $this->requestStack->getCurrentRequest();
if($user->getLocale()){
$request->setLocale($user->getLocale());
$this->translator->setLocale($user->getLocale());
} else {
$request->setLocale("fr");
$this->translator->setLocale("fr");
}
$subject = $this->translator->trans("Résultats de la validation de tes contacts COSS", array(), 'mail');
$template = 'ApiBundle\Mail\recipients_multi_cases.html.twig';
$link = $this->router->generate('user_recipients_proof', array('id' => $user->getId(), 'token' => $user->getRecipientProofGuestToken()), UrlGeneratorInterface::ABSOLUTE_URL);
$params = array(
"user" => $user,
"recipients" => $recipientsData,
"link" => $link
);
$this->sendEmail($user->getEmail(), $subject, $template, $params);
}
public function sendCOSSNewProofEmail($appUser, $recipients, $proofs){
$request = $this->requestStack->getCurrentRequest();
$request->setLocale("fr");
$subject = $this->translator->trans("Validation des répondants - Un utilisateur a ajouté une preuve", array(), 'mail');
$template = 'ApiBundle\Mail\coss_new_proof.html.twig';
$params = array(
"appUser" => $appUser,
"recipients" => $recipients,
"proofs" => $proofs
);
$this->sendEmail("contact@globalcoss.com", $subject, $template, $params);
}
public function sendBadgesRecapEmail($user)
{
$request = $this->requestStack->getCurrentRequest();
if($user->getLocale()){
$request->setLocale($user->getLocale());
$this->translator->setLocale($user->getLocale());
} else {
$request->setLocale("fr");
$this->translator->setLocale("fr");
}
$subject = $this->translator->trans("Vos certifications COSS by ESSEC & PwC", array(), 'mail');
$template = 'ApiBundle/Mail/badges_recap_email.html.twig';
$badges = $this->em->getRepository(Badge::class)->getBadgesHistory($user);
$links = array();
$images = array();
foreach ($badges as $badge){
$skill = $badge->getSkill();
$average = $this->userManager->getUserSkillAverage($user, $skill, $user->getLocale());
if($average) {
$badgeImagePath = __DIR__ . '/../../../public/badges/'.$badge->getUser()->getId().'/'. $badge->getToken().'-badge.png';
$images[] = array('link' => $badgeImagePath, 'name' => "badge-".$skill->getTitle());
$link = $this->router->generate('badges_detail', array('token' => $badge->getToken()), UrlGeneratorInterface::ABSOLUTE_URL);
$links[] = array("name" => $skill->getTitle(), "link" => $link);
}
}
$params = array(
"user" => $user,
"links" => $links
);
$mail = (new TemplatedEmail())
->from(new Address(MailerManager::SENDER_EMAIL, MailerManager::SENDER_LABEL))
->to($user->getEmail())
->subject($subject)
->htmlTemplate($template)
->context($params)
;
foreach ($images as $image) {
$mail->attachFromPath($image['link'], $image['name']);
}
try {
$this->mailer->send($mail);
} catch (TransportExceptionInterface $e) {
}
}
public function sendBatchFeedbackEmail($groupedFeedbacks){
dump($groupedFeedbacks);
$request = $this->requestStack->getCurrentRequest();
foreach ($groupedFeedbacks as $groupedFeedback){
$firstFeedback = $groupedFeedback['feedbacks'][0];
$firstnameReceiver = $firstFeedback->getRecipient()->getFirstname();
$firstnameSender = $firstFeedback->getSender()->getFirstname();
$lastnameSender = $firstFeedback->getSender()->getLastname();
$request->setLocale($firstFeedback->getRecipient()->getLocale());
$this->translator->setLocale($firstFeedback->getRecipient()->getLocale());
$subject = $this->translator->trans(
"Aidez %firstnameSender% %lastnameSender% à certifier ses soft skills",
array('%firstnameSender%' => $firstnameSender, '%lastnameSender%' => $lastnameSender), 'mail'
);
$template = 'ApiBundle/Mail/batch_feedback_recap_email.html.twig';
$params = array(
"firstnameSender" => $firstnameSender,
"lastnameSender" => $lastnameSender,
"feedbacksBySender" => $groupedFeedback,
"locale" => $firstFeedback->getRecipient()->getLocale(),
"defaultAvatar" => $request->getSchemeAndHttpHost()."/build/images/avatar-default.png"
);
$this->sendEmail($firstFeedback->getRecipient()->getEmail(), $subject, $template, $params);
}
}
}