timeEntryRepository->find($id); if (null === $entry) { throw new InvalidArgumentException(sprintf('TimeEntry with ID %d not found.', $id)); } if (null !== $title) { $entry->setTitle($title); } if (null !== $startedAt) { $entry->setStartedAt(new DateTimeImmutable($startedAt)); } 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 ($entry->getTags()->toArray() as $existingTag) { $entry->removeTag($existingTag); } 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->flush(); return json_encode([ 'id' => $entry->getId(), 'title' => $entry->getTitle(), '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' => $entry->getUser()->getId(), 'username' => $entry->getUser()->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(), ]); } }