<?php
namespace App\Controller\admin;
use App\Entity\Company;
use App\Entity\Formation;
use App\Entity\Log;
use App\Entity\User;
use App\Security\Voter\CompanyVoter;;
use App\Service\datatable\Builder;
use App\Service\statistics\StatisticsService;
use Doctrine\Persistence\ManagerRegistry;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class StatisticsController extends AbstractController
{
private ManagerRegistry $managerRegistry;
public function __construct(ManagerRegistry $managerRegistry)
{
$this->managerRegistry = $managerRegistry;
}
/**
* @param Request $request
* @Security("is_granted('ROLE_RH')")
* @Route("/api/subscription/stat", name="subscription-stat", methods={"POST"})
*/
public function statContent(Request $request, ManagerRegistry $managerRegistry){
$companyID = $request->request->get('ID');
$company = $managerRegistry->getRepository(Company::class)->find($companyID);
/* @see CompanyVoter */
$this->denyAccessUnlessGranted(CompanyVoter::COMPANY_SHOW,$company);
if(!$company) {
return new JsonResponse("ko",400);
}
$content = $this->renderView('pages/admin/company/blocks/stat.html.twig',[
"company"=>$company,
'context'=> 'tools'
]);
$actions = $this->renderView('pages/admin/company/blocks/tab.actions.html.twig',[
'context'=> 'stat',
'company' => $company
]);
return new JsonResponse(["content"=>$content,"actions"=>$actions]);
}
/**
* @param Request $request
* @Security("is_granted('ROLE_RH')")
* @Route("/api/subscription/stat/data", name="subscription-stat-data", methods={"POST"},options={"expose":true})
*/
public function statData(Request $request, ManagerRegistry $managerRegistry,StatisticsService $statisticsService){
$companyID = $request->request->get('companyID');
$company = $managerRegistry->getRepository(Company::class)->find($companyID);
/* @see CompanyVoter */
$this->denyAccessUnlessGranted(CompanyVoter::COMPANY_SHOW,$company);
if(!$company) {
return new JsonResponse("ko",400);
}
//Range date
$start = $request->query->get('start');
$end = $request->query->get('end');
$data = $statisticsService->getData($start,$end,$company);
return new JsonResponse($data);
}
/**
* Alimente la datatable
* @param Request $request
* @Security("is_granted('ROLE_RH') or is_granted('ROLE_ADMIN')")
* @Route("/api/dt/stat/login/{company}", name="dt-stat-login", methods={"GET"},options={"expose":true})
* @return JsonResponse
*/
public function dtStatLogin(Request $request, Company $company, Builder $dtBuilder)
{
$start = $request->query->get('start_date');
$end = $request->query->get('end_date');
$em = $this->managerRegistry->getManager();
$params = $request->query->all();
$query = $em->getRepository(Log::class)->getQueryForLoginEvent($start,$end,$company);
$dataTables = $dtBuilder
->withColumnAliases([
// 'id' => 'u.id',
// 'department' => 'd.name',
'lastname' => 'u.lastname',
'firstname' => 'u.firstname',
'email' => 'u.email',
'loginAt' => 'l.createdAt',
])
->withIndexColumn('l.id')
->withQueryBuilder($query)
->withRequestParams($params);
$data = $dataTables->getResponse();
return new JsonResponse($data);
}
/**
* Alimente la datatable
* @param Request $request
* @Security("is_granted('ROLE_RH') or is_granted('ROLE_ADMIN')")
* @Route("/api/dt/stat/video/{company}", name="dt-stat-video", methods={"GET"},options={"expose":true})
* @return JsonResponse
*/
public function dtStatVideo(Request $request, Company $company, Builder $dtBuilder)
{
$start = $request->query->get('start_date');
$end = $request->query->get('end_date');
$em = $this->managerRegistry->getManager();
$params = $request->query->all();
$query = $em->getRepository(Log::class)->getQueryForVideoEvent($start,$end,$company);
$dataTables = $dtBuilder
->withColumnAliases([
// 'id' => 'u.id',
// 'department' => 'd.name',
'lastname' => 'u.lastname',
'firstname' => 'u.firstname',
'email' => 'u.email',
'viewedAt' => 'l.createdAt',
'sources' =>'l.sources'
])
->withIndexColumn('l.id')
->withQueryBuilder($query)
->withRequestParams($params);
$data = $dataTables->getResponse();
$isAdmin = $this->isGranted('ROLE_ADMIN');
foreach ($data['data'] as &$d){
$sources = json_decode($d['sources'],true);
$cat = $sources['feedData']['CAT'];
//Set visibility video
$isVisible = isset($sources['visibility']) && $sources['visibility']['visible'] === true;
$d['CAT'] = $this->getCAT($cat);
$d['title_video'] = $isAdmin || (!$isAdmin && $isVisible) ? $sources['title'] : 'Le titre de la vidéo n\'est pas disponible';
$d['title_playlist'] = $isAdmin || (!$isAdmin && $isVisible) ? $sources['feedData']['title'] : 'Le titre de la playlist n\'est pas disponible';
}
return new JsonResponse($data);
}
private function getCAT($value)
{
$cat="";
switch (trim($value)){
case 'RENFO':
$cat = 'Renforcement';
break;
case 'ERGO':
$cat = 'Ergonomie';
break;
case 'ETIR':
$cat = 'Etirement';
break;
case 'CONS':
$cat = 'Conseils';
break;
case 'BIOMECA':
$cat = 'Biomecanique';
break;
case 'SECOURS':
$cat = 'Premiers secours';
break;
default:
return '/';
}
return $cat;
}
/**
* Alimente la datatable
* @param Request $request
* @Security("is_granted('ROLE_RH') or is_granted('ROLE_ADMIN')")
* @Route("/api/dt/stat/formation/{company}", name="dt-stat-formation", methods={"GET"},options={"expose":true})
* @return JsonResponse
*/
public function dtStatFormation(Request $request, Company $company, Builder $dtBuilder)
{
$start = $request->query->get('start_date');
$end = $request->query->get('end_date');
$em = $this->managerRegistry->getManager();
$params = $request->query->all();
$query = $em->getRepository(Log::class)->getQueryForFormationEvent($start,$end,$company);
$dataTables = $dtBuilder
->withColumnAliases([
// 'id' => 'u.id',
// 'department' => 'd.name',
'lastname' => 'u.lastname',
'firstname' => 'u.firstname',
'email' => 'u.email',
'viewedAt' => 'l.updatedAt',
])
->withIndexColumn('l.id')
->withQueryBuilder($query)
->withRequestParams($params);
$data = $dataTables->getResponse();
foreach ($data['data'] as &$d){
$f = $this->managerRegistry->getRepository(Formation::class)->find($d['formation']);
if ($f){
$d['title'] = $f->getTitle();
}
else{
$d['title'] = '/';
}
}
return new JsonResponse($data);
}
}