<?php
namespace App\Controller\Comun;
use App\Entity\Comun\Fichaje;
use App\Form\Comun\FichajeType;
use App\Repository\Comun\FichajeRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Admin\Empleada;
use App\Entity\Comun\Proyecto;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Service\FichajeService;
use Symfony\Component\HttpFoundation\RedirectResponse;
#[Route('/comun/fichaje')]
class FichajeController extends AbstractController {
private $fichajeService;
public function __construct(FichajeService $fichajeService) {
$this->fichajeService = $fichajeService;
}
#[Route('/', name: 'app_comun_fichaje_index', methods: ['GET'])]
public function index(RequestStack $rs, FichajeRepository $fichajeRepository): Response {
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$session = $rs->getSession();
$filtro = unserialize($session->get('filtro.fichajeEmpleada'));
if (!$filtro) {
$fichajes = $fichajeRepository->findBy(['empleada' => $empleada]);
} else {
$filtro->setEmpleada($empleada);
$fichajes = $fichajeRepository->findByFiltro($filtro);
}
$tiempoTrabajado = 0;
foreach ($fichajes as $fichaje) {
$tiempoTrabajado += $fichaje->getCantidadHoras();
}
return $this->render('comun/fichaje/index.html.twig', [
'fichajes' => $fichajes,
'empleada' => $empleada,
'admin' => false,
'tiempoTrabajado' => $this->fichajeService->convertirMinutos($tiempoTrabajado * 60),
]);
}
#[Route('/todos', name: 'app_comun_fichaje_todos', methods: ['GET'])]
public function todos(RequestStack $rs, FichajeRepository $fichajeRepository): Response {
$session = $rs->getSession();
$filtro = unserialize($session->get('filtro.fichaje'));
$fichajes = $fichajeRepository->findByFiltro($filtro);
$tiempoTrabajado = 0;
foreach ($fichajes as $fichaje) {
$tiempoTrabajado += $fichaje->getCantidadHoras();
}
return $this->render('comun/fichaje/todos.html.twig', [
'fichajes' => $fichajes,
'tiempoTrabajado' => $this->fichajeService->convertirMinutos($tiempoTrabajado * 60),
]);
}
#[Route('/empleada/{empleada}', name: 'app_comun_fichaje_empleada', methods: ['GET'])]
public function fichajesEmpleada(RequestStack $rs, FichajeRepository $fichajeRepository, Empleada $empleada): Response {
$session = $rs->getSession();
$filtro = unserialize($session->get('filtro.fichajeEmpleada'));
if (!$filtro) {
$fichajes = $fichajeRepository->findBy(['empleada' => $empleada]);
} else {
$filtro->setEmpleada($empleada);
$fichajes = $fichajeRepository->findByFiltro($filtro);
}
$tiempoTrabajado = 0;
foreach ($fichajes as $fichaje) {
$tiempoTrabajado += $fichaje->getCantidadHoras();
}
return $this->render('comun/fichaje/index.html.twig', [
'fichajes' => $fichajes,
'empleada' => $empleada,
'admin' => true,
'tiempoTrabajado' => $this->fichajeService->convertirMinutos($tiempoTrabajado * 60),
]);
}
#[Route('/new', name: 'app_comun_fichaje_new', methods: ['GET', 'POST'])]
public function new(Request $request): Response {
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
return $this->nuevoFichaje($request, $empleada);
}
#[Route('/newAdmin/{empleada}', name: 'app_comun_fichaje_new_admin', methods: ['GET', 'POST'])]
public function newFichajeAdmin(Request $request, Empleada $empleada): Response {
return $this->nuevoFichaje($request, $empleada);
}
#[Route('/{id}/edit', name: 'app_comun_fichaje_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Fichaje $fichaje, FichajeRepository $fichajeRepository): Response {
$empleada = $fichaje->getEmpleada();
$form = $this->createForm(FichajeType::class, $fichaje, ['empleada' => $empleada]);
$form->get("cantidadHoras")->setData(date_create_from_format("H:i", $this->fichajeService->convertirHorasaTiempo($fichaje->getCantidadHoras())));
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$cantidadHoras = $this->fichajeService->convertirTiempoValorNumerico($form->get("cantidadHoras")->getData()->format("H:i"));
$fichaje->setCantidadHoras($cantidadHoras);
$tarea = $this->getDoctrine()->getRepository("App:Comun\Tarea")->find($request->request->get('fichaje_proyecto_tarea')['tarea']);
$fichaje->setTarea($tarea);
$fichajeRepository->add($fichaje);
if ($empleada->getId() == $this->get('security.token_storage')->getToken()->getUser()->getEmpleada()->getId()) {
return $this->redirect($this->generateUrl('app_comun_fichaje_index', []));
} else {
return $this->redirect($this->generateUrl('app_comun_fichaje_empleada', ['empleada' => $empleada->getId()]));
}
}
return $this->renderForm('comun/fichaje/edit.html.twig', [
'fichaje' => $fichaje,
'form' => $form,
'empleada' => $empleada
]);
}
public function nuevoFichaje(Request $request, Empleada $empleada) {
$fichajeRepository = $this->getDoctrine()->getRepository("App:Comun\Fichaje");
$fichaje = new Fichaje();
$fichaje->setFecha(date_create('now'));
$form = $this->createForm(FichajeType::class, $fichaje, ['empleada' => $empleada]);
$form->handleRequest($request);
$tareaRepository = $this->getDoctrine()->getRepository("App:Comun\Tarea");
$fichaje->setEmpleada($empleada);
if ($form->isSubmitted() && $form->isValid()) {
$cantidadHoras = $this->fichajeService->convertirTiempoValorNumerico($form->get("cantidadHoras")->getData()->format("H:i"));
$fichaje->setCantidadHoras($cantidadHoras);
$tarea = $tareaRepository->find($request->request->get('fichaje_proyecto_tarea')['tarea']);
$fichaje->setTarea($tarea);
$fichajeRepository->add($fichaje);
if ($empleada->getId() == $this->get('security.token_storage')->getToken()->getUser()->getEmpleada()->getId()) {
return $this->redirect($this->generateUrl('app_comun_fichaje_index', []));
} else {
return $this->redirect($this->generateUrl('app_comun_fichaje_empleada', ['empleada' => $empleada->getId()]));
}
}
return $this->renderForm('comun/fichaje/new.html.twig', [
'fichaje' => $fichaje,
'form' => $form,
'empleada' => $empleada
]);
}
#[Route('/{id}', name: 'app_comun_fichaje_show', methods: ['GET'])]
public function show(Fichaje $fichaje): Response {
return $this->render('comun/fichaje/show.html.twig', [
'fichaje' => $fichaje,
]);
}
#[Route('/form/{proyecto}/{empleada}', name: 'app_comun_fichaje_form_tarea', methods: ['GET', 'POST'])]
public function formTareaByProyecto(Proyecto $proyecto = null, Empleada $empleada = null): Response {
$form = $this->createForm(\App\Form\Comun\FichajeProyectoTareaType::class, null, array("empleada" => $empleada, 'proyecto' => $proyecto));
return $this->render('comun/fichaje/formTareas.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/delete/{id}', name: 'app_comun_fichaje_delete', methods: ['GET'])]
public function delete(Request $request, Fichaje $fichaje, FichajeRepository $fichajeRepository): Response {
$fichajeRepository->remove($fichaje);
$redireccion = new RedirectResponse('/');
$redireccion->setTargetUrl($_SERVER['HTTP_REFERER']);
return $redireccion;
}
#[Route('/comprobarHoras/{empleada}/{fecha}/{horas}', name: 'app_comun_fichaje_comprobar_horas', methods: ['GET', 'POST'])]
public function comprobarHoras(TranslatorInterface $translator, Empleada $empleada, $fecha = null, $horas = null): Response { //comprueba si las horas introducidas en un fichaje son posibles
$fichajeRepository = $this->getDoctrine()->getRepository("App:Comun\Fichaje");
$tiempo = $this->fichajeService->calcularHorasPorFecha($empleada, date_create_from_format("Y-m-d", $fecha));
$minutosTrabajados = ($tiempo['horas'] * 60) + $tiempo['minutos'];
$horas = $this->fichajeService->convertirTiempoValorNumerico($horas);
$minutosTarea = $horas * 60;
$fichajes = $fichajeRepository->fichajePorDia($empleada, $fecha);
$totalTareasDia = 0;
$posible = false;
$mensaje = "";
if (count($fichajes) != 0) {
foreach ($fichajes as $fichaje) {
$totalTareasDia += $fichaje->getCantidadHoras();
}
}
$totalTareasDia *= 60;
$restante = $minutosTrabajados - $totalTareasDia;
if ($minutosTarea > $restante) {
if ($restante < 0)
$restante = 0;
$mensaje = $translator->trans('fichaje.horasTareaAviso', ['%tiempo%' => $this->fichajeService->convertirMinutos($restante)]);
$posible = false;
} else {
$posible = true;
}
if (in_array('ROLE_ADMIN', $empleada->getUsuario()->getRoles(), true)) {
$admin = true;
} else {
$admin = false;
}
return new JsonResponse(['posible' => $posible, 'mensaje' => $mensaje, 'admin' => $admin]);
}
}