<?php
/**
* Created by PhpStorm.
* User: mint
* Date: 14/11/19
* Time: 12:08
*/
namespace App\Controller;
use App\Entity\PaidCourseList;
use App\Entity\TeacherSchedule;
use App\Entity\UserPlacementTest;
use App\Notification\EmailNotification;
use App\Notification\SlackClient;
use App\Notification\SlackNotification\LevelTestSlackNotification;
use App\Repository\HolidayRepository;
use App\Repository\HomeworkRepository;
use App\Repository\PaidCourseListRepository;
use App\Repository\TeacherRepository;
use App\Repository\TeacherScheduleRepository;
use App\Repository\SubscriptionOrderRepository;
use App\Repository\ActiveCampainSubscribeLostLogRepository;
use App\Repository\SessionOrderRepository;
use App\Repository\UserPlacementTestRepository;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Filesystem\Filesystem;
use App\Service\DropboxHelper;
use App\Service\ActiveCampaignHelper;
use App\Entity\Homework;
use Symfony\Component\HttpFoundation\Response;
/**
* @Route("/cron")
*/
class CronController extends AbstractController
{
private $teacherScheduleRepository;
private $em;
private $paidCourseListRepository;
private $slackClient;
private $emailNotification;
private $homeworkRepository;
private $teacherRepository;
private $holidayRepository;
private $userPlacementTestRepository;
private $levelTestSlackNotification;
public function __construct(TeacherScheduleRepository $teacherScheduleRepository, EntityManagerInterface $em, PaidCourseListRepository $paidCourseListRepository, SlackClient $slackClient, EmailNotification $emailNotification, HomeworkRepository $homeworkRepository, TeacherRepository $teacherRepository, HolidayRepository $holidayRepository, UserPlacementTestRepository $userPlacementTestRepository, LevelTestSlackNotification $levelTestSlackNotification)
{
$this->teacherScheduleRepository = $teacherScheduleRepository;
$this->em = $em;
$this->paidCourseListRepository = $paidCourseListRepository;
$this->slackClient = $slackClient;
$this->emailNotification = $emailNotification;
$this->homeworkRepository = $homeworkRepository;
$this->teacherRepository = $teacherRepository;
$this->holidayRepository = $holidayRepository;
$this->userPlacementTestRepository = $userPlacementTestRepository;
$this->levelTestSlackNotification = $levelTestSlackNotification;
}
/**
* @Route("/mail/{nbMessage}", name="mail", requirements={"nbMessage" = "\d+" }, defaults={"nbMessage"= 50})
*/
public function sendSpool(Request $request, int $nbMessage, KernelInterface $kernel): Response
{
if ($request->get('key') !== "9WQUYNHO8FVA1Z6TSP3R3Z3LSR667ZY9MU226S32") {
throw new NotFoundHttpException();
}
$application = new Application($kernel);
$application->setAutoExit(false);
$input = new ArrayInput(
[
'command' => 'swiftmailer:spool:send',
'--message-limit' => $nbMessage,
]
);
$output = new BufferedOutput();
$application->run($input, $output);
$content = $output->fetch();
return new Response($content);
}
/**
* @Route("/launch/addweek", name="cronjob_launch_addweek")
*/
public function addWeekToAllFreeSchedules(Request $request): Response
{
if ($request->get('key') !== "4CUpjp16dF1aehxO") {
throw new NotFoundHttpException();
}
$currentDate = new \DateTimeImmutable('22:58');
$holiday = $this->holidayRepository->findOneBy([
'name' => "Ramadan"
]);
$holiday2 = $this->holidayRepository->findOneBy([
'name' => "Eid Adha"
]);
$startHoliday = $holiday->getStartAt();
$endHoliday = $holiday->getEndAt();
$startHoliday2 = $holiday2->getStartAt();
$endHoliday2 = $holiday2->getEndAt();
$freeSchedules = $this->teacherScheduleRepository->findFreeSchedules();
//Rajouter une semaine à tous les plannings libre dont la date "isfree" est AVANT la date du jour
/** @var TeacherSchedule $schedule */
foreach ($freeSchedules as $schedule) {
//$oldFreeDate = DateTimeImmutable::createFromMutable($schedule->getFreeDate());
//$newFreeDate = $oldFreeDate->modify('+1 week');
$newFreeDate = DateTimeImmutable::createFromMutable($schedule->getFreeDate());
if ($newFreeDate > $startHoliday and $newFreeDate < $endHoliday) {
if ($schedule->getIsForLevelTest() == false){
while ($newFreeDate > $startHoliday and $newFreeDate < $endHoliday) {
$newFreeDate = $newFreeDate->modify('+1 week');
}
}
}
if ($newFreeDate > $startHoliday2 and $newFreeDate < $endHoliday2) {
if ($schedule->getIsForLevelTest() == false){
while ($newFreeDate > $startHoliday2 and $newFreeDate < $endHoliday2) {
$newFreeDate = $newFreeDate->modify('+1 week');
}
}
}
while ($newFreeDate < $currentDate){
$newFreeDate = $newFreeDate->modify('+1 week');
}
$schedule->setFreeDate($newFreeDate)
->setUpdateAt(new \DateTime());
//->setUpdateBy('cron');
$this->em->persist($schedule);
}
$this->em->flush();
return new Response('semaine ajoutée avec success');
}
/**
* @Route("/launch/checkreport", name="cronjob_launch_checkreport")
*/
public function checkReportsToStudentsSent(Request $request): Response
{
if ($request->get('key') !== "4CUpjp16dF1aehxO") {
throw new NotFoundHttpException();
}
$now = new \DateTimeImmutable();
$previousWeek = $now->modify('-6 days');
$coursesOfTheWeek = $this->paidCourseListRepository->getAllCoursesOfTheWeek($previousWeek, $now);
$coursesWithoutReport = [];
$teachers = [];
/** @var PaidCourseList $course */
foreach ($coursesOfTheWeek as $course) {
if ($course->getSubscriptionLessonReport() == null) {
$coursesWithoutReport[] = $course;
$teachers[] = $course->getTeacherSchedule()->getTeacher()->getUserId()->getFullname();
}
}
if ($coursesWithoutReport != null) {
$results = array_count_values($teachers);
//$this->slackClient->notifyAllNbOfReportNotSendByTeacher($results);
$this->emailNotification->sendResultCheckReportsNotSentToSecretary($coursesWithoutReport, $now, $previousWeek);
$this->slackClient->notifyTeacherPrivateReportNotSent($coursesWithoutReport);
}
return new Response('notification has been sent with success');
}
/**
* @Route("/launch/checkhomeworks", name="cronjob_launch_checkhomeworks")
*/
public function checkUncorrectedHomework(Request $request): Response
{
///launch/checkhomeworks?key=4CUpjp16dF1aehxO
if ($request->get('key') !== "4CUpjp16dF1aehxO") {
throw new NotFoundHttpException();
}
$grader = $this->teacherRepository->findOneBy([
'isGrader' => true
]);
$uncorrectedHomeworks = $this->homeworkRepository->getUncorrectedHomeworkFromTwoDays();
$this->slackClient->notifyTeacherHomeworkUncorrected($uncorrectedHomeworks);
//$this->slackClient->notifyGraderHomeworkUncorrected($uncorrectedHomeworks, $grader);
//$this->slackClient->notifyAdminHomeworkUncorrected($uncorrectedHomeworks);
return new Response('rappel envoyé avec success');
}
/**
* @Route("/launch/checkleveltest", name="cronjob_launch_checkleveltest")
*/
public function checkUncorrectedLevelTest(Request $request): Response
{
if ($request->get('key') !== "4CUpjp16dF1aehxO") {
throw new NotFoundHttpException();
}
//TODO REQUETE A VERIFIER
//$uncorrectedLevelTest = $this->userPlacementTestRepository->findUncorrectedLevelTest();
//$this->levelTestSlackNotification->alertUncorrectedTest($uncorrectedLevelTest);
return new Response('rappel envoyé avec success');
}
/**
* @Route("/launch/checkunbookedleveltest", name="cronjob_launch_checkunbookedleveltest")
*/
public function checkUnbookedLevelTest(Request $request, EmailNotification\LevelTestEmailNotification $emailNotification): Response
{
if ($request->get('key') !== "4CUpjp16dF1aehxO") {
throw new NotFoundHttpException();
}
$unbookededLevelTest = $this->userPlacementTestRepository->findUnbookedLevelTestForReminder();
// a envoyer lundi, mercredi samedi à 3h du mat
/** @var UserPlacementTest $test */
foreach ($unbookededLevelTest as $test){
$emailNotification->sendReminderToStudentToBookTest($test);
}
return new Response('rappel envoyé avec success');
}
/**
* @Route("/supprimer-devoirs-expirer", name="supprimer_devoirs_expirer")
* @param Request $request
* @param EntityManagerInterface $em
* @param Filesystem $filesystem
* @param DropboxHelper $dropBox
* @return Response
*/
public function deleteHomework(Request $request, EntityManagerInterface $em, Filesystem $filesystem, DropboxHelper $dropBox): Response
{
if ($request->get('key') !== "3AKZp7q8emtgKJvdH7") {
throw new NotFoundHttpException();
}
$em->getConnection()->getConfiguration()->setSQLLogger(null);
$i = 1;
$batchSize = 200;
$limit = 0;
// recuperer les anciens devoirs
$oldHomeworks = $em->getRepository(Homework::class)->getOldHomeworksForExpiredCourses($limit);
$log = "";
foreach ($oldHomeworks as $homework) {
if ($homework->getRelatedToSubscription() != null or $homework->getRelatedToGroupCourses() != null) {
if ($homework->getRelatedToSubscription() != null)
$log .= "Supression des devoirs de l'abonnement n° : " . $homework->getRelatedToSubscription()->getId() . " dernier cours: " . $homework->getRelatedToSubscription()->getLastPaidCourse()->format('d/m/Y') . "<br>";
if ($homework->getRelatedToGroupCourses())
$log .= "Supression des devoirs de groupe de l'élève n° : " . $homework->getRelatedToGroupCourses()->getId() . " dernier cours : " . $homework->getRelatedToGroupCourses()->getSession()->getEndDate()->format('d/m/Y') . "<br>";
}
// supprimer les fichiers attacher au devoirs
$homeworks = $homework->getHomeworkFiles();
foreach ($homeworks as $doc) {
// Supprimer le fichier dans Dropbox
if ($doc->getIsDropBox()) {
$json = $doc->getDropBoxJson();
$data = json_decode($json);
$dropBox->supprimerFichier($data);
} else {
$filename = $doc->getFileName();
if ($filesystem->exists($filename)) {
$filesystem->remove($filename);
}
}
$em->remove($doc);
}
// supprimer les fichiers attacher au corrections
$corrections = $homework->getCorrectionFiles();
foreach ($corrections as $file) {
// Supprimer le fichier dans Dropbox
if ($file->getIsDropBox()) {
$json = $file->getDropBoxJson();
$data = json_decode($json);
$dropBox->supprimerFichier($data);
} else {
$filename = $file->getFileName();
if ($filesystem->exists($filename)) {
$filesystem->remove($filename);
}
}
$em->remove($file);
}
//ici on efface LE Devoir
$em->remove($homework);
$i++;
if (($i % $batchSize) === 0) {
$em->flush();
}
}
$em->flush();
$em->clear();
return new Response($log);
}
/**
* @Route("/test-active-campaign", name="test_active_campaign")
* @param Request $request
* @param EntityManagerInterface $em
* @param Filesystem $filesystem
* @param ActiveCampaignHelper $activeCampaign
* @return Response
*/
public function testActiveCampaign(Request $request, EntityManagerInterface $em, Filesystem $filesystem, ActiveCampaignHelper $activeCampaignHelper, SubscriptionOrderRepository $subscriptionOrderRepository, SessionOrderRepository $sessionOrderRepository): Response
{
if ($request->get('key') !== "3AKZp7q8emtgKJvdH7") {
throw new NotFoundHttpException();
}
$log = "";
$em->getConnection()->getConfiguration()->setSQLLogger(null);
$debug = true;
if ($debug) {
// Tester SubscriptionOrder *********************************
$idtest = 2234; // sans participant
//$idtest = 3031 ; // avec participant
$subscriptionOrder = $subscriptionOrderRepository->findOneBy(['id' => $idtest]);
// Abonnement
//$activeCampaignHelper->addOrder($subscriptionOrder);
// Désabonnement
$activeCampaignHelper->unsubscribeOrder($subscriptionOrder);
// Tester SessionOrder **************************************
//$idtest = 605; // sans participant
$idtest = 597; // avec participant
$sessionOrder = $sessionOrderRepository->findOneBy(['id' => $idtest]);
// Abonnement
//$activeCampaignHelper->addOrder($sessionOrder);
// Désabonnement
$activeCampaignHelper->unsubscribeOrder($sessionOrder);
}
return new Response($log);
}
/**
* @Route("/update-contact-unsubscribe", name="update_contact_unsubscribe")
* @param Request $request
* @param EntityManagerInterface $em
* @param Filesystem $filesystem
* @param ActiveCampaignHelper $activeCampaign
* @return Response
*/
public function updateContactUnsubscribe(Request $request, EntityManagerInterface $em, Filesystem $filesystem, SubscriptionOrderRepository $subscriptionOrderRepository, ActiveCampaignHelper $activeCampaignHelper, SessionOrderRepository $sessionOrderRepository): Response
{
if ($request->get('key') !== "3AKZp7q8emtgKJvdH7") {
throw new NotFoundHttpException();
}
$em->getConnection()->getConfiguration()->setSQLLogger(null);
$log = "";
$executeUnsubscribe = $request->get('executeUnsubscribe');
$i = 1;
$batchSize = 10;
$limit = 50;
// recuperer Subscription Orders OLD
$subscriptionOrders = $subscriptionOrderRepository->getCanceledStudentWithoutRemainCourses($limit);
$log .= " ************************* Debut SubscriptionOrder *************************** <br>";
foreach ($subscriptionOrders as $order) {
$user = $order->getUser();
$participant = $order->getParticipant();
$log .= "SubscriptionOrder N° " . $order->getId() . " est Canceled <br>";
$log .= "User : <strong>" . $user->getLastName() . " " . $user->getFirstName() . "</strong> - Email : <strong>" . $user->getEmail() . "</strong> <br>";
if ($participant != null) {
$log .= "Participant : <strong>" . $participant->getLastName() . " " . $participant->getFirstName() . "</strong> <br>";
}
$log .= "<br>";
if ($executeUnsubscribe == 1) {
$log .= "Unsubscribe : OK !! <br>";
$activeCampaignHelper->unsubscribeOrder($order);
$log .= "<br>";
}
$i++;
if (($i % $batchSize) === 0) {
$em->flush();
}
}
$em->flush();
$em->clear();
$log .= " ************************* Fin SubscriptionOrder *************************** <br>";
// Get All Oold Session Orders
$sessionsOrders = $sessionOrderRepository->getAllOldOrderSession($limit);
$log .= " ************************* Debut SessionOrder *************************** <br><br>";
$i = 1;
foreach ($sessionsOrders as $order) {
$user = $order->getStudents();
$participant = $order->getParticipant();
$log .= "SessionOrder N° " . $order->getId() . " est Expirer <br>";
$log .= "User : <strong>" . $user->getLastName() . " " . $user->getFirstName() . "</strong> - Email : <strong>" . $user->getEmail() . "</strong> <br>";
if ($participant != null) {
$log .= "Participant : <strong>" . $participant->getLastName() . " " . $participant->getFirstName() . "</strong> <br>";
}
$log .= "<br>";
if ($executeUnsubscribe == 1) {
$log .= "Unsubscribe : OK !! <br>";
$activeCampaignHelper->unsubscribeOrder($order);
$log .= "<br>";
}
$i++;
if (($i % $batchSize) === 0) {
$em->flush();
}
}
$em->flush();
$em->clear();
$log .= " ************************* Fin SessionOrder *************************** <br>";
return new Response($log);
}
/**
* @Route("/add-contact-subscribe-lost", name="add_contact_subscribe_lost")
* @param Request $request
* @param EntityManagerInterface $em
* @param Filesystem $filesystem
* @param ActiveCampaignHelper $activeCampaign
* @return Response
*/
public function addContactSubscribeLost(Request $request, EntityManagerInterface $em, Filesystem $filesystem, ActiveCampainSubscribeLostLogRepository $activeCampainSubscribeLostLogRepository, ActiveCampaignHelper $activeCampaignHelper): Response
{
if ($request->get('key') !== "3AKZp7q8emtgKJvdH7") {
throw new NotFoundHttpException();
}
$log = "";
// recuperer Subscription Orders OLD
$subscribeLostLogs = $activeCampainSubscribeLostLogRepository->findAll();
foreach ($subscribeLostLogs as $subscribeLostLog) {
if ($subscribeLostLog->getSubscription() != null) {
$log .= " ************************* Debut SubscriptionOrder *************************** <br>";
$order = $subscribeLostLog->getSubscription();
if ($activeCampaignHelper->addOrder($order)) {
$user = $order->getUser();
$participant = $order->getParticipant();
$log .= "SubscriptionOrder N° " . $order->getId() . " a été Ajouter <br>";
$log .= "User : <strong>" . $user->getLastName() . " " . $user->getFirstName() . "</strong> - Email : <strong>" . $user->getEmail() . "</strong> <br>";
if ($participant != null) {
$log .= "Participant : <strong>" . $participant->getLastName() . " " . $participant->getFirstName() . "</strong> <br>";
}
$this->em->remove($subscribeLostLog);
$this->em->flush();
}
$log .= "<br>";
$log .= " ************************* Fin SubscriptionOrder *************************** <br>";
}
if ($subscribeLostLog->getGroupSession() != null) {
$log .= " ************************* Debut SessionOrder *************************** <br><br>";
$order = $subscribeLostLog->getGroupSession();
$log .= "<br>";
if ($activeCampaignHelper->addOrder($order)) {
$user = $order->getStudents();
$participant = $order->getParticipant();
$log .= "SessionOrder N° " . $order->getId() . " a ete Ajouter <br>";
$log .= "User : <strong>" . $user->getLastName() . " " . $user->getFirstName() . "</strong> - Email : <strong>" . $user->getEmail() . "</strong> <br>";
if ($participant != null) {
$log .= "Participant : <strong>" . $participant->getLastName() . " " . $participant->getFirstName() . "</strong> <br>";
}
$this->em->remove($subscribeLostLog);
$this->em->flush();
}
$log .= "<br>";
$log .= " ************************* Fin SessionOrder *************************** <br>";
}
}
return new Response($log);
}
}