<?php
namespace App\Controller\Comun;
use App\Entity\Comun\FichajeDiario;
use App\Form\Comun\FichajeDiarioType;
use App\Repository\Comun\FichajeDiarioRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Entity\Admin\Empleada;
use App\Entity\Admin\Globales;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use App\Service\FichajeService;
use Psr\Log\LoggerInterface;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Component\HttpFoundation\StreamedResponse;
use App\Service\ExcelFichajesService;
#[Route('/comun/fichajediario')]
class FichajeDiarioController extends AbstractController {
private $fichajeService;
public function __construct(FichajeService $fichajeService) {
$this->fichajeService = $fichajeService;
}
#[Route('/', name: 'app_comun_fichaje_diario_index', methods: ['GET'])]
public function index(RequestStack $rs, FichajeDiarioRepository $fichajeDiarioRepository): Response {
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$session = $rs->getSession();
$filtro = unserialize($session->get('filtro.fichajediario'));
$datos = $this->fichajesPorEmpleada($empleada, $filtro);
return $this->render('comun/fichaje_diario/fichajeEmpleada.html.twig', [
'datos' => $datos,
'empleada' => $empleada,
]);
}
#[Route('/excel', name: 'app_comun_fichaje_diario_excel', methods: ['GET'])]
public function excel(LoggerInterface $logger, RequestStack $rs, FichajeDiarioRepository $fichajeDiarioRepository, ExcelFichajesService $efs): Response {
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$session = $rs->getSession();
$filtro = unserialize($session->get('filtro.fichajediario'));
$matriz = [];
$datos = $this->fichajesPorEmpleada($empleada, $filtro);
foreach ($datos as $dato){
$matriz[$dato['dia']]['horas'] = $dato['horas'].':'.$dato['minutos'].':'.$dato['segundos'];
$fichajes = $fichajeDiarioRepository->fichajePorDia($empleada, $dato['dia']);
$matriz[$dato['dia']]['fichajes'] = '';
foreach ($fichajes as $fichaje){
$matriz[$dato['dia']]['fichajes'] .= $fichaje->getFecha()->format('H:i:s');
if ($fichaje->getEntrada()){
$matriz[$dato['dia']]['fichajes'] .= ' - ';
}
else {
$matriz[$dato['dia']]['fichajes'] .= ' | ';
}
}
}
$spreadsheet = new Spreadsheet();
$efs->printExcel($matriz, $empleada, $spreadsheet);
$writer = new Xlsx($spreadsheet);
$response = new StreamedResponse(
function () use ($writer) {
$writer->save('php://output');
}
);
$response->headers->set('Content-Type', 'application/vnd.ms-excel');
$response->headers->set('Content-Disposition', 'attachment;filename="Fichajes.xlsx"');
$response->headers->set('Cache-Control', 'max-age=0');
return $response;
// return $this->render('comun/fichaje_diario/fichajeEmpleada.html.twig', [
// 'datos' => $datos,
// 'empleada' => $empleada,
// ]);
}
#[Route('/fichajes/{empleada}', name: 'app_comun_fichaje_diario_empleada', methods: ['GET'])]
public function fichajeEmpleada(RequestStack $rs, Empleada $empleada, FichajeDiarioRepository $fichajeDiarioRepository): Response {
$session = $rs->getSession();
$filtro = unserialize($session->get('filtro.fichajediario'));
return $this->render('comun/fichaje_diario/fichajeEmpleada.html.twig', [
'datos' => $this->fichajesPorEmpleada($empleada, $filtro),
'empleada' => $empleada,
]);
}
public function fichajesPorEmpleada(Empleada $empleada, $filtro) {
$fichajeDiarioRepository = $this->getDoctrine()->getRepository("App:Comun\FichajeDiario");
$datos = [];
$fichajesFecha=$fichajeDiarioRepository->fichajePorEmpleada($empleada, $filtro);
foreach ($fichajesFecha as $fichajeFecha) {
$datos[] = $this->fichajeService->calcularHorasPorFecha($empleada, date_create_from_format('Y-m-d', $fichajeFecha['fecha']));
}
// $fichajes = $fichajeDiarioRepository->fichajePorDia($empleada, $fecha);
return $datos;
}
#[Route('/detalles/{fecha}/{empleada}', name: 'app_comun_fichaje_diario_detalles_dia', methods: ['GET'])]
public function detallesDia(Empleada $empleada, $fecha, FichajeDiarioRepository $fichajeDiarioRepository): Response {
$fichajes = $fichajeDiarioRepository->fichajePorDia($empleada, $fecha);
return $this->render('comun/fichaje_diario/detallesDia.html.twig', [
'fichaje_diarios' => $fichajes,
'empleada' => $empleada,
'fecha' => $fecha,
]);
}
#[Route('/new/fichaje/', name: 'app_comun_fichaje_diario_new', methods: ['GET', 'POST'])]
public function new(Request $request, FichajeDiarioRepository $fichajeDiarioRepository, TranslatorInterface $translator): Response {
$fichajeDiario = new FichajeDiario();
$form = $this->createForm(FichajeDiarioType::class, $fichajeDiario);
$form->handleRequest($request);
$mensaje = "";
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$ultimoFichaje = $fichajeDiarioRepository->findOneBy(['empleada' => $empleada], ['fecha' => 'DESC']);
$fichajeDiario->setEmpleada($empleada);
if (!is_null($ultimoFichaje)) {
if ($ultimoFichaje->getEntrada()) {
$fichajeDiario->setEntrada(false);
$mensaje = "fichajeDiario.salida";
} else {
$fichajeDiario->setEntrada(true);
$mensaje = "fichajeDiario.entrada";
}
} else {
$fichajeDiario->setEntrada(true);
$mensaje = "fichajeDiario.entrada";
}
if ($this->horasFichajeActivado()) {
$fichajeDiario->setFecha(date_create('now'));
$fichajeDiarioRepository->add($fichajeDiario);
} else {
$mensaje = "fichajeDiario.finalizado";
}
$mensaje = $translator->trans($mensaje);
return new JsonResponse(['mensaje' => $mensaje]);
}
#[Route('/aviso', name: 'app_comun_fichaje_diario_aviso', methods: ['GET'])]
public function avisoFichar(FichajeDiarioRepository $fichajeDiarioRepository, TranslatorInterface $translator): Response {
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$ultimoFichaje = $fichajeDiarioRepository->findOneBy(['empleada' => $empleada], ['fecha' => 'DESC']);
$aviso = false;
if (!is_null($ultimoFichaje)) {
if (!$ultimoFichaje->getEntrada()) {
$aviso = true;
}
} else {
$aviso = true;
}
return new JsonResponse(['aviso' => $aviso, 'iniciar' => $translator->trans("fichajeDiario.iniciar"), 'finalizar' => $translator->trans("fichajeDiario.finalizar"), 'recordatorio' => $translator->trans("fichajeDiario.recordatorio"), 'jornada' => $translator->trans("fichajeDiario.jornada")]);
}
public function horasFichajeActivado() {
$globalesRepository = $this->getDoctrine()->getRepository("App:Admin\Globales");
$global = $globalesRepository->findOneby([]);
$activado = false;
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
if (!is_null($empleada)) {
$fechaActual = date_create('now');
$dia = $fechaActual->format("Y-m-d");
$fechaInicio = date_create_from_format('Y-m-d H:i:s', $dia . " " . $global->getHoraInicio()->format('H:i:s'));
$fechaFin = date_create_from_format('Y-m-d H:i:s', $dia . " " . $global->getHoraFin()->format('H:i:s'));
if ($fechaActual >= $fechaInicio && $fechaActual <= $fechaFin) {
$activado = true;
}
}
return $activado;
}
#[Route('/horas/activado', name: 'app_comun_fichaje_diario_activado', methods: ['GET'])]
public function horasFichajeActivadoJson(): Response {
return new JsonResponse(['activado' => $this->horasFichajeActivado()]);
}
#[Route('/{id}', name: 'app_comun_fichaje_diario_show', methods: ['GET'])]
public function show(FichajeDiario $fichajeDiario): Response {
return $this->render('comun/fichaje_diario/show.html.twig', [
'fichaje_diario' => $fichajeDiario,
]);
}
#[Route('/{id}/edit', name: 'app_comun_fichaje_diario_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, FichajeDiario $fichajeDiario, FichajeDiarioRepository $fichajeDiarioRepository, TranslatorInterface $translator): Response {
$form = $this->createForm(FichajeDiarioType::class, $fichajeDiario, array("horas" => $this->arrayHorasFichaje()));
$form->get("hora")->setData($fichajeDiario->getFecha());
$form->handleRequest($request);
$global = $this->getDoctrine()->getRepository("App:Admin\Globales")->findOneby([]);
$mensaje = "";
if ($form->isSubmitted() && $form->isValid()) {
$hora = $form->get("hora")->getData();
if ($hora >= $global->getHoraInicio() && $hora < $global->getHoraFin()) {
$hora = $hora->format("H:i:s");
$fechaVieja = $fichajeDiario->getFecha();
$fecha = date_create_from_format('Y-m-d H:i:s', $fichajeDiario->getFecha()->format("Y-m-d") . " " . $hora);
$fichajeAnterior = $fichajeDiarioRepository->fichajeAnterior($fichajeDiario);
if (!is_null($fichajeAnterior)) {
$fichajeAnterior = $fichajeAnterior->getId();
}
$fichajeSiguiente = $fichajeDiarioRepository->fichajeSiguiente($fichajeDiario);
if (!is_null($fichajeSiguiente)) {
$fichajeSiguiente = $fichajeSiguiente->getId();
}
$fichajeDiario->setFecha($fecha);
$fichajeDiarioRepository->add($fichajeDiario);
$fichajeAnteriorNuevo = $fichajeDiarioRepository->fichajeAnterior($fichajeDiario);
if (!is_null($fichajeAnteriorNuevo)) {
$fichajeAnteriorNuevo = $fichajeAnteriorNuevo->getId();
}
$fichajeSiguienteNuevo = $fichajeDiarioRepository->fichajeSiguiente($fichajeDiario);
if (!is_null($fichajeSiguienteNuevo)) {
$fichajeSiguienteNuevo = $fichajeSiguienteNuevo->getId();
}
$fichajeDiario->setFecha($fechaVieja);
$fichajeDiarioRepository->add($fichajeDiario);
if ($fichajeAnterior == $fichajeAnteriorNuevo && $fichajeSiguiente == $fichajeSiguienteNuevo) {
$fichajeDiario->setFecha($fecha);
$fichajeDiarioRepository->add($fichajeDiario);
} else {
$mensaje = $translator->trans("fichajeDiario.errorModificar");
}
}
return new JsonResponse(['mensaje' => $mensaje, 'actualizar' => true]);
}
return $this->renderForm('comun/fichaje_diario/form.html.twig', [
'fichaje_diario' => $fichajeDiario,
'form' => $form,
]);
}
#[Route('/{id}/delete', name: 'app_comun_fichaje_diario_delete', methods: ['GET', 'POST'])]
public function delete(FichajeDiario $fichajeDiario, FichajeDiarioRepository $fichajeDiarioRepository, TranslatorInterface $translator): Response {
// $cantidad=count( $fichajeDiarioRepository->fichajePorDia($fichajeDiario->getEmpleada(), $fichajeDiario->getFecha()->format("y-m-d")));
$fichajeDiarioRepository->remove($fichajeDiario);
$fichajeSiguiente = $fichajeDiarioRepository->fichajeSiguiente($fichajeDiario);
if (!is_null($fichajeSiguiente) && !$fichajeSiguiente->getEntrada()) {
$fichajeDiarioRepository->remove($fichajeSiguiente);
}
// return new JsonResponse(['exito' => $cantidad, 'error' => $translator->trans('fichajeDiario.mensajeError')]);
return new JsonResponse(['exito' => $translator->trans('fichajeDiario.mensajeEliminar'), 'error' => $translator->trans('fichajeDiario.mensajeError')]);
}
#[Route('/nuevo/{empleada}/{dia}', name: 'app_comun_fichaje_diario_nuevo', methods: ['GET', 'POST'])]
public function nuevo(Request $request, Empleada $empleada, $dia, FichajeDiarioRepository $fichajeDiarioRepository, TranslatorInterface $translator): Response {
$fichajeEntrada = new FichajeDiario();
$fichajeSalida = new FichajeDiario();
$form = $this->createForm(FichajeDiarioType::class, $fichajeEntrada, array("horas" => $this->arrayHorasFichaje()));
$form->handleRequest($request);
$global = $this->getDoctrine()->getRepository("App:Admin\Globales")->findOneby([]);
$mensaje = "";
if ($form->isSubmitted() && $form->isValid()) {
if ($form->get("hora")->getData() >= $global->getHoraInicio() && $form->get("hora")->getData() < $global->getHoraFin()) {
$hora = $form->get("hora")->getData()->format("H:i");
$fecha = date_create_from_format('Y-m-d H:i', $dia . " " . $hora);
$fecha2 = date_create_from_format('Y-m-d H:i', $dia . " " . $hora);
$fecha2->modify("+5 minute");
$fichajeEntrada->setEmpleada($empleada);
$fichajeEntrada->setFecha($fecha);
$fichajeEntrada->setEntrada(true);
$fichajeSalida->setEmpleada($empleada);
$fichajeSalida->setFecha($fecha2);
$fichajeSalida->setEntrada(false);
$fichajeAnteriorEntrada = $fichajeDiarioRepository->fichajeAnterior($fichajeEntrada);
$fichajeAnteriorSalida = $fichajeDiarioRepository->fichajeAnterior($fichajeSalida);
if ($this->comprobarSiFichajeNewPosible($fichajeAnteriorEntrada, $fichajeAnteriorSalida)) {
$fichajeDiarioRepository->add($fichajeEntrada);
$fichajeDiarioRepository->add($fichajeSalida);
} else {
$mensaje = $translator->trans("fichajeDiario.errorModificar");
}
return new JsonResponse(['mensaje' => $mensaje, 'actualizar' => true]);
}
}
return $this->renderForm('comun/fichaje_diario/form.html.twig', [
'form' => $form,
]);
}
#[Route('/newfichajefecha/{empleada}', name: 'app_comun_fichaje_diario_nuevo_fecha', methods: ['GET', 'POST'])]
public function nuevoFichajeFecha(Request $request, Empleada $empleada, FichajeDiarioRepository $fichajeDiarioRepository, TranslatorInterface $translator): Response {
$fichajeEntrada = new FichajeDiario();
$fichajeEntrada->setFecha(date_create('now'));
$fichajeSalida = new FichajeDiario();
$form = $this->createForm(\App\Form\Comun\FichajeDiarioFechaType::class, $fichajeEntrada, array("horas" => $this->arrayHorasFichaje()));
$form->handleRequest($request);
$error = false;
$mensaje = "";
if ($form->isSubmitted() && $form->isValid()) {
$fecha = $fichajeEntrada->getFecha()->format("Y-m-d");
$horaInicio = $form->get("horaInicio")->getData()->format("H:i");
$horaFin = $form->get("horaFin")->getData()->format("H:i");
$fechaEntrada = date_create_from_format('Y-m-d H:i', $fecha . " " . $horaInicio);
$fechaSalida = date_create_from_format('Y-m-d H:i', $fecha . " " . $horaFin);
$fichajeEntrada->setEmpleada($empleada);
$fichajeEntrada->setFecha($fechaEntrada);
$fichajeEntrada->setEntrada(true);
$fichajeSalida->setEmpleada($empleada);
$fichajeSalida->setFecha($fechaSalida);
$fichajeSalida->setEntrada(false);
$fichajeAnteriorEntrada = $fichajeDiarioRepository->fichajeAnterior($fichajeEntrada);
$fichajeAnteriorSalida = $fichajeDiarioRepository->fichajeAnterior($fichajeSalida);
if ($this->comprobarSiFichajeNewPosible($fichajeAnteriorEntrada, $fichajeAnteriorSalida)) {
$fichajeDiarioRepository->add($fichajeEntrada);
$fichajeDiarioRepository->add($fichajeSalida);
} else {
$mensaje = $translator->trans("fichajeDiario.errorModificar");
}
$dataLink = $this->generateUrl('app_comun_fichaje_diario_detalles_dia', ['fecha' => $fichajeEntrada->getFecha()->format("Y-m-d"), 'empleada' => $fichajeEntrada->getEmpleada()->getId()]);
$dataHoras = $this->generateUrl('app_comun_fichaje_diario_calcular_horas', ['fecha' => $fichajeEntrada->getFecha()->format("Y-m-d"), 'empleada' => $fichajeEntrada->getEmpleada()->getId()]);
$tiempo = $this->fichajeService->calcularHorasPorFecha($fichajeEntrada->getEmpleada(), $fichajeEntrada->getFecha());
return new JsonResponse(['mensaje' => $mensaje, 'actualizar' => false, 'fecha' => $fichajeEntrada->getFecha()->format($translator->trans('comun.fechaFormato')), 'dataLink' => $dataLink, 'dataHoras' => $dataHoras, 'tiempo' => $tiempo]);
}
return $this->renderForm('comun/fichaje_diario/formFecha.html.twig', [
'fichaje_diario' => $fichajeEntrada,
'form' => $form,
]);
}
public function arrayHorasFichaje() {
$globales = $this->getDoctrine()->getRepository("App:Admin\Globales")->findOneby([]);
$horas = [];
$horaInicio = intval($globales->getHoraInicio()->format("H"));
$horaFin = intval($globales->getHoraFin()->format("H"));
for ($i = $horaInicio; $i < $horaFin; $i++) {
$horas[] = $i;
}
return $horas;
}
public function comprobarSiFichajeNewPosible($fichajeAnteriorEntrada, $fichajeAnteriorSalida) {
$posible = false;
if (is_null($fichajeAnteriorSalida) && is_null($fichajeAnteriorEntrada)) {
$posible = true;
} else {
if (!is_null($fichajeAnteriorEntrada)) {
if (!$fichajeAnteriorEntrada->getEntrada()) {
if (!is_null($fichajeAnteriorSalida)) {
if ($fichajeAnteriorEntrada->getId() == $fichajeAnteriorSalida->getId()) {
$posible = true;
}
}
}
}
}
return $posible;
}
#[Route('/calcularHorasJson/{fecha}/{empleada}', name: 'app_comun_fichaje_diario_calcular_horas', methods: ['GET', 'POST'])]
public function calcularHorasJson($fecha, Empleada $empleada,): Response {
return new JsonResponse(['tiempo' => $this->fichajeService->calcularHorasPorFecha($empleada, date_create_from_format("Y-m-d", $fecha))]);
}
}