src/Controller/Admin/DashboardController.php line 334

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