<?php
/**
* Created by PhpStorm.
* User: grego
* Date: 07/11/2022
* Time: 12:25
*/
namespace App\Controller\AdminBundle;
use App\Entity\BatchEmail;
use App\Entity\Campaign;
use App\Entity\MailTemplate;
use App\Entity\Participation;
use App\Entity\User;
use App\Manager\CossManager;
use App\Manager\MailerManager;
use App\Manager\MistralManager;
use App\Manager\ReportManager;
use App\Manager\UserManager;
use App\Repository\BatchEmailRepository;
use App\Repository\CampaignRepository;
use App\Repository\MailTemplateRepository;
use App\Repository\ParticipationRepository;
use App\Repository\RecipientRepository;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use PhpOffice\PhpSpreadsheet\Shared\Date;
use Sonata\MediaBundle\Provider\Pool;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class CRONController extends AbstractController
{
private $CRON_TOKEN = "ffd6600b2594eafae3b2f0528a4cb51a";
/**
* @Route("/cron/debug/quality/{token}")
*/
public function debugQuality($token, EntityManagerInterface $entityManager, MailerManager $mailerManager, UserManager $userManager, CossManager $cossManager, MistralManager $mistralManager, TranslatorInterface $translator, ParameterBagInterface $parameterBag){
set_time_limit(0);
ini_set('max_execution_time', 3600); //3600 seconds = 1 heure
ini_set('memory_limit', '-1');
$user = $entityManager->getRepository(User::class)->find(145);
return New Response("OK", 200);
}
/**
* @Route("/cron/send/batch/email/{token}")
*/
public function sendBatchEmail($token, Request $request, EntityManagerInterface $entityManager, MailerManager $mailerManager)
{
if ($token == $this->CRON_TOKEN) {
$batchEmails = $entityManager->getRepository(BatchEmail::class)->getPendingBatchEmailsPastFiveMinuts();
foreach ($batchEmails as $batchEmail) {
$recipient = $batchEmail->getRecipient();
// Générer l'URL du répondant
$recipientLink = $this->generateUrl(
'recipient_quiz', ['token' => $recipient->getToken()],
UrlGeneratorInterface::ABSOLUTE_URL
);
$mailTemplate = $entityManager->getRepository(MailTemplate::class)->findOneBy(array('type' => $batchEmail->getType(), 'program' => $recipient->getParticipation()->getCampaign()->getProgram()));
$mailerManager->sendBatchEmail($recipient, $mailTemplate, $recipientLink, $recipient->getParticipation()->getParticipant()->getLocale());
$batchEmail->setStatus(BatchEmailRepository::STATUS_TREATED);
$entityManager->persist($batchEmail);
}
$entityManager->flush();
return New Response("", 200);
} else {
return New Response("access denied", 401);
}
}
/**
* @Route("/cron/send/recall/email/{type}/{token}")
*/
public function sendRecallEmail($type, $token, Request $request, EntityManagerInterface $entityManager, MailerManager $mailerManager, TranslatorInterface $translator)
{
if ($token == $this->CRON_TOKEN) {
switch($type){
case "1_week_start":
// Recall 1 week after participation started only if no active recipients
$participations = $entityManager->getRepository(Participation::class)->getParticipationsWithNoActiveRecipientsAfter1Week();
foreach($participations as $participation){
$template = $entityManager->getRepository(MailTemplate::class)->findOneBy(array('type' => MailTemplateRepository::PARTICIPANT_RECALL, 'program' => $participation->getCampaign()->getProgram()));
// Générer l'URL du participant
$participationLink = $this->generateUrl('participation_recipients', ['campaignToken' => $participation->getCampaign()->getToken()],
UrlGeneratorInterface::ABSOLUTE_URL
);
$mailObject = $template->getObject();
$mailObject = str_replace('_FIRSTNAME_', $participation->getParticipant()->getFirstname(), $mailObject);
$mailObject = str_replace('_FULLNAME_', $participation->getParticipant()->getFirstname()." ".$participation->getParticipant()->getLastname(), $mailObject);
$mailContent = $template->getContent();
$mailContent = str_replace('_LINK_', $participationLink, $mailContent);
$mailContent = str_replace('_FIRSTNAME_', $participation->getParticipant()->getFirstname(), $mailContent);
$mailContent = str_replace('_FULLNAME_', $participation->getParticipant()->getFirstname()." ".$participation->getParticipant()->getLastname(), $mailContent);
$mailerManager->sendParticipantRecall($participation, $mailObject, $mailContent);
}
break;
case "10_days_end":
// Recall 10 days before participation ends for recipients who havn't answered
$participations = $entityManager->getRepository(Participation::class)->getParticipationsBefore10Days();
foreach($participations as $participation){
$template = $entityManager->getRepository(MailTemplate::class)->findOneBy(array('type' => MailTemplateRepository::SECOND_RECALL, 'program' => $participation->getCampaign()->getProgram()));
foreach ($participation->getRecipients() as $recipient){
if($recipient->getStatus() == RecipientRepository::STATUS_ACTIVE && count($recipient->getQuizAnswers()) == 0){
// Générer l'URL du répondant
$recipientLink = $this->generateUrl('quiz_answer', ['participationId' => $participation->getId() ,'token' => $recipient->getToken()],
UrlGeneratorInterface::ABSOLUTE_URL
);
$mailObject = $template->getObject();
$mailObject = str_replace('_FIRSTNAME_', $recipient->getFirstname(), $mailObject);
$mailObject = str_replace('_FULLNAME_', $recipient->getFirstname()." ".$recipient->getLastname(), $mailObject);
$mailContent = $template->getContent();
$mailContent = str_replace('_LINK_', $recipientLink, $mailContent);
$mailContent = str_replace('_FIRSTNAME_', $recipient->getFirstname(), $mailContent);
$mailContent = str_replace('_FULLNAME_', $recipient->getFirstname()." ".$recipient->getLastname(), $mailContent);
$mailerManager->sendRecipientRecall($recipient, $mailObject, $mailContent);
}
}
}
break;
case "3_days_end":
// Recall 3 days before participation ends for recipients who havn't answered
$participations = $entityManager->getRepository(Participation::class)->getParticipationsBefore3Days();
foreach($participations as $participation){
$template = $entityManager->getRepository(MailTemplate::class)->findOneBy(array('type' => MailTemplateRepository::THIRD_RECALL, 'program' => $participation->getCampaign()->getProgram()));
foreach ($participation->getRecipients() as $recipient){
if($recipient->getStatus() == RecipientRepository::STATUS_ACTIVE && count($recipient->getQuizAnswers()) == 0){
// Générer l'URL du répondant
$recipientLink = $this->generateUrl('quiz_answer', ['participationId' => $participation->getId() ,'token' => $recipient->getToken()],
UrlGeneratorInterface::ABSOLUTE_URL
);
$mailObject = $template->getObject();
$mailObject = str_replace('_FIRSTNAME_', $recipient->getFirstname(), $mailObject);
$mailObject = str_replace('_FULLNAME_', $recipient->getFirstname()." ".$recipient->getLastname(), $mailObject);
$mailContent = $template->getContent();
$mailContent = str_replace('_LINK_', $recipientLink, $mailContent);
$mailContent = str_replace('_FIRSTNAME_', $recipient->getFirstname(), $mailContent);
$mailContent = str_replace('_FULLNAME_', $recipient->getFirstname()." ".$recipient->getLastname(), $mailContent);
$mailerManager->sendRecipientRecall($recipient, $mailObject, $mailContent);
}
}
}
break;
}
return New Response("", 200);
} else {
return New Response("access denied", 401);
}
}
/**
* @Route("/cron/prepare/reports/{token}")
*/
public function prepareReports($token, Request $request, EntityManagerInterface $entityManager, ReportManager $reportManager)
{
if ($token == $this->CRON_TOKEN) {
$participationsWithReportsToGenerate = $entityManager->getRepository(Participation::class)->getParticipationsWithReportsToGenerate();
foreach ($participationsWithReportsToGenerate as $participation){
$reportManager->prepareParticipationReport($participation);
// Check if campaign is over
$campaign = $participation->getCampaign();
$otherParticipations = $campaign->getParticipations();
$endCampaign = true;
foreach ($otherParticipations as $otherParticipation) {
if($otherParticipation->getReportData() == null){
$endCampaign = false;
}
}
if($endCampaign){
$campaign->setStatus(CampaignRepository::STATUS_FINISHED);
$entityManager->persist($campaign);
$entityManager->flush();
}
}
return New Response("", 200);
} else {
return New Response("access denied", 401);
}
}
/**
* @Route("/cron/archive/campaigns/{token}")
*/
public function archiveCampaigns($token, Request $request, EntityManagerInterface $entityManager)
{
if ($token == $this->CRON_TOKEN) {
$finishedCampaigns = $entityManager->getRepository(Campaign::class)->findBy(array('status' => CampaignRepository::STATUS_FINISHED));
foreach ($finishedCampaigns as $campaign){
$today = new DateTime();
$end = $campaign->getEndDate();
$end = $end->modify('+30 days');
if($today > $end){
foreach ($campaign->getParticipations() as $participation) {
$uid = uniqid();
$user = $participation->getParticipant();
$user->setFirstname("xxxxxxxx");
$user->setLastname("xxxxxxxx");
$user->setEmail("xxxxxxxx".$uid);
$user->setUsername("xxxxxxxx".$uid);
$user->setEnabled(false);
$user->setRoles(array());
$user->setDeletedAt(new \Datetime());
$entityManager->persist($user);
$entityManager->flush();
}
$campaign->setStatus(CampaignRepository::STATUS_ARCHIVED);
$entityManager->persist($campaign);
$entityManager->flush();
}
}
return New Response("", 200);
} else {
return New Response("access denied", 401);
}
}
/**
* @Route("/cron/debug/mistral")
*/
public function debugMistral(Request $request, EntityManagerInterface $entityManager, MistralManager $mistralManager)
{
$participation = $entityManager->getRepository(Participation::class)->find(1);
$strengths = array();
$weaknesses = array();
foreach($participation->getReportData()['questions'] as $i => $question){
if($i == 0){
$strengths = $mistralManager->generateWordCloud($participation->getParticipant()->getLocale(), $question['answers']);
}
if($i == 1){
$weaknesses = $mistralManager->generateWordCloud($participation->getParticipant()->getLocale(), $question['answers']);
}
}
$reportData = $participation->getReportData();
$reportData['strengths'] = $strengths['data']['words'];
$reportData['weaknesses'] = $weaknesses['data']['words'];
$participation->setReportData($reportData);
$entityManager->persist($participation);
$entityManager->flush();
die();
}
}