userRepository->find($userId); if (null === $user) { throw new InvalidArgumentException(sprintf('User with ID %d not found.', $userId)); } // Check for existing active timer if creating a new active one if (null === $stoppedAt) { $activeEntry = $this->timeEntryRepository->findActiveByUser($user); if (null !== $activeEntry) { throw new InvalidArgumentException(sprintf('User "%s" already has an active timer (ID %d). Stop it before starting a new one.', $user->getUsername(), $activeEntry->getId())); } } $entry = new TimeEntry(); $entry->setUser($user); $entry->setStartedAt(new DateTimeImmutable($startedAt)); if (null !== $title) { $entry->setTitle($title); } if (null !== $stoppedAt) { $entry->setStoppedAt(new DateTimeImmutable($stoppedAt)); } if (null !== $description) { $entry->setDescription($description); } if (null !== $projectId) { $project = $this->projectRepository->find($projectId); if (null === $project) { throw new InvalidArgumentException(sprintf('Project with ID %d not found.', $projectId)); } $entry->setProject($project); } if (null !== $taskId) { $task = $this->taskRepository->find($taskId); if (null === $task) { throw new InvalidArgumentException(sprintf('Task with ID %d not found.', $taskId)); } $entry->setTask($task); } if (null !== $tagIds) { foreach ($tagIds as $tagId) { $tag = $this->taskTagRepository->find($tagId); if (null === $tag) { throw new InvalidArgumentException(sprintf('TaskTag with ID %d not found.', $tagId)); } $entry->addTag($tag); } } $this->entityManager->persist($entry); $this->entityManager->flush(); return json_encode([ 'id' => $entry->getId(), 'title' => $entry->getTitle(), 'description' => $entry->getDescription(), 'startedAt' => $entry->getStartedAt()?->format('c'), 'stoppedAt' => $entry->getStoppedAt()?->format('c'), 'duration' => $entry->getStoppedAt() && $entry->getStartedAt() ? (int) round(($entry->getStoppedAt()->getTimestamp() - $entry->getStartedAt()->getTimestamp()) / 60) : null, 'user' => ['id' => $user->getId(), 'username' => $user->getUsername()], 'project' => $entry->getProject() ? [ 'id' => $entry->getProject()->getId(), 'code' => $entry->getProject()->getCode(), 'name' => $entry->getProject()->getName(), ] : null, 'task' => $entry->getTask() ? [ 'id' => $entry->getTask()->getId(), 'number' => $entry->getTask()->getNumber(), 'title' => $entry->getTask()->getTitle(), ] : null, 'tags' => $entry->getTags()->map(fn ($t) => [ 'id' => $t->getId(), 'label' => $t->getLabel(), ])->toArray(), ]); } }