<?php
namespace App\Controller;
use App\Entity\Configuration;
use App\Entity\Job;
use App\Entity\Reminder;
use App\Entity\User;
use App\Form\ConfigurationType;
use App\Repository\ConfigurationRepository;
use App\Repository\JobRepository;
use App\Repository\ReminderRepository;
use App\Repository\UserRepository;
use App\Service\MailerService;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* @Route("/admin/cron")
*/
class CronController extends AbstractController
{
/**
* @Route("/mailjet-webhook", name="mailjet_webhook")
*/
public function mailjetwebhook(Request $request){
$file1 = '/var/www/clients/client1/web12/web/var/cache/file1.txt';
$file2 = '/var/www/clients/client1/web12/web/var/cache/file2.txt';
$file3 = '/var/www/clients/client1/web12/web/var/cache/file3.txt';
file_put_contents($file1,json_encode($_POST));
file_put_contents($file2,json_encode($_GET));
file_put_contents($file3,$request->getContent());
return new Response('ok',200);
}
/**
* @Route("/daily-cron", name="cron_daily_user_cron", methods={"GET"})
*/
public function new(TranslatorInterface $translator,Request $request, ConfigurationRepository $confRepo, UserRepository $userRepository,
JobRepository $jobRepository, MailerService $mailerService,ReminderRepository $reminderRepository): Response
{
$date = new \DateTime("now");
$time = ($date->getTimestamp() % 86400);
$this->closeAllOpenedJob($jobRepository, $reminderRepository);
//Minuit
if($time > 86300 or $time < 300){
$userRepository->remiseAZeroCron();
}
//8:30
if($time >= 30300 and $time <= 30900){
$this->sendMailDailyReportUser( $mailerService, $confRepo,$jobRepository, $userRepository);
}
//9:30
if($time >= 33900 and $time <= 34500){
$this->sendWeeklyAdmin( $mailerService, $confRepo,$jobRepository, $userRepository);
}
$this->sendMailNonConnectedUsers( $confRepo, $jobRepository, $reminderRepository,
$userRepository, $mailerService);
exit;
}
private function closeAllOpenedJob(JobRepository $jobRepository, ReminderRepository $reminderRepository){
$jobs = $jobRepository->findByEnd(null);
$reminders = $reminderRepository->findAll();
$rg = $reminders[0];
foreach($jobs as $job){
$max = $rg->getSuperior() + $rg->getdelayClosingJob() + 1;
if($job->ShouldBeClosed($max)){
$job->setEnd($job->getCloseJobTime($rg));
$this->getDoctrine()->getManager()->flush();
}
}
}
private function sendMailNonConnectedUsers(ConfigurationRepository $configurationRepository, JobRepository $jobRepository, ReminderRepository $reminderRepository,
UserRepository $userRepository, MailerService $mailerService){
$conf = $configurationRepository->findOneById(1);
$subject = $conf->getEmailCronAlertObject();
$template = 'email/alert-connexion.html.twig';
$date = new \DateTime("now");
$time = ($date->getTimestamp() % 86400);
$not_concerned_users = [];
//Utilisateurs déjà connectéz
$jobs = $jobRepository->getJobsbyDate($date);
foreach($jobs as $job){
if(!in_array($job->getUser()->getId(),$not_concerned_users)){
$not_concerned_users[] = $job->getUser()->getId();
}
}
$users = $userRepository->findBy(['active'=>true,'enabled'=>true,'cronAlert'=>False]);
$reminders = $reminderRepository->findAll();
$rg = null;
$users_reminders = [];
foreach($reminders as $r){
if($r->getId() === 1){
$rg = $r;
continue;
}
if(!in_array($r->getUser()->getId(),$not_concerned_users)){
$users_reminders[$r->getUser()->getId()]['reminder'] = $r;
$users_reminders[$r->getUser()->getId()]['user'] = $r->getUser();
}
}
foreach($users as $user){
if(!in_array($user->getId(),$not_concerned_users) and !array_key_exists($user->getId(),$users_reminders)){
$users_reminders[$user->getId()]['reminder'] = $rg;
$users_reminders[$user->getId()]['user'] = $user;
}
}
$tab = [];
$users = [];
foreach($users_reminders as $ur){
$rem = $ur['reminder'];
$u = $ur['user'];
if(
$rem->isNotInOffDay() &&
$rem->getSendMailIfNotConnected() &&
$rem->inTime($time)
){
$users[] = $u->getId();
$tab[] = [
'email'=>$u->getEmail(),
'prenomNom'=>$u->getPrenomNom(),
'content'=>[
'content' => $conf->getEmailCronAlertMessage(),
'host' => 'http://'.$_SERVER['HTTP_HOST'],
]
];
}
}
$mailerService->sendMultipleReceiversMultiplesMessages($subject,$template,$tab);
if($users){
$userRepository->cronAlertOk($users);
}
}
private function sendMailDailyReportUser(MailerService $mailerService, ConfigurationRepository $configurationRepository,
JobRepository $jobRepository, UserRepository $userRepository){
$conf = $configurationRepository->findOneById(1);
$subject = $conf->getEmailCronRapportObject();
$template = 'email/rapport-user.html.twig';
$reminder = new Reminder();
$jo = new Job();
$date = new \DateTime('now');
$date->modify('-1 day');
$yesterday_jobs = $jobRepository->getJobsbyDate($date);
if(count($yesterday_jobs) == 0){
return null;
}
$jobs = [];
$users = [];
foreach($yesterday_jobs as $job){
if($job->getUser()->getCronRapport()){
continue;
}
$jobs[$job->getUser()->getId()]['jobs'][] = $job;
if(!isset($jobs[$job->getUser()->getId()]['jour'])){
$jobs[$job->getUser()->getId()]['jour'] = $reminder->getWeekDays()[$date->format('l')];
$jobs[$job->getUser()->getId()]['date'] = $date;
$jobs[$job->getUser()->getId()]['content'] = $conf->getEmailCronRapportMessage();
$jobs[$job->getUser()->getId()]['host'] = 'http://'.$_SERVER['HTTP_HOST'];
$jobs[$job->getUser()->getId()]['total'] = $job->getDuree();
$jobs[$job->getUser()->getId()]['travail'] = 0;
if(!$job->getBreak()){
$jobs[$job->getUser()->getId()]['travail'] = $job->getDuree();
}
$users[$job->getUser()->getId()] = [
'email' => $job->getUser()->getEmail(),
'prenomNom' => $job->getUser()->getPrenomNom(),
];
}else{
$jobs[$job->getUser()->getId()]['total'] = $jobs[$job->getUser()->getId()]['total'] + $job->getDuree();
if(!$job->getBreak()){
$jobs[$job->getUser()->getId()]['travail'] = $jobs[$job->getUser()->getId()]['travail'] + $job->getDuree();
}
}
}
$content = [];
foreach ($jobs as $k => $v){
$jobs[$k]['performance'] = round(($jobs[$k]['travail']/$jobs[$k]['total'])*100).'%';
$jobs[$k]['total'] = $jo->getDisplayedDuree($jobs[$k]['total']);
$content[$k]['email'] = $users[$k]['email'];
$content[$k]['prenomNom'] = $users[$k]['prenomNom'];
$content[$k]['content'] = $jobs[$k];
}
$mailerService->sendMultipleReceiversMultiplesMessages($subject,$template,$content);
if($users){
$userRepository->cronRapportOk(array_keys($users));
}
}
private function sendWeeklyAdmin(MailerService $mailerService, ConfigurationRepository $configurationRepository,
JobRepository $jobRepository, UserRepository $userRepository){
$conf = $configurationRepository->findOneById(1);
$subject = $conf->getEmailCronAdminObject();
$template = 'email/rapport-admin.html.twig';
$jo = new Job();
$date = new \DateTime('now');
if($date->format('l') != 'Monday'){
return null;
}
$week_jobs = $jobRepository->getWeekJobs($date);
if(count($week_jobs) == 0){
return null;
}
$projectTimes = [];
$project_to_views = new ArrayCollection();
$userTimes = [];
foreach($week_jobs as $job){
if(!$job->getBreak()){
$project = $job->getTask()->getProject();
if(!is_null($project) && $project_to_views->contains($project) === False){
$project_to_views->add($project);
}
if(!is_null($project) && !isset($projectTimes[$project->getId()])){
$projectTimes[$project->getId()] = $job->getDuree();
}elseif(!is_null($project) && isset($projectTimes[$project->getId()])){
$projectTimes[$project->getId()] = $projectTimes[$project->getId()] + $job->getDuree();
}
}
if(!isset($userTimes[$job->getUser()->getId()])){
$userTimes[$job->getUser()->getId()]['workedHours'] = $job->getDuree();
if(!$job->getBreak()){
$userTimes[$job->getUser()->getId()]['reallyworkedHours'] = $job->getDuree();
}
}else{
$userTimes[$job->getUser()->getId()]['workedHours'] = $userTimes[$job->getUser()->getId()]['workedHours'] + $job->getDuree();
if(!$job->getBreak()){
$userTimes[$job->getUser()->getId()]['reallyworkedHours'] = $userTimes[$job->getUser()->getId()]['reallyworkedHours'] + $job->getDuree();
}
}
}
foreach($projectTimes as $k => $v){
$projectTimes[$k] = $jo->getDisplayedDuree($projectTimes[$k]);
}
$users = $userRepository->findBy(['active'=>true]);
foreach($users as $user){
if(isset($userTimes[$user->getId()])){
$userTimes[$user->getId()]['performance'] = round(($userTimes[$user->getId()]['reallyworkedHours']/$userTimes[$user->getId()]['workedHours'])*100).'%';
$userTimes[$user->getId()]['workedHours'] = $jo->getDisplayedDuree($userTimes[$user->getId()]['workedHours']);
$userTimes[$user->getId()]['reallyworkedHours'] = $jo->getDisplayedDuree($userTimes[$user->getId()]['reallyworkedHours']);
}else{
$userTimes[$user->getId()]['workedHours'] = '0';
$userTimes[$user->getId()]['reallyworkedHours'] = '0';
$userTimes[$user->getId()]['performance'] = '0%';
}
}
$dateDebut = new \DateTime('now');
$dateFin = new \DateTime('now');
$dateFin->modify("-1 day");
$dateDebut->modify("-7 days");
$contenu = [
'date' => $dateDebut,
'dateFin' => $dateFin,
'content' => $conf->getEmailCronAdminMessage(),
'host' => 'http://'.$_SERVER['HTTP_HOST'],
'projects' => $project_to_views,
'projectTimes' => $projectTimes,
'users' => $users,
'userTimes' => $userTimes,
];
$admins = new ArrayCollection();
foreach($users as $user){
if($user->isAdmin() && !$user->getCronAdmin()){
$admins->add($user);
}
}
foreach ($admins as $user){
$content[$user->getId()]['email'] = $user->getEmail();
$content[$user->getId()]['prenomNom'] = $user->getPrenomNom();
$content[$user->getId()]['content'] = $contenu;
}
$mailerService->sendMultipleReceiversMultiplesMessages($subject,$template,$content);
$userRepository->cronAdmintOk(array_keys($content));
}
}