diff --git a/src/Bundle/ChillDocStoreBundle/Service/WorkflowStoredObjectPermissionHelper.php b/src/Bundle/ChillDocStoreBundle/Service/WorkflowStoredObjectPermissionHelper.php index b27b6d96a..545325121 100644 --- a/src/Bundle/ChillDocStoreBundle/Service/WorkflowStoredObjectPermissionHelper.php +++ b/src/Bundle/ChillDocStoreBundle/Service/WorkflowStoredObjectPermissionHelper.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace Chill\DocStoreBundle\Service; +use Chill\MainBundle\Entity\Workflow\EntityWorkflowSignatureStateEnum; use Chill\MainBundle\Workflow\EntityWorkflowManager; use Symfony\Component\Security\Core\Security; @@ -31,6 +32,16 @@ class WorkflowStoredObjectPermissionHelper if (!$workflow->getCurrentStep()->getAllDestUser()->contains($currentUser)) { return false; } + + // as soon as there is one signatured applyied, we are not able to + // edit the document any more + foreach ($workflow->getSteps() as $step) { + foreach ($step->getSignatures() as $signature) { + if (EntityWorkflowSignatureStateEnum::SIGNED === $signature->getState()) { + return false; + } + } + } } return true; diff --git a/src/Bundle/ChillDocStoreBundle/Tests/Service/WorkflowStoredObjectPermissionHelperTest.php b/src/Bundle/ChillDocStoreBundle/Tests/Service/WorkflowStoredObjectPermissionHelperTest.php new file mode 100644 index 000000000..e87ea4653 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Tests/Service/WorkflowStoredObjectPermissionHelperTest.php @@ -0,0 +1,101 @@ +buildHelper($object, $entityWorkflow, $user); + + self::assertEquals($expected, $helper->notBlockedByWorkflow($entityWorkflow), $message); + } + + private function buildHelper(object $relatedEntity, EntityWorkflow $entityWorkflow, User $user): WorkflowStoredObjectPermissionHelper + { + $security = $this->prophesize(Security::class); + $security->getUser()->willReturn($user); + + $entityWorkflowManager = $this->prophesize(EntityWorkflowManager::class); + $entityWorkflowManager->findByRelatedEntity(Argument::type('object'))->willReturn([$entityWorkflow]); + + return new WorkflowStoredObjectPermissionHelper($security->reveal(), $entityWorkflowManager->reveal()); + } + + public static function provideDataNotBlockByWorkflow(): iterable + { + $entityWorkflow = new EntityWorkflow(); + $dto = new WorkflowTransitionContextDTO($entityWorkflow); + $entityWorkflow->setStep('test', $dto, 'to_test', new \DateTimeImmutable()); + + yield [$entityWorkflow, new User(), false, 'blocked because the user is not present as a dest user']; + + $entityWorkflow = new EntityWorkflow(); + $dto = new WorkflowTransitionContextDTO($entityWorkflow); + $dto->futureDestUsers[] = $user = new User(); + $entityWorkflow->setStep('test', $dto, 'to_test', new \DateTimeImmutable(), $user); + + yield [$entityWorkflow, $user, true, 'allowed because the user is present as a dest user']; + + $entityWorkflow = new EntityWorkflow(); + $dto = new WorkflowTransitionContextDTO($entityWorkflow); + $dto->futureDestUsers[] = $user = new User(); + $entityWorkflow->setStep('test', $dto, 'to_test', new \DateTimeImmutable(), $user); + $entityWorkflow->getCurrentStep()->setIsFinal(true); + + yield [$entityWorkflow, $user, false, 'blocked because the step is final']; + + $entityWorkflow = new EntityWorkflow(); + $dto = new WorkflowTransitionContextDTO($entityWorkflow); + $dto->futureDestUsers[] = $user = new User(); + $entityWorkflow->setStep('test', $dto, 'to_test', new \DateTimeImmutable(), $user); + $step = $entityWorkflow->getCurrentStep(); + new EntityWorkflowStepSignature($step, new Person()); + + yield [$entityWorkflow, $user, true, 'allow, a signature is present but still pending']; + + $entityWorkflow = new EntityWorkflow(); + $dto = new WorkflowTransitionContextDTO($entityWorkflow); + $dto->futureDestUsers[] = $user = new User(); + $entityWorkflow->setStep('test', $dto, 'to_test', new \DateTimeImmutable(), $user); + $step = $entityWorkflow->getCurrentStep(); + $signature = new EntityWorkflowStepSignature($step, new Person()); + $signature->setState(EntityWorkflowSignatureStateEnum::SIGNED); + + yield [$entityWorkflow, $user, false, 'blocked, a signature is present and signed']; + + } +}