<?php
namespace App\Controller;
use App\Entity\Usuario;
use App\Form\ChangePasswordFormType;
use App\Form\RegistrationFormType;
use App\Security\EmailVerifier;
use Doctrine\DBAL\Exception;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Asset\Packages;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mime\Address;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use SymfonyCasts\Bundle\ResetPassword\Exception\ResetPasswordExceptionInterface;
/**
* @Route("/usuario")
*/
class UsuarioController extends AbstractController
{
private EmailVerifier $emailVerifier;
public function __construct(EmailVerifier $emailVerifier)
{
$this->emailVerifier = $emailVerifier;
}
/**
* @Route("/", name="usuario_index")
* @param EntityManagerInterface $emi
* @param Request $request
* @return Response
*/
public function usuario(EntityManagerInterface $emi, Request $request): Response
{
$perfil = $request->getSession()->get('perfilLecciones');
$nivel = $perfil[3]["nivel"];
if ($nivel == 0) {
$this->addFlash('danger', 'El acceso al módulo de "Usuarios" está restringido.');
return $this->redirectToRoute('homepage');
}
$usuarios = $emi->getRepository(Usuario::class)->findAll();
return $this->render('usuario/index.html.twig', [
'usuarios' => $usuarios
]);
}
/**
* @Route("/edit/{id}", name="usuario_editar", methods={"GET", "POST"})
* @param EntityManagerInterface $emi
* @param Request $request
* @param Usuario $usuario
* @param Packages $packages
* @return Response | JsonResponse
*/
public function editar(EntityManagerInterface $emi, Request $request, Usuario $usuario, Packages $packages): Response
{
$perfil = $request->getSession()->get('perfilLecciones');
$nivel = $perfil[3]["nivel"];
if ($nivel == 0) {
$this->addFlash('danger', 'El acceso al módulo de "Usuarios" está restringido.');
return $this->redirectToRoute('homepage');
}
$form = $this->createForm(RegistrationFormType::class, $usuario);
$form->remove("contrasena");
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$emi->persist($usuario);
$emi->flush();
# Se genera la url del documento subido
$link_activar = $this->generateUrl('usuario_activar', ['idUsu' => $usuario->getIdUsu()], UrlGeneratorInterface::ABSOLUTE_URL);
$data = array(
'nombre' => $usuario->getNombre() . " " . $usuario->getPapellido() . " " . $usuario->getSapellido(),
'id' => $usuario->getIdUsu(),
'correo' => $usuario->getCorreo(),
'unidad' => $usuario->getUnidad()->getNombre(),
'rol' => "",
'estatus' => $form->get('estatus')->getData(),
'link_activar' => $link_activar,
'mensaje' => 'Información actualizada.'
);
if (!empty($usuario->getRol())){
$data['rol'] = $usuario->getRol()->getNombre();
}
return new JsonResponse($data);
}
if ($form->isSubmitted() && !$form->isValid()) {
$view = $this->renderView('usuario/modificar_usuario.html.twig', [
'form' => $form->createView(),
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_BAD_REQUEST);
return $response;
}
return $this->render('usuario/modificar_usuario.html.twig', [
'form' => $form->createView(),
]);
}
/*
* @Route("/estatus/{idUsu}/{estatus}", name="usuario_estatus", methods={"GET", "POST"})
* @param EntityManagerInterface $entityManager
* @param Request $request
* @ParamConverter("idUsu", class="App\Entity\Usuario")
* @return Response | JsonResponse
*
public function cambiarEstatus(EntityManagerInterface $entityManager, Request $request, Usuario $usuario): Response
{
$u = $entityManager->getRepository(Usuario::class)->findOneBy(['idUsu' => $request->get('idUsu')]);
#if ($request->get('estatus') == 0){
$u->setEstatus('Suspendido');
$entityManager->persist($u);
$entityManager->flush();
#} else {
# $usuario->setEstatus('Rechazado');
# $entityManager->persist($u);
# $entityManager->flush();
#}
return new JsonResponse([
'mensaje' => 'El usuario ' . $u->getNombre() . ' ' . $u->getPapellido() . ' ha cambiado de estatus a ' . $u->getEstatus() . '.',
'id' => $u->getIdUsu(),
'accion' => $request->get('estatus'),
'estatus' => $u->getEstatus()
]);
}*/
/**
* @Route("/rechazar/{idUsu}", name="usuario_rechazar", methods={"GET", "POST"})
* @param EntityManagerInterface $entityManager
* @param Request $request
* @param Usuario $usuario
* @return Response | JsonResponse
*/
public function rechazar(EntityManagerInterface $entityManager, Request $request, Usuario $usuario): Response
{
$usuario->setEstatus('Rechazado');
$entityManager->persist($usuario);
$entityManager->flush();
return new JsonResponse([
'mensaje' => 'El usuario ' . $usuario->getNombre() . ' ' . $usuario->getPapellido() . ' ha cambiado de estatus a ' . $usuario->getEstatus() . '.',
'id' => $usuario->getIdUsu(),
'estatus' => $usuario->getEstatus()
]);
}
/**
* @Route("/suspender/{idUsu}", name="usuario_suspender", methods={"GET", "POST"})
* @param EntityManagerInterface $entityManager
* @param Request $request
* @param Usuario $usuario
* @return Response | JsonResponse
*/
public function suspender(EntityManagerInterface $entityManager, Request $request, Usuario $usuario): Response
{
$usuario->setEstatus('Suspendido');
$entityManager->persist($usuario);
$entityManager->flush();
return new JsonResponse([
'mensaje' => 'El usuario ' . $usuario->getNombre() . ' ' . $usuario->getPapellido() . ' ha cambiado de estatus a ' . $usuario->getEstatus() . '.',
'id' => $usuario->getIdUsu(),
'estatus' => $usuario->getEstatus()
]);
}
/**
* @Route("/eliminar/{idUsu}", name="usuario_eliminar", methods={"GET", "POST"})
* @param EntityManagerInterface $emi
* @param Request $request
* @param Usuario $usuario
* @return Response | JsonResponse
* @throws Exception
*/
public function eliminar(EntityManagerInterface $emi, Request $request, Usuario $usuario): Response
{
$perfil = $request->getSession()->get('perfilLecciones');
$nivel = $perfil[3]["nivel"];
if ($nivel == 0) {
$this->addFlash('danger', 'El acceso al módulo de "Usuarios" está restringido.');
return $this->redirectToRoute('homepage');
}
$conn = $emi->getConnection();
# Se inicia la transacción
$conn->setAutoCommit(false);
$conn->beginTransaction();
$deleteQuery = "DELETE FROM usuario WHERE usuario.id_usu = :usuario";
$statement = $conn->prepare($deleteQuery);
$statement->bindValue('usuario', $usuario->getIdUsu());
$statement->executeQuery();
$conn->commit();
$data = [
'id' => $usuario->getIdUsu(),
'mensaje' => 'El usuario ' . $usuario->getNombre() . " " . $usuario->getPapellido() . " ha sido removido"
];
return new JsonResponse($data);
}
/**
* @Route("/contrasena/{idUsu}", name="usuario_contrasena", methods={"GET", "POST"})
* @param Request $request
* @param EntityManagerInterface $entityManager
* @param Usuario $usuario
* @param UserPasswordHasherInterface $userPasswordHasher
* @return Response | JsonResponse
*/
public function cambioContrasena(Request $request, EntityManagerInterface $entityManager, Usuario $usuario, UserPasswordHasherInterface $userPasswordHasher): Response
{
$perfil = $request->getSession()->get('perfilLecciones');
$nivel = $perfil[3]["nivel"];
if ($nivel == 0) {
$this->addFlash('danger', 'El acceso al módulo de "Usuarios" está restringido.');
return $this->redirectToRoute('homepage');
}
$form = $this->createForm(RegistrationFormType::class);
$form->remove("nombre");
$form->remove("papellido");
$form->remove("sapellido");
$form->remove("correo");
$form->remove("unidad");
$form->remove("area");
$form->remove("rol");
$form->remove("estatus");
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$encodedPassword = $userPasswordHasher->hashPassword(
$usuario,
$form->get('contrasena')->getData()
);
$usuario->setContrasena($encodedPassword);
$entityManager->persist($usuario);
$entityManager->flush();
return new JsonResponse(array('mensaje' => 'Se cambio la contraseña.'));
}
if ($form->isSubmitted() && !$form->isValid()) {
$view = $this->renderView('usuario/contrasena.html.twig', [
'form' => $form->createView(),
'nombre' => $usuario->getNombre() . " " . $usuario->getPapellido()
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_BAD_REQUEST);
return $response;
}
return $this->render('usuario/contrasena.html.twig', [
'form' => $form->createView(),
'nombre' => $usuario->getNombre() . " " . $usuario->getPapellido()
]);
}
/**
* @Route("/activar/{idUsu}", name="usuario_activar", methods={"GET", "POST"})
* @param Request $request
* @param EntityManagerInterface $entityManager
* @param Usuario $usuario
* @param UserPasswordHasherInterface $userPasswordHasher
* @return Response | JsonResponse
*/
public function activar(Request $request, EntityManagerInterface $entityManager, Usuario $usuario, UserPasswordHasherInterface $userPasswordHasher): Response
{
$data = [
'password' => '',
'correo' => ''
];
$data['password'] = $this->randomPassword();
$data['correo'] = $usuario->getCorreo();
// Encode(hash) the plain password, and set it.
$encodedPassword = $userPasswordHasher->hashPassword(
$usuario,
$data['password']
);
$usuario->setContrasena($encodedPassword);
$usuario->setEstatus('Aceptado');
$entityManager->flush();
// generate a signed url and email it to the user
$this->emailVerifier->sendEmailConfirmation('app_verify_email', $usuario,
(new TemplatedEmail())
->from(new Address('no-reply-ti@conalepmex.edu.mx', 'Registro de Incidencias'))
->to($data['correo'])
->subject('Solicitud de acceso aprobada')
->context(['data' => $data])
->htmlTemplate('registro/confirmation_email.html.twig')
);
// do anything else you need here, like send an email
return new JsonResponse(
[
'mensaje' => 'Se activó y notificó al usuario con el correo: ' . $usuario->getCorreo(),
'id' => $usuario->getIdUsu(),
'estatus' => $usuario->getEstatus()
]);
}
/**
* Validates and process the reset URL that the user clicked in their email.
*
* @Route("/reset", name="app_cambiar_contrasena")
*/
public function reset(Request $request, UserPasswordHasherInterface $userPasswordHasher, EntityManagerInterface $em): Response
{
/** @var Usuario $user */
$user = $this->getUser();
$form = $this->createForm(ChangePasswordFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Encode(hash) the plain password, and set it.
$encodedPassword = $userPasswordHasher->hashPassword(
$user,
$form->get('plainPassword')->getData()
);
$user->setContrasena($encodedPassword);
$em->flush();
$this->addFlash('success', 'Se ha actualizado la contraseña correctamente.');
return $this->redirectToRoute('homepage');
}
return $this->render('usuario/reset.html.twig', [
'resetForm' => $form->createView(),
]);
}
/**
* Acción para generar contraseñas aleatorias
*
* @return string
*/
protected function randomPassword(): string
{
$alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
$pass = array(); //remember to declare $pass as an array
$alphaLength = strlen($alphabet) - 1; //put the length -1 in cache
for ($i = 0; $i < 8; $i++) {
$n = rand(0, $alphaLength);
$pass[] = $alphabet[$n];
}
return implode($pass); //turn the array into a string
}
}