add logic to filter tasks

This commit is contained in:
2018-05-07 22:06:34 +02:00
parent 38cc4f84c4
commit b856647b04
7 changed files with 144 additions and 90 deletions

View File

@@ -27,8 +27,14 @@ use Chill\MainBundle\Form\Type\ScopePickerType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Chill\TaskBundle\Repository\SingleTaskRepository;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
use Chill\TaskBundle\Security\Authorization\TaskVoter;
use Symfony\Component\Security\Core\Role\Role;
use Chill\TaskBundle\Entity\SingleTask;
use Chill\PersonBundle\Form\Type\PickPersonType;
/**
*
@@ -37,20 +43,106 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
*/
class SingleTaskListType extends AbstractType
{
/**
*
* @var EntityManagerInterface
*/
protected $em;
/**
*
* @var SingleTaskRepository
*/
protected $singleTaskRepository;
/**
*
* @var TokenStorageInterface
*/
protected $tokenStorage;
/**
*
* @var AuthorizationHelper
*/
protected $authorizationHelper;
public function __construct(
EntityManagerInterface $em,
TokenStorageInterface $tokenStorage,
AuthorizationHelper $authorizationHelper
) {
$this->em = $em;
$this->tokenStorage = $tokenStorage;
$this->authorizationHelper = $authorizationHelper;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$statuses = \array_merge(SingleTaskRepository::DATE_STATUSES, [ 'closed' ]);
$builder
->add('user', EntityType::class, [
'class' => 'Chill\MainBundle\Entity\User'
->add('user_id', EntityType::class, [
'class' => User::class,
'choices' => $this->getUsersAssigneedToTask(),
'placeholder' => 'Choose a user',
'required' => false
])
->add('status', ChoiceType::class, [
'choices' => array_flip(\array_merge(SingleTaskRepository::DATE_STATUSES, [ 'closed' ])),
'expanded' => false,
'multiple' => false
'choices' => array_combine($statuses, $statuses),
'expanded' => true,
'multiple' => true
])
->add('person_id', PickPersonType::class, [
'centers' => $this->authorizationHelper
->getReachableCenters(
$this->tokenStorage->getToken()->getUser(),
new Role(TaskVoter::SHOW)
),
'required' => false
])
;
}
/**
* Return a list of user having a task assigned.
*
* @return User[]
*/
protected function getUsersAssigneedToTask()
{
$qb = $this->em->createQueryBuilder();
$user = $this->tokenStorage->getToken()->getUser();
$role = new Role(TaskVoter::SHOW);
$centers = $this->authorizationHelper->getReachableCenters($user, $role);
$qb->select('DISTINCT user')
->from(User::class, 'user')
->join(SingleTask::class, 'task', \Doctrine\ORM\Query\Expr\Join::WITH, 'task.assignee = user')
->join('task.person', 'person')
->where("user.enabled = 'TRUE'")
;
$i = 0;
foreach ($centers as $center) {
$circles = $this->authorizationHelper->getReachableCircles($user, $role, $center);
// add condition about person and circle
$qb->andWhere(
$qb->expr()->andX()
->add($qb->expr()->eq('person.center', ':center_'.$i))
->add($qb->expr()->in('task.circle', ':circles_'.$i))
);
$qb->setParameter('center_'.$i, $center)
->setParameter('circles_'.$i, $circles)
;
// increase counter
$i++;
}
return $qb->getQuery()->getResult();
}
public function configureOptions(OptionsResolver $resolver)
{