<?php
namespace App\Controller;
use App\Entity\Role;
use App\Entity\Unidad;
use App\Entity\Usuario;
use App\Form\ChangePasswordFormType;
use App\Form\SolicitudAccesoType;
use App\Security\EmailVerifier;
use Doctrine\DBAL\Exception;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
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;
#[Route('/usuario')]
class UsuarioController extends AbstractController
{
public EntityManagerInterface $entityManager;
public EmailVerifier $emailVerifier;
/**
* @param EntityManagerInterface $entityManager
* @param EmailVerifier $emailVerifier
*/
public function __construct(EntityManagerInterface $entityManager, EmailVerifier $emailVerifier)
{
$this->entityManager = $entityManager;
$this->emailVerifier = $emailVerifier;
}
#[Route('/', name: 'usuario_index')]
public function index(Request $request): Response
{
/** @var Usuario $user */
$user = $this->getUser();
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[1]["nivel"];
if ($nivel == 0) {
$this->addFlash('danger', 'El acceso al módulo de "Usuarios" está restringido.');
return $this->redirectToRoute('homepage');
}
$data = [];
if ($user->getRol()->getIdRol() == 1) {
$form = $this->createFormBuilder()
->add('unidad', EntityType::class, [
'class' => Unidad::class,
'attr' => ['class' => 'form-control'],
'placeholder' => 'Todo',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.nombre', 'ASC')
;
}
])
->add('rol', EntityType::class, [
'class' => Role::class,
'attr' => ['class' => 'form-control'],
'placeholder' => 'Todo',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('r')
->orderBy('r.idRol', 'ASC')
;
}
])
->getForm();
$form->handleRequest($request);
$users = $this->entityManager->getRepository(Usuario::class)->findAll();
if ($request->isMethod('POST')) {
if ($form['unidad']->getData() == null && $form['rol']->getData() == null){
$users = $this->entityManager->getRepository(Usuario::class)->findAll();
} elseif($form['unidad']->getData() != null && $form['rol']->getData() == null) {
$users = $this->entityManager->getRepository(Usuario::class)->findBy([
'unidad' => $form['unidad']->getData()
]);
} elseif ($form['unidad']->getData() == null && $form['rol']->getData() != null) {
$users = $this->entityManager->getRepository(Usuario::class)->findBy([
'rol' => $form['rol']->getData()
]);
} else {
$users = $this->entityManager->getRepository(Usuario::class)->findBy([
'rol' => $form['rol']->getData(),
'unidad' => $form['unidad']->getData()
]);
}
foreach ($users as $u){
$urlEditar = $this->generateUrl('usuario_editar', ['id' => $u->getIdUsu()]);
$urlContrasena = $this->generateUrl('usuario_contrasena', ['idUsu' => $u->getIdUsu()]);
$urlActivar = $this->generateUrl('usuario_activar', ['idUsu' => $u->getIdUsu()]);
$urlRechazar = $this->generateUrl('usuario_rechazar', ['idUsu' => $u->getIdUsu()]);
$urlSuspender = $this->generateUrl('usuario_suspender', ['idUsu'=> $u->getIdUsu()]);
$urlEliminar = $this->generateUrl('usuario_eliminar', ['idUsu'=> $u->getIdUsu()]);
$data[] = [
'id' => $u->getIdUsu(),
'nombre' => $u->getNombre() . " " . $u->getPapellido() . " " . $u->getSapellido(),
'correo' => $u->getCorreo(),
'rol' => $u->getRol()->getNombre(),
'unidad' => $u->getUnidad()->getNombre(),
'estatus' => $u->getEstatus(),
'urlEditar' => $urlEditar,
'urlContrasena' => $urlContrasena,
'urlActivar' => $urlActivar,
'urlRechazar' => $urlRechazar,
'urlSuspender' => $urlSuspender,
'urlEliminar' => $urlEliminar
];
}
return new JsonResponse($data, Response::HTTP_OK);
}
}
if ($user->getRol()->getIdRol() == 2) {
$form = $this->createFormBuilder()
->add('unidad', EntityType::class, [
'class' => Unidad::class,
'attr' => ['class' => 'form-control'],
'placeholder' => 'Todo',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.nombre', 'ASC')
;
}
])
->add('rol', EntityType::class, [
'class' => Role::class,
'attr' => ['class' => 'form-control'],
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('r')
->where('r.idRol = 3')
;
}
])
->getForm();
$form->handleRequest($request);
$users = $this->entityManager->getRepository(Usuario::class)->findBy([
'rol' => 3
]);
if ($request->isMethod('POST')) {
if ($form['unidad']->getData() == null){
$users = $this->entityManager->getRepository(Usuario::class)->findBy([
'rol' => $form['rol']->getData()
]);
} else {
$users = $this->entityManager->getRepository(Usuario::class)->findBy([
'unidad' => $form['unidad']->getData(),
'rol' => $form['rol']->getData()
]);
}
foreach ($users as $u){
$urlEditar = $this->generateUrl('usuario_editar', ['id' => $u->getIdUsu()], UrlGeneratorInterface::ABSOLUTE_URL);
$urlContrasena = $this->generateUrl('usuario_contrasena', ['idUsu' => $u->getIdUsu()], UrlGeneratorInterface::ABSOLUTE_URL);
$urlActivar = $this->generateUrl('usuario_activar', ['idUsu' => $u->getIdUsu()], UrlGeneratorInterface::ABSOLUTE_URL);
$urlRechazar = $this->generateUrl('usuario_rechazar', ['idUsu' => $u->getIdUsu()], UrlGeneratorInterface::ABSOLUTE_URL);
$urlSuspender = $this->generateUrl('usuario_suspender', ['idUsu'=> $u->getIdUsu()], UrlGeneratorInterface::ABSOLUTE_URL);
$urlEliminar = $this->generateUrl('usuario_eliminar', ['idUsu'=> $u->getIdUsu()], UrlGeneratorInterface::ABSOLUTE_URL);
$data[] = [
'id' => $u->getIdUsu(),
'nombre' => $u->getNombre() . " " . $u->getPapellido() . " " . $u->getSapellido(),
'correo' => $u->getCorreo(),
'rol' => $u->getRol()->getNombre(),
'unidad' => $u->getUnidad()->getNombre(),
'estatus' => $u->getEstatus(),
'urlEditar' => $urlEditar,
'urlContrasena' => $urlContrasena,
'urlActivar' => $urlActivar,
'urlRechazar' => $urlRechazar,
'urlSuspender' => $urlSuspender,
'urlEliminar' => $urlEliminar
];
}
return new JsonResponse($data, Response::HTTP_OK);
}
}
if ($user->getRol()->getIdRol() == 3) {
$form = $this->createFormBuilder()
->add('unidad', EntityType::class, [
'class' => Unidad::class,
'attr' => ['class' => 'form-control'],
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.nombre', 'ASC')
;
}
])
->add('rol', EntityType::class, [
'class' => Role::class,
'attr' => ['class' => 'form-control'],
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('r')
->where('r.idRol = 3')
;
}
])
->getForm();
$form->handleRequest($request);
$users = $this->entityManager->getRepository(Usuario::class)->findBy([
'unidad' => $user->getUnidad()->getIdUni(),
'rol' => [3, 4]
]);
if ($request->isMethod('POST')) {
if (empty($form['unidad']->getData()) && empty($form['rol']->getData())) {
$users = $this->entityManager->getRepository(Usuario::class)->findAll();
} else {
$users = $this->entityManager->getRepository(Usuario::class)->findBy([
'unidad' => $form['unidad']->getData(),
'rol' => $form['rol']->getData()
]);
}
foreach ($users as $u){
$urlEditar = $this->generateUrl('usuario_editar', ['id' => $u->getIdUsu()], UrlGeneratorInterface::ABSOLUTE_URL);
$urlContrasena = $this->generateUrl('usuario_contrasena', ['idUsu' => $u->getIdUsu()], UrlGeneratorInterface::ABSOLUTE_URL);
$urlActivar = $this->generateUrl('usuario_activar', ['idUsu' => $u->getIdUsu()], UrlGeneratorInterface::ABSOLUTE_URL);
$urlRechazar = $this->generateUrl('usuario_rechazar', ['idUsu' => $u->getIdUsu()], UrlGeneratorInterface::ABSOLUTE_URL);
$urlSuspender = $this->generateUrl('usuario_suspender', ['idUsu'=> $u->getIdUsu()], UrlGeneratorInterface::ABSOLUTE_URL);
$urlEliminar = $this->generateUrl('usuario_eliminar', ['idUsu'=> $u->getIdUsu()], UrlGeneratorInterface::ABSOLUTE_URL);
$data[] = [
'id' => $u->getIdUsu(),
'nombre' => $u->getNombre() . " " . $u->getPapellido() . " " . $u->getSapellido(),
'correo' => $u->getCorreo(),
'rol' => $u->getRol()->getNombre(),
'unidad' => $u->getUnidad()->getNombre(),
'estatus' => $u->getEstatus(),
'urlEditar' => $urlEditar,
'urlContrasena' => $urlContrasena,
'urlActivar' => $urlActivar,
'urlRechazar' => $urlRechazar,
'urlSuspender' => $urlSuspender,
'urlEliminar' => $urlEliminar
];
}
return new JsonResponse($data, Response::HTTP_OK);
}
}
return $this->render('usuario/index.html.twig', [
'usuarios' => $users,
'form' => $form->createView(),
'data' => $data
]);
}
/**
* @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
{
/** @var Usuario $user */
$user = $this->getUser();
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[1]["nivel"];
if ($nivel == 0) {
$this->addFlash('danger', 'El acceso al módulo de "Usuarios" está restringido.');
return $this->redirectToRoute('homepage');
}
if ($user->getRol()->getIdRol() == 1){
$form = $this->createForm(SolicitudAccesoType::class, $usuario, array('data_info' => 1));
} elseif ($user->getRol()->getIdRol() == 2) {
$form = $this->createForm(SolicitudAccesoType::class, $usuario, array('data_info' => 2));
} else {
$form = $this->createForm(SolicitudAccesoType::class, $usuario, array('data_info' => 3));
}
if($user->getRol()->getIdRol() == 3){
$form->remove('nombre');
$form->remove('papellido');
$form->remove('sapellido');
$form->remove('correo');
$form->remove('contrasena');
$form->remove('unidad');
$form->remove('estatus');
} else {
$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(
'id' => $usuario->getIdUsu(),
'nombre' => $usuario->getNombre() . " " . $usuario->getPapellido() . " " . $usuario->getSapellido(),
'correo' => $usuario->getCorreo(),
'unidad' => $usuario->getUnidad()->getNombre(),
'rol' => "",
'estatus' => $usuario->getEstatus(),
'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;
}
$data = [
'id' => $usuario->getIdUsu(),
'nombre' => $usuario->getNombre(),
'papellido' => $usuario->getPapellido(),
'sapellido' => $usuario->getSapellido(),
'correo' => $usuario->getCorreo(),
'unidad' => $usuario->getUnidad()->getNombre(),
'estatus' => $usuario->getEstatus()
];
return $this->render('usuario/modificar_usuario.html.twig', [
'form' => $form->createView(),
'data' => $data
]);
}
/*
* @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('perfil');
$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('perfil');
$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(SolicitudAccesoType::class);
$form->remove("nombre");
$form->remove("papellido");
$form->remove("sapellido");
$form->remove("correo");
$form->remove("unidad");
$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', 'Sistema de Gestión de Mantenimiento para Equipos de Computo'))
->to($data['correo'])
->subject('Solicitud de acceso aprobada')
->context(['data' => $data])
->htmlTemplate('usuario/confirmation_email.html.twig')
);
// do anything else you need here, like send an email
$data = array(
'id' => $usuario->getIdUsu(),
'nombre' => $usuario->getNombre() . " " . $usuario->getPapellido() . " " . $usuario->getSapellido(),
'correo' => $usuario->getCorreo(),
'unidad' => $usuario->getUnidad()->getNombre(),
'rol' => "",
'estatus' => $usuario->getEstatus(),
'mensaje' => 'Se activó y notificó al usuario con el correo: ' . $usuario->getCorreo()
);
if (!empty($usuario->getRol())){
$data['rol'] = $usuario->getRol()->getNombre();
}
return new JsonResponse($data);
}
/**
* 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
}
}