getTransition(); $task = $event->getSubject(); // Gère le verrouillage de la tâche $shouldLock = $this->taskLifecycleStateMachine->getMetadataStore()->getTransitionMetadata($transition)['lock']; $shouldUnlock = $this->taskLifecycleStateMachine->getMetadataStore()->getTransitionMetadata($transition)['unlock']; if ($shouldLock) { $task->lock($this->security->getUser()); } elseif ($shouldUnlock) { $task->unlock(); } // Commentaire automatique $user = $this->security->getUser(); $task = $event->getSubject(); $comment = new Comment(); $comment->setTask($task); $comment->setCreatedBy($user); $comment->setContent($this->twig->render(sprintf('comment/%s.md.twig', $transition->getName()), [ 'user' => $user, 'task' => $task, ])); $this->entityManager->persist($comment); $this->entityManager->flush(); } // Bloque certaines transitions public function onGuard(Event $event): void { $transition = $event->getTransition(); $task = $event->getSubject(); $shouldLock = $this->taskLifecycleStateMachine->getMetadataStore()->getTransitionMetadata($transition)['lock']; $shouldUnlock = $this->taskLifecycleStateMachine->getMetadataStore()->getTransitionMetadata($transition)['unlock']; $subject = $event->getSubject(); if ($shouldLock and $task->isLocked()) { $event->setBlocked(true, 'La tâche est déjà verrouillée.'); } elseif ($shouldUnlock and !$task->isLocked()) { $event->setBlocked(true, 'La tâche n’est pas déjà verrouillée.'); } $event->setBlocked(false); } // Cas où on commence une tâche public function onStart(Event $event): void { $task = $event->getSubject(); $task->setStartAt(new \DateTimeImmutable('now')); } // Cas où on termine une tâche public function onFinish(Event $event): void { $task = $event->getSubject(); $task->setFinishAt(new \DateTimeImmutable('now')); } // Cas où une tâche est terminée public function onDone(Event $event): void { $task = $event->getSubject(); $user = $this->security->getUser(); $task->setDoneBy($user); // Essaie de trouver les changesets correspondants à la tâche $task->setChangesetsResult( json_encode($this->osmClient->getChangesets( // On part du principe que les changesets correspondants sont // ceux de l’utilisateur entre le moment où la tâche a été // commencée et celui où elle a été terminée // TODO C’est pas très précis, on doit pouvoir faire mieux // (hashatg avec un id spécifique à l’app dans le commentaire // du changeset, c’est moche mais ça marcherait) $user->getUsername(), $task->getStartAt(), $task->getFinishAt() )) ); } public static function getSubscribedEvents(): array { return [ TransitionEvent::getName('task_lifecycle', null) => 'onTransition', GuardEvent::getName('task_lifecycle', null) => 'onGuard', TransitionEvent::getName('task_lifecycle', Task::TRANSITION_START) => 'onStart', TransitionEvent::getName('task_lifecycle', Task::TRANSITION_FINISH) => 'onFinish', EnteredEvent::getName('task_lifecycle', Task::STATUS_DONE) => 'onDone', ]; } }