src/Controller/FrontJornadaCursoController.php line 243

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\InscripcionUsuarioJornadaCurso;
  4. use App\Entity\JornadaCurso;
  5. use App\Entity\Usuario;
  6. use App\Exception\CustomException;
  7. use App\Form\FrontFormBusquedaJornadaCursoType;
  8. use App\Form\FrontInscripcionUsuarioJornadaCursoType;
  9. use App\Service\JornadaCursoService;
  10. use App\Service\Mails;
  11. use Symfony\Component\HttpFoundation\RedirectResponse;
  12. use App\Entity\Localidad;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Exception;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  22. #[Route(path: '/jornadas-cursos')]
  23. class FrontJornadaCursoController extends AbstractController
  24. {
  25. public function __construct(
  26. private readonly EntityManagerInterface $em,
  27. private readonly JornadaCursoService $jornadaCursoService,
  28. private readonly UserPasswordHasherInterface $encoder,
  29. private readonly Mails $mails)
  30. {
  31. }
  32. #[Route(path: '/ver/{jornadaCurso}-{slug}', name: 'front_ver_jornada_curso', methods: 'GET|POST')]
  33. #[ParamConverter('jornadaCurso', options: ['mapping' => ['jornadaCurso' => 'id']])]
  34. public function ver(JornadaCurso $jornadaCurso, string $slug): RedirectResponse|Response
  35. {
  36. // Redirigir si el slug no coincide con el actual (SEO)
  37. if ($slug !== $jornadaCurso->getSlug()) {
  38. return $this->redirectToRoute('front_ver_jornada_curso', [
  39. 'jornadaCurso' => $jornadaCurso->getId(),
  40. 'slug' => $jornadaCurso->getSlug()
  41. ], Response::HTTP_MOVED_PERMANENTLY);
  42. }
  43. $usuario = $this->getUser();
  44. // Obtiene y comprueba que la jornada cumpla unos criterios. Ver repo.
  45. $jornadaCurso = $this->em->getRepository(JornadaCurso::class)->comprobarAccesibilidadJornadaCurso($jornadaCurso);
  46. if (!$jornadaCurso) {
  47. return $this->redirectToRoute('front_inicio');
  48. }
  49. // Comprueba si $now está dentro de las fechas de inicio y fin de solicitud de inscripción del curso.
  50. $fechasEnPlazo = $jornadaCurso->estaInscripcionAbierta();
  51. return $this->render('front-jornadas-cursos/ver.html.twig', [
  52. 'jornadaCurso' => $jornadaCurso,
  53. 'fechasEnPlazo' => $fechasEnPlazo
  54. ]);
  55. }
  56. #[Route(path: '/inscribirse/{jornadaCurso}', name: 'front_solicitar_inscripcion_jornada_curso', methods: 'GET|POST')]
  57. public function inscribirseJornadaCurso(Request $request, JornadaCurso $jornadaCurso): Response
  58. {
  59. try {
  60. $usuario = $this->getUser();
  61. $confirmarRegistro = $this->getParameter('confirmarRegistro');
  62. $repoUsuario = $this->em->getRepository(Usuario::class);
  63. // Comprueba si $now está dentro de las fechas de inicio y fin de la jornada del curso.
  64. $fechasEnPlazo = $jornadaCurso->estaInscripcionAbierta();
  65. if (!$fechasEnPlazo) {
  66. throw new CustomException('No está dentro del plazo para poder realizar la solicitud.');
  67. }
  68. $inscripcionUsuarioJornada = new InscripcionUsuarioJornadaCurso();
  69. $inscripcionUsuarioJornada->setJornadaCurso($jornadaCurso);
  70. // Si está logueado, se le precargan los campos del form.
  71. if ($this->isGranted('IS_AUTHENTICATED')) {
  72. $inscripcionUsuarioJornada
  73. ->setUsuario($usuario)
  74. ->setEmail($usuario->getEmail())
  75. ->setNombre($usuario->getNombre())
  76. ->setApellidos($usuario->getApellidos())
  77. ->setDniNie($usuario->getDniNie())
  78. ->setSexo($usuario->getSexo())
  79. ->setLocalidad($usuario->getLocalidad())
  80. ->setDireccion($usuario->getDireccion())
  81. ->setCodigoPostal($usuario->getCodigoPostal())
  82. ->setTelefono1($usuario->getTelefono1())
  83. ->setTelefono2($usuario->getTelefono2())
  84. ->setFechaNacimiento($usuario->getFechaNacimiento());
  85. }
  86. $this->em->persist($inscripcionUsuarioJornada);
  87. $form = $this->createForm(FrontInscripcionUsuarioJornadaCursoType::class, $inscripcionUsuarioJornada);
  88. $form->handleRequest($request);
  89. if ($form->isSubmitted() && $form->isValid()) {
  90. if ($this->jornadaCursoService->plazasDisponiblesEnJornada($jornadaCurso) <= 0) {
  91. throw new CustomException('No quedan plazas disponibles para inscribirse.');
  92. }
  93. $passTexto = null;
  94. $cuentaNueva = false;
  95. if (!$this->isGranted('IS_AUTHENTICATED')) {
  96. $usuario = $repoUsuario->findOneBy(['email' => $form->get('email')->getData()]);
  97. if (!$usuario) {
  98. $usuario = $repoUsuario->findOneBy(['dniNie' => $form->get('dniNie')->getData()]);
  99. }
  100. if (!$usuario) {
  101. $usuario = new Usuario();
  102. $passTexto = uniqid();
  103. $passTemp = $this->encoder->hashPassword($usuario, $passTexto);
  104. $usuario
  105. ->setUsuario($form->get('email')->getData())
  106. ->setEmail($form->get('email')->getData())
  107. ->setNombre($form->get('nombre')->getData())
  108. ->setApellidos($form->get('apellidos')->getData())
  109. ->setDniNie($form->get('dniNie')->getData())
  110. ->setSexo($form->get('sexo')->getData())
  111. ->setLocalidad($form->get('localidad')->getData())
  112. ->setDireccion($form->get('direccion')->getData())
  113. ->setCodigoPostal($form->get('codigoPostal')->getData())
  114. ->setTelefono1($form->get('telefono1')->getData())
  115. ->setTelefono2($form->get('telefono2')->getData())
  116. ->setPassword($passTemp)
  117. ->setFechaNacimiento($form->get('fechaNacimiento')->getData())
  118. ->setAceptaCondicionesPrivacidad($form->get('aceptaCondicionesPrivacidad')->getData())
  119. ->setLlamar(false)
  120. ->setActivo(!$confirmarRegistro);
  121. $this->em->persist($usuario);
  122. $inscripcionUsuarioJornada->setUsuario($usuario);
  123. $cuentaNueva = true;
  124. }
  125. }
  126. $this->em->flush();
  127. if ($cuentaNueva) {
  128. $htmlConfirmarRegistro = "";
  129. if ($confirmarRegistro) {
  130. $urlConfirmacionRegistro = $this->generateUrl('front_confirmar_registro', [
  131. 'tokenConfirmacion' => $usuario->getTokenConfirmacion()
  132. ], UrlGeneratorInterface::ABSOLUTE_URL);
  133. $htmlConfirmarRegistro = "
  134. <br><br>
  135. Para acceder al sistema es necesario confirmar su registro. Para confirmarlo acceda
  136. <u><a class='btn btn-sm btn-primary' href='".$urlConfirmacionRegistro."'>aquí</a></u>
  137. ";
  138. $usuario->setTokenConfirmacion(sha1(uniqid(mt_rand(), true)));
  139. }
  140. $this->mails->sendNotification(
  141. 'Confirmación de su registro',
  142. "
  143. <p>Hola {$usuario->getUsuario()}: </p>
  144. <p>
  145. Al realizar la inscripción a la joranda <b>{$jornadaCurso->getNombre()}</b>, hemos detectado
  146. que no tenía una cuenta creada en el sistema de Proempleo 8 y se la hemos creado automáticamente.
  147. $htmlConfirmarRegistro.
  148. </p>
  149. <p>
  150. Una vez que haya confirmado su cuenta, los datos de acceso son:<br>
  151. - Email: <b>{$usuario->getEmail()}</b><br>
  152. - Contraseña: <b>$passTexto</b><br>
  153. </p>
  154. <p>Por seguridad, cambie su contraseña una vez que inicie sesión en la cuenta desde
  155. su perfil accediendo mediante el item de menú superior <b>Mi perfil</b>.</p>
  156. ",
  157. $usuario->getEmail(),
  158. null,
  159. true
  160. );
  161. }
  162. $this->mails->sendNotification(
  163. 'Confirmación de inscripción en la jornada',
  164. "
  165. <p>Estimado/a {$usuario->getUsuario()}:</p>
  166. <p>Nos complace informarle que su inscripción a la jornada <b>{$jornadaCurso->getNombre()}</b> ha
  167. sido confirmada correctamente. Le agradecemos su interés en participar.</p>
  168. <p>Si tiene alguna duda o necesita realizar alguna consulta, no dude en ponerse en contacto con nosotros.</p>
  169. <p>Atentamente,<br>
  170. Proempleo 8</p>
  171. ",
  172. $usuario->getEmail(),
  173. null,
  174. true
  175. );
  176. $this->addFlash('success', 'Operación realizada correctamente.');
  177. return $this->redirectToRoute('front_ver_jornada_curso', [
  178. 'jornadaCurso' => $jornadaCurso->getId(),
  179. 'slug' => $jornadaCurso->getSlug()
  180. ]);
  181. }
  182. return $this->render('front-jornadas-cursos/inscribirse-jornada-curso.html.twig', [
  183. 'jornadaCurso' => $jornadaCurso,
  184. 'form' => $form->createView()
  185. ]);
  186. } catch (CustomException $e) {
  187. $this->addFlash('error', $e->getMessage());
  188. return $this->redirectToRoute('front_ver_jornada_curso', [
  189. 'jornadaCurso' => $jornadaCurso->getId(),
  190. 'slug' => $jornadaCurso->getSlug()
  191. ]);
  192. } catch (Exception $e) {
  193. $this->addFlash('error', 'Se ha producido un error.');
  194. return $this->redirectToRoute('front_ver_jornada_curso', [
  195. 'jornadaCurso' => $jornadaCurso->getId(),
  196. 'slug' => $jornadaCurso->getSlug()
  197. ]);
  198. }
  199. }
  200. #[Route(path: '', name: 'front_listado_jornadas_cursos', options: ['expose' => true], methods: 'GET|POST')]
  201. #[Route(path: '/{slugLocalidad}', name: 'front_listado_jornadas_cursos_localidad', options: ['expose' => true], methods: 'GET|POST')]
  202. #[ParamConverter('slugLocalidad', options: ['mapping' => ['slugLocalidad' => 'slug']])]
  203. public function listado(Request $request, Localidad $slugLocalidad = null): Response
  204. {
  205. $ordenarPor = 'masReciente';
  206. $nombre = '';
  207. $itemsPorPagina = 30;
  208. $pagina = $request->query->getInt('page', 1);
  209. if ($request->query->get('itemsPorPagina') && trim($request->query->get('itemsPorPagina')) !== '') {
  210. $itemsPorPagina = $request->query->get('itemsPorPagina');
  211. }
  212. $localidad = null;
  213. if ($slugLocalidad instanceof Localidad) {
  214. $localidad = $slugLocalidad->getSlug();
  215. }
  216. // FORM BÚSQUEDA
  217. $frontFormBusquedaJornadasCursos = $this->createForm(FrontFormBusquedaJornadaCursoType::class, [
  218. 'localidad' => $slugLocalidad
  219. ]);
  220. $frontFormBusquedaJornadasCursos->handleRequest($request);
  221. if ($frontFormBusquedaJornadasCursos->isSubmitted() && $frontFormBusquedaJornadasCursos->isValid()) {
  222. $nombre = $frontFormBusquedaJornadasCursos->get('nombre')->getData() ?? '';
  223. }
  224. // FIN FORM BÚSQUEDA
  225. $jornadasCursos = $this->em->getRepository(JornadaCurso::class)->obtenerBuscadorFront($nombre, $localidad, $pagina, $itemsPorPagina, $ordenarPor);
  226. return $this->render('front-jornadas-cursos/listado.html.twig', [
  227. 'jornadasCursos' => $jornadasCursos,
  228. 'itemsPorPagina' => $itemsPorPagina,
  229. 'frontFormBusquedaJornadasCursos' => $frontFormBusquedaJornadasCursos->createView(),
  230. 'localidad' => $slugLocalidad,
  231. ]);
  232. }
  233. }