src/Controller/AdminBundle/CRONController.php line 174

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\Badge;
  10. use App\Entity\BatchFeedbackEmail;
  11. use App\Entity\Recipient;
  12. use App\Entity\RequestLog;
  13. use App\Entity\Skill;
  14. use App\Entity\User;
  15. use App\Manager\CossManager;
  16. use App\Manager\GamificationManager;
  17. use App\Manager\MailerManager;
  18. use App\Manager\MistralManager;
  19. use App\Manager\PeopleDataLabsManager;
  20. use App\Manager\UserManager;
  21. use App\Repository\BatchFeedbackEmailRepository;
  22. use App\Repository\RecipientRepository;
  23. use DateTime;
  24. use Doctrine\ORM\EntityManagerInterface;
  25. use Exception;
  26. use Sonata\MediaBundle\Provider\Pool;
  27. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  28. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  29. use Symfony\Component\HttpClient\HttpClient;
  30. use Symfony\Component\HttpFoundation\Request;
  31. use Symfony\Component\HttpFoundation\Response;
  32. use Symfony\Component\HttpFoundation\StreamedResponse;
  33. use Symfony\Component\Routing\Annotation\Route;
  34. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  35. use Symfony\Contracts\HttpClient\HttpClientInterface;
  36. use Symfony\Contracts\Translation\TranslatorInterface;
  37. class CRONController extends AbstractController
  38. {
  39.     private $CRON_TOKEN "ffd6600b2594eafae3b2f0528a4cb51a";
  40.     /**
  41.      * @Route("/cron/sendFeedbackRecap/{type}/{token}")
  42.      */
  43.     public function sendFeedbackRecapAction(Request $request$type$tokenEntityManagerInterface $entityManagerMailerManager $mailerManager)
  44.     {
  45.         if($token == $this->CRON_TOKEN) {
  46.             set_time_limit(0);
  47.             ini_set('max_execution_time'3600); //3600 seconds = 1 heur
  48.             $twoDays = new DateTime();
  49.             $twoDays->modify('-2 days');
  50.             $userRepository $entityManager->getRepository(User::class);
  51.             $users $userRepository->createQueryBuilder('u')
  52.                 ->select('distinct u')
  53.                 ->leftJoin('u.recipients',  'r')
  54.                 ->where("u.enabled = false or u.lastLogin is NULL or u.platform = 'browser'")
  55.                 ->andWhere('r.lastRecallDate <= :twoDays or r.lastRecallDate is NULL');
  56.             $users->setParameter('twoDays'$twoDays);
  57.             $users->orderBy('u.id');
  58.             $users $users->getQuery()->getResult();
  59.             foreach ($users as $user) {
  60.                 if($user->getLocale()){
  61.                     $request->setLocale($user->getLocale());
  62.                 } else {
  63.                     $request->setLocale('fr');
  64.                 }
  65.                 \Sentry\withScope(function (\Sentry\State\Scope $scope) use ($user$mailerManager$type) {
  66.                     $scope->setUser([
  67.                         'id' => $user->getId(),
  68.                         'email' => $user->getEmail(),
  69.                     ]);
  70.                     $scope->setTag('type''email');
  71.                     try {
  72.                         $mailerManager->sendFeedbackRecap($user$type);
  73.                     } catch (\Throwable $e) {
  74.                         \Sentry\captureException($e);
  75.                     }
  76.                 });
  77.             }
  78.             return New Response(""200);
  79.         } else {
  80.             return New Response("access denied"401);
  81.         }
  82.     }
  83.     /**
  84.      * @Route("/cron/debug/quality/{token}")
  85.      */
  86.     public function debugQuality($tokenEntityManagerInterface $entityManagerHttpClientInterface $httpClientMailerManager $mailerManagerUserManager $userManagerCossManager $cossManagerGamificationManager $gamificationManagerPeopleDataLabsManager $peopleDataLabsManagerMistralManager $mistralManagerTranslatorInterface $translatorParameterBagInterface $parameterBagUrlGeneratorInterface $router){
  87.         set_time_limit(0);
  88.         ini_set('max_execution_time'3600); //3600 seconds = 1 heure
  89.         ini_set('memory_limit''-1');
  90.         $user $entityManager->getRepository(User::class)->find(12);
  91.         //$userStats = $mistralManager->getUserStatisticsForMistral($user);
  92.         //$response = $mistralManager->analyzeUserStats($userStats);
  93.         //$newAiSynthesis = $mistralManager->saveUserAISynthesis($user, $response);
  94.         return New Response("OK"200);
  95.     }
  96.     /**
  97.      * @Route("/cron/export/connections/{token}/{start}/{end}")
  98.      */
  99.     public function exportConnections($token$start$endEntityManagerInterface $entityManager)
  100.     {
  101.         if($token == $this->CRON_TOKEN) {
  102.             $startDate DateTime::createFromFormat('d-m-Y'$start);
  103.             $endDate DateTime::createFromFormat('d-m-Y'$end);
  104.             if($startDate && $endDate){
  105.                 $response = new StreamedResponse();
  106.                 $response->setCallback(function() use ($entityManager$startDate$endDate){
  107.                     $handle fopen('php://output''w+');
  108.                     fwrite($handleimplode(';',
  109.                             [
  110.                                 '"Id utilisateur"',
  111.                                 '"Prénom utilisateur"',
  112.                                 '"Nom utilisateur"',
  113.                                 '"Email utilisateur"',
  114.                                 '"Société utilisateur"',
  115.                                 '"Fonction utilisateur"',
  116.                                 '"Niveau hiérarchique utilisateur"',
  117.                                 '"Date connexion"',
  118.                                 '"Heure connexion"',
  119.                                 '"Date création"',
  120.                                 '"Date suppression"'
  121.                             ]) . PHP_EOL);
  122.                     $connexions $entityManager->getRepository(RequestLog::class)->getLogsBetweenDates($startDate$endDate);
  123.                     foreach ($connexions as $connexion){
  124.                         fwrite($handleimplode(';',
  125.                                 [
  126.                                     $connexion->getUser()->getId(),
  127.                                     $connexion->getUser()->getFirstname(),
  128.                                     $connexion->getUser()->getLastname(),
  129.                                     $connexion->getUser()->getEmail(),
  130.                                     $connexion->getUser()->getCompany(),
  131.                                     $connexion->getUser()->getJobTitle(),
  132.                                     $connexion->getUser()->getHierarchicalLevel(),
  133.                                     $connexion->getCreatedAt()->format("d/m/Y"),
  134.                                     $connexion->getCreatedAt()->format("H:i:s"),
  135.                                     $connexion->getUser()->getCreatedAt() ? $connexion->getUser()->getCreatedAt()->format('d/m/Y'): "",
  136.                                     $connexion->getUser()->getDeletedAt() ? $connexion->getUser()->getDeletedAt()->format('d/m/Y') : ""
  137.                                 ]) . PHP_EOL);
  138.                     }
  139.                     fclose($handle);
  140.                 });
  141.                 $date = new \DateTime();
  142.                 $now $date->format('d_m_Y_H_i_s');
  143.                 $filename "coss_b2c_connections_export".$now.".csv";
  144.                 $response->setStatusCode(200);
  145.                 $response->headers->set('Content-Type''text/csv; charset=utf-8');
  146.                 $response->headers->set('Content-Disposition','attachment; filename='.$filename.'');
  147.                 return $response;
  148.             } else {
  149.                 return New Response("wrong dates param"401);
  150.             }
  151.         } else {
  152.             return New Response("access denied"401);
  153.         }
  154.     }
  155.     /**
  156.      * @Route("/cron/send/batch/feedback/email/{token}")
  157.      */
  158.     public function sendBatchFeedbackEmail($tokenRequest $requestEntityManagerInterface $entityManagerMailerManager $mailerManagerPool $poolTranslatorInterface $translator)
  159.     {
  160.         if ($token == $this->CRON_TOKEN) {
  161.             $batchFeedbacks $entityManager->getRepository(BatchFeedbackEmail::class)->getPendingBatchFeedbacksPastFiveMinuts();
  162.             $groupedFeedbacks = array();
  163.             foreach ($batchFeedbacks as $batchFeedback) {
  164.                 $feedback $batchFeedback->getFeedback();
  165.                 $request->setLocale($feedback->getSender()->getLocale());
  166.                 $senderRecipient $feedback->getSender()->getId() . '-' $feedback->getRecipient()->getId();
  167.                 // Get sender's photo url and name
  168.                 $featured $feedback->getSender()->getImage();
  169.                 if ($featured) {
  170.                     $provider $pool->getProvider($featured->getProviderName());
  171.                     $format $provider->getFormatName($featured"reference");
  172.                     $senderImage $request->getSchemeAndHttpHost()."/uploads/media/".$provider->generatePrivateUrl($featured$format);
  173.                 } else {
  174.                     $senderImage null;
  175.                 }
  176.                 $senderName $feedback->getSender()->getFirstname()." ".$feedback->getSender()->getLastname();
  177.                 if($feedback->getSender()->getCompany() != null){
  178.                     $senderCompany $feedback->getSender()->getCompany();
  179.                 } else {
  180.                     $senderCompany $translator->trans(
  181.                         "Pas de société", array(), 'mail'
  182.                     );
  183.                 }
  184.                 if (isset($groupedFeedbacks[$senderRecipient])) {
  185.                     $groupedFeedbacks[$senderRecipient]["feedbacks"][] = $feedback;
  186.                     $groupedFeedbacks[$senderRecipient]["batchFeedbacks"][] = $batchFeedback;
  187.                 } else {
  188.                     $groupedFeedbacks[$senderRecipient]["name"] = $senderName;
  189.                     $groupedFeedbacks[$senderRecipient]["company"] = $senderCompany;
  190.                     $groupedFeedbacks[$senderRecipient]["photo"] = $senderImage;
  191.                     $groupedFeedbacks[$senderRecipient]["feedbacks"] = array($feedback);
  192.                     $groupedFeedbacks[$senderRecipient]["batchFeedbacks"] = array($batchFeedback);
  193.                 }
  194.             }
  195.             $mailerManager->sendBatchFeedbackEmail($groupedFeedbacks);
  196.             foreach ($groupedFeedbacks as $groupedFeedback){
  197.                 foreach ($groupedFeedback['batchFeedbacks'] as $batchFeedback){
  198.                     $batchFeedback->setStatus(BatchFeedbackEmailRepository::STATUS_TREATED);
  199.                     $entityManager->persist($batchFeedback);
  200.                 }
  201.             }
  202.             $entityManager->flush();
  203.             return New Response(""200);
  204.         } else {
  205.             return New Response("access denied"401);
  206.         }
  207.     }
  208.     /**
  209.      * @Route("/cron/disable/licences/badge/{token}")
  210.      */
  211.     public function checkLicencesBadgesAccess($tokenEntityManagerInterface $entityManager)
  212.     {
  213.         if($token == $this->CRON_TOKEN) {
  214.             $users $entityManager->getRepository(User::class)->findAll();
  215.             foreach($users as $user){
  216.                 $badgesAccessExpirationDate $user->getLicenceEndDate();
  217.                 if($badgesAccessExpirationDate){
  218.                     $badgesAccessExpirationDate->modify('+12 months');
  219.                     $today = new DateTime();
  220.                     if ($badgesAccessExpirationDate >= $today) {
  221.                         $user->setBadgesAccess(false);
  222.                         $entityManager->persist($user);
  223.                     }
  224.                 } else {
  225.                     $user->setBadgesAccess(false);
  226.                     $entityManager->persist($user);
  227.                 }
  228.             }
  229.             $entityManager->flush();
  230.             return New Response(""200);
  231.         } else {
  232.             return New Response("access denied"401);
  233.         }
  234.     }
  235.     /**
  236.      * @Route("/cron/analyse/recipients/{token}")
  237.      */
  238.     public function analyseRecipients($tokenEntityManagerInterface $entityManagerPeopleDataLabsManager $peopleDataLabsManagerMistralManager $mistralManager){
  239.         if($token == $this->CRON_TOKEN) {
  240.             set_time_limit(0);
  241.             ini_set('max_execution_time'600); //600 seconds = 10min
  242.             $pendingRecipients $entityManager->getRepository(Recipient::class)->findBy(array('status' => RecipientRepository::STATUS_PENDING'analysisStatus' => RecipientRepository::ANALYSIS_PENDING));
  243.             foreach ($pendingRecipients as $recipient) {
  244.                 try {
  245.                     $user $recipient->getAppUser();
  246.                     if(!$user->getValidator()){ // Analysis only for 5Feedback validation
  247.                         $userData $peopleDataLabsManager->getUserCareer($user);
  248.                         if ($userData['found'] == true) {
  249.                             $senderData = array(
  250.                                 "firstname" => $user->getFirstname(),
  251.                                 "lastname" => $user->getLastname(),
  252.                                 "email" => $user->getEmail(),
  253.                                 "career" => $userData['data']
  254.                             );
  255.                         } else {
  256.                             $senderData = array(
  257.                                 "firstname" => $user->getFirstname(),
  258.                                 "lastname" => $user->getLastname(),
  259.                                 "email" => $user->getEmail(),
  260.                                 "career" => array(
  261.                                     "company" => $user->getCompany(),
  262.                                     "job_title" => $user->getJobTitle(),
  263.                                 )
  264.                             );
  265.                         }
  266.                         $status "Réseau professionnel";
  267.                         switch ($recipient->getStatus()) {
  268.                             case RecipientRepository::SUPERIOR_RECIPIENT:
  269.                                 $status "Manager";
  270.                                 break;
  271.                             case RecipientRepository::PAIR_RECIPIENT:
  272.                                 $status "Collègue";
  273.                                 break;
  274.                             case RecipientRepository::GUEST_RECIPIENT:
  275.                                 $status "Réseau professionnel";
  276.                                 break;
  277.                         }
  278.                         $recipientData = array(
  279.                             "status" => $status,
  280.                             "firstname" => $recipient->getUser()->getFirstname(),
  281.                             "lastname" => $recipient->getUser()->getLastname(),
  282.                             "email" => $recipient->getUser()->getEmail(),
  283.                             "company" => $recipient->getCompany(),
  284.                             "job_title" => $recipient->getTitle()
  285.                         );
  286.                         $response $mistralManager->validateRecipient($senderData$recipientData);
  287.                         if ($response['status'] == true) {
  288.                             if (isset($response['data'])) {
  289.                                 $recipient->setAnalysisData($response['data']);
  290.                                 $recipient->setAnalysisStatus(RecipientRepository::ANALYSIS_DONE);
  291.                                 $entityManager->persist($recipient);
  292.                                 $entityManager->flush();
  293.                             }
  294.                         } else {
  295.                             $iterations $recipient->getAnalysisIteration();
  296.                             $iterations++;
  297.                             if ($iterations >= 5) {
  298.                                 $recipient->setAnalysisStatus(RecipientRepository::ANALYSIS_EXPIRED);
  299.                             } else {
  300.                                 $recipient->setAnalysisIteration($iterations);
  301.                             }
  302.                             $entityManager->persist($recipient);
  303.                             $entityManager->flush();
  304.                             continue;
  305.                         }
  306.                     }
  307.                 } catch (Exception $exception) {
  308.                     $iterations $recipient->getAnalysisIteration();
  309.                     $iterations++;
  310.                     if ($iterations >= 5) {
  311.                         $recipient->setAnalysisStatus(RecipientRepository::ANALYSIS_EXPIRED);
  312.                     } else {
  313.                         $recipient->setAnalysisIteration($iterations);
  314.                     }
  315.                     $entityManager->persist($recipient);
  316.                     $entityManager->flush();
  317.                     continue;
  318.                 }
  319.             }
  320.             return New Response(""200);
  321.         } else {
  322.             return New Response("access denied"401);
  323.         }
  324.     }
  325. }