From bf85e9bb71b9d049be592c93a9d5205b51ee221a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 24 Oct 2024 15:49:59 +0200 Subject: [PATCH] When a user applies a signature in a workflow, the signer is the futureDestUser of the next step See: - https://gitea.champs-libres.be/Vendee/accent-suivi-developpement/issues/1252 - https://champs-libres.openproject.com/wp/768 - OP#768 --- .../SignatureStepStateChangerTest.php | 36 ++++++++++++++++++- .../Workflow/SignatureStepStateChanger.php | 10 ++++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/Bundle/ChillMainBundle/Tests/Workflow/SignatureStepStateChangerTest.php b/src/Bundle/ChillMainBundle/Tests/Workflow/SignatureStepStateChangerTest.php index fa3cd5c2d..8a239c441 100644 --- a/src/Bundle/ChillMainBundle/Tests/Workflow/SignatureStepStateChangerTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Workflow/SignatureStepStateChangerTest.php @@ -37,7 +37,7 @@ use Symfony\Component\Workflow\WorkflowInterface; */ class SignatureStepStateChangerTest extends TestCase { - public function testMarkSignatureAsSignedScenarioWhichExpectsTransition() + public function testMarkSignatureAsSignedScenarioWhichExpectsTransitionSignatureWithPerson() { $entityWorkflow = new EntityWorkflow(); $entityWorkflow->setWorkflowName('dummy'); @@ -84,6 +84,40 @@ class SignatureStepStateChangerTest extends TestCase self::assertNotNull($signatures[1]->getStateDate()); } + public function testMarkSignatureAsSignedScenarioWhichExpectsTransitionSignatureWithUser() + { + $entityWorkflow = new EntityWorkflow(); + $entityWorkflow->setWorkflowName('dummy'); + $registry = $this->buildRegistry(); + $workflow = $registry->get($entityWorkflow, 'dummy'); + $clock = new MockClock(); + $user = new User(); + + $messengerBus = new MessageBus([]); + $changer = new SignatureStepStateChanger($registry, $clock, new NullLogger(), $messengerBus); + + // move it to signature + $dto = new WorkflowTransitionContextDTO($entityWorkflow); + $dto->futureUserSignature = $signer = new User(); + $workflow->apply($entityWorkflow, 'to_signature', ['context' => $dto, 'transitionAt' => $clock->now(), + 'byUser' => $user, 'transition' => 'to_signature']); + + // get the signature created + $signatures = $entityWorkflow->getCurrentStep()->getSignatures(); + + // we mark the first signature as signed + $changer->markSignatureAsSigned($signatures[0], 1); + // the next step should be done by handling an async message + $changer->onPostMark($signatures[0]); + + self::assertEquals(EntityWorkflowSignatureStateEnum::SIGNED, $signatures[0]->getState()); + self::assertEquals('post-signature', $entityWorkflow->getStep(), 'the entity workflow step should be post-signature'); + self::assertContains($signer, $entityWorkflow->getCurrentStep()->getAllDestUser()); + self::assertCount(1, $entityWorkflow->getCurrentStep()->getAllDestUser()); + self::assertEquals(1, $signatures[0]->getZoneSignatureIndex()); + self::assertNotNull($signatures[0]->getStateDate()); + } + public function testMarkSignatureAsSignedScenarioWithoutRequiredMetadata() { $entityWorkflow = new EntityWorkflow(); diff --git a/src/Bundle/ChillMainBundle/Workflow/SignatureStepStateChanger.php b/src/Bundle/ChillMainBundle/Workflow/SignatureStepStateChanger.php index 58a6485c2..cccfa2ab7 100644 --- a/src/Bundle/ChillMainBundle/Workflow/SignatureStepStateChanger.php +++ b/src/Bundle/ChillMainBundle/Workflow/SignatureStepStateChanger.php @@ -97,16 +97,20 @@ class SignatureStepStateChanger return; } - $previousUser = $this->getPreviousSender($signature->getStep()); + if ('person' === $signature->getSignerKind()) { + $futureUser = $this->getPreviousSender($signature->getStep()); + } else { + $futureUser = $signature->getSigner(); + } - if (null === $previousUser) { + if (null === $futureUser) { $this->logger->info(self::LOG_PREFIX.'No previous user, will not apply a transition', ['signatureId' => $signature->getId()]); return; } $transitionDto = new WorkflowTransitionContextDTO($entityWorkflow); - $transitionDto->futureDestUsers[] = $previousUser; + $transitionDto->futureDestUsers[] = $futureUser; $workflow->apply($entityWorkflow, $transition, [ 'context' => $transitionDto,