src/Manager/MailerManager.php line 566

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: grego
  5.  * Date: 31/05/2022
  6.  * Time: 12:22
  7.  */
  8. namespace App\Manager;
  9. use App\Entity\Badge;
  10. use App\Entity\Recipient;
  11. use App\Entity\User;
  12. use DateTime;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Psr\Container\ContainerInterface;
  15. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  16. use Symfony\Component\DependencyInjection\Container;
  17. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\RequestStack;
  20. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  21. use Symfony\Component\Mailer\MailerInterface;
  22. use Symfony\Component\Mime\Address;
  23. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. use Twig\Environment;
  26. use Sonata\MediaBundle\Provider\Pool;
  27. class MailerManager
  28. {
  29.     const SENDER_EMAIL "noreply@globalcoss.com";
  30.     const SENDER_LABEL "COSS";
  31.     protected $mailer;
  32.     protected $em;
  33.     protected $container;
  34.     protected $translator;
  35.     protected $userManager;
  36.     protected $cossManager;
  37.     protected $requestStack;
  38.     protected $pool;
  39.     protected $router;
  40.     protected $parameterBag;
  41.     public function __construct(MailerInterface  $mailerEntityManagerInterface $em,ContainerInterface $containerTranslatorInterface $translatorRequestStack $requestStackUserManager $userManagerCossManager $cossManagerPool $poolUrlGeneratorInterface $routerParameterBagInterface $parameterBag)
  42.     {
  43.         $this->mailer $mailer;
  44.         $this->em $em;
  45.         $this->container $container;
  46.         $this->translator $translator;
  47.         $this->requestStack $requestStack;
  48.         $this->userManager $userManager;
  49.         $this->cossManager $cossManager;
  50.         $this->pool $pool;
  51.         $this->router $router;
  52.         $this->parameterBag $parameterBag;
  53.     }
  54.     public function sendEmail($to$subject$template$params){
  55.         if(filter_var($toFILTER_VALIDATE_EMAIL)){
  56.             $mail = (new TemplatedEmail())
  57.                 ->from(new Address(MailerManager::SENDER_EMAILMailerManager::SENDER_LABEL))
  58.                 ->to($to)
  59.                 ->subject($subject)
  60.                 ->htmlTemplate($template)
  61.                 ->context($params)
  62.             ;
  63.             try {
  64.                 $this->mailer->send($mail);
  65.             } catch (TransportExceptionInterface $e) {
  66.             }
  67.         }
  68.     }
  69.     public function getRecipientGuestToken($manager$user){
  70.         $data $manager->getId()."-manager-recipient-list-".$user->getId();
  71.         $r hash("sha512"$datafalse);
  72.         return $r;
  73.     }
  74.     public function getRecipientGuestUrl($manager$user){
  75.         return "https://manager.globalcoss.com/recipients/list/validation/".$this->getRecipientGuestToken($manager$user)."/".$user->getId();
  76.     }
  77.     public function sendAdminGeneratedPassword(User $user$password){
  78.         $request $this->requestStack->getCurrentRequest();
  79.         if($user->getLocale()){
  80.             $request->setLocale($user->getLocale());
  81.             $this->translator->setLocale($user->getLocale());
  82.         } else {
  83.             $request->setLocale("fr");
  84.             $this->translator->setLocale("fr");
  85.         }
  86.         if (in_array'ROLE_LOG_ACCESS'$user->getRoles() )){
  87.             $role $this->translator->trans("Auditeur", array(), 'mail');
  88.         } elseif (in_array'ROLE_SUPER_ADMIN'$user->getRoles() )){
  89.             $role $this->translator->trans("Super Administrateur", array(), 'mail');
  90.         } elseif (in_array'ROLE_BUSINESS_ADMIN'$user->getRoles() )){
  91.             $role $this->translator->trans("Super Administrateur Métier", array(), 'mail');
  92.         } elseif (in_array'ROLE_TECHNICAL_ADMIN'$user->getRoles() )){
  93.             $role $this->translator->trans("Super Administrateur Fonctionnel", array(), 'mail');
  94.         } else {
  95.             $role $this->translator->trans("Utilisateur", array(), 'mail');
  96.         }
  97.         $subject $this->translator->trans("COSS - Création de votre compte %role%", array('%role%' => $role), 'mail');
  98.         $template 'ApiBundle/Mail/admin_account_with_generated_password_email.html.twig';
  99.         $params = array(
  100.             "user" => $user,
  101.             "password" => $password,
  102.             "role" => $role
  103.         );
  104.         $this->sendEmail($user->getEmail(), $subject$template$params);
  105.     }
  106.     public function sendCossGeneratedPassword($user$password){
  107.         $request $this->requestStack->getCurrentRequest();
  108.         if($user->getLocale()){
  109.             $request->setLocale($user->getLocale());
  110.             $this->translator->setLocale($user->getLocale());
  111.         } else {
  112.             $request->setLocale("fr");
  113.             $this->translator->setLocale("fr");
  114.         }
  115.         $subject $this->translator->trans("Ton compte COSS by 5Feedback est créé, tu peux désormais attester de tes soft skills !", array(), 'mail');
  116.         $template 'ApiBundle/Mail/coss_student_account_with_generated_password_email.html.twig';
  117.         $params = array(
  118.             "user" => $user,
  119.             "password" => $password,
  120.         );
  121.         $this->sendEmail($user->getEmail(), $subject$template$params);
  122.     }
  123.     public function sendFeedbackRecap($user$type){
  124.         $request $this->requestStack->getCurrentRequest();
  125.         if($user->getLocale()){
  126.             $request->setLocale($user->getLocale());
  127.             $this->translator->setLocale($user->getLocale());
  128.         } else {
  129.             $request->setLocale("fr");
  130.             $this->translator->setLocale("fr");
  131.         }
  132.         switch($type){
  133.             case "j2":
  134.                 $startDate = new Datetime();
  135.                 $startDate->modify('-2 days');
  136.                 $startDate->setTime('0','0','0');
  137.                 $endDate= clone($startDate);
  138.                 $endDate->setTime('23','59','59');
  139.                 break;
  140.             case "j7":
  141.                 $startDate = new Datetime();
  142.                 $startDate->modify('-7 days');
  143.                 $startDate->setTime('0''0''0');
  144.                 $endDate= clone($startDate);
  145.                 $endDate->setTime('23','59','59');
  146.                 break;
  147.             case "recall":
  148.                 $startDate = new Datetime();
  149.                 $startDate->modify('-1 year');
  150.                 $startDate->setTime('0','0','0');
  151.                 $endDate= clone($startDate);
  152.                 $endDate->setTime('23','59','59');
  153.                 break;
  154.         }
  155.         $firstnameReceiver $user->getFirstname();
  156.         $pendingFeedbacks $this->userManager->getPendingFeedbacks($user->getId(), $startDate$endDate);
  157.         if(sizeof($pendingFeedbacks)!= 0){
  158.             $fullnameFirstFeedback $pendingFeedbacks[0]->getSender()->getFirstname()." ".$pendingFeedbacks[0]->getSender()->getLastname();
  159.             $totalSenders = Array();
  160.             $feedbacksBySender = Array();
  161.             foreach($pendingFeedbacks as $feedback) {
  162.                 // Get total senders
  163.                 $totalSenders[] = $feedback->getSender()->getId();
  164.                 // Get sender's photo url and name
  165.                 $featured $feedback->getSender()->getImage();
  166.                 if ($featured) {
  167.                     $provider $this->pool->getProvider($featured->getProviderName());
  168.                     $format $provider->getFormatName($featured"reference");
  169.                     $senderImage $request->getSchemeAndHttpHost()."/uploads/media/".$provider->generatePrivateUrl($featured$format);
  170.                 } else {
  171.                     $senderImage null;
  172.                 }
  173.                 $senderName $feedback->getSender()->getFirstname()." ".$feedback->getSender()->getLastname();
  174.                 if($feedback->getSender()->getCompany() != null){
  175.                     $senderCompany $feedback->getSender()->getCompany();
  176.                 } else {
  177.                     $request->setLocale($user->getLocale());
  178.                     $senderCompany $this->translator->trans(
  179.                         "Pas de société", array(), 'mail'
  180.                     );
  181.                 }
  182.                 //Group Feedbacks by Sender
  183.                 $sender $feedback->getSender()->getId();
  184.                 if (isset($feedbacksBySender[$sender])) {
  185.                     $feedbacksBySender[$sender]["feedbacks"][] = $feedback;
  186.                 } else {
  187.                     $feedbacksBySender[$sender]["name"] = $senderName;
  188.                     $feedbacksBySender[$sender]["company"] = $senderCompany;
  189.                     $feedbacksBySender[$sender]["photo"] = $senderImage;
  190.                     $feedbacksBySender[$sender]["feedbacks"] = array($feedback);
  191.                 }
  192.             }
  193.             foreach ($feedbacksBySender as $feedbackBySender ){
  194.                 $request->setLocale($user->getLocale());
  195.                 $this->translator->setLocale($user->getLocale());
  196.                 if($type == "j2"){
  197.                     $subject $this->translator->trans(
  198.                         "Relance - Répondez à %fullnameFirstFeedback% dans les 48 heures",
  199.                         array('%fullnameFirstFeedback%' => $fullnameFirstFeedback),'mail'
  200.                     );
  201.                     $template 'ApiBundle/Mail/recall_2_feedback_recap_email.html.twig';
  202.                 } elseif ($type == "j7"){
  203.                     $subject $this->translator->trans(
  204.                         "Relance - %fullnameFirstFeedback% a besoin de 8 réponses minimum",
  205.                         array('%fullnameFirstFeedback%' => $fullnameFirstFeedback),'mail'
  206.                     );
  207.                     $template 'ApiBundle/Mail/recall_7_feedback_recap_email.html.twig';
  208.                 } elseif ($type == "recall"){
  209.                     $subject $this->translator->trans(
  210.                         "%fullnameFirstFeedback% vous relance pour sa certification ESSEC & PwC",
  211.                         array('%fullnameFirstFeedback%' => $fullnameFirstFeedback),'mail'
  212.                     );
  213.                     $template 'ApiBundle/Mail/recall_manual_feedback_recap_email.html.twig';
  214.                 }
  215.                 $params = array(
  216.                     "fullnameFirstFeedback" => $fullnameFirstFeedback,
  217.                     "feedbacksBySender" => $feedbackBySender,
  218.                     "locale" => $user->getLocale(),
  219.                     "defaultAvatar" => $request->getSchemeAndHttpHost()."/build/images/avatar-default.png"
  220.                 );
  221.                 $this->sendEmail($user->getEmail(), $subject$template$params);
  222.             }
  223.             // Set lastRecallDate on user's recipients objects
  224.             if($type == 'recall'){
  225.                 $userRecipientsObjects $this->em->getRepository(Recipient::class)->findBy(array('user' => $user));
  226.                 foreach ($userRecipientsObjects as $recipientObject){
  227.                     $recipientObject->setLastRecallDate(new DateTime());
  228.                     $this->em->persist($recipientObject);
  229.                 }
  230.                 $this->em->flush();
  231.             }
  232.         } else {
  233.             return;
  234.         }
  235.     }
  236.     public function sendBadRatingEmail($feedback){
  237.         $subject "[BO-COSS]Moyenne inférieure à 2 - ".$feedback->getSender()->getFirstname()." ".$feedback->getSender()->getLastname();
  238.         $template 'ApiBundle/Mail/bad_rating_email.html.twig';
  239.         $params = array(
  240.             "feedback" => $feedback,
  241.         );
  242.         $this->sendEmail("contact@5feedback.com"$subject$template$params);
  243.     }
  244.     public function sendBadgesEmail($user$link$badge){
  245.         $request $this->requestStack->getCurrentRequest();
  246.         if($user->getLocale()){
  247.             $request->setLocale($user->getLocale());
  248.             $this->translator->setLocale($user->getLocale());
  249.         } else {
  250.             $request->setLocale("fr");
  251.             $this->translator->setLocale("fr");
  252.         }
  253.         $subject $this->translator->trans("Félicitations, vous avez obtenu une certification COSS by ESSEC et PwC ", array(), 'mail');
  254.         $template 'ApiBundle/Mail/badges_email.html.twig';
  255.         $params = array(
  256.             "user" => $user,
  257.             "link" => $link,
  258.             "skill" => $badge->getSkill()->getTitle()
  259.         );
  260.         $mail = (new TemplatedEmail())
  261.             ->from(new Address(MailerManager::SENDER_EMAILMailerManager::SENDER_LABEL))
  262.             ->to($user->getEmail())
  263.             ->subject($subject)
  264.             ->htmlTemplate($template)
  265.             ->context($params)
  266.         ;
  267.         $mail->attachFromPath($badge['link'], $badge['name']);
  268.         try {
  269.             $this->mailer->send($mail);
  270.         } catch (TransportExceptionInterface $e) {
  271.         }
  272.     }
  273.     public function sendAutomaticBadgesEmail($user$link$badge){
  274.         $request $this->requestStack->getCurrentRequest();
  275.         if($user->getLocale()){
  276.             $request->setLocale($user->getLocale());
  277.             $this->translator->setLocale($user->getLocale());
  278.         } else {
  279.             $request->setLocale("fr");
  280.             $this->translator->setLocale("fr");
  281.         }
  282.         $subject $this->translator->trans("Bravo, vous avez obtenu un badge COSS pour attester de votre niveau", array(), 'mail');
  283.         $template 'ApiBundle/Mail/badges_automatic_email.html.twig';
  284.         $params = array(
  285.             "user" => $user,
  286.             "link" => $link
  287.         );
  288.         $mail = (new TemplatedEmail())
  289.             ->from(new Address(MailerManager::SENDER_EMAILMailerManager::SENDER_LABEL))
  290.             ->to($user->getEmail())
  291.             ->subject($subject)
  292.             ->htmlTemplate($template)
  293.             ->context($params)
  294.         ;
  295.         $mail->attachFromPath($badge['link'], $badge['name']);
  296.         try {
  297.             $this->mailer->send($mail);
  298.         } catch (TransportExceptionInterface $e) {
  299.         }
  300.     }
  301.     public function prepareBadgeEmail($user$skill$badge$locale){
  302.         $average $this->userManager->getUserSkillAverage($user$skill$locale);
  303.         if($average) {
  304.             $projectDir $this->parameterBag->get('kernel.project_dir');
  305.             $outputPngPath $projectDir '/public/badges/'.$badge->getUser()->getId().'/baked/' $badge->getToken().'-badge-baked.png';   // Baked badge PNG
  306.             if(!file_exists($outputPngPath)){
  307.                 $bakedBadgeImage $this->cossManager->bakeOpenBadge($badge$skill$outputPngPath);
  308.             }
  309.             $link $this->router->generate('badges_detail', array('token' => $badge->getToken()), UrlGeneratorInterface::ABSOLUTE_URL);
  310.             $now = new \DateTime();
  311.             $this->sendAutomaticBadgesEmail($user$link, array('link' => $outputPngPath'name' => "badge-".$skill->getTitle().'-'.$now->format('d-m-Y').'.png'));
  312.         }
  313.     }
  314.     public function sendRecipientListChanged($manager$user){
  315.         $request $this->requestStack->getCurrentRequest();
  316.         if($manager->getLocale()){
  317.             $request->setLocale($manager->getLocale());
  318.             $this->translator->setLocale($manager->getLocale());
  319.         } else {
  320.             $request->setLocale("fr");
  321.             $this->translator->setLocale("fr");
  322.         }
  323.         $guestUrl $this->getRecipientGuestUrl($manager$user);
  324.         $subject $this->translator->trans("Pour validation – Certification ESSEC & PwC de %name%", array('%name%' => $user->getFirstname()." ".$user->getLastname()), 'mail');
  325.         $template 'ApiBundle\Mail\recipient_list_changed.html.twig';
  326.         $params = array(
  327.             "user" => $user,
  328.             "guestUrl" => $guestUrl
  329.         );
  330.         $this->sendEmail($manager->getEmail(), $subject$template$params);
  331.     }
  332.     public function sendRecipientListChangedRecall($manager$user){
  333.         $request $this->requestStack->getCurrentRequest();
  334.         if($manager->getLocale()){
  335.             $request->setLocale($manager->getLocale());
  336.             $this->translator->setLocale($manager->getLocale());
  337.         } else {
  338.             $request->setLocale("fr");
  339.             $this->translator->setLocale("fr");
  340.         }
  341.         $guestUrl $this->getRecipientGuestUrl($manager$user);
  342.         $subject $this->translator->trans("Relance pour validation – Certification ESSEC & PwC de %name%", array('%name%' => $user->getFirstname()." ".$user->getLastname()), 'mail');
  343.         $template 'ApiBundle\Mail\recipient_list_changed_recall.html.twig';
  344.         $params = array(
  345.             "user" => $user,
  346.             "guestUrl" => $guestUrl
  347.         );
  348.         $this->sendEmail($manager->getEmail(), $subject$template$params);
  349.     }
  350.     public function sendCOSSRecipientListChanged($user){
  351.         $request $this->requestStack->getCurrentRequest();
  352.         $request->setLocale("fr");
  353.         $this->translator->setLocale("fr");
  354.         $link $this->router->generate('list_user_recipients', array('appUser' => $user->getId()), UrlGeneratorInterface::ABSOLUTE_URL);
  355.         $subject $this->translator->trans("Relance pour validation – Certification ESSEC & PwC de %name%", array('%name%' => $user->getFirstname()." ".$user->getLastname()), 'mail');
  356.         $template 'ApiBundle\Mail\recipient_list_changed.html.twig';
  357.         $params = array(
  358.             "user" => $user,
  359.             "guestUrl" => $link
  360.         );
  361.         $this->sendEmail("contact@globalcoss.com"$subject$template$params);
  362.     }
  363.     public function setRecipientsOnlyValidatedEmail($user$recipientsData){
  364.         $request $this->requestStack->getCurrentRequest();
  365.         if($user->getLocale()){
  366.             $request->setLocale($user->getLocale());
  367.             $this->translator->setLocale($user->getLocale());
  368.         } else {
  369.             $request->setLocale("fr");
  370.             $this->translator->setLocale("fr");
  371.         }
  372.         $subject $this->translator->trans("Vos contacts COSS ont été validés", array(), 'mail');
  373.         $template 'ApiBundle\Mail\all_recipients_validated.html.twig';
  374.         $params = array(
  375.             "user" => $user,
  376.             "recipients" => $recipientsData
  377.         );
  378.         $this->sendEmail($user->getEmail(), $subject$template$params);
  379.     }
  380.     public function setRecipientsOnlyDeletedEmail($user$recipientsData){
  381.         $request $this->requestStack->getCurrentRequest();
  382.         if($user->getLocale()){
  383.             $request->setLocale($user->getLocale());
  384.             $this->translator->setLocale($user->getLocale());
  385.         } else {
  386.             $request->setLocale("fr");
  387.             $this->translator->setLocale("fr");
  388.         }
  389.         $subject $this->translator->trans("Vos contacts COSS ont été invalidés", array(), 'mail');
  390.         $template 'ApiBundle\Mail\all_recipients_deleted.html.twig';
  391.         $params = array(
  392.             "user" => $user,
  393.             "recipients" => $recipientsData
  394.         );
  395.         $this->sendEmail($user->getEmail(), $subject$template$params);
  396.     }
  397.     public function setRecipientsOnlyInfoEmail($user$recipientsData){
  398.         $request $this->requestStack->getCurrentRequest();
  399.         if($user->getLocale()){
  400.             $request->setLocale($user->getLocale());
  401.             $this->translator->setLocale($user->getLocale());
  402.         } else {
  403.             $request->setLocale("fr");
  404.             $this->translator->setLocale("fr");
  405.         }
  406.         $subject $this->translator->trans("Tes contacts COSS : demande d'infos supplémentaires", array(), 'mail');
  407.         $template 'ApiBundle\Mail\all_recipients_info.html.twig';
  408.         $link $this->router->generate('user_recipients_proof', array('id' => $user->getId(), 'token' => $user->getRecipientProofGuestToken()), UrlGeneratorInterface::ABSOLUTE_URL);
  409.         $params = array(
  410.             "user" => $user,
  411.             "recipients" => $recipientsData,
  412.             "link" => $link
  413.         );
  414.         $this->sendEmail($user->getEmail(), $subject$template$params);
  415.     }
  416.     public function setRecipientsMultiCaseEmail($user$recipientsData){
  417.         $request $this->requestStack->getCurrentRequest();
  418.         if($user->getLocale()){
  419.             $request->setLocale($user->getLocale());
  420.             $this->translator->setLocale($user->getLocale());
  421.         } else {
  422.             $request->setLocale("fr");
  423.             $this->translator->setLocale("fr");
  424.         }
  425.         $subject $this->translator->trans("Résultats de la validation de tes contacts COSS", array(), 'mail');
  426.         $template 'ApiBundle\Mail\recipients_multi_cases.html.twig';
  427.         $link $this->router->generate('user_recipients_proof', array('id' => $user->getId(), 'token' => $user->getRecipientProofGuestToken()), UrlGeneratorInterface::ABSOLUTE_URL);
  428.         $params = array(
  429.             "user" => $user,
  430.             "recipients" => $recipientsData,
  431.             "link" => $link
  432.         );
  433.         $this->sendEmail($user->getEmail(), $subject$template$params);
  434.     }
  435.     public function sendCOSSNewProofEmail($appUser$recipients$proofs){
  436.         $request $this->requestStack->getCurrentRequest();
  437.         $request->setLocale("fr");
  438.         $subject $this->translator->trans("Validation des répondants - Un utilisateur a ajouté une preuve", array(), 'mail');
  439.         $template 'ApiBundle\Mail\coss_new_proof.html.twig';
  440.         $params = array(
  441.             "appUser" => $appUser,
  442.             "recipients" => $recipients,
  443.             "proofs" => $proofs
  444.         );
  445.         $this->sendEmail("contact@globalcoss.com"$subject$template$params);
  446.     }
  447.     public function sendBadgesRecapEmail($user)
  448.     {
  449.         $request $this->requestStack->getCurrentRequest();
  450.         if($user->getLocale()){
  451.             $request->setLocale($user->getLocale());
  452.             $this->translator->setLocale($user->getLocale());
  453.         } else {
  454.             $request->setLocale("fr");
  455.             $this->translator->setLocale("fr");
  456.         }
  457.         $subject $this->translator->trans("Vos certifications COSS by ESSEC & PwC", array(), 'mail');
  458.         $template 'ApiBundle/Mail/badges_recap_email.html.twig';
  459.         $badges $this->em->getRepository(Badge::class)->getBadgesHistory($user);
  460.         $links = array();
  461.         $images = array();
  462.         foreach ($badges as $badge){
  463.             $skill $badge->getSkill();
  464.             $average $this->userManager->getUserSkillAverage($user$skill$user->getLocale());
  465.             if($average) {
  466.                 $badgeImagePath __DIR__ '/../../../public/badges/'.$badge->getUser()->getId().'/'$badge->getToken().'-badge.png';
  467.                 $images[] = array('link' => $badgeImagePath'name' => "badge-".$skill->getTitle());
  468.                 $link $this->router->generate('badges_detail', array('token' => $badge->getToken()), UrlGeneratorInterface::ABSOLUTE_URL);
  469.                 $links[] = array("name" => $skill->getTitle(), "link" => $link);
  470.             }
  471.         }
  472.         $params = array(
  473.             "user" => $user,
  474.             "links" => $links
  475.         );
  476.         $mail = (new TemplatedEmail())
  477.             ->from(new Address(MailerManager::SENDER_EMAILMailerManager::SENDER_LABEL))
  478.             ->to($user->getEmail())
  479.             ->subject($subject)
  480.             ->htmlTemplate($template)
  481.             ->context($params)
  482.         ;
  483.         foreach ($images as $image) {
  484.             $mail->attachFromPath($image['link'], $image['name']);
  485.         }
  486.         try {
  487.             $this->mailer->send($mail);
  488.         } catch (TransportExceptionInterface $e) {
  489.         }
  490.     }
  491.     public function sendBatchFeedbackEmail($groupedFeedbacks){
  492.         dump($groupedFeedbacks);
  493.         $request $this->requestStack->getCurrentRequest();
  494.         foreach ($groupedFeedbacks as $groupedFeedback){
  495.             $firstFeedback $groupedFeedback['feedbacks'][0];
  496.             $firstnameReceiver $firstFeedback->getRecipient()->getFirstname();
  497.             $firstnameSender $firstFeedback->getSender()->getFirstname();
  498.             $lastnameSender $firstFeedback->getSender()->getLastname();
  499.             $request->setLocale($firstFeedback->getRecipient()->getLocale());
  500.             $this->translator->setLocale($firstFeedback->getRecipient()->getLocale());
  501.             $subject $this->translator->trans(
  502.                 "Aidez %firstnameSender% %lastnameSender% à certifier ses soft skills",
  503.                 array('%firstnameSender%' => $firstnameSender'%lastnameSender%' => $lastnameSender), 'mail'
  504.             );
  505.             $template 'ApiBundle/Mail/batch_feedback_recap_email.html.twig';
  506.             $params = array(
  507.                 "firstnameSender" => $firstnameSender,
  508.                 "lastnameSender" => $lastnameSender,
  509.                 "feedbacksBySender" => $groupedFeedback,
  510.                 "locale" => $firstFeedback->getRecipient()->getLocale(),
  511.                 "defaultAvatar" => $request->getSchemeAndHttpHost()."/build/images/avatar-default.png"
  512.             );
  513.             $this->sendEmail($firstFeedback->getRecipient()->getEmail(), $subject$template$params);
  514.         }
  515.     }
  516. }