← Back
Editing: DefaultController.php
<?php namespace App\Controller\Organization; use App\Breadcrumb\BreadcrumbInterface; use App\Breadcrumb\BreadcrumbItem; use App\Entity\HistoriqueAlerte; use App\Organization\Form\SessionFilterType; use App\Repository\AdresseRepository; use App\Repository\ControleRepository; use App\Repository\HistoriqueAlerteRepository; use App\Repository\UserRepository; use App\Service\OrganizationService; use App\Service\Utils; use App\Session\Filter\SessionFiltersContainer; use App\Session\Filter\SessionFiltersPersister; use App\Session\Filter\ValueObject\DateRange; use Doctrine\ORM\NonUniqueResultException; use Doctrine\ORM\NoResultException; use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Spreadsheet; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\Routing\Annotation\Route; #[Route(path: '/organization', name: 'organization_')] class DefaultController extends AbstractController { #[Route(path: '/', name: 'index')] public function index(BreadcrumbInterface $breadcrumb): Response { $breadcrumb->addItem(BreadcrumbItem::set('Tableau de bord', 'organization_index')); return $this->render('organization/index.html.twig'); } public function header( SessionFiltersContainer $sessionFiltersContainer, RequestStack $requestStack ): Response { $filterForm = $this->createForm(SessionFilterType::class, $sessionFiltersContainer->getCurrent()); $filterForm->get('targetUrl')->setData($requestStack->getMainRequest()->getUri()); return $this->render( 'organization/_header.html.twig', [ 'filterForm' => $filterForm->createView(), 'solutions' => $this->getUser()->getOrganization()->getSolutions(), ] ); } #[Route(path: '/empty', name: 'empty')] public function empty(): Response { return new Response(''); } public function switchUser(UserRepository $userRepository): Response { $managerList = $userRepository->findManagersByOrganization($this->getUser()->getOrganization()); return $this->render('organization/common/_switch_user_modal.html.twig', ['managerList' => $managerList]); } /** * @throws \Exception */ #[Route(path: '/filter', name: 'filter', methods: ['post'])] public function filter( Request $request, SessionFiltersContainer $sessionFiltersContainer, SessionFiltersPersister $persister ): RedirectResponse { $filterForm = $this->createForm(SessionFilterType::class, $sessionFiltersContainer->getCurrent()); $filterForm->handleRequest($request); if ($filterForm->isValid()) { ($persister)($filterForm->getData()); $targetUrl = $filterForm->get('targetUrl')->getData(); return $this->redirect($targetUrl); } throw new \Exception('Wrong data'); } /** * @throws \Exception */ #[Route(path: '/date', name: 'date', methods: ['post'])] public function date( Request $request, SessionFiltersContainer $sessionFiltersContainer, SessionFiltersPersister $persister ): JsonResponse { $sessionFilters = $sessionFiltersContainer->getCurrent(); $endDate = new \DateTime($request->request->get('endDate')); $endDate->add(new \DateInterval('P1D'))->sub(new \DateInterval('PT1S')); $sessionFilters->setDateRange( new DateRange( new \DateTime($request->request->get('startDate')), $endDate ) ); ($persister)($sessionFilters); return new JsonResponse(['status' => 'ok']); } #[Route(path: '/chart1.json', name: 'control_chart')] public function controlChart( Utils $utils, SessionFiltersContainer $sessionFiltersContainer, ControleRepository $controleRepository, OrganizationService $organizationService ): JsonResponse { $agenciesId = $organizationService->getAgenciesId(); $filters = $sessionFiltersContainer->getCurrent(); $startDate = $filters->getDateRange()->getDateStart(); $endDate = $filters->getDateRange()->getDateEnd(); $labels = $utils->getMonthsTimeline($startDate, $endDate); $controls = $controleRepository->countControlesByAgenciesByMonth( $agenciesId, false ); $total = array_reduce($controls, function ($carry, $item) { $carry += $item['nbControls']; return $carry; }, 0); $prevControls = $controleRepository->countControlesByAgenciesByMonth( agenciesId: $agenciesId, groupProvider: false, previous: true ); $prevTotal = array_reduce($prevControls, function ($carry, $item) { return $carry + $item['nbControls']; }, 0); $evolution = 0; if ($prevTotal > 0) { $evolution = (($total - $prevTotal) / $prevTotal) * 100; } return new JsonResponse([ 'labels' => $labels, 'controls' => $controls, 'total' => $total, 'prevTotal' => $prevTotal, 'evolution' => number_format($evolution, 2), ]); } /** * @throws \Exception */ #[Route(path: '/chart2.json', name: 'note_chart')] public function noteChart( Utils $utils, SessionFiltersContainer $sessionFiltersContainer, ControleRepository $controleRepository, OrganizationService $organizationService ): JsonResponse { $agenciesId = $organizationService->getAgenciesId(); $filters = $sessionFiltersContainer->getCurrent(); $startDate = $filters->getDateRange()->getDateStart(); $endDate = $filters->getDateRange()->getDateEnd(); $total = 0; $notes = $controleRepository->averageNoteByAgenciesByMonth($agenciesId); if (count($notes) > 0) { $total = array_reduce($notes, function ($carry, $item) { return $carry + $item['note']; }, 0) / count($notes); } $labels = $utils->getMonthsTimeline($startDate, $endDate); $prevNotes = $controleRepository->averageNoteByAgenciesByMonth( agenciesId: $agenciesId, previous: true ); if (count($prevNotes) > 0) { $prevTotal = array_reduce($prevNotes, function ($carry, $item) { return $carry + $item['note']; }, 0) / count($prevNotes); } else { $prevTotal = 0; } if ($prevTotal > 0) { $evolution = (($total - $prevTotal) / $prevTotal) * 100; } else { $evolution = 0; } return new JsonResponse([ 'labels' => $labels, 'notes' => $notes, 'total' => number_format($total, 1), 'prevTotal' => $prevTotal, 'evolution' => number_format($evolution, 2), ]); } #[Route(path: '/chart3.json', name: 'incidence_chart')] public function incidenceChart( Utils $utils, SessionFiltersContainer $sessionFiltersContainer, ControleRepository $controleRepository, OrganizationService $organizationService ): JsonResponse { $agenciesId = $organizationService->getAgenciesId(); $filters = $sessionFiltersContainer->getCurrent(); $startDate = $filters->getDateRange()->getDateStart(); $endDate = $filters->getDateRange()->getDateEnd(); $total = 0; $notes = $controleRepository->incidenceByAgenciesByMonth($agenciesId); if (count($notes) > 0) { $total = array_reduce($notes, function ($carry, $item) { return $carry + $item['incidence']; }, 0) / count($notes); } $total *= 100; $labels = $utils->getMonthsTimeline($startDate, $endDate); $prevNotes = $controleRepository->incidenceByAgenciesByMonth( agencies: $agenciesId, previous: true ); if (count($prevNotes) > 0) { $prevTotal = array_reduce($prevNotes, function ($carry, $item) { return $carry + $item['incidence']; }, 0) / count($prevNotes); $prevTotal *= 100; if ($prevTotal > 0) { $evolution = (($total - $prevTotal) / $prevTotal) * 100; } else { $evolution = 101; } } else { $prevTotal = 0; $evolution = 0; } return new JsonResponse([ 'labels' => $labels, 'notes' => $notes, 'total' => number_format($total, 1), 'prevTotal' => $prevTotal, 'evolution' => number_format($evolution, 2), ]); } /** * @throws NonUniqueResultException * @throws NoResultException */ #[Route(path: '/chart4.json', name: 'done_chart')] public function doneChart( Utils $utils, SessionFiltersContainer $sessionFiltersContainer, AdresseRepository $adresseRepository, OrganizationService $organizationService ): JsonResponse { $agenciesId = $organizationService->getAgenciesId(); $filters = $sessionFiltersContainer->getCurrent(); $startDate = $filters->getDateRange()->getDateStart(); $endDate = $filters->getDateRange()->getDateEnd(); $done = $adresseRepository->addressDoneByAgencies($agenciesId); $total = array_reduce($done, function ($carry, $item) { return $carry + $item['percent']; }, 0) / count($done); $labels = $utils->getMonthsTimeline($startDate, $endDate); $prevDone = $adresseRepository->addressDoneByAgencies( agenciesId: $agenciesId, previous: true ); if (count($prevDone) > 0) { $prevTotal = array_reduce($prevDone, function ($carry, $item) { return $carry + $item['percent']; }, 0) / count($prevDone); $evolution = (($total - $prevTotal) / $prevTotal) * 100; } else { $prevTotal = 0; $evolution = 0; } return new JsonResponse([ 'labels' => $labels, 'done' => $done, 'total' => number_format($total, 1), 'prevTotal' => $prevTotal, 'evolution' => number_format($evolution, 2), ]); } public function synthesis(): Response { return $this->render('organization/dashboard/_graph.html.twig'); } #[Route(path: '/chart-synthesis.json', name: 'synthesis_chart')] public function synthesisChart( OrganizationService $organizationService, ControleRepository $controleRepository, SessionFiltersContainer $sessionFiltersContainer, Utils $utils ): JsonResponse { $agenciesId = $organizationService->getAgenciesId(); $filters = $sessionFiltersContainer->getCurrent(); $startDate = $filters->getDateRange()->getDateStart(); $endDate = $filters->getDateRange()->getDateEnd(); $data = $controleRepository->fetchOrganizationDataByAgencyByMonth($agenciesId); $labels = $utils->getMonthsTimeline($startDate, $endDate); return new JsonResponse([ 'labels' => $labels, 'data' => $data, ]); } public function days( OrganizationService $organizationService, ControleRepository $controleRepository ): Response { $agenciesId = $organizationService->getAgenciesId(); $days = $controleRepository->getControlsByAgenciesByDay($agenciesId); $max = array_reduce($days, function ($carry, $item) { return $item['cnt'] > $carry ? $item['cnt'] : $carry; }, 0); return $this->render('organization/dashboard/_days.html.twig', ['days' => $days, 'max' => $max]); } public function lastAlerts( OrganizationService $organizationService, HistoriqueAlerteRepository $alerteRepository, ): Response { $agenciesId = $organizationService->getAgenciesId(); /** @var HistoriqueAlerte[] $alerts */ $alerts = $alerteRepository ->getQueryByAgencies($agenciesId) ->setMaxResults(4) ->orderBy('ha.date', 'desc') ->getQuery() ->getResult(); return $this->render('organization/dashboard/_last_alerts.html.twig', ['alerts' => $alerts]); } #[Route(path: '/chart-doughnut.json', name: 'doughnut_chart')] public function doughnutChart( Request $request, UserRepository $userRepository, OrganizationService $organizationService ): JsonResponse { $agenciesId = $organizationService->getAgenciesId(); $limit = $request->query->get('limit', 5); $sort = ['COUNT(c.id)', 'desc']; $role = 'ROLE_MANAGER'; if ($request->query->has('sort')) { if ('lessActive' === $request->query->get('sort')) { $sort[1] = 'asc'; } } if ($request->query->has('role')) { $role = $request->query->get('role'); } $data = $userRepository->getByAgenciesByControl( agenciesId: $agenciesId, role: $role, sort: $sort, limit: $limit ); return new JsonResponse([ 'data' => $data, ]); } /** * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception */ #[Route(path: '/export/xls', name: 'export_xls')] public function exportXlsFromChart(Request $request, KernelInterface $kernel): Response { $content = $request->getContent(); $jsonData = json_decode($content); $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setTitle('Export'); $alpha = 'B'; $line = 1; $sheet->setCellValue('A1', 'Date'); foreach ($jsonData->labels as $label) { $sheet->setCellValue("{$alpha}1", $label); ++$alpha; } ++$line; foreach ($jsonData->datasets as $dataset) { $sheet->setCellValue("A$line", $dataset->label); $data = $dataset->data; $alpha = 'B'; foreach ($data as $item) { $sheet->setCellValue("$alpha$line", $item); ++$alpha; } ++$line; } $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); $tmpName = uniqid().'.xlsx'; $fullPath = $kernel->getCacheDir().$tmpName; $writer->save($fullPath); return $this->file($fullPath); } #[Route(path: '/switch', name: 'switch')] public function switch(Request $request, UserRepository $userRepository): RedirectResponse { $managerId = $request->request->get('manager_switch'); $manager = $userRepository->find($managerId); return $this->redirectToRoute('homepage', ['_switch_user' => $manager->getUsername()]); } }
Save File
Cancel