<?php
namespace App\Controller;
use App\Repository\CalendarEventRepository;
use App\Repository\FormationRepository;
use App\Repository\InscritRepository;
use App\Repository\SessionRepository;
use App\Repository\SiteRepository;
use App\Repository\StatusRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
class HomeController extends AbstractController
{
private $_inscritRepo;
private $_siteRepo;
private $_calendarRepo;
private $_statusRepo;
private $_formationRepo;
protected $sitefilter;
protected $sessionsfilter;
public function __construct(InscritRepository $inscritRepository,SiteRepository $siteRepository,CalendarEventRepository $calendarEventRepository, StatusRepository $statusRepository, FormationRepository $formationRepository){
$this->_inscritRepo = $inscritRepository;
$this->_siteRepo = $siteRepository;
$this->_calendarRepo = $calendarEventRepository;
$this->_statusRepo = $statusRepository;
$this->_formationRepo = $formationRepository;
}
/**
* @Route("/", name="app_home")
*/
public function home(){
return $this->redirectToRoute('app_login');
}
/**
* @Route("/admin/", name="app_home_admin")
*/
public function index(SessionRepository $sessionRepository, Request $request, SessionInterface $session): Response
{
$site = 0;
$sessionData = [];
$formations = $this->_formationRepo->findAll();
if ($this->isGranted('ROLE_ADMIN')) {
$site = $this->_siteRepo->findAll();
for ($i=0; $i < count($site); $i++) {
$sessionData[$site[$i]->getWording()] = [
'encour'=> $sessionRepository->recap($site[$i]->getId(),2)[0],
'planifie'=> $sessionRepository->recap($site[$i]->getId(),1)[0],
'cloture'=> $sessionRepository->recap($site[$i]->getId(),3)[0],
'annule'=> $sessionRepository->recap($site[$i]->getId(),4)[0],
];//2 pour en cour
}
}else {
$site = $this->_siteRepo->findBy(["id"=>(string)$this->getUser()->getSite()->getId()]);
for ($i=0; $i < count($site); $i++) {
$sessionData[$site[$i]->getWording()] = [
'encour'=> $sessionRepository->recap($site[$i]->getId(),2)[0],
'planifie'=> $sessionRepository->recap($site[$i]->getId(),1)[0],
'cloture'=> $sessionRepository->recap($site[$i]->getId(),3)[0],
'annule'=> $sessionRepository->recap($site[$i]->getId(),4)[0],
];//2 pour en cour
}
}
//dd($sessionData);
$data = [];
$colorId = 0;
$color = [
'rgba(210, 214, 222, 1)',
'rgb(255, 99, 132)',
'rgba(255, 206, 86, 0.5)',
'rgba(222, 114, 222, 1)',
'rgba(122, 114, 122, 1)',
];
foreach ($site as $value) {
$t = ['site'=>$value->getWording(),'data'=>$this->_inscritRepo->findInscritSite($value->getId())];
array_push($data,$t);
}
$dataGraphe = [];
foreach ($site as $value) {
$dataInOrder[0]=0;
$dataInOrder[1]=0;
$dataInOrder[2]=0;
$dataInOrder[3]=0;
$dataInOrder[4]=0;
$dataInOrder[5]=0;
$dataInOrder[6]=0;
$dataInOrder[7]=0;
$dataInOrder[8]=0;
$dataInOrder[9]=0;
$dataInOrder[10]=0;
$dataInOrder[11]=0;
$tt = $this->_inscritRepo->findInscritSiteMonth($value->getId());
for ($i=0; $i < 12; $i++) {
foreach ($tt as $value2) {
if ($value2['month'] == $i + 1) {
$dataInOrder[$value2['month']] = $value2['valide'];
}
}
}
//dd($dataGraphe);
$t = [
'label'=>$value->getWording(),
"backgroundColor" =>$color[$colorId],
"borderColor" => $color[$colorId],
"pointRadius"=> false,
"pointColor "=> $color[$colorId],
"pointStrokeColor"=> '#c1c7d1',
"pointHighlightFill"=> '#fff',
"pointHighlightStroke"=> 'rgba(220,220,220,1)',
'data'=>$dataInOrder
];
array_push($dataGraphe,$t);
$colorId++;
}
$task = 0;
if ($this->isGranted('ROLE_ADMIN')) {
$task = $this->_calendarRepo->getTodayEvent(2);
}else {
$task = $this->_calendarRepo->getTodayEvent(2,$this->getUser()->getSite()->getId());
}
$nextsession = 0;
if ($this->isGranted('ROLE_ADMIN')) {
$nextsession = $sessionRepository->findNextWeekSessions();
}else {
$nextsession = $sessionRepository->findNextWeekSessions($this->getUser()->getSite()->getId());
}
/*$json = [
[
"label" => 'Ivry-sur-Seine',
"backgroundColor" =>'rgba(210, 214, 222, 1)',
"borderColor" => 'rgba(210, 214, 222, 1)',
"pointRadius"=> false,
"pointColor "=> 'rgba(210, 214, 222, 1)',
"pointStrokeColor"=> '#c1c7d1',
"pointHighlightFill"=> '#fff',
"pointHighlightStroke"=> 'rgba(220,220,220,1)',
"data"=> [65, 59, 80, 81, 56, 55, 40]
]
];*/
//Données dashboard session et site
$sessionsbystatus = array();
if($request->getMethod() == "POST")
{
//$filterby sera pour effectuer le filtre au niveau de getSessionsByStatus. si vide on passe sinon on fera des find by avec args en parametre
$filterby = $this->getFilterArgs($request);
if($filterby["statut_id"] != "all"){
//si statut choisi filtrer selon le staut choisi
$sessionsbystatus["planifie"] = $this->getSessionsByStatus($filterby["statut_id"] == "1" ? 1 : 0, $sessionRepository, $filterby);
$sessionsbystatus["encours"] = $this->getSessionsByStatus($filterby["statut_id"] == "2" ? 2 : 0, $sessionRepository, $filterby);
$sessionsbystatus["clotureannule"] = $this->getSessionsByStatus(($filterby["statut_id"] == "3" || $filterby["statut_id"] == "4") ? (int)$filterby["statut_id"] : 0, $sessionRepository, $filterby);
}
else{
//si aucun statut renseigné filtrer normalement
$sessionsbystatus["planifie"] = $this->getSessionsByStatus( 1, $sessionRepository, $filterby);
$sessionsbystatus["encours"] = $this->getSessionsByStatus(2, $sessionRepository, $filterby);
$sessionsbystatus["clotureannule"] = $this->getSessionsByStatus([3,4], $sessionRepository, $filterby);
}
//cas ou le fitre viens de inscrit/liste (fichier inscription.html.twig)
//recupere les sessions, les compact et recherche les inscrits avec ces sessions
$previousurl = $request->headers->get('referer');
if($previousurl != null && str_contains($previousurl, 'inscrit'))
{
$sessions = array_merge($sessionsbystatus["planifie"]["sessions"], $sessionsbystatus["encours"]["sessions"], $sessionsbystatus["clotureannule"]["sessions"]);
$session->set('sitefilter', $site);
$session->set('sessionsfilter', $sessions);
return $this->redirectToRoute("app_inscrits_filtered");
}
}else{
$sessionsbystatus["planifie"] = $this->getSessionsByStatus(1, $sessionRepository, []);
$sessionsbystatus["encours"] = $this->getSessionsByStatus(2, $sessionRepository, []);
$sessionsbystatus["clotureannule"] = $this->getSessionsByStatus([3,4], $sessionRepository, []);
}
return $this->render('admin/welcome.html.twig', [
'menu' => 'Accueil',
'page' => 'Tableau de bord',
'menuLink' => 'dashboard',
'data' =>$data,
'dataGraphe' =>$dataGraphe,
'todo'=> $task,
'nextsessions' => $nextsession,
'sessionsbystatus' => $sessionsbystatus,
'sessionData' => $sessionData,
'sites'=>$site,
'formations' => $formations,
'status' => $this->_statusRepo->findAll(),
]);
}
/**
* @Route("/admin/calendrier", name="calendar")
*/
public function calendar(): Response
{
return $this->render('admin/calendar.html.twig', [
'menu' => 'Accueil',
'page' => 'Calendrier',
'menuLink' => 'calendar'
]);
}
/**
* @param mixed $status
* @param App\Repository\SessionRepository $sessionRepository
* @return array
*/
private function getSessionsByStatus($status, $sessionRepository, ?array $filterby):array
{
//recupere toutes les sessions selon le statut et definie pour chacune d'elle le nombre de valide, en attente et et le total
$sessions = array();
if(isset($filterby) && count($filterby) >= 4){
$filterby["status"] = (array)$status;
$sessions["sessions"] = $sessionRepository->findByWelcomeFilterBy($filterby);
} else{
$sessions["sessions"] = $sessionRepository->findBy(['status' => $status],['start_date'=>'asc']);
}
$sessions["statuswording"] = $this->getSessionsByStatusWording($status);
foreach ($sessions["sessions"] as $key => $session) {
$sessions["sessions"][$key] = array();
$sessions["sessions"][$key]["session"] = $session;
$sessions["sessions"][$key]["inscrits"] = $sessions["sessions"][$key]["enattentes"] = $sessions["sessions"][$key]["valides"] = 0;
foreach ($session->getInscrits() as $inscrit) {
$sessions["sessions"][$key]["inscrits"]++;
// if($inscrit->getStatutInscrit()->getId() == 1){
// $sessions["sessions"][$key]["enattentes"]++;
// }
// else if($inscrit->getStatutInscrit()->getId() == 2){
// $sessions["sessions"][$key]["valides"]++;
// }
}
}
return $sessions;
}
private function getSessionsByStatusWording($status)
{
if(is_array($status))
{
$wording = "";
$i=1;
foreach ($status as $statu) {
$wording .= $this->_statusRepo->find($statu) != null ? $this->_statusRepo->find($statu)->getWording() : "";
if($i < count($status))
$wording .= " | ";
$i++;
}
}
else
$wording = $this->_statusRepo->find($status) != null ? $this->_statusRepo->find($status)->getWording() : "";
return $wording;
}
/**
* Returns welwome.html.twig filter values to pass to repositories
*
* @param Request $request
* @return array
*/
public function getFilterArgs(Request $request):array
{
$datedebut = $request->request->get('datedebut') == "" ? '1970-01-01' : date_create($request->request->get('datedebut'))->format("Y-m-d");
$datefin = $request->request->get('datefin') == "" ? '2900-12-31' : date_create($request->request->get('datefin'))->format("Y-m-d");
$site = $request->request->get('site') == "" ? null : $this->_siteRepo->find($request->request->get('site'));
$formation = $request->request->get('formation') == "" ? null : $this->_formationRepo->find($request->request->get('formation'));
/*if($request->request->get('formation') == "")
$session = null;
else
$session = $this->_sessionRepo->find($request->request->get('session'));
*/
$statut_id = ($request->request->get('statut_id') == "all" || $request->request->get('statut_id') == null) ? "all" : $request->request->get('statut_id'); //if null or all findAll status or find($id)
return [
"datedebut" => $datedebut,
"datefin" => $datefin,
"site" => $site,
"formation" => $formation,
"statut_id" => $statut_id,
];
}
/**
* @Route("/admin/liste-inscrits/filtre", name="app_inscrits_filtered")
*/
public function indexFiltered(SessionInterface $session)
{
$site = $session->get('sitefilter'); $sessions = $session->get('sessionsfilter');
if($site == null || $sessions == null || !(is_array($sessions)))
return $this->redirectToRoute('app_inscrit_index');
foreach ($sessions as $key => $session) {
$sessions[$key] = $session["session"];
}
$inscrit = $this->_inscritRepo->findBy(['session' => $sessions]);
return $this->render('admin/inscrit/inscription.html.twig', [
'inscrits' => $inscrit,
'statuts' => $this->_statusRepo->findAll(),
'statutfiltered' => '',
'menu' => 'Inscription',
'page' => 'Liste inscription',
'menuLink' => 'inscription',
'path'=>'app_inscrit_index',
'sites'=>$site,
'formations' => $this->_formationRepo->findAll(),
'status' => $this->_statusRepo->findAll(),
]);
}
}