src/Controller/UsuarioController.php line 291

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Usuario;
  4. use App\Form\ChangePasswordFormType;
  5. use App\Form\RegistrationFormType;
  6. use App\Security\EmailVerifier;
  7. use Doctrine\DBAL\Exception;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\Asset\Packages;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\Mime\Address;
  16. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  19. use Symfony\Contracts\Translation\TranslatorInterface;
  20. use SymfonyCasts\Bundle\ResetPassword\Exception\ResetPasswordExceptionInterface;
  21. /**
  22.  * @Route("/usuario")
  23.  */
  24. class UsuarioController extends AbstractController
  25. {
  26.     private EmailVerifier $emailVerifier;
  27.     public function __construct(EmailVerifier $emailVerifier)
  28.     {
  29.         $this->emailVerifier $emailVerifier;
  30.     }
  31.     /**
  32.      * @Route("/", name="usuario_index")
  33.      * @param EntityManagerInterface $emi
  34.      * @param Request $request
  35.      * @return Response
  36.      */
  37.     public function usuario(EntityManagerInterface $emiRequest $request): Response
  38.     {
  39.         $perfil $request->getSession()->get('perfilLecciones');
  40.         $nivel $perfil[3]["nivel"];
  41.         if ($nivel == 0) {
  42.             $this->addFlash('danger''El acceso al módulo de "Usuarios" está restringido.');
  43.             return $this->redirectToRoute('homepage');
  44.         }
  45.         $usuarios $emi->getRepository(Usuario::class)->findAll();
  46.         return $this->render('usuario/index.html.twig', [
  47.             'usuarios' => $usuarios
  48.         ]);
  49.     }
  50.     /**
  51.      * @Route("/edit/{id}", name="usuario_editar", methods={"GET", "POST"})
  52.      * @param EntityManagerInterface $emi
  53.      * @param Request $request
  54.      * @param Usuario $usuario
  55.      * @param Packages $packages
  56.      * @return Response | JsonResponse
  57.      */
  58.     public function editar(EntityManagerInterface $emiRequest $requestUsuario $usuarioPackages $packages): Response
  59.     {
  60.         $perfil $request->getSession()->get('perfilLecciones');
  61.         $nivel $perfil[3]["nivel"];
  62.         if ($nivel == 0) {
  63.             $this->addFlash('danger''El acceso al módulo de "Usuarios" está restringido.');
  64.             return $this->redirectToRoute('homepage');
  65.         }
  66.         $form $this->createForm(RegistrationFormType::class, $usuario);
  67.         $form->remove("contrasena");
  68.         $form->handleRequest($request);
  69.         if ($form->isSubmitted() && $form->isValid()) {
  70.             $emi->persist($usuario);
  71.             $emi->flush();
  72.             # Se genera la url del documento subido
  73.             $link_activar $this->generateUrl('usuario_activar', ['idUsu' => $usuario->getIdUsu()], UrlGeneratorInterface::ABSOLUTE_URL);
  74.             $data = array(
  75.                 'nombre' => $usuario->getNombre() . " " $usuario->getPapellido() . " " $usuario->getSapellido(),
  76.                 'id' => $usuario->getIdUsu(),
  77.                 'correo' => $usuario->getCorreo(),
  78.                 'unidad' => $usuario->getUnidad()->getNombre(),
  79.                 'rol' => "",
  80.                 'estatus' => $form->get('estatus')->getData(),
  81.                 'link_activar' => $link_activar,
  82.                 'mensaje' => 'Información actualizada.'
  83.             );
  84.             if (!empty($usuario->getRol())){
  85.                 $data['rol'] = $usuario->getRol()->getNombre();
  86.             }
  87.             return new JsonResponse($data);
  88.         }
  89.         if ($form->isSubmitted() && !$form->isValid()) {
  90.             $view $this->renderView('usuario/modificar_usuario.html.twig', [
  91.                 'form' => $form->createView(),
  92.             ]);
  93.             $response = new JsonResponse(['form' => $view]);
  94.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  95.             return $response;
  96.         }
  97.         return $this->render('usuario/modificar_usuario.html.twig', [
  98.             'form' => $form->createView(),
  99.         ]);
  100.     }
  101.     /*
  102.      * @Route("/estatus/{idUsu}/{estatus}", name="usuario_estatus", methods={"GET", "POST"})
  103.      * @param EntityManagerInterface $entityManager
  104.      * @param Request $request
  105.      * @ParamConverter("idUsu", class="App\Entity\Usuario")
  106.      * @return Response | JsonResponse
  107.      *
  108.     public function cambiarEstatus(EntityManagerInterface $entityManager, Request $request, Usuario $usuario): Response
  109.     {
  110.         $u = $entityManager->getRepository(Usuario::class)->findOneBy(['idUsu' => $request->get('idUsu')]);
  111.         #if ($request->get('estatus') == 0){
  112.             $u->setEstatus('Suspendido');
  113.             $entityManager->persist($u);
  114.             $entityManager->flush();
  115.         #} else {
  116.         #    $usuario->setEstatus('Rechazado');
  117.         #    $entityManager->persist($u);
  118.         #    $entityManager->flush();
  119.         #}
  120.         return new JsonResponse([
  121.             'mensaje' => 'El usuario ' . $u->getNombre() . ' ' . $u->getPapellido() . ' ha cambiado de estatus a ' . $u->getEstatus() . '.',
  122.             'id' => $u->getIdUsu(),
  123.             'accion' => $request->get('estatus'),
  124.             'estatus' => $u->getEstatus()
  125.         ]);
  126.     }*/
  127.     /**
  128.      * @Route("/rechazar/{idUsu}", name="usuario_rechazar", methods={"GET", "POST"})
  129.      * @param EntityManagerInterface $entityManager
  130.      * @param Request $request
  131.      * @param Usuario $usuario
  132.      * @return Response | JsonResponse
  133.      */
  134.     public function rechazar(EntityManagerInterface $entityManagerRequest $requestUsuario $usuario): Response
  135.     {
  136.         $usuario->setEstatus('Rechazado');
  137.         $entityManager->persist($usuario);
  138.         $entityManager->flush();
  139.         return new JsonResponse([
  140.             'mensaje' => 'El usuario ' $usuario->getNombre() . ' ' $usuario->getPapellido() . ' ha cambiado de estatus a ' $usuario->getEstatus() . '.',
  141.             'id' => $usuario->getIdUsu(),
  142.             'estatus' => $usuario->getEstatus()
  143.         ]);
  144.     }
  145.     /**
  146.      * @Route("/suspender/{idUsu}", name="usuario_suspender", methods={"GET", "POST"})
  147.      * @param EntityManagerInterface $entityManager
  148.      * @param Request $request
  149.      * @param Usuario $usuario
  150.      * @return Response | JsonResponse
  151.      */
  152.     public function suspender(EntityManagerInterface $entityManagerRequest $requestUsuario $usuario): Response
  153.     {
  154.         $usuario->setEstatus('Suspendido');
  155.         $entityManager->persist($usuario);
  156.         $entityManager->flush();
  157.         return new JsonResponse([
  158.             'mensaje' => 'El usuario ' $usuario->getNombre() . ' ' $usuario->getPapellido() . ' ha cambiado de estatus a ' $usuario->getEstatus() . '.',
  159.             'id' => $usuario->getIdUsu(),
  160.             'estatus' => $usuario->getEstatus()
  161.         ]);
  162.     }
  163.     /**
  164.      * @Route("/eliminar/{idUsu}", name="usuario_eliminar", methods={"GET", "POST"})
  165.      * @param EntityManagerInterface $emi
  166.      * @param Request $request
  167.      * @param Usuario $usuario
  168.      * @return Response | JsonResponse
  169.      * @throws Exception
  170.      */
  171.     public function eliminar(EntityManagerInterface $emiRequest $requestUsuario $usuario): Response
  172.     {
  173.         $perfil $request->getSession()->get('perfilLecciones');
  174.         $nivel $perfil[3]["nivel"];
  175.         if ($nivel == 0) {
  176.             $this->addFlash('danger''El acceso al módulo de "Usuarios" está restringido.');
  177.             return $this->redirectToRoute('homepage');
  178.         }
  179.         $conn $emi->getConnection();
  180.         # Se inicia la transacción
  181.         $conn->setAutoCommit(false);
  182.         $conn->beginTransaction();
  183.         $deleteQuery "DELETE FROM usuario WHERE usuario.id_usu = :usuario";
  184.         $statement $conn->prepare($deleteQuery);
  185.         $statement->bindValue('usuario'$usuario->getIdUsu());
  186.         $statement->executeQuery();
  187.         $conn->commit();
  188.         $data = [
  189.             'id' => $usuario->getIdUsu(),
  190.             'mensaje' => 'El usuario ' $usuario->getNombre() . " " $usuario->getPapellido() . " ha sido removido"
  191.         ];
  192.         return new JsonResponse($data);
  193.     }
  194.     /**
  195.      * @Route("/contrasena/{idUsu}", name="usuario_contrasena", methods={"GET", "POST"})
  196.      * @param Request $request
  197.      * @param EntityManagerInterface $entityManager
  198.      * @param Usuario $usuario
  199.      * @param UserPasswordHasherInterface $userPasswordHasher
  200.      * @return Response | JsonResponse
  201.      */
  202.     public function cambioContrasena(Request $requestEntityManagerInterface $entityManagerUsuario $usuarioUserPasswordHasherInterface $userPasswordHasher): Response
  203.     {
  204.         $perfil $request->getSession()->get('perfilLecciones');
  205.         $nivel $perfil[3]["nivel"];
  206.         if ($nivel == 0) {
  207.             $this->addFlash('danger''El acceso al módulo de "Usuarios" está restringido.');
  208.             return $this->redirectToRoute('homepage');
  209.         }
  210.         $form $this->createForm(RegistrationFormType::class);
  211.         $form->remove("nombre");
  212.         $form->remove("papellido");
  213.         $form->remove("sapellido");
  214.         $form->remove("correo");
  215.         $form->remove("unidad");
  216.         $form->remove("area");
  217.         $form->remove("rol");
  218.         $form->remove("estatus");
  219.         $form->handleRequest($request);
  220.         if ($form->isSubmitted() && $form->isValid()) {
  221.             $encodedPassword $userPasswordHasher->hashPassword(
  222.                 $usuario,
  223.                 $form->get('contrasena')->getData()
  224.             );
  225.             $usuario->setContrasena($encodedPassword);
  226.             $entityManager->persist($usuario);
  227.             $entityManager->flush();
  228.             return new JsonResponse(array('mensaje' => 'Se cambio la contraseña.'));
  229.         }
  230.         if ($form->isSubmitted() && !$form->isValid()) {
  231.             $view $this->renderView('usuario/contrasena.html.twig', [
  232.                 'form' => $form->createView(),
  233.                 'nombre' => $usuario->getNombre() . " " $usuario->getPapellido()
  234.             ]);
  235.             $response = new JsonResponse(['form' => $view]);
  236.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  237.             return $response;
  238.         }
  239.         return $this->render('usuario/contrasena.html.twig', [
  240.             'form' => $form->createView(),
  241.             'nombre' => $usuario->getNombre() . " " $usuario->getPapellido()
  242.         ]);
  243.     }
  244.     /**
  245.      * @Route("/activar/{idUsu}", name="usuario_activar", methods={"GET", "POST"})
  246.      * @param Request $request
  247.      * @param EntityManagerInterface $entityManager
  248.      * @param Usuario $usuario
  249.      * @param UserPasswordHasherInterface $userPasswordHasher
  250.      * @return Response | JsonResponse
  251.      */
  252.     public function activar(Request $requestEntityManagerInterface $entityManagerUsuario $usuarioUserPasswordHasherInterface $userPasswordHasher): Response
  253.     {
  254.         $data = [
  255.             'password' => '',
  256.             'correo' => ''
  257.         ];
  258.         $data['password'] = $this->randomPassword();
  259.         $data['correo'] = $usuario->getCorreo();
  260.         // Encode(hash) the plain password, and set it.
  261.         $encodedPassword $userPasswordHasher->hashPassword(
  262.             $usuario,
  263.             $data['password']
  264.         );
  265.         $usuario->setContrasena($encodedPassword);
  266.         $usuario->setEstatus('Aceptado');
  267.         $entityManager->flush();
  268.         // generate a signed url and email it to the user
  269.         $this->emailVerifier->sendEmailConfirmation('app_verify_email'$usuario,
  270.             (new TemplatedEmail())
  271.                 ->from(new Address('no-reply-ti@conalepmex.edu.mx''Registro de Incidencias'))
  272.                 ->to($data['correo'])
  273.                 ->subject('Solicitud de acceso aprobada')
  274.                 ->context(['data' => $data])
  275.                 ->htmlTemplate('registro/confirmation_email.html.twig')
  276.         );
  277.         // do anything else you need here, like send an email
  278.         return new JsonResponse(
  279.             [
  280.                 'mensaje' => 'Se activó y notificó al usuario con el correo: ' $usuario->getCorreo(),
  281.                 'id' => $usuario->getIdUsu(),
  282.                 'estatus' => $usuario->getEstatus()
  283.             ]);
  284.     }
  285.     /**
  286.      * Validates and process the reset URL that the user clicked in their email.
  287.      *
  288.      * @Route("/reset", name="app_cambiar_contrasena")
  289.      */
  290.     public function reset(Request $requestUserPasswordHasherInterface $userPasswordHasherEntityManagerInterface $em): Response
  291.     {
  292.         /** @var Usuario $user */
  293.         $user $this->getUser();
  294.         $form $this->createForm(ChangePasswordFormType::class);
  295.         $form->handleRequest($request);
  296.         if ($form->isSubmitted() && $form->isValid()) {
  297.             // Encode(hash) the plain password, and set it.
  298.             $encodedPassword $userPasswordHasher->hashPassword(
  299.                 $user,
  300.                 $form->get('plainPassword')->getData()
  301.             );
  302.             $user->setContrasena($encodedPassword);
  303.             $em->flush();
  304.             $this->addFlash('success''Se ha actualizado la contraseña correctamente.');
  305.             return $this->redirectToRoute('homepage');
  306.         }
  307.         return $this->render('usuario/reset.html.twig', [
  308.             'resetForm' => $form->createView(),
  309.         ]);
  310.     }
  311.     /**
  312.      * Acción para generar contraseñas aleatorias
  313.      *
  314.      * @return string
  315.      */
  316.     protected function randomPassword(): string
  317.     {
  318.         $alphabet "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
  319.         $pass = array(); //remember to declare $pass as an array
  320.         $alphaLength strlen($alphabet) - 1//put the length -1 in cache
  321.         for ($i 0$i 8$i++) {
  322.             $n rand(0$alphaLength);
  323.             $pass[] = $alphabet[$n];
  324.         }
  325.         return implode($pass); //turn the array into a string
  326.     }
  327. }