src/Controller/Home/courses/DetailController.php line 19

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Home\courses;
  3. use App\Exception\InvalidParameterException;
  4. use App\Interfaces\ActividadFormativaRepositoryInterface;
  5. use App\Interfaces\FormadorRepositoryInterface;
  6. use App\Interfaces\GrupoRepositoryInterface;
  7. use App\Services\Domain\CursoEstadoService;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Component\Security\Core\Security;
  13. /**
  14. * Controlador para mostrar el detalle de una actividad formativa (solicitud o grupo)
  15. */
  16. class DetailController extends AbstractController
  17. {
  18. public function __construct(
  19. private ActividadFormativaRepositoryInterface $actividadesRepository,
  20. private FormadorRepositoryInterface $formadorRepository,
  21. private GrupoRepositoryInterface $grupoRepository,
  22. private Security $security,
  23. private CursoEstadoService $cursoEstadoService
  24. ) {
  25. }
  26. /**
  27. * Muestra el detalle de una actividad formativa específica
  28. *
  29. * @Route("/{_locale}/courses/{tipo}/{id}", name="course_detail", defaults={"_locale" = "ca"}, requirements={"_locale": "es|ca", "tipo": "solicitud|grupo", "id": "\d+"})
  30. *
  31. * @param Request $request Objeto Request de Symfony
  32. * @param string $tipo Tipo de actividad (solicitud o grupo)
  33. * @param int $id ID de la actividad a mostrar
  34. *
  35. * @return Response
  36. *
  37. * @throws InvalidParameterException Si el ID no es válido
  38. */
  39. public function __invoke(Request $request, string $tipo, int $id): Response
  40. {
  41. // Validar el ID de la actividad
  42. if (!is_numeric($id) || (int)$id <= 0) {
  43. throw new InvalidParameterException('ID de actividad no válido');
  44. }
  45. // Validar el tipo de actividad
  46. if (!in_array($tipo, ['solicitud', 'grupo'])) {
  47. throw new InvalidParameterException('Tipo de actividad no válido');
  48. }
  49. // Buscar la actividad por tipo e ID
  50. $actividad = $this->actividadesRepository->findActividadById($tipo, $id);
  51. if (!$actividad) {
  52. throw $this->createNotFoundException('Actividad no encontrada');
  53. }
  54. // Determinar estado del curso
  55. $estado = 'pendiente';
  56. $estadoLabel = 'Pendiente';
  57. $ahora = new \DateTime();
  58. if ($tipo === 'grupo' && $actividad['fechaInicio'] && $actividad['fechaFinal']) {
  59. if ($ahora >= $actividad['fechaInicio'] && $ahora <= $actividad['fechaFinal']) {
  60. $estado = 'en_curso';
  61. $estadoLabel = 'En curso';
  62. } elseif ($ahora > $actividad['fechaFinal']) {
  63. $estado = 'finalizado';
  64. $estadoLabel = 'Finalizado';
  65. }
  66. }
  67. // Añadir estado y estadoLabel al actividad
  68. $actividad['estado'] = $estado;
  69. $actividad['estadoLabel'] = $estadoLabel;
  70. // Si el usuario está logueado y es un grupo, buscar detalles de su inscripción
  71. $usuario = $this->security->getUser();
  72. if ($usuario && $tipo === 'grupo') {
  73. // Necesitamos la entidad Grupo completa para la búsqueda
  74. $grupoEntity = $this->grupoRepository->findById($id);
  75. if ($grupoEntity) {
  76. $detallesInscripcion = $this->actividadesRepository->getDetallesInscripcionUsuario($usuario, $grupoEntity);
  77. // Fusionar los detalles de la inscripción con los datos de la actividad
  78. if (!empty($detallesInscripcion)) {
  79. $actividad = array_merge($actividad, $detallesInscripcion);
  80. }
  81. // Obtener el estado definitivo del servicio de dominio
  82. $estadoDefinitivo = $this->cursoEstadoService->obtenerEstadoCurso($grupoEntity, $usuario);
  83. if ($estadoDefinitivo) {
  84. $actividad['estado'] = $estadoDefinitivo->value;
  85. $actividad['estadoLabel'] = $estadoDefinitivo->getLabel();
  86. }
  87. // Añadir estado de inscripción para prevenir múltiples inscripciones
  88. $actividadesArray = [$actividad];
  89. $this->actividadesRepository->addUserInscriptionStatus($actividadesArray);
  90. $actividad = $actividadesArray[0];
  91. }
  92. }
  93. // El formador ya viene incluido en la respuesta de findActividadById para grupos
  94. // Para solicitudes siempre será null
  95. // Usamos usort para ordenar el array por la clave 'dataHoraInici'
  96. if(@$actividad['grupoSesiones'])usort($actividad['grupoSesiones'], function ($a, $b) {
  97. // La función de comparación utiliza el operador <=> para comparar las fechas
  98. // Devuelve -1 si $a < $b, 0 si son iguales, y 1 si $a > $b
  99. return $a['dataHoraInici'] <=> $b['dataHoraInici'];
  100. });
  101. // Renderizar la plantilla con los datos de la actividad
  102. return $this->render('home/courses/detail.html.twig', [
  103. 'actividad' => $actividad,
  104. 'tipo' => $tipo,
  105. 'sesiones' => $actividad['grupoSesiones'] ?? []
  106. ]);
  107. }
  108. }