<?php
namespace App\Controller;
use App\Entity\Area;
use App\Entity\DatosUsuario;
use App\Entity\Empresa;
use App\Entity\Estado;
use App\Entity\EstatusToken;
use App\Entity\EstatusUsuario;
use App\Entity\Municipio;
use App\Entity\Solicitante;
use App\Entity\SolicitanteTipo;
use App\Entity\Usuario;
use App\Entity\UsuarioConfirmacion;
use App\Entity\UsuarioTipo;
use App\Entity\UsuarioToken;
use App\Service\Random;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RequestStack;
//use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Notifier\Notification\Notification;
use Symfony\Component\Notifier\NotifierInterface;
use Symfony\Component\Notifier\Recipient\Recipient;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mime\NamedAddress;
/**
* @Route("/registro")
*/
class RegistroController extends AbstractController
{
/**
* @Route("/", name="registro")
*/
public function index()
{
$em = $this->getDoctrine()->getManager();
$estados = $em->getRepository(Estado::class)->findAll();
return $this->render('registro/index.html.twig', [
'estados' =>$estados
]);
}
/**
* @Route("/municipios", name="registro_municipios", methods={"GET"})
*/
public function municipios(Request $request)
{
$id_estado = $request->get('idEstado');
$search = $request->get('search');
$order =" order by m.municipio asc ";
$condiciones ="";
if(!empty($search)){
$condiciones = " and m.municipio like :busqueda ";
$order ="";
}
if (!empty($id_estado)){
$em = $this->getDoctrine()->getManager();
$dql = "select "
. " m.id, m.municipio "
. " from App\Entity\EstadoMunicipio em "
. " join em.municipio as m "
. " where em.estado=:idEstado "
. $condiciones
. $order;
$query = $em->createQuery($dql);
$query->setParameters([
'idEstado'=>$id_estado,
]);
if(!empty($search)){
$query->setParameter('busqueda', '%'.$search.'%');
}
return new JsonResponse($query->getArrayResult());
}
return new JsonResponse();
}
/**
* @Route("/nuevo", name="registro_nuevo", methods={"POST"})
*/
public function nuevo(Request $request, LoggerInterface $log, UserPasswordEncoderInterface $encoder, Random $random, MailerInterface $mailer, ParameterBagInterface $params)
{
$em = $this->getDoctrine()->getManager();
if ($request->isMethod('POST')) {
$curp = $request->get('curp');
$nombre = $request->get('nombre');
$apellido_paterno = $request->get('apellido_paterno');
$apellido_materno = $request->get('apellido_materno');
$estado = $request->get('estado');
$municipio = $request->get('municipio');
$colonia = $request->get('colonia');
$cp = $request->get('cp');
$direccion = $request->get('direccion');
$celular = $request->get('celular');
$telefono = $request->get('telefono');
$correo = $request->get('correo');
$contrasena = trim($request->get('contrasena'));
$curpEntity = $em->getRepository(Solicitante::class)->findOneBy(['curp'=>$curp]);
$usuarioEntity = $em->getRepository(Usuario::class)->findOneBy(['email'=>$correo]);
if (!$curpEntity){
if (!$usuarioEntity){
$usuario = new Usuario();
$encoded = $encoder->encodePassword($usuario, $contrasena);
$usuario->setEmail($correo);
$usuario->setRoles(['ROLE_VIRTUAL']);//rol de ventanilla virtual
$usuario->setPassword($encoded);
$usuario->setEstatusUsuario($em->find(EstatusUsuario::class, 3));//por confirmar
$usuario->setUsuarioTipo($em->find(UsuarioTipo::class, 2));//virtual
$em->persist($usuario);
$dt2 = new \DateTime("+1 month");//vence en un mes el token
$vence = $dt2->format("Y-m-d");
$token = $random->generateToken();
$usuarioToken = new UsuarioToken();
$usuarioToken->setUsuario($usuario);
$usuarioToken->setEstatusToken($em->find(EstatusToken::class, 1));//token activo
$usuarioToken->setToken($token);
$usuarioToken->setVence(new \DateTime($vence));
$usuarioToken->setCreated(new \DateTime('now'));
$em->persist($usuarioToken);
$datosUsuario = new DatosUsuario();
$datosUsuario->setUsuario($usuario);
$datosUsuario->setArea(1);//area virtual
$datosUsuario->setNombre($nombre);
$datosUsuario->setApellidoPaterno($apellido_paterno);
$datosUsuario->setApellidoMaterno($apellido_materno);
$datosUsuario->setCorreo($correo);
$em->persist($datosUsuario);
$solicitante = new Solicitante();
$solicitante->setNombre($nombre);
$solicitante->setApellidoPaterno($apellido_paterno);
$solicitante->setApellidoMaterno($apellido_materno);
$solicitante->setCelular($celular);
$solicitante->setTelefono($telefono);
$solicitante->setCorreo($correo);
$solicitante->setEstado($em->find(Estado::class, $estado));
$solicitante->setMunicipio($em->find(Municipio::class, $municipio));
$solicitante->setCalle($direccion);
$solicitante->setColonia($colonia);
$solicitante->setCp($cp);
$solicitante->setCreated(new \DateTime('now'));
$solicitante->setCurp($curp);
$solicitante->setUsuario($usuario);
$solicitante->setSolicitanteTipo($em->find(SolicitanteTipo::class, 2));//virtual
$solicitante->setUsuarioVirtual($usuario);
$em->persist($solicitante);
$em->flush();
$url = $this->generateUrl(
'registro_token',
['t' => $token],
UrlGeneratorInterface::ABSOLUTE_URL
);
try {
$nombre_de = $params->get('sistema_empresa');
$email = (new TemplatedEmail())
->from(new Address('contabilidad@iubeo.mx', $nombre_de))
->to(new Address($correo, $nombre))
->subject('Confirmación de correo Ventanilla')
->htmlTemplate('registro/confirmacionCorreo.html.twig')
->context([
'url' => $url,
'url_token' => $url,
'usuario' => $nombre.' '.$apellido_paterno.' '.$apellido_materno
]);
$mailer->send($email);
} catch (\Exception $e){
$log->critical($e->getMessage().' '.$e->getFile().' '.$e->getLine());
}
}else{
$this->addFlash('warning', 'No es posible registrarse, el correo ingresado ya esta registrado en el sistema.');
return $this->redirectToRoute('registro');
}
}else{
$this->addFlash('warning', 'El CURP ingresado ya esta registrado en el sistema, por favor verifique su curp');
return $this->redirectToRoute('registro');
}
return $this->redirectToRoute('registro_confirmar');
}
}
/**
* @Route("/confirmar", name="registro_confirmar", methods="GET")
*/
public function confirmar(Request $request): Response
{
return $this->render('registro/confirmar.html.twig', [
]);
}
/**
* @Route("/token", name="registro_token", methods="GET")
*/
public function token(Request $request, RequestStack $requestStack, NotifierInterface $notificaciones, LoggerInterface $log): Response
{
$em = $this->getDoctrine()->getManager();
$token = trim($request->get('t'));
$usuario_token_entity = $em->getRepository(UsuarioToken::class)->findOneBy(['token'=>$token, 'estatusToken'=>1]);
if($usuario_token_entity){
$usuario_confirmacion_entity = new UsuarioConfirmacion();
$usuario_confirmacion_entity->setUsuarioToken($usuario_token_entity);
$usuario_confirmacion_entity->setUrl($request->getUri());
$usuario_confirmacion_entity->setIp($request->getClientIp());
$usuario_confirmacion_entity->setCreated(new \DateTime('now'));
$em->persist($usuario_confirmacion_entity);
$usuario_token_entity->setEstatusToken($em->find(EstatusToken::class, 3));//confirmado
$usuario = $em->find(Usuario::class, $usuario_token_entity->getUsuario()->getId());
$usuario->setEstatusUsuario($em->find(EstatusUsuario::class, 1));
$em->flush();
$session = $requestStack->getSession();
// stores an attribute in the session for later reuse
$session->set('cuenta_confirmada', true);
$this->addFlash('success_confirmacion', 'Su correo ha sido confirmado correctamente, por favor inicie sesión.');
$solicitante = $em->getRepository(Solicitante::class)->findOneBy(['usuarioVirtual'=>$usuario->getId()]);
try {
$notification = (new Notification('Ventanilla Virtual, Gracias por registrarse, Ahora podrá realizar trámites en línea desde la comodidad de su hogar vuv.iubeo.mx'))
->content('')
->importance(Notification::IMPORTANCE_HIGH);
$recipient = new Recipient(
$solicitante->getCorreo(),
'+52'.$solicitante->getCelular()
);
$notificaciones->send($notification, $recipient);
} catch (\Exception $e){
$log->critical($e->getMessage().' '.$e->getFile().' '.$e->getLine());
}
return $this->redirectToRoute('login');
}else{
return $this->redirect('/');
}
}
/**
* @Route("/cuenta_confirmada", name="registro_cuenta_confirmada", methods="GET")
*/
public function cuenta_confirmada(Request $request, RequestStack $requestStack): Response
{
$session = $requestStack->getSession();
$session->remove('cuenta_confirmada');
return new Response();
}
}