<?php
namespace App\Core\Controller\Web;
use App\Core\Controller\Api\SecurityApiController;
use App\Core\Entity\Bloqueos;
use App\Core\Entity\CategoriaUsuario;
use App\Core\Entity\InformacionPerfil;
use App\Core\Entity\Institucion\DirectorInstitucion;
use App\Core\Entity\Notificacion;
use App\Core\Entity\RecordatorioAgenda;
use App\Core\Entity\Seguidor;
use App\Core\Entity\Subscripciones\PagoSubscripcion;
use App\Core\Entity\SugerenciaCategoria;
use App\Core\Entity\User;
use App\Core\Entity\Maestro;
use App\Core\Entity\Estudiante;
use App\Core\Form\Model\UserModel;
use App\Core\Form\UserFormType;
use App\Core\Repository\CategoriaRepository;
use App\Core\Repository\CityRepository;
use App\Core\Repository\ColorRepository;
use App\Core\Repository\CountryRepository;
use App\Core\Repository\CursoRepository;
use App\Core\Repository\InformacionPerfil\ColegioRepository;
use App\Core\Repository\InformacionPerfil\EmpleoRepository;
use App\Core\Repository\InformacionPerfil\IdiomaRepository;
use App\Core\Repository\InformacionPerfil\ProfesionRepository;
use App\Core\Repository\InformacionPerfil\UniversidadRepository;
use App\Core\Repository\Institucion\DirectorInstitucionRepository;
use App\Core\Repository\NotificacionRepository;
use App\Core\Repository\SeguidorRepository;
use App\Core\Repository\TutorialRepository;
use App\Core\Repository\UserRepository;
use App\Core\Security\LoginUserAuthenticator;
use App\Core\Validator\CursoValidator;
use App\Entity\FichaEstudiantil;
use App\Entity\OtrosContactosEmergencia;
use App\Entity\RecordatorioCalendario;
use App\EventSubscriber\LocaleSubscriber;
use App\EventSubscriber\UserLocaleSubscriber;
use App\Repository\CampusMaestroRepository;
use App\Repository\InvitacionInstitucionRepository;
use App\Repository\OtrosContactosEmergenciaRepository;
use App\Service\suscripcion\SuscripcionesKoleyo;
use App\Service\TutorialService;
use App\Service\visa_cybersource\visa_cybersource;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Signer\Key;
use Lexik\Bundle\JWTAuthenticationBundle\Encoder\JWTEncoderInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Console\CommandLoader\ContainerCommandLoader;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Message;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Security\Http\Util\TargetPathTrait;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
class SecurityController extends AbstractController
{
/**
* @var SuscripcionesKoleyo
*/
private $suscripcionesKoleyo;
/**
* @var TranslatorInterface
*/
private $translator;
/**
* @var SerializerInterface
*/
private $serializer;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var TutorialRepository
*/
private $tutorialRepository;
/**
* @var UrlGeneratorInterface
*/
private $urlGenerator;
/**
* @var JWTEncoderInterface
*/
private $JWTEncoder;
/**
* @var ColorRepository
*/
private $colorRepository;
private $campusMaestroRepository;
private $invitacionInstitucionRepository;
private $userRepository;
private $directorInstitucionRepository;
function __construct(SuscripcionesKoleyo $suscripcionesKoleyo, TranslatorInterface $translator, SerializerInterface $serializer, EntityManagerInterface $entityManager, TutorialRepository $tutorialRepository, UrlGeneratorInterface $urlGenerator, JWTEncoderInterface $JWTEncoder, ColorRepository $colorRepository, CampusMaestroRepository $campusMaestroRepository, InvitacionInstitucionRepository $invitacionInstitucionRepository, UserRepository $userRepository, DirectorInstitucionRepository $directorInstitucionRepository)
{
$this->suscripcionesKoleyo = $suscripcionesKoleyo;
$this->translator = $translator;
$this->serializer = $serializer;
$this->entityManager = $entityManager;
$this->tutorialRepository = $tutorialRepository;
$this->urlGenerator = $urlGenerator;
$this->JWTEncoder = $JWTEncoder;
$this->colorRepository = $colorRepository;
$this->campusMaestroRepository = $campusMaestroRepository;
$this->invitacionInstitucionRepository = $invitacionInstitucionRepository;
$this->userRepository = $userRepository;
$this->directorInstitucionRepository = $directorInstitucionRepository;
}
#[Route('/login', name: 'app_login')]
public function login(Request $request, AuthenticationUtils $authenticationUtils)
{
//Me aseguro que el login sea en https en el servidor...
$strHostName = $request->getHttpHost();
if ($_ENV['APP_ENV'] === 'prod') {
$tieneWWW = strpos($strHostName, 'www');
if ($tieneWWW === false) {
$strURL = "www.{$strHostName}";
return new RedirectResponse("https://{$strURL}/login");
}
if (!$request->isSecure()) {
$strURL = "https://{$strHostName}";
return new RedirectResponse("{$strURL}/login");
}
}
else if ($_ENV['APP_ENV'] === 'test') {
if (!$request->isSecure()) {
$strURL = "https://{$strHostName}/login";
return new RedirectResponse("{$strURL}");
}
}
//Si ya hay un usuario registrado redirige a la pantalla de perfil
if ($this->getUser()) {
$this->checkInvitacion($this->getUser()->getEmail());
$redirectResponse = new RedirectResponse($this->urlGenerator->generate('app_perfil'));
//se desconecta el test de pub porque ya hay usuarios iguales creados en el mismo servidor
$uat = [
'id' => $this->getUser()->getId(),
'idMaestro' => ($this->getUser()->getMaestro()) ? $this->getUser()->getMaestro()->getId() : 0,
'idEstudiante' => ($this->getUser()->getEstudiante()) ? $this->getUser()->getEstudiante()->getId() : 0,
'idDirector' => ($this->getUser()->getDirector()) ? $this->getUser()->getDirector()->getId() : 0,
'autorizado' => true
];
$redirectResponse->headers->setCookie(Cookie::create('UAT',$this->JWTEncoder->encode($uat)));
return $redirectResponse;
}
// Obtiene el error de login si existe
$error = $authenticationUtils->getLastAuthenticationError();
// Obtiene el �ltimo nombre de usuario
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error
]);
}
#[Route('/recuperacion', name: 'app_ingresar_correo_recuperacion')]
function ingresarCorreoRecuperacion(Request $request, MailerInterface $mailer, UserRepository $userRepository) {
if ($request->isMethod('POST')) {
$resultado = SecurityApiController::verificarCorreoRecuperacion($request, $userRepository, $mailer, $this->entityManager, $this, $this->translator);
if ($resultado['correcto'] === false)
return $this->render('security/recuperarPassword/ingresar_correo_recuperacion.html.twig', [
'error' => $resultado['mensaje']
]);
return $this->redirectToRoute('app_ingresar_codigo_recuperacion', ['email' => $resultado['usuario']->getEmail()]);
}
return $this->render('security/recuperarPassword/ingresar_correo_recuperacion.html.twig');
}
#[Route('/recuperacion/codigo/{email}', name: 'app_ingresar_codigo_recuperacion')]
function ingresarCodigoRecuperacion(User $usuario, Request $request, UserPasswordHasherInterface $userPasswordEncoder, UserAuthenticatorInterface $userAuthenticator, LoginUserAuthenticator $loginAuthenticator) {
if ($request->isMethod('POST')) {
if (!$this->isCsrfTokenValid('codigo-recuperacion', $request->request->get('_csrf_token'))) {
$resultado['correcto'] = false;
$resultado['mensaje'] = $this->translator->trans('datos_invalidos', [], 'errores');
}
else $resultado = SecurityApiController::cambiarPassword($request, $usuario, $userPasswordEncoder, $this->entityManager, $this->translator);
if ($resultado['correcto'] !== true)
return $this->render('security/recuperarPassword/ingresar_codigo.html.twig', [
'error' => $resultado['mensaje'],
'correo' => $usuario->getEmail()
]);
return $userAuthenticator->authenticateUser(
$usuario,
$loginAuthenticator,
$request
);
}
return $this->render('security/recuperarPassword/ingresar_codigo.html.twig', [
'correo' => $usuario->getEmail()
]);
}
#[Route('/logout', name: 'app_logout')]
public function logout(){}
#[Route('/register', name: 'app_register')]
public function register(Request $request, UserPasswordHasherInterface $passwordEncoder, UserAuthenticatorInterface $userAuthenticator, LoginUserAuthenticator $loginAuthenticator, ValidatorInterface $validator, UserRepository $userRepository, MailerInterface $mailer, TranslatorInterface $translator, CountryRepository $countryRepository, TutorialService $tutorialService)
{
$error = '';
$lang = $request->getLanguages()[0];
$paises = $countryRepository->findAll();
$correoInvitacion = null;
if ($request->query->get('email') && !$userRepository->findOneBy(['email' => urldecode($request->query->get('email'))]))
$correoInvitacion = urldecode($request->query->get('email'));
if($request->isMethod('POST') && $this->isCsrfTokenValid('csrf_seguridad', $request->request->get('_csrf_token'))) {
$resultado = SecurityApiController::registrarUsuario($request, $translator, $mailer, $passwordEncoder, $this->entityManager, $userRepository, $countryRepository, $this->tutorialRepository, $tutorialService);
if ($resultado['correcto'] !== true)
return $this->render('security/register.html.twig', [
'error' => $resultado['mensaje'],
'lang' => $lang,
'paises' => $paises,
'correoInvitacion' => $correoInvitacion
]);
$user = $resultado['usuario'];
$invitacionInstitucion = $this->invitacionInstitucionRepository->findOneBy(['email' => $user->getEmail(), 'estado' => 0]);
$invitacionMaestro = $this->campusMaestroRepository->findOneBy(['email' => $user->getEmail(), 'estado' => 0]);
//Mantiene en la sesion que el usuario fue invitado, para crear su perfil de alumno
if ($correoInvitacion && $user->getEmail() === $correoInvitacion) {
if ($invitacionInstitucion) {
$request->getSession()->set('director', true);
} elseif ($invitacionMaestro) {
$request->getSession()->set('maestro', true);
} else {
$request->getSession()->set('invitado', true);
}
}
$this->checkInvitacion($correoInvitacion);
//De una vez autentica al usuario que se registr�
/*
return $guardHandler->authenticateUserAndHandleSuccess(
$user,
$request,
$loginAuthenticator,
'main'
);
*/
return $this->render('homepage/informacion_confirmacion.html.twig', [
'error' => $error,
'lang' => $lang,
'correo' => $user->getEmail(),
'correoInvitacion' => $correoInvitacion,
'paises' => $paises
]);
}
return $this->render('security/register.html.twig', [
'error' => $error,
'lang' => $lang,
'correoInvitacion' => $correoInvitacion,
'paises' => $paises
]);
}
public function checkInvitacion($correoInvitacion) {
$director = null;
$maestro = null;
$user = $this->userRepository->findOneBy(['email' => $correoInvitacion]);
if ($user) {
$director = $user->getDirector();
$maestro = $user->getMaestro();
}
$invitacion = $this->invitacionInstitucionRepository->findOneBy(['email' => $correoInvitacion, 'estado' => 0]);
$campusMaestro = $this->campusMaestroRepository->findOneBy(['email' => $correoInvitacion, 'estado' => 0]);
if ($invitacion && $director) {
$invitacion->setDirector($director);
$invitacion->setEstado(1);
$this->entityManager->persist($invitacion);
$this->entityManager->flush($invitacion);
$directorAsignado = $this->directorInstitucionRepository->findOneBy(['director' => $director, 'institucion' => $invitacion->getInstitucion(), 'estado' => 1]);
if (!$directorAsignado) {
$directorInstitucion = new DirectorInstitucion();
$directorInstitucion->setDirector($director);
$directorInstitucion->setInstitucion($invitacion->getInstitucion());
$this->entityManager->persist($directorInstitucion);
$this->entityManager->flush($directorInstitucion);
}
}
if ($campusMaestro && $maestro) {
$campusMaestroAsignado = $this->campusMaestroRepository->findOneBy(['maestro' => $maestro, 'Campus' => $campusMaestro->getCampus(), 'estado' => 1]);
if ($campusMaestroAsignado) return;
$campusMaestro->setMaestro($maestro);
$campusMaestro->setEstado(1);
$this->entityManager->persist($campusMaestro);
$this->entityManager->flush($campusMaestro);
}
}
/**
* @param Request $request
* @param UserAuthenticatorInterface $userAuthenticator
* @param LoginUserAuthenticator $loginAuthenticator
* @param UserRepository $userRepository
*/
#[Route('/confirmar-correo', name: 'app_confirmar_correo')]
function webConfirmarCorreo(Request $request, UserAuthenticatorInterface $userAuthenticator, LoginUserAuthenticator $loginAuthenticator, UserRepository $userRepository) {
$resultado = SecurityApiController::confirmarCorreo($request, $this->entityManager, $userRepository, $this->translator);
if ($resultado['correcto'] !== true) return $this->redirectToRoute('app_login');
return $userAuthenticator->authenticateUser(
$resultado['usuario'],
$loginAuthenticator,
$request
);
//return new RedirectResponse($this->urlGenerator->generate('app_login'));
}
#[Route('/informacion-perfil/{editar}', name: 'app_informacion_perfil', defaults: ['editar' => null])]
public function informacionPerfil(Request $request,
CityRepository $cityRepository, IdiomaRepository $idiomaRepository,
EmpleoRepository $empleoRepository, ProfesionRepository $profesionRepository,
UniversidadRepository $universidadRepository, ColegioRepository $colegioRepository, $editar = null) {
if ($editar === 'editar') {
$editar = true;
$this->denyAccessUnlessGranted('ROLE_USER');
}
else $editar = false;
if ($request->getMethod() === 'POST') {
$resultado = SecurityApiController::postInformacionPerfil($request, $this->translator, $this->entityManager, $editar, $this->getUser(), $cityRepository, $universidadRepository, $colegioRepository, $empleoRepository, $idiomaRepository, $profesionRepository);
if ($resultado['correcto'] !== true) return $this->redirectToRoute('app_informacion_perfil', ['editar' => 'editar']);
if ($editar) return $this->redirectToRoute('app_perfil');
else return $this->redirectToRoute('app_seleccionar_categorias');
}
if ($editar && $this->getUser()->getInformacionPerfil()) {
$resultado = SecurityApiController::getInformacionPerfil($this->getUser());
/** @var InformacionPerfil\IdiomaPerfil[] $idiomaPerfiles */
$idiomaPerfiles = $resultado['idiomaPerfiles'];
/** @var InformacionPerfil\EmpleoPerfil[] $empleoPerfiles */
$empleoPerfiles = $resultado['empleoPerfiles'];
/** @var InformacionPerfil\ProfesionPerfil[] $profesionPerfiles */
$profesionPerfiles = $resultado['profesionPerfiles'];
/** @var InformacionPerfil\UniversidadPerfil[] $universidadPerfiles */
$universidadPerfiles = $resultado['universidadPerfiles'];
/** @var InformacionPerfil\ColegioPerfil[] $colegioPerfiles */
$colegioPerfiles = $resultado['colegioPerfiles'];
}
return $this->render('security/informacion_perfil.html.twig', [
'editar' => $editar,
'idiomaPerfiles' => $idiomaPerfiles ?? null,
'empleoPerfiles' => $empleoPerfiles ?? null,
'profesionPerfiles' => $profesionPerfiles ?? null,
'universidadPerfiles' => $universidadPerfiles ?? null,
'colegioPerfiles' => $colegioPerfiles ?? null,
'idiomas' => $idiomaRepository->findAll()
]);
}
#[Route('/seleccionar-categorias/{editar}', name: 'app_seleccionar_categorias', defaults: ['editar' => null])]
function seleccionarCategoriasFavoritas(Request $request, CategoriaRepository $categoriaRepository, $editar = false) {
if ($editar === 'editar') {
$editar = true;
$this->denyAccessUnlessGranted('ROLE_USER');
}
if ($request->getMethod() === 'POST') {
/** @var User $user */
$user = $this->getUser();
$resultado = SecurityApiController::seleccionarCategorias($request, $user, $this->entityManager, $categoriaRepository);
if ($resultado['correcto'] !== true) return $this->render('security/categorias_favoritas.html.twig', [
'categorias' => $categoriaRepository->findAll(),
'editar' => $editar
]);
if ($editar) return $this->redirectToRoute('app_informacion_perfil', ['editar' => 'editar']);
else return $this->redirectToRoute('app_seleccionar_perfil_inicial');
}
$categorias = $categoriaRepository->findAll();
return $this->render('security/categorias_favoritas.html.twig', [
'categorias' => $categorias,
'editar' => $editar
]);
}
#[Route('/seleccionar-perfil', name: 'app_seleccionar_perfil_inicial')]
#[IsGranted('ROLE_USER')]
public function seleccionarPerfilInicial(Request $request) {
if ($request->isMethod('POST') || $request->getSession()->get('invitado') === true) {
if ($request->getSession()->get('invitado') === true)
$request->request->set('perfil', 'estudiante');
if ($request->getSession()->get('maestro') === true)
$request->request->set('perfil', 'maestro');
if ($request->getSession()->get('director') === true)
$request->request->set('perfil', 'director');
$resultado = SecurityApiController::crearPerfil($request, $this->getUser(), $this->suscripcionesKoleyo, $this->entityManager, $this->translator);
if ($resultado['correcto'] !== true) return $this->render('security/seleccionar_perfil.html.twig', [
'error' => $resultado['mensaje']
]);
if ($request->request->get('perfil') === 'maestro'){
return $this->redirectToRoute('app_informacion_perfil_maestro');
}
else if ($request->request->get('perfil') === 'estudiante') {
if ($request->getSession()->get('invitado') === true) {
$request->getSession()->remove('invitado');
return $this->redirectToRoute('app_estudiante_invitaciones');
}
return $this->redirectToRoute('app_estudiante_ficha_perfil_estudiante');
}
else if ($request->request->get('perfil') === 'director') {
return $this->redirectToRoute('app_mis_instituciones');
}
}
return $this->render('security/seleccionar_perfil.html.twig', [
'error' => ''
]);
}
#[Route('/perfil', name: 'app_perfil')]
#[IsGranted('ROLE_USER')]
public function perfilUsuario(Request $request, PaginatorInterface $paginator, CursoRepository $cursoRepository, NotificacionRepository $notificacionRepository) {
$tutoriales = $this->tutorialRepository->getTutorialesDeUsuarioYRuta($this->getUser()->getId(), $request->attributes->get('_route'));
/** @var User $user */
$user = $this->getUser();
$error = null;
$msg = '';
$resultado = SecurityApiController::getDatosPerfil($request, $cursoRepository, $user, $paginator, $notificacionRepository);
//manejador de errores generales dentro de la aplicacion
if($request->get('k-invalid-session')){
$error = $this->translator->trans('sesion_invalida', [], 'errores');
if($request->get('code') == 'k0001'){
$msg = $this->translator->trans('no_eres_estudiante', [], 'errores');
}
}
return $this->render('security/perfil_de_usuario.html.twig', array_merge($resultado, ['tutoriales' => $tutoriales], ['errorDeAcceso' => $error], ['msg' => $msg]));
}
#[Route('/perfil/{id}/{nombreCompleto}', name: 'app_perfil_publico')]
#[IsGranted('ROLE_USER')]
public function perfilPublico(User $user, CursoRepository $cursoRepository, PaginatorInterface $paginator, Request $request) {
/** @var User $usuarioActual */
$usuarioActual = $this->getUser();
$datos = SecurityApiController::getDatosPerfilPublico($request, $cursoRepository, $paginator, $user, $usuarioActual);
return $this->render('security/perfil_publico.html.twig', $datos);
}
#[Route('/perfil/buscar-perfiles', name: 'app_buscar_perfiles')]
#[IsGranted('ROLE_USER')]
public function buscarPerfiles(Request $request, UserRepository $userRepository, PaginatorInterface $paginator) {
/** @var User $usuarioActual */
$usuarioActual = $this->getUser();
$datos = SecurityApiController::buscarPerfilesPantalla($request, $userRepository, $paginator, $usuarioActual);
return $this->render('security/buscar_perfil.html.twig', $datos);
}
#[Route('/mis-perfiles', name: 'app_mis_perfiles')]
#[IsGranted('ROLE_USER')]
public function misPerfiles(Request $request) {
$tutoriales = $this->tutorialRepository->getTutorialesDeUsuarioYRuta($this->getUser()->getId(), $request->attributes->get('_route'));
/** @var User $usuarioActual */
$usuarioActual = $this->getUser();
if ($request->isMethod('POST')) {
$resultado = SecurityApiController::crearPerfil($request, $usuarioActual, $this->suscripcionesKoleyo, $this->entityManager, $this->translator);
if ($resultado['correcto'] !== true) return $this->render('security/mis_perfiles.html.twig', ['error' => $resultado['mensaje'], 'tutoriales' => $tutoriales]);
$this->checkInvitacion($usuarioActual->getEmail());
if ($request->request->get('perfil') === 'maestro') return $this->redirectToRoute('app_informacion_perfil_maestro');
else if ($request->request->get('perfil') === 'estudiante') return $this->redirectToRoute('app_estudiante_mis_cursos');
else if ($request->request->get('perfil') === 'director') return $this->redirectToRoute('app_mis_instituciones');
}
return $this->render('security/mis_perfiles.html.twig', [
'tutoriales' => $tutoriales
]);
}
#[Route('/maestro/perfil-maestro', name: 'app_informacion_perfil_maestro')]
function informacionPerfilMaestro(Request $request){
//$this->denyAccessUnlessGranted('ES_MAESTRO', $this->getUser());
if (!$this->isGranted('ES_MAESTRO', $this->getUser())) {
//throw new \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException('Acceso denegado');
return new RedirectResponse($this->generateUrl('app_perfil'));
}
if ($request->getMethod() === 'POST') {
/** @var User $usuario */
$usuario = $this->getUser();
$resultado = SecurityApiController::actualizarDatosMaestro($request, $usuario, $this->entityManager);
if ($resultado['correcto'] !== true) return $this->render('security/informacion_perfil_maestro.html.twig', ['error' => $resultado['mensaje']]);
return $this->redirectToRoute('app_perfil_maestro');
}
return $this->render('security/informacion_perfil_maestro.html.twig');
}
#[Route('/estudiante/ficha', name: 'app_estudiante_ficha_perfil_estudiante')]
function fichaEstududiantil(Request $request, OtrosContactosEmergenciaRepository $otrosContactosEmergenciaRepository, CategoriaRepository $categoriaRepository, UserRepository $userRepository){
//$this->denyAccessUnlessGranted('ES_MAESTRO', $this->getUser());
if (!$this->isGranted('ES_ESTUDIANTE', $this->getUser())) {
//throw new \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException('Acceso denegado');
return new RedirectResponse($this->generateUrl('app_perfil'));
}
$categorias = $categoriaRepository->findAll();
if ($request->getMethod() === 'POST') {
$nombresCategoria = array_map(array($this, 'getNombreCategoriaEnCheckBoxes'), array_filter($request->request->keys(), array($this, 'checkBoxKey')));
/** @var User $usuario */
$usuario = $this->getUser();
/** @var Estudiante $estudiante */
$estudiante = $usuario->getEstudiante();
$keys = $request->request->keys();
if ($estudiante->getFichaEstudiantil()){
return $this->redirectToRoute('app_perfil_estudiante');
}
if (trim($request->request->get("nombres_usuario")) !== '')
$usuario->asignarNombresUsuario($request->request->get('nombres_usuario'));
if (trim($request->request->get('apellidos_usuario')) !== '')
$usuario->asignarApellidosUsuario($request->request->get('apellidos_usuario'));
if (trim($request->request->get('nombres_usuario')) !== '' && trim($request->request->get('apellidos_usuario')) !== ''){
$usuario->asignarNombreCompleto();
}
if (!empty($nombresCategoria)){
foreach ($nombresCategoria as $categoriaNombre){
$categoria = $categoriaRepository->findOneBy(["nombre"=>$categoriaNombre]);
$categoriaUsuario = new CategoriaUsuario();
$categoriaUsuario->setCategoria($categoria);
$categoriaUsuario->setUsuario($usuario);
$this->entityManager->persist($categoriaUsuario);
$this->entityManager->flush($categoriaUsuario);
}
}
if ($request->files->get("fotoPerfil")){
$usuario->setImageFile($request->files->get("fotoPerfil"));
}
$this->entityManager->persist($usuario);
$this->entityManager->flush($usuario);
if ($usuario->getImageFile()) $usuario->setImageFile(null);
$ficha = new FichaEstudiantil();
$ficha->setEstudiante($estudiante);
$ficha->setNombreCompletoPapa($request->request->get("nombre_completo_papa"));
$ficha->setNombreCompletoMama($request->request->get("nombre_completo_mama"));
$ficha->setEmailPapa($request->request->get("email_papa"));
$ficha->setEmailMama($request->request->get("email_mama"));
$ficha->setDireccionPapa($request->request->get("direccion_papa"));
$ficha->setDireccionMama($request->request->get("direccion_mama"));
$ficha->setTelefonoPapa($request->request->get("telefono_papa_1"));
$ficha->setTelefonoMama($request->request->get("telefono_mama_1"));
$ficha->setHobbies($request->request->get("estudiante_hobbies"));
$this->entityManager->persist($ficha);
$contactos = [];
$contacto = [];
for ($i = 0; $i < count($keys); $i++){
$key = $keys[$i];
if ($key !== "nombre_completo_papa"
&& $key !== "nombre_completo_mama"
&& $key !== "email_papa"
&& $key !== "email_mama"
&& $key !== "direccion_papa"
&& $key !== "direccion_mama"
&& $key !== "telefono_papa_1"
&& $key !== "telefono_mama_1"
&& $key !== "total_contacto"
&& $key !== "nombre_alumno"
&& $key !== "nombres_usuario"
&& $key !== "apellidos_usuario"
){
$keyValue = trim(explode("_", $key)[0]);
$indexValue = trim(explode("_", $key)[1]);
$contacto[$keyValue."_".$indexValue] = $request->request->get($key);
$contactos = $contacto;
}
}
for ($k = 1; $k <= $request->request->getInt("total_contacto"); $k++){
$contactoEntity = new OtrosContactosEmergencia();
for ($j = 0; $j < count(array_keys($contactos)); $j++){
$numContacto = explode("_", array_keys($contactos)[$j])[1];
if (intval($numContacto) === $k){
$contactoEntity->setNombre($contactos["nombreCompletoContacto_".$numContacto]);
$contactoEntity->setEmail($contactos["emailContacto_".$numContacto]);
$contactoEntity->setParentesco($contactos["parentescoContacto_".$numContacto]);
$contactoEntity->setTelefono($contactos["telefonoContacto_".$numContacto]);
$this->entityManager->persist($contactoEntity);
}
}
$ficha->addOtrosContactosEmergencia($contactoEntity);
}
$this->entityManager->flush();
return $this->redirectToRoute('app_perfil_estudiante');
}
return $this->render('ficha_estudiante/estudiante/ficha_estudiantil.html.twig', ["categorias"=>$categorias]);
}
use TargetPathTrait;
#[Route('/perfil/configuracion', name: 'app_configuracion_cuenta')]
function configuracionCuenta(Request $request, UserPasswordHasherInterface $userPasswordEncoder, visa_cybersource $visa_cybersource, CountryRepository $countryRepository, UserRepository $userRepository) {
if ($this->getUser() === null) return $this->redirectToRoute('app_logout');
$currentYear = intval(date("Y"));
if ($request->getMethod() === 'POST' && $this->isCsrfTokenValid('csrf_seguridad', $request->request->get('_csrf_token'))) {
/** @var User $user */
$user = $this->getUser();
$resultado = SecurityApiController::actualizarConfiguracionCuenta($request, $user, $userPasswordEncoder, $this->entityManager, $this->translator, $countryRepository, $userRepository);
if ($resultado['correcto'] !== true) return $this->render('security/configuracion_cuenta.html.twig', [
'currentYear' => $currentYear,
'error' => $resultado['mensaje'] ?? null,
'errorPassword' => $resultado['mensajePassword'] ?? null,
'strFingerprint_ORG_ID' => $this->getParameter('VC_FINGERPRINT_ORG_ID'),
'strMerchantID' => $this->getParameter('VC_MERCHANT_ID'),
'strFingerPrintUnique' => md5(session_id()),
'paises' => $countryRepository->findAll()
]);
return $this->redirectToRoute('app_perfil');
}
return $this->render('security/configuracion_cuenta.html.twig', [
'currentYear' => $currentYear,
'strFingerprint_ORG_ID' => $this->getParameter('VC_FINGERPRINT_ORG_ID'),
'strMerchantID' => $this->getParameter('VC_MERCHANT_ID'),
'strFingerPrintUnique' => md5(session_id()),
'paises' => $countryRepository->findAll()
]);
}
#[Route('/agenda', name: 'app_agenda_usuario')]
#[IsGranted('ROLE_USER')]
public function agendaDeUsuario(Request $request):Response{
$error = null;
/** @var User $user */
$user = $this->getUser();
if ($request->isMethod('POST')){
$recordatorioCalendario = new RecordatorioCalendario();
$data = $request->request->all();
foreach ($data as $datum) {
if ($datum === '' || $datum === null){
return $this->render('security/agenda_de_usuario.html.twig', ['error'=>$this->translator->trans('todos_los_campos_son_requeridos', [], 'errores')]);
}
}
$recordatorioCalendario->setNombre($data['nombreRecordatorio']);
$recordatorioCalendario->setFecha(new \DateTime($data['fechaRecordatorio']));
$recordatorioCalendario->setHoraInicio(new \DateTime($data['horaInicioRecordatorio']));
$recordatorioCalendario->setHoraFin(new \DateTime($data['horaFinRecordatorio']));
$recordatorioCalendario->setColor($this->colorRepository->findOneBy(['nombre'=>$data['colorRecordatorio']]));
$recordatorioCalendario->setCalendario($user->getCalendario());
$recordatorioCalendario->setEstado(1);
$this->entityManager->persist($recordatorioCalendario);
$this->entityManager->flush();
return $this->render('security/agenda_de_usuario.html.twig', ['error'=>$error]);
}
else {
return $this->render('security/agenda_de_usuario.html.twig', ['error'=>$error]);
}
}
#[Route('/notificaciones', name: 'app_notificaciones')]
#[IsGranted('ROLE_USER')]
public function notificaciones(NotificacionRepository $notificacionRepository, Request $request) {
$idUsuario = $this->getUser()->getId();
if ($request->isMethod('POST')) {
$notificacion = $notificacionRepository->findOneBy(['id' => $request->request->get('idNotificacion')]);
$curso = $notificacion->getCurso();
//Redireccionar para ver lo relacionado con la notificacion dependiendo el tipo
if ($notificacion->getCurso()) {
switch ($notificacion->getTipo()) {
case 'nuevoMensaje':
case 'nuevaConversacion':
case 'nuevoGrupo':
return $this->redirectToRoute('app_maestro_curso_chat', ['id' => $curso->getId()]);
case 'nuevaInvitacion':
return $this->redirectToRoute('app_estudiante_invitaciones');
case 'nuevaSolicitudAsignacion':
return $this->redirectToRoute('app_asistencia_maestro_solicitudes_asignacion', ['id' => $curso->getId()]);
case 'nuevoLogro':
return $this->redirectToRoute('app_estudiante_mis_avances', ['id' => $curso->getId(), 'nombre' => $curso->getNombre()]);
case 'nuevaRetroalimentacion':
return $this->redirectToRoute('app_estudiante_retroalimentacion_estudiante', ['id' => $curso->getId(), 'nombre' => $curso->getNombre(), 'idClase' => $notificacion->getAtributos()['idClase']]);
case 'nuevoAnuncio':
if ($notificacion->getAtributos()) {
if (in_array($this->getUser()->getId(), $notificacion['idsMaestros']))
return $this->redirectToRoute('app_maestro_curso_inicio', ['id' => $curso->getId()]);
}
return $this->redirectToRoute('app_estudiante_curso_inicio', ['id' => $curso->getId(), 'nombre' => $curso->getNombre()]);
case 'solicitudAceptada':
return $this->redirectToRoute('app_estudiante_curso_inicio', ['id' => $curso->getId(), 'nombre' => $curso->getNombre()]);
case 'invitacionAceptada':
return $this->redirectToRoute('app_asistencia_maestro_lista_alumnos', ['id' => $curso->getId()]);
case 'cursoArchivado':
if ($notificacion->getAtributos()) {
if (in_array($this->getUser()->getId(), $notificacion['idsMaestros'])) {
if ($curso->getPrivado())
return $this->redirectToRoute('app_maestro_cursos_privados_archivados');
else
return $this->redirectToRoute('app_maestro_cursos_abiertos_archivados');
}
}
if ($curso->getPrivado())
return $this->redirectToRoute('app_estudiante_cursos_privados_archivados');
else
return $this->redirectToRoute('app_estudiante_cursos_abiertos_archivados');
}
}
else {
switch ($notificacion->getTipo()) {
case 'nuevoMensaje':
case 'solicitudConversacionAceptada':
case 'nuevaConversacion':
return $this->redirectToRoute('app_mensajes');
case 'nuevaSolicitudConversacion':
return $this->redirectToRoute('app_solicitudes_conversacion');
case 'nuevoSeguidor':
return $this->redirectToRoute('app_seguidores');
}
}
}
return $this->render('security/notificaciones.html.twig');
}
#[Route('/mensajes', name: 'app_mensajes')]
#[IsGranted('ROLE_ADMIN')]
function mensajes() {
$username = $this->getUser()->getUsername();
$token = (new Builder())
->withClaim('mercure', ['subscribe' => [sprintf("/%s", $username)]])
->getToken(
new Sha256(),
new Key($this->getParameter('mercure_secret_key'))
);
$response = $this->render('security/mensajes/mensajes.html.twig');
$response->headers->setCookie(
new Cookie(
'mercureAuthorization',
$token,
(new \DateTime())
->add(new \DateInterval('PT2H')),
'/.well-known/mercure',
null,
false,
true,
false,
'strict'
)
);
return $response;
}
#[Route('/seguidores', name: 'app_seguidores')]
#[IsGranted('ROLE_USER')]
function seguidores(SeguidorRepository $seguidorRepository, Request $request, PaginatorInterface $paginator) {
/** @var User $usuarioActual */
$usuarioActual = $this->getUser();
$resultado = SecurityApiController::obtenerSeguidores($request, $usuarioActual, $seguidorRepository, $paginator);
return $this->render('security/seguidores.html.twig', $resultado);
}
#[Route('/seguidos', name: 'app_seguidos')]
#[IsGranted('ROLE_USER')]
function seguidos(SeguidorRepository $seguidorRepository, Request $request, PaginatorInterface $paginator) {
/** @var User $usuarioActual */
$usuarioActual = $this->getUser();
$resultado = SecurityApiController::obtenerSeguidos($request, $usuarioActual, $seguidorRepository, $paginator);
return $this->render('security/seguidos.html.twig', $resultado);
}
#[Route('/suscripciones-activas', name: 'app_suscripciones_activas')]
function suscripcionesActivas(visa_cybersource $visa_cybersource) {
if (!$this->isGranted('IS_AUTHENTICATED_FULLY')) return $this->redirectToRoute('app_logout');
/** @var User $usuario */
$usuario = $this->getUser();
$resultado = SecurityApiController::obtenerSuscripcionesActivas($usuario);
$resultado = array_merge($resultado, [
'reCaptchaSiteKey' => $this->getParameter('RECAPTCHA3_SITEKEY'),
'strFingerprint_ORG_ID' => $this->getParameter('VC_FINGERPRINT_ORG_ID'),
'strMerchantID' => $this->getParameter('VC_MERCHANT_ID'),
'strFingerPrintUnique' => md5(session_id())
]);
return $this->render('security/suscripciones_activas.html.twig', $resultado);
}
#[Route('/terminos/privacidad', name: 'app_politicas_de_privacidad')]
function politicasDePrivacidad(){
return $this->render('security/politicas_de_privacidad.html.twig');
}
public static function bloquearUsuario(User $bloqueador, User $bloqueado, Request $request, EntityManagerInterface $entityManager) {
$bloqueo = new Bloqueos();
$bloqueo->setBloqueador($bloqueador);
$bloqueo->setBloqueado($bloqueado);
$entityManager->persist($bloqueo);
$entityManager->flush();
}
/**
* @param string $key
* @return bool
*/
function checkBoxKey(string $key) {
if (explode('_', $key )[0] === 'check') {
return true;
}
else {
return false;
}
}
/**
* @param string $key
* @return mixed|string
*/
function getNombreCategoriaEnCheckBoxes(string $key) {
return explode('_', $key)[1];
}
}