<?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\Recipient;
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\MistralManager;
use App\Manager\PeopleDataLabsManager;
use App\Manager\UserManager;
use App\Repository\BatchFeedbackEmailRepository;
use App\Repository\RecipientRepository;
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, PeopleDataLabsManager $peopleDataLabsManager, 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/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();
$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);
}
}
/**
* @Route("/cron/analyse/recipients/{token}")
*/
public function analyseRecipients($token, EntityManagerInterface $entityManager, PeopleDataLabsManager $peopleDataLabsManager, MistralManager $mistralManager){
if($token == $this->CRON_TOKEN) {
set_time_limit(0);
ini_set('max_execution_time', 600); //600 seconds = 10min
$pendingRecipients = $entityManager->getRepository(Recipient::class)->findBy(array('status' => RecipientRepository::STATUS_PENDING, 'analysisStatus' => RecipientRepository::ANALYSIS_PENDING));
foreach ($pendingRecipients as $recipient) {
try {
$user = $recipient->getAppUser();
$userData = $peopleDataLabsManager->getUserCareer($user);
if ($userData['found'] == true) {
$senderData = array(
"firstname" => $user->getFirstname(),
"lastname" => $user->getLastname(),
"email" => $user->getEmail(),
"career" => $userData['data']
);
} else {
$senderData = array(
"firstname" => $user->getFirstname(),
"lastname" => $user->getLastname(),
"email" => $user->getEmail(),
"career" => array(
"company" => $user->getCompany(),
"job_title" => $user->getJobTitle(),
)
);
}
$status = "Réseau professionnel";
switch ($recipient->getStatus()) {
case RecipientRepository::SUPERIOR_RECIPIENT:
$status = "Manager";
break;
case RecipientRepository::PAIR_RECIPIENT:
$status = "Collègue";
break;
case RecipientRepository::GUEST_RECIPIENT:
$status = "Réseau professionnel";
break;
}
$recipientData = array(
"status" => $status,
"firstname" => $recipient->getUser()->getFirstname(),
"lastname" => $recipient->getUser()->getLastname(),
"email" => $recipient->getUser()->getEmail(),
"company" => $recipient->getCompany(),
"job_title" => $recipient->getTitle()
);
$response = $mistralManager->validateRecipient($senderData, $recipientData);
if ($response['status'] == true) {
if (isset($response['data']['result'])) {
$recipient->setAnalysisData($response['data']['result']);
$recipient->setAnalysisStatus(RecipientRepository::ANALYSIS_DONE);
$entityManager->persist($recipient);
$entityManager->flush();
}
} else {
$iterations = $recipient->getAnalysisIteration();
$iterations++;
if ($iterations >= 5) {
$recipient->setAnalysisStatus(RecipientRepository::ANALYSIS_EXPIRED);
} else {
$recipient->setAnalysisIteration($iterations);
}
$entityManager->persist($recipient);
$entityManager->flush();
continue;
}
} catch (Exception $exception) {
$iterations = $recipient->getAnalysisIteration();
$iterations++;
if ($iterations >= 5) {
$recipient->setAnalysisStatus(RecipientRepository::ANALYSIS_EXPIRED);
} else {
$recipient->setAnalysisIteration($iterations);
}
$entityManager->persist($recipient);
$entityManager->flush();
continue;
}
}
return New Response("", 200);
} else {
return New Response("access denied", 401);
}
}
}