<?php
namespace App\Controller\Accesos;
use App\Entity\Accesos\Usuario;
use App\Form\Accesos\UsuarioType;
use App\Repository\Accesos\UsuarioRepository;
use App\Security\EmailVerifier;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
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\Contracts\Translation\TranslatorInterface;
use SymfonyCasts\Bundle\VerifyEmail\Exception\VerifyEmailExceptionInterface;
use App\Entity\Admin\Empleada;
use Symfony\Component\HttpFoundation\RedirectResponse;
use App\Entity\Admin\Contacto;
use App\Entity\Admin\ContactoProveedor;
#[Route('/accesos/usuario')]
class UsuarioController extends AbstractController {
private EmailVerifier $emailVerifier;
public function __construct(EmailVerifier $emailVerifier) {
$this->emailVerifier = $emailVerifier;
}
#[Route('/', name: 'app_accesos_usuario_index', methods: ['GET'])]
public function index(UsuarioRepository $usuarioRepository): Response {
$usuarioEmpleadas = $usuarioRepository->createQueryBuilder('u')
->where('u.empleada != :valor')
->setParameter('valor', 'NULL')
->getQuery()
->getResult();
$usuarioContactos = $usuarioRepository->createQueryBuilder('u')
->where('u.contacto != :valor')
->setParameter('valor', 'NULL')
->getQuery()
->getResult();
$usuarioContactoProveedores = $usuarioRepository->createQueryBuilder('u')
->where('u.contactoProveedor != :valor')
->setParameter('valor', 'NULL')
->getQuery()
->getResult();
return $this->render('accesos/usuario/index.html.twig', [
'usuarios' => $usuarioRepository->findAll(),
'empleadas' => $usuarioEmpleadas,
'contactoProveedores' => $usuarioContactoProveedores,
'contactos' => $usuarioContactos,
]);
}
#[Route('/registrarEmpleada/{id}', name: 'app_accesos_usuario_registro_empleada', methods: ['POST', 'GET'])]
public function registrarEmpleada(Empleada $empleada, EntityManagerInterface $entityManager): Response {
if (!$empleada->getUsuario()) {
$user = new Usuario();
$user->setEmail($empleada->getEmail());
$user->setNombre($empleada->getNombre());
$user->setEmpleada($empleada);
$user->setPassword("");
$user->setHabilitado(true);
$roles[] = 'ROLE_EMPLEADA';
$user->setRoles($roles);
$entityManager->persist($user);
$entityManager->flush();
$this->emailVerifier->sendEmailConfirmation('app_accesos_usuario_finalizar', $user,
(new TemplatedEmail())
->from(new Address('daiteke@aplicaciones.debamatika.com', 'DaitekeCRM'))
->to($user->getEmail())
->subject('Finalizar Registro Daiteke')
->htmlTemplate('accesos/usuario/emailRegistro.html.twig')
);
$mensaje = "usuario.mensajeEnlace";
$datos = $empleada->getNombre() . " (" . $empleada->getEmail() . ")";
$datos2 = "";
} else {
$datos = "";
$datos2 = $empleada->getNombre() . " (" . $empleada->getEmail() . ")";
if ($empleada->getUsuario()->isVerified()) {
$mensaje = "usuario.mensajeRegistrado";
} else {
$mensaje = "usuario.mensajePendienteEmail";
}
}
return $this->render('accesos/usuario/registrar.html.twig', [
'mensaje' => $mensaje,
'datos' => $datos,
'datos2' => $datos2,
'titulo' => 'usuario.nuevo'
]);
}
#[Route('/registrarContacto/{id}', name: 'app_accesos_usuario_registro_contacto', methods: ['POST', 'GET'])]
public function registrarContacto(Contacto $contacto, EntityManagerInterface $entityManager): Response {
if (!$contacto->getUsuario()) {
$user = new Usuario();
$user->setEmail($contacto->getEmail());
$user->setNombre($contacto->getNombre());
$user->setContacto($contacto);
$user->setPassword("");
$user->setHabilitado(true);
$roles[] = 'ROLE_EXTERNO';
$user->setRoles($roles);
$entityManager->persist($user);
$entityManager->flush();
$this->emailVerifier->sendEmailConfirmation('app_accesos_usuario_finalizar', $user,
(new TemplatedEmail())
->from(new Address('daiteke@aplicaciones.debamatika.com', 'Daiteke CRM'))
->to($user->getEmail())
->subject('Finalizar Registro Daiteke')
->htmlTemplate('accesos/usuario/emailRegistro.html.twig')
);
$mensaje = "usuario.mensajeEnlace";
$datos = $contacto->getNombre() . " (" . $contacto->getEmail() . ")";
$datos2 = "";
} else {
$datos = "";
$datos2 = $contacto->getNombre() . " (" . $contacto->getEmail() . ")";
if ($contacto->getUsuario()->isVerified()) {
$mensaje = "usuario.mensajeRegistrado";
} else {
$mensaje = "usuario.mensajePendienteEmail";
}
}
return $this->render('accesos/usuario/registrar.html.twig', [
'mensaje' => $mensaje,
'datos' => $datos,
'datos2' => $datos2,
'titulo' => 'usuario.nuevo',
]);
}
#[Route('/registrarContactoProveedor/{id}', name: 'app_accesos_usuario_registro_contactoproveedor', methods: ['POST', 'GET'])]
public function registrarContactoProveedor(ContactoProveedor $contactoProveedor, EntityManagerInterface $entityManager): Response {
if (!$contactoProveedor->getUsuario()) {
$user = new Usuario();
$user->setEmail($contactoProveedor->getEmail());
$user->setNombre($contactoProveedor->getNombre());
$user->setContactoProveedor($contactoProveedor);
$user->setPassword("");
$user->setHabilitado(true);
$roles[] = 'ROLE_EXTERNO';
$user->setRoles($roles);
$entityManager->persist($user);
$entityManager->flush();
$this->emailVerifier->sendEmailConfirmation('app_accesos_usuario_finalizar', $user,
(new TemplatedEmail())
->from(new Address('daiteke@aplicaciones.debamatika.com', 'Daiteke CRM'))
->to($user->getEmail())
->subject('Finalizar Registro Daiteke')
->htmlTemplate('accesos/usuario/emailRegistro.html.twig')
);
$mensaje = "usuario.mensajeEnlace";
$datos = $contactoProveedor->getNombre() . " (" . $contactoProveedor->getEmail() . ")";
$datos2 = "";
} else {
$datos = "";
$datos2 = $contactoProveedor->getNombre() . " (" . $contactoProveedor->getEmail() . ")";
if ($contactoProveedor->getUsuario()->isVerified()) {
$mensaje = "usuario.mensajeRegistrado";
} else {
$mensaje = "usuario.mensajePendienteEmail";
}
}
return $this->render('accesos/usuario/registrar.html.twig', [
'mensaje' => $mensaje,
'datos' => $datos,
'datos2' => $datos2,
'titulo' => 'usuario.nuevo'
]);
}
#[Route('/finalizar/registro', name: 'app_accesos_usuario_finalizar')]
public function finalizarRegistro(Request $request, UserPasswordHasherInterface $userPasswordHasher, UsuarioRepository $usuarioRepository): Response {
$id = $request->get('id');
if (null === $id) {
return $this->redirectToRoute('app_login', [], Response::HTTP_SEE_OTHER);
}
$user = $usuarioRepository->find($id);
if (!$user->isVerified()) {
$form = $this->createForm(UsuarioType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($form->get('password')->getData() == $form->get('passwordrep')->getData()) {
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$form->get('password')->getData()
)
);
$user->setIsVerified(true);
$usuarioRepository->add($user);
$redireccion = new RedirectResponse('/');
$redireccion->setTargetUrl($_SERVER['HTTP_REFERER']);
return $redireccion;
// return $this->redirectToRoute('app_accesos_usuario_finalizar', [], Response::HTTP_SEE_OTHER);
} else {
$this->addFlash('mal', 'usuario.mensajePasswordDistinta');
}
}
return $this->render('accesos/usuario/form.html.twig', [
'form' => $form->createView(),
'mensaje' => "",
]);
} else {
return $this->render('accesos/usuario/form.html.twig', [
'mensaje' => 'usuario.mensajeExito',
]);
}
}
//recoge el usuario conectado y cambia la password
#[Route('/cambiarPassword', name: 'app_accesos_usuario_cambiar_password', methods: ['POST', 'GET'])]
public function cambiarPasswordUsuario(UsuarioRepository $usuarioRepository): Response {
$user = $this->get('security.token_storage')->getToken()->getUser();
$user->setIsVerified(false);
$usuarioRepository->add($user);
$this->emailVerifier->sendEmailConfirmation('app_accesos_usuario_cambiar_password_form', $user,
(new TemplatedEmail())
->from(new Address('daiteke@aplicaciones.debamatika.com', 'Daiteke CRM'))
->to($user->getEmail())
->subject('Restablecer contraseña Daiteke')
->htmlTemplate('accesos/usuario/emailPassword.html.twig'));
$mensaje = 'usuario.mensajePasswordEmail';
$datos = $user->getNombre() . " (" . $user->getEmail() . ")";
return $this->render('accesos/usuario/registrar.html.twig', [
'mensaje' => $mensaje,
'datos' => $datos,
'datos2' => '',
'titulo' => 'usuario.cambiarPassword'
]);
}
//formulario para introducir el email y cambiar contraseña, comprueba que el email existe y manda email
#[Route('/recuperarpassword/', name: 'app_accesos_usuario_recuperar_password', methods: ['POST', 'GET'])]
public function recuperarPassword(Request $request, UsuarioRepository $usuarioRepository): Response {
$form = $this->createForm(\App\Form\Accesos\RecuperarPasswordType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$email = $form->get('email')->getData();
$user = $usuarioRepository->findOneBy(['email' => $email]);
if (is_null($user)) {
$this->addFlash('mal', 'usuario.emailError');
} else {
$user->setIsVerified(false);
$usuarioRepository->add($user);
$this->emailVerifier->sendEmailConfirmation('app_accesos_usuario_cambiar_password_form', $user,
(new TemplatedEmail())
->from(new Address('daiteke@aplicaciones.debamatika.com', 'Daiteke CRM'))
->to($user->getEmail())
->subject('Restablecer contraseña Daiteke')
->htmlTemplate('accesos/usuario/emailPassword.html.twig'));
$this->addFlash('bien', 'usuario.mensajePasswordEmail');
}
}
return $this->render('accesos/usuario/recuperarPassword.html.twig', [
'form' => $form->createView(),
]);
}
//formulario para cambiar contraseña
#[Route('/cambiarPasswordForm/', name: 'app_accesos_usuario_cambiar_password_form', methods: ['POST', 'GET'])]
public function cambiarPasswordForm(Request $request, UserPasswordHasherInterface $userPasswordHasher, UsuarioRepository $usuarioRepository): Response {
$id = $request->get('id');
if (null === $id) {
return $this->redirectToRoute('app_login', [], Response::HTTP_SEE_OTHER);
}
$user = $usuarioRepository->find($id);
if (!$user->isVerified()) {
$form = $this->createForm(UsuarioType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($form->get('password')->getData() == $form->get('passwordrep')->getData()) {
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$form->get('password')->getData()
)
);
$user->setIsVerified(true);
$usuarioRepository->add($user);
$redireccion = new RedirectResponse('/');
$redireccion->setTargetUrl($_SERVER['HTTP_REFERER']);
return $redireccion;
// return $this->redirectToRoute('app_accesos_usuario_finalizar', [], Response::HTTP_SEE_OTHER);
} else {
$this->addFlash('mal', 'usuario.mensajePasswordDistinta');
}
}
return $this->render('accesos/usuario/form.html.twig', [
'form' => $form->createView(),
'mensaje' => "",
]);
} else {
return $this->render('accesos/usuario/form.html.twig', [
'mensaje' => 'usuario.mensajeExitoPassword',
]);
}
}
#[Route('/cambiarEstado/{id}', name: 'app_accesos_usuario_cambiar_estado', methods: ['POST', 'GET'])]
public function cambiarEstado(Usuario $usuario, UsuarioRepository $usuarioRepository): Response {
if ($usuario->getHabilitado()) {
$usuario->setHabilitado(false);
} else {
$usuario->setHabilitado(true);
}
$usuarioRepository->add($usuario);
return new Response();
}
#[Route('/setAdmin/{id}', name: 'app_accesos_usuario_admin', methods: ['POST', 'GET'])]
public function setAdmin(Usuario $usuario, UsuarioRepository $usuarioRepository): Response {
if (in_array('ROLE_ADMIN', $usuario->getRoles(), true)) {
$roles[] = 'ROLE_EMPLEADA';
$usuario->setRoles($roles);
} else {
$roles = ['ROLE_ADMIN'];
$usuario->setRoles($roles);
}
$usuarioRepository->add($usuario);
return new Response();
}
/* #[Route('/new', name: 'app_accesos_usuario_new', methods: ['GET', 'POST'])]
public function new(Request $request, UsuarioRepository $usuarioRepository): Response {
$usuario = new Usuario();
$form = $this->createForm(UsuarioType::class, $usuario);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$usuarioRepository->add($usuario);
return $this->redirectToRoute('app_accesos_usuario_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('accesos/usuario/new.html.twig', [
'usuario' => $usuario,
'form' => $form,
]);
}
#[Route('/{id}', name: 'app_accesos_usuario_show', methods: ['GET'])]
public function show(Usuario $usuario): Response {
return $this->render('accesos/usuario/show.html.twig', [
'usuario' => $usuario,
]);
}
#[Route('/{id}/edit', name: 'app_accesos_usuario_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Usuario $usuario, UsuarioRepository $usuarioRepository): Response {
$form = $this->createForm(UsuarioType::class, $usuario);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$usuarioRepository->add($usuario);
return $this->redirectToRoute('app_accesos_usuario_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('accesos/usuario/edit.html.twig', [
'usuario' => $usuario,
'form' => $form,
]);
}
#[Route('/{id}', name: 'app_accesos_usuario_delete', methods: ['POST'])]
public function delete(Request $request, Usuario $usuario, UsuarioRepository $usuarioRepository): Response {
if ($this->isCsrfTokenValid('delete' . $usuario->getId(), $request->request->get('_token'))) {
$usuarioRepository->remove($usuario);
}
return $this->redirectToRoute('app_accesos_usuario_index', [], Response::HTTP_SEE_OTHER);
}
*/
}