<?php
namespace App\Controller;
use App\Entity\SsoMatricula;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Registro\RegistroAspirante;
use App\Entity\SsoPersona;
use App\Entity\SsoUser;
use App\Form\RegistroAspiranteType;
use Symfony\Component\HttpFoundation\Request;
use App\Service\PortalAspiranteService;
use App\Entity\Email\ConfirmaCorreo;
use App\Repository\Email\ConfirmaCorreoRepository;
use App\Form\PersonaType;
use Doctrine\ORM\ORMException;
use App\Service\PortalConsejoService;
use App\Entity\Auditoria\Registro;
use App\Entity\SsoUsuarioSistema;
use App\Repository\SsoRolSistemaRepository;
use App\Service\AuditoriaService;
use Symfony\Component\Workflow\Registry;
use App\Service\FileService;
use Symfony\Component\Validator\Validator\ValidatorInterface;
#[Route('/portal/aspirante')]
class PortalAspiranteController extends AbstractController
{
#[Route('/', name: 'portal_aspirante')]
public function index(): Response
{
// Tomo los sistemas asignados al usuario y que se encuentren activos
$sistemas = $this->getUser()->getSsoUsuarioSistemas()->map(
function ($relacion) {
return $relacion->getSistema();
})->filter(
function ($sistema) {
return $sistema->getClienteOauth2()->isActive();
});
return $this->render('portal_aspirante/index.html.twig', [
'sistemas' => $sistemas,
]);
}
#[Route('/registry', name: 'aspirante_registry', methods: ['GET','POST'])]
public function registry(
Request $request,
PortalAspiranteService $portalService,
AuditoriaService $auditoriaService,
): Response
{
$registroAspirante = $portalService->inicializarRegistro();
$form = $this->createForm(RegistroAspiranteType::class, $registroAspirante);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$portalService->encriptarContraseña($registroAspirante);
$portalService->procesarAdjuntos($registroAspirante, $form);
$portalService->correoConfirmacion($registroAspirante, $request);
$auditoriaService->auditarEvento(
Registro::EVENTO_REGISTRO,
null, null,
$registroAspirante
);
$request->getSession()->getFlashBag()->add(
'notice', // notice / warning / error
"<h4>Confirmación de Email</h4>
<p>Estimado/a " . $registroAspirante->getNombres() . " se ha enviado un correo a
<b>" . $registroAspirante->getEmailPersonal() . "</b> que contiene un enlace al que deberás ingresar
para validar tu correo electrónico.</p>"
);
return $this->redirectToRoute('app_login', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('security/registry.html.twig', [
'registroAspirante' => $registroAspirante,
'form' => $form,
]);
}
#[Route('/descarga/reglamento', name: 'aspirante_descarga_reglamento', methods: ['POST'])]
public function descargaReglamento(
// Request $request,
PortalAspiranteService $portalService,
// AuditoriaService $auditoriaService,
): Response
{
$registroAspirante = $portalService->inicializarRegistro();
$registroAspirante->marcarReglamentoDescargado();
$form = $this->createForm(RegistroAspiranteType::class, $registroAspirante);
return $this->renderForm('security/registry.html.twig', [
'registroAspirante' => $registroAspirante,
'form' => $form,
]);
}
#[Route('/registro/{mail}/{token}', name: 'app_registro', methods: ['GET'])]
public function registro(
Request $request,
String $mail,
String $token,
ConfirmaCorreoRepository $confirmaCorreoRepository,
PortalAspiranteService $portalService,
AuditoriaService $auditoriaService,
ValidatorInterface $validator
): Response
{
$confirmaCorreo = $confirmaCorreoRepository
->findOneBy([
'correoConfirma' => $mail,
'token' => $token,
'tipoCorreo' => ConfirmaCorreo::TIPO_REGISTRO,
'FechaHoraConfirmacion' => null,
]);
// dump($confirmaCorreo);
$redirectToLogin = true; // Variable para controlar la redirección
if ($confirmaCorreo) {
//TO-DO: validar si es alumno para la escuela
$futuroAlumno = $portalService->verSiEsFuturoAlumno($confirmaCorreo);
if (!$futuroAlumno) {
// Crear usuario y persona del sistema
// Asignar al usuario sistemas por defecto
$usuario = $portalService->crearUsuarioRegistrado($confirmaCorreo);
// Valido usuario creado antes de persistirlo
$errores = $validator->validate($usuario);
if (count($errores) > 0) {
$messages = [];
// foreach ($errores as $paramName => $violationList) {
foreach ($errores as $violation) {
$messages[] = $violation->getMessage();
}
$messages = implode(' <br/> ', $messages);
// }
$request->getSession()->getFlashBag()->add(
'error', // notice / warning / error
'Acceso incorrecto por lo siguiente: <br/>' . $messages //(string) $errores
);
} else {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($usuario);
$entityManager->flush();
// Copiar archivos adjuntos
$portalService->copiarAdjuntos($confirmaCorreo->getRegistroAspirante(), $usuario);
// Cambiar estado del registro
// Marcar confirmado el correo
$portalService->marcarRegistroConfirmado($confirmaCorreo);
// Auditar evento
$auditoriaService->auditarEvento(Registro::EVENTO_REGISTRO_CONFIRMA,
$usuario,
null,
$confirmaCorreo->getRegistroAspirante()
);
$request->getSession()->getFlashBag()->add(
'notice', // notice / warning / error
'Registro finalizado con éxito. Puede ahora ingresar al Portal con sus credenciales (DNI y contraseña).'
);
}
} else {
$confirmaCorreo->marcarConfirmado();
// Auditar evento
$auditoriaService->auditarEvento(Registro::EVENTO_REGISTRO_CONFIRMA,
null,
null,
$confirmaCorreo->getRegistroAspirante()
);
$redirectToLogin = false; // No redirigir al login si se entra en este else
}
} else {
return $this->render('portal_aspirante/verificandoInfo.html.twig');
$request->getSession()->getFlashBag()->add(
'error', // notice / warning / error
'Acceso incorrecto. Por favor vuelva a repetir el proceso de registro.'
);
}
// Redirigir solo si $redirectToLogin es true
if ($redirectToLogin) {
return $this->redirectToRoute('app_login', [], Response::HTTP_SEE_OTHER);
} else {
return $this->render('portal_aspirante/verificandoInfo.html.twig');
}
}
#[Route('/perfil', name: 'portal_aspirante_perfil')]
public function perfil(Request $request,
PortalConsejoService $portalService
): Response
{
$form = $this->createForm(
PersonaType::class,
$this->getUser()->getPersona(),
['disabled' => true]
);
$formPassword = $portalService->procesarCambioPassword($request, $this->getUser());
$formEmail = $portalService->procesarCambioEmail($request, $this->getUser(), "Portal Digital de Aspirantes");
return $this->renderForm('portal_aspirante/perfil.html.twig', [
'form' => $form,
'formPassword' => $formPassword,
'formEmail' => $formEmail,
]);
}
#[Route('/help', name: 'portal_aspirante_ayuda')]
public function help(): Response
{
throw new \LogicException('Falta implementar esta funcionalidad.');
}
}