src/Controller/Admin/DashboardController.php line 328

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Admin;
  3. use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
  4. use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;
  5. use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
  9. use App\Entity\Projects;
  10. use App\Entity\ProjectProducts;
  11. use App\Entity\Customers;
  12. use App\Entity\WorkHours;
  13. use App\Entity\Workers;
  14. use App\Entity\Quotes;
  15. use App\Entity\QuoteLines;
  16. use App\Entity\Settings;
  17. use App\Entity\User;
  18. use App\Entity\Events;
  19. use App\Entity\Contracts;
  20. use App\Entity\ContractTemplates;
  21. use App\Entity\Photo;
  22. use App\Entity\ProductWarranty;
  23. use EasyCorp\Bundle\EasyAdminBundle\Router\CrudUrlGenerator;
  24. use EasyCorp\Bundle\EasyAdminBundle\Config\UserMenu;
  25. use Symfony\Component\Security\Core\User\UserInterface;
  26. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  27. use App\Controller\Admin\UserCrudController;
  28. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  29. use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
  30. use App\Controller\Admin\ProjectsCrudController;
  31. use App\Controller\Admin\SettinsCrudController;
  32. use App\Controller\Admin\EventsCrudController;
  33. use App\Controller\Admin\WorkHoursCrudController;
  34. use App\Form\Type\WorkhourType;
  35. use App\Service\Settings as SettingsService;
  36. use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
  37. use EasyCorp\Bundle\EasyAdminBundle\Config\Assets;
  38. class DashboardController extends AbstractDashboardController
  39. {
  40. private $settings;
  41. private $params;
  42. public function __construct(ContainerBagInterface $params, SettingsService $settings)
  43. {
  44. $this->settings = $settings;
  45. $this->params = $params;
  46. }
  47. /**
  48. * @Route("/admin", name="admin")
  49. */
  50. public function index(): Response
  51. {
  52. if ($this->getUser() == null) {
  53. return $this->redirect('login');
  54. }
  55. $em = $this->getDoctrine()->getManager();
  56. if ($this->getUser()->hasRoles('ROLE_ADMIN')) {
  57. $quotesNew = $em->getRepository(Quotes::class)->findBy(['status' => '0']);
  58. $quoteCallRequired = $em->getRepository(Quotes::class)->findBy(['status' => '4']);
  59. $projectsRunning = $em->getRepository(Projects::class)->findBy(['isClosed' => false],['deadline' => 'DESC']);
  60. $workers = $this->getDoctrine()->getRepository(Workers::class)->findBy(['active' => true],['active' => 'DESC']);
  61. $workerHours = [];
  62. $projectHours = [];
  63. $qb = $em->createQueryBuilder();
  64. foreach ($workers as $worker) {
  65. $workHours = $this->getDoctrine()->getRepository(WorkHours::class)->findBy(['worker' => $worker->getId(), 'payed' => null]);
  66. $hours = 0;
  67. foreach ($workHours as $hour) {
  68. $hours += $hour->getHours();
  69. }
  70. $workerHours[$worker->getFullName()] = $hours;
  71. }
  72. foreach ($projectsRunning as $project) {
  73. $workHours = $this->getDoctrine()->getRepository(WorkHours::class)->findBy(['project' => $project->getId()]);
  74. $hours = 0;
  75. $price = 0;
  76. foreach ($workHours as $hour) {
  77. $hours += $hour->getHours();
  78. $price += $hour->getHours() * $hour->getWorker()->getPriceHour();
  79. }
  80. $projectHours[$project->getName()] = ['hours' => $hours, 'price' => $price, 'projectPrice' => intval($project->getPriceNetto())];
  81. }
  82. arsort($workerHours);
  83. arsort($projectHours);
  84. return $this->render('page/dashboard_admin.html.twig', [
  85. 'quotesNew' => $quotesNew,
  86. 'quoteCallRequired' => $quoteCallRequired,
  87. 'projectsRunning' => $projectsRunning,
  88. 'today' => new \DateTime(),
  89. 'workers' => $workers,
  90. 'workerHours' => $workerHours,
  91. 'projectHours' => $projectHours,
  92. ]);
  93. } else {
  94. $projectsRunning = $em->getRepository(Projects::class)->findBy(['isClosed' => false]);
  95. return $this->render('page/dashboard.html.twig', [
  96. 'myProjectsRunning' => $projectsRunning,
  97. ]);
  98. }
  99. }
  100. /**
  101. * @Route("/show-event/{entity}/{id}", name="show-event")
  102. */
  103. public function showEvent($entity, $id): Response
  104. {
  105. $adminUrlGenerator = $this->get(AdminUrlGenerator::class);
  106. if ($entity == 'project') {
  107. $url = $adminUrlGenerator
  108. ->setController(ProjectsCrudController::class)
  109. ->setAction(Action::DETAIL)
  110. ->set('entityId', $id)
  111. ->generateUrl();
  112. } else
  113. if ($entity == 'workhours') {
  114. $url = $adminUrlGenerator
  115. ->setController(WorkHoursCrudController::class)
  116. ->setAction(Action::DETAIL)
  117. ->set('entityId', $id)
  118. ->generateUrl();
  119. } else {
  120. $url = $adminUrlGenerator
  121. ->setController(EventsCrudController::class)
  122. ->setAction(Action::DETAIL)
  123. ->set('entityId', $id)
  124. ->generateUrl();
  125. }
  126. return $this->redirect($url);
  127. }
  128. /**
  129. * @Route("/show-projects/due", name="show-projects")
  130. */
  131. public function showProjects(): Response
  132. {
  133. $em = $this->getDoctrine()->getManager();
  134. $qb = $em->createQueryBuilder();
  135. if (!$this->getUser()->hasRoles(User::ROLE_ADMIN)) {
  136. $qb->andWhere('e.worker = (:worker)');
  137. $qb->setParameter('worker', $this->getUser()->getWorker());
  138. }
  139. //$events = $qb->select("DATE_FORMAT(e.due, '%Y-%m-%dT%H:%i:%s') as start, CONCAT_WS(' ',c.plateNumber,e.title) as title, e.id")
  140. // ->from('App:Events', 'e')
  141. //->leftJoin('App:Cu', 'c', 'WITH', 'c.id = e.car')
  142. // ->where('p.id= :id')
  143. // ->setParameter('id', 2)
  144. // ->getQuery()
  145. // ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
  146. $events = $qb->select("DATE_FORMAT(e.deadline, '%Y-%m-%dT%H:%i:%s') as start, CONCAT_WS('-',e.name,c.name) as title, e.id, 'project' as entity")
  147. ->from('App:Projects', 'e')
  148. ->leftJoin('App:Customers', 'c', 'WITH', 'c.id = e.customer')
  149. // ->where('p.id= :id')
  150. // ->setParameter('id', 2)
  151. ->getQuery()
  152. ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
  153. // dump($events);die;
  154. $content = json_encode($events);
  155. $response = new Response();
  156. $response->headers->set('Content-Type', 'application/json');
  157. $response->setContent($content);
  158. $response->setStatusCode(empty($content) ? Response::HTTP_NO_CONTENT : Response::HTTP_OK); //return parent::index();
  159. return $response;
  160. //$routeBuilder = $this->get(CrudUrlGenerator::class)->build();
  161. //set regulation to main page
  162. //return $this->redirect($routeBuilder->setController(CarsCrudController::class)->generateUrl());
  163. // return $this->render('page/dashboard.html.twig');
  164. }
  165. /**
  166. * @Route("/show-events/due", name="show-events")
  167. */
  168. public function showEvents(): Response
  169. {
  170. $em = $this->getDoctrine()->getManager();
  171. $qb = $em->createQueryBuilder();
  172. if (!$this->getUser()->hasRoles(User::ROLE_ADMIN)) {
  173. //$qb->andWhere('e.worker = (:worker)');
  174. //$qb->setParameter('worker', $this->getUser()->getWorker());
  175. $qb->orWhere('e.isPublic = true');
  176. }
  177. //$events = $qb->select("DATE_FORMAT(e.due, '%Y-%m-%dT%H:%i:%s') as start, CONCAT_WS(' ',c.plateNumber,e.title) as title, e.id")
  178. // ->from('App:Events', 'e')
  179. //->leftJoin('App:Cu', 'c', 'WITH', 'c.id = e.car')
  180. // ->where('p.id= :id')
  181. // ->setParameter('id', 2)
  182. // ->getQuery()
  183. // ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
  184. $events = $qb->select("DATE_FORMAT(e.due, '%Y-%m-%dT%H:%i:%s') as start, CONCAT_WS('-',e.title, pp.name, p.name, cu.name) as title, e.id, 'esemény' as entity, e.note as note, e.isPublic as isPublic")
  185. ->from('App:Events', 'e')
  186. ->leftJoin('App:ProjectProducts', 'pp', 'WITH', 'pp.id = e.product')
  187. ->leftJoin('App:Projects', 'p', 'WITH', 'p.id = pp.project')
  188. ->leftJoin('App:Customers', 'cu', 'WITH', 'cu.id = p.customer')
  189. // ->where('p.id= :id')
  190. // ->setParameter('id', 2)
  191. ->getQuery()
  192. ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
  193. // dump($events);die;
  194. $content = json_encode($events);
  195. $response = new Response();
  196. $response->headers->set('Content-Type', 'application/json');
  197. $response->setContent($content);
  198. $response->setStatusCode(empty($content) ? Response::HTTP_NO_CONTENT : Response::HTTP_OK); //return parent::index();
  199. return $response;
  200. //$routeBuilder = $this->get(CrudUrlGenerator::class)->build();
  201. //set regulation to main page
  202. //return $this->redirect($routeBuilder->setController(CarsCrudController::class)->generateUrl());
  203. // return $this->render('page/dashboard.html.twig');
  204. }
  205. /**
  206. * @Route("/show-events/work/{type}", name="show-events-work-paid")
  207. */
  208. public function showEventsWork($type): Response
  209. {
  210. $em = $this->getDoctrine()->getManager();
  211. $qb = $em->createQueryBuilder();
  212. $events = $qb->select("DATE_FORMAT(e.day, '%Y-%m-%dT%H:%i:%s') as start, CONCAT_WS('-',e.hours,c.full_name,p.name) as title, e.id, 'workhours' as entity, e.hours as hours, p.name as project_name, c.full_name as worker")
  213. ->from('App:WorkHours', 'e')
  214. ->leftJoin('App:Workers', 'c', 'WITH', 'c.id = e.worker')
  215. ->leftJoin('App:Projects', 'p', 'WITH', 'p.id = e.project');
  216. if (!$this->getUser()->hasRoles(User::ROLE_ADMIN)) {
  217. $events->where('c.id = :worker');
  218. $events->setParameter('worker', $this->getUser()->getWorker());
  219. }
  220. switch ($type) {
  221. case 'payed':
  222. $events->andwhere('e.payed is not null');
  223. break;
  224. case 'unpaid':
  225. $events->andwhere('e.payed is null');
  226. break;
  227. default:
  228. break;
  229. }
  230. //dump($events);die;
  231. $events = $events->getQuery()
  232. ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
  233. $content = json_encode($events);
  234. $response = new Response();
  235. $response->headers->set('Content-Type', 'application/json');
  236. $response->setContent($content);
  237. return $response;
  238. }
  239. public function configureDashboard(): Dashboard
  240. {
  241. return Dashboard::new()
  242. ->setTitle('Gortech')
  243. ->setFaviconPath('favicon.png')
  244. ->renderContentMaximized()
  245. //->renderSidebarMinimized()
  246. ;
  247. }
  248. public function configureMenuItems(): iterable
  249. {
  250. if ($this->getUser() == null) {
  251. return $this->redirect('login');
  252. }
  253. yield MenuItem::linkToDashboard('Főoldal', 'fas fa-home');
  254. yield MenuItem::section('Munkák');
  255. yield MenuItem::linkToCrud('Ügyfelek', 'fas fa-users', Customers::class)->setPermission('ROLE_ADMIN');
  256. yield MenuItem::linkToCrud('Projektek', 'fas fa-project-diagram', Projects::class)->setPermission('ROLE_ADMIN');
  257. yield MenuItem::linkToCrud('Projekteim', 'fas fa-warehouse', Projects::class)->setController(MyProjectsCrudController::class)->setPermission('ROLE_WORKER');
  258. yield MenuItem::linkToCrud('Gyártás/Termék', 'fas fa-industry', ProjectProducts::class)->setPermission('ROLE_ADMIN');
  259. yield MenuItem::linkToCrud('Szerződések', 'fas fa-file-contract', Contracts::class)->setPermission('ROLE_ADMIN');
  260. yield MenuItem::linkToCrud('Jótállások', 'fas fa-file-signature', ProductWarranty::class)->setPermission('ROLE_ADMIN');
  261. yield MenuItem::linkToCrud('Fotók', 'fas fa-image', Photo::class)->setPermission('ROLE_ADMIN');
  262. yield MenuItem::section('Munkavégzés');
  263. yield MenuItem::linkToCrud('Óra rögzítés', 'fa fa-clock', Workhours::class)->setController(WorkhoursCrudController::class)->setAction(Action::NEW);
  264. yield MenuItem::linkToCrud('Munkaórák', 'fas fa-user-clock', Workhours::class);
  265. yield MenuItem::linkToCrud('Dolgozók', 'fas fa-address-card', Workers::class)->setPermission('ROLE_ADMIN');
  266. if ($this->getUser()->getWorker()) {
  267. yield MenuItem::linkToCrud('Kifizetetlen órák', 'fas fa-cog', Workers::class)->setPermission("ROLE_WORKER")->setController(WorkersCrudController::class)->setAction("actionBatch")->setEntityId($this->getUser()->getWorker()->getId());
  268. }
  269. yield MenuItem::section('Események')->setPermission('ROLE_ADMIN');
  270. yield MenuItem::linkToCrud('Időpontok', 'fas fa-clock', Events::class)->setPermission('ROLE_ADMIN');
  271. yield MenuItem::section('Ajánlatok')->setPermission('ROLE_ADMIN');
  272. yield MenuItem::linkToCrud('Ajánlatok', 'fas fa-file-alt', Quotes::class)->setPermission('ROLE_ADMIN');
  273. yield MenuItem::linkToCrud('Ajánlat tételei', 'fas fa-list', QuoteLines::class)->setPermission('ROLE_ADMIN');
  274. yield MenuItem::section('Rendszer')->setPermission('ROLE_ADMIN')->setPermission('ROLE_ADMIN');
  275. yield MenuItem::linkToCrud('Profilom', 'fa fa-user', User::class)->setController(UserCrudController::class)->setAction(Action::EDIT)->setEntityId($this->getUser()->getId());
  276. if ($this->getUser()->hasRoles('ROLE_ADMIN')) {
  277. yield MenuItem::linkToCrud('Felhasználók', 'fas fa-user', User::class);
  278. }
  279. //->setPermission('ROLE_ADMIN');
  280. yield MenuItem::linkToCrud('Beállítások', 'fas fa-cog', Settings::class)->setController(SettingsCrudController::class)->setAction(Action::EDIT)->setEntityId(1)->setPermission('ROLE_ADMIN');
  281. yield MenuItem::linkToCrud('Szerződés sablonok', 'fas fa-file-alt', ContractTemplates::class)->setPermission('ROLE_ADMIN');
  282. }
  283. public function configureUserMenu(UserInterface $user): UserMenu
  284. {
  285. $menuItems = [
  286. MenuItem::linkToCrud('Profilom', 'fa fa-id-card', User::class)->setController(UserCrudController::class)->setAction(Action::EDIT)->setEntityId($this->getUser()->getId()),
  287. ];
  288. // Check if this user is impersonating another user (has ROLE_PREVIOUS_ADMIN)
  289. if (in_array('ROLE_PREVIOUS_ADMIN', $this->getUser()->getRoles())) {
  290. $menuItems[] = MenuItem::linkToRoute('Impersonáció vége', 'fa fa-sign-out-alt', 'exit_impersonation');
  291. }
  292. $menuItems[] = MenuItem::linkToLogout('Logout', 'fa fa-sign-out');
  293. return parent::configureUserMenu($user)
  294. ->setName($user->getDisplayName() ? $user->getDisplayName() : $user->getUsername())
  295. ->displayUserName(true)
  296. ->displayUserAvatar(true)
  297. ->setMenuItems($menuItems);
  298. }
  299. public function configureCrud(): Crud
  300. {
  301. return Crud::new()
  302. // the argument must be either one of these strings: 'short', 'medium', 'long', 'full', 'none'
  303. // (the strings are also available as \EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField::FORMAT_* constants)
  304. // or a valid ICU Datetime Pattern (see http://userguide.icu-project.org/formatparse/datetime)
  305. ->setDateFormat('Y-MM-dd')
  306. ->setTimeFormat('short')
  307. // first argument = datetime pattern or date format; second optional argument = time format
  308. //->setDateTimeFormat('medium', 'medium')
  309. ->setDateTimeFormat('Y-MM-dd H:mm:ss')
  310. ->setDateIntervalFormat('%%y év %%m hónap %%d nap')
  311. ->setTimezone('Europe/Budapest')
  312. // used to format numbers before rendering them on templates
  313. ->showEntityActionsInlined()
  314. ->setNumberFormat('%.3d');
  315. }
  316. public function configureAssets(): Assets
  317. {
  318. return Assets::new()
  319. ->addCssFile('css/style.css');
  320. }
  321. }