<?php
/**
* Created by PhpStorm.
* User: grego
* Date: 07/11/2022
* Time: 12:25
*/
namespace App\Controller\AdminBundle;
use App\Entity\Badge;
use App\Entity\BatchFeedbackEmail;
use App\Entity\RequestLog;
use App\Entity\Skill;
use App\Entity\User;
use App\Manager\CossManager;
use App\Manager\GamificationManager;
use App\Manager\MailerManager;
use App\Manager\UserManager;
use App\Repository\BatchFeedbackEmailRepository;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
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\Contracts\Translation\TranslatorInterface;
class CRONController extends AbstractController
{
private $CRON_TOKEN = "ffd6600b2594eafae3b2f0528a4cb51a";
/**
* @Route("/cron/sendFeedbackRecap/{type}/{token}")
*/
public function sendFeedbackRecapAction(Request $request, $type, $token, EntityManagerInterface $entityManager, MailerManager $mailerManager)
{
if($token == $this->CRON_TOKEN) {
set_time_limit(0);
ini_set('max_execution_time', 3600); //3600 seconds = 1 heur
$twoDays = new DateTime();
$twoDays->modify('-2 days');
$userRepository = $entityManager->getRepository(User::class);
$users = $userRepository->createQueryBuilder('u')
->select('distinct u')
->leftJoin('u.recipients', 'r')
->where("u.enabled = false or u.lastLogin is NULL or u.platform = 'browser'")
->andWhere('r.lastRecallDate <= :twoDays');
$users->setParameter('twoDays', $twoDays);
$users->orderBy('u.id');
$users = $users->getQuery()->getResult();
foreach ($users as $user) {
if($user->getLocale()){
$request->setLocale($user->getLocale());
} else {
$request->setLocale('fr');
}
$mailerManager->sendFeedbackRecap($user, $type);
}
return New Response("", 200);
} else {
return New Response("access denied", 401);
}
}
/**
* @Route("/cron/debug/quality/{token}")
*/
public function debugQuality($token, EntityManagerInterface $entityManager, MailerManager $mailerManager, UserManager $userManager, CossManager $cossManager, GamificationManager $gamificationManager, 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(94);
$skill = $entityManager->getRepository(Skill::class)->find(1);
$qualityIndex = $gamificationManager->getCOSSQualityIndex($user, $skill);
dump($qualityIndex);
$badgeUnlocked = $entityManager->getRepository(Badge::class)->checkBadgeUnlockedOnSkill($user, $skill);
dump($badgeUnlocked);
return New Response("OK", 200);
}
/**
* @Route("/cron/export/connections/{token}/{start}/{end}")
*/
public function exportConnections($token, $start, $end, EntityManagerInterface $entityManager)
{
if($token == $this->CRON_TOKEN) {
$startDate = DateTime::createFromFormat('d-m-Y', $start);
$endDate = DateTime::createFromFormat('d-m-Y', $end);
if($startDate && $endDate){
$response = new StreamedResponse();
$response->setCallback(function() use ($entityManager, $startDate, $endDate){
$handle = fopen('php://output', 'w+');
fwrite($handle, implode(';',
[
'"Id utilisateur"',
'"Prénom utilisateur"',
'"Nom utilisateur"',
'"Email utilisateur"',
'"Société utilisateur"',
'"Fonction utilisateur"',
'"Niveau hiérarchique utilisateur"',
'"Date connexion"',
'"Heure connexion"',
'"Date création"',
'"Date suppression"'
]) . PHP_EOL);
$connexions = $entityManager->getRepository(RequestLog::class)->getLogsBetweenDates($startDate, $endDate);
foreach ($connexions as $connexion){
fwrite($handle, implode(';',
[
$connexion->getUser()->getId(),
$connexion->getUser()->getFirstname(),
$connexion->getUser()->getLastname(),
$connexion->getUser()->getEmail(),
$connexion->getUser()->getCompany(),
$connexion->getUser()->getJobTitle(),
$connexion->getUser()->getHierarchicalLevel(),
$connexion->getCreatedAt()->format("d/m/Y"),
$connexion->getCreatedAt()->format("H:i:s"),
$connexion->getUser()->getCreatedAt() ? $connexion->getUser()->getCreatedAt()->format('d/m/Y'): "",
$connexion->getUser()->getDeletedAt() ? $connexion->getUser()->getDeletedAt()->format('d/m/Y') : ""
]) . PHP_EOL);
}
fclose($handle);
});
$date = new \DateTime();
$now = $date->format('d_m_Y_H_i_s');
$filename = "coss_b2c_connections_export".$now.".csv";
$response->setStatusCode(200);
$response->headers->set('Content-Type', 'text/csv; charset=utf-8');
$response->headers->set('Content-Disposition','attachment; filename='.$filename.'');
return $response;
} else {
return New Response("wrong dates param", 401);
}
} else {
return New Response("access denied", 401);
}
}
/**
* @Route("/cron/send/batch/feedback/email/{token}")
*/
public function sendBatchFeedbackEmail($token, Request $request, EntityManagerInterface $entityManager, MailerManager $mailerManager, Pool $pool, TranslatorInterface $translator)
{
if ($token == $this->CRON_TOKEN) {
$batchFeedbacks = $entityManager->getRepository(BatchFeedbackEmail::class)->getPendingBatchFeedbacksPastFiveMinuts();
dump($batchFeedbacks);
$groupedFeedbacks = array();
foreach ($batchFeedbacks as $batchFeedback) {
$feedback = $batchFeedback->getFeedback();
$request->setLocale($feedback->getSender()->getLocale());
$senderRecipient = $feedback->getSender()->getId() . '-' . $feedback->getRecipient()->getId();
// Get sender's photo url and name
$featured = $feedback->getSender()->getImage();
if ($featured) {
$provider = $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 {
$senderCompany = $translator->trans(
"Pas de société", array(), 'mail'
);
}
if (isset($groupedFeedbacks[$senderRecipient])) {
$groupedFeedbacks[$senderRecipient]["feedbacks"][] = $feedback;
$groupedFeedbacks[$senderRecipient]["batchFeedbacks"][] = $batchFeedback;
} else {
$groupedFeedbacks[$senderRecipient]["name"] = $senderName;
$groupedFeedbacks[$senderRecipient]["company"] = $senderCompany;
$groupedFeedbacks[$senderRecipient]["photo"] = $senderImage;
$groupedFeedbacks[$senderRecipient]["feedbacks"] = array($feedback);
$groupedFeedbacks[$senderRecipient]["batchFeedbacks"] = array($batchFeedback);
}
}
$mailerManager->sendBatchFeedbackEmail($groupedFeedbacks);
foreach ($groupedFeedbacks as $groupedFeedback){
foreach ($groupedFeedback['batchFeedbacks'] as $batchFeedback){
$batchFeedback->setStatus(BatchFeedbackEmailRepository::STATUS_TREATED);
$entityManager->persist($batchFeedback);
}
}
$entityManager->flush();
return New Response("", 200);
} else {
return New Response("access denied", 401);
}
}
/**
* @Route("/cron/disable/licences/badge/{token}")
*/
public function checkLicencesBadgesAccess($token, EntityManagerInterface $entityManager)
{
if($token == $this->CRON_TOKEN) {
$users = $entityManager->getRepository(User::class)->findAll();
foreach($users as $user){
$badgesAccessExpirationDate = $user->getLicenceEndDate();
if($badgesAccessExpirationDate){
$badgesAccessExpirationDate->modify('+3 months');
$today = new DateTime();
if ($badgesAccessExpirationDate >= $today) {
$user->setBadgesAccess(false);
$entityManager->persist($user);
}
} else {
$user->setBadgesAccess(false);
$entityManager->persist($user);
}
}
$entityManager->flush();
return New Response("", 200);
} else {
return New Response("access denied", 401);
}
}
}