src/Controller/Admin/AdminDashbordController.php line 265

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Admin;
  3. use App\Entity\BlackList;
  4. use App\Entity\ControllerUser;
  5. use App\Entity\DictionaryImport;
  6. use App\Entity\Eg\Admin\User;
  7. use App\Entity\Eg\Admin\UserGroup;
  8. use App\Entity\Eg\Osm\City;
  9. use App\Entity\Eg\Osm\Device;
  10. use App\Entity\Eg\Osm\Organization;
  11. use App\Entity\Eg\Osm\ParkingType;
  12. use App\Entity\Eg\Osm\Zone;
  13. use App\Entity\EgFineExport;
  14. use App\Entity\ElectricList;
  15. use App\Entity\Fine;
  16. use App\Entity\LapPair;
  17. use App\Entity\RequestLog;
  18. use App\Entity\Route as RouteEntity;
  19. use App\Entity\RouteLap;
  20. use App\Entity\VerificationStatus;
  21. use Doctrine\ORM\EntityManagerInterface;
  22. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  23. use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
  24. use EasyCorp\Bundle\EasyAdminBundle\Config\Assets;
  25. use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
  26. use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
  27. use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;
  28. use EasyCorp\Bundle\EasyAdminBundle\Config\UserMenu;
  29. use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;
  30. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  31. use Symfony\Component\HttpFoundation\Request;
  32. use Symfony\Component\HttpFoundation\RequestStack;
  33. use Symfony\Component\HttpFoundation\Response;
  34. use Symfony\Component\Routing\Annotation\Route;
  35. use Symfony\Component\Security\Core\Security;
  36. use Symfony\Component\Security\Core\User\UserInterface;
  37. class AdminDashbordController extends AbstractDashboardController
  38. {
  39.     /** @var Security */
  40.     protected $security;
  41.     /** @var ?Request */
  42.     protected $request;
  43.     /** @var EntityManagerInterface */
  44.     protected $manager;
  45.     public function __construct(Security $security, RequestStack $requestStack, EntityManagerInterface $entityManager)
  46.     {
  47.         $this->security = $security;
  48.         $this->request = $requestStack->getCurrentRequest();
  49.         $this->manager = $entityManager;
  50.     }
  51.     public function configureAssets(): Assets
  52.     {
  53.         return Assets::new()
  54.             ->addWebpackEncoreEntry('app');
  55.     }
  56.     public function configureActions(): Actions
  57.     {
  58.         return Actions::new()
  59.             ->add(Crud::PAGE_INDEX, Action::EDIT)
  60.             ->add(Crud::PAGE_INDEX, Action::DETAIL)
  61.             ->add(Crud::PAGE_DETAIL, Action::INDEX)
  62.             ->add(Crud::PAGE_EDIT, Action::INDEX)
  63.             ->add(Crud::PAGE_NEW, Action::INDEX)
  64.             ->update(Crud::PAGE_INDEX, Action::DETAIL, fn (Action $action): Action => $action->setLabel('Pokaż')->setIcon('far fa-eye'))
  65.             ->update(Crud::PAGE_INDEX, Action::EDIT, fn (Action $action): Action => $action->setLabel('Edytuj')->setIcon('fas fa-pencil-alt'))
  66.             ->update(Crud::PAGE_DETAIL, Action::INDEX, fn (Action $action): Action => $action->setLabel('Wróć do listy')->setIcon('fas fa-list'))
  67.             ->update(Crud::PAGE_EDIT, Action::INDEX, fn (Action $action): Action => $action->setLabel('Wróć do listy')->setIcon('fas fa-list'))
  68.             ->update(Crud::PAGE_NEW, Action::INDEX, fn (Action $action): Action => $action->setLabel('Wróć do listy')->setIcon('fas fa-list'))
  69.             ->add(Crud::PAGE_EDIT, Action::SAVE_AND_CONTINUE);
  70.     }
  71.     public function configureCrud(): Crud
  72.     {
  73.         $crud = Crud::new()
  74.             ->setDefaultSort(['id' => 'DESC'])
  75.             ->setDateTimeFormat('y-MM-dd HH:mm')
  76.             ->overrideTemplate('crud/index', 'index.html.twig')
  77.             ->overrideTemplate('crud/detail', 'detail.html.twig')
  78.             ->overrideTemplate('crud/new', 'new.html.twig')
  79.             ->overrideTemplate('crud/edit', 'edit.html.twig')
  80.             ->overrideTemplate('crud/field/association', 'fields/association_edit.html.twig')
  81.             ->overrideTemplate('layout', 'layout.html.twig')
  82.             ->setPageTitle('detail', '%entity_label_singular% #%entity_id%')
  83.             ->setFormThemes(['form.html.twig', '@EasyAdmin/crud/form_theme.html.twig'])
  84.             ->setSearchFields(null)
  85.             ->showEntityActionsInlined();
  86.         if ($this->request->query->has('indexPageTitle')) {
  87.             $crud->setPageTitle(Crud::PAGE_INDEX, $this->request->query->get('indexPageTitle'));
  88.         }
  89.         return $crud;
  90.     }
  91.     /**
  92.      * Funkcja odpowiadająca za elementy znajdujące się w wyświetlanym menu
  93.      */
  94.     public function configureMenuItems(): iterable
  95.     {
  96.         $user = $this->security->getUser();
  97.         $menuItems = [MenuItem::linkToDashboard('Pulpit', 'fa fa-home')];
  98.         if ($this->isGranted('ROLE_LOGS')) {
  99.             $menuItems[] = MenuItem::section('Logi');
  100.             $requestLogLinks = [];
  101.             if ($user->isGranted('ROLE_REQUEST_LOGS_ALL')) {
  102.                 $requestLogLinks[] = MenuItem::linkToCrud('Wszystkie', null, RequestLog::class);
  103.             }
  104.             if ($user->isGranted('ROLE_REQUEST_LOGS_UNVERIFIED')) {
  105.                 $requestLogLinks[] = MenuItem::linkToCrud('Niezweryfikowane', null, RequestLog::class)
  106.                     ->setQueryParameter('isVerified', false)
  107.                     ->setQueryParameter('indexPageTitle', RequestLogCrudController::INDEX_PAGE_TITLES['unverified']);
  108.             }
  109.             if ($user->isGranted('ROLE_REQUEST_LOGS_VERIFIED')) {
  110.                 $requestLogLinks[] = MenuItem::linkToCrud('Zweryfikowane', null, RequestLog::class)
  111.                     ->setQueryParameter('isVerified', true)
  112.                     ->setQueryParameter('indexPageTitle', RequestLogCrudController::INDEX_PAGE_TITLES['verified']);
  113.             }
  114.             if (\count($requestLogLinks) > 0) {
  115.                 $menuItems[] = MenuItem::subMenu('Pojedyncze odczyty', 'fas fa-camera')->setSubItems($requestLogLinks);
  116.             }
  117.             $menuItems[] = MenuItem::linkToCrud('Przejazdy', 'fas fa-map-marker-alt', RouteLap::class);
  118.             $menuItems[] = MenuItem::linkToCrud('Pary przejazdów', 'fas fa-route', LapPair::class);
  119.             $fineLinks = [];
  120.             if ($user->isGranted('ROLE_SUPER_ADMIN')) {
  121.                 $fineLinks[] = MenuItem::linkToCrud('Wszystkie', null, Fine::class);
  122.             }
  123.             if ($user->isGranted('ROLE_EXTENDED_FINES')) {
  124.                 $fineLinks[] = MenuItem::linkToCrud('Wstępne', null, Fine::class)
  125.                     ->setQueryParameter('verificationStatus', VerificationStatus::PRELIMINARY)
  126.                     ->setQueryParameter('indexPageTitle', FineCrudController::INDEX_PAGE_TITLES[VerificationStatus::PRELIMINARY]);
  127.             }
  128.             $fineLinks[] = MenuItem::linkToCrud('Do weryfikacji', null, Fine::class)
  129.                 ->setQueryParameter('verificationStatus', VerificationStatus::TO_VERIFY)
  130.                 ->setQueryParameter('indexPageTitle', FineCrudController::INDEX_PAGE_TITLES[VerificationStatus::TO_VERIFY]);
  131.             $fineLinks[] = MenuItem::linkToCrud('Oczekujący na pozytywną weryfikację', null, Fine::class)
  132.                 ->setQueryParameter('verificationStatus', VerificationStatus::AWAITING_POSITIVE_VERIFICATION)
  133.                 ->setQueryParameter('indexPageTitle', FineCrudController::INDEX_PAGE_TITLES[VerificationStatus::AWAITING_POSITIVE_VERIFICATION]);
  134.             $fineLinks[] = MenuItem::linkToCrud('Oczekujący na negatywną weryfikację', null, Fine::class)
  135.                 ->setQueryParameter('verificationStatus', VerificationStatus::AWAITING_NEGATIVE_VERIFICATION)
  136.                 ->setQueryParameter('indexPageTitle', FineCrudController::INDEX_PAGE_TITLES[VerificationStatus::AWAITING_NEGATIVE_VERIFICATION]);
  137.             if ($user->isGranted('ROLE_EXTENDED_FINES')) {
  138.                 $fineLinks[] = MenuItem::linkToCrud('Zweryfikowany pozytywnie', null, Fine::class)
  139.                     ->setQueryParameter('verificationStatus', VerificationStatus::POSITIVELY_VERIFIED)
  140.                     ->setQueryParameter('indexPageTitle', FineCrudController::INDEX_PAGE_TITLES[VerificationStatus::POSITIVELY_VERIFIED]);
  141.                 $fineLinks[] = MenuItem::linkToCrud('Zweryfikowany negatywnie', null, Fine::class)
  142.                     ->setQueryParameter('verificationStatus', VerificationStatus::NEGATIVELY_VERIFIED)
  143.                     ->setQueryParameter('indexPageTitle', FineCrudController::INDEX_PAGE_TITLES[VerificationStatus::NEGATIVELY_VERIFIED]);
  144.                 $fineLinks[] = MenuItem::linkToCrud('Wyeksportowany', null, Fine::class)
  145.                     ->setQueryParameter('verificationStatus', VerificationStatus::EXPORTED)
  146.                     ->setQueryParameter('indexPageTitle', FineCrudController::INDEX_PAGE_TITLES[VerificationStatus::EXPORTED]);
  147.                 $fineLinks[] = MenuItem::linkToCrud('Automatycznie usunięte', null, Fine::class)
  148.                     ->setQueryParameter('verificationStatus', VerificationStatus::AUTOMATICALLY_DELETED)
  149.                     ->setQueryParameter('indexPageTitle', FineCrudController::INDEX_PAGE_TITLES[VerificationStatus::AUTOMATICALLY_DELETED]);
  150.                 $fineLinks[] = MenuItem::linkToCrud('Ręcznie zanonimizowane', null, Fine::class)
  151.                     ->setQueryParameter('verificationStatus', VerificationStatus::MANUALLY_ANONYMIZED)
  152.                     ->setQueryParameter('indexPageTitle', FineCrudController::INDEX_PAGE_TITLES[VerificationStatus::MANUALLY_ANONYMIZED]);
  153.                 $fineLinks[] = MenuItem::linkToCrud('Automatycznie zanonimizowane', null, Fine::class)
  154.                     ->setQueryParameter('verificationStatus', VerificationStatus::AUTOMATICALLY_ANONYMIZED)
  155.                     ->setQueryParameter('indexPageTitle', FineCrudController::INDEX_PAGE_TITLES[VerificationStatus::AUTOMATICALLY_ANONYMIZED]);
  156.                 if ($user->isGranted('ROLE_SUPER_ADMIN')) {
  157.                     $fineLinks[] = MenuItem::linkToCrud('Automatycznie zanonimizowane duplikaty (admin)', null, Fine::class)
  158.                         ->setQueryParameter('verificationStatus', VerificationStatus::AUTOMATICALLY_ANONYMIZED_DUPLICATE)
  159.                         ->setQueryParameter('indexPageTitle', FineCrudController::INDEX_PAGE_TITLES[VerificationStatus::AUTOMATICALLY_ANONYMIZED_DUPLICATE]);
  160.                 }
  161.             }
  162.             $menuItems[] = MenuItem::subMenu('Zawiadomienia', 'fas fa-comment-dollar')->setSubItems($fineLinks);
  163.             // TODO: #28388 tymczasowe rozwiazanie az do ogarniecia tego widoku po stronie admina oraz WSow jak bedzie wiecej czasu
  164.             if ($_ENV['APP_ENV'] === 'dev' && $user->isGranted('ROLE_EG_EXPORTS')) {
  165.                 $menuItems[] = MenuItem::linkToCrud('Grupowe eksporty', 'fas fa-file-export', EgFineExport::class);
  166.             }
  167.         }
  168.         // TODO: jeszcze pomyslec nad tą rolą, czy nie lepiej dać innej
  169.         if ($this->isGranted('ROLE_PARKING_LIST')) {
  170.             $menuItems[] = MenuItem::section('Strefy i Parkingi');
  171.             $menuItems[] = MenuItem::linkToCrud('Organizacje', 'fa fa-building', Organization::class);
  172.             $menuItems[] = MenuItem::linkToCrud('Miasta', 'fa fa-city', City::class);
  173.             $menuItems[] = MenuItem::linkToCrud('Strefy', 'fa fa-draw-polygon', Zone::class);
  174.             $menuItems[] = MenuItem::linkToCrud('Typy parkingów', 'fa fa-wheelchair', ParkingType::class);
  175.         }
  176.         if ($this->isGranted('ROLE_ROUTE_EDITOR')) {
  177.             $menuItems[] = MenuItem::section('Trasy');
  178.             $menuItems[] = MenuItem::linkToCrud('Zarządzanie trasami', 'fas fa-road', RouteEntity::class);
  179.         }
  180.         $menuItems[] = MenuItem::section('');
  181.         $menuItems[] = MenuItem::linkToRoute('Mapa', 'fa fa-map', 'map');
  182.         if ($this->isGranted('ROLE_STATISTICS')) {
  183.             $menuItems[] = MenuItem::section('Statystyki i zestawienia');
  184.             $menuItems[] = MenuItem::linktoRoute('Statystyki', 'fa fa-chart-bar', 'statistics');
  185.             $menuItems[] = MenuItem::linktoRoute('Zestawienia zawiadomień', 'fa fa-chart-bar', 'fine_statements');
  186.             $menuItems[] = MenuItem::linktoRoute('Zestawienia odczytów', 'fa fa-chart-bar', 'request_log_statements');
  187.             $menuItems[] = MenuItem::linktoRoute('Zestawienia eksportów', 'fa fa-chart-bar', 'log_exports_statements');
  188.         }
  189.         if ($this->isGranted('ROLE_USER_DISPLAY')) {
  190.             $menuItems[] = MenuItem::section('Administracja');
  191.             $menuItems[] = MenuItem::linkToCrud('Użytkownicy', 'fas fa-user', User::class);
  192.         }
  193.         if ($this->isGranted('ROLE_SUPER_ADMIN')) {
  194.             $menuItems[] = MenuItem::linkToCrud('Kontrolerzy', 'fas fa-mobile-alt', ControllerUser::class);
  195.             $menuItems[] = MenuItem::linkToCrud('Grupy Uprawnień', 'fas fa-users-cog', UserGroup::class);
  196.             $menuItems[] = MenuItem::linkToCrud('Import danych', 'fas fa-file-import', DictionaryImport::class)
  197.                 ->setPermission('ROLE_DATA_IMPORT');
  198.             $menuItems[] = MenuItem::linkToCrud('Czarna lista rejestracji', 'fas fa-ban', BlackList::class);
  199.             $menuItems[] = MenuItem::linkToCrud('Zestawy kontrolerskie', 'fa fa-video-camera', Device::class);
  200.         }
  201.         if ($this->isGranted('ROLE_ELECTRIC_LIST')) {
  202.             $menuItems[] = MenuItem::linkToCrud('Lista samochodów elektrycznych', 'fas fa-charging-station', ElectricList::class);
  203.         }
  204.         return $menuItems;
  205.     }
  206.     public function configureUserMenu(UserInterface $user): UserMenu
  207.     {
  208.         $url = $this->container->get(AdminUrlGenerator::class)
  209.             ->setAction('changePassword')
  210.             ->setController(UserCrudController::class)
  211.             ->setEntityId($user->getId())
  212.             ->set('referrer', urlencode($this->request->getRequestUri()))
  213.             ->generateUrl();
  214.         return parent::configureUserMenu($user)
  215.             ->addMenuItems([
  216.                 MenuItem::linkToUrl('Zmień hasło', null, $url)
  217.             ]);
  218.     }
  219.     /**
  220.      * Metoda do konfiguracji widoku pulpitu
  221.      */
  222.     public function configureDashboard(): Dashboard
  223.     {
  224.         return Dashboard::new()
  225.             ->disableUrlSignatures()
  226.             ->setTitle('Admin kamery');
  227.     }
  228.     #[Route(path: '/admin', name: 'admin')]
  229.     public function index(): Response
  230.     {
  231.         $requestLogIndexes = $this->determineMenuIndex('Pojedyncze odczyty');
  232.         $routeLapIndexes = $this->determineMenuIndex('Przejazdy');
  233.         $lapPairIndexes = $this->determineMenuIndex('Pary przejazdów');
  234.         $fineIndexes = $this->determineMenuIndex('Zawiadomienia', 'Do weryfikacji');
  235.         $requestLogUrl = $this->container->get(AdminUrlGenerator::class)
  236.             ->setAction('index')
  237.             ->setController(RequestLogCrudController::class)
  238.             ->set('menuIndex', $requestLogIndexes['menu'])
  239.             ->set('submenuIndex', $requestLogIndexes['submenu'])
  240.             ->generateUrl();
  241.         $routeLapUrl = $this->container->get(AdminUrlGenerator::class)
  242.             ->setAction('index')
  243.             ->setController(RouteLapCrudController::class)
  244.             ->set('menuIndex', $routeLapIndexes['menu'])
  245.             ->set('submenuIndex', $routeLapIndexes['submenu'])
  246.             ->generateUrl();
  247.         $lapPairUrl = $this->container->get(AdminUrlGenerator::class)
  248.             ->setAction('index')
  249.             ->setController(LapPairCrudController::class)
  250.             ->set('menuIndex', $lapPairIndexes['menu'])
  251.             ->set('submenuIndex', $lapPairIndexes['submenu'])
  252.             ->generateUrl();
  253.         $fineUrl = $this->container->get(AdminUrlGenerator::class)
  254.             ->setAction('index')
  255.             ->setController(FineCrudController::class)
  256.             ->set('menuIndex', $fineIndexes['menu'])
  257.             ->set('submenuIndex', $fineIndexes['submenu'])
  258.             ->set('verificationStatus', VerificationStatus::TO_VERIFY)
  259.             ->set('indexPageTitle', 'Zawiadomienia do weryfikacji')
  260.             ->generateUrl();
  261.         $mapUrl = $this->redirectToRoute('map')->getTargetUrl();
  262.         return $this->render('start.html.twig', [
  263.             'requestLogUrl' => $requestLogUrl,
  264.             'routeLapUrl' => $routeLapUrl,
  265.             'lapPairUrl' => $lapPairUrl,
  266.             'fineUrl' => $fineUrl,
  267.             'mapUrl' => $mapUrl,
  268.             'serverData' => json_encode($_SERVER)
  269.         ]);
  270.     }
  271.     #[Route(path: '/', name: 'blank')]
  272.     public function blank(): Response
  273.     {
  274.         return $this->redirectToRoute('admin');
  275.     }
  276.     #[Route(path: '/admin/map', name: 'map')]
  277.     public function showMap(): Response
  278.     {
  279.         // URL do edycji pojedynczych odczytów
  280.         // Aby podmienić wystarczy złapać parametr 'entityId=0' i podmienić go na odpowiednią wartość
  281.         $url = $this->container->get(AdminUrlGenerator::class)
  282.             ->setAction(Crud::PAGE_EDIT)
  283.             ->setController(RequestLogCrudController::class)
  284.             ->setEntityId(0)
  285.             ->set('referrer', '/admin/map')
  286.             ->generateUrl();
  287.         return $this->render('map.html.twig', [
  288.             'requestLogURL' => $url
  289.         ]);
  290.     }
  291.     #[Route(path: '/admin/statistics', name: 'statistics')]
  292.     public function renderStatistics(): Response
  293.     {
  294.         $this->denyAccessUnlessGranted('ROLE_STATISTICS');
  295.         return $this->render('stats/statistics.html.twig');
  296.     }
  297.     #[Route(path: '/admin/fine-statements', name: 'fine_statements')]
  298.     public function renderFineStatements(): Response
  299.     {
  300.         $this->denyAccessUnlessGranted('ROLE_STATISTICS');
  301.         return $this->render('stats/fine_statements.html.twig', [
  302.             'selectableUsers' => $this->manager->getRepository(User::class)->getAllUsernames(UserGroup::WORKERS_GROUP_NAMES)
  303.         ]);
  304.     }
  305.     #[Route(path: '/admin/request-log-statements', name: 'request_log_statements')]
  306.     public function renderRequestLogStatements(): Response
  307.     {
  308.         $this->denyAccessUnlessGranted('ROLE_STATISTICS');
  309.         return $this->render('stats/request_log_statements.html.twig', [
  310.             'selectableUsers' => $this->manager->getRepository(User::class)->getAllUsernames(UserGroup::WORKERS_GROUP_NAMES)
  311.         ]);
  312.     }
  313.     #[Route(path: '/admin/log-exports-statements', name: 'log_exports_statements')]
  314.     public function renderLogExportsStatements(): Response
  315.     {
  316.         $this->denyAccessUnlessGranted('ROLE_STATISTICS');
  317.         return $this->render('stats/log_exports_statements.html.twig');
  318.     }
  319.     /**
  320.      * Metoda służąca do obliczania indexu danej encji w menu
  321.      */
  322.     private function determineMenuIndex(string $entityLabel, ?string $subEntityLabel = null)
  323.     {
  324.         $indexes = [
  325.             'menu' => -1,
  326.             'submenu' => -1
  327.         ];
  328.         foreach ($this->configureMenuItems() as $index => $item) {
  329.             if ($item->getAsDto()->getLabel() == $entityLabel) {
  330.                 $indexes['menu'] = $index;
  331.                 if ($subEntityLabel) {
  332.                     foreach ($item->getAsDto()->getSubItems() as $subIndex => $subItem) {
  333.                         if ($subItem->getLabel() == $subEntityLabel) {
  334.                             $indexes['submenu'] = $subIndex;
  335.                         }
  336.                     }
  337.                 }
  338.             }
  339.         }
  340.         return $indexes;
  341.     }
  342. }