src/Controller/Comun/ProyectoController.php line 158

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Comun;
  3. use App\Entity\Comun\Proyecto;
  4. use App\Form\Comun\ProyectoType;
  5. use App\Repository\Comun\ProyectoRepository;
  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 App\Entity\Admin\Area;
  11. use App\Service\AccesoService;
  12. use Symfony\Component\HttpFoundation\RequestStack;
  13. use App\Repository\Admin\EmpleadaRepository;
  14. use App\Repository\Comun\TareaRepository;
  15. use Symfony\Contracts\Translation\TranslatorInterface;
  16. #[Route('/comun/proyecto')]
  17. class ProyectoController extends AbstractController {
  18.     private $accesoService;
  19.     public function __construct(AccesoService $accesoService) {
  20.         $this->accesoService $accesoService;
  21.     }
  22.     #[Route('/'name'app_comun_proyecto_index'methods: ['GET'])]
  23.     public function index(RequestStack $rsProyectoRepository $proyectoRepository): Response {
  24.         $usuario $this->get('security.token_storage')->getToken()->getUser();
  25.         $empleada $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
  26.         $session $rs->getSession();
  27.         $filtro unserialize($session->get('filtro.proyecto'));
  28.         if (in_array('ROLE_ADMIN'$usuario->getRoles(), true)) {
  29.             $proyectos $proyectoRepository->findByFiltro($filtro);
  30.         }
  31.         if (in_array('ROLE_EMPLEADA'$usuario->getRoles(), true)) {
  32.             $proyectos $proyectoRepository->findByfiltroEmpleada($filtro$empleada);
  33.           // $empleada = new \App\Entity\Admin\Empleada();
  34.             $proyectosarray_unique(array_merge($proyectos$empleada->getProyectos()->getValues()));
  35.            
  36.             
  37.         }
  38.         if (in_array('ROLE_EXTERNO'$usuario->getRoles(), true)) {
  39.             $proyectos $proyectoRepository->findByfiltroTercero($filtro$usuario);
  40.         }
  41.         return $this->render('comun/proyecto/index.html.twig', [
  42.                     'proyectos' => $proyectos,
  43.         ]);
  44.     }
  45.     #[Route('/index_finalizados'name'app_comun_proyecto_index_finalizados'methods: ['GET'])]
  46.     public function indexFinalizados(RequestStack $rsProyectoRepository $proyectoRepository): Response {
  47.         $usuario $this->get('security.token_storage')->getToken()->getUser();
  48.         $empleada $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
  49.         $session $rs->getSession();
  50.         $filtro unserialize($session->get('filtro.proyecto'));
  51.         if (in_array('ROLE_ADMIN'$usuario->getRoles(), true)) {
  52.             $proyectos $proyectoRepository->findByFiltro($filtrotrue);
  53.         }
  54.         if (in_array('ROLE_EMPLEADA'$usuario->getRoles(), true)) {
  55.             $proyectos $proyectoRepository->findByfiltroEmpleada($filtro$empleadatrue);
  56.           // $empleada = new \App\Entity\Admin\Empleada();
  57.             $proyectosarray_unique(array_merge($proyectos$empleada->getProyectos()->getValues()));
  58.            
  59.             
  60.         }
  61.         if (in_array('ROLE_EXTERNO'$usuario->getRoles(), true)) {
  62.             $proyectos $proyectoRepository->findByfiltroTercero($filtro$usuariotrue);
  63.         }
  64.         return $this->render('comun/proyecto/index_finalizados.html.twig', [
  65.                     'proyectos' => $proyectos,
  66.         ]);
  67.     }
  68.     
  69.     #[Route('/new/{proyectopadre}'name'app_comun_proyecto_new'methods: ['GET''POST'])]
  70.     public function new(Request $requestProyecto $proyectopadre nullProyectoRepository $proyectoRepository): Response {
  71.         $empleada $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
  72.         $usuario $this->get('security.token_storage')->getToken()->getUser();
  73.         $emp false;
  74.         if (in_array('ROLE_EMPLEADA'$usuario->getRoles(), true)) {
  75.             $emp true;
  76.         }
  77.         $proyecto = new Proyecto();
  78.         $proyecto->setEstado(0);
  79.         $proyecto->setFechaInicio(date_create("now"));
  80.         if (!is_null($proyectopadre)) {
  81.             $proyecto->setFechaInicio($proyectopadre->getFechaInicio());
  82.             $proyecto->setArea($proyectopadre->getArea());
  83.             $proyecto->setServicio($proyectopadre->getServicio());
  84.             $proyecto->setResponsable($proyectopadre->getResponsable());
  85.             $proyecto->setPadre($proyectopadre);
  86.         }
  87.         $form $this->createForm(ProyectoType::class, $proyecto, ['empleada' => $emp]);
  88.         $form->handleRequest($request);
  89.         if ($form->isSubmitted() && $form->isValid()) {
  90.             if (in_array('ROLE_EMPLEADA'$usuario->getRoles(), true)) {
  91.                 $proyecto->setResponsable($empleada);
  92.             }
  93.             /*  $ financiacion = $form->get('financiacion')->getData();
  94.               $proyecto->setFinanciacion($financiacion); */
  95.             if (is_null($proyectopadre)) {
  96.                 $restante $proyecto->getFinanciacion();
  97.             } else {
  98.                 $restante $this->calcularRestante($proyectopadre);
  99.             }
  100.             if ($proyecto->getFinanciacion() > $restante) {
  101.                 $this->addFlash('financiacion''proyecto.financiacionError');
  102.                 $this->addFlash('financiacion'$restante " €");
  103.             } else {
  104.                 $servicio $this->getDoctrine()->getManager()->getRepository("App:Admin\Servicio")->find($request->request->get('proyecto_area_servicio')['servicio']);
  105.                 $proyecto->setServicio($servicio);
  106.                 $proyectoRepository->add($proyecto);
  107.                 return $this->redirect($this->generateUrl('app_comun_proyecto_show', ['id' => $proyecto->getId()]));
  108.             }
  109.         }
  110.         return $this->renderForm('comun/proyecto/new.html.twig', [
  111.                     'proyecto' => $proyecto,
  112.                     'form' => $form,
  113.                     'empleada' => $emp
  114.         ]);
  115.     }
  116.     #[Route('/{id}'name'app_comun_proyecto_show'methods: ['GET'])]
  117.     public function show(Proyecto $proyecto): Response {
  118.         $restante "";
  119.         if ($proyecto->getMultiple()) {
  120.             $restante $this->calcularRestante($proyecto);
  121.             $vista "comun/proyecto/showPadre.html.twig";
  122.         } else {
  123.             $vista "comun/proyecto/showSimple.html.twig";
  124.         }
  125.         if (!is_null($proyecto->getPadre())) {
  126.             $vista "comun/proyecto/showHijo.html.twig";
  127.         }
  128.         $eliminable "disabled";
  129.         if (count($proyecto->getTareas()) == && count($proyecto->getJustificacions()) == && count($proyecto->getConvenios()) == && count($proyecto->getGastos()) == && count($proyecto->getProyectos()) == 0) {
  130.             $eliminable "";
  131.         }
  132.         return $this->render($vista, [
  133.                     'proyecto' => $proyecto,
  134.                     'restante' => $restante,
  135.                     'eliminable' => $eliminable,
  136.                     'acceso' => $this->accesoService->controlAccesosProyecto($proyecto),
  137.         ]);
  138.     }
  139.     #[Route('/{id}/edit'name'app_comun_proyecto_edit'methods: ['GET''POST'])]
  140.     public function edit(Request $requestProyecto $proyectoProyectoRepository $proyectoRepository): Response {
  141.         $empleada $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
  142.         $usuario $this->get('security.token_storage')->getToken()->getUser();
  143.         $emp false;
  144.         if (in_array('ROLE_EMPLEADA'$usuario->getRoles(), true)) {
  145.             $emp true;
  146.         }
  147.         $form $this->createForm(ProyectoType::class, $proyecto, ['empleada' => $emp]);
  148.         $form->handleRequest($request);
  149.         $restante 0;
  150.         if ($form->isSubmitted() && $form->isValid()) {
  151.             $servicio $this->getDoctrine()->getManager()->getRepository("App:Admin\Servicio")->find($request->request->get('proyecto_area_servicio')['servicio']);
  152.             $proyecto->setServicio($servicio);
  153.             $financiacionHijos 0;
  154.             if (count($proyecto->getProyectos()) > 0) {
  155.                 foreach ($proyecto->getProyectos() as $proyectoHijo) {
  156.                     $financiacionHijos += $proyectoHijo->getFinanciacion();
  157.                 }
  158.                 if ($proyecto->getFinanciacion() >= $financiacionHijos) {
  159.                     $proyectoRepository->add($proyecto);
  160.                     return $this->redirect($this->generateUrl('app_comun_proyecto_show', ['id' => $proyecto->getId()]));
  161.                 } else {
  162.                     $this->addFlash('financiacion''proyecto.financiacionErrorPadre');
  163.                 }
  164.             } else {
  165.                 if (!is_null($proyecto->getPadre())) {
  166.                     foreach ($proyecto->getPadre()->getProyectos() as $hijos) {
  167.                         $financiacionHijos += $hijos->getFinanciacion();
  168.                     }
  169.                     if ($financiacionHijos $proyecto->getPadre()->getFinanciacion()) {
  170.                         $this->calcularRestante($proyecto->getPadre());
  171.                         $this->addFlash('financiacion''La financiacion es superior a lo permitido');
  172.                     } else {
  173.                         $proyectoRepository->add($proyecto);
  174.                         return $this->redirect($this->generateUrl('app_comun_proyecto_show', ['id' => $proyecto->getId()]));
  175.                     }
  176.                 } else {
  177.                     $proyectoRepository->add($proyecto);
  178.                     return $this->redirect($this->generateUrl('app_comun_proyecto_show', ['id' => $proyecto->getId()]));
  179.                 }
  180.             }
  181.         }
  182.         return $this->renderForm('comun/proyecto/edit.html.twig', [
  183.                     'proyecto' => $proyecto,
  184.                     'form' => $form,
  185.                     'empleada' => $emp
  186.         ]);
  187.     }
  188.     #[Route('/finalizar/{id}'name'app_comun_proyecto_finalizar'methods: ['GET''POST'])]
  189.     public function finalizar(Request $requestProyecto $proyectoProyectoRepository $proyectoRepository): Response {
  190.         $entityManager $this->getDoctrine()->getManager();
  191.         
  192.         $proyectosHijo $proyecto->getProyectos();
  193.         foreach ($proyectosHijo as $hijo){
  194.             $hijo->setEstado(2);
  195.             $entityManager->persist($hijo);
  196.             $entityManager->flush();
  197.         }
  198.         
  199.         $proyecto->setEstado(2);
  200.         $entityManager->persist($proyecto);
  201.         $entityManager->flush();
  202.         
  203.         return $this->redirectToRoute('app_comun_proyecto_show', ['id' => $proyecto->getId()], Response::HTTP_SEE_OTHER);
  204.     }
  205.     
  206.     #[Route('/delete/{id}'name'app_comun_proyecto_delete'methods: ['GET''POST'])]
  207.     public function delete(Request $requestProyecto $proyectoProyectoRepository $proyectoRepository): Response {
  208.         $entityManager $this->getDoctrine()->getManager();
  209.         if (count($proyecto->getTareas()) == && count($proyecto->getJustificacions()) == && count($proyecto->getConvenios()) == && count($proyecto->getGastos()) == && count($proyecto->getProyectos()) == 0) {
  210.             if (count($proyecto->getTerceros()) < 0) {
  211.                 foreach ($proyecto->getTerceros() as $tercero) {
  212.                     $entityManager->remove($tercero);
  213.                     $entityManager->flush();
  214.                 }
  215.             }
  216.             $proyectoRepository->remove($proyecto);
  217.         }
  218.         return $this->redirectToRoute('app_comun_proyecto_index', [], Response::HTTP_SEE_OTHER);
  219.     }
  220.     #[Route('/form/{area}/{proyecto}'name'app_comun_proyecto_form_servicio'methods: ['GET''POST'])]
  221.     public function formServicioByArea(Area $area nullProyecto $proyecto null): Response {
  222.         if (is_null($proyecto)) {
  223.             $proyecto = new Proyecto();
  224.         }
  225.         $form $this->createForm(\App\Form\Comun\ProyectoAreaServicioType::class, $proyecto, array("area" => $area->getId()));
  226.         return $this->render('comun/proyecto/formServicios.html.twig', [
  227.                     'form' => $form->createView(),
  228.         ]);
  229.     }
  230.     #[Route('/resumen/{proyecto}'name'app_comun_proyecto_resumen'methods: ['GET''POST'])]
  231.     public function cargarResumen(TranslatorInterface $translatorProyecto $proyectoEmpleadaRepository $empleadaRepositoryTareaRepository $tareaRepository\App\Repository\Comun\TareaEmpleadaRepository $tareaEmpleadaRepository) {
  232.         $em $this->getDoctrine()->getManager();
  233.         $empleadas $empleadaRepository->empleadasPorProyecto($proyecto);
  234.         $globales $em->getRepository("App:Admin\Globales")->findOneby([]);
  235.         $horasPrevistas 0;
  236.         $horasFichadas 0;
  237.         $gastosTotal $proyecto->getGastado();
  238.         $tareas $tareaRepository->tareasProyecto($proyecto);
  239.         foreach ($tareas as $tarea) {
  240.             $horasPrevistas += $tarea->getHorasPrevistasTotales();
  241.             $horasFichadas += $tarea->getHorasFichadas();
  242.         }
  243.         $justificaciones $proyecto->getJustificacions();
  244.         $hoy date_create('now');
  245.         $cont 0;
  246.         $aviso "";
  247.         $semaforo = [];
  248.         $color "";
  249.         foreach ($justificaciones as $justificacion) {
  250.             $fecha $justificacion->getFecha();
  251.             if ($hoy $fecha) {
  252.                 $interval date_diff($hoy$fecha);
  253.                 $dias = ($interval->days) + 1;
  254.                 $color "white";
  255.                 $aviso "";
  256.                 if ($dias <= $globales->getJustificacionAviso3()) {
  257.                     $aviso $translator->trans('resumen.avisoJustificacion', ['%dias%' => $globales->getJustificacionAviso3()]);
  258.                     $color "#5fc27e";
  259.                     $cont 3;
  260.                 }
  261.                 if ($dias <= $globales->getJustificacionAviso2()) {
  262.                     $aviso $translator->trans('resumen.avisoJustificacion', ['%dias%' => $globales->getJustificacionAviso2()]);
  263.                     $cont 2;
  264.                     $color "#fab451 ";
  265.                 }
  266.                 if ($dias <= $globales->getJustificacionAviso1()) {
  267.                     $aviso $translator->trans('resumen.avisoJustificacion', ['%dias%' => $globales->getJustificacionAviso1()]);
  268.                     $cont 1;
  269.                     $color "red";
  270.                 }
  271.             } else {
  272.                 if (!$justificacion->getPresentada()) {
  273.                     $cont 5;
  274.                     $aviso $translator->trans('resumen.noPresentada');
  275.                     $color "red";
  276.                 } else {
  277.                     $cont 0;
  278.                 
  279.                 }
  280.             }
  281.             $semaforo[$justificacion->getId()]['semaforo'] = $cont;
  282.             $semaforo[$justificacion->getId()]['aviso'] = $aviso;
  283.             $semaforo[$justificacion->getId()]['color'] = $color;
  284.         }
  285.         try {
  286.             $porcentajeHoras round((($horasFichadas 100) / $horasPrevistas), 2);
  287.             $porcentajeGastos round((($gastosTotal 100) / $proyecto->getFinanciacion()), 2);
  288.         } catch (\DivisionByZeroError $e) {
  289.             $porcentajeHoras 0;
  290.             $porcentajeGastos 0;
  291.         }
  292.         return $this->render('comun/proyecto/resumen.html.twig', [
  293.                     'empleadas' => $empleadas,
  294.                     'horasTotalesPrevistas' => $horasPrevistas,
  295.                     'horasTotalesFichadas' => $horasFichadas,
  296.                     'proyecto' => $proyecto,
  297.                     'porcentajeHoras' => $porcentajeHoras,
  298.                     'porcentajeGastos' => $porcentajeGastos,
  299.                     'justificaciones' => $justificaciones,
  300.                     'semaforo' => $semaforo,
  301.         ]);
  302.     }
  303.     #[Route('/graficas/{proyecto}'name'app_comun_proyecto_grafica'methods: ['GET''POST'])]
  304.     public function graficasProyecto(Proyecto $proyecto\App\Repository\Comun\FichajeRepository $fichajeRepository) {
  305.         $em $this->getDoctrine()->getManager();
  306.         $empleadaRepository $em->getRepository("App:Admin\Empleada");
  307.         $tareaRepository $em->getRepository("App:Comun\Tarea");
  308.         $tareaEmpleadaRepository $em->getRepository("App:Comun\TareaEmpleada");
  309.         $labelHoras = [];
  310.         $labelGastos = [];
  311.         $seriesGastos = [];
  312.         $seriesPrevistas = [];
  313.         $seriesFichadas = [];
  314.         $totalPrevistas 0;
  315.         $totalFichadas 0;
  316.         $empleadas $empleadaRepository->empleadasPorProyecto($proyecto);
  317.         foreach ($empleadas as $empleada) {
  318.             $tareas $tareaRepository->tareasEmpleadaProyecto($empleada$proyecto);
  319.             foreach ($tareas as $tarea) {
  320.                 $tareaEmpleadas $tareaEmpleadaRepository->findBy(['tarea' => $tarea'empleada' => $empleada]);
  321.                 foreach ($tareaEmpleadas as $te) {
  322.                     $totalPrevistas += $te->getHorasPrevistas();
  323.                 }
  324.                 $fichajes $fichajeRepository->findBy(['tarea' => $tarea'empleada' => $empleada]);
  325.                 foreach ($fichajes as $fichaje) {
  326.                     $totalFichadas += $fichaje->getCantidadHoras();
  327.                 }
  328.             }
  329.             $labelHoras[] = $empleada->getNombre();
  330.             $seriesPrevistas[] = $totalPrevistas;
  331.             $seriesFichadas[] = $totalFichadas;
  332.             $totalPrevistas 0;
  333.             $totalFichadas 0;
  334.         }
  335.         $gastos $proyecto->getGastos();
  336.         $gastosTotal 0;
  337.         foreach ($gastos as $gasto) {
  338.             $labelGastos[] = $gasto->getDescripcion();
  339.             $seriesGastos[] = $gasto->getCantidad();
  340.             $gastosTotal += $gasto->getCantidad();
  341.         }
  342.         $convenios $proyecto->getConvenios();
  343.         foreach ($convenios as $convenio) {
  344.             $labelGastos[] = $convenio->getNombre();
  345.             $seriesGastos[] = $convenio->getCantidad();
  346.             $gastosTotal += $convenio->getCantidad();
  347.         }
  348.         $restante $proyecto->getFinanciacion() - $gastosTotal;
  349.         $labelGastos[] = 'Restante';
  350.         $seriesGastos[] = $restante;
  351.         return new \Symfony\Component\HttpFoundation\JsonResponse([
  352.             "labelHoras" => $labelHoras,
  353.             "seriesPrevistas" => $seriesPrevistas,
  354.             'seriesFichadas' => $seriesFichadas,
  355.             'labelGastos' => $labelGastos,
  356.             'seriesGastos' => $seriesGastos,
  357.         ]);
  358.     }
  359.     private function calcularRestante(Proyecto $proyecto) {
  360.         $restante $proyecto->getFinanciacion();
  361.         if (count($proyecto->getProyectos()) != 0) {
  362.             foreach ($proyecto->getProyectos() as $hijos) {
  363.                 $restante -= $hijos->getFinanciacion();
  364.             }
  365.         }
  366.         return $restante;
  367.     }
  368. }