<?php
namespace App\Controller\Comun;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\Comun\NotificacionRepository;
use App\Entity\Comun\Notificacion;
use App\Entity\Admin\Empleada;
use App\Repository\Accesos\UsuarioRepository;
use App\Repository\Comun\TipoNotificacionRepository;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Entity\Comun\TipoNotificacion;
use App\Repository\Comun\FichajeDiarioRepository;
use App\Service\FichajeService;
use App\Entity\Comun\FichajeDiario;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Address;
#[Route('/comun/notificacion')]
class NotificacionController extends AbstractController {
private $fichajeService;
public function __construct(FichajeService $fichajeService) {
$this->fichajeService = $fichajeService;
}
#[Route('/', name: 'app_comun_notificacion', methods: ['POST', 'GET'])]
public function index(NotificacionRepository $notificacionRepository): Response {
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$notificaciones = $notificacionRepository->findBy(['destinatario' => $empleada, 'leido' => 0], ['fecha' => 'DESC']);
$notificacionesLeidas = $notificacionRepository->findBy(['destinatario' => $empleada, 'leido' => 1], ['fecha' => 'DESC']);
return $this->render('comun/notificacion/index.html.twig', [
'controller_name' => 'NotificacionController',
'notificaciones' => $notificaciones,
'notificacionesLeidas' => $notificacionesLeidas,
]);
}
#[Route('/index', name: 'app_comun_notificacion_index', methods: ['POST', 'GET'])]
public function index2(NotificacionRepository $notificacionRepository): Response {
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$notificaciones = $notificacionRepository->findBy(['destinatario' => $empleada, 'leido' => 0], ['fecha' => 'DESC']);
$notificacionesLeidas = $notificacionRepository->findBy(['destinatario' => $empleada, 'leido' => 1], ['fecha' => 'DESC']);
return $this->render('comun/notificacion/index2.html.twig', [
'controller_name' => 'NotificacionController',
'notificaciones' => $notificaciones,
'notificacionesLeidas' => $notificacionesLeidas,
]);
}
#[Route('/leer/{notificacion}', name: 'app_comun_notificacion_leer', methods: ['POST', 'GET'])]
public function leerNotificacion(NotificacionRepository $notificacionRepository, Notificacion $notificacion): Response {
$notificacion->setLeido(true);
$notificacionRepository->add($notificacion);
return $this->redirect($this->generateUrl('app_comun_notificacion', []));
}
#[Route('/leertodas/', name: 'app_comun_notificacion_leer_todas', methods: ['POST', 'GET'])]
public function leerNotificacionTodas(NotificacionRepository $notificacionRepository): Response {
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$notificaciones = $notificacionRepository->findBy(['destinatario' => $empleada, 'leido' => 0], ['fecha' => 'DESC']);
foreach ($notificaciones as $notificacion) {
$notificacion->setLeido(true);
$notificacionRepository->add($notificacion);
}
return $this->redirect($this->generateUrl('app_comun_notificacion', []));
}
#[Route('/generar/{empleada}', name: 'app_comun_notificacion_generar', methods: ['POST', 'GET'])]
public function generar(NotificacionRepository $notificacionRepository, Empleada $empleada = null, UsuarioRepository $usuarioRepository, \App\Repository\Comun\TipoNotificacionRepository $tipoNotificacionRepository): Response {
$administradores = $usuarioRepository->getAdministradores();
$notificacion = new Notificacion();
$notificacion->setFecha(date_create('now'));
$notificacion->setEmpleada($empleada);
$notificacion->setLeido(false);
$notificacion->setTextoes("Notificacion");
$notificacion->setTextoeus("Notifikazioa");
$notificacion->setTipo($tipoNotificacionRepository->find(1));
$notificacion->setDestinatario($empleada);
$notificacionRepository->add($notificacion);
foreach ($administradores as $admin) {
$noti = new Notificacion();
$noti->setFecha(date_create('now'));
$noti->setEmpleada($empleada);
$noti->setLeido(false);
$noti->setTextoes("Notificacion");
$noti->setTextoeus("Notifikazioa");
$noti->setTipo($tipoNotificacionRepository->find(1));
$noti->setDestinatario($admin->getEmpleada());
$notificacionRepository->add($noti);
}
return $this->render('comun/notificacion/index.html.twig', [
'controller_name' => 'NotificacionController',
]);
}
#[Route('/mostrar/popup', name: 'app_comun_notificacion_mostrar_popup', methods: ['POST', 'GET'])]
public function mostrarNotificacionesPopUp(NotificacionRepository $notificacionRepository): Response {
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$notificaciones = $notificacionRepository->notificacionesNoLeidasCinco($empleada);
$cantidad = count($notificacionRepository->findBy(['destinatario' => $empleada, 'leido' => 0], ['fecha' => 'DESC']));
return $this->render('comun/notificacion/popup.html.twig', [
'notificaciones' => $notificaciones,
'cantidad' => $cantidad,
]);
}
#[Route('/horas', name: 'app_comun_notificacion_horas', methods: ['GET', 'POST'])]
public function comprobarHorasTrabajadas(): Response {
$em = $this->getDoctrine()->getManager();
$empleadas = $em->getRepository("App:Admin\Empleada")->findAll();
$globales = $em->getRepository("App:Admin\Globales")->findOneby([]);
$tipoNotificacionRepository = $em->getRepository("App:Comun\TipoNotificacion");
foreach ($empleadas as $empleada) {
$tiempo = $this->fichajeService->calcularHorasPorFecha($empleada, date_create('now'));
if ($tiempo['horas'] != 0 || $tiempo['minutos'] != 0 || $tiempo['segundos'] != 0) { //solo notifica si has trabajado
$tiempoMinutos = ($tiempo['horas'] * 60) + $tiempo['minutos'];
$maximo = (intval($globales->getHoraAvisoMax()->format("H")) * 60) + intval($globales->getHoraAvisoMax()->format("i"));
$minimo = (intval($globales->getHoraAvisoMin()->format("H")) * 60) + intval($globales->getHoraAvisoMin()->format("i"));
if ($tiempoMinutos < $minimo) {
$horas = $this->fichajeService->convertirMinutos($minimo - $tiempoMinutos);
$textoes = $empleada->getNombre() . " ha trabajado " . $tiempo['horas'] . "h " . $tiempo['minutos'] . "m , " . $horas . " horas menos de lo establecido";
$textoeus = $empleada->getNombre() . " " . $tiempo['horas'] . "h " . $tiempo['minutos'] . "m egin du lan , ezarritakoa baino " . $horas . " gutxiago";
$tipo = $tipoNotificacionRepository->findOneBy(['descripcion' => 'tipoNotificacion.horasNoCumplidas']);
$this->generarNotificacion($empleada, $empleada->getId(), $tipo, $textoeus, $textoes);
}
if ($tiempoMinutos > $maximo) {
$horas = $this->fichajeService->convertirMinutos($tiempoMinutos - $maximo);
$textoes = $empleada->getNombre() . " ha trabajado un total de " . $tiempo['horas'] . "h " . $tiempo['minutos'] . "m , " . $horas . " horas mas de lo establecido";
$textoeus = $empleada->getNombre() . " " . $tiempo['horas'] . "h " . $tiempo['minutos'] . "m egin du lan, gehienezko kopurua baino " . $horas . " gehiago";
$tipo = $tipoNotificacionRepository->findOneBy(['descripcion' => 'tipoNotificacion.horasSuperadas']);
$this->generarNotificacion($empleada, $empleada->getId(), $tipo, $textoeus, $textoes);
}
}
}
return new Response();
}
#[Route('/cerrarfichaje', name: 'app_comun_notificacion_cerrar_fichaje', methods: ['GET', 'POST'])]
public function cerrarFichaje(): Response {
$em = $this->getDoctrine()->getManager();
$fichajeDiarioRepository = $em->getRepository("App:Comun\FichajeDiario");
$empleadas = $em->getRepository("App:Admin\Empleada")->findAll();
$globales = $em->getRepository("App:Admin\Globales")->findOneby([]);
$tipoNotificacionRepository = $em->getRepository("App:Comun\TipoNotificacion");
foreach ($empleadas as $empleada) {
$ultimoFichaje = $fichajeDiarioRepository->findOneBy(['empleada' => $empleada], ['fecha' => 'DESC']);
if (!is_null($ultimoFichaje)) {
if ($ultimoFichaje->getEntrada()) {
$fecha = date_create_from_format("Y-m-d H:i", $ultimoFichaje->getFecha()->format("Y-m-d") . " " . $globales->getHoraFin()->format("H:i"));
$fichajeDiario = new FichajeDiario();
$fichajeDiario->setEntrada(false);
$fichajeDiario->setFecha($fecha);
$fichajeDiario->setEmpleada($empleada);
$em->persist($fichajeDiario);
$em->flush();
$textoes = "Se ha cerrado un fichaje para " . $empleada->getNombre() . " con fecha: " . $fichajeDiario->getFecha()->format("Y-m-d");
$textoeus = "Fitxaje bat ixti da " . $empleada->getNombre() . "-rentzat " . $fichajeDiario->getFecha()->format("d-m-Y") . " datarekin";
$tipo = $tipoNotificacionRepository->findOneBy(['descripcion' => 'tipoNotificacion.fichajeNoCerrado']);
$this->generarNotificacion($empleada, $empleada->getId(), $tipo, $textoeus, $textoes);
}
}
}
return new Response();
}
public function generarNotificacion(Empleada $empleada, $objeto, TipoNotificacion $tipo, $textoeus, $textoes) {
$em = $this->getDoctrine()->getManager();
$usuarioRepository = $em->getRepository("App:Accesos\Usuario");
$administradores = $usuarioRepository->getAdministradores();
$notificacion = new Notificacion();
if (!is_null($empleada)) {
$notificacion->setFecha(date_create('now'));
$notificacion->setObjeto($objeto);
$notificacion->setLeido(false);
$notificacion->setTextoes($textoes);
$notificacion->setTextoeus($textoeus);
$notificacion->setTipo($tipo);
$notificacion->setDestinatario($empleada);
$em->persist($notificacion);
}
foreach ($administradores as $admin) {
if ($empleada->getId() != $admin->getEmpleada()->getId()) {
$noti = new Notificacion();
$noti->setFecha(date_create('now'));
$noti->setObjeto($objeto);
$noti->setLeido(false);
$noti->setTextoes($textoes);
$noti->setTextoeus($textoeus);
$noti->setTipo($tipo);
$noti->setDestinatario($admin->getEmpleada());
$em->persist($noti);
}
}
$em->flush();
}
#[Route('/informe', name: 'app_comun_notificacion_informe', methods: ['GET', 'POST'])]
public function informeNotificaciones(MailerInterface $mailer) {
$em = $this->getDoctrine()->getManager();
$tipoNotificacionRepository = $em->getRepository("App:Comun\TipoNotificacion");
$notificacionRepository = $em->getRepository("App:Comun\Notificacion");
$usuarioRepository = $em->getRepository("App:Accesos\Usuario");
$administradoras = $usuarioRepository->getAdministradores();
$fecha = date_create('now');
$horasSuperadas = $tipoNotificacionRepository->findOneBy(['descripcion' => 'tipoNotificacion.horasSuperadas']);
$horasNoCumplidas = $tipoNotificacionRepository->findOneBy(['descripcion' => 'tipoNotificacion.horasNoCumplidas']);
$fichajeCerrado = $tipoNotificacionRepository->findOneBy(['descripcion' => 'tipoNotificacion.fichajeNoCerrado']);
foreach ($administradoras as $administradora) {
$notificacionesHorasSuperadas = $notificacionRepository->findBy(['tipo' => $horasSuperadas, 'fecha' => $fecha, 'destinatario' => $administradora->getEmpleada()], ['fecha' => 'DESC']);
$notificacionesHorasNoCumplidas = $notificacionRepository->findBy(['tipo' => $horasNoCumplidas, 'fecha' => $fecha, 'destinatario' => $administradora->getEmpleada()], ['fecha' => 'DESC']);
$notificacionesfichajeCerrado = $notificacionRepository->findBy(['tipo' => $fichajeCerrado, 'fecha' => $fecha, 'destinatario' => $administradora->getEmpleada()], ['fecha' => 'DESC']);
$notificacionesJustificacion = $notificacionRepository->notificacionesJustificacion($administradora->getEmpleada(), $fecha);
$contador = 0;
$contador += count($notificacionesHorasSuperadas);
$contador += count($notificacionesHorasNoCumplidas);
$contador += count($notificacionesfichajeCerrado);
$contador += count($notificacionesJustificacion);
if ($contador > 0){
$html = $this->renderView('comun/notificacion/notificacionesTipo.html.twig', [
'notificacionesHorasSuperadas' => $notificacionesHorasSuperadas,
'notificacionesHorasNoCumplidas' => $notificacionesHorasNoCumplidas,
'notificacionesFichajeCerrado' => $notificacionesfichajeCerrado,
'tipoHorasSuperadas' => $horasSuperadas,
'tipoHorasNoCumplidas' => $horasNoCumplidas,
'tipoFichajeCerrado' => $fichajeCerrado,
'notificacionesJustificacion' => $notificacionesJustificacion,
'fecha' => $fecha
]);
$email = (new Email())
->from(new Address("daitekecrm@outlook.com", 'Daiteke CRM'))
->to($administradora->getEmail())
->priority(Email::PRIORITY_HIGH)
->subject("Informe notificaciones")
->html($html);
$mailer->send($email);
}
}
return new Response("");
}
#[Route('/justificacion', name: 'app_comun_notificacion_justificacion', methods: ['GET', 'POST'])]
public function notificacionJustificacion() {
$em = $this->getDoctrine()->getManager();
$tipoNotificacionRepository = $em->getRepository("App:Comun\TipoNotificacion");
$notificacionRepository = $em->getRepository("App:Comun\Notificacion");
$justificacionRepository = $em->getRepository("App:Comun\Justificacion");
$globales = $em->getRepository("App:Admin\Globales")->findOneby([]);
$tipo1 = $tipoNotificacionRepository->findOneBy(['descripcion' => 'tipoNotificacion.justificacion1']);
$tipo2 = $tipoNotificacionRepository->findOneBy(['descripcion' => 'tipoNotificacion.justificacion2']);
$tipo3 = $tipoNotificacionRepository->findOneBy(['descripcion' => 'tipoNotificacion.justificacion3']);
$justificaciones = $justificacionRepository->findBy(['presentada' => 0]);
$hoy = date_create('now');
foreach ($justificaciones as $justificacion) {
$fecha = $justificacion->getFecha();
if ($hoy < $fecha) {
$interval = date_diff($hoy, $fecha);
$dias = ($interval->days) + 1;
if ($dias <= $globales->getJustificacionAviso1()) {
$notificacion = $notificacionRepository->findOneBy(['tipo' => $tipo1, 'objeto' => $justificacion->getId()]);
if (is_null($notificacion)) {
$textoes = "La justificación " . $justificacion->getNombre() . " para el proyecto " . $justificacion->getProyecto()->getNombre() . " tiene que presentarse en menos de " . $globales->getJustificacionAviso1() . " dias (" . $justificacion->getFecha()->format("Y-m-d") . ")";
$textoeus = $justificacion->getNombre() . " justifikazioa " . $justificacion->getProyecto()->getNombre() . " proiekturako " . $globales->getJustificacionAviso1() . " egun baino lehen aurkeztu behar da (" . $justificacion->getFecha()->format("d-m-Y") . ")";
$this->generarNotificacion($justificacion->getProyecto()->getResponsable(), $justificacion->getId(), $tipo1, $textoeus, $textoes);
}
}
if ($dias <= $globales->getJustificacionAviso2()) {
$notificacion = $notificacionRepository->findOneBy(['tipo' => $tipo2, 'objeto' => $justificacion->getId()]);
if (is_null($notificacion)) {
$textoes = "La justificación " . $justificacion->getNombre() . " para el proyecto " . $justificacion->getProyecto()->getNombre() . " tiene que presentarse en menos de " . $globales->getJustificacionAviso2() . " dias (" . $justificacion->getFecha()->format("Y-m-d") . ")";
$textoeus = $justificacion->getNombre() . " justifikazioa " . $justificacion->getProyecto()->getNombre() . " proiekturako " . $globales->getJustificacionAviso2() . " egun baino lehen aurkeztu behar da (" . $justificacion->getFecha()->format("d-m-Y") . ")";
$this->generarNotificacion($justificacion->getProyecto()->getResponsable(), $justificacion->getId(), $tipo2, $textoeus, $textoes);
}
}
if ($dias <= $globales->getJustificacionAviso3()) {
$notificacion = $notificacionRepository->findOneBy(['tipo' => $tipo3, 'objeto' => $justificacion->getId()]);
if (is_null($notificacion)) {
$textoes = "La justificación " . $justificacion->getNombre() . " para el proyecto " . $justificacion->getProyecto()->getNombre() . " tiene que presentarse en menos de " . $globales->getJustificacionAviso3() . " dias (" . $justificacion->getFecha()->format("Y-m-d") . ")";
$textoeus = $justificacion->getNombre() . " justifikazioa " . $justificacion->getProyecto()->getNombre() . " proiekturako " . $globales->getJustificacionAviso3() . " egun baino lehen aurkeztu behar da (" . $justificacion->getFecha()->format("d-m-Y") . ")";
$this->generarNotificacion($justificacion->getProyecto()->getResponsable(), $justificacion->getId(), $tipo3, $textoeus, $textoes);
}
}
}
}
return new Response("");
}
#[Route('/cron', name: 'app_comun_notificacion_cron', methods: ['GET', 'POST'])]
public function ejecutarCron(MailerInterface $mailer) {
$this->cerrarFichaje();
$this->comprobarHorasTrabajadas();
$this->notificacionJustificacion();
$this->informeNotificaciones($mailer);
return new Response("Enviado");
}
#[Route('/llamada/notificar/{llamada}', name: 'app_comun_notificacion_llamada', methods: ['GET', 'POST'])]
public function generarNotificacionLlamada(\App\Entity\Accion\Llamada $llamada) {
$em=$this->getDoctrine()->getManager();
$tipoNotificacionRepository = $em->getRepository("App:Comun\TipoNotificacion");
$empleadaConectada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$notificacion = new Notificacion();
$notificacion->setDestinatario($llamada->getEmpleada());
$notificacion->setFecha($llamada->getFecha());
$notificacion->setLeido(false);
$notificacion->setTextoes("Has recibido una llamada del cliente ". $llamada->getCliente() ." el ". $llamada->getFecha()->format("Y-m-d")." sobre (" .$llamada->getObservaciones().") | notificado por: ". $empleadaConectada);
$notificacion->setTextoeus($llamada->getFecha()->format("d-m-Y")." an ". $llamada->getCliente() ." bezeroaren dei bat jaso duzu (" .$llamada->getObservaciones().")ri buruz | ".$empleadaConectada."rengatik sortuta");
$tipo = $tipoNotificacionRepository->findOneBy(['descripcion'=>'tipoNotificacion.llamada']);
$notificacion->setTipo($tipo);
$notificacion->setObjeto($llamada->getId());
$em->persist($notificacion);
$em->flush();
return new Response("Llamada notificada");
}
}