← Back
Editing: AgentController.php
<?php namespace App\Controller\Supervisor; use App\Breadcrumb\BreadcrumbInterface; use App\Breadcrumb\BreadcrumbItem; use App\Entity\User; use App\Export\AgentControlCountExporter; use App\Repository\ControleRepository; use App\Repository\UserRepository; use App\Service\SupervisorService; use App\Service\Utils; use App\Session\Filter\SessionFiltersContainer; use Doctrine\ORM\NonUniqueResultException; use Doctrine\ORM\NoResultException; use Knp\Component\Pager\PaginatorInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\ResponseHeaderBag; use Symfony\Component\Routing\Annotation\Route; #[Route(path: '/supervisor/agent', name: 'supervisor_agent_')] class AgentController extends AbstractController { public function __construct(BreadcrumbInterface $breadcrumb, SupervisorService $supervisorService) { $breadcrumb->addItem(BreadcrumbItem::set('Agents', 'supervisor_agent_index')); $supervisorService->setSection('agent'); } #[Route(path: '/{page}', name: 'index', requirements: ['page' => '\d+'])] public function index(UserRepository $userRepository, PaginatorInterface $paginator, ?int $page = 1): Response { $agentsQuery = $userRepository->getAgentsByAgenciesQueryBuilder([$this->getUser()->getAgency()->getId()]); $agents = $paginator->paginate($agentsQuery, $page); return $this->render('supervisor/agent/index.html.twig', ['agents' => $agents]); } #[Route(path: '/performance.html', name: 'performance')] public function performance(UserRepository $userRepository): Response { /** @var User $user */ $user = $this->getUser(); $averageControleTimes = $userRepository->getAgentsByAgenciesByControlTimeQuery( [$this->getUser()->getAgency()->getId()], )->getQuery()->getResult(); $averageControleTimes = array_map(function ($item) { list($hours) = explode(':', $item['doneTime']); if ($hours > 23) { $item['doneTime'] = '23:59:59.0000'; } return $item; }, $averageControleTimes); $controlCountPerAgent = $userRepository->getByAgenciesByControl(agenciesId: [ $user->getAgency()->getId(), ], role: 'ROLE_AGENT', sort: ['COUNT(c.id)', 'DESC']); return $this->render( 'supervisor/agent/performance.html.twig', [ 'averageControleTimes' => $averageControleTimes, 'controlCountPerAgent' => $controlCountPerAgent, 'maxControls' => array_reduce($controlCountPerAgent, fn ($carry, $item) => max($item['cnt'], $carry), 0), ] ); } #[Route(path: '/chart-time.json', name: 'chart_time')] public function timeChart( ControleRepository $controleRepository, SessionFiltersContainer $sessionFiltersContainer, Utils $utils ): JsonResponse { $filters = $sessionFiltersContainer->getCurrent(); $startDate = $filters->getDateRange()->getDateStart(); $endDate = $filters->getDateRange()->getDateEnd(); $labels = $utils->getMonthsTimeline($startDate, $endDate); $times = $controleRepository->getControlsTimeByAgenciesByMonth([$this->getUser()->getAgency()->getId()]); $total = 0; if (count($times) > 0) { $total = array_reduce($times, function ($carry, $item) { return $carry + $item['doneTime']; }, 0) / count($times); } $prevTimes = $controleRepository->getControlsTimeByAgenciesByMonth( [$this->getUser()->getAgency()->getId()], true ); $prevTotal = 0; if (count($prevTimes) > 0) { $prevTotal = array_reduce($prevTimes, function ($carry, $item) { return $carry + $item['doneTime']; }, 0) / count($prevTimes); } if ($prevTotal > 0) { $evolution = (($total - $prevTotal) / $prevTotal) * 100; } else { $evolution = 0; } return new JsonResponse([ 'labels' => $labels, 'total' => $total, 'times' => $times, 'evolution' => $evolution, ]); } /** * @throws NoResultException * @throws NonUniqueResultException */ #[Route(path: '/chart-frequence.json', name: 'chart_frequency')] public function frequencyChart( ControleRepository $controleRepository, UserRepository $userRepository, SessionFiltersContainer $sessionFiltersContainer, Utils $utils ): JsonResponse { $filters = $sessionFiltersContainer->getCurrent(); $startDate = $filters->getDateRange()->getDateStart(); $endDate = $filters->getDateRange()->getDateEnd(); $labels = $utils->getMonthsTimeline($startDate, $endDate); $nbAgents = $userRepository->getAgentsByAgenciesQueryBuilder( [$this->getUser()->getAgency()->getId()] )->select( 'COUNT(u)' )->getQuery()->getSingleScalarResult(); $controls = $controleRepository->countControlesByAgenciesByMonth( [$this->getUser()->getAgency()->getId()], false ); $frequencies = []; foreach ($controls as $control) { $frequencies[] = [ 'month' => $control['month'], 'cnt' => $control['nbControls'] / $nbAgents, ]; } $total = 0; if (count($frequencies) > 0) { $total = array_reduce($frequencies, function ($carry, $item) { return $carry + $item['cnt']; }, 0) / count($frequencies); } $prevControls = $controleRepository->countControlesByAgenciesByMonth( agenciesId: [$this->getUser()->getAgency()->getId()], previous: true ); $prevFrequencies = []; foreach ($prevControls as $control) { $prevFrequencies[] = [ 'month' => $control['month'], 'cnt' => $control['nbControls'] / $nbAgents, ]; } $prevTotal = 0; if (count($prevFrequencies) > 0) { $prevTotal = array_reduce($prevFrequencies, function ($carry, $item) { return $carry + $item['cnt']; }, 0) / count($prevFrequencies); } if ($prevTotal > 0) { $evolution = (($total - $prevTotal) / $prevTotal) * 100; } else { $evolution = 0; } return new JsonResponse([ 'labels' => $labels, 'total' => $total, 'frequencies' => $frequencies, 'evolution' => $evolution, ]); } /** * @throws NoResultException * @throws NonUniqueResultException */ #[Route(path: '/chart-recurring.json', name: 'chart_recurring')] public function recurringChart( Utils $utils, SessionFiltersContainer $sessionFiltersContainer, ControleRepository $controleRepository ): JsonResponse { $filters = $sessionFiltersContainer->getCurrent(); $startDate = $filters->getDateRange()->getDateStart(); $endDate = $filters->getDateRange()->getDateEnd(); $labels = $utils->getMonthsTimeline($startDate, $endDate); $controls = $controleRepository->countControlesByAgenciesByMonth([$this->getUser()->getAgency()->getId()], false); $recurring = []; foreach ($controls as $control) { $recurring[] = [ 'month' => $control['month'], 'cnt' => $control['nbControls'] / $control['nbAddresses'], ]; } $total = 0; if (count($recurring) > 0) { $total = array_reduce($recurring, function ($carry, $item) { return $carry + $item['cnt']; }, 0) / count($recurring); } $prevControls = $controleRepository->countControlesByAgenciesByMonth( agenciesId: [$this->getUser()->getAgency()->getId()], groupProvider: false, previous: true ); $prevRecurring = []; foreach ($prevControls as $control) { $prevRecurring[] = [ 'month' => $control['month'], 'cnt' => $control['nbControls'] / $control['nbAddresses'], ]; } $prevTotal = 0; if (count($prevRecurring) > 0) { $prevTotal = array_reduce($prevRecurring, function ($carry, $item) { return $carry + $item['cnt']; }, 0) / count($prevRecurring); } if ($prevTotal > 0) { $evolution = (($total - $prevTotal) / $prevTotal) * 100; } else { $evolution = 0; } return new JsonResponse([ 'labels' => $labels, 'total' => $total, 'recurring' => $recurring, 'evolution' => $evolution, ]); } #[Route(path: '/export-control-count.xls', name: 'export_control_count')] public function exportControlCountPerAgent(AgentControlCountExporter $exporter): Response { /** @var User $user */ $user = $this->getUser(); $agency = $user->getAgency(); if (null === $agency) { throw new \RuntimeException('Agency not found'); } $fileName = ($exporter)([$agency]); return $this->file($fileName, 'export-controles-agents.xls', ResponseHeaderBag::DISPOSITION_INLINE); } }
Save File
Cancel