src/Controller/AdminBundle/CRONController.php line 59

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: grego
  5.  * Date: 07/11/2022
  6.  * Time: 12:25
  7.  */
  8. namespace App\Controller\AdminBundle;
  9. use App\Entity\BatchEmail;
  10. use App\Entity\Campaign;
  11. use App\Entity\MailTemplate;
  12. use App\Entity\Participation;
  13. use App\Entity\User;
  14. use App\Manager\CossManager;
  15. use App\Manager\MailerManager;
  16. use App\Manager\MistralManager;
  17. use App\Manager\ReportManager;
  18. use App\Manager\UserManager;
  19. use App\Repository\BatchEmailRepository;
  20. use App\Repository\CampaignRepository;
  21. use App\Repository\MailTemplateRepository;
  22. use App\Repository\ParticipationRepository;
  23. use App\Repository\RecipientRepository;
  24. use DateTime;
  25. use Doctrine\ORM\EntityManagerInterface;
  26. use Exception;
  27. use PhpOffice\PhpSpreadsheet\Shared\Date;
  28. use Sonata\MediaBundle\Provider\Pool;
  29. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  30. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  31. use Symfony\Component\HttpFoundation\Request;
  32. use Symfony\Component\HttpFoundation\Response;
  33. use Symfony\Component\HttpFoundation\StreamedResponse;
  34. use Symfony\Component\Routing\Annotation\Route;
  35. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  36. use Symfony\Contracts\Translation\TranslatorInterface;
  37. class CRONController extends AbstractController
  38. {
  39.     private $CRON_TOKEN "ffd6600b2594eafae3b2f0528a4cb51a";
  40.     /**
  41.      * @Route("/cron/debug/quality/{token}")
  42.      */
  43.     public function debugQuality($tokenEntityManagerInterface $entityManagerMailerManager $mailerManagerUserManager $userManagerCossManager $cossManagerMistralManager $mistralManagerTranslatorInterface $translatorParameterBagInterface $parameterBag){
  44.         set_time_limit(0);
  45.         ini_set('max_execution_time'3600); //3600 seconds = 1 heure
  46.         ini_set('memory_limit''-1');
  47.         $user $entityManager->getRepository(User::class)->find(145);
  48.         return New Response("OK"200);
  49.     }
  50.     /**
  51.      * @Route("/cron/send/batch/email/{token}")
  52.      */
  53.     public function sendBatchEmail($tokenRequest $requestEntityManagerInterface $entityManagerMailerManager $mailerManager)
  54.     {
  55.         if ($token == $this->CRON_TOKEN) {
  56.             $batchEmails $entityManager->getRepository(BatchEmail::class)->getPendingBatchEmailsPastFiveMinuts();
  57.             foreach ($batchEmails as $batchEmail) {
  58.                 $recipient $batchEmail->getRecipient();
  59.                 // Générer l'URL du répondant
  60.                 $recipientLink $this->generateUrl('quiz_answer', ['participationId' => $recipient->getParticipation()->getId() ,'token' => $recipient->getToken()],
  61.                     UrlGeneratorInterface::ABSOLUTE_URL
  62.                 );
  63.                 $mailTemplate $entityManager->getRepository(MailTemplate::class)->findOneBy(array('type' => $batchEmail->getType(), 'program' => $recipient->getParticipation()->getCampaign()->getProgram()));
  64.                 $mailerManager->sendBatchEmail($recipient$mailTemplate$recipientLink$recipient->getParticipation()->getParticipant()->getLocale());
  65.                 $batchEmail->setStatus(BatchEmailRepository::STATUS_TREATED);
  66.                 $entityManager->persist($batchEmail);
  67.             }
  68.             $entityManager->flush();
  69.             return New Response(""200);
  70.         } else {
  71.             return New Response("access denied"401);
  72.         }
  73.     }
  74.     /**
  75.      * @Route("/cron/send/recall/email/{type}/{token}")
  76.      */
  77.     public function sendRecallEmail($type$tokenRequest $requestEntityManagerInterface $entityManagerMailerManager $mailerManagerTranslatorInterface $translator)
  78.     {
  79.         if ($token == $this->CRON_TOKEN) {
  80.             switch($type){
  81.                 case "1_week_start":
  82.                     // Recall 1 week after participation started only if no active recipients
  83.                     $participations $entityManager->getRepository(Participation::class)->getParticipationsWithNoActiveRecipientsAfter1Week();
  84.                     foreach($participations as $participation){
  85.                         $template $entityManager->getRepository(MailTemplate::class)->findOneBy(array('type' => MailTemplateRepository::PARTICIPANT_RECALL'program' => $participation->getCampaign()->getProgram()));
  86.                         // Générer l'URL du participant
  87.                         $participationLink $this->generateUrl('participation_recipients', ['campaignToken' => $participation->getCampaign()->getToken()],
  88.                             UrlGeneratorInterface::ABSOLUTE_URL
  89.                         );
  90.                         $mailObject $template->getObject();
  91.                         $mailObject str_replace('_FIRSTNAME_'$participation->getParticipant()->getFirstname(), $mailObject);
  92.                         $mailObject str_replace('_FULLNAME_'$participation->getParticipant()->getFirstname()." ".$participation->getParticipant()->getLastname(), $mailObject);
  93.                         $mailContent $template->getContent();
  94.                         $mailContent str_replace('_LINK_'$participationLink$mailContent);
  95.                         $mailContent str_replace('_FIRSTNAME_'$participation->getParticipant()->getFirstname(), $mailContent);
  96.                         $mailContent str_replace('_FULLNAME_'$participation->getParticipant()->getFirstname()." ".$participation->getParticipant()->getLastname(), $mailContent);
  97.                         $mailerManager->sendParticipantRecall($participation$mailObject$mailContent);
  98.                     }
  99.                     break;
  100.                 case "10_days_end":
  101.                     // Recall 10 days before participation ends for recipients who havn't answered
  102.                     $participations $entityManager->getRepository(Participation::class)->getParticipationsBefore10Days();
  103.                     foreach($participations as $participation){
  104.                         $template $entityManager->getRepository(MailTemplate::class)->findOneBy(array('type' => MailTemplateRepository::SECOND_RECALL'program' => $participation->getCampaign()->getProgram()));
  105.                         foreach ($participation->getRecipients() as $recipient){
  106.                             if($recipient->getStatus() == RecipientRepository::STATUS_ACTIVE && count($recipient->getQuizAnswers()) == 0){
  107.                                 // Générer l'URL du répondant
  108.                                 $recipientLink $this->generateUrl('quiz_answer', ['participationId' => $participation->getId() ,'token' => $recipient->getToken()],
  109.                                     UrlGeneratorInterface::ABSOLUTE_URL
  110.                                 );
  111.                                 $mailObject $template->getObject();
  112.                                 $mailObject str_replace('_FIRSTNAME_'$recipient->getFirstname(), $mailObject);
  113.                                 $mailObject str_replace('_FULLNAME_'$recipient->getParticipation()->getParticipant()->getFirstname()." ".$recipient->getParticipation()->getParticipant()->getLastname(), $mailObject);
  114.                                 $mailContent $template->getContent();
  115.                                 $mailContent str_replace('_LINK_'$recipientLink$mailContent);
  116.                                 $mailContent str_replace('_FIRSTNAME_'$recipient->getFirstname(), $mailContent);
  117.                                 $mailContent str_replace('_FULLNAME_'$recipient->getParticipation()->getParticipant()->getFirstname()." ".$recipient->getParticipation()->getParticipant()->getLastname(), $mailContent);
  118.                                 $mailerManager->sendRecipientRecall($recipient$mailObject$mailContent);
  119.                             }
  120.                         }
  121.                     }
  122.                 break;
  123.                 case "3_days_end":
  124.                     // Recall 3 days before participation ends for recipients who havn't answered
  125.                     $participations $entityManager->getRepository(Participation::class)->getParticipationsBefore3Days();
  126.                     foreach($participations as $participation){
  127.                         $template $entityManager->getRepository(MailTemplate::class)->findOneBy(array('type' => MailTemplateRepository::THIRD_RECALL'program' => $participation->getCampaign()->getProgram()));
  128.                         foreach ($participation->getRecipients() as $recipient){
  129.                             if($recipient->getStatus() == RecipientRepository::STATUS_ACTIVE && count($recipient->getQuizAnswers()) == 0){
  130.                                 // Générer l'URL du répondant
  131.                                 $recipientLink $this->generateUrl('quiz_answer', ['participationId' => $participation->getId() ,'token' => $recipient->getToken()],
  132.                                     UrlGeneratorInterface::ABSOLUTE_URL
  133.                                 );
  134.                                 $mailObject $template->getObject();
  135.                                 $mailObject str_replace('_FIRSTNAME_'$recipient->getFirstname(), $mailObject);
  136.                                 $mailObject str_replace('_FULLNAME_'$recipient->getParticipation()->getParticipant()->getFirstname()." ".$recipient->getParticipation()->getParticipant()->getLastname(), $mailObject);
  137.                                 $mailContent $template->getContent();
  138.                                 $mailContent str_replace('_LINK_'$recipientLink$mailContent);
  139.                                 $mailContent str_replace('_FIRSTNAME_'$recipient->getFirstname(), $mailContent);
  140.                                 $mailContent str_replace('_FULLNAME_'$recipient->getParticipation()->getParticipant()->getFirstname()." ".$recipient->getParticipation()->getParticipant()->getLastname(), $mailContent);
  141.                                 $mailerManager->sendRecipientRecall($recipient$mailObject$mailContent);
  142.                             }
  143.                         }
  144.                     }
  145.                 break;
  146.             }
  147.             return New Response(""200);
  148.         } else {
  149.             return New Response("access denied"401);
  150.         }
  151.     }
  152.     /**
  153.      * @Route("/cron/prepare/reports/{token}")
  154.      */
  155.     public function prepareReports($tokenRequest $requestEntityManagerInterface $entityManagerReportManager $reportManager)
  156.     {
  157.         if ($token == $this->CRON_TOKEN) {
  158.             $participationsWithReportsToGenerate $entityManager->getRepository(Participation::class)->getParticipationsWithReportsToGenerate();
  159.             foreach ($participationsWithReportsToGenerate as $participation){
  160.                 $reportManager->prepareParticipationReport($participation);
  161.                 // Check if campaign is over
  162.                 $campaign $participation->getCampaign();
  163.                 $otherParticipations $campaign->getParticipations();
  164.                 $endCampaign true;
  165.                 foreach ($otherParticipations as $otherParticipation) {
  166.                     if($otherParticipation->getReportData() == null){
  167.                         $endCampaign false;
  168.                     }
  169.                 }
  170.                 if($endCampaign){
  171.                     $campaign->setStatus(CampaignRepository::STATUS_FINISHED);
  172.                     $entityManager->persist($campaign);
  173.                     $entityManager->flush();
  174.                 }
  175.             }
  176.             return New Response(""200);
  177.         } else {
  178.             return New Response("access denied"401);
  179.         }
  180.     }
  181.     /**
  182.      * @Route("/cron/archive/campaigns/{token}")
  183.      */
  184.     public function archiveCampaigns($tokenRequest $requestEntityManagerInterface $entityManager)
  185.     {
  186.         if ($token == $this->CRON_TOKEN) {
  187.             $finishedCampaigns $entityManager->getRepository(Campaign::class)->findBy(array('status' => CampaignRepository::STATUS_FINISHED));
  188.             foreach ($finishedCampaigns as $campaign){
  189.                 $today = new DateTime();
  190.                 $end $campaign->getEndDate();
  191.                 $end $end->modify('+30 days');
  192.                 if($today $end){
  193.                     foreach ($campaign->getParticipations() as $participation) {
  194.                         $uid uniqid();
  195.                         $user $participation->getParticipant();
  196.                         $user->setFirstname("xxxxxxxx");
  197.                         $user->setLastname("xxxxxxxx");
  198.                         $user->setEmail("xxxxxxxx".$uid);
  199.                         $user->setUsername("xxxxxxxx".$uid);
  200.                         $user->setEnabled(false);
  201.                         $user->setRoles(array());
  202.                         $user->setDeletedAt(new \Datetime());
  203.                         $entityManager->persist($user);
  204.                         $entityManager->flush();
  205.                     }
  206.                     $campaign->setStatus(CampaignRepository::STATUS_ARCHIVED);
  207.                     $entityManager->persist($campaign);
  208.                     $entityManager->flush();
  209.                 }
  210.             }
  211.             return New Response(""200);
  212.         } else {
  213.             return New Response("access denied"401);
  214.         }
  215.     }
  216.     /**
  217.      * @Route("/cron/debug/mistral")
  218.      */
  219.     public function debugMistral(Request $requestEntityManagerInterface $entityManagerMistralManager $mistralManager)
  220.     {
  221.         $participation $entityManager->getRepository(Participation::class)->find(1);
  222.         $strengths = array();
  223.         $weaknesses = array();
  224.         foreach($participation->getReportData()['questions'] as $i => $question){
  225.             if($i == 0){
  226.                 $strengths $mistralManager->generateWordCloud($participation->getParticipant()->getLocale(), $question['answers']);
  227.             }
  228.             if($i == 1){
  229.                 $weaknesses $mistralManager->generateWordCloud($participation->getParticipant()->getLocale(), $question['answers']);
  230.             }
  231.         }
  232.         $reportData $participation->getReportData();
  233.         $reportData['strengths'] = $strengths['data']['words'];
  234.         $reportData['weaknesses'] = $weaknesses['data']['words'];
  235.         $participation->setReportData($reportData);
  236.         $entityManager->persist($participation);
  237.         $entityManager->flush();
  238.         die();
  239.     }
  240. }