diff --git a/src/Bundle/ChillMainBundle/Controller/WorkflowController.php b/src/Bundle/ChillMainBundle/Controller/WorkflowController.php index 71ff897e0..6c9ee2f8c 100644 --- a/src/Bundle/ChillMainBundle/Controller/WorkflowController.php +++ b/src/Bundle/ChillMainBundle/Controller/WorkflowController.php @@ -298,7 +298,7 @@ class WorkflowController extends AbstractController $workflow = $this->registry->get($entityWorkflow, $entityWorkflow->getWorkflowName()); $errors = []; $signatures = $entityWorkflow->getCurrentStep()->getSignatures(); - $holdOnStepByUser = $this->entityWorkflowStepHoldRepository->findOneByStepAndUser($entityWorkflow->getCurrentStep(), $this->security->getUser()); + $onHoldStep = $this->entityWorkflowStepHoldRepository->findByWorkflow($entityWorkflow); if (\count($workflow->getEnabledTransitions($entityWorkflow)) > 0) { // possible transition @@ -343,6 +343,10 @@ class WorkflowController extends AbstractController $this->entityManager->flush(); + if ($onHoldStep) { + $this->entityManager->remove($onHoldStep); + } + return $this->redirectToRoute('chill_main_workflow_show', ['id' => $entityWorkflow->getId()]); } @@ -361,7 +365,7 @@ class WorkflowController extends AbstractController 'entity_workflow' => $entityWorkflow, 'transition_form_errors' => $errors, 'signatures' => $signatures, - 'holdOnStepByUser' => $holdOnStepByUser, + 'onHoldStep' => $onHoldStep, ] ); } diff --git a/src/Bundle/ChillMainBundle/Controller/WorkflowOnHoldController.php b/src/Bundle/ChillMainBundle/Controller/WorkflowOnHoldController.php index a7831159c..36c419e79 100644 --- a/src/Bundle/ChillMainBundle/Controller/WorkflowOnHoldController.php +++ b/src/Bundle/ChillMainBundle/Controller/WorkflowOnHoldController.php @@ -4,6 +4,7 @@ namespace Chill\MainBundle\Controller; use Chill\MainBundle\Entity\Workflow\EntityWorkflow; use Chill\MainBundle\Entity\Workflow\EntityWorkflowStepHold; +use Chill\MainBundle\Repository\Workflow\EntityWorkflowRepository; use Chill\MainBundle\Repository\Workflow\EntityWorkflowStepHoldRepository; use Chill\MainBundle\Security\ChillSecurity; use Doctrine\ORM\EntityManagerInterface; @@ -20,32 +21,23 @@ class WorkflowOnHoldController extends AbstractController private readonly EntityManagerInterface $entityManager, private readonly Security $security, private readonly Registry $registry, - private readonly EntityWorkflowStepHoldRepository $entityWorkflowStepHoldRepository + private readonly EntityWorkflowStepHoldRepository $entityWorkflowStepHoldRepository, + private readonly EntityWorkflowRepository $entityWorkflowRepository ) {} #[Route(path: '/{_locale}/main/workflow/{id}/hold', name: 'chill_main_workflow_on_hold')] public function putOnHold(EntityWorkflow $entityWorkflow, Request $request): Response { + $entityWorkflow = $this->entityWorkflowRepository->find($entityWorkflow); + $currentStep = $entityWorkflow->getCurrentStep(); $currentUser = $this->security->getUser(); $workflow = $this->registry->get($entityWorkflow, $entityWorkflow->getWorkflowName()); - $enabledTransitions = $workflow->getEnabledTransitions($entityWorkflow); - if (\count($enabledTransitions) === 0) { - throw $this->createAccessDeniedException('No transitions are available for the current workflow state.'); - } - $isTransitionAllowed = false; - foreach ($enabledTransitions as $transition) { - if ($workflow->can($entityWorkflow, $transition->getName())) { - $isTransitionAllowed = true; - break; - } - } - - if (!$isTransitionAllowed) { - throw $this->createAccessDeniedException('You are not allowed to apply any transitions to this workflow, therefore you cannot put it on hold.'); + if (!count($enabledTransitions) > 0) { + throw $this->createAccessDeniedException('You are not allowed to apply any transitions to this workflow, therefore you cannot toggle the hold status.'); } $stepHold = new EntityWorkflowStepHold($currentStep, $currentUser); @@ -61,10 +53,16 @@ class WorkflowOnHoldController extends AbstractController { $hold = $this->entityWorkflowStepHoldRepository->findById($holdId); $entityWorkflow = $hold->getStep()->getEntityWorkflow(); + $currentUser = $this->security->getUser(); + + if ($hold->getByUser() !== $currentUser) { + throw $this->createAccessDeniedException('You are not allowed to remove the hold status.'); + } $this->entityManager->remove($hold); $this->entityManager->flush(); return $this->redirectToRoute('chill_main_workflow_show', ['id' => $entityWorkflow->getId()]); } + } diff --git a/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowStepHoldRepository.php b/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowStepHoldRepository.php index 9e1316e05..4b6cc7d1c 100644 --- a/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowStepHoldRepository.php +++ b/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowStepHoldRepository.php @@ -12,12 +12,14 @@ declare(strict_types=1); namespace Chill\MainBundle\Repository\Workflow; use Chill\MainBundle\Entity\User; +use Chill\MainBundle\Entity\Workflow\EntityWorkflow; use Chill\MainBundle\Entity\Workflow\EntityWorkflowStep; use Chill\MainBundle\Entity\Workflow\EntityWorkflowStepHold; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\ORM\NonUniqueResultException; use Doctrine\ORM\NoResultException; use Doctrine\Persistence\ManagerRegistry; +use Symfony\Component\Workflow\Workflow; /** * @template-extends ServiceEntityRepository @@ -58,6 +60,23 @@ class EntityWorkflowStepHoldRepository extends ServiceEntityRepository return $this->findBy(['step' => $step]); } + /** + * @throws NonUniqueResultException + */ + public function findByWorkflow(EntityWorkflow $workflow): ?EntityWorkflowStepHold + { + $qb = $this->getEntityManager()->createQueryBuilder(); + + $qb->select('h') + ->from(EntityWorkflowStepHold::class, 'h') + ->join('h.step', 's') + ->join('s.entityWorkflow', 'w') + ->where('w = :workflow') + ->setParameter('workflow', $workflow); + + return $qb->getQuery()->getOneOrNullResult(); + } + /** * Find a single EntityWorkflowStepHold by step and user. * diff --git a/src/Bundle/ChillMainBundle/Resources/views/Workflow/index.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Workflow/index.html.twig index 191499b0a..20f617c0e 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/Workflow/index.html.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/Workflow/index.html.twig @@ -68,9 +68,9 @@
{% include '@ChillMain/Workflow/_history.html.twig' %}