<?php
namespace App\Controller\Comun;
use App\Entity\Comun\Proyecto;
use App\Form\Comun\ProyectoType;
use App\Repository\Comun\ProyectoRepository;
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\Area;
use App\Service\AccesoService;
use Symfony\Component\HttpFoundation\RequestStack;
use App\Repository\Admin\EmpleadaRepository;
use App\Repository\Comun\TareaRepository;
use Symfony\Contracts\Translation\TranslatorInterface;
#[Route('/comun/proyecto')]
class ProyectoController extends AbstractController {
private $accesoService;
public function __construct(AccesoService $accesoService) {
$this->accesoService = $accesoService;
}
#[Route('/', name: 'app_comun_proyecto_index', methods: ['GET'])]
public function index(RequestStack $rs, ProyectoRepository $proyectoRepository): Response {
$usuario = $this->get('security.token_storage')->getToken()->getUser();
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$session = $rs->getSession();
$filtro = unserialize($session->get('filtro.proyecto'));
if (in_array('ROLE_ADMIN', $usuario->getRoles(), true)) {
$proyectos = $proyectoRepository->findByFiltro($filtro);
}
if (in_array('ROLE_EMPLEADA', $usuario->getRoles(), true)) {
$proyectos = $proyectoRepository->findByfiltroEmpleada($filtro, $empleada);
// $empleada = new \App\Entity\Admin\Empleada();
$proyectos= array_unique(array_merge($proyectos, $empleada->getProyectos()->getValues()));
}
if (in_array('ROLE_EXTERNO', $usuario->getRoles(), true)) {
$proyectos = $proyectoRepository->findByfiltroTercero($filtro, $usuario);
}
return $this->render('comun/proyecto/index.html.twig', [
'proyectos' => $proyectos,
]);
}
#[Route('/index_finalizados', name: 'app_comun_proyecto_index_finalizados', methods: ['GET'])]
public function indexFinalizados(RequestStack $rs, ProyectoRepository $proyectoRepository): Response {
$usuario = $this->get('security.token_storage')->getToken()->getUser();
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$session = $rs->getSession();
$filtro = unserialize($session->get('filtro.proyecto'));
if (in_array('ROLE_ADMIN', $usuario->getRoles(), true)) {
$proyectos = $proyectoRepository->findByFiltro($filtro, true);
}
if (in_array('ROLE_EMPLEADA', $usuario->getRoles(), true)) {
$proyectos = $proyectoRepository->findByfiltroEmpleada($filtro, $empleada, true);
// $empleada = new \App\Entity\Admin\Empleada();
$proyectos= array_unique(array_merge($proyectos, $empleada->getProyectos()->getValues()));
}
if (in_array('ROLE_EXTERNO', $usuario->getRoles(), true)) {
$proyectos = $proyectoRepository->findByfiltroTercero($filtro, $usuario, true);
}
return $this->render('comun/proyecto/index_finalizados.html.twig', [
'proyectos' => $proyectos,
]);
}
#[Route('/new/{proyectopadre}', name: 'app_comun_proyecto_new', methods: ['GET', 'POST'])]
public function new(Request $request, Proyecto $proyectopadre = null, ProyectoRepository $proyectoRepository): Response {
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$usuario = $this->get('security.token_storage')->getToken()->getUser();
$emp = false;
if (in_array('ROLE_EMPLEADA', $usuario->getRoles(), true)) {
$emp = true;
}
$proyecto = new Proyecto();
$proyecto->setEstado(0);
$proyecto->setFechaInicio(date_create("now"));
if (!is_null($proyectopadre)) {
$proyecto->setFechaInicio($proyectopadre->getFechaInicio());
$proyecto->setArea($proyectopadre->getArea());
$proyecto->setServicio($proyectopadre->getServicio());
$proyecto->setResponsable($proyectopadre->getResponsable());
$proyecto->setPadre($proyectopadre);
}
$form = $this->createForm(ProyectoType::class, $proyecto, ['empleada' => $emp]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if (in_array('ROLE_EMPLEADA', $usuario->getRoles(), true)) {
$proyecto->setResponsable($empleada);
}
/* $ financiacion = $form->get('financiacion')->getData();
$proyecto->setFinanciacion($financiacion); */
if (is_null($proyectopadre)) {
$restante = $proyecto->getFinanciacion();
} else {
$restante = $this->calcularRestante($proyectopadre);
}
if ($proyecto->getFinanciacion() > $restante) {
$this->addFlash('financiacion', 'proyecto.financiacionError');
$this->addFlash('financiacion', $restante . " €");
} else {
$servicio = $this->getDoctrine()->getManager()->getRepository("App:Admin\Servicio")->find($request->request->get('proyecto_area_servicio')['servicio']);
$proyecto->setServicio($servicio);
$proyectoRepository->add($proyecto);
return $this->redirect($this->generateUrl('app_comun_proyecto_show', ['id' => $proyecto->getId()]));
}
}
return $this->renderForm('comun/proyecto/new.html.twig', [
'proyecto' => $proyecto,
'form' => $form,
'empleada' => $emp
]);
}
#[Route('/{id}', name: 'app_comun_proyecto_show', methods: ['GET'])]
public function show(Proyecto $proyecto): Response {
$restante = "";
if ($proyecto->getMultiple()) {
$restante = $this->calcularRestante($proyecto);
$vista = "comun/proyecto/showPadre.html.twig";
} else {
$vista = "comun/proyecto/showSimple.html.twig";
}
if (!is_null($proyecto->getPadre())) {
$vista = "comun/proyecto/showHijo.html.twig";
}
$eliminable = "disabled";
if (count($proyecto->getTareas()) == 0 && count($proyecto->getJustificacions()) == 0 && count($proyecto->getConvenios()) == 0 && count($proyecto->getGastos()) == 0 && count($proyecto->getProyectos()) == 0) {
$eliminable = "";
}
return $this->render($vista, [
'proyecto' => $proyecto,
'restante' => $restante,
'eliminable' => $eliminable,
'acceso' => $this->accesoService->controlAccesosProyecto($proyecto),
]);
}
#[Route('/{id}/edit', name: 'app_comun_proyecto_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Proyecto $proyecto, ProyectoRepository $proyectoRepository): Response {
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$usuario = $this->get('security.token_storage')->getToken()->getUser();
$emp = false;
if (in_array('ROLE_EMPLEADA', $usuario->getRoles(), true)) {
$emp = true;
}
$form = $this->createForm(ProyectoType::class, $proyecto, ['empleada' => $emp]);
$form->handleRequest($request);
$restante = 0;
if ($form->isSubmitted() && $form->isValid()) {
$servicio = $this->getDoctrine()->getManager()->getRepository("App:Admin\Servicio")->find($request->request->get('proyecto_area_servicio')['servicio']);
$proyecto->setServicio($servicio);
$financiacionHijos = 0;
if (count($proyecto->getProyectos()) > 0) {
foreach ($proyecto->getProyectos() as $proyectoHijo) {
$financiacionHijos += $proyectoHijo->getFinanciacion();
}
if ($proyecto->getFinanciacion() >= $financiacionHijos) {
$proyectoRepository->add($proyecto);
return $this->redirect($this->generateUrl('app_comun_proyecto_show', ['id' => $proyecto->getId()]));
} else {
$this->addFlash('financiacion', 'proyecto.financiacionErrorPadre');
}
} else {
if (!is_null($proyecto->getPadre())) {
foreach ($proyecto->getPadre()->getProyectos() as $hijos) {
$financiacionHijos += $hijos->getFinanciacion();
}
if ($financiacionHijos > $proyecto->getPadre()->getFinanciacion()) {
$this->calcularRestante($proyecto->getPadre());
$this->addFlash('financiacion', 'La financiacion es superior a lo permitido');
} else {
$proyectoRepository->add($proyecto);
return $this->redirect($this->generateUrl('app_comun_proyecto_show', ['id' => $proyecto->getId()]));
}
} else {
$proyectoRepository->add($proyecto);
return $this->redirect($this->generateUrl('app_comun_proyecto_show', ['id' => $proyecto->getId()]));
}
}
}
return $this->renderForm('comun/proyecto/edit.html.twig', [
'proyecto' => $proyecto,
'form' => $form,
'empleada' => $emp
]);
}
#[Route('/finalizar/{id}', name: 'app_comun_proyecto_finalizar', methods: ['GET', 'POST'])]
public function finalizar(Request $request, Proyecto $proyecto, ProyectoRepository $proyectoRepository): Response {
$entityManager = $this->getDoctrine()->getManager();
$proyectosHijo = $proyecto->getProyectos();
foreach ($proyectosHijo as $hijo){
$hijo->setEstado(2);
$entityManager->persist($hijo);
$entityManager->flush();
}
$proyecto->setEstado(2);
$entityManager->persist($proyecto);
$entityManager->flush();
return $this->redirectToRoute('app_comun_proyecto_show', ['id' => $proyecto->getId()], Response::HTTP_SEE_OTHER);
}
#[Route('/delete/{id}', name: 'app_comun_proyecto_delete', methods: ['GET', 'POST'])]
public function delete(Request $request, Proyecto $proyecto, ProyectoRepository $proyectoRepository): Response {
$entityManager = $this->getDoctrine()->getManager();
if (count($proyecto->getTareas()) == 0 && count($proyecto->getJustificacions()) == 0 && count($proyecto->getConvenios()) == 0 && count($proyecto->getGastos()) == 0 && count($proyecto->getProyectos()) == 0) {
if (count($proyecto->getTerceros()) < 0) {
foreach ($proyecto->getTerceros() as $tercero) {
$entityManager->remove($tercero);
$entityManager->flush();
}
}
$proyectoRepository->remove($proyecto);
}
return $this->redirectToRoute('app_comun_proyecto_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/form/{area}/{proyecto}', name: 'app_comun_proyecto_form_servicio', methods: ['GET', 'POST'])]
public function formServicioByArea(Area $area = null, Proyecto $proyecto = null): Response {
if (is_null($proyecto)) {
$proyecto = new Proyecto();
}
$form = $this->createForm(\App\Form\Comun\ProyectoAreaServicioType::class, $proyecto, array("area" => $area->getId()));
return $this->render('comun/proyecto/formServicios.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/resumen/{proyecto}', name: 'app_comun_proyecto_resumen', methods: ['GET', 'POST'])]
public function cargarResumen(TranslatorInterface $translator, Proyecto $proyecto, EmpleadaRepository $empleadaRepository, TareaRepository $tareaRepository, \App\Repository\Comun\TareaEmpleadaRepository $tareaEmpleadaRepository) {
$em = $this->getDoctrine()->getManager();
$empleadas = $empleadaRepository->empleadasPorProyecto($proyecto);
$globales = $em->getRepository("App:Admin\Globales")->findOneby([]);
$horasPrevistas = 0;
$horasFichadas = 0;
$gastosTotal = $proyecto->getGastado();
$tareas = $tareaRepository->tareasProyecto($proyecto);
foreach ($tareas as $tarea) {
$horasPrevistas += $tarea->getHorasPrevistasTotales();
$horasFichadas += $tarea->getHorasFichadas();
}
$justificaciones = $proyecto->getJustificacions();
$hoy = date_create('now');
$cont = 0;
$aviso = "";
$semaforo = [];
$color = "";
foreach ($justificaciones as $justificacion) {
$fecha = $justificacion->getFecha();
if ($hoy < $fecha) {
$interval = date_diff($hoy, $fecha);
$dias = ($interval->days) + 1;
$color = "white";
$aviso = "";
if ($dias <= $globales->getJustificacionAviso3()) {
$aviso = $translator->trans('resumen.avisoJustificacion', ['%dias%' => $globales->getJustificacionAviso3()]);
$color = "#5fc27e";
$cont = 3;
}
if ($dias <= $globales->getJustificacionAviso2()) {
$aviso = $translator->trans('resumen.avisoJustificacion', ['%dias%' => $globales->getJustificacionAviso2()]);
$cont = 2;
$color = "#fab451 ";
}
if ($dias <= $globales->getJustificacionAviso1()) {
$aviso = $translator->trans('resumen.avisoJustificacion', ['%dias%' => $globales->getJustificacionAviso1()]);
$cont = 1;
$color = "red";
}
} else {
if (!$justificacion->getPresentada()) {
$cont = 5;
$aviso = $translator->trans('resumen.noPresentada');
$color = "red";
} else {
$cont = 0;
}
}
$semaforo[$justificacion->getId()]['semaforo'] = $cont;
$semaforo[$justificacion->getId()]['aviso'] = $aviso;
$semaforo[$justificacion->getId()]['color'] = $color;
}
try {
$porcentajeHoras = round((($horasFichadas * 100) / $horasPrevistas), 2);
$porcentajeGastos = round((($gastosTotal * 100) / $proyecto->getFinanciacion()), 2);
} catch (\DivisionByZeroError $e) {
$porcentajeHoras = 0;
$porcentajeGastos = 0;
}
return $this->render('comun/proyecto/resumen.html.twig', [
'empleadas' => $empleadas,
'horasTotalesPrevistas' => $horasPrevistas,
'horasTotalesFichadas' => $horasFichadas,
'proyecto' => $proyecto,
'porcentajeHoras' => $porcentajeHoras,
'porcentajeGastos' => $porcentajeGastos,
'justificaciones' => $justificaciones,
'semaforo' => $semaforo,
]);
}
#[Route('/graficas/{proyecto}', name: 'app_comun_proyecto_grafica', methods: ['GET', 'POST'])]
public function graficasProyecto(Proyecto $proyecto, \App\Repository\Comun\FichajeRepository $fichajeRepository) {
$em = $this->getDoctrine()->getManager();
$empleadaRepository = $em->getRepository("App:Admin\Empleada");
$tareaRepository = $em->getRepository("App:Comun\Tarea");
$tareaEmpleadaRepository = $em->getRepository("App:Comun\TareaEmpleada");
$labelHoras = [];
$labelGastos = [];
$seriesGastos = [];
$seriesPrevistas = [];
$seriesFichadas = [];
$totalPrevistas = 0;
$totalFichadas = 0;
$empleadas = $empleadaRepository->empleadasPorProyecto($proyecto);
foreach ($empleadas as $empleada) {
$tareas = $tareaRepository->tareasEmpleadaProyecto($empleada, $proyecto);
foreach ($tareas as $tarea) {
$tareaEmpleadas = $tareaEmpleadaRepository->findBy(['tarea' => $tarea, 'empleada' => $empleada]);
foreach ($tareaEmpleadas as $te) {
$totalPrevistas += $te->getHorasPrevistas();
}
$fichajes = $fichajeRepository->findBy(['tarea' => $tarea, 'empleada' => $empleada]);
foreach ($fichajes as $fichaje) {
$totalFichadas += $fichaje->getCantidadHoras();
}
}
$labelHoras[] = $empleada->getNombre();
$seriesPrevistas[] = $totalPrevistas;
$seriesFichadas[] = $totalFichadas;
$totalPrevistas = 0;
$totalFichadas = 0;
}
$gastos = $proyecto->getGastos();
$gastosTotal = 0;
foreach ($gastos as $gasto) {
$labelGastos[] = $gasto->getDescripcion();
$seriesGastos[] = $gasto->getCantidad();
$gastosTotal += $gasto->getCantidad();
}
$convenios = $proyecto->getConvenios();
foreach ($convenios as $convenio) {
$labelGastos[] = $convenio->getNombre();
$seriesGastos[] = $convenio->getCantidad();
$gastosTotal += $convenio->getCantidad();
}
$restante = $proyecto->getFinanciacion() - $gastosTotal;
$labelGastos[] = 'Restante';
$seriesGastos[] = $restante;
return new \Symfony\Component\HttpFoundation\JsonResponse([
"labelHoras" => $labelHoras,
"seriesPrevistas" => $seriesPrevistas,
'seriesFichadas' => $seriesFichadas,
'labelGastos' => $labelGastos,
'seriesGastos' => $seriesGastos,
]);
}
private function calcularRestante(Proyecto $proyecto) {
$restante = $proyecto->getFinanciacion();
if (count($proyecto->getProyectos()) != 0) {
foreach ($proyecto->getProyectos() as $hijos) {
$restante -= $hijos->getFinanciacion();
}
}
return $restante;
}
}