<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\Usuario;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
class LoginController extends AbstractController
{
/**
* @Route("/", name="app_login")
*/
public function index(AuthenticationUtils $authenticationUtils): Response
{
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
//El usuario se encuentra logueado, lo reedirigimos a la home
if($this->getUser()){
return $this->redirectToRoute('home');
}
return $this->render('login/index.html.twig', [
'last_username' => $lastUsername,
'error' => $error,
]);
}
/**
* @Route("/recuperar", name="recuperar")
*/
public function recuperar(Request $request)
{
$em = $this->getDoctrine()->getManager();
if ($request->getMethod() == "POST") {
$usuario = $em->getRepository(Usuario::class)->findOneBy(["email"=>$request->get("email")]);
if($usuario){
if($usuario->isActivo()==false){
return $this->redirectToRoute('app_login');
}
//Generamos un token para el usuario y se los asignamos
$token=str_shuffle("abcdefghijklmnopqrstuvwxyz0123456789".uniqid());
$usuario->setToken($token);
$em->persist($usuario);
$em->flush();
//Enviamos un correo.
$mailer = new PHPMailer(true);
//return $this->render("login/recuperar_email.html.twig",array("nombre"=>$usuario->getNombre()." ".$usuario->getApellidos(),"token"=>$token));
try {
// Configurar el servidor de correo
$mailer->isSMTP();
$mailer->Host = $_ENV["EMAIL_HOST"];
//$mailer->Port = $_ENV["EMAIL_PORT"];
//$mailer->SMTPDebug = 2;
//$mailer->SMTPSecure = $_ENV["EMAIL_SECURE"];
//$mailer->SMTPAutoTLS = false;
//$mailer->SMTPSecure = false;
$mailer->SMTPAuth = true;
$mailer->Username = $_ENV["EMAIL_USERNAME"];
$mailer->Password = $_ENV["EMAIL_PASSWORD"];
$mailer->SMTPSecure = $_ENV["EMAIL_SECURE"];
$mailer->Port = $_ENV["EMAIL_PORT"];
$mailer->From=$_ENV["EMAIL_FROM"];
$mailer->FromName=$_ENV["EMAIL_FROMNAME"];
$mailer->addAddress($usuario->getEmail());
// Contenido del correo
$mailer->isHTML(true);
$plantilla= $this->renderView('login/recuperar_email.html.twig',array("nombre"=>$usuario->getNombre()." ".$usuario->getApellidos(),"token"=>$token));
$mailer->msgHTML(utf8_decode($plantilla));
// Enviar el correo
$ex=$mailer->send();
} catch (Exception $e) {
$this->addFlash('error', 'Ocurrió un error al envíar el correo.');
}
}
//Reenviamos a la home
$this->addFlash('correcto', 'Si su usuario existe en la aplicación, recibirá un correo para modificar su clave.');
return $this->redirectToRoute('app_login');
}
return $this->render('login/recuperar.html.twig');
}
/**
* @Route("/cambiar_clave/{token}", name="cambiar_clave")
*/
public function cambiarClave(Request $request,UserPasswordEncoderInterface $encoder,$token)
{
$em = $this->getDoctrine()->getManager();
$usuario = $em->getRepository(Usuario::class)->findOneBy(["token"=>$token]);
if(!$usuario){
return $this->redirectToRoute('app_login');
}
//Nos mandan post, cambiamos la del usuario.
if ($request->getMethod() == "POST") {
$encoded = $encoder->encodePassword($usuario, $request->get("clave1"));
$usuario->setPassword($encoded);
$usuario->setToken(null);
$em->persist($usuario);
$em->flush();
$this->addFlash('correcto', 'Tu clave ha sido modificada correctamente.');
return $this->redirectToRoute('app_login');
}
//Renderizamos la plantilla de cambio de clave.
return $this->render('login/cambiar_clave.html.twig');
}
/**
* @Route("/logout", name="app_logout", methods={"GET"})
*/
public function logout(): void
{
}
/**
* @Route("/home", name="home")
*/
public function home(){
$em = $this->getDoctrine()->getManager();
//Si no esta activo o es operario, lo redirigimos fuera.
if($this->getUser()->isActivo() == false || $this->getUser()->getRol()->getId()==3){
return $this->redirectToRoute('app_logout');
}
/* PRL */
//DOCUMENTACIÓN USUARIOS
$usuariosSinDocumentacion="";
$usuariosCaducaMes="";
$usuariosCaducaProximo="";
$usuariosDocPendiente="";
//DOCUMENTACION MAQUINARIA
$maquinariasSinDocumentacion="";
$maquinariasCaducaMes="";
$maquinariasCaducaProximo="";
$maquinariasDocPendiente="";
//SINIESTRALIDAD
$usuariosBaja="";
//DOCUMENTACIÓN SUBPROYECTOS
$subproyectosSinDocumentacion="";
$subproyectosCaducaMes="";
$subproyectosCaducaProximo="";
$subproyectosDocPendiente="";
//INSPECCIÓN
$incidenciasSinResolver="";
//EQUIPOS PREVENCIÓN
$equiposprevencionCaducaMes="";
$equiposprevencionCaducaProximo="";
//MEDIDAS PREVENTIVAS
$medidaprevencionSinRealizar="";
$medidaprevencionCaducaMes="";
$medidaprevencionCaducaProximo="";
//Seguros
$segurosCaducaMes="";
$segurosCaducaProximo="";
//Permisos
$permisosTroncalesCaducaMes = "";
$permisosTroncalesCaducaProximo = "";
$requerimientosPendientesSubsanar="";
//proyectos
$proyectosSinDocumentacion="";
$proyectosCaducaMes="";
$proyectosCaducaProximo="";
$proyectosDocPendiente="";
/*PRL*/
if (($this->getUser()->getRol()->getId() == 6) or ($this->getUser()->getRol()->getId() == 1)){
//DOCUMENTACIÓN USUARIO
//Obtenemos los usuarios que no tienen ninguna documentacion subida
$sql = "SELECT COUNT(*) AS total
FROM usuario
WHERE activo = 1 AND interno = 1 AND id NOT IN (SELECT idusuario FROM usuario_documentaciontrabajador)";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$usuariosSinDocumentacion = $stmt->fetchAll()[0]["total"];
//Obtenermos los usuarios con Documentos que caducan el mes siguiente
$primerDiaMesSiguiente = date("Y-m-01", strtotime("first day of next month"));
$ultimoDiaMesSiguiente = date("Y-m-t", strtotime("last day of next month"));
//Obtenermos las maquinarias con Documentos caducados o que caducan este mes
$primerDiames = date("Y-m-01");
$ultimoDiames = date("Y-m-t");
$sql = "SELECT COUNT(*) AS total
FROM usuario
WHERE activo = 1
AND interno = 1
AND id IN (SELECT idusuario
FROM usuario_documentaciontrabajador
WHERE fechacaduca between '$primerDiames' AND '$ultimoDiames')";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$usuariosCaducaMes = $stmt->fetchAll()[0]["total"];
$sql = "SELECT COUNT(*) AS total
FROM usuario
WHERE activo = 1
AND interno = 1
AND id IN (SELECT idusuario
FROM usuario_documentaciontrabajador
WHERE fechacaduca between '$primerDiaMesSiguiente' and '$ultimoDiaMesSiguiente')";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$usuariosCaducaProximo = $stmt->fetchAll()[0]["total"];
//Obtenemos los usuarios con documentación pendiente
$sql = "SELECT COUNT(*) AS total
FROM usuario
WHERE activo = 1
AND interno = 1
AND id IN (SELECT idusuario
FROM usuario_documentaciontrabajador
WHERE pendiente = 1)";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$usuariosDocPendiente = $stmt->fetchAll()[0]["total"];
//DOCUMENTACIÓN MAQUINARIA
//Obtenemos las maquinarias que no tienen ninguna documentacion subida
$sql = "SELECT COUNT(*) AS total
FROM control_maquinariaempresa
WHERE activo = 1 AND id NOT IN (SELECT idcontrolmaquinariaempresa FROM maquinariadocumentacionempresa)";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$maquinariasSinDocumentacion = $stmt->fetchAll()[0]["total"];
$sql = "SELECT COUNT(*) AS total
FROM control_maquinariaempresa
WHERE activo = 1
AND id IN (SELECT idcontrolmaquinariaempresa
FROM maquinariadocumentacionempresa
WHERE fechacaduca between '$primerDiames' AND '$ultimoDiames')";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$maquinariasCaducaMes = $stmt->fetchAll()[0]["total"];
$sql = "SELECT COUNT(*) AS total
FROM control_maquinariaempresa
WHERE activo = 1
AND id IN (SELECT idcontrolmaquinariaempresa
FROM maquinariadocumentacionempresa
WHERE fechacaduca between '$primerDiaMesSiguiente' and '$ultimoDiaMesSiguiente')";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$maquinariasCaducaProximo = $stmt->fetchAll()[0]["total"];
//Obtenemos las maquinarias con documentación pendiente
$sql = "SELECT COUNT(*) AS total
FROM control_maquinariaempresa
WHERE activo = 1
AND id IN (SELECT idcontrolmaquinariaempresa
FROM maquinariadocumentacionempresa
WHERE pendiente = 1)";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$maquinariasDocPendiente = $stmt->fetchAll()[0]["total"];
//SINIESTRALIDAD
//Obtenemos los siniestros sin fecha de alta
$sql = "SELECT COUNT(*) AS total
FROM siniestralidad
WHERE fechaaltamedica is null";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$usuariosBaja = $stmt->fetchAll()[0]["total"];
//CONTROL OBRAS (SUBPROYECTOS)
//Obtenemos los proyectos que no tienen ninguna fase
$sql = "SELECT COUNT(*) AS total
FROM proyecto
WHERE activo = 1 AND id NOT IN (SELECT idproyecto FROM faseproyecto)";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$proyectosSinDocumentacion = $stmt->fetchAll()[0]["total"];
//Obtenermos los usuarios con Documentos caducados o que caducan este mes
$ultimoDiames = date("Y-m-t");
$sql = "SELECT COUNT(*) AS total
FROM proyecto
WHERE activo = 1
AND id IN (SELECT idproyecto
FROM faseproyecto fp inner join documentacionfasesubcontrata dfp on fp.id = dfp.idfaseproyecto
WHERE caduca = 1 and fechacaduca between '$primerDiames' AND '$ultimoDiames')";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$proyectosCaducaMes = $stmt->fetchAll()[0]["total"];
$sql = "SELECT COUNT(*) AS total
FROM proyecto
WHERE activo = 1
AND id IN (SELECT idproyecto
FROM faseproyecto fp inner join documentacionfasesubcontrata dfp on fp.id = dfp.idfaseproyecto
WHERE caduca = 1 and fechacaduca between '$primerDiaMesSiguiente' and '$ultimoDiaMesSiguiente')";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$proyectosCaducaProximo = $stmt->fetchAll()[0]["total"];
//Obtenemos los usuarios con documentación pendiente
$sql = "SELECT COUNT(*) AS total
FROM proyecto
WHERE activo = 1
AND id IN (SELECT idproyecto
FROM faseproyecto fp inner join documentacionfasesubcontrata dfp on fp.id = dfp.idfaseproyecto
WHERE idestadodocumentacionproyecto = 3)";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$proyectosDocPendiente = $stmt->fetchAll()[0]["total"];
//INCIDENCIAS INSPECCIÓN
//Obtenemos los usuarios con documentación pendiente
$sql = "SELECT COUNT(*) AS total FROM inspeccionobra io
inner join usuario u on io.idusuario = u.id
inner join troncal t on io.idtroncal = t.id
left join troncal_empresa te on te.idtroncal = t.id
left join empresas e on te.idempresa = e.id
WHERE resuelta = 0";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$incidenciasSinResolver = $stmt->fetchAll()[0]["total"];
//CONTROL DE EQUIPOS
$ultimoDiames = date("Y-m-t");
$sql = "SELECT COUNT(*) AS total
FROM equiposprevencion
WHERE fechaproximarevision between '$primerDiames' AND '$ultimoDiames'";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$equiposprevencionCaducaMes = $stmt->fetchAll()[0]["total"];
//Medidas de prevencion que caducan el mes siguiente
$primerDiaMesSiguiente = date("Y-m-01", strtotime("first day of next month"));
$ultimoDiaMesSiguiente = date("Y-m-t", strtotime("last day of next month"));
$sql = "SELECT COUNT(*) AS total
FROM equiposprevencion
WHERE fechaproximarevision between '$primerDiaMesSiguiente' and '$ultimoDiaMesSiguiente'";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$equiposprevencionCaducaProximo = $stmt->fetchAll()[0]["total"];
//MEDIDAS PREVENCIÓN
//Medidas de prevención sin realizar
$sql = "SELECT COUNT(*) AS total
FROM controlmedidasprevencion
WHERE realizada = 0";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$medidaprevencionSinRealizar = $stmt->fetchAll()[0]["total"];
//Medidas de prevencion que han caducado o caducan este mes
$ultimoDiames = date("Y-m-t");
$sql = "SELECT COUNT(*) AS total
FROM controlmedidasprevencion
WHERE fechaproximarevision between '$primerDiames' AND '$ultimoDiames'";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$medidaprevencionCaducaMes = $stmt->fetchAll()[0]["total"];
//Medidas de prevencion que caducan el mes siguiente
$primerDiaMesSiguiente = date("Y-m-01", strtotime("first day of next month"));
$ultimoDiaMesSiguiente = date("Y-m-t", strtotime("last day of next month"));
$sql = "SELECT COUNT(*) AS total
FROM controlmedidasprevencion
WHERE fechaproximarevision between '$primerDiaMesSiguiente' and '$ultimoDiaMesSiguiente'";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$medidaprevencionCaducaProximo = $stmt->fetchAll()[0]["total"];
$sql = "SELECT COUNT(*) AS total
FROM seguro
where activo = 1
and id IN (SELECT id
FROM seguro
WHERE fecha_caducidad between '$primerDiames' and '$ultimoDiames')";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$segurosCaducaMes = $stmt->fetchAll()[0]["total"];
$sql = "SELECT COUNT(*) AS total
FROM seguro
where activo = 1
and id IN (SELECT id
FROM seguro
WHERE fecha_caducidad between '$primerDiaMesSiguiente' and '$ultimoDiaMesSiguiente')";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$segurosCaducaProximo = $stmt->fetchAll()[0]["total"];
$sql = "SELECT COUNT(*) AS total
FROM permisos_troncales
WHERE id IN (SELECT id
FROM permisos_troncales
WHERE fecha_caducidad between '$primerDiames' and '$ultimoDiames')";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$permisosTroncalesCaducaMes = $stmt->fetchAll()[0]["total"];
$sql = "SELECT COUNT(*) AS total
FROM permisos_troncales
WHERE id IN (SELECT id
FROM permisos_troncales
WHERE fecha_caducidad between '$primerDiaMesSiguiente' and '$ultimoDiaMesSiguiente')";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$permisosTroncalesCaducaProximo = $stmt->fetchAll()[0]["total"];
$sql = "SELECT COUNT(*) AS total
FROM requerimiento_permisos_troncales
inner join permisos_troncales on permisos_troncales.id = requerimiento_permisos_troncales.idpermisostroncales
WHERE (requerimiento_permisos_troncales.subsanado = 0 or requerimiento_permisos_troncales.subsanado is null)";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$requerimientosPendientesSubsanar = $stmt->fetchAll()[0]["total"];
}
//Partes sin Revisar
/*ADMINISTRADOR*/
//if ($this->getUser()->getRol()->getId() == 1){
//Parte Almacen
$sql = "SELECT COUNT(*) AS total FROM partealmacen WHERE revision = 0";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$partealmacen = $stmt->fetchAll()[0]["total"];
//Parte Troncal
$sql = "SELECT COUNT(*) AS total FROM parte WHERE revision = 0";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$partetroncal = $stmt->fetchAll()[0]["total"];
//Parte CPD
$sql = "SELECT COUNT(*) AS total FROM partecpd WHERE revision = 0";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$partecpd = $stmt->fetchAll()[0]["total"];
//Parte FTTH
$sql = "SELECT COUNT(*) AS total FROM parteftth WHERE revision = 0";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$parteftth = $stmt->fetchAll()[0]["total"];
//Parte FUSIONADOR
$sql = "SELECT COUNT(*) AS total FROM partefusionador WHERE revision = 0";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$partefusionador = $stmt->fetchAll()[0]["total"];
//Parte IM
$sql = "SELECT COUNT(*) AS total FROM parteim WHERE revision = 0";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$parteim = $stmt->fetchAll()[0]["total"];
//Parte PEX
$sql = "SELECT COUNT(*) AS total FROM partepex WHERE revision = 0";
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$partepex = $stmt->fetchAll()[0]["total"];
//}
return $this->render('login/home.html.twig',[
'usuariosSinDocumentacion' => $usuariosSinDocumentacion,
'usuariosCaducaMes' => $usuariosCaducaMes,
'usuariosCaducaProximo' => $usuariosCaducaProximo,
'usuariosDocPendiente' => $usuariosDocPendiente,
'maquinariasSinDocumentacion' => $maquinariasSinDocumentacion,
'maquinariasCaducaMes' => $maquinariasCaducaMes,
'maquinariasCaducaProximo' => $maquinariasCaducaProximo,
'maquinariasDocPendiente' => $maquinariasDocPendiente,
'usuariosBaja' => $usuariosBaja,
'proyectosSinDocumentacion' => $proyectosSinDocumentacion,
'proyectosCaducaMes' => $proyectosCaducaMes,
'proyectosCaducaProximo' => $proyectosCaducaProximo,
'proyectosDocPendiente' => $proyectosDocPendiente,
'incidenciasSinResolver' => $incidenciasSinResolver,
'equiposprevencionCaducaMes' => $equiposprevencionCaducaMes,
'equiposprevencionCaducaProximo' => $equiposprevencionCaducaProximo,
'medidaprevencionSinRealizar' => $medidaprevencionSinRealizar,
'medidaprevencionCaducaMes' => $medidaprevencionCaducaMes,
'medidaprevencionCaducaProximo' => $medidaprevencionCaducaProximo,
'partealmacen' => $partealmacen,
'partetroncal' => $partetroncal,
'partecpd' => $partecpd,
'parteftth' => $parteftth,
'partefusionador' => $partefusionador,
'parteim' => $parteim,
'partepex' => $partepex,
'segurosCaducaMes'=>$segurosCaducaMes,
'segurosCaducaProximo'=>$segurosCaducaProximo,
'permisosTroncalesCaducaMes'=>$permisosTroncalesCaducaMes,
'permisosTroncalesCaducaProximo'=>$permisosTroncalesCaducaProximo,
'requerimientosPendientesSubsanar'=>$requerimientosPendientesSubsanar
]);
}
}