src/Controller/Admin/WorkHoursCrudController.php line 92

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Admin;
  3. use App\Entity\ProjectProducts;
  4. use App\Entity\WorkHours;
  5. use App\Entity\User;
  6. use App\Entity\Workers;
  7. use App\Repository\ProjectProductsRepository;
  8. use App\Repository\ProjectsRepository;
  9. use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
  10. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  11. use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
  12. use EasyCorp\Bundle\EasyAdminBundle\Field\FormField;
  13. use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
  14. use EasyCorp\Bundle\EasyAdminBundle\Field\TextEditorField;
  15. use EasyCorp\Bundle\EasyAdminBundle\Field\MoneyField;
  16. use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField;
  17. use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;
  18. use EasyCorp\Bundle\EasyAdminBundle\Field\DateField;
  19. use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
  20. use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
  21. use EasyCorp\Bundle\EasyAdminBundle\Field\ArrayField;
  22. use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
  23. use EasyCorp\Bundle\EasyAdminBundle\Field\TelephoneField;
  24. use EasyCorp\Bundle\EasyAdminBundle\Field\NumberField;
  25. use EasyCorp\Bundle\EasyAdminBundle\Field\EmailField;
  26. use EasyCorp\Bundle\EasyAdminBundle\Field\TimeField;
  27. use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField;
  28. use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
  29. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  30. use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
  31. use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
  32. use EasyCorp\Bundle\EasyAdminBundle\Filter\ChoiceFilter;
  33. use Doctrine\ORM\QueryBuilder;
  34. use Doctrine\Common\Collections\Criteria;
  35. use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
  36. use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
  37. use EasyCorp\Bundle\EasyAdminBundle\Orm\EntityRepository;
  38. use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
  39. use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
  40. use Symfony\Component\HttpFoundation\Request;
  41. use Doctrine\ORM\EntityManagerInterface;
  42. use EasyCorp\Bundle\EasyAdminBundle\Config\KeyValueStore;
  43. use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
  44. use Symfony\Component\Form\FormInterface;
  45. class WorkHoursCrudController extends AbstractCrudController
  46. {
  47. public static function getEntityFqcn(): string
  48. {
  49. return WorkHours::class;
  50. }
  51. public function configureFields(string $pageName): iterable
  52. {
  53. $req = $this->get('request_stack');
  54. $em = $this->getDoctrine()->getManager();
  55. $user = $this->getUser();
  56. $workhour = $em->getRepository(WorkHours::class)->findOneBy(['id' => $req->getCurrentRequest()->query->get('entityId')]);
  57. if (!$user->getRoles("ROLE_ADMIN") && $workhour != null && $workhour->getWorker()->getId() != $user->getWorker()->getId()) {
  58. throw new AccessDeniedException("Not allowed");
  59. }
  60. yield FormField::addPanel('Óra adatok ')->addCssClass('col-md-12');
  61. yield IdField::new('id')->hideOnForm();
  62. if($user->hasRoles(User::ROLE_ADMIN)){
  63. yield AssociationField::new('worker')->setPermission('ROLE_ADMIN');
  64. }else{
  65. yield AssociationField::new('worker')->hideOnForm();
  66. }
  67. $projectQB = function (ProjectsRepository $repository) use ($user) {
  68. $qb = $repository->createQueryBuilder('p');
  69. if(!$user->hasRoles(User::ROLE_ADMIN)){
  70. $qb->join('p.workers', 'w');
  71. $qb->andWhere('w.id = :workerId');
  72. $qb->setParameter('workerId', $user->getWorker()->getId());
  73. }
  74. $qb->andWhere('p.isClosed is null OR p.isClosed = false');
  75. // ->setParameter('workerId', 11);
  76. return $qb;
  77. };
  78. if($user->hasRoles(User::ROLE_ADMIN)){
  79. yield AssociationField::new('project')->setPermission('ROLE_ADMIN')->setFormTypeOption('query_builder' ,$projectQB);
  80. }else{
  81. yield AssociationField::new('project')->setCrudController(MyProjectsCrudController::class)->setFormTypeOption('query_builder' ,$projectQB);
  82. }
  83. $queryBuilder = function (ProjectProductsRepository $repository) use ($user) {
  84. $qb = $repository->createQueryBuilder('pp');
  85. $qb->join('pp.project', 'p');
  86. if(!$user->hasRoles(User::ROLE_ADMIN)){
  87. $qb->join('p.workers', 'w');
  88. $qb->andWhere('w.id = :workerId');
  89. $qb->setParameter('workerId', $user->getWorker()->getId());
  90. }
  91. $qb->andWhere('pp.isClosed is null OR pp.isClosed = false');
  92. // ->setParameter('workerId', 11);
  93. return $qb;
  94. };
  95. if($user->hasRoles(User::ROLE_ADMIN)){
  96. yield AssociationField::new('projectProduct')->setFormTypeOption('query_builder' ,$queryBuilder);
  97. }else{
  98. yield AssociationField::new('projectProduct')->hideOnIndex()->setFormTypeOption('query_builder' ,$queryBuilder);
  99. yield TextField::new('projectProduct.name')->onlyOnIndex();
  100. }
  101. yield NumberField::new('hours','Hour')->setFormTypeOption('attr.step','0.5')->setHelp('Fél órás bontásban elég, pl: 8.5');
  102. yield TextEditorField::new('note')->hideOnIndex();
  103. yield TextField::new('note')->renderAsHtml()->hideOnDetail();
  104. yield DateField::new('day');
  105. if($user->hasRoles(User::ROLE_ADMIN)){
  106. yield BooleanField::new('isValidated','Jóváhagyva')->setPermission('ROLE_ADMIN');
  107. yield TextField::new('validated','Jóváhagyta')->setPermission('ROLE_ADMIN')->hideOnForm();
  108. yield DateTimeField::new('validatedDate','Jóváhagyva dátuma')->setPermission('ROLE_ADMIN')->hideOnForm();
  109. }else{
  110. yield BooleanField::new('isValidated','Jóváhagyva')->renderAsSwitch(false)->hideOnForm();
  111. }
  112. yield DateField::new('payed')->setPermission('ROLE_ADMIN');
  113. yield MoneyField::new('payed_hour_price','Órabér')->setCurrency('HUF')->setNumDecimals(0)->setStoredAsCents(false)->hideOnIndex()->setPermission('ROLE_ADMIN');
  114. yield MoneyField::new('other_price','Egyéb költség')->setCurrency('HUF')->setNumDecimals(0)->setStoredAsCents(false)->setPermission('ROLE_ADMIN');
  115. }
  116. /**
  117. * Called before rendering create entity form
  118. * modify entity and call parent method
  119. */
  120. public function createNewForm(EntityDto $entityDto, KeyValueStore $formOptions, AdminContext $context): FormInterface
  121. {
  122. $user = $this->getUser();
  123. if($this->getUser()->getWorker()){
  124. $worker = $this->getDoctrine()->getRepository(Workers::class)->findOneBy(['id' => $user->getWorker()->getId()]);
  125. $entityDto->getInstance()->setWorker($worker);
  126. }
  127. $entityDto->getInstance()->setDay(new \DateTime());
  128. return parent::createNewForm($entityDto, $formOptions, $context);
  129. }
  130. public function persistEntity(EntityManagerInterface $entityManager, $entityInstance): void
  131. {
  132. $this->updateEvent($entityManager, $entityInstance);
  133. }
  134. public function updateEntity(EntityManagerInterface $entityManager, $entityInstance): void
  135. {
  136. $this->updateEvent($entityManager, $entityInstance);
  137. }
  138. private function updateEvent(EntityManagerInterface $entityManager, $entityInstance): void
  139. {
  140. $now = new \DateTime();
  141. if($entityInstance->getIsValidated() == true){
  142. $entityInstance->setValidatedDate($now);
  143. $entityInstance->setValidated($this->getUser());
  144. }
  145. if($entityInstance->getProject() == null && $entityInstance->getProjectProduct() != null){
  146. $entityInstance->setProject($entityInstance->getProjectProduct()->getProject());
  147. }
  148. if($entityInstance->getIsValidated() == null){
  149. $entityInstance->setIsValidated(false);
  150. }
  151. $entityManager->persist($entityInstance);
  152. $entityManager->flush();
  153. }
  154. /**
  155. * Init crud
  156. */
  157. public function configureCrud(Crud $crud): Crud
  158. {
  159. return $crud
  160. ->setEntityLabelInSingular('WorkHour')
  161. ->setDefaultSort(['id' => 'DESC', 'created'=>'DESC'])
  162. ->setSearchFields(['worker.full_name', 'worker.username', 'day', 'note', 'projectProduct.name', 'project.customer.name'])
  163. ->setPaginatorPageSize(30)
  164. ;
  165. }
  166. public function configureActions(Actions $actions): Actions
  167. {
  168. $actions->add(Crud::PAGE_INDEX, Action::DETAIL);
  169. $actions->add(Crud::PAGE_EDIT, Action::DETAIL);
  170. $actions->remove(Crud::PAGE_INDEX, Action::DELETE);
  171. $actions->add(Crud::PAGE_EDIT, Action::DELETE);
  172. return $actions;
  173. }
  174. /**
  175. * configure filter fields
  176. */
  177. public function configureFilters(Filters $filters): Filters
  178. {
  179. if($this->getUser()->hasRoles(User::ROLE_ADMIN)==false){
  180. return $filters
  181. ->add(ChoiceFilter::new('payed')->setChoices(["Fizetetlen"=>Null]))
  182. ->add('note')
  183. ->add('day')
  184. ;
  185. }else{
  186. return $filters
  187. ->add('worker')
  188. ->add(ChoiceFilter::new('payed')->setChoices(["Fizetetlen"=>Null]))
  189. ->add('project')
  190. ->add('projectProduct')
  191. ->add('note')
  192. ->add('day')
  193. ;
  194. }
  195. }
  196. public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
  197. {
  198. $qb = $this->get(EntityRepository::class)->createQueryBuilder($searchDto, $entityDto, $fields, $filters);
  199. if (!$this->getUser()->hasRoles(User::ROLE_ADMIN)) {
  200. $qb->andWhere('entity.worker = (:worker)');
  201. $qb->setParameter('worker', $this->getUser()->getWorker());
  202. //$qb->expr()->eq('entity.workerId', $this->getUser()->getWorker()->getId());
  203. }
  204. return $qb;
  205. }
  206. public function actionBatch(Request $request)
  207. {
  208. dump($this);die;
  209. }
  210. }