src/Controller/Comun/FichajeDiarioController.php line 330

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Comun;
  3. use App\Entity\Comun\FichajeDiario;
  4. use App\Form\Comun\FichajeDiarioType;
  5. use App\Repository\Comun\FichajeDiarioRepository;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Symfony\Component\HttpFoundation\JsonResponse;
  11. use App\Entity\Admin\Empleada;
  12. use App\Entity\Admin\Globales;
  13. use Symfony\Component\HttpFoundation\RedirectResponse;
  14. use Symfony\Contracts\Translation\TranslatorInterface;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. use App\Service\FichajeService;
  17. use Psr\Log\LoggerInterface;
  18. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  19. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  20. use Symfony\Component\HttpFoundation\StreamedResponse;
  21. use App\Service\ExcelFichajesService;
  22. #[Route('/comun/fichajediario')]
  23. class FichajeDiarioController extends AbstractController {
  24.     private $fichajeService;
  25.     public function __construct(FichajeService $fichajeService) {
  26.         $this->fichajeService $fichajeService;
  27.     }
  28.     #[Route('/'name'app_comun_fichaje_diario_index'methods: ['GET'])]
  29.     public function index(RequestStack $rsFichajeDiarioRepository $fichajeDiarioRepository): Response {
  30.         $empleada $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
  31.         $session $rs->getSession();
  32.         $filtro unserialize($session->get('filtro.fichajediario'));
  33.         $datos $this->fichajesPorEmpleada($empleada$filtro);
  34.         return $this->render('comun/fichaje_diario/fichajeEmpleada.html.twig', [
  35.                     'datos' => $datos,
  36.                     'empleada' => $empleada,
  37.         ]);
  38.     }
  39.     #[Route('/excel'name'app_comun_fichaje_diario_excel'methods: ['GET'])]
  40.     public function excel(LoggerInterface $loggerRequestStack $rsFichajeDiarioRepository $fichajeDiarioRepositoryExcelFichajesService $efs): Response {
  41.         $empleada $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
  42.         $session $rs->getSession();
  43.         $filtro unserialize($session->get('filtro.fichajediario'));
  44.         $matriz = [];
  45.         
  46.         $datos $this->fichajesPorEmpleada($empleada$filtro);
  47.         
  48.         foreach ($datos as $dato){
  49.             $matriz[$dato['dia']]['horas'] = $dato['horas'].':'.$dato['minutos'].':'.$dato['segundos'];
  50.             $fichajes $fichajeDiarioRepository->fichajePorDia($empleada$dato['dia']);
  51.             
  52.             $matriz[$dato['dia']]['fichajes'] = '';
  53.             foreach ($fichajes as $fichaje){
  54.                 
  55.                 $matriz[$dato['dia']]['fichajes'] .= $fichaje->getFecha()->format('H:i:s');
  56.                 if ($fichaje->getEntrada()){
  57.                     $matriz[$dato['dia']]['fichajes'] .= ' - ';
  58.                 }
  59.                 else {
  60.                     $matriz[$dato['dia']]['fichajes'] .= ' | ';
  61.                 }
  62.             }
  63.             
  64.         }
  65.         
  66.         $spreadsheet = new Spreadsheet();
  67.         $efs->printExcel($matriz$empleada$spreadsheet);
  68.         $writer = new Xlsx($spreadsheet);
  69.         $response = new StreamedResponse(
  70.                 function () use ($writer) {
  71.                     $writer->save('php://output');
  72.                 }
  73.         );
  74.         $response->headers->set('Content-Type''application/vnd.ms-excel');
  75.         $response->headers->set('Content-Disposition''attachment;filename="Fichajes.xlsx"');
  76.         $response->headers->set('Cache-Control''max-age=0');
  77.         return $response;
  78. //        return $this->render('comun/fichaje_diario/fichajeEmpleada.html.twig', [
  79. //                    'datos' => $datos,
  80. //                    'empleada' => $empleada,
  81. //        ]);
  82.     }
  83.     
  84.     #[Route('/fichajes/{empleada}'name'app_comun_fichaje_diario_empleada'methods: ['GET'])]
  85.     public function fichajeEmpleada(RequestStack $rsEmpleada $empleadaFichajeDiarioRepository $fichajeDiarioRepository): Response {
  86.         $session $rs->getSession();
  87.         $filtro unserialize($session->get('filtro.fichajediario'));
  88.         return $this->render('comun/fichaje_diario/fichajeEmpleada.html.twig', [
  89.                     'datos' => $this->fichajesPorEmpleada($empleada$filtro),
  90.                     'empleada' => $empleada,
  91.         ]);
  92.     }
  93.     public function fichajesPorEmpleada(Empleada $empleada$filtro) {
  94.         $fichajeDiarioRepository $this->getDoctrine()->getRepository("App:Comun\FichajeDiario");
  95.         $datos = [];  
  96.         $fichajesFecha=$fichajeDiarioRepository->fichajePorEmpleada($empleada$filtro);
  97.         foreach ($fichajesFecha as $fichajeFecha) {
  98.             $datos[] = $this->fichajeService->calcularHorasPorFecha($empleadadate_create_from_format('Y-m-d'$fichajeFecha['fecha']));
  99.         }
  100.         
  101.        // $fichajes = $fichajeDiarioRepository->fichajePorDia($empleada, $fecha);
  102.     
  103.         return $datos;
  104.     }
  105.     #[Route('/detalles/{fecha}/{empleada}'name'app_comun_fichaje_diario_detalles_dia'methods: ['GET'])]
  106.     public function detallesDia(Empleada $empleada$fechaFichajeDiarioRepository $fichajeDiarioRepository): Response {
  107.         $fichajes $fichajeDiarioRepository->fichajePorDia($empleada$fecha);
  108.         return $this->render('comun/fichaje_diario/detallesDia.html.twig', [
  109.                     'fichaje_diarios' => $fichajes,
  110.                     'empleada' => $empleada,
  111.                     'fecha' => $fecha,
  112.         ]);
  113.     }
  114.     #[Route('/new/fichaje/'name'app_comun_fichaje_diario_new'methods: ['GET''POST'])]
  115.     public function new(Request $requestFichajeDiarioRepository $fichajeDiarioRepositoryTranslatorInterface $translator): Response {
  116.         $fichajeDiario = new FichajeDiario();
  117.         $form $this->createForm(FichajeDiarioType::class, $fichajeDiario);
  118.         $form->handleRequest($request);
  119.         $mensaje "";
  120.         $empleada $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
  121.         $ultimoFichaje $fichajeDiarioRepository->findOneBy(['empleada' => $empleada], ['fecha' => 'DESC']);
  122.         $fichajeDiario->setEmpleada($empleada);
  123.         if (!is_null($ultimoFichaje)) {
  124.             if ($ultimoFichaje->getEntrada()) {
  125.                 $fichajeDiario->setEntrada(false);
  126.                 $mensaje "fichajeDiario.salida";
  127.             } else {
  128.                 $fichajeDiario->setEntrada(true);
  129.                 $mensaje "fichajeDiario.entrada";
  130.             }
  131.         } else {
  132.             $fichajeDiario->setEntrada(true);
  133.             $mensaje "fichajeDiario.entrada";
  134.         }
  135.         if ($this->horasFichajeActivado()) {
  136.             $fichajeDiario->setFecha(date_create('now'));
  137.             $fichajeDiarioRepository->add($fichajeDiario);
  138.         } else {
  139.             $mensaje "fichajeDiario.finalizado";
  140.         }
  141.         $mensaje $translator->trans($mensaje);
  142.         return new JsonResponse(['mensaje' => $mensaje]);
  143.     }
  144.     #[Route('/aviso'name'app_comun_fichaje_diario_aviso'methods: ['GET'])]
  145.     public function avisoFichar(FichajeDiarioRepository $fichajeDiarioRepositoryTranslatorInterface $translator): Response {
  146.         $empleada $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
  147.         $ultimoFichaje $fichajeDiarioRepository->findOneBy(['empleada' => $empleada], ['fecha' => 'DESC']);
  148.         $aviso false;
  149.         if (!is_null($ultimoFichaje)) {
  150.             if (!$ultimoFichaje->getEntrada()) {
  151.                 $aviso true;
  152.             }
  153.         } else {
  154.             $aviso true;
  155.         }
  156.         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")]);
  157.     }
  158.     public function horasFichajeActivado() {
  159.         $globalesRepository $this->getDoctrine()->getRepository("App:Admin\Globales");
  160.         $global $globalesRepository->findOneby([]);
  161.         $activado false;
  162.         $empleada $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
  163.         if (!is_null($empleada)) {
  164.             $fechaActual date_create('now');
  165.             $dia $fechaActual->format("Y-m-d");
  166.             $fechaInicio date_create_from_format('Y-m-d H:i:s'$dia " " $global->getHoraInicio()->format('H:i:s'));
  167.             $fechaFin date_create_from_format('Y-m-d H:i:s'$dia " " $global->getHoraFin()->format('H:i:s'));
  168.             if ($fechaActual >= $fechaInicio && $fechaActual <= $fechaFin) {
  169.                 $activado true;
  170.             }
  171.         }
  172.         return $activado;
  173.     }
  174.     #[Route('/horas/activado'name'app_comun_fichaje_diario_activado'methods: ['GET'])]
  175.     public function horasFichajeActivadoJson(): Response {
  176.         return new JsonResponse(['activado' => $this->horasFichajeActivado()]);
  177.     }
  178.     #[Route('/{id}'name'app_comun_fichaje_diario_show'methods: ['GET'])]
  179.     public function show(FichajeDiario $fichajeDiario): Response {
  180.         return $this->render('comun/fichaje_diario/show.html.twig', [
  181.                     'fichaje_diario' => $fichajeDiario,
  182.         ]);
  183.     }
  184.     #[Route('/{id}/edit'name'app_comun_fichaje_diario_edit'methods: ['GET''POST'])]
  185.     public function edit(Request $requestFichajeDiario $fichajeDiarioFichajeDiarioRepository $fichajeDiarioRepositoryTranslatorInterface $translator): Response {
  186.         $form $this->createForm(FichajeDiarioType::class, $fichajeDiario, array("horas" => $this->arrayHorasFichaje()));
  187.         $form->get("hora")->setData($fichajeDiario->getFecha());
  188.         $form->handleRequest($request);
  189.         $global $this->getDoctrine()->getRepository("App:Admin\Globales")->findOneby([]);
  190.         $mensaje "";
  191.         if ($form->isSubmitted() && $form->isValid()) {
  192.             $hora $form->get("hora")->getData();
  193.             if ($hora >= $global->getHoraInicio() && $hora $global->getHoraFin()) {
  194.                 $hora $hora->format("H:i:s");
  195.                 $fechaVieja $fichajeDiario->getFecha();
  196.                 $fecha date_create_from_format('Y-m-d H:i:s'$fichajeDiario->getFecha()->format("Y-m-d") . " " $hora);
  197.                 $fichajeAnterior $fichajeDiarioRepository->fichajeAnterior($fichajeDiario);
  198.                 if (!is_null($fichajeAnterior)) {
  199.                     $fichajeAnterior $fichajeAnterior->getId();
  200.                 }
  201.                 $fichajeSiguiente $fichajeDiarioRepository->fichajeSiguiente($fichajeDiario);
  202.                 if (!is_null($fichajeSiguiente)) {
  203.                     $fichajeSiguiente $fichajeSiguiente->getId();
  204.                 }
  205.                 $fichajeDiario->setFecha($fecha);
  206.                 $fichajeDiarioRepository->add($fichajeDiario);
  207.                 $fichajeAnteriorNuevo $fichajeDiarioRepository->fichajeAnterior($fichajeDiario);
  208.                 if (!is_null($fichajeAnteriorNuevo)) {
  209.                     $fichajeAnteriorNuevo $fichajeAnteriorNuevo->getId();
  210.                 }
  211.                 $fichajeSiguienteNuevo $fichajeDiarioRepository->fichajeSiguiente($fichajeDiario);
  212.                 if (!is_null($fichajeSiguienteNuevo)) {
  213.                     $fichajeSiguienteNuevo $fichajeSiguienteNuevo->getId();
  214.                 }
  215.                 $fichajeDiario->setFecha($fechaVieja);
  216.                 $fichajeDiarioRepository->add($fichajeDiario);
  217.                 if ($fichajeAnterior == $fichajeAnteriorNuevo && $fichajeSiguiente == $fichajeSiguienteNuevo) {
  218.                     $fichajeDiario->setFecha($fecha);
  219.                     $fichajeDiarioRepository->add($fichajeDiario);
  220.                 } else {
  221.                     $mensaje $translator->trans("fichajeDiario.errorModificar");
  222.                 }
  223.             }
  224.             return new JsonResponse(['mensaje' => $mensaje'actualizar' => true]);
  225.         }
  226.         return $this->renderForm('comun/fichaje_diario/form.html.twig', [
  227.                     'fichaje_diario' => $fichajeDiario,
  228.                     'form' => $form,
  229.         ]);
  230.     }
  231.     #[Route('/{id}/delete'name'app_comun_fichaje_diario_delete'methods: ['GET''POST'])]
  232.     public function delete(FichajeDiario $fichajeDiarioFichajeDiarioRepository $fichajeDiarioRepositoryTranslatorInterface $translator): Response {
  233.         // $cantidad=count( $fichajeDiarioRepository->fichajePorDia($fichajeDiario->getEmpleada(), $fichajeDiario->getFecha()->format("y-m-d")));
  234.         $fichajeDiarioRepository->remove($fichajeDiario);
  235.         $fichajeSiguiente $fichajeDiarioRepository->fichajeSiguiente($fichajeDiario);
  236.         if (!is_null($fichajeSiguiente) && !$fichajeSiguiente->getEntrada()) {
  237.             $fichajeDiarioRepository->remove($fichajeSiguiente);
  238.         }
  239.         //     return new JsonResponse(['exito' => $cantidad, 'error' => $translator->trans('fichajeDiario.mensajeError')]);
  240.         return new JsonResponse(['exito' => $translator->trans('fichajeDiario.mensajeEliminar'), 'error' => $translator->trans('fichajeDiario.mensajeError')]);
  241.     }
  242.     #[Route('/nuevo/{empleada}/{dia}'name'app_comun_fichaje_diario_nuevo'methods: ['GET''POST'])]
  243.     public function nuevo(Request $requestEmpleada $empleada$diaFichajeDiarioRepository $fichajeDiarioRepositoryTranslatorInterface $translator): Response {
  244.         $fichajeEntrada = new FichajeDiario();
  245.         $fichajeSalida = new FichajeDiario();
  246.         $form $this->createForm(FichajeDiarioType::class, $fichajeEntrada, array("horas" => $this->arrayHorasFichaje()));
  247.         $form->handleRequest($request);
  248.         $global $this->getDoctrine()->getRepository("App:Admin\Globales")->findOneby([]);
  249.         $mensaje "";
  250.         if ($form->isSubmitted() && $form->isValid()) {
  251.             if ($form->get("hora")->getData() >= $global->getHoraInicio() && $form->get("hora")->getData() < $global->getHoraFin()) {
  252.                 $hora $form->get("hora")->getData()->format("H:i");
  253.                 $fecha date_create_from_format('Y-m-d H:i'$dia " " $hora);
  254.                 $fecha2 date_create_from_format('Y-m-d H:i'$dia " " $hora);
  255.                 $fecha2->modify("+5 minute");
  256.                 $fichajeEntrada->setEmpleada($empleada);
  257.                 $fichajeEntrada->setFecha($fecha);
  258.                 $fichajeEntrada->setEntrada(true);
  259.                 $fichajeSalida->setEmpleada($empleada);
  260.                 $fichajeSalida->setFecha($fecha2);
  261.                 $fichajeSalida->setEntrada(false);
  262.                 $fichajeAnteriorEntrada $fichajeDiarioRepository->fichajeAnterior($fichajeEntrada);
  263.                 $fichajeAnteriorSalida $fichajeDiarioRepository->fichajeAnterior($fichajeSalida);
  264.                 if ($this->comprobarSiFichajeNewPosible($fichajeAnteriorEntrada$fichajeAnteriorSalida)) {
  265.                     $fichajeDiarioRepository->add($fichajeEntrada);
  266.                     $fichajeDiarioRepository->add($fichajeSalida);
  267.                 } else {
  268.                     $mensaje $translator->trans("fichajeDiario.errorModificar");
  269.                 }
  270.                 return new JsonResponse(['mensaje' => $mensaje'actualizar' => true]);
  271.             }
  272.         }
  273.         return $this->renderForm('comun/fichaje_diario/form.html.twig', [
  274.                     'form' => $form,
  275.         ]);
  276.     }
  277.     #[Route('/newfichajefecha/{empleada}'name'app_comun_fichaje_diario_nuevo_fecha'methods: ['GET''POST'])]
  278.     public function nuevoFichajeFecha(Request $requestEmpleada $empleadaFichajeDiarioRepository $fichajeDiarioRepositoryTranslatorInterface $translator): Response {
  279.         $fichajeEntrada = new FichajeDiario();
  280.         $fichajeEntrada->setFecha(date_create('now'));
  281.         $fichajeSalida = new FichajeDiario();
  282.         $form $this->createForm(\App\Form\Comun\FichajeDiarioFechaType::class, $fichajeEntrada, array("horas" => $this->arrayHorasFichaje()));
  283.         $form->handleRequest($request);
  284.         $error false;
  285.         $mensaje "";
  286.         if ($form->isSubmitted() && $form->isValid()) {
  287.             $fecha $fichajeEntrada->getFecha()->format("Y-m-d");
  288.             $horaInicio $form->get("horaInicio")->getData()->format("H:i");
  289.             $horaFin $form->get("horaFin")->getData()->format("H:i");
  290.             $fechaEntrada date_create_from_format('Y-m-d H:i'$fecha " " $horaInicio);
  291.             $fechaSalida date_create_from_format('Y-m-d H:i'$fecha " " $horaFin);
  292.             $fichajeEntrada->setEmpleada($empleada);
  293.             $fichajeEntrada->setFecha($fechaEntrada);
  294.             $fichajeEntrada->setEntrada(true);
  295.             $fichajeSalida->setEmpleada($empleada);
  296.             $fichajeSalida->setFecha($fechaSalida);
  297.             $fichajeSalida->setEntrada(false);
  298.             $fichajeAnteriorEntrada $fichajeDiarioRepository->fichajeAnterior($fichajeEntrada);
  299.             $fichajeAnteriorSalida $fichajeDiarioRepository->fichajeAnterior($fichajeSalida);
  300.             if ($this->comprobarSiFichajeNewPosible($fichajeAnteriorEntrada$fichajeAnteriorSalida)) {
  301.                 $fichajeDiarioRepository->add($fichajeEntrada);
  302.                 $fichajeDiarioRepository->add($fichajeSalida);
  303.             } else {
  304.                 $mensaje $translator->trans("fichajeDiario.errorModificar");
  305.             }
  306.             $dataLink $this->generateUrl('app_comun_fichaje_diario_detalles_dia', ['fecha' => $fichajeEntrada->getFecha()->format("Y-m-d"), 'empleada' => $fichajeEntrada->getEmpleada()->getId()]);
  307.             $dataHoras $this->generateUrl('app_comun_fichaje_diario_calcular_horas', ['fecha' => $fichajeEntrada->getFecha()->format("Y-m-d"), 'empleada' => $fichajeEntrada->getEmpleada()->getId()]);
  308.             $tiempo $this->fichajeService->calcularHorasPorFecha($fichajeEntrada->getEmpleada(), $fichajeEntrada->getFecha());
  309.             return new JsonResponse(['mensaje' => $mensaje'actualizar' => false'fecha' => $fichajeEntrada->getFecha()->format($translator->trans('comun.fechaFormato')), 'dataLink' => $dataLink'dataHoras' => $dataHoras'tiempo' => $tiempo]);
  310.         }
  311.         return $this->renderForm('comun/fichaje_diario/formFecha.html.twig', [
  312.                     'fichaje_diario' => $fichajeEntrada,
  313.                     'form' => $form,
  314.         ]);
  315.     }
  316.     public function arrayHorasFichaje() {
  317.         $globales $this->getDoctrine()->getRepository("App:Admin\Globales")->findOneby([]);
  318.         $horas = [];
  319.         $horaInicio intval($globales->getHoraInicio()->format("H"));
  320.         $horaFin intval($globales->getHoraFin()->format("H"));
  321.         for ($i $horaInicio$i $horaFin$i++) {
  322.             $horas[] = $i;
  323.         }
  324.         return $horas;
  325.     }
  326.     public function comprobarSiFichajeNewPosible($fichajeAnteriorEntrada$fichajeAnteriorSalida) {
  327.         $posible false;
  328.         if (is_null($fichajeAnteriorSalida) && is_null($fichajeAnteriorEntrada)) {
  329.             $posible true;
  330.         } else {
  331.             if (!is_null($fichajeAnteriorEntrada)) {
  332.                 if (!$fichajeAnteriorEntrada->getEntrada()) {
  333.                     if (!is_null($fichajeAnteriorSalida)) {
  334.                         if ($fichajeAnteriorEntrada->getId() == $fichajeAnteriorSalida->getId()) {
  335.                             $posible true;
  336.                         }
  337.                     }
  338.                 }
  339.             }
  340.         }
  341.         return $posible;
  342.     }
  343.     #[Route('/calcularHorasJson/{fecha}/{empleada}'name'app_comun_fichaje_diario_calcular_horas'methods: ['GET''POST'])]
  344.     public function calcularHorasJson($fechaEmpleada $empleada,): Response {
  345.         return new JsonResponse(['tiempo' => $this->fichajeService->calcularHorasPorFecha($empleadadate_create_from_format("Y-m-d"$fecha))]);
  346.     }
  347. }