redmineService = $redmineService; } #[Route('/user/issue/{id}', name: 'app_issue_view')] public function viewIssue(int $id, IssueRepository $issueRepository): Response { $issue = $issueRepository->find($id); if (!$issue) { throw new NotFoundHttpException('La ressource demandée est introuvable.'); } if (!$issue->getProject()->getUsers()->contains($this->getUser())) { throw new AccessDeniedException('Vous n\'avez pas accès à cette ressource.'); } return $this->render('issue/view.html.twig', [ 'issue' => $issue, ]); } #[Route('/user/issue/order/{id}', name: 'app_issue_order', methods: ['POST'])] public function orderIssue(int $id, Request $request): JsonResponse { $data = $request->request; $sourceIssues = $data->all('sourceIssues'); $source = explode('|', $data->get('source')); $sourceStatus = $source[0]; $sourceSprint = $source[1]; $sourceVersion = $source[2]; $target = explode('|', $data->get('target')); $targetStatus = $target[0]; $targetSprint = $target[1]; $targetVersion = $target[2]; $targetIssues = $data->all('targetIssues'); if (!$sourceIssues || !$source || !$targetIssues || !$target) { return new JsonResponse(['error' => 'Données incomplètes.'], 400); } $payload = [ 'fixed_version_id' => $target, ]; // $redmineService->updateIssue($id, $payload); // ✅ Tu peux stocker l’ordre si besoin dans Redmine via custom field (optionnel) // ou en interne selon ta logique métier return new JsonResponse([ 'message' => 'Ordre mis à jour', 'moved' => $id, 'sourceIssues' => $sourceIssues, 'sourceStatus' => $targetStatus, 'sourceSprint' => $sourceSprint, 'sourceVersion' => $sourceVersion, 'targetIssues' => $targetIssues, 'targetStatus' => $targetStatus, 'targetSprint' => $targetSprint, 'targetVersion' => $targetVersion, ]); } }