<?php
namespace App\Controller\Comun;
use App\Entity\Comun\Tarea;
use App\Form\Comun\TareaType;
use App\Repository\Comun\TareaRepository;
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\Comun\Proyecto;
use App\Service\AccesoService;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Contracts\Translation\TranslatorInterface;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Component\HttpFoundation\StreamedResponse;
use App\Service\ExcelTareaService;
#[Route('/comun/tarea')]
class TareaController extends AbstractController {
private $accesoService;
private $proyecto;
public function __construct(AccesoService $accesoService) {
$this->accesoService = $accesoService;
}
#[Route('/index/{proyecto}/{id}', name: 'app_comun_tarea_index', methods: ['GET', 'POST'])]
public function index(Proyecto $proyecto, TareaRepository $tareaRepository, Tarea $id = null): Response {
$tareas = $tareaRepository->findBy(['proyecto' => $proyecto->getId(), 'padre' => $id], ['fechaInicio' => 'ASC']);
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$datos = [];
foreach ($tareas as $tarea) {
$datos[$tarea->getId()]['tarea'] = false;
$datos[$tarea->getId()]['tareaEmpleada'] = false;
$datos[$tarea->getId()]['eliminar'] = false;
if (count($tarea->getTareas()) > 0 || count($tarea->getTareaEmpleadas()) == 0) {
$datos[$tarea->getId()]['tarea'] = true;
}
if (count($tarea->getTareas()) == 0) {
$datos[$tarea->getId()]['tareaEmpleada'] = true;
}
if (count($tarea->getTareas()) == 0 && count($tarea->getTareaEmpleadas()) == 0 && count($tarea->getAdjuntoTareas()) == 0 && count($tarea->getFichajes())==0 && count($tarea->getLlamadas())==0 && count($tarea->getEmails())==0) {
$datos[$tarea->getId()]['eliminar'] = true;
}
}
return $this->render('comun/tarea/index.html.twig', [
'tareas' => $tareas,
'datos' => $datos,
'acceso' => $this->accesoService->controlAccesosProyecto($proyecto),
]);
}
#[Route('/nuevo/tarea/{proyecto}/{id}', name: 'app_comun_tarea_new', methods: ['POST', 'GET'])]
public function new(Request $request, Proyecto $proyecto, TareaRepository $tareaRepository, Tarea $id = null): Response {
$tarea = new Tarea();
$tarea->setFechaInicio(date_create("now"));
$tarea->setFechaFin(date_create("now"));
$form = $this->createForm(TareaType::class, $tarea);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$tarea->setPadre($id);
$tarea->setEstado(0);
$tarea->setProyecto($proyecto);
$tareaRepository->add($tarea);
$this->cambiarFechas($tarea);
}
return $this->renderForm('comun/tarea/form.html.twig', [
'tarea' => $tarea,
'form' => $form,
'visible' => true
]);
}
#[Route('/editar/tarea/{id}', name: 'app_comun_tarea_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Tarea $tarea, TareaRepository $tareaRepository): Response {
$form = $this->createForm(TareaType::class, $tarea);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$tareaRepository->add($tarea);
$this->cambiarFechas($tarea);
}
$fechasvisibles = false;
if (count($tarea->getTareas()) == 0) {
$fechasvisibles = true;
}
return $this->renderForm('comun/tarea/form.html.twig', [
'tarea' => $tarea,
'form' => $form,
'visible' => $fechasvisibles
]);
}
#[Route('/delete/{id}', name: 'app_comun_tarea_delete', methods: ['GET', 'POST'])]
public function delete(Request $request, Tarea $tarea, TareaRepository $tareaRepository): Response {
$proyecto = $tarea->getProyecto();
$tareaRepository->remove($tarea);
return $this->redirect($this->generateUrl('app_comun_proyecto_show', ['id' => $proyecto->getId()]));
}
public function cambiarEstado(Tarea $tarea, $estado) {
$em = $this->getDoctrine()->getManager();
$tarea->setEstado($estado);
$em->persist($tarea);
$em->flush();
if (!is_null($tarea->getPadre())) {
$estado = 2;
foreach ($tarea->getPadre()->getTareas() as $tareaHijo) {
if ($estado == 2) {
$estado = $tareaHijo->getEstado() == 0 ? 1 : $tareaHijo->getEstado();
}
}
$this->cambiarEstado($tarea->getPadre(), $estado);
}
}
private function cambiarEstadoProyecto(Proyecto $proyecto) {
$em = $this->getDoctrine()->getManager();
$tareas = $proyecto->getTareas();
$finalizado = false;
foreach ($tareas as $tarea) {
echo $tarea->getNombre();
if ($tarea->getEstado() == 1) {
$proyecto->setEstado(1);
$finalizado = false;
// break;
}
if ($tarea->getEstado() == 2) {
$finalizado = true;
} else {
$finalizado = false;
break;
}
}
if ($finalizado) {
$proyecto->setEstado(2);
}
$em->persist($proyecto);
$em->flush();
}
#[Route('/tareas/kanban', name: 'app_comun_tarea_kanban', methods: ['GET', 'POST'])]
public function tareasKanban(): Response {
return $this->render('comun/tarea/kanban/kanbanTareas.html.twig', [
]);
}
#[Route('/cargar/tarea/{estado}', name: 'app_comun_tarea_cargar', methods: ['GET', 'POST'])]
public function cargarTareasKanban(RequestStack $rs, TareaRepository $tareaRepository, $estado): Response {
$empleada = $this->get('security.token_storage')->getToken()->getUser()->getEmpleada();
$session = $rs->getSession();
$filtro = unserialize($session->get('filtro.tarea'));
if (!$filtro) {
$tareas = $tareaRepository->tareaPorEmpleada($empleada, $estado);
} else {
$tareas = $tareaRepository->findByFiltro($filtro, $estado);
}
return $this->render('comun/tarea/kanban/tarea.html.twig', [
'tareas' => $tareas,
]);
}
#[Route('/tareas/cambiarestado/{tarea}/{estado}', name: 'app_comun_tarea_cambiarestado', methods: ['GET', 'POST'])]
public function cambiarEstadoTarea(TranslatorInterface $translator, TareaRepository $tareaRepository, $tarea = null, $estado = null): Response {
$tareao = $tareaRepository->find($tarea);
$this->cambiarEstado($tareao, $estado);
$this->cambiarEstadoProyecto($tareao->getProyecto());
return new Response();
}
#[Route('/tareas/cambiar/estado/{tarea}', name: 'app_comun_tarea_cambiar_estado', methods: ['GET', 'POST'])]
public function cambiarEstadoForm(Request $request, TareaRepository $tareaRepository, Tarea $tarea): Response {
$form = $this->createForm(\App\Form\Comun\TareaCambiarEstadoType::class, $tarea);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->cambiarEstado($tarea, $tarea->getEstado());
$this->cambiarEstadoProyecto($tarea->getProyecto());
}
return $this->renderForm('comun/tarea/cambiarEstado.html.twig', [
'tarea' => $tarea,
'form' => $form,
]);
}
#[Route('/tareas/excel/{proyecto}', name: 'app_comun_tarea_exportar_excel', methods: ['GET', 'POST'])]
public function exportarExcel(ExcelTareaService $ets, Proyecto $proyecto): Response {
$spreadsheet = new Spreadsheet();
$ets->printExcel($proyecto, $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="Tareas-' . $proyecto->getNombre() . '.xlsx"');
$response->headers->set('Cache-Control', 'max-age=0');
return $response;
}
public function fechasHijas(Tarea $tarea) {
$em = $this->getDoctrine()->getManager();
$tareaRepository = $em->getRepository("App:Comun\Tarea");
$fechaInicio = $tareaRepository->findOneBy(['padre' => $tarea->getId()], ['fechaInicio' => 'ASC']);
$fechaFin = $tareaRepository->findOneBy(['padre' => $tarea->getId()], ['fechaFin' => 'DESC']);
$datos = [];
$datos['inicio'] = $fechaInicio->getFechaInicio();
$datos['fin'] = $fechaFin->getFechaFin();
return $datos;
}
public function cambiarFechas(Tarea $tarea) {
$em = $this->getDoctrine()->getManager();
if (!is_null($tarea->getPadre())) {
$padre = $tarea->getPadre();
$fechas = $this->fechasHijas($padre);
$padre->setFechaInicio($fechas['inicio']);
$padre->setFechaFin($fechas['fin']);
$em->persist($padre);
$em->flush();
$this->cambiarFechas($padre);
}
}
}