<?php
namespace App\Controller\Admin;
use App\Entity\ProjectProducts;
use App\Entity\WorkHours;
use App\Entity\User;
use App\Entity\Workers;
use App\Repository\ProjectProductsRepository;
use App\Repository\ProjectsRepository;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
use EasyCorp\Bundle\EasyAdminBundle\Field\FormField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextEditorField;
use EasyCorp\Bundle\EasyAdminBundle\Field\MoneyField;
use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateField;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ArrayField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TelephoneField;
use EasyCorp\Bundle\EasyAdminBundle\Field\NumberField;
use EasyCorp\Bundle\EasyAdminBundle\Field\EmailField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TimeField;
use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
use EasyCorp\Bundle\EasyAdminBundle\Filter\ChoiceFilter;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Common\Collections\Criteria;
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
use EasyCorp\Bundle\EasyAdminBundle\Orm\EntityRepository;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Config\KeyValueStore;
use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
use Symfony\Component\Form\FormInterface;
class WorkHoursCrudController extends AbstractCrudController
{
public static function getEntityFqcn(): string
{
return WorkHours::class;
}
public function configureFields(string $pageName): iterable
{
$req = $this->get('request_stack');
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
$workhour = $em->getRepository(WorkHours::class)->findOneBy(['id' => $req->getCurrentRequest()->query->get('entityId')]);
if (!$user->getRoles("ROLE_ADMIN") && $workhour != null && $workhour->getWorker()->getId() != $user->getWorker()->getId()) {
throw new AccessDeniedException("Not allowed");
}
yield FormField::addPanel('Óra adatok ')->addCssClass('col-md-12');
yield IdField::new('id')->hideOnForm();
if($user->hasRoles(User::ROLE_ADMIN)){
yield AssociationField::new('worker')->setPermission('ROLE_ADMIN');
}else{
yield AssociationField::new('worker')->hideOnForm();
}
$projectQB = function (ProjectsRepository $repository) use ($user) {
$qb = $repository->createQueryBuilder('p');
if(!$user->hasRoles(User::ROLE_ADMIN)){
$qb->join('p.workers', 'w');
$qb->andWhere('w.id = :workerId');
$qb->setParameter('workerId', $user->getWorker()->getId());
}
$qb->andWhere('p.isClosed is null OR p.isClosed = false');
// ->setParameter('workerId', 11);
return $qb;
};
if($user->hasRoles(User::ROLE_ADMIN)){
yield AssociationField::new('project')->setPermission('ROLE_ADMIN')->setFormTypeOption('query_builder' ,$projectQB);
}else{
yield AssociationField::new('project')->setCrudController(MyProjectsCrudController::class)->setFormTypeOption('query_builder' ,$projectQB);
}
$queryBuilder = function (ProjectProductsRepository $repository) use ($user) {
$qb = $repository->createQueryBuilder('pp');
$qb->join('pp.project', 'p');
if(!$user->hasRoles(User::ROLE_ADMIN)){
$qb->join('p.workers', 'w');
$qb->andWhere('w.id = :workerId');
$qb->setParameter('workerId', $user->getWorker()->getId());
}
$qb->andWhere('pp.isClosed is null OR pp.isClosed = false');
// ->setParameter('workerId', 11);
return $qb;
};
if($user->hasRoles(User::ROLE_ADMIN)){
yield AssociationField::new('projectProduct')->setFormTypeOption('query_builder' ,$queryBuilder);
}else{
yield AssociationField::new('projectProduct')->hideOnIndex()->setFormTypeOption('query_builder' ,$queryBuilder);
yield TextField::new('projectProduct.name')->onlyOnIndex();
}
yield NumberField::new('hours','Hour')->setFormTypeOption('attr.step','0.5')->setHelp('Fél órás bontásban elég, pl: 8.5');
yield TextEditorField::new('note')->hideOnIndex();
yield TextField::new('note')->renderAsHtml()->hideOnDetail();
yield DateField::new('day');
if($user->hasRoles(User::ROLE_ADMIN)){
yield BooleanField::new('isValidated','Jóváhagyva')->setPermission('ROLE_ADMIN');
yield TextField::new('validated','Jóváhagyta')->setPermission('ROLE_ADMIN')->hideOnForm();
yield DateTimeField::new('validatedDate','Jóváhagyva dátuma')->setPermission('ROLE_ADMIN')->hideOnForm();
}else{
yield BooleanField::new('isValidated','Jóváhagyva')->renderAsSwitch(false)->hideOnForm();
}
yield DateField::new('payed')->setPermission('ROLE_ADMIN');
yield MoneyField::new('payed_hour_price','Órabér')->setCurrency('HUF')->setNumDecimals(0)->setStoredAsCents(false)->hideOnIndex()->setPermission('ROLE_ADMIN');
yield MoneyField::new('other_price','Egyéb költség')->setCurrency('HUF')->setNumDecimals(0)->setStoredAsCents(false)->setPermission('ROLE_ADMIN');
}
/**
* Called before rendering create entity form
* modify entity and call parent method
*/
public function createNewForm(EntityDto $entityDto, KeyValueStore $formOptions, AdminContext $context): FormInterface
{
$user = $this->getUser();
if($this->getUser()->getWorker()){
$worker = $this->getDoctrine()->getRepository(Workers::class)->findOneBy(['id' => $user->getWorker()->getId()]);
$entityDto->getInstance()->setWorker($worker);
}
$entityDto->getInstance()->setDay(new \DateTime());
return parent::createNewForm($entityDto, $formOptions, $context);
}
public function persistEntity(EntityManagerInterface $entityManager, $entityInstance): void
{
$this->updateEvent($entityManager, $entityInstance);
}
public function updateEntity(EntityManagerInterface $entityManager, $entityInstance): void
{
$this->updateEvent($entityManager, $entityInstance);
}
private function updateEvent(EntityManagerInterface $entityManager, $entityInstance): void
{
$now = new \DateTime();
if($entityInstance->getIsValidated() == true){
$entityInstance->setValidatedDate($now);
$entityInstance->setValidated($this->getUser());
}
if($entityInstance->getProject() == null && $entityInstance->getProjectProduct() != null){
$entityInstance->setProject($entityInstance->getProjectProduct()->getProject());
}
if($entityInstance->getIsValidated() == null){
$entityInstance->setIsValidated(false);
}
$entityManager->persist($entityInstance);
$entityManager->flush();
}
/**
* Init crud
*/
public function configureCrud(Crud $crud): Crud
{
return $crud
->setEntityLabelInSingular('WorkHour')
->setDefaultSort(['id' => 'DESC', 'created'=>'DESC'])
->setSearchFields(['worker.full_name', 'worker.username', 'day', 'note', 'projectProduct.name', 'project.customer.name'])
->setPaginatorPageSize(30)
;
}
public function configureActions(Actions $actions): Actions
{
$actions->add(Crud::PAGE_INDEX, Action::DETAIL);
$actions->add(Crud::PAGE_EDIT, Action::DETAIL);
$actions->remove(Crud::PAGE_INDEX, Action::DELETE);
$actions->add(Crud::PAGE_EDIT, Action::DELETE);
return $actions;
}
/**
* configure filter fields
*/
public function configureFilters(Filters $filters): Filters
{
if($this->getUser()->hasRoles(User::ROLE_ADMIN)==false){
return $filters
->add(ChoiceFilter::new('payed')->setChoices(["Fizetetlen"=>Null]))
->add('note')
->add('day')
;
}else{
return $filters
->add('worker')
->add(ChoiceFilter::new('payed')->setChoices(["Fizetetlen"=>Null]))
->add('project')
->add('projectProduct')
->add('note')
->add('day')
;
}
}
public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
{
$qb = $this->get(EntityRepository::class)->createQueryBuilder($searchDto, $entityDto, $fields, $filters);
if (!$this->getUser()->hasRoles(User::ROLE_ADMIN)) {
$qb->andWhere('entity.worker = (:worker)');
$qb->setParameter('worker', $this->getUser()->getWorker());
//$qb->expr()->eq('entity.workerId', $this->getUser()->getWorker()->getId());
}
return $qb;
}
public function actionBatch(Request $request)
{
dump($this);die;
}
}